From e1b2f64d5722d43251bdbaa504a4a1d5ce4f5df7 Mon Sep 17 00:00:00 2001 From: KMKoushik Date: Thu, 4 Apr 2024 09:09:15 +1100 Subject: [PATCH] Add marketing page and layout changes --- apps/marketing/.eslintrc.js | 9 + apps/marketing/.gitignore | 36 ++ apps/marketing/README.md | 36 ++ apps/marketing/next.config.mjs | 4 + apps/marketing/package.json | 32 + apps/marketing/postcss.config.js | 6 + apps/marketing/public/next.svg | 1 + apps/marketing/public/vercel.svg | 1 + apps/marketing/src/app/favicon.ico | Bin 0 -> 39535 bytes apps/marketing/src/app/globals.css | 33 + apps/marketing/src/app/layout.tsx | 25 + apps/marketing/src/app/page.tsx | 47 ++ .../src/components/ui/background-beams.tsx | 149 +++++ .../src/components/ui/styled-input.tsx | 61 ++ apps/marketing/tailwind.config.ts | 8 + apps/marketing/tsconfig.json | 24 + apps/web/package.json | 2 +- apps/web/public/unsend_white_logo.png | Bin 0 -> 10353 bytes apps/web/public/unsend_white_new.png | Bin 0 -> 11614 bytes .../src/app/(dashboard)/dashboard/page.tsx | 30 +- apps/web/src/app/(dashboard)/layout.tsx | 166 ++++- apps/web/src/app/(dashboard)/nav-button.tsx | 23 + apps/web/src/app/layout.tsx | 2 +- package.json | 2 +- packages/ui/package.json | 1 + packages/ui/src/dropdown-menu.tsx | 200 ++++++ packages/ui/src/sheet.tsx | 140 +++++ packages/ui/styles/globals.css | 40 +- pnpm-lock.yaml | 580 +++++++++++++++++- 29 files changed, 1601 insertions(+), 57 deletions(-) create mode 100644 apps/marketing/.eslintrc.js create mode 100644 apps/marketing/.gitignore create mode 100644 apps/marketing/README.md create mode 100644 apps/marketing/next.config.mjs create mode 100644 apps/marketing/package.json create mode 100644 apps/marketing/postcss.config.js create mode 100644 apps/marketing/public/next.svg create mode 100644 apps/marketing/public/vercel.svg create mode 100644 apps/marketing/src/app/favicon.ico create mode 100644 apps/marketing/src/app/globals.css create mode 100644 apps/marketing/src/app/layout.tsx create mode 100644 apps/marketing/src/app/page.tsx create mode 100644 apps/marketing/src/components/ui/background-beams.tsx create mode 100644 apps/marketing/src/components/ui/styled-input.tsx create mode 100644 apps/marketing/tailwind.config.ts create mode 100644 apps/marketing/tsconfig.json create mode 100644 apps/web/public/unsend_white_logo.png create mode 100644 apps/web/public/unsend_white_new.png create mode 100644 apps/web/src/app/(dashboard)/nav-button.tsx create mode 100644 packages/ui/src/dropdown-menu.tsx create mode 100644 packages/ui/src/sheet.tsx diff --git a/apps/marketing/.eslintrc.js b/apps/marketing/.eslintrc.js new file mode 100644 index 0000000..11aec8a --- /dev/null +++ b/apps/marketing/.eslintrc.js @@ -0,0 +1,9 @@ +/** @type {import("eslint").Linter.Config} */ +module.exports = { + root: true, + extends: ["@unsend/eslint-config/next.js"], + parser: "@typescript-eslint/parser", + parserOptions: { + project: true, + }, +}; diff --git a/apps/marketing/.gitignore b/apps/marketing/.gitignore new file mode 100644 index 0000000..fd3dbb5 --- /dev/null +++ b/apps/marketing/.gitignore @@ -0,0 +1,36 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.js +.yarn/install-state.gz + +# testing +/coverage + +# next.js +/.next/ +/out/ + +# production +/build + +# misc +.DS_Store +*.pem + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# local env files +.env*.local + +# vercel +.vercel + +# typescript +*.tsbuildinfo +next-env.d.ts diff --git a/apps/marketing/README.md b/apps/marketing/README.md new file mode 100644 index 0000000..c403366 --- /dev/null +++ b/apps/marketing/README.md @@ -0,0 +1,36 @@ +This is a [Next.js](https://nextjs.org/) project bootstrapped with [`create-next-app`](https://github.com/vercel/next.js/tree/canary/packages/create-next-app). + +## Getting Started + +First, run the development server: + +```bash +npm run dev +# or +yarn dev +# or +pnpm dev +# or +bun dev +``` + +Open [http://localhost:3000](http://localhost:3000) with your browser to see the result. + +You can start editing the page by modifying `app/page.tsx`. The page auto-updates as you edit the file. + +This project uses [`next/font`](https://nextjs.org/docs/basic-features/font-optimization) to automatically optimize and load Inter, a custom Google Font. + +## Learn More + +To learn more about Next.js, take a look at the following resources: + +- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API. +- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial. + +You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js/) - your feedback and contributions are welcome! + +## Deploy on Vercel + +The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js. + +Check out our [Next.js deployment documentation](https://nextjs.org/docs/deployment) for more details. diff --git a/apps/marketing/next.config.mjs b/apps/marketing/next.config.mjs new file mode 100644 index 0000000..4678774 --- /dev/null +++ b/apps/marketing/next.config.mjs @@ -0,0 +1,4 @@ +/** @type {import('next').NextConfig} */ +const nextConfig = {}; + +export default nextConfig; diff --git a/apps/marketing/package.json b/apps/marketing/package.json new file mode 100644 index 0000000..08f4aa6 --- /dev/null +++ b/apps/marketing/package.json @@ -0,0 +1,32 @@ +{ + "name": "marketing", + "version": "0.1.0", + "private": true, + "scripts": { + "dev": "next dev -p 3001", + "build": "next build", + "start": "next start", + "lint": "next lint" + }, + "dependencies": { + "framer-motion": "^11.0.24", + "lucide-react": "^0.359.0", + "next": "14.1.4", + "react": "^18", + "react-dom": "^18" + }, + "devDependencies": { + "@types/node": "^20", + "@types/react": "^18", + "@types/react-dom": "^18", + "@unsend/eslint-config": "workspace:*", + "@unsend/tailwind-config": "workspace:*", + "@unsend/ui": "workspace:*", + "autoprefixer": "^10.0.1", + "eslint": "^8", + "eslint-config-next": "14.1.4", + "postcss": "^8", + "tailwindcss": "^3.3.0", + "typescript": "^5" + } +} \ No newline at end of file diff --git a/apps/marketing/postcss.config.js b/apps/marketing/postcss.config.js new file mode 100644 index 0000000..12a703d --- /dev/null +++ b/apps/marketing/postcss.config.js @@ -0,0 +1,6 @@ +module.exports = { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, +}; diff --git a/apps/marketing/public/next.svg b/apps/marketing/public/next.svg new file mode 100644 index 0000000..5174b28 --- /dev/null +++ b/apps/marketing/public/next.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/apps/marketing/public/vercel.svg b/apps/marketing/public/vercel.svg new file mode 100644 index 0000000..d2f8422 --- /dev/null +++ b/apps/marketing/public/vercel.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/apps/marketing/src/app/favicon.ico b/apps/marketing/src/app/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..4570eb8d9269ad58b17fecbec6d630cded56f507 GIT binary patch literal 39535 zcmeHw`Bz=nmF9gsc+9hy5jB1w151fdDZGiScP-lmIaZ#3;EsX?LYkO6+oC zcdDGkvDZqaDp3tdY$sinwH#S?96PaNCzdTaPIp(T)A^x$b@xBe-*@+Ug9%7NAcSPy z_3eH3nfKXypK~woT|m<dO#S`!I@|I?JhGKxc0jfnSEBfEGWE_{%f^i zf7dG>nYG%kx13|yul4r5llB}t3ACbZQ&SU4HVXp-11rXN%*eTqIdYCx@$vDSH95v9 zDk^e}ykf3Z=5}o{GBUD3JzPgyuk7vZeHXJwMn~h=naE?`? z%e9}uV7SFRVgc9otIC{%m+SggmGkoQP+nPCxoYjIBj^Kz-K$;A@i+Sfvg>SyaOW$P zmh5x8Ya=K3?Z$rS>UozmgRCIlLG=sw*$rMM^v?vfgVypf>)3{EH~Y%KfNRaW-g1t$ z(JK}Mtask^w&xsoa~(#f_0F}C_MC4$*901GWWJ5`<=l62-A^4|*LOR8o3I$y_S-?G zPODupDBKSEt)&C?TY0V3cDt3k>djlgcGGVyebQVMU#rcEa*M@+k_QESeSItRzpZy@ z63^SVa*P@m7x$nT1A4Z$wmLMw!!^4hWyu7@&p(Qdi zGabHK*NWD?e%H}!YHGHLEnKzQdij1CAtEB;?!3N{>3y#>o39v+0$@%a>f+y6h{D_58WU^|}k|qx-783JMBPeizT` ztB$r}7FV4qN3W>AlQFik&1ydfQ||}qvj*zR>p}S(N3^}a`rhudCcBRIbi04fXxDQ) ze^zVPk?D5(jN4T=%J=&_fR*|@%0IHeBMUqP7T|*&UIEfco*m%Ufvj+(>8#H zL2Erv~w%d?)K#%_g^bHyK^-WaJ08 zjs3l8SKB7__OI5 z7JVNG>ISNNsKHrdZG6 z1^cItn>cD!Rn=$2GY%_mmi73VEJY-eK4E`YJs={ULM3 zdM$8=?QiuB$X#3Cb?yh<4e~yr>xv#MdB=_&50DFnhK4pJ>b8TAw*NEjCO&iCcdu>F z=hRJqj=Z&<@A+vi`)d0r6+%Y8HuU)|Mz{<6Z~W=&zC0bd zezLluZv*bmYIpY(wZ%_4uF>H7EdfK#wQkGgJAWR!UmDUhE3W(Yoh00{Dz^B^!!tdk z=Q_NW;u|dgEd5S|tEp1&qrdrkHd}r1_lfS+&;I;9sQdBzN~_t>{&ojH&AioT@b*uU z?Vr)DHrAuEM;3Twfkzg2WPwK(cw~V`7IbQ3qm;e&g$Ex#QUOsgn9SNn$>bGeKsYCv zQ%Fo#zX)C@1^m;U{PzJ3{4^NY1=_Le{b!iH`Yc#vR1F6M&h=S;|Bp|I3?36Q>-EOh zAiQ%~%I3!$b*@4?GV_aI>VI%N=2|IoF_KrmOx*;#D)}EaLP5b6PHqIbH_|MI9x%Y_ z3l=bFoJA5`eqQrO%JuTEY?azL#U4;LC>6xU(;$v$HiH3%Jtpv-e*7I0;2ko+3i|0c zTEI2d47qn2X}aD@WzA@0X2!udqaTRQI0_nk=b2i+0V@Xud`hB32wk9si)`lcL@Sq( z2Kw1Q@n!ePc@Dv$=pSW%HW8Rjr?g*Pab(@X7Ix)^AnTJ$I{;<%VBtPs94 z!BeX{NUhlBz(RR)eO0`tpJyYLT>Rxz3rHNGg3GK3A2cU>=bJeKyDsE_y?R;8)*6j- z94CpTf(|77l^@Q^e?kIq5s@5=LjgB`C@DM94;PfWVP<6L)=76T&p6XyP%r*c8N*Ol zxUzwv_ZVH|Zc+a(CEmAom|ae~$JQ=*%?3f_KfC~15^3n;k^z735|~yad8;JFwj5hZ zE|=wB3uYbWJWH8ibO}(;Wn_9zrDt<6>aR8hq)PtRkv5Q96E~+JeF>cVIp7FKoc2gQ zVGcL_;X7aB`rA{$_JUSGppWB*>V*^ z=O>U6lptY%(BoFKy*^_;B?$$LNRHkKa{K+0mwIVOz)%V{pmj@*o?{^>7(^c=m^dzw zX^R2hqu$`$6H(~SZB#-to-}1wfB1E-*n#PC4zQ0_0n$M1$W=Me7kl&a`SB8Z++y6x zMFEBYADZ{IOJM%v^PEC3VyJ!Nd5Fq;YG4$c1ikxT{P!W*lb;Gse*yW^2So6Y1pMEh z{;tSvTnfi#Th`M*TrI$GRIcY)6PmMhRw@iUC;;wb>pa*D3pmoLo(QFuHg7yb`vX-c z3{H#e;xW-OeF&W4Vv19`LFP(0JtqTt(k1O{;IyTZDYc%6bPlE_sA(TTZCEcDPfz7= z=^#8kPg44m-3LIN{?$JR1J2rbrgks0Zdr=Jl_%8xkmCRL4`1O?S@O|y;Js9NMk>^- zoS_O-$=w5JAa4-2KR2s#S2brcadWXBjek_%qFg(dODB%*=OzMtts$Y#MRSBHMLf>| zT8-Z72bF=;A6t#z3AxS!re+NZgKXhO;;aYqZhR+sztWq!odyBi%DY7zHl7iosxw4) zB4as~feN&8Kagk;1GNU&0O+pCixw%uCMi#&ggCHKeN2vfjn?l49ae3uO(&6S1p(I6 zRL$`AOEjs9!*eHC#G3%XFpab~p7v9vD69rm8m-`g?>q&*0{PY?DN$B&Zz#}EP$7l! z$+bK?v_8*4PQZ=oR$c3xG;wZMC=WD%cjija|9#=_pO6wB=o8bUHBBAIA?Zp+YN-$n z#@2z#s33Z;093_p#;GyzjMrZPcc7Rd3@kC~xndwQ8BB|(lMO9k4C3>FVD)A&3XIxH zzkmDUrFNcTGwhez!0?N82m9mS{utc1l|zPv*>#9GW{H}0w`j@PLv)b`dji}`?yp@u zrs7r#xtbnOh-6t;DB|lEy-(7m0?uYFpuhS-oC$DeFE-b%JufAU)0~W8BMqe6gq0xG zAvvLrhX|wI7sNZn{*0_Vo40X{3l3#d?@%z>1$h0Nl_EHJgGjUkqgaj0eg_k!ip5Q8 zV~6U731%yaiGW$Eo0xo>Jp{%&q!y8zh9tFckZ2CbcG2p@vvke!=$P8K13a5?1MFoG zgq=-|y8f5+peLgpm^ufhU4I%}ou!bDG03w_`K$t+0=We$O)_|Eq#T(QK zGZ=lMG*DraF@PdKb^V|J@e(rC`pUSN9Z}c+3`vf5BG2s{1Gf?6z%fYnvuoTL3k);? zw^{7s40YfH@4q0$;8A&I)36N!4I0Z$0x-m8>tjnLS1SoSR)}cG3-V|CBsTP^ENQn4 zGb@;KNP!`EE;vC0R4gp;6x-PjMnAfNjQM*~kO1j%Py#7E)W>l9}r7Mh~Dr5{IjCN7>)Ztu6?$ zo`^EGLT;P}%cOOOL2v#O7*GOI6G7q;&KPjO3dt71P>Nq(0MF`*=A>y&N5Fw!e;#bI zdiJC5N&d!*NJkgn{u;NAE4ZbAYd-=jiBfR_IZ*9{gA6aAy?&UnelB-b^58okJ6{;3 z#l7`hX%}*X9i`yjQp+S2lyJI;-m?t8`#jGcUP+}BK?2O2Y|Mkk3QE>AT9d|Sn?Cgyng72nnc7Xu)r7D8p zq-qFi2STE`1;-heCtW8zORB;1wI1Fqs+;!byN5>}D2Lov z=ct9i*ec-`^(X-=4M+lSn&Ul*i#CIRUvj_{-uJ?#0DQSzKQBzdkn6bf1y2P1Nhs4adTxldIiuS`L^^E?@+PHYG02abvk#_yY7 z@1e7RMHQbT(H0&wD{%Ec(RlBEtLF8uB5eYl{pkDW!ZVLT8dLg1Je|$Cd(B{nXJf$y zx&}0lK(}&XZyzJQ5i}2qh>|+t41#>xVbZk}GRv~AzcM+1G)h%+TMU8J5=!3GtW#wJSC3|~*ed(NE1B=t`XHkM4Zh0sJc!Ss@A~+u;{6T7)Nx6kb(2U4$ zJzMbl%M09$L1p@}qfEnPMkx*7{yZ|YEszPS+9|T|D79=O4J6L)k&fA9o1?FZj{|4T@m5sD1J^FtYasE9Y&t`q%csaoPAMH?)=wt)MBMdaeli`0=Bh zE280pr_{quW1-sc=WafimfWAqe)0a+BS=Ooz-~Ts47{PZ1biWR!tJ=X?K zvjA<~wET2u)~9BUfA!nlRLz@%2gh(Ifa_OhQ5eK|+L_7$Ehi++V_a~$y3AuK^q{iL zQkbtaaNR>vasUZOiVtMa2XZR`AsIivC=z)8J}~Z14`WE!a_*d?f}^_+f>k?;AaH(w zIsyxvIaFjzC-ps`&MGNu8$ik~UbQX#QZ#UeCXA2_IBf{nZ8R>~wB5!ak%XT`(s%ty z4hJYF?T{Q789L8dloOO)BH#E9%6@tI7ta>3AGND#S@__Uy|$WY$iV-3@te;e$py7b zN#BP*=+wWLxPAo%mGo1()PQ$0mK}KWt0K}Aw4ZYFTzoV>0C%*qiliT=5S2@trF4Em zt)BfO*p$w2U?IB)^7}6bGOB^I3u^t6?UUpJk`7RPB{vOYrmQo5ts9WsHYP1;3gEq;NV*@1HT$S!z^6Gg!%#Kf6YDN@vq*{$ zHPc|WuuonZQ}#!;S1+4_k+y*XKylVVj!>0L9T}DY z@4ZtW{ouW4MuM)r+$d$jk0BXWf$P(n#Go@Q^#1pM`B9eHs6vM8@MouNkihuc7j2Mw z=fUP0z|^g_kRH1FH892ya2nK;nh1UhWSacNUl+@LqMe#0_=5o%qs`<|98)m%n{V@} z!+{|S13+y#DIJXB!NL#;J}V`z{AW)gM@yB0<`07DGya;E63lcuM0FBHISO0_%ZVya zlk-T^KX#~;1_@n^ow7yA#q2E^`QUs09A$J&ig;dWWy9xN%9E5qjv7sVC{(`Xu~{Bv~b87b!tR#am66OpK<=imy7$&zkME3mi{Fk1kMDgML-H>d|r^! z(ei2DpckW$zWw*K;baBakXEKzbHkUq1*m&R#4>GT-pvTpl|h=VKY05FL97RHv$*2G zwdZgAS$-~~$_)DX-=!24AT6?j9pYRmAb@-1t#648u9nA9hv_&9T;^jSKhX4Z}6AY}={Z_)HjztGN)|2Be}XwAG?N4Q zbmdVH_qADyTVsQ6{&+@YR`XEg0l<{U1<#>=(477p^!DG;NS>fsI%c>$Fe-ef3Lb7l zYDL$x)$k-&ELh+{JsbJXOGx&eIy%MR2kc$wFa0~G!oBPn19CnbsV#GXTJg?E%d2yZ z-pM-JrVdDCfO1d_N1^tA_{v{{yTW8f&c=yLIgl@#2QvDAUXTw+=^ZYm;QHfI-~vs@ zdU|=k2ge7>RcDB_8E017IX!_gfE@<$Gpuu5DX(flN}B=|A72FDFBz6C(KqKn@BQnd zl!EUAz4mn1JFggvATbO8#+v>CZ;@6W3%Q=Xmd+G{1Nu)KNS$^?#?2$APAztq3Q2=B zzy1YD!Rb#xoi>md;2f3b$AJ%@$p7H088gLBU)R)s%s{2Pcmy%1PJ;jz0W|p@kgtUX zi_%OBUW|vRxak>F)4zTH64#SjA3;s^pN)`~(?o(%>)uRAbiEg&yHtw7U1kcDLaKfU zw8#G4-=V!y;oxqb)B$K=mmUyx{gWkghdE%*DgUp}JvHWACMEyx>3@9z(u8qNKPn;a zV2lAaNx+Zr7#B=SQdn3>?HPl>#BoW-kuZXQ!!4Y2A3L6^kInY1j#C~;TH>A*OmgQq z5Z0KIfsFp{kre*)Z#bQ$hK>NDNnB`7M@hzP3Iq*!_H3k)64yF|%9bXA|AgA<6gvbczdA#f&0{-d~ zhCC$tC*!RHi?j&`jPdqVJE55?bHI>ii*<%NijDDHGqsJQ3IOK-DnYp?tc+7Y)ky|i z`I3DFoULmLjP8N%)znHbZX1En-43SjZ=`BFR3vp+@NHbkX`IWviHO}6*bGq3F5S*UbZRKy;bbjOk=k!@!$vamBsjsb6dc_O-YtxJ#u)EMz_qWp*CQ#_zt``TGLJSc zYE*Y-J|r5hD7}0#7^$+}yjzoz`r5x#t&BoOFs5~lu>V*+S3WC+^hFyFnLcYz1iqx4 zpu%)|4G7>aQA0oWDZe=;pm7EC(!lW+uFCG4G@EBGwR`m&W{w13micu<0CFS&kL{;( zVjOu_;kAp-@ll@8PrL8z1Y0=a+KvH{&5+pvl5mgw-3woLG?`#b6~}|^mNK<-9StCO zgTw}-RS*L!!$y#ls%2XsyCQ+#>9){Z2e^Zpjf|jJcGMSt^DiLLgK5SkR#>@4C}vO& zS>(P5HG+?U0Ieh7;MI$fUb-kn!qpa218Pc9 z_B{K$D;K3r?9J~(=<{Pd14iCS3vE?5KgV8Fn+K2^DDf?BLTsp5&X6Ep;( zT1aw1+)CwINb6E61R#=&phg~&XFV`)9*slN$K?rVaDWlT6A5UG=Ag=o*ZvYRZ~r*H z)B>9hFD0I{F9J19TC6XZS&pL%iQmmHuwjxFtPgaaGlU*|>scf~2zPVH4z8UBO``{# z8yuMq6(06G$ygd)$7nwT;yRqKq96lUhrya?N5GI9C<1uCO!q+{|9i^?FKnu z9QSS7j~vZ4-2}!hvP*vxtQFGxPlE}H8EFm#aJrK`?@T4L)c>d+OZGPqY2<5v1$K%9 z1KblAtks%&iAxHF?>@v0K18DfXFM!TE8E4OJRek;8m-Z`{>{`B_|5Z@zIsv8y)@Oa z$X5NagptV;mAn5KC?wAoW8@<)z%75UwO|y9!8|~VGt>ZUhc(f3=D4kZ^Np6Xw03{~ zI3s#FdT__pOCDz-o}CUdBXNL-z_7L2szx`d6F}-a6C`z;bq2B<-4Y&j0sP&6OlLHj zc-obL=%UVqJyBW+1QngUEZ1X*g?tXw{b2|fhJW%J1`EErX+=1vEyffiaQY z-7r;dPKnU})OT z4$h-SV3;csA(GK2put)|zxe?eHwT+9*l3XsV?put#~}dw7)gm)`q#(25dfjx9{adB z&r{r3z%*#Arom%Q3t}rDcN+yS!~r6DZGFjpma;C!i7o&mVxh<-Cad>{aY0$P7Nj;|jERK;#cP!fgN{lF`_wUK7z|?2T8&3IpNg`B5NQSO#(o}U z&fjW4rdBBn5s2;p(?2z8gfP`L%}&XnRiS@!rGK$vHs)(IS5GQ8MX(03fzrjs*?#4 z54tSti6CfYYKLrpfv?10^RG}_!GBSU_RStbt@{E;oIL<0n4s5Y+~N)PCw{I(f7}_; zEP;I|EEpFh9Xxwo5v_lhjuLG?FwIRF)}1D&SLW#MYcE^?Uj|KrI0|5u#BG^w@>HW5 l#`JGjT2VCQKBy&!+avXpR|1Bm1Aq0ZuBx#Tx&1b<{|~G@=I{Uj literal 0 HcmV?d00001 diff --git a/apps/marketing/src/app/globals.css b/apps/marketing/src/app/globals.css new file mode 100644 index 0000000..875c01e --- /dev/null +++ b/apps/marketing/src/app/globals.css @@ -0,0 +1,33 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + +:root { + --foreground-rgb: 0, 0, 0; + --background-start-rgb: 214, 219, 220; + --background-end-rgb: 255, 255, 255; +} + +@media (prefers-color-scheme: dark) { + :root { + --foreground-rgb: 255, 255, 255; + --background-start-rgb: 0, 0, 0; + --background-end-rgb: 0, 0, 0; + } +} + +body { + color: rgb(var(--foreground-rgb)); + background: linear-gradient( + to bottom, + transparent, + rgb(var(--background-end-rgb)) + ) + rgb(var(--background-start-rgb)); +} + +@layer utilities { + .text-balance { + text-wrap: balance; + } +} diff --git a/apps/marketing/src/app/layout.tsx b/apps/marketing/src/app/layout.tsx new file mode 100644 index 0000000..9ec174b --- /dev/null +++ b/apps/marketing/src/app/layout.tsx @@ -0,0 +1,25 @@ +import type { Metadata } from "next"; +import { Inter } from "next/font/google"; +import "@unsend/ui/styles/globals.css"; +import { ThemeProvider } from "@unsend/ui/theme-provider"; + +const inter = Inter({ subsets: ["latin"] }); + +export const metadata: Metadata = { + title: "Unsend", + description: "Open source sending infrastructure", +}; + +export default function RootLayout({ + children, +}: Readonly<{ + children: React.ReactNode; +}>) { + return ( + + + {children} + + + ); +} diff --git a/apps/marketing/src/app/page.tsx b/apps/marketing/src/app/page.tsx new file mode 100644 index 0000000..dd72e64 --- /dev/null +++ b/apps/marketing/src/app/page.tsx @@ -0,0 +1,47 @@ +import { ArrowRight, MoveRight, SendHorizonal } from "lucide-react"; +import Image from "next/image"; +import { BackgroundBeams } from "~/components/ui/background-beams"; +import { StyledInput } from "~/components/ui/styled-input"; + +export default function Home() { + return ( +
+
+
+

