From 6addbdc717a79c11a1a9a66b481ffe9725512f99 Mon Sep 17 00:00:00 2001 From: kirinnee Date: Sat, 28 Dec 2024 23:30:34 +0800 Subject: [PATCH] feat: secrets integration & email list --- .envrc | 1 + .infisical.json | 5 ++ Taskfile.yaml | 1 + bun.lockb | Bin 206075 -> 219158 bytes nix/packages.nix | 2 +- package.json | 5 ++ scripts/local/secrets.sh | 18 ++++ src/actions/index.ts | 35 ++++++++ src/components/index/Hero.astro | 4 +- src/components/index/Waitlist.astro | 90 +++++++++++++++++++ src/components/ui/alert-dialog.tsx | 104 ++++++++++++++++++++++ src/components/ui/confetti.tsx | 130 ++++++++++++++++++++++++++++ src/components/ui/sonner.tsx | 27 ++++++ src/env.d.ts | 3 + src/layouts/Layout.astro | 2 + 15 files changed, 424 insertions(+), 3 deletions(-) create mode 100644 .infisical.json create mode 100755 scripts/local/secrets.sh create mode 100644 src/actions/index.ts create mode 100644 src/components/index/Waitlist.astro create mode 100644 src/components/ui/alert-dialog.tsx create mode 100644 src/components/ui/confetti.tsx create mode 100644 src/components/ui/sonner.tsx create mode 100644 src/env.d.ts diff --git a/.envrc b/.envrc index 97a3fa9..44cf712 100755 --- a/.envrc +++ b/.envrc @@ -1,3 +1,4 @@ watch_file "./nix/env.nix" "./nix/fmt.nix" "./nix/packages.nix" "./nix/shells.nix" "./nix/pre-commit.nix" "./flake.nix" "./parse.nix" use flake PATH_add node_modules/.bin +pls setup diff --git a/.infisical.json b/.infisical.json new file mode 100644 index 0000000..b616a11 --- /dev/null +++ b/.infisical.json @@ -0,0 +1,5 @@ +{ + "workspaceId": "e3939ee2-8192-4d9d-b2dc-f342b4c8afd2", + "defaultEnvironment": "lapras", + "gitBranchToEnvironmentMapping": null +} diff --git a/Taskfile.yaml b/Taskfile.yaml index 6a512d8..769616a 100644 --- a/Taskfile.yaml +++ b/Taskfile.yaml @@ -5,6 +5,7 @@ tasks: desc: Setup the project for development cmds: - bun install + - ./scripts/local/secrets.sh build: desc: Build the project cmds: diff --git a/bun.lockb b/bun.lockb index 964fcccb768be121ccbc9d631dbcfdbc8a719f5c..526e5094075fa55820dbc3550fe96bd50e6f6ffd 100755 GIT binary patch delta 44845 zcmeEvcU)9g+wIJe5e7v;Q9-eb9R#E)Fj%kvHf-1x5EZ2fs93?S*gfjD*VwzU#u$4d zD2XJoMiW!)U1M)|ty6^Ln)kc)`z!NvvG%j}vwJyZ&T-yk7hSN!Znk@^29CcReLU{u z*y3SN6I+$oYN(hx`m-}dYELTmfH8Q4Apfq{k940>z)7+f5Bb89t&b$7f?)@MGgw1!e+pKGWED^ehz3?-w-=pt6&GMEKL zqk7KZ7T|K=958h+a4B#~Y-&>c&{#u-5*S6;j$l@xFqj1lh)PWwmS`|^!8o#lv0A?G zU^6}@H8nOh#$bq)(Ek*YlTySoI65UN26M|0kLFX~ z1!jg;W!3nBacObPFfP?inNJ6x)98&+sj)+26VpL5f8#enVB{nK14dE)4Rr_az+3xSbEbSzi{k5-(YHtOz8EL8UanXp2iBC-j z8MXrGnat&2PUWc7w3H;wT0`o9sFY-g?ln;eB8q`4fgjdTXG9(tRnGie;|1XIut$K= z;>=zehk((AnRUS|s1%qp?L&2Sk>1w$M=)pJVTCgcnVS*dhzgCzYn%e+YTx0m*0?`x zwmda9VJLejCMiA%WY|_uZTV|3d$5&<>Q@f_ocht&a@>5q4U%TxaaAig*$WkJ4Tpgc zI0Q)$So4VbYL~u)%`WZ=<~B3YTeX|R<`k~4@gyJB|D2DUWvY-d7$zH-?5EZzTH`ig zwlf6G5jx_pX1f8*V*4Q-+c#I!`^FB9Pr}IbjU7BB3Tvb?iYtNmA=n$^V*45}ena|W z7qbmes}-A`7Ms`?BN`nQ2X}+vXhStY^FXx&8-m%Ml-M-*qB22hyKTVKw}4rJ;uf{z zp26mb{tTN_%pMisfJ_Tk8#oNi1{t8U|E4u!JVtcHu(&ktuN4}r6*vXvNbCT!rA0N} zrK#GHCBW>F7fsYnDkMZLpq|EMz)aVvnOfjA_?3bE8U?aPZh%>ln3$v?i5X~F5Jr?! z;fbfp$tiKE2?J9N*I~0Im%wasiI!T0LJfwhuphzZoE`_R1da_;3pflLNiz3>xhNf5 zsXcQ%TphyKVD{7{a7JYWwjjV7%3!wqN*gufgJ8z5(CjH-`VH2&Be*>5zOm6m`Wp;} z1Z-gZOh!Je@Tmy30;^FGw)i{Liaocty*dQNJD~qLS0{H+yLLFZ80-~rU_ox33=u$it0{F&`}G=lXzrtx+#*Q$P0CXHyF0SW=563oC1AQW7Fs#6XzC}*e}U20_hx}cLQ@VgoC-y)&sMGRlv;eO{}`e z)QZ$KWZGyEZ>y<8{77Tv9K|g;VHM^9GkD)$E@4~UDq+4 zilJXzVqdo*$%Z8Z)%e*1<$<;px;4>q`9sV7qQ<#kW^+vA{a{Y0?O--@T7qh?)9fK= zDnCj6VwENClqmmZ+c~2h_9<2}CM78~by%vQ0c<8;rX@>DjY&%E7c(d=E^#ZL}@=k_VrMuyH)iTnc7yC8s1MB&Ves1`koIF(^KEND7Kib{jk-c1WzD z?og$ijLeD%C<)x+;}YW13^!r3UH#&t($eB$4Y8@wL*nB58oCcx=V>!A*GWB%oi#3` z@dHe*Qi#6{=6w2E<6Rmr*EmaI?0G{qAzI@$8V7(mZ)$2>N@GdmN5jg0#PwZDT&ZoBFK=E6d#X?Wf(WvV8F0u_R=^2jLkD6(-{E{ z;;TvO9&#DXt>B=>OEn$?<{3pFjhkrf3N8=bM&o-E)xG7c#=A9M1m+~k0CSJ%2X^Lh zM;~OpPxZdn2T|{1eK4=jR40KxHfLdT(DgCU2V0*k`k?ERNS{2)m}VfMIvWg``rzr4 zLZ4mwpzE_spDg;U(f%i>^_(RU?=cc&6!BR-^xUgzWU0S|F}UqT-|a#L63 zTKL^s)qb>2jsF?U3Z7Z77Q7eCim%joFXDMXoCs#Yo}1K)p8|6-@6AAf8R*xL!=vKk z<5JTM`sr#3#B(*w+@iMp;6}A2m%%)6Oxdb-aSm*D{Xq4?%CJTA<3&nTe5&CcY!1m? zFw0vG=8$Fdk4;P+o)}{oh)W0`v@#eGWf3tOHLea$N{^3A#6J7wPPOHmz|3GSm_s%S z%ofLj+4b$fEGP)fA*l;?03&NH^N{{cO$gw#A{N0h^w|$6rE#Y^_df!2pw%`2JH@c&Y)0{Zw{OcHxnyBHqn)U9k6DXyeF@5rboz6@NbY!p4ffAM)PZ z;Pvb31D*{Y(cCcMhJB^^)(+D8Ju!`r7yEYO>d*Qne|<2$#7{%kgnT&VGa+ii@$mI2 zy-P1I7N0jI?BLurHWekQf>E}uY%xxiLn{Xx*T_>V2TK(T$vKdcWpkBa<2pGMf1k-y zs{~8IR&q`ii*bl-t{QCoTn@!wMBr~*IU9eE%jRmq<}!s12Auw77LpyR`oVW9w9lbg zpjpcfRs75bYlERVEJ==V^)q&mLtTSS^P&06xr+j=5b%=i>IK@^AfS6m;Wlzub&GMU zJhghT@s^xjJy@z_mThZT%yDKtH-~C|=0mVTkjf~}>Edr=iwk!ch2%Na{fu2?bIoA$ zVokG=^IZMRy|7m3Va=+T*T4#dRakZy;cufECV5VRzph59I7R!ID>T*|si6B(!d@c^l5#n3a`0$Ko$%*9|s~l+A9z#$V-7w_tO9tbs7Z z7GiSqXjtrOqa0D!&-krub`LfOVO8~0HCI2=8d!m{UF87dFLE|wt6?p9BUX~<%=Nc{ z!Il`6%+|x|46CqW6>-#i8Xals3d>vRnHic6uR4ClJb9`|u(=c#s+td~VUC2w)}vDB ztyQpCAS#TwbFkXLvf}VaRZGh`o)%+I+3Xc;o`KcRWa#AX{x&c^_OaOs8v>3gnZ@P2 zUj8;PwCpja`(Sw>3WI^dZo+D(W?#q8=XhJpL!H%pF;|e&5m=mP7^V*XHf0M;BV&6x+b7sO9-6OOl((PxI4o8Qa~_F5 zz~X#CAEA{&<>VY+i&4mCzhLue9DW$348LS{k+b|P#_n=9qPDnT*HrRwsNrY63ybpv zV^hb^+z@9b+CbOxGiJ)!{#>Ev2Epdrh;di_JpIgND(Ic#fZpx^%O7!AAXWT~i)3@d zU~?WcHVhL0GqpO737k%9_a(#n=x^FUOV0HSFkeH6WuVgN@?w@64$SOKs~DyygtjS0`$;Y9$zdTD)2MpfUR&1+kiMuV z=Y&|yHs~l05Bir&6PDWBdA@$8`LMdlx!CR=BE-pzVZ(%V^^|R!V?lTt3~eD|yTnXc zg?{V-3tfphV8%f5D4<%sV0HQExfd4KZee8hBzW3xm~2 zo>48poTcg5Ptm(y!SYaQ^Z+5|g`-T0zYXfl?E;NQ#!Fzauhl|-gvE@NCYh@RsROBc z#=~m#G2K2`oGr@H(^M0|ZptBG96~)ldfkP^0a6Z!I8dn@iaJ~?VX@nlX<~W;tDTZV z6BH5(-By`eOJQ*n!m>s8d0=l*8}1P0Zv%s^Ql^RNS6FHl0#G9RU){xISgm2%DSKtT zrt17r=jLcwXfekI{eJ*fFC`tVu2>nYo?7+If3e=dQcK{D9*4sZXNBr{02Wt20S*DH%sSW%LA*~T8=OQd*htwPnmlo=-h!L#gCq=f9vpQSMGa;gG73m4?j))2<#mEm6rRucp5Zj6RCNw!DKi02b=h#or3uiQNNLI*w45lD2iYeqKR$ zcl0X9P@NN5usVLs>gSJf^lXTp9r!WsGgzH<%k&zSvV)jjV)^!wbGruGpkwmgkHN~X zV-*K2KZZ{{pz`2hfW4V8f0~DeFIBv z568|E)mLjd2VEn>O8Mw%id07cb7YXe4UF`UQP*LqB}KIGx52bh^I(p}y6Q8FRy-`# zkxO9*EVcI-XWvclJzD)>^-~JqAl-z;d9BX!uHDr<)fKQ27Q04034Q_#%LR)quf4ww zrU3U{Zu&hVggKW5ek%ZV*?Ef7p#U#ehU#& z2OB5FRy1TgY=-_(dd72V`>H!@53VrKuj#P3j&TMB>o6>Kms&f!zN{VAy}1QK9;#PuKhrQ+ zN;gVd`^sShE#`+18Y#*0y!>rq)hgq>AwIwq0vRXzy%o6$40IUI>kDIKEwGf+NmB?c zv;>FHNeHne2A!}3rD|0zQ# z3kP1z!K#DRrePsA!~q5t*AYe)C+BluaWbhnoP^~i&!`<>eu0qIWSqDJU`Ju+APvTN zFf6qtIDeBir^sQ$EapEUGF!|_6j?X*Vdpu((O6r?dNDc_}mQw&rD{96o)9sL(I5*qh0l%s@lGXt$g>5<(&hE{(J-T4^u8m;?{K&UxO zw^9NutMC{~47K_gnu}0~qMiR3Dx0Bey*`F`|1U(&9TRAS0J}li&P*A!U4r+~6EewB(pSdS2t_^HyetzaznxziLV_2LT>WN&P zacZ8{%K2gjENqcg1I*tc6bvt%YW2X;X1qEs%7TTDCT467(zXj*oxEi(5R20O9*vWV!fy9p;-uZm1j&1 zv{D18N#hxcgwSGyB9#P>5$dFbn$I*CIxr+Hnki>ZvzXpMz_?EfFa^(2W(7hM5yA{a zC>J3$)?qd^yBUF22w=)0axFrbMhM+S2$L5fpE-Jh;Rv;qTh9!%LI9^|(*v#M>e+Te z2rFWiBB_}@grsKXBkOLX5yIV!nSn-G&YBr)HBT?O6GE!<5`@%}uOrk_&P4_1>u$pl zQmcS~(hRd{fjW%XJ#k6z1FH$f9hdF6$p(Xyprmq8-3iN=_XO;2BGekX(ZK8Nqm_8Q zEqM#sR<@X?2<)`7og833j!<)YDTk;I3)M3iTK-lvl>M*EBK6>|oNbskz(Uo zqw?zdnI^!p$TP4~jv<8O73#{oS}j-4s8nkcEcM9G!?W`W^}I}t8xAW>Nyi!;hsDlQ z<4h~nQ%|-1U14=r;-_NYPwbq zTVOHITdN)^vFlXF{i}6y4&utJmu-bb>b71E1O2{U&H{ODkaIwp8)Vys7E|s9oDcIb zWA3_9%^i1yWj|BHsI8p4JkaWMgCSgz z79i9@30*~~DMM1F-E!7Si`09!oC8|3Tee+gk#6sn!$7t7$XTlzI+rmhU!oYeIGupf zfIDC<+pR7WQ3xRny%O6%V+?@u`4ksMOd~Z~VF}?TnoTYw&sbe1iURsi$+ZOye8}_; zrGZaDX5FxC6#sBW;zOoCHWuYWX6YS(Lh}996&q9T#y|LwnM-$#dw}^NvyHt0#`gjE z=>rs!Td%1o_gG^i$FH%8U|9nIem=#_Wsnm4S7xs9069U6Crk37HD#1s2g73OG%fa1 zY=yXVExsVLRwFc>Y$dn;tYQWQ<&Vbn8cPu$GV3x<0B)48$CW99CG9@|oEoHuJ2J`cun8jfSQ9k5A;1`_&p@>gGW^-+!lZ$G8cA6iV!D5Hmq@psw(vYd4L%gPBin_CFn>HI41kj_4Z$DglMXHd9#2tYrk|+U1=$QeV#$!XF3laWH%0 z8%;l@aW zL-rEPjNgFSwN|JFD^i$$H0Go%2Ae%l60FQWM@`_H1k9)+n2t5TY+)TRC!3dM`+}K4 z0GJ;#3$|!_Q;l1KnZ6a6A2R*gg6+UPz!}Uq1_8FDFPI-PD>4vFDPH458u*Zz(O`|! zwD_S~Jem0o(`+*H8?D&|xU5pcv0B7mSkB#4MycLZEtbq|voxNj>HjCpe5PyZ$+Tx^ zb^)%fv~#xRFbB*Iov%3-WJx}`xrY39vyHN&E`bM~mT8`37O`C86&kP9;tMkUR%!Zw zV!Eu+{K#ctACfqu)qqm4;|omukc)%Mf=hwxX}Zc7|Gx_V%{J#> z!3sFTZmHGqzk`+e|KCv%ha?mYBZp}X1gq*{NgE`qogZUvdn5pR#G@VSpDPUG)Y9W-*xas)A3d{s^@1LjH3p9Hv82=0_@P`Gi z1Ji#4m`Bf@VEi-e<{yn2zZW(ud=SiZ$F%s5oKZkv&Ax_BDO=M&#mwj|;#tx2nje`3 z{RC#qu4v5H@>r2yH2xLL)$j;R|BPn{@KcbP!E;S7$gJRN=*;jfm=!4mk*Z>=n*5^!JMaTQ<{$FE zw+NJ7^xsSCLcLaqIT=| zjpf{%PV$VK;l?ES(#=SD$}KxN=vH`Zel4zltm=CEZWuqcOtbz6y504xT4Za~nvm?; zZ$dYY>$Uv*fN}2YLtkeFHvQJztnce?<%e|iww-;v!mD$sMOUBye9_zc!L#PbZnvG} z`M1K2sq(M4BIR4R?c`>+!|_hyoZFG|!aH{IGg!mq#&;s+mUr#swRgh14%Z6@TWyK_ zA);ixMGEFRM; z_DhGGYi2#XTIg=u+&j;e3%2*g--AcUkMBg{MZM6wk;YN-D*PQSzrx=!a>TtzV}`sD ze=}v{{Yc|jx$FH%dH(}D`Oy7v<9ONpAksKNj>6xG@&WvvBs)BeG)|V|@OO%Q6o046 z&W|FES@K}~ohE1F?{vBH<4EHSc{u*gl=JX+mR#!zdiklHJmX2YagKZmmj9pV^QYl> zN^I&=^bV~1u;$AR{zUIQvy+$o8IG6IZo_K%+)i%&EF5o$EqWFyzl8M;))G1Nd8EAI zg`K?hdAM5ZLS{&l!-XIz6#8xAOL*f;ME`=cUlpq`y z8zl%fRuJq8K{zV97J{&!!XXOBh1m+i0271+D+njW0SZoqA(S^k_(sH;Ae^F*OCei0 z7lx2-4PkU)2&Y9hg_<@H+^iwwis9A}E>gHk;X6^w2Er6Ggc&vv^28+y{PRVPO#n%WNTB5Vt9`EDE7@5eS#Wq9PDpQg}z*I|#psjdl=hibJp~2H{uHwHSo`6b@1NU6_kQ7+?<}p*V!=;s6CF2MFcu zA>0&k_7F}{$fa;wI6FW{F9Bh+1BAOGn?lW!5Zp>YxG#p6fN+t*RSFM9t&$L?I6|0F z62fC~iGqJA2tkezo{FiC5N=VpPvMzpPzu7r(h!!Fg78AzrqHqsgw~}Yyb_B_LwHHy z9fda{v7m)Vk{)g zW#KZQ9E60j5KQ6#1t%8><;y{^7IEbuoT89R!7Q9zAf%UvFxmw|5s^)yW(5dt1!otcBmQ{jK zM%<>*vI>OOl_5BbMU^4Er0|YHIT2a~!iK64wpM{qUc92vr5c2uRUuRq8>>RFafM)4 z4MJtnwHk!|6b@0SD$K4B22_WT;0nQ29H8J-148-g5Ne3H>JUy*$fZzAIM;xXUK7IT z8W8G;Yzj4NL2#=H!A%UW3E?7zs}$;qTD2fdsSRO9EeM|C5(WP{5Q1t$s4u40hH#6* zeF{FJK^+JS>q1yo2ZEotO`)Y5gw}N-G!TpGLU>8x9fbf9>IPwhJA|!n5Q4-j3SH_! z=;;n2SZs8MVB-P7t{#NOqH8?}`zaiv&{UW`APn$?kl+EKnK(ef$qPbxPY5kUoF{}+ z6mltq3TH0}>GdIu_JR;DvMJQ`hTv8oLTfR+K7@-Du2N_#YI#GL;sarZH-rdriGsf` zgdiUX9mG^02)8KQr_f0>@P)9@55h8E2$AA8g_iyhTKhrhDi--ccuCKZQdSVuU#W!hk>s2>}pd#Q_RV zK@iFZLg+8z0wJ8DkV_#>I0r#Uw?G&j1YwZKhG2{r_awP_h_H z8Z0i6QiNwCP^y?pN)x}5hKL4@K|{qH(lBwGlr9=K0Sy<6NF&5!(nt~76f{b#B8?WW zNMl4q2q;5rBxMR?GtgMkl{8N5B#js5=Aa28iZoFi012m-Y-kHKW3q^A!G==Er7%@E zw`4;@+0d2{rip9{HNzmdg+iDihKEA9NZ~4lS)x`LgelxJW`seQBQ8TZYv{eizZ4-HEtb_IPYR*?>gSER2*L^sf3v5|B{7`uaxims$%Vkhai zF!unR5K*L);sEJu;m{NGjfew@Q@zk_xjoTs*}}OOg!JAJM)!hnT4YnG*~e(tYJkI< zcjt<1t2O6b@+J4YLp6#F#Jm#I^Ftr``5uI#On2@_!gPKW*Hw@2yY0IkoAJ z%Y$Bd#JPSR8_@A9)46iOE!yamu_Jjwn=8q_qfcLb{C0!&%`!ulL@Zs}{p$DiyS(sj z_q2!8=Z`ECuZR3_`skilQ6U2>E&I|n!gauFzrN|cwoM*d`39e3G#b=1?H>x(uKiah zBHMd3>a%M=kzIC9GwT)$t=xRD{jS*Qy{E^2_uSjf7-RjQ`QF>k;iHXH4WV1RJ=l55 zac+&Qxoa;Ly<^PY(sHG^%IejQnGsx}_wr5`U2VtR?Q0QI1*y&cW8YorP;A4(Y3o|l zcd%@z5xt>(*u_K7hyI@Dvghi-H)*}c)*h2<{rjdl=bQ5(M7?_F3RbVw&E&jwNpoG+ zuYB%WXujBTB-1NteQ5u#`!=S!7W-B{@kP_?@fD(OJ2#8F+Ns1S(|zZ}7T=}L&FhnK zpx2idl3Pq`CT7H-dO4z>Yug{+`mb5KDVS_lvW?2Q-(E&}R-pkv$=k>2QyK(=9M_o=u z_L*?kKGCbsUWsaOT%^f}9*I5lb3mrOF=(~vI z+O-Zg9{wOjxAUA+`D;O zmS%J)U1P`MR%0D<>U0v-Je_aV+j8J!F$x5zWEA!@(W8QeZdVQsI^9y^b4DI(Yw1PaU^|+mL zrRH7t|JKhT`f%yx-M={FJbcN>Moqr%xOZWv$E|j(`aNk!weM4{M&6&FAzJrC^)8$^ zxjonIk7j-9T^SN?%;+5?c?50Y%CJ%ZXdiP z!#cRh!j}zB%8gDNN))KxF9mz=Wrq{rf4=Nn*ST9Vy6ttbIal7=uJieMEqlJ~I3}*r zAHQ9nw5ZDH{>$q+51HSz(ep-GDN(MYDz?3|e%8;27S<_w+4{y!@s8E=IW=cfshee| z{Mz3s%p5ex0gk7EazXbNUaP){X0y(dD}1*yrwV`bfPOCU=`*-oAg5 zWq<7OSU&=RX)b)vnMa@cs1#9%5^MRPTpw)z8d!YEkNHxujo5 ze%N{XX5gSxQuby03srY6i|Nt4>|Il0=U0yApQ3EfRiF9f{EKcA>+WwAuyEngHT9on z*`J(Vp!a?+SiQAXJjU#PHfXcWN{_=+no{Cy?1_zz59|KC{lnKy&bN;oyJY_NFZvXy z-pzv5YiIS@3;(ZD4!-MlA?xiq|Gpo$Uef<=ZDGZx4GV4xxHt1`d|EcD>YxhwXtldIm*7xGSbc@vuDz z!hH(&MT2M_a49T{hVW3_rZ6QQLhBd^kHw-G2>uBW-cfieLi<9vMPX}S2+zbT3JVh< z^o)h@LTrr1S;R|W><4-!x{_XtouoIy+#mE-M3LT!1ElxDVF2iZhyw|m6l9b;fY+;% zC>zJ?RVt(7pcIls4iw2s5>*C*O_CTvE-Z=f$<~snJqTf*mBWm|Q{JRy_q`u(+$M>Y z(~NB~B=%`Ihe4IP}pJ3(r2mOC~6-Q>^%oABp*HcULd+ZxC&1hT5bUg)+ys@7B#kD0y zE7KjkWmHNa+r#udGRtTq^&6I7ZRX&k|G%1X6O`xsGWh_S{(o$)g@%_F6ixsCHml$P zpyI4*2CMqlOx3osa+!#;?Ymn2ANaCXvy+=Za=D^O1zV>7ABi7Zwvri-8iRgOdQ<$m z$T-$U`G4IFcH6|yi;P(&KFn>ajL3o+Myq{G7aK3ee7dKL7;OhQvr%~3w4508-e}1% zy#JtnD5`gD@md1DODJeF$w^f*yij%y_36GGP2*by+(h^&-LIPV3IfydxhOvM%@5x? zpdTM$YA4CYH4 ztpUdIl?bNgiyv(Oeky5xd~CIyqToN%)cp9?(ZKeaSQR2Gi?1C%K9FBsbL8{OtPC^e z`xY#OZ(?->m`P1dV~=&xv|5^$&KBWQshTKema5D@A+^e2Wtfg-F>mI@FHQKYWhtOE zPzG=UoPn}HIe=d=dx3qxet^&Ewg)-@9f3{&pY06=wjl4Vz;<81;QdRNDD77;Ef{1Iv%}T16u@=E~z0`MCdY&pt{iZQVJ z0_?+Ti_k=9{2!oRE>ZH@NFHwx5A%l=m+!%1^{t@FXH@+n6%Ge zJO^HgW`(4Hj5`S41?~a&fd{}t;1Tc`cmnXz;F}!$-Z>Lki7;L=X>XW`03R{o8!XjONmpPJ!jpk108e8}0**i_ zpfpexC_QjUj$7A z1^{uuK)@ZqafbiX0{ZUc7;VUFBI;2v-vcmQy( z;8VyK!Iyx`KqH`usAZDsh;}wowT$DiPXH%@&A=9b4~g@M^i*I7Fcje14Ay`Rz&9L* zqo0xhZ?wN15COCYIshF3zHo95m;=bbJYYH+FatP(@KN9xUz<6Bz)9e1;1rMzjD^!8 z@Km5Rz<0f#0)GPB(U$_tfQ10xcuNKb1AI@g6;KcG0Bis=z&9-yBhNuV3=j)61OhlW z_$Fu&U;%;wAHWyz1Ky#fd?1_;hrdAhDex!2r`yK@d|tmR{CWc;P{>GN6fhd#K`av( z3ycE>qai6kD!>;U7l7w*Zq5YwV$d1jTVNdQ#o!2_0}u&x1L^{9fICnR@Blo4!hkhk z1DF9@pa@VDScQVt0G|PCfpx%oU;{7}$jHKOYk&>fX20*(jw19-S- z1%v{PfX0A7z{l>#!*2pG6a@=lHuUkp5`>om&4CtxKkyEI_$n3chr#1VHJ~iOW77^q z?gG99jsP)0GoUEI;}DNKJj{dvO@O9A2*CHfLV@q#cNX{_;2k912YCbx0OEjX_%;Wc zakEW;z!$@cpapylY6>F8fcZw#0)&4TgKea$8GeZN2O0nkfdC*72m&lXFwhui3WNa7 zfaX98fCp$EkH;W8zOe8Zh(x#xz_-~tgL%x20HOdrj(P_GhsBD@agZ;vQDj1LJN6nr zKYA<2LJo@3i4KstX!vp^Z}720_(tX#AP2|>M!=U}kaG(f2Jo4+~NR_i_^eddz^(+fH??H z2G;~8adz+pTn>;OFbEg`!~%VQ-as#)KEMv)^yTX3;tB;gQ(A&s0L=l;ATPiZ;O@X( z!VRbkT!e2OaBW}-!nMFvjD7}Xk9UE=y`RT`MTlGoEC9HH&jna(&UG$i?r+n@o}yAy zVQ(inW{ibB4j2#20@!=i0U6-YeIB466!czUV|PQh1wR8{0e%850j%iP04sSM_#9Xb ztO8a5O95_m%K`XgC;|LeCrSiGhRG{6W=6EP13Q5Yz&e1#vj$+?XBsn1ji)m7r_D55 zfXx8YYyvg{j9bg~O~)O;Hh@lB0X^|9guet10Bo^dnf(Ye<9)zhU=P5|4+38R^kbNX zkiP;B0n9`9QNr9`4;P4F0%mX&I07(JYQ!->uh>b1PiQ)Oj5_fRz>Iaj3kb7u=Yey; z89;AjHo_UF@aHs;12EA_;75S1`wsXP$OYIUy)xe;oCloM@B^4>FKfIK%z{`ErdbJG z1?Wd@CBOz<Q0oMTLbsM+^(EmDc z6JR=4nEBoS*swomup@7YTn5iCLF#H($Q(&bABbMT8gt-)-19~^VC=h0szXDzY>~U5!gWb)s zj;2rQ5cmuF2_1@CESg+ha>3YwyFm}D}PaSD86hY67W5=;!*Riz> z>j^l4tWmMTfC(rB@c*q~3s(ZnkUj-%E5sMn3WimG^gk1@z?HxSfDtxG$O^0k%m^<7 zbLZL)@N8qP7G{_J2y6g~Lf4lVH>iTEh8qrhnCW)_EMqgUmE*5R@_VHc0G*t{B>@M( z9-z*!9#7`!KeaM|6TnLWhIu(a=)T_|Kjy`J=wA`w5f)&;OaW1Hd@;L0@nb&FBXkUN%c!`2x4Jw z1#ba18^wrHQWNtx2!9Qn6emkb-7|6!JPmvcB*FbGm^Ecs=Nr(d-voXDz6ZVo7|#!V z6M;`@1=Ie4G`|DC0lxy*cy9DF0(yp55dI1H5m2+v&-^m9ivUkOE`ZNzJ}msart6iV zPr>k|0={}4YCKjJov#*f&=a!7zi7Iyv6Xt5mHt$`uIar=KRtgv?Z6o6oMlse9umiNT8Orq?ulWiAyau!a zc-_bAKO^u4iJ9mMzA|FG+}Q!jX$i{?dzl??dbp+|V(PnlyLE0gu+(xo{RR!>p8n zhkAzH{#q%LZNe=9ky1|ba^X!6R@WoxyG3)#jP_wee9*rh_z_oe1bO&`z=Kt2`|9|f zFRh{%!^0c>g5zGKmbUBWs(0)r4*e1_zV2SkJyzJcpk|lF;Gt4!E4V%uLtIet*J2~| za=aD5`Ew^CW@Ni*HOC;K2g+=K{Z=@XN6W5?I;1ez+zXw} zI%JBi@GPhQxNk-2w_Xts9wZ}24j#sJuK1N%Efa6(r~k_ErlRNHe`tEn8-8djtK3`E zs{p@&BD8|k+C~4d;YOu?S=jKf&1m?cVf1TmEp}CqLd;nhUsFqf38DYaaAd@ft$RMn{x!eI09(3v(-zU{yS+22_(j6RwAH~>; zlC#STTjhI$%$Ki64mj3j-df3c4GPXKGOde<$)b#vmvhmxZEyCG^FQBD^2^O#l7k z@>PDVdc<7i0CK>5W?%dw2Ep&29MJYyu>uZ0`Y$DKN%Gts{~%^La;UH7p#N5K^x$ei zjfxcaM-2NJNjHf5%v=9a(>t#-~i?x+;bu0h{au8gU!^?-~1>&)GZOMhzqVg+Xa zYl)mR4`2Pa^X~QS*6C{Ckq~$^z;wkVx`wV}?{)p!xBZ>4SN9Nu3C=>i?8R5;-*PSN zl`j)AUpd4MdheaP2p-r8-90@F(c&?xVayRls$iu4$pAzlV=iZ0cv!kAC4%j!eEmZswFO{hFO(lZ? z|1$r2DCpSF-l)e^sVu&%A%z59sH}XW^a)Qr=I;j@dt>7&Y8vs@Q!4AS6&6Q&X|YLLH6_oUS-1D?tAd(Uxlyw_U7Q*cvfN$W@~rYkc)z z8(k1m_I+rB-8pdZzyZ(G-=O~<>95z9jel^=f2NYDGCmipiKQskMgIlU1$)ES*!Z1z zp`@*kN#^~inm7v&U;UR$1jB38+&skTgQVh#^so+2y{p8=Uvq;`Gfc1HZ3>bv4;n1idA^W zRV33x|0(RkW2}YGwiL{99QQarhH}-#XYNuzseg4*v>rV5AK|`swAA|v7YF=d1<(4d zhGBel(Fh*C`po+vtqizjh?}6O)UnGCn|$5XS?6H{+X2#1F38mBWj2pp2%JQmGib%<;o`%ITodQU?>fr*AS!N zA?4K&TTqIN{yXVS_rAHB_vMPze9vMv#WmJL|7G<)9oswI>v*tDzQ;euXlegL?ppbh zR-gY+W4%rP-0B_f;tx;B%jcgDt@@9we_>knnN{}sotRTN`Qq%~Ai}+{E9$?#Ztd9H zapdhL+u^|DA?8#o50U95EtXDt3KuRD{Wq)Kj%@g8Z5huvWqK-ynM(avv@yhI|>x=cnsJlC5#@$Cr_*A9m)C}#A`-s6_V!q3lD!Zd4s?53`S<1jWO4s4_UKD>1bt2Xn9IU{KXh}eoUz~ zP2~7X-qO*A3mQmX`tJI%a{U@eZ6wpT}v-21)v?exFtw*4k+NHcbn#1`&p1W8LWO^c&u9E2|whwuee2d@+5Ow zpCga|ynKCxc;qKl(_5gk%g^xQf^exa!gI%)IU|r>J15b5QY+DS819Ymbo^>+`jPFm zEI2{ePn)M9h9~#e-`$LSTJ0DY70=BIOh|14e(YmC?`e%hNDx}5+ge#-QxLj98$#(u zBXJFLOnTi&ob7-iE!tRJUHzl&qtDzNaS+9MsweP&AJPhqMKt~&dzT$Z;e-ly8)U5J zYkIsMGrPZ zZ;l);9<@PLwuFo1mSDYSkB18n_UNT>k=Y8f;GgTDkAdE(*WscPbJWMuv6YB#0b8$u z*2!mEqm%Vg{u=i;*NOuZ!?+lV$8beF+x)T`sDh96o4UHCaSzYp{_PH7{S z(sKnoIY0*n)-IlD7{`lqZGiM5wEDRmgeT7JGf%HD?eAS|=81gID{Vvtw(jq(|8%QA zcJJRBtk+C0_kSx|C|&svNk1)%>7lsTI2EB@7&J@iSaDsKfN_$sHjcmi=#yV#mpSd# zYh<6h3s#Rf@f)wNwQKkl?S*|9=ZSj6m-e<7Az_$bdJe@qh`JFtlzeJU`3~=(X1l&t zxt=@Ebyd%em7Q!dVoIXJOTQZDSg}#DA}CP1g4Nca?>`U8Kd(FOP$A}p7g*r>(Ry4* z^+N1u;c;129q%m3ALC6O#d|Dy-yC@0j68F{qs!JZWj8d-_jrhy@`%~du-f6WXD{~4 zk15(owBq`4>!kj6_v(``t1eDyQZL^_TVeXhA^WJBYsC^_8H{JYCn*YuV|0ZmlljNLzGn%P#7&4Sf22$eop5xQV4N#@>kG zGPNz-Z)@AzZ;#~1jO-$cwL|C5f(N_5Smu~s+kffBdy(2g)~2669mSP)QaPix+kYai ztV=K4#OB=~^ZaKe0v3gTkF2zru2=YP$)tbK#g+(6vcE^_oue%e;oe^Ib~)2cy}uMx zci71_?+z9yQ}0849X9K(o)pYnwX4&+(cg7K?X*L`K8yePoKrvOU+*r;b|`RA)DLj# zG1y5`&nTT-ynCoi(0WO(*P6)*!%>#MdYYk~8Av#c-eFFEKT4}-iutD*+L?uD*&aRe z_mc+AS#<1#$dH~Qxf6C1wXUTqdgJ@ip6VIXowX}{xBO%&BjF0q%bVBYaXrOXbROSR zT#Ljkm;+DT(8{!18h(7Wb)`Z1o_e;L=iiGlAv4|Or(R+vUx?6L#Sy*@;n7=Mp=jwX zo_ChKeC6Ki*A(~0oZa3t@AU*_zG0f+o6&!a(F-Whv}ujh8&u<+`=80F(Yq|N(e7Jo zP5Tc`(wj0SN@RA$J<3wpn0R7&EThe@NxvNIrBq3|26`skx=3}TX;GqE7io%ADMqwH z0`azsRMxjvjGF4+hXrN-Tx)57RJ=SxL-hA3n$78ZaCoX8PhNOsjTkKhmp8HM*9&z< ztzKQeTXYSjMCIm$RwtJx{nfQ}{0sZ5weQ}+(CK-!>o0b9#hKzN&0|T}uWdGF_WuGN z+P&AO{e{#Gr)cl{i+1FYII+ANZaaPu`?}$d=(-eV8*OhK3B_LY>>`yB-*%T0@ftO5>z68wyKV-jMA4;( z)XJq+qIyniTVqta+fM7AII=BR5BSzDQ5@-k4Xh13coph$bpDR8d5*{FQ6D$UJPdsh z!*8_`CXYA#5w?2)V!UxX32BoOMX{ckx|86+!`%-PmUrE7H}DbD;*uLzqKgtmlb-0Q zYV)%{Nn?jy* zLk5pccQjgp(9M4C9)**{&qyoTCyAFRMRHCOb$fxUCW$^|w0<7BK{8&imTF5)lEt6B zq=r(vWZ}_Uy2bdieb769?^2Yl4ad?{Vd2+6-iD2-Vrd_=)dtrtoT+urtx3rnw5x|Q zE3jSTo8MG%mL9fg%A*6BH` zy)R+dFifn3hwm4|)ZvUf5V*m+aKa7VbHdF>A3PnV#oSzw_GDG?^Mm;@KMxZRnD&w8 z;oIuW-c@sVkI46s($#_XXtKEXzQV<&{FqYdA}|^?tEqWRvDz}Aw?o79e2;*1kqi&t zHt=vn-A`G!6U}cW9Lx8J)?%DqzxHgO;~SeFGc;X%#k5(P$4}$?HTPU_`Dnh!axJEI ziJJ9|(|%u-AG0f66pca6zScbCfO}O3&R9Gp-{W$+Xao=62k^k?W-c%1@x>3fW4h&g z6dI0iq!H8Ja<-03d587+G0wxqOs1`;d2DVT*E1!!#?pL`W?D>qpVc4E&pCi^$n=ru zK3rUhk!stv%T(U#$kYyTE*oKU!bep5W^U_#spT-b>bJT0PDh0F#e~)mhUyKXQeu6W zRNm$2Sam`jY;ZUvYVg6@NXBD7rp@WG;u?~b`w<@eHrO+8(R(R(og&e=LK@~pn6&LSBBWln%@t&Fgb6TbP+LwM~9p6t-t2w7$w;9#<1T}CpUYj7U z^~1t9PZTcw(SM~Tigx{RD-c`#J=*;yib?}8iWw8tO=(>Cia~cb+P1PXqU8-({Y8ku zmqeKd9ZQ$!Icw3l{FvPnMIzIlg$K{`&U+pFFyl$2G2i2!7E}DUJkPpsPruENv6&>k zL|PZuN$MG3`4Mf6*GHYp%=c(ANjzfiec(|6xp(~e@T$pwjxC$-F-D8I(b(1IS<{dc z`7ui;2}>N(9)w3lr2X90s;9@Ti6!$rE^9Fniyu5_v@-8~e$1;$Vmi{gI8RnLvuU&5 zE!|hu;ZD9sz+`cRx%YwxzJbZ?nLW5!NZ9D_^F79CF>}YdbR9GFS{7)BBJC&l z0_6*UPp&v6COTd8Kw6hiu2#iEN*A-4yR)|P?8=1PUcPPUH_FOWJcep}!7;;w7S(S{ zjq+o@7$$yZ+E4B@O4?FL%Y)tOjbjEruyI9uv7VKfdc#HCL8w`Glv@TKd8_QppQw4e zZNA6ybkPSMzMtF^lstB6HH$9&)?B=ztDc-VXpWFi#5A6LO@yPwMR{p8ynH5KU)=AFKJwR)>jf17me&f6|`7w`%i7`lv z|H?+hOZBCZLY#@mqB1XBkf5lo6YwB}>q6yWyUcNdW;NaX0GYiRHQ{*p`jpYNeBP9>gLCs8Y9WT3vi+;=qwH>kR#jtgGHeJ&j5A_yttN0U7|LDaj^>VgH=PI}DryN}Oz0Bm-kV?N7nFh+ zC&bKkU9k6DXyZsV246}1AB|BKa;uKqjL%Z6C%7A4L~12$Ozjqvca<^wwv5}lcFXV4gVH$&)AWP-@``csXe);uWY(Coia9)Y6vqx z$VOsNs8}?aWGb=(f&~!H!7~b;FB~o~l@?@T6%iKKkaFpHh_OiX zu^02n0&sgXZ(ga_;S=yO?1<1+V@h+{k-f#SKtByQOqDb>`2|u4z1AK_#Q`LXd z;099F7>u)Yt|$zz;ut>uzfQX0MPl)PQPKDs+u01d50qXXD1=)On$LU#B#iPm;NLO4 zqF)L%cMENJQw^+}r3m-bK(VN^jcrDQD=X=~KEEJh2r$S&!LjR0Ro2e zh=z(wn;q8jRd|aXnJvNGXSOr$1@I)x;LrE){F(fR$J4oAm^0fPv8Wwi1QuvnJHFKc zRszd=9k3;n@VCA=buCNuRVa?a|Lnk>9`0Hn#dj z+Z2g9*mgO%U?~|OAsk4(Bmz`%Q|jO)AAW$kbPys_6P0O{X5tBF}yN!&D7{0 z%I<7lbb?ByDOZ(Z36HTCXvx4Z&R;NSEV?j<($XdAJ}*8*G~CjGmndi|9;!tZbGLgL zdPs(}S~?^{3fbqyjV@q#$csN*3(r0;?jr3^yg1p7rY7b_dQfNQx57-VgYs62k^LQCxsV8B%qIY3VCWTWAUhW2BBOc{RLPn*|?%Va1s zY{woM>IU^g4iI75zzdp)9$-PD_fdTGwbq}E(-;d9*MUy_1+dUme(?~FS0HNPFMF8R zrp1SL6yd3wkM}B2JD}bTk>T(QFxGs;d;=TvFrLYeXnu>$mmd#qGoC$rGkLqEzHEXy zW{3MGG(o}5Zctt)gVi|4M$$6Sn8ZT3p9(RI=*<prKIMAqqf2bNKk!4uZoCp` z;~N2k>_k0=!`bGhemLs-Xm@nu7Q(#~Fi40??s>k@bue|DALD(1klZCcT=;VF>EDX{ zkjIbUVM4q62=nxTPj}V7`t;Wl6m8Cdn^35v)n7S~a!!z(pEKwD5u9Czrp*Y(@V%|< zQh&N|=`~zkhl&d!%|$4@WLqcMg@sRjopCX%d!{Fn-ReW%G=lSGG}$zD@8?-aCHMp zh|=|KZa{gr*~L1AQ>w)pQSLq3fKDf6vY#)^;%2cg9R2M=j#AZ7o=0EsBsVrD)1N=! zev=^!H|$356a{br!hjY>>J1ARwIyc`qn*tjYU?h1%4Epw&EA7DP`XZUV5aKg)3 zrCCmwR3jR({zoqri<2t_n$`T6wAZ- zX(+52N>QejAjvh7Eb|pMk+bpjqD!wyrNio$xhgmB66DY@+3Ij=)_Nq>Pm-X=b~;=N zZwu;miLz+7Y7BhzZdoLwQz3tTMYWR^UJ-eh#BAc%IRze}uftQ9%gO7N-`1(&{y z;yk=n;YL9;e~jwo$T>8h#4iLhu7Y>5Zds`Z@5qw9$|fofJJpQ0*(!MJGa#jsv}H*U zt-Px|55{m#E`D+kN};26Rsaxm2x!ren2BsbR7B9%?hr%{mz+ciNr64040NMA@a6L; zeWqRwmAy4UGmv4Xb75{sLo}!83Rwb%% z9VSZ{Anrt*fr(ollxj4RAP9969f6_T1pi0JJ4Nmpv0iYjv-?BE5qFFRY9fL`n!yw9 j(DEpt`@SC7Ez8y delta 37003 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 diff --git a/nix/packages.nix b/nix/packages.nix index 0ae2db0..20fe3e9 100644 --- a/nix/packages.nix +++ b/nix/packages.nix @@ -8,7 +8,6 @@ let inherit mirrord swagger_typescript_api - infisical sg pls; } @@ -18,6 +17,7 @@ let { helm = kubernetes-helm; inherit + infisical coreutils yq-go gnused diff --git a/package.json b/package.json index b2366ed..0eef4f3 100644 --- a/package.json +++ b/package.json @@ -11,17 +11,22 @@ "dependencies": { "@astrojs/react": "^4.1.2", "@astrojs/tailwind": "^5.1.4", + "@radix-ui/react-alert-dialog": "^1.1.4", "@radix-ui/react-slot": "^1.1.1", "@tabler/icons-react": "^3.26.0", + "@types/canvas-confetti": "^1.9.0", "@types/react": "^19.0.2", "@types/react-dom": "^19.0.2", "astro": "^5.1.1", + "canvas-confetti": "^1.9.3", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", "framer-motion": "^11.15.0", "lucide-react": "^0.469.0", + "next-themes": "^0.4.4", "react": "^19.0.0", "react-dom": "^19.0.0", + "sonner": "^1.7.1", "tailwind-merge": "^2.6.0", "tailwindcss": "^3.4.17", "tailwindcss-animate": "^1.0.7" diff --git a/scripts/local/secrets.sh b/scripts/local/secrets.sh new file mode 100755 index 0000000..1fa203e --- /dev/null +++ b/scripts/local/secrets.sh @@ -0,0 +1,18 @@ +#!/usr/bin/env bash + +set -eou pipefail + +echo "🔏 Setting up secrets for local development..." + +set +e +(infisical secrets) &>/dev/null +ec="$?" +set -e + +if [ "$ec" != '0' ]; then + infisical login +fi + +echo "⬇️ Downloading local secrets..." +infisical export --format dotenv >.env +echo "✅ Secrets set up for local development!" diff --git a/src/actions/index.ts b/src/actions/index.ts new file mode 100644 index 0000000..344be86 --- /dev/null +++ b/src/actions/index.ts @@ -0,0 +1,35 @@ +import { defineAction, ActionError } from 'astro:actions'; +import { z } from 'astro:schema'; + +export const server = { + submitWaitlistEmail: defineAction({ + input: z.object({ + email: z.string().email(), + }), + handler: async ({ email }) => { + const options = { + method: 'POST', + headers: { + accept: 'application/json', + 'content-type': 'application/json', + 'api-key': import.meta.env.BREVO_API_KEY, + }, + body: JSON.stringify({ + email, + listIds: [5], + }), + }; + + const r = await fetch('https://api.brevo.com/v3/contacts', options); + + if (!r.ok) { + console.error(r); + throw new ActionError({ + message: 'Something went wrong while adding you to the waitlist 😢', + statusCode: 500, + }); + } + return email; + }, + }), +}; diff --git a/src/components/index/Hero.astro b/src/components/index/Hero.astro index eb67dc6..ec8c1d1 100644 --- a/src/components/index/Hero.astro +++ b/src/components/index/Hero.astro @@ -7,6 +7,7 @@ import mascot from "../../assets/mascot.png"; import PulsatingButton from "@/components/ui/pulsating-button"; import {Button} from "../ui/button" import {Input} from "../ui/input" +import Waitlist from "./Waitlist.astro"; ---
@@ -28,8 +29,7 @@ import {Input} from "../ui/input" feel the fun, make the move
- - Reserve your Spot +
diff --git a/src/components/index/Waitlist.astro b/src/components/index/Waitlist.astro new file mode 100644 index 0000000..6e6c6d5 --- /dev/null +++ b/src/components/index/Waitlist.astro @@ -0,0 +1,90 @@ +--- +import PulsatingButton from "../ui/pulsating-button"; +import {Input} from "../ui/input"; +--- + +
+ +