+ Open source sending infrastructure for{" "} + + developers + +

+

+

+ Send transactional, marketing emails, SMSes and push notifications + effortlessly. +

+

+ Join the waitlist! +

+
+ + +
+
+ +
+
+
+

+ Join the waitlist +

+
+
+
+ ); +} diff --git a/apps/marketing/src/components/ui/background-beams.tsx b/apps/marketing/src/components/ui/background-beams.tsx new file mode 100644 index 0000000..e7ce1a8 --- /dev/null +++ b/apps/marketing/src/components/ui/background-beams.tsx @@ -0,0 +1,149 @@ +"use client"; +import React from "react"; +import { motion } from "framer-motion"; +import { cn } from "@unsend/ui/lib/utils"; + +export const BackgroundBeams = React.memo( + ({ className }: { className?: string }) => { + const paths = [ + "M-380 -189C-380 -189 -312 216 152 343C616 470 684 875 684 875", + "M-373 -197C-373 -197 -305 208 159 335C623 462 691 867 691 867", + "M-366 -205C-366 -205 -298 200 166 327C630 454 698 859 698 859", + "M-359 -213C-359 -213 -291 192 173 319C637 446 705 851 705 851", + "M-352 -221C-352 -221 -284 184 180 311C644 438 712 843 712 843", + "M-345 -229C-345 -229 -277 176 187 303C651 430 719 835 719 835", + "M-338 -237C-338 -237 -270 168 194 295C658 422 726 827 726 827", + "M-331 -245C-331 -245 -263 160 201 287C665 414 733 819 733 819", + "M-324 -253C-324 -253 -256 152 208 279C672 406 740 811 740 811", + "M-317 -261C-317 -261 -249 144 215 271C679 398 747 803 747 803", + "M-310 -269C-310 -269 -242 136 222 263C686 390 754 795 754 795", + "M-303 -277C-303 -277 -235 128 229 255C693 382 761 787 761 787", + "M-296 -285C-296 -285 -228 120 236 247C700 374 768 779 768 779", + "M-289 -293C-289 -293 -221 112 243 239C707 366 775 771 775 771", + "M-282 -301C-282 -301 -214 104 250 231C714 358 782 763 782 763", + "M-275 -309C-275 -309 -207 96 257 223C721 350 789 755 789 755", + "M-268 -317C-268 -317 -200 88 264 215C728 342 796 747 796 747", + "M-261 -325C-261 -325 -193 80 271 207C735 334 803 739 803 739", + "M-254 -333C-254 -333 -186 72 278 199C742 326 810 731 810 731", + "M-247 -341C-247 -341 -179 64 285 191C749 318 817 723 817 723", + "M-240 -349C-240 -349 -172 56 292 183C756 310 824 715 824 715", + "M-233 -357C-233 -357 -165 48 299 175C763 302 831 707 831 707", + "M-226 -365C-226 -365 -158 40 306 167C770 294 838 699 838 699", + "M-219 -373C-219 -373 -151 32 313 159C777 286 845 691 845 691", + "M-212 -381C-212 -381 -144 24 320 151C784 278 852 683 852 683", + "M-205 -389C-205 -389 -137 16 327 143C791 270 859 675 859 675", + "M-198 -397C-198 -397 -130 8 334 135C798 262 866 667 866 667", + "M-191 -405C-191 -405 -123 0 341 127C805 254 873 659 873 659", + "M-184 -413C-184 -413 -116 -8 348 119C812 246 880 651 880 651", + "M-177 -421C-177 -421 -109 -16 355 111C819 238 887 643 887 643", + "M-170 -429C-170 -429 -102 -24 362 103C826 230 894 635 894 635", + "M-163 -437C-163 -437 -95 -32 369 95C833 222 901 627 901 627", + "M-156 -445C-156 -445 -88 -40 376 87C840 214 908 619 908 619", + "M-149 -453C-149 -453 -81 -48 383 79C847 206 915 611 915 611", + "M-142 -461C-142 -461 -74 -56 390 71C854 198 922 603 922 603", + "M-135 -469C-135 -469 -67 -64 397 63C861 190 929 595 929 595", + "M-128 -477C-128 -477 -60 -72 404 55C868 182 936 587 936 587", + "M-121 -485C-121 -485 -53 -80 411 47C875 174 943 579 943 579", + "M-114 -493C-114 -493 -46 -88 418 39C882 166 950 571 950 571", + "M-107 -501C-107 -501 -39 -96 425 31C889 158 957 563 957 563", + "M-100 -509C-100 -509 -32 -104 432 23C896 150 964 555 964 555", + "M-93 -517C-93 -517 -25 -112 439 15C903 142 971 547 971 547", + "M-86 -525C-86 -525 -18 -120 446 7C910 134 978 539 978 539", + "M-79 -533C-79 -533 -11 -128 453 -1C917 126 985 531 985 531", + "M-72 -541C-72 -541 -4 -136 460 -9C924 118 992 523 992 523", + "M-65 -549C-65 -549 3 -144 467 -17C931 110 999 515 999 515", + "M-58 -557C-58 -557 10 -152 474 -25C938 102 1006 507 1006 507", + "M-51 -565C-51 -565 17 -160 481 -33C945 94 1013 499 1013 499", + "M-44 -573C-44 -573 24 -168 488 -41C952 86 1020 491 1020 491", + "M-37 -581C-37 -581 31 -176 495 -49C959 78 1027 483 1027 483", + ]; + return ( +
+ + + + {paths.map((path, index) => ( + + ))} + + {paths.map((path, index) => ( + + + + + + + ))} + + + + + + + + +
+ ); + } +); + +BackgroundBeams.displayName = "BackgroundBeams"; diff --git a/apps/marketing/src/components/ui/styled-input.tsx b/apps/marketing/src/components/ui/styled-input.tsx new file mode 100644 index 0000000..d3eccd0 --- /dev/null +++ b/apps/marketing/src/components/ui/styled-input.tsx @@ -0,0 +1,61 @@ +// Input component extends from shadcnui - https://ui.shadcn.com/docs/components/input +"use client"; +import * as React from "react"; +import { cn } from "@unsend/ui/lib/utils"; +import { useMotionTemplate, useMotionValue, motion } from "framer-motion"; + +export interface InputProps + extends React.InputHTMLAttributes {} + +const StyledInput = React.forwardRef( + ({ className, type, ...props }, ref) => { + const radius = 100; // change this to increase the rdaius of the hover effect + const [visible, setVisible] = React.useState(false); + + let mouseX = useMotionValue(0); + let mouseY = useMotionValue(0); + + function handleMouseMove({ currentTarget, clientX, clientY }: any) { + let { left, top } = currentTarget.getBoundingClientRect(); + + mouseX.set(clientX - left); + mouseY.set(clientY - top); + } + return ( + setVisible(true)} + onMouseLeave={() => setVisible(false)} + className="p-[2px] rounded-lg transition duration-300 group/input" + > + + + ); + } +); +StyledInput.displayName = "Input"; + +export { StyledInput }; diff --git a/apps/marketing/tailwind.config.ts b/apps/marketing/tailwind.config.ts new file mode 100644 index 0000000..37212a9 --- /dev/null +++ b/apps/marketing/tailwind.config.ts @@ -0,0 +1,8 @@ +import { type Config } from "tailwindcss"; +import sharedConfig from "@unsend/tailwind-config/tailwind.config"; +import path from "path"; + +export default { + ...sharedConfig, + content: ["./src/**/*.tsx"], +} satisfies Config; diff --git a/apps/marketing/tsconfig.json b/apps/marketing/tsconfig.json new file mode 100644 index 0000000..7e53db7 --- /dev/null +++ b/apps/marketing/tsconfig.json @@ -0,0 +1,24 @@ +{ + "extends": "@unsend/typescript-config/nextjs.json", + "compilerOptions": { + "baseUrl": ".", + "paths": { + "~/*": ["./src/*"] + }, + "plugins": [ + { + "name": "next" + } + ], + "strictNullChecks": true + }, + "include": [ + "next-env.d.ts", + "**/*.ts", + "**/*.tsx", + "**/*.cjs", + "**/*.js", + ".next/types/**/*.ts" + ], + "exclude": ["node_modules"] +} diff --git a/apps/web/package.json b/apps/web/package.json index 6580dd1..fa54891 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -4,7 +4,7 @@ "private": true, "type": "module", "scripts": { - "dev": "next dev", + "dev": "next dev -p 3000", "build": "next build", "start": "next start", "lint": "eslint . --max-warnings 0", diff --git a/apps/web/public/unsend_white_logo.png b/apps/web/public/unsend_white_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..0e773b5b01b5fbdb72bc34d3b602ff603c2eda8a GIT binary patch literal 10353 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 literal 0 HcmV?d00001 diff --git a/apps/web/public/unsend_white_new.png b/apps/web/public/unsend_white_new.png new file mode 100644 index 0000000000000000000000000000000000000000..7f4a6644fdca2202b1da2b858a581b2e6052a5a9 GIT binary patch literal 11614 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 world; +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuLabel, + DropdownMenuSeparator, + DropdownMenuTrigger, +} from "@unsend/ui/src/dropdown-menu"; +import { Input } from "@unsend/ui/src/input"; +import { Sheet, SheetContent, SheetTrigger } from "@unsend/ui/src/sheet"; + +export default function Dashboard() { + return
Hello
; } diff --git a/apps/web/src/app/(dashboard)/layout.tsx b/apps/web/src/app/(dashboard)/layout.tsx index 7c92a7f..a95f76e 100644 --- a/apps/web/src/app/(dashboard)/layout.tsx +++ b/apps/web/src/app/(dashboard)/layout.tsx @@ -1,7 +1,39 @@ import Link from "next/link"; import { redirect } from "next/navigation"; +import { + Bell, + CircleUser, + Globe, + Home, + KeyRound, + LayoutDashboard, + LineChart, + Mail, + Menu, + Package, + Package2, + Search, + ShoppingCart, + Users, +} from "lucide-react"; +import { Button } from "@unsend/ui/src/button"; + +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuLabel, + DropdownMenuSeparator, + DropdownMenuTrigger, +} from "@unsend/ui/src/dropdown-menu"; +import { Input } from "@unsend/ui/src/input"; +import { Sheet, SheetContent, SheetTrigger } from "@unsend/ui/src/sheet"; + import { NextAuthProvider } from "~/providers/next-auth"; import { getServerAuthSession } from "~/server/auth"; +import Image from "next/image"; +import { useRouter } from "next/navigation"; +import { NavButton } from "./nav-button"; export const metadata = { title: "Unsend", @@ -22,19 +54,131 @@ export default async function AuthenticatedDashboardLayout({ return ( -
- -
-
{children}
+
+
+
+ + + + + + +
+
+
+ + + + + + My Account + + Settings + Support + + Logout + + +
+
+ {children} +
diff --git a/apps/web/src/app/(dashboard)/nav-button.tsx b/apps/web/src/app/(dashboard)/nav-button.tsx new file mode 100644 index 0000000..938a1bc --- /dev/null +++ b/apps/web/src/app/(dashboard)/nav-button.tsx @@ -0,0 +1,23 @@ +"use client"; + +import Link from "next/link"; +import { usePathname } from "next/navigation"; +import React from "react"; + +export const NavButton: React.FC<{ + href: string; + children: React.ReactNode; +}> = ({ href, children }) => { + const pathname = usePathname(); + + const isActive = pathname === href; + + return ( + + {children} + + ); +}; diff --git a/apps/web/src/app/layout.tsx b/apps/web/src/app/layout.tsx index feee9e5..c759d1b 100644 --- a/apps/web/src/app/layout.tsx +++ b/apps/web/src/app/layout.tsx @@ -24,7 +24,7 @@ export default function RootLayout({ return ( - + {children} diff --git a/package.json b/package.json index c0d06d9..1b54528 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "private": true, "scripts": { "build": "turbo build", - "dev": "pnpm load-env -- turbo dev --filter=web", + "dev": "pnpm load-env -- turbo dev", "lint": "turbo lint", "format": "prettier --write \"**/*.{ts,tsx,md}\"", "db:generate": "pnpm db db:generate", diff --git a/packages/ui/package.json b/packages/ui/package.json index 790316c..78ba31a 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -28,6 +28,7 @@ }, "dependencies": { "@radix-ui/react-dialog": "^1.0.5", + "@radix-ui/react-dropdown-menu": "^2.0.6", "@radix-ui/react-label": "^2.0.2", "@radix-ui/react-slot": "^1.0.2", "add": "^2.0.6", diff --git a/packages/ui/src/dropdown-menu.tsx b/packages/ui/src/dropdown-menu.tsx new file mode 100644 index 0000000..495d50b --- /dev/null +++ b/packages/ui/src/dropdown-menu.tsx @@ -0,0 +1,200 @@ +"use client"; + +import * as React from "react"; +import * as DropdownMenuPrimitive from "@radix-ui/react-dropdown-menu"; +import { Check, ChevronRight, Circle } from "lucide-react"; + +import { cn } from "../lib/utils"; + +const DropdownMenu = DropdownMenuPrimitive.Root; + +const DropdownMenuTrigger = DropdownMenuPrimitive.Trigger; + +const DropdownMenuGroup = DropdownMenuPrimitive.Group; + +const DropdownMenuPortal = DropdownMenuPrimitive.Portal; + +const DropdownMenuSub = DropdownMenuPrimitive.Sub; + +const DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup; + +const DropdownMenuSubTrigger = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef & { + inset?: boolean; + } +>(({ className, inset, children, ...props }, ref) => ( + + {children} + + +)); +DropdownMenuSubTrigger.displayName = + DropdownMenuPrimitive.SubTrigger.displayName; + +const DropdownMenuSubContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +DropdownMenuSubContent.displayName = + DropdownMenuPrimitive.SubContent.displayName; + +const DropdownMenuContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, sideOffset = 4, ...props }, ref) => ( + + + +)); +DropdownMenuContent.displayName = DropdownMenuPrimitive.Content.displayName; + +const DropdownMenuItem = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef & { + inset?: boolean; + } +>(({ className, inset, ...props }, ref) => ( + +)); +DropdownMenuItem.displayName = DropdownMenuPrimitive.Item.displayName; + +const DropdownMenuCheckboxItem = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, checked, ...props }, ref) => ( + + + + + + + {children} + +)); +DropdownMenuCheckboxItem.displayName = + DropdownMenuPrimitive.CheckboxItem.displayName; + +const DropdownMenuRadioItem = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, ...props }, ref) => ( + + + + + + + {children} + +)); +DropdownMenuRadioItem.displayName = DropdownMenuPrimitive.RadioItem.displayName; + +const DropdownMenuLabel = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef & { + inset?: boolean; + } +>(({ className, inset, ...props }, ref) => ( + +)); +DropdownMenuLabel.displayName = DropdownMenuPrimitive.Label.displayName; + +const DropdownMenuSeparator = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +DropdownMenuSeparator.displayName = DropdownMenuPrimitive.Separator.displayName; + +const DropdownMenuShortcut = ({ + className, + ...props +}: React.HTMLAttributes) => { + return ( + + ); +}; +DropdownMenuShortcut.displayName = "DropdownMenuShortcut"; + +export { + DropdownMenu, + DropdownMenuTrigger, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuCheckboxItem, + DropdownMenuRadioItem, + DropdownMenuLabel, + DropdownMenuSeparator, + DropdownMenuShortcut, + DropdownMenuGroup, + DropdownMenuPortal, + DropdownMenuSub, + DropdownMenuSubContent, + DropdownMenuSubTrigger, + DropdownMenuRadioGroup, +}; diff --git a/packages/ui/src/sheet.tsx b/packages/ui/src/sheet.tsx new file mode 100644 index 0000000..86be4d7 --- /dev/null +++ b/packages/ui/src/sheet.tsx @@ -0,0 +1,140 @@ +"use client"; + +import * as React from "react"; +import * as SheetPrimitive from "@radix-ui/react-dialog"; +import { cva, type VariantProps } from "class-variance-authority"; +import { X } from "lucide-react"; + +import { cn } from "../lib/utils"; + +const Sheet = SheetPrimitive.Root; + +const SheetTrigger = SheetPrimitive.Trigger; + +const SheetClose = SheetPrimitive.Close; + +const SheetPortal = SheetPrimitive.Portal; + +const SheetOverlay = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +SheetOverlay.displayName = SheetPrimitive.Overlay.displayName; + +const sheetVariants = cva( + "fixed z-50 gap-4 bg-background p-6 shadow-lg transition ease-in-out data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:duration-300 data-[state=open]:duration-500", + { + variants: { + side: { + top: "inset-x-0 top-0 border-b data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top", + bottom: + "inset-x-0 bottom-0 border-t data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom", + left: "inset-y-0 left-0 h-full w-3/4 border-r data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left sm:max-w-sm", + right: + "inset-y-0 right-0 h-full w-3/4 border-l data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right sm:max-w-sm", + }, + }, + defaultVariants: { + side: "right", + }, + } +); + +interface SheetContentProps + extends React.ComponentPropsWithoutRef, + VariantProps {} + +const SheetContent = React.forwardRef< + React.ElementRef, + SheetContentProps +>(({ side = "right", className, children, ...props }, ref) => ( + + + + {children} + + + Close + + + +)); +SheetContent.displayName = SheetPrimitive.Content.displayName; + +const SheetHeader = ({ + className, + ...props +}: React.HTMLAttributes) => ( +
+); +SheetHeader.displayName = "SheetHeader"; + +const SheetFooter = ({ + className, + ...props +}: React.HTMLAttributes) => ( +
+); +SheetFooter.displayName = "SheetFooter"; + +const SheetTitle = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +SheetTitle.displayName = SheetPrimitive.Title.displayName; + +const SheetDescription = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +SheetDescription.displayName = SheetPrimitive.Description.displayName; + +export { + Sheet, + SheetPortal, + SheetOverlay, + SheetTrigger, + SheetClose, + SheetContent, + SheetHeader, + SheetFooter, + SheetTitle, + SheetDescription, +}; diff --git a/packages/ui/styles/globals.css b/packages/ui/styles/globals.css index 6a75725..2c8e065 100644 --- a/packages/ui/styles/globals.css +++ b/packages/ui/styles/globals.css @@ -1,7 +1,7 @@ @tailwind base; @tailwind components; @tailwind utilities; - + @layer base { :root { --background: 0 0% 100%; @@ -9,63 +9,63 @@ --card: 0 0% 100%; --card-foreground: 222.2 84% 4.9%; - + --popover: 0 0% 100%; --popover-foreground: 222.2 84% 4.9%; - + --primary: 222.2 47.4% 11.2%; --primary-foreground: 210 40% 98%; - + --secondary: 210 40% 96.1%; --secondary-foreground: 222.2 47.4% 11.2%; - + --muted: 210 40% 96.1%; --muted-foreground: 215.4 16.3% 46.9%; - + --accent: 210 40% 96.1%; --accent-foreground: 222.2 47.4% 11.2%; - + --destructive: 0 84.2% 60.2%; --destructive-foreground: 210 40% 98%; --border: 214.3 31.8% 91.4%; --input: 214.3 31.8% 91.4%; --ring: 222.2 84% 4.9%; - + --radius: 0.5rem; } - + .dark { - --background: 222.2 84% 4.9%; + --background: 223 3% 3%; --foreground: 210 40% 98%; - + --card: 222.2 84% 4.9%; --card-foreground: 210 40% 98%; - + --popover: 222.2 84% 4.9%; --popover-foreground: 210 40% 98%; - + --primary: 210 40% 98%; --primary-foreground: 222.2 47.4% 11.2%; - + --secondary: 217.2 32.6% 17.5%; --secondary-foreground: 210 40% 98%; - + --muted: 217.2 32.6% 17.5%; --muted-foreground: 215 20.2% 65.1%; - + --accent: 217.2 32.6% 17.5%; --accent-foreground: 210 40% 98%; - + --destructive: 0 62.8% 30.6%; --destructive-foreground: 210 40% 98%; - + --border: 217.2 32.6% 17.5%; --input: 217.2 32.6% 17.5%; --ring: 212.7 26.8% 83.9%; } } - + @layer base { * { @apply border-border; @@ -73,4 +73,4 @@ body { @apply bg-background text-foreground; } -} \ No newline at end of file +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ab70a39..a7f6220 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -25,6 +25,61 @@ importers: specifier: ^3.2.5 version: 3.2.5 + apps/marketing: + dependencies: + framer-motion: + specifier: ^11.0.24 + version: 11.0.24(react-dom@18.2.0)(react@18.2.0) + lucide-react: + specifier: ^0.359.0 + version: 0.359.0(react@18.2.0) + next: + specifier: 14.1.4 + version: 14.1.4(react-dom@18.2.0)(react@18.2.0) + react: + specifier: ^18 + version: 18.2.0 + react-dom: + specifier: ^18 + version: 18.2.0(react@18.2.0) + devDependencies: + '@types/node': + specifier: ^20 + version: 20.11.27 + '@types/react': + specifier: ^18 + version: 18.2.66 + '@types/react-dom': + specifier: ^18 + version: 18.2.22 + '@unsend/eslint-config': + specifier: workspace:* + version: link:../../packages/eslint-config + '@unsend/tailwind-config': + specifier: workspace:* + version: link:../../packages/tailwind-config + '@unsend/ui': + specifier: workspace:* + version: link:../../packages/ui + autoprefixer: + specifier: ^10.0.1 + version: 10.4.18(postcss@8.4.36) + eslint: + specifier: ^8 + version: 8.57.0 + eslint-config-next: + specifier: 14.1.4 + version: 14.1.4(eslint@8.57.0)(typescript@5.4.2) + postcss: + specifier: ^8 + version: 8.4.36 + tailwindcss: + specifier: ^3.3.0 + version: 3.4.1 + typescript: + specifier: ^5 + version: 5.4.2 + apps/web: dependencies: '@auth/prisma-adapter': @@ -143,15 +198,6 @@ importers: specifier: ^5.4.2 version: 5.4.2 - packages/db: - dependencies: - '@prisma/client': - specifier: ^5.11.0 - version: 5.11.0(prisma@5.11.0) - prisma: - specifier: ^5.11.0 - version: 5.11.0 - packages/eslint-config: devDependencies: '@typescript-eslint/eslint-plugin': @@ -176,15 +222,6 @@ importers: specifier: ^5.3.3 version: 5.4.2 - packages/lib: - devDependencies: - '@unsend/eslint-config': - specifier: workspace:* - version: link:../eslint-config - '@unsend/typescript-config': - specifier: workspace:* - version: link:../typescript-config - packages/tailwind-config: dependencies: tailwindcss-animate: @@ -211,6 +248,9 @@ importers: '@radix-ui/react-dialog': specifier: ^1.0.5 version: 1.0.5(@types/react-dom@18.2.22)(@types/react@18.2.66)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-dropdown-menu': + specifier: ^2.0.6 + version: 2.0.6(@types/react-dom@18.2.22)(@types/react@18.2.66)(react-dom@18.2.0)(react@18.2.0) '@radix-ui/react-label': specifier: ^2.0.2 version: 2.0.2(@types/react-dom@18.2.22)(@types/react@18.2.66)(react-dom@18.2.0)(react@18.2.0) @@ -1370,6 +1410,34 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true + /@floating-ui/core@1.6.0: + resolution: {integrity: sha512-PcF++MykgmTj3CIyOQbKA/hDzOAiqI3mhuoN44WRCopIs1sgoDoU4oty4Jtqaj/y3oDU6fnVSm4QG0a3t5i0+g==} + dependencies: + '@floating-ui/utils': 0.2.1 + dev: false + + /@floating-ui/dom@1.6.3: + resolution: {integrity: sha512-RnDthu3mzPlQ31Ss/BTwQ1zjzIhr3lk1gZB1OC56h/1vEtaXkESrOqL5fQVMfXpwGtRwX+YsZBdyHtJMQnkArw==} + dependencies: + '@floating-ui/core': 1.6.0 + '@floating-ui/utils': 0.2.1 + dev: false + + /@floating-ui/react-dom@2.0.8(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-HOdqOt3R3OGeTKidaLvJKcgg75S6tibQ3Tif4eyd91QnIJWr0NLvoXFpJA/j8HqkFSL68GDca9AuyWEHlhyClw==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + dependencies: + '@floating-ui/dom': 1.6.3 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@floating-ui/utils@0.2.1: + resolution: {integrity: sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q==} + dev: false + /@humanwhocodes/config-array@0.11.14: resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} engines: {node: '>=10.10.0'} @@ -1443,12 +1511,22 @@ packages: resolution: {integrity: sha512-VhgXTvrgeBRxNPjyfBsDIMvgsKDxjlpw4IAUsHCX8Gjl1vtHUYRT3+xfQ/wwvLPDd/6kqfLqk9Pt4+7gysuCKQ==} dev: false + /@next/env@14.1.4: + resolution: {integrity: sha512-e7X7bbn3Z6DWnDi75UWn+REgAbLEqxI8Tq2pkFOFAMpWAWApz/YCUhtWMWn410h8Q2fYiYL7Yg5OlxMOCfFjJQ==} + dev: false + /@next/eslint-plugin-next@14.1.3: resolution: {integrity: sha512-VCnZI2cy77Yaj3L7Uhs3+44ikMM1VD/fBMwvTBb3hIaTIuqa+DmG4dhUDq+MASu3yx97KhgsVJbsas0XuiKyww==} dependencies: glob: 10.3.10 dev: true + /@next/eslint-plugin-next@14.1.4: + resolution: {integrity: sha512-n4zYNLSyCo0Ln5b7qxqQeQ34OZKXwgbdcx6kmkQbywr+0k6M3Vinft0T72R6CDAcDrne2IAgSud4uWCzFgc5HA==} + dependencies: + glob: 10.3.10 + dev: true + /@next/swc-darwin-arm64@14.1.3: resolution: {integrity: sha512-LALu0yIBPRiG9ANrD5ncB3pjpO0Gli9ZLhxdOu6ZUNf3x1r3ea1rd9Q+4xxUkGrUXLqKVK9/lDkpYIJaCJ6AHQ==} engines: {node: '>= 10'} @@ -1458,6 +1536,15 @@ packages: dev: false optional: true + /@next/swc-darwin-arm64@14.1.4: + resolution: {integrity: sha512-ubmUkbmW65nIAOmoxT1IROZdmmJMmdYvXIe8211send9ZYJu+SqxSnJM4TrPj9wmL6g9Atvj0S/2cFmMSS99jg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + /@next/swc-darwin-x64@14.1.3: resolution: {integrity: sha512-E/9WQeXxkqw2dfcn5UcjApFgUq73jqNKaE5bysDm58hEUdUGedVrnRhblhJM7HbCZNhtVl0j+6TXsK0PuzXTCg==} engines: {node: '>= 10'} @@ -1467,6 +1554,15 @@ packages: dev: false optional: true + /@next/swc-darwin-x64@14.1.4: + resolution: {integrity: sha512-b0Xo1ELj3u7IkZWAKcJPJEhBop117U78l70nfoQGo4xUSvv0PJSTaV4U9xQBLvZlnjsYkc8RwQN1HoH/oQmLlQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + /@next/swc-linux-arm64-gnu@14.1.3: resolution: {integrity: sha512-USArX9B+3rZSXYLFvgy0NVWQgqh6LHWDmMt38O4lmiJNQcwazeI6xRvSsliDLKt+78KChVacNiwvOMbl6g6BBw==} engines: {node: '>= 10'} @@ -1476,6 +1572,15 @@ packages: dev: false optional: true + /@next/swc-linux-arm64-gnu@14.1.4: + resolution: {integrity: sha512-457G0hcLrdYA/u1O2XkRMsDKId5VKe3uKPvrKVOyuARa6nXrdhJOOYU9hkKKyQTMru1B8qEP78IAhf/1XnVqKA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + /@next/swc-linux-arm64-musl@14.1.3: resolution: {integrity: sha512-esk1RkRBLSIEp1qaQXv1+s6ZdYzuVCnDAZySpa62iFTMGTisCyNQmqyCTL9P+cLJ4N9FKCI3ojtSfsyPHJDQNw==} engines: {node: '>= 10'} @@ -1485,6 +1590,15 @@ packages: dev: false optional: true + /@next/swc-linux-arm64-musl@14.1.4: + resolution: {integrity: sha512-l/kMG+z6MB+fKA9KdtyprkTQ1ihlJcBh66cf0HvqGP+rXBbOXX0dpJatjZbHeunvEHoBBS69GYQG5ry78JMy3g==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + /@next/swc-linux-x64-gnu@14.1.3: resolution: {integrity: sha512-8uOgRlYEYiKo0L8YGeS+3TudHVDWDjPVDUcST+z+dUzgBbTEwSSIaSgF/vkcC1T/iwl4QX9iuUyUdQEl0Kxalg==} engines: {node: '>= 10'} @@ -1494,6 +1608,15 @@ packages: dev: false optional: true + /@next/swc-linux-x64-gnu@14.1.4: + resolution: {integrity: sha512-BapIFZ3ZRnvQ1uWbmqEGJuPT9cgLwvKtxhK/L2t4QYO7l+/DxXuIGjvp1x8rvfa/x1FFSsipERZK70pewbtJtw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + /@next/swc-linux-x64-musl@14.1.3: resolution: {integrity: sha512-DX2zqz05ziElLoxskgHasaJBREC5Y9TJcbR2LYqu4r7naff25B4iXkfXWfcp69uD75/0URmmoSgT8JclJtrBoQ==} engines: {node: '>= 10'} @@ -1503,6 +1626,15 @@ packages: dev: false optional: true + /@next/swc-linux-x64-musl@14.1.4: + resolution: {integrity: sha512-mqVxTwk4XuBl49qn2A5UmzFImoL1iLm0KQQwtdRJRKl21ylQwwGCxJtIYo2rbfkZHoSKlh/YgztY0qH3wG1xIg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + /@next/swc-win32-arm64-msvc@14.1.3: resolution: {integrity: sha512-HjssFsCdsD4GHstXSQxsi2l70F/5FsRTRQp8xNgmQs15SxUfUJRvSI9qKny/jLkY3gLgiCR3+6A7wzzK0DBlfA==} engines: {node: '>= 10'} @@ -1512,6 +1644,15 @@ packages: dev: false optional: true + /@next/swc-win32-arm64-msvc@14.1.4: + resolution: {integrity: sha512-xzxF4ErcumXjO2Pvg/wVGrtr9QQJLk3IyQX1ddAC/fi6/5jZCZ9xpuL9Tzc4KPWMFq8GGWFVDMshZOdHGdkvag==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: false + optional: true + /@next/swc-win32-ia32-msvc@14.1.3: resolution: {integrity: sha512-DRuxD5axfDM1/Ue4VahwSxl1O5rn61hX8/sF0HY8y0iCbpqdxw3rB3QasdHn/LJ6Wb2y5DoWzXcz3L1Cr+Thrw==} engines: {node: '>= 10'} @@ -1521,6 +1662,15 @@ packages: dev: false optional: true + /@next/swc-win32-ia32-msvc@14.1.4: + resolution: {integrity: sha512-WZiz8OdbkpRw6/IU/lredZWKKZopUMhcI2F+XiMAcPja0uZYdMTZQRoQ0WZcvinn9xZAidimE7tN9W5v9Yyfyw==} + engines: {node: '>= 10'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: false + optional: true + /@next/swc-win32-x64-msvc@14.1.3: resolution: {integrity: sha512-uC2DaDoWH7h1P/aJ4Fok3Xiw6P0Lo4ez7NbowW2VGNXw/Xv6tOuLUcxhBYZxsSUJtpeknCi8/fvnSpyCFp4Rcg==} engines: {node: '>= 10'} @@ -1530,6 +1680,15 @@ packages: dev: false optional: true + /@next/swc-win32-x64-msvc@14.1.4: + resolution: {integrity: sha512-4Rto21sPfw555sZ/XNLqfxDUNeLhNYGO2dlPqsnuCg8N8a2a9u1ltqBOPQ4vj1Gf7eJC0W2hHG2eYUHuiXgY2w==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + /@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1: resolution: {integrity: sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==} dependencies: @@ -1620,6 +1779,51 @@ packages: '@babel/runtime': 7.24.0 dev: false + /@radix-ui/react-arrow@1.0.3(@types/react-dom@18.2.22)(@types/react@18.2.66)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-wSP+pHsB/jQRaL6voubsQ/ZlrGBHHrOjmBnr19hxYgtS0WvAFwZhK2WP/YY5yF9uKECCEEDGxuLxq1NBK51wFA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.24.0 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.22)(@types/react@18.2.66)(react-dom@18.2.0)(react@18.2.0) + '@types/react': 18.2.66 + '@types/react-dom': 18.2.22 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@radix-ui/react-collection@1.0.3(@types/react-dom@18.2.22)(@types/react@18.2.66)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-3SzW+0PW7yBBoQlT8wNcGtaxaD0XSu0uLUFgrtHY08Acx05TaHaOmVLR73c0j/cqpDy53KBMO7s0dx2wmOIDIA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.24.0 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.66)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.66)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.22)(@types/react@18.2.66)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-slot': 1.0.2(@types/react@18.2.66)(react@18.2.0) + '@types/react': 18.2.66 + '@types/react-dom': 18.2.22 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + /@radix-ui/react-compose-refs@1.0.1(@types/react@18.2.66)(react@18.2.0): resolution: {integrity: sha512-fDSBgd44FKHa1FRMU59qBMPFcl2PZE+2nmqunj+BWFyYYjnhIDWL2ItDs3rrbJDQOtzt5nIebLCQc4QRfz6LJw==} peerDependencies: @@ -1682,6 +1886,20 @@ packages: react-remove-scroll: 2.5.5(@types/react@18.2.66)(react@18.2.0) dev: false + /@radix-ui/react-direction@1.0.1(@types/react@18.2.66)(react@18.2.0): + resolution: {integrity: sha512-RXcvnXgyvYvBEOhCBuddKecVkoMiI10Jcm5cTI7abJRAHYfFxeu+FBQs/DvdxSYucxR5mna0dNsL6QFlds5TMA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.24.0 + '@types/react': 18.2.66 + react: 18.2.0 + dev: false + /@radix-ui/react-dismissable-layer@1.0.5(@types/react-dom@18.2.22)(@types/react@18.2.66)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-aJeDjQhywg9LBu2t/At58hCvr7pEm0o2Ke1x33B+MhjNmmZ17sy4KImo0KPLgsnc/zN7GPdce8Cnn0SWvwZO7g==} peerDependencies: @@ -1707,6 +1925,33 @@ packages: react-dom: 18.2.0(react@18.2.0) dev: false + /@radix-ui/react-dropdown-menu@2.0.6(@types/react-dom@18.2.22)(@types/react@18.2.66)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-i6TuFOoWmLWq+M/eCLGd/bQ2HfAX1RJgvrBQ6AQLmzfvsLdefxbWu8G9zczcPFfcSPehz9GcpF6K9QYreFV8hA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.24.0 + '@radix-ui/primitive': 1.0.1 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.66)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.66)(react@18.2.0) + '@radix-ui/react-id': 1.0.1(@types/react@18.2.66)(react@18.2.0) + '@radix-ui/react-menu': 2.0.6(@types/react-dom@18.2.22)(@types/react@18.2.66)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.22)(@types/react@18.2.66)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.66)(react@18.2.0) + '@types/react': 18.2.66 + '@types/react-dom': 18.2.22 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + /@radix-ui/react-focus-guards@1.0.1(@types/react@18.2.66)(react@18.2.0): resolution: {integrity: sha512-Rect2dWbQ8waGzhMavsIbmSVCgYxkXLxxR3ZvCX79JOglzdEy4JXMb98lq4hPxUbLr77nP0UOGf4rcMU+s1pUA==} peerDependencies: @@ -1780,6 +2025,74 @@ packages: react-dom: 18.2.0(react@18.2.0) dev: false + /@radix-ui/react-menu@2.0.6(@types/react-dom@18.2.22)(@types/react@18.2.66)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-BVkFLS+bUC8HcImkRKPSiVumA1VPOOEC5WBMiT+QAVsPzW1FJzI9KnqgGxVDPBcql5xXrHkD3JOVoXWEXD8SYA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.24.0 + '@radix-ui/primitive': 1.0.1 + '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.22)(@types/react@18.2.66)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.66)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.66)(react@18.2.0) + '@radix-ui/react-direction': 1.0.1(@types/react@18.2.66)(react@18.2.0) + '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.2.22)(@types/react@18.2.66)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.2.66)(react@18.2.0) + '@radix-ui/react-focus-scope': 1.0.4(@types/react-dom@18.2.22)(@types/react@18.2.66)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-id': 1.0.1(@types/react@18.2.66)(react@18.2.0) + '@radix-ui/react-popper': 1.1.3(@types/react-dom@18.2.22)(@types/react@18.2.66)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.2.22)(@types/react@18.2.66)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.22)(@types/react@18.2.66)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.22)(@types/react@18.2.66)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-roving-focus': 1.0.4(@types/react-dom@18.2.22)(@types/react@18.2.66)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-slot': 1.0.2(@types/react@18.2.66)(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.66)(react@18.2.0) + '@types/react': 18.2.66 + '@types/react-dom': 18.2.22 + aria-hidden: 1.2.4 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-remove-scroll: 2.5.5(@types/react@18.2.66)(react@18.2.0) + dev: false + + /@radix-ui/react-popper@1.1.3(@types/react-dom@18.2.22)(@types/react@18.2.66)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-cKpopj/5RHZWjrbF2846jBNacjQVwkP068DfmgrNJXpvVWrOvlAmE9xSiy5OqeE+Gi8D9fP+oDhUnPqNMY8/5w==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.24.0 + '@floating-ui/react-dom': 2.0.8(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-arrow': 1.0.3(@types/react-dom@18.2.22)(@types/react@18.2.66)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.66)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.66)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.22)(@types/react@18.2.66)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.66)(react@18.2.0) + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.66)(react@18.2.0) + '@radix-ui/react-use-rect': 1.0.1(@types/react@18.2.66)(react@18.2.0) + '@radix-ui/react-use-size': 1.0.1(@types/react@18.2.66)(react@18.2.0) + '@radix-ui/rect': 1.0.1 + '@types/react': 18.2.66 + '@types/react-dom': 18.2.22 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + /@radix-ui/react-portal@1.0.4(@types/react-dom@18.2.22)(@types/react@18.2.66)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-Qki+C/EuGUVCQTOTD5vzJzJuMUlewbzuKyUy+/iHM2uwGiru9gZeBJtHAPKAEkB5KWGi9mP/CHKcY0wt1aW45Q==} peerDependencies: @@ -1844,6 +2157,35 @@ packages: react-dom: 18.2.0(react@18.2.0) dev: false + /@radix-ui/react-roving-focus@1.0.4(@types/react-dom@18.2.22)(@types/react@18.2.66)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-2mUg5Mgcu001VkGy+FfzZyzbmuUWzgWkj3rvv4yu+mLw03+mTzbxZHvfcGyFp2b8EkQeMkpRQ5FiA2Vr2O6TeQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.24.0 + '@radix-ui/primitive': 1.0.1 + '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.22)(@types/react@18.2.66)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.66)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.66)(react@18.2.0) + '@radix-ui/react-direction': 1.0.1(@types/react@18.2.66)(react@18.2.0) + '@radix-ui/react-id': 1.0.1(@types/react@18.2.66)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.22)(@types/react@18.2.66)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.66)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.66)(react@18.2.0) + '@types/react': 18.2.66 + '@types/react-dom': 18.2.22 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + /@radix-ui/react-slot@1.0.2(@types/react@18.2.66)(react@18.2.0): resolution: {integrity: sha512-YeTpuq4deV+6DusvVUW4ivBgnkHwECUu0BiN43L5UCDFgdhsRUWAghhTF5MbvNTPzmiFOx90asDSUjWuCNapwg==} peerDependencies: @@ -1917,6 +2259,42 @@ packages: react: 18.2.0 dev: false + /@radix-ui/react-use-rect@1.0.1(@types/react@18.2.66)(react@18.2.0): + resolution: {integrity: sha512-Cq5DLuSiuYVKNU8orzJMbl15TXilTnJKUCltMVQg53BQOF1/C5toAaGrowkgksdBQ9H+SRL23g0HDmg9tvmxXw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.24.0 + '@radix-ui/rect': 1.0.1 + '@types/react': 18.2.66 + react: 18.2.0 + dev: false + + /@radix-ui/react-use-size@1.0.1(@types/react@18.2.66)(react@18.2.0): + resolution: {integrity: sha512-ibay+VqrgcaI6veAojjofPATwledXiSmX+C0KrBk/xgpX9rBzPV3OsfwlhQdUOFbh+LKQorLYT+xTXW9V8yd0g==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.24.0 + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.66)(react@18.2.0) + '@types/react': 18.2.66 + react: 18.2.0 + dev: false + + /@radix-ui/rect@1.0.1: + resolution: {integrity: sha512-fyrgCaedtvMg9NK3en0pnOYJdtfwxUcNolezkNPUsoX57X8oQk+NkqcvzHXD2uKNij6GXmWU9NDru2IWjrO4BQ==} + dependencies: + '@babel/runtime': 7.24.0 + dev: false + /@rushstack/eslint-patch@1.7.2: resolution: {integrity: sha512-RbhOOTCNoCrbfkRyoXODZp75MlpiHMgbE5MEBZAnnnLyQNgrigEj4p0lzsMDyc1zVsJDLrivB58tgg3emX0eEA==} dev: true @@ -3043,6 +3421,22 @@ packages: postcss-value-parser: 4.2.0 dev: true + /autoprefixer@10.4.18(postcss@8.4.36): + resolution: {integrity: sha512-1DKbDfsr6KUElM6wg+0zRNkB/Q7WcKYAaK+pzXn+Xqmszm/5Xa9coeNdtP88Vi+dPzZnMjhge8GIV49ZQkDa+g==} + engines: {node: ^10 || ^12 || >=14} + hasBin: true + peerDependencies: + postcss: ^8.1.0 + dependencies: + browserslist: 4.23.0 + caniuse-lite: 1.0.30001597 + fraction.js: 4.3.7 + normalize-range: 0.1.2 + picocolors: 1.0.0 + postcss: 8.4.36 + postcss-value-parser: 4.2.0 + dev: true + /available-typed-arrays@1.0.7: resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} engines: {node: '>= 0.4'} @@ -3558,6 +3952,31 @@ packages: - supports-color dev: true + /eslint-config-next@14.1.4(eslint@8.57.0)(typescript@5.4.2): + resolution: {integrity: sha512-cihIahbhYAWwXJwZkAaRPpUi5t9aOi/HdfWXOjZeUOqNWXHD8X22kd1KG58Dc3MVaRx3HoR/oMGk2ltcrqDn8g==} + peerDependencies: + eslint: ^7.23.0 || ^8.0.0 + typescript: '>=3.3.1' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@next/eslint-plugin-next': 14.1.4 + '@rushstack/eslint-patch': 1.7.2 + '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.4.2) + eslint: 8.57.0 + eslint-import-resolver-node: 0.3.9 + eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0) + eslint-plugin-import: 2.29.1(eslint@8.57.0) + eslint-plugin-jsx-a11y: 6.8.0(eslint@8.57.0) + eslint-plugin-react: 7.34.0(eslint@8.57.0) + eslint-plugin-react-hooks: 4.6.0(eslint@8.57.0) + typescript: 5.4.2 + transitivePeerDependencies: + - eslint-import-resolver-webpack + - supports-color + dev: true + /eslint-config-prettier@9.1.0(eslint@8.57.0): resolution: {integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==} hasBin: true @@ -3606,7 +4025,7 @@ packages: enhanced-resolve: 5.16.0 eslint: 8.57.0 eslint-module-utils: 2.8.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.2.0)(eslint@8.57.0) + eslint-plugin-import: 2.29.1(eslint@8.57.0) fast-glob: 3.3.2 get-tsconfig: 4.7.3 is-core-module: 2.13.1 @@ -3729,6 +4148,34 @@ packages: - supports-color dev: true + /eslint-module-utils@2.8.1(eslint-import-resolver-node@0.3.9)(eslint@8.57.0): + resolution: {integrity: sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: '*' + eslint-import-resolver-node: '*' + eslint-import-resolver-typescript: '*' + eslint-import-resolver-webpack: '*' + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + eslint: + optional: true + eslint-import-resolver-node: + optional: true + eslint-import-resolver-typescript: + optional: true + eslint-import-resolver-webpack: + optional: true + dependencies: + debug: 3.2.7 + eslint: 8.57.0 + eslint-import-resolver-node: 0.3.9 + transitivePeerDependencies: + - supports-color + dev: true + /eslint-plugin-eslint-comments@3.2.0(eslint@8.57.0): resolution: {integrity: sha512-0jkOl0hfojIHHmEHgmNdqv4fmh7300NdpA9FFpF7zaoLvB/QeXOGNLIo86oAveJFrfB1p05kC8hpEMHM8DwWVQ==} engines: {node: '>=6.5.0'} @@ -3775,6 +4222,40 @@ packages: - supports-color dev: true + /eslint-plugin-import@2.29.1(eslint@8.57.0): + resolution: {integrity: sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + dependencies: + array-includes: 3.1.7 + array.prototype.findlastindex: 1.2.4 + array.prototype.flat: 1.3.2 + array.prototype.flatmap: 1.3.2 + debug: 3.2.7 + doctrine: 2.1.0 + eslint: 8.57.0 + eslint-import-resolver-node: 0.3.9 + eslint-module-utils: 2.8.1(eslint-import-resolver-node@0.3.9)(eslint@8.57.0) + hasown: 2.0.2 + is-core-module: 2.13.1 + is-glob: 4.0.3 + minimatch: 3.1.2 + object.fromentries: 2.0.7 + object.groupby: 1.0.2 + object.values: 1.1.7 + semver: 6.3.1 + tsconfig-paths: 3.15.0 + transitivePeerDependencies: + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - supports-color + dev: true + /eslint-plugin-jest@27.9.0(@typescript-eslint/eslint-plugin@6.21.0)(eslint@8.57.0)(typescript@5.4.2): resolution: {integrity: sha512-QIT7FH7fNmd9n4se7FFKHbsLKGQiw885Ds6Y/sxKgCZ6natwCsXdgPOADnYVxN2QrRweF0FZWbJ6S7Rsn7llug==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -4132,6 +4613,25 @@ packages: resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} dev: true + /framer-motion@11.0.24(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-l2iM8NR53qtcujgAqYvGPJJGModPNWEVUaATRDLfnaLvUoFpImovBm0AHalSSsY8tW6knP8mfJTW4WYGbnAe4w==} + peerDependencies: + '@emotion/is-prop-valid': '*' + react: ^18.0.0 + react-dom: ^18.0.0 + peerDependenciesMeta: + '@emotion/is-prop-valid': + optional: true + react: + optional: true + react-dom: + optional: true + dependencies: + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + tslib: 2.6.2 + dev: false + /fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} dev: true @@ -4910,6 +5410,45 @@ packages: - babel-plugin-macros dev: false + /next@14.1.4(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-1WTaXeSrUwlz/XcnhGTY7+8eiaFvdet5z9u3V2jb+Ek1vFo0VhHKSAIJvDWfQpttWjnyw14kBeq28TPq7bTeEQ==} + engines: {node: '>=18.17.0'} + hasBin: true + peerDependencies: + '@opentelemetry/api': ^1.1.0 + react: ^18.2.0 + react-dom: ^18.2.0 + sass: ^1.3.0 + peerDependenciesMeta: + '@opentelemetry/api': + optional: true + sass: + optional: true + dependencies: + '@next/env': 14.1.4 + '@swc/helpers': 0.5.2 + busboy: 1.6.0 + caniuse-lite: 1.0.30001597 + graceful-fs: 4.2.11 + postcss: 8.4.31 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + styled-jsx: 5.1.1(react@18.2.0) + optionalDependencies: + '@next/swc-darwin-arm64': 14.1.4 + '@next/swc-darwin-x64': 14.1.4 + '@next/swc-linux-arm64-gnu': 14.1.4 + '@next/swc-linux-arm64-musl': 14.1.4 + '@next/swc-linux-x64-gnu': 14.1.4 + '@next/swc-linux-x64-musl': 14.1.4 + '@next/swc-win32-arm64-msvc': 14.1.4 + '@next/swc-win32-ia32-msvc': 14.1.4 + '@next/swc-win32-x64-msvc': 14.1.4 + transitivePeerDependencies: + - '@babel/core' + - babel-plugin-macros + dev: false + /node-releases@2.0.14: resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} dev: true @@ -5219,7 +5758,7 @@ packages: dependencies: nanoid: 3.3.7 picocolors: 1.0.0 - source-map-js: 1.0.2 + source-map-js: 1.1.0 dev: false /postcss@8.4.35: @@ -5685,6 +6224,7 @@ packages: /source-map-js@1.0.2: resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} engines: {node: '>=0.10.0'} + dev: true /source-map-js@1.1.0: resolution: {integrity: sha512-9vC2SfsJzlej6MAaMPLu8HiBSHGdRAJ9hVFYN1ibZoNkeanmDmLUcIrj6G9DGL7XMJ54AKg/G75akXl1/izTOw==}