+
+Reserve your Spot + \ No newline at end of file diff --git a/src/components/ui/alert-dialog.tsx b/src/components/ui/alert-dialog.tsx new file mode 100644 index 0000000..5641715 --- /dev/null +++ b/src/components/ui/alert-dialog.tsx @@ -0,0 +1,104 @@ +import * as React from 'react'; +import * as AlertDialogPrimitive from '@radix-ui/react-alert-dialog'; + +import { cn } from '@/lib/utils'; +import { buttonVariants } from '@/components/ui/button'; + +const AlertDialog = AlertDialogPrimitive.Root; + +const AlertDialogTrigger = AlertDialogPrimitive.Trigger; + +const AlertDialogPortal = AlertDialogPrimitive.Portal; + +const AlertDialogOverlay = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +AlertDialogOverlay.displayName = AlertDialogPrimitive.Overlay.displayName; + +const AlertDialogContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + + + + +)); +AlertDialogContent.displayName = AlertDialogPrimitive.Content.displayName; + +const AlertDialogHeader = ({ className, ...props }: React.HTMLAttributes) => ( +
+); +AlertDialogHeader.displayName = 'AlertDialogHeader'; + +const AlertDialogFooter = ({ className, ...props }: React.HTMLAttributes) => ( +
+); +AlertDialogFooter.displayName = 'AlertDialogFooter'; + +const AlertDialogTitle = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +AlertDialogTitle.displayName = AlertDialogPrimitive.Title.displayName; + +const AlertDialogDescription = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +AlertDialogDescription.displayName = AlertDialogPrimitive.Description.displayName; + +const AlertDialogAction = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +AlertDialogAction.displayName = AlertDialogPrimitive.Action.displayName; + +const AlertDialogCancel = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +AlertDialogCancel.displayName = AlertDialogPrimitive.Cancel.displayName; + +export { + AlertDialog, + AlertDialogPortal, + AlertDialogOverlay, + AlertDialogTrigger, + AlertDialogContent, + AlertDialogHeader, + AlertDialogFooter, + AlertDialogTitle, + AlertDialogDescription, + AlertDialogAction, + AlertDialogCancel, +}; diff --git a/src/components/ui/confetti.tsx b/src/components/ui/confetti.tsx new file mode 100644 index 0000000..787df5b --- /dev/null +++ b/src/components/ui/confetti.tsx @@ -0,0 +1,130 @@ +import type { ReactNode } from 'react'; +import React, { createContext, forwardRef, useCallback, useEffect, useImperativeHandle, useMemo, useRef } from 'react'; +import type { + GlobalOptions as ConfettiGlobalOptions, + CreateTypes as ConfettiInstance, + Options as ConfettiOptions, +} from 'canvas-confetti'; +import confetti from 'canvas-confetti'; + +import { Button, ButtonProps } from '@/components/ui/button'; + +type Api = { + fire: (options?: ConfettiOptions) => void; +}; + +type Props = React.ComponentPropsWithRef<'canvas'> & { + options?: ConfettiOptions; + globalOptions?: ConfettiGlobalOptions; + manualstart?: boolean; + children?: ReactNode; +}; + +export type ConfettiRef = Api | null; + +const ConfettiContext = createContext({} as Api); + +// Define component first +const ConfettiComponent = forwardRef((props, ref) => { + const { options, globalOptions = { resize: true, useWorker: true }, manualstart = false, children, ...rest } = props; + const instanceRef = useRef(null); + + const canvasRef = useCallback( + (node: HTMLCanvasElement) => { + if (node !== null) { + if (instanceRef.current) return; + instanceRef.current = confetti.create(node, { + ...globalOptions, + resize: true, + }); + } else { + if (instanceRef.current) { + instanceRef.current.reset(); + instanceRef.current = null; + } + } + }, + [globalOptions], + ); + + const fire = useCallback( + async (opts = {}) => { + try { + await instanceRef.current?.({ ...options, ...opts }); + } catch (error) { + console.error('Confetti error:', error); + } + }, + [options], + ); + + const api = useMemo( + () => ({ + fire, + }), + [fire], + ); + + useImperativeHandle(ref, () => api, [api]); + + useEffect(() => { + if (!manualstart) { + (async () => { + try { + await fire(); + } catch (error) { + console.error('Confetti effect error:', error); + } + })(); + } + }, [manualstart, fire]); + + return ( + + + {children} + + ); +}); + +// Set display name immediately +ConfettiComponent.displayName = 'Confetti'; + +// Export as Confetti +export const Confetti = ConfettiComponent; + +interface ConfettiButtonProps extends ButtonProps { + options?: ConfettiOptions & ConfettiGlobalOptions & { canvas?: HTMLCanvasElement }; + children?: React.ReactNode; +} + +const ConfettiButtonComponent = ({ options, children, ...props }: ConfettiButtonProps) => { + const handleClick = async (event: React.MouseEvent) => { + try { + const rect = event.currentTarget.getBoundingClientRect(); + const x = rect.left + rect.width / 2; + const y = rect.top + rect.height / 2; + await confetti({ + ...options, + origin: { + x: x / window.innerWidth, + y: y / window.innerHeight, + }, + }); + } catch (error) { + console.error('Confetti button error:', error); + } + }; + + return ( + + ); +}; + +ConfettiButtonComponent.displayName = 'ConfettiButton'; + +export const ConfettiButton = ConfettiButtonComponent; + +export default Confetti; diff --git a/src/components/ui/sonner.tsx b/src/components/ui/sonner.tsx new file mode 100644 index 0000000..7cb1303 --- /dev/null +++ b/src/components/ui/sonner.tsx @@ -0,0 +1,27 @@ +import { useTheme } from 'next-themes'; +import { Toaster as Sonner } from 'sonner'; + +type ToasterProps = React.ComponentProps; + +const Toaster = ({ ...props }: ToasterProps) => { + const { theme = 'system' } = useTheme(); + + return ( + + ); +}; + +export { Toaster }; diff --git a/src/env.d.ts b/src/env.d.ts new file mode 100644 index 0000000..7e01c63 --- /dev/null +++ b/src/env.d.ts @@ -0,0 +1,3 @@ +interface ImportMetaEnv { + readonly BREVO_API_KEY: string; +} diff --git a/src/layouts/Layout.astro b/src/layouts/Layout.astro index 3f93c8f..e96829e 100644 --- a/src/layouts/Layout.astro +++ b/src/layouts/Layout.astro @@ -1,5 +1,6 @@ --- import Nav from "../components/Nav.astro"; +import { Toaster } from "@/components/ui/sonner" --- @@ -15,6 +16,7 @@ import Nav from "../components/Nav.astro";