From f799f066c6175c5e088a8b727ab941d8ac4d05d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benoi=CC=82t=20Rouleau?= Date: Tue, 24 Jun 2025 17:44:29 -0400 Subject: [PATCH 1/2] Style Connect app (WIP) --- .nvmrc | 1 + apps/connect/.prettierignore | 1 + apps/connect/components.json | 20 - apps/connect/index.html | 4 +- apps/connect/package.json | 23 +- apps/connect/prettier.config.js | 12 + apps/connect/src/Boot.tsx | 2 +- .../connect/src/assets/fonts/Calibre-Bold.otf | Bin 0 -> 55180 bytes .../src/assets/fonts/Calibre-Medium.otf | Bin 0 -> 50372 bytes .../src/assets/fonts/Calibre-Regular.otf | Bin 0 -> 51192 bytes .../src/assets/fonts/Calibre-Semibold.otf | Bin 0 -> 53916 bytes .../src/assets/images/geo-logo-branded.svg | 10 + .../src/assets/images/geo-logo-mono.svg | 4 + .../{create-space.tsx => CreateSpaceCard.tsx} | 38 +- .../{logout.tsx => LogoutButton.tsx} | 23 +- apps/connect/src/components/SpacesCard.tsx | 123 +++++ apps/connect/src/components/spaces.tsx | 29 -- apps/connect/src/components/spinner.tsx | 42 -- apps/connect/src/components/ui/AppTitle.tsx | 16 + apps/connect/src/components/ui/Loading.tsx | 24 + apps/connect/src/components/ui/avatar.tsx | 38 -- apps/connect/src/components/ui/button.tsx | 48 -- apps/connect/src/components/ui/card.tsx | 43 -- apps/connect/src/components/ui/input.tsx | 23 - apps/connect/src/components/ui/modal.tsx | 39 -- apps/connect/src/css/_base.css | 38 ++ apps/connect/src/css/_components.css | 49 ++ apps/connect/src/css/_theme.css | 62 +++ apps/connect/src/css/_utilities.css | 79 ++++ apps/connect/src/css/_variants.css | 4 + apps/connect/src/css/index.css | 7 + apps/connect/src/hooks/use-private-spaces.ts | 8 +- apps/connect/src/hooks/use-public-spaces.ts | 20 +- apps/connect/src/index.css | 129 ----- apps/connect/src/main.tsx | 6 +- apps/connect/src/routes/__root.tsx | 52 +-- apps/connect/src/routes/authenticate.tsx | 158 +++---- apps/connect/src/routes/index.tsx | 51 +- apps/connect/src/routes/login.lazy.tsx | 24 +- apps/connect/src/vite-env.d.ts | 1 + apps/connect/tsconfig.app.json | 1 - apps/connect/tsconfig.json | 5 +- apps/connect/vite.config.ts | 15 +- biome.jsonc | 7 +- pnpm-lock.yaml | 442 +++++++++++++++--- 45 files changed, 1052 insertions(+), 669 deletions(-) create mode 100644 .nvmrc create mode 100644 apps/connect/.prettierignore delete mode 100644 apps/connect/components.json create mode 100644 apps/connect/prettier.config.js create mode 100644 apps/connect/src/assets/fonts/Calibre-Bold.otf create mode 100644 apps/connect/src/assets/fonts/Calibre-Medium.otf create mode 100644 apps/connect/src/assets/fonts/Calibre-Regular.otf create mode 100644 apps/connect/src/assets/fonts/Calibre-Semibold.otf create mode 100644 apps/connect/src/assets/images/geo-logo-branded.svg create mode 100644 apps/connect/src/assets/images/geo-logo-mono.svg rename apps/connect/src/components/{create-space.tsx => CreateSpaceCard.tsx} (75%) rename apps/connect/src/components/{logout.tsx => LogoutButton.tsx} (56%) create mode 100644 apps/connect/src/components/SpacesCard.tsx delete mode 100644 apps/connect/src/components/spaces.tsx delete mode 100644 apps/connect/src/components/spinner.tsx create mode 100644 apps/connect/src/components/ui/AppTitle.tsx create mode 100644 apps/connect/src/components/ui/Loading.tsx delete mode 100644 apps/connect/src/components/ui/avatar.tsx delete mode 100644 apps/connect/src/components/ui/button.tsx delete mode 100644 apps/connect/src/components/ui/card.tsx delete mode 100644 apps/connect/src/components/ui/input.tsx delete mode 100644 apps/connect/src/components/ui/modal.tsx create mode 100644 apps/connect/src/css/_base.css create mode 100644 apps/connect/src/css/_components.css create mode 100644 apps/connect/src/css/_theme.css create mode 100644 apps/connect/src/css/_utilities.css create mode 100644 apps/connect/src/css/_variants.css create mode 100644 apps/connect/src/css/index.css delete mode 100644 apps/connect/src/index.css diff --git a/.nvmrc b/.nvmrc new file mode 100644 index 00000000..8fdd954d --- /dev/null +++ b/.nvmrc @@ -0,0 +1 @@ +22 \ No newline at end of file diff --git a/apps/connect/.prettierignore b/apps/connect/.prettierignore new file mode 100644 index 00000000..a16e0137 --- /dev/null +++ b/apps/connect/.prettierignore @@ -0,0 +1 @@ +routeTree.gen.ts diff --git a/apps/connect/components.json b/apps/connect/components.json deleted file mode 100644 index aa38200a..00000000 --- a/apps/connect/components.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema.json", - "style": "new-york", - "rsc": false, - "tsx": true, - "tailwind": { - "config": "tailwind.config.js", - "css": "src/index.css", - "baseColor": "neutral", - "cssVariables": true, - "prefix": "" - }, - "aliases": { - "components": "@/components", - "utils": "@/lib/utils", - "ui": "@/components/ui", - "lib": "@/lib", - "hooks": "@/hooks" - } -} diff --git a/apps/connect/index.html b/apps/connect/index.html index ca6d6f43..2ec80613 100644 --- a/apps/connect/index.html +++ b/apps/connect/index.html @@ -1,10 +1,10 @@ - + - Connect + Geo Connect diff --git a/apps/connect/package.json b/apps/connect/package.json index 3ffe3f49..6ab87334 100644 --- a/apps/connect/package.json +++ b/apps/connect/package.json @@ -5,39 +5,44 @@ "type": "module", "scripts": { "dev": "vite --force", - "preview": "vite preview" + "preview": "vite preview", + "lint": "biome check --formatter-enabled=false", + "lint:fix": "biome check --formatter-enabled=false --write --unsafe", + "format": "prettier --write --list-different . && biome format --write", + "format:check": "biome check --linter-enabled=false", + "check": "pnpm run lint && pnpm run format:check", + "check:fix": "pnpm run lint:fix && pnpm run format" }, "dependencies": { + "@base-ui-components/react": "1.0.0-beta.0", "@graphprotocol/hypergraph": "workspace:*", "@graphprotocol/hypergraph-react": "workspace:*", "@privy-io/react-auth": "^2.13.0", - "@radix-ui/react-avatar": "^1.1.9", - "@radix-ui/react-icons": "^1.3.2", - "@radix-ui/react-slot": "^1.2.2", "@tanstack/react-query": "^5.75.5", "@tanstack/react-router": "^1.120.2", "@xstate/store": "^3.5.1", - "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", "effect": "^3.16.3", - "framer-motion": "^12.10.1", "graphql-request": "^7.2.0", "lucide-react": "^0.508.0", "react": "^19.1.0", "react-dom": "^19.1.0", "tailwind-merge": "^3.2.0", - "tailwindcss-animate": "^1.0.7", "viem": "^2.30.6", "vite": "^6.3.5" }, "devDependencies": { - "@tailwindcss/vite": "^4.1.5", + "@tailwindcss/vite": "^4.1.10", "@tanstack/router-devtools": "^1.120.2", "@tanstack/router-plugin": "^1.120.2", "@types/node": "^22.15.15", "@types/react": "^19.1.3", "@types/react-dom": "^19.1.3", "@vitejs/plugin-react": "^4.4.1", - "tailwindcss": "^4.1.5" + "prettier": "^3.6.0", + "prettier-plugin-tailwindcss": "^0.6.13", + "tailwindcss": "^4.1.10", + "unplugin-fonts": "^1.3.1", + "vite-plugin-svgr": "^4.3.0" } } diff --git a/apps/connect/prettier.config.js b/apps/connect/prettier.config.js new file mode 100644 index 00000000..c9513b32 --- /dev/null +++ b/apps/connect/prettier.config.js @@ -0,0 +1,12 @@ +/** + * We only use Prettier to sort Tailwind classes; Biome handles the rest. + * When Biome's `useSortedClasses` is on par with `prettier-plugin-tailwindcss`, we can switch to it and remove Prettier completely. + * See https://biomejs.dev/linter/rules/use-sorted-classes/ + */ +export default { + singleQuote: true, + printWidth: 120, + plugins: ['prettier-plugin-tailwindcss'], + tailwindPreserveWhitespace: true, + tailwindFunctions: ['cn'], +}; diff --git a/apps/connect/src/Boot.tsx b/apps/connect/src/Boot.tsx index c9515fc7..40b74582 100644 --- a/apps/connect/src/Boot.tsx +++ b/apps/connect/src/Boot.tsx @@ -52,7 +52,7 @@ export function Boot() { loginMethods: ['email', 'google'], appearance: { theme: 'light', - accentColor: '#676FFF', + accentColor: '#6833ff', }, embeddedWallets: { createOnLogin: 'users-without-wallets', diff --git a/apps/connect/src/assets/fonts/Calibre-Bold.otf b/apps/connect/src/assets/fonts/Calibre-Bold.otf new file mode 100644 index 0000000000000000000000000000000000000000..3a71e60c6c49bb204d1a858f3a981bded94db6cb GIT binary patch literal 55180 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 literal 0 HcmV?d00001 diff --git a/apps/connect/src/assets/fonts/Calibre-Regular.otf b/apps/connect/src/assets/fonts/Calibre-Regular.otf new file mode 100644 index 0000000000000000000000000000000000000000..dee8138577feff2d00c77125e2251073fd079496 GIT binary patch literal 51192 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

uf1rKBb^cIyNSY+ z&p73}rBx`V98IjUsi{Zb*9FuIlGFxWRh?RwmtSM|deC_+XmF_UElOs=C$qUxf-JOx zR26#BXM+Z3?N*_QsHNg|e%y!=q0`;8xTOzl=supYZqE(jl(%P! zB%<;Nj&R+tE)u(Q*`iVp8~WyI6j2Q&kZp@LqrKI5FN#0~)kcWZD3m@T3Ch^i%B3&S zg1%z4xKdPpCdP8gsae;gQ|XzUGB-!ZnX5~0zZWy$lz%jxyw}+7` zwUS@0kT2c1&%N-!;#W5#>M!yR*GR!urY>FzQ{SjNhhVZy|^CS zXi>QqI=ZA9&8i|p*abrND(jL&1?@chq1uT~k& z`HMzS+o$Gd8IFBv#Bv& zNJ6jeMd8p~Za=BALCTR!yY0o^EbfmNVOO+>ab}So7vXqZ#{2|PCiE>Dg1;rF>jYH6 zz`;_-eJ3j8xD{{$;ZQrt#ffV#UMsdiz5_(z4v5k7&$yS8lQ##VRg08Fx+W01{T+es z_G23~(t&$VH&==YG_lc1E~O$=s4uZWfhcwY_odXwMXbT23sH{`@n9P%>Z0&0N8HBF zn2 z5J2^YPAIc&m~!IuZ`2pFtJ$8TfI3_2F=X(Iu6;eN${wmajXCOWsXeBpSFw zBD&Ct!%jh6xbEE9Vw;*9D_{vE;SJg`lyrIWcvAs%08TCF%Z}neJecGZA!W9RoxC7f z`WR|0hXr{8wVYkS2H;do5u%IFpw@Nh!gc7vGF=zaTDg;m-At{WFM)dNQ7p7(MDC5f z`a^p?FyIS|$da|G*4V;g7tQZFW zV1RhJR*tR><&d{=XkXDsgc%|V1e%XtZ{W@uhxZkKBHsJKrYJ6%F~{df1?Ag1kae~s zwahc=^c2~G#jxnZAzS0@z9Mo0^<7+!tjm3npUqDV=tYC@>_=&cs>nE`0WF3Az~TmJ zNKttpE8IeyheCJ;VWAg_k1v4=WQRwq;5_yMTPu{+M9^1?IKhkifm_sx1B(O-vH1L^ zhE3;NwG*Crh=MVq(GgVQGeSwMk%#!@2J#9D@zs+#4Rarxs9s?wS7Of^VDbsg4}Cc0 z58N^*l2>06%i&Iqy<9|m#-tZI&gS@qga+Zsj~pw!+{#W67p~l(6`nwN^JtkyiO-zo zQVUKroIEAeKnEV3ggDPF5b#IgoY_`FPcn(jz3a&3n$JN7kg?0pNhXa&z{cj-o{4!I1x9RCUPmIg&$_O?XOA5q;gb2ue?LHFdiN zaJy@T8^Tk`VTmZ*_!AE#)%(TKlVrPL?g7)*sJ)=eG#2ujsC`X71s5COk%LNo*rWsd4aUI1@?-VKAJd?>J@C=Yy;-~#ZUt$m7#kY~~2*tz>kYcEK@A*@R zOiuyXi$|wZxZ|MdhbmBzIZ|eh``{qVj6e*Aksm@#1!ho?ISK^(DG92Pb3cizp>M!u z3;3(Qhl-TPNpG$ZLK`$1>D(HGnEj&gJxYIfxW7mo1BeFBt{M)O#pD|Z&%ilo4bH)5 z#F{8fF~-(lQktBEDJCaj_H}VPhaPm|j=ysoEOzFu6$4Ooa)5XOdQnU)$Gd(O|EGW| zcmtr<0pfwi+>Tsl?)GEgbK=RV$N9j>-&IV0mpGWT^vp@zZ*B?nDL_nVbejy+^(8=E zjADy`IE0AR>vyvTi+72&Xai9Ek$y>Pa?n?;f^T?to>UM82U_hYG}I_w(8o&;!llpLZCaa zNngGJ8oJXgwsr*nc^|6A>UaB9!i}Yz@HCfGW^SEHhdMhAovub{%`P}5}MW&0)S00C=wn6w+ggrg@^~kCbIgbNP^ku`;H>I z_ioyHF^+7?Xc6qm4`3&Aey3S44p~$v5~Qj?nCrp`1^r-X0QnU35S61i6q0UJK7%ub zskfXWVQSlIaM@8yuh-Z%a8kkyfL>P*QV4V3Y3dZHEKJl21$RV^a$wfH_tg)~AaiB3 zt!vZ_!mB3{iXEcnORkB*THqDM|q8+N_aAfa~Ew6)T1SJAl`5H^yY+H zL7edH|24j%^b?`;^EstXeErm>_*tJ?;Yk!HyaeEK3K#hyFLymB7hfXSl#V6Dw-bH!vToVfO{TZ)-vIrL-{dLkv+1Gyp|?Qwwuu1faJT z%!KsT6UfFZel$!bcx>z8n1Xu&%?U8o8i1)Ew`%_f*e8;+si+l7glu$58mAIUd^lmZ zwC7z_wSePAb3B;2$6_}$n*rb}NK}sI=v?%>T(Y|| zoKvQX?EEng243hfn3V9uA(qElSq3e5%0EwSXgmwlrNu6S}2+k8U+ZyP*Ly z%C&$?6{jF$XJ`rzEeEcFGn{cvI4#VBo}Gq{%>z9=-2>oQ94v7z;t*m)TY$0-xtLNT zOhHvhrkcKBvbYAU=LYPgnjnH(tQDptiGRb^YS`TDyJCQ1L&g+9)=Ib&0PAXn0n-&Q zj@;azbD`mVU^BnHCY<#Y7I;G2XFZ|u1)k9QSx;#GZ02IgV7dnMk|oijT^)}Td(w$%AY52w zoUQt&@f*cmC=5bc8=|yz!U6QX^n(g;KYo(<3AUvb62{j_KNQ2%76vGU1NXqt9_x!K z1)_{zs{aVtb`U)|6Sxlk3k(c(G77<52b18}Za9zF^PkrVjRbSg;DmpDi{wMV44VcG zc)WSsSB=d`4G{hJe0Fu^(v8+6lSqB-ItOkcVbZcEcgr|(IyYSu{`DX4jlha^5Xt=1 z-g$a)j(7%*?FKwNx!Gba5;{Y}MCNO^qu8Z&!do~3s->O%ITT|Ioz4kw$BRlIlg|LR zw@63Wi)ApREUE2>YbpL*p0S-OCOj=R!Y*Qa;y*5y%*|T0>CmoYCr@ej?ccm_MXu#A zmLSkUYI4bC?b>g?%ho7E0d=}r{s_^ocjD7er<284StndVS}9BQ=l=ZA{nOUPwq49_ zH%#9&S&dn@9sp;lZ}&h-fYN_K_FAD5HJ^YO_n$SFb7r4pgiC!B3|o>n&D_|w>sPFB z?LhMWq`gU&!UOl23|fM(tGZ3{0pPtHfcFXj-bZxPDBZ<6FiG|M26A)jgy)&&{q9aC zY&w%1 z!lO*#X(qbV=%Jd(CQM`&%vzX{Y8SU9eb??Sn|Eo1y38H3H>7;4d1SoZo0EEgTs_Jp zJYc6hQ2+etnL6PGx+K*u7ta{;p^dxH#*6XX{4XlQ(*UPK6U%HWuA|s%Dc6LP=vPUu z66T)Rc=$xM-Gfop*aBM)?~fH4W5jhSLQ#95xW4pAc)+NzNMB8uPaZ3r{N++e-+q%O z4v0(qK08f2T(Mxs&M)_=k;TocsQGWB%DmQVVedApM*!^pt3Wl*8-Exo0ys{=j#dZ? zAl$k~Hn+ax6y|OIEK<(r&m+nXNWp7&EFQStX)||j?#kh zm9$uODHnjTKsIz<;*9C@;AU7L>zWsONh3Tt6wq`5NJnNIxM&;Os)n&|C`zVsa4Te|3VD@aFIH(fsP`fj_g{=6e#{>)MOKhD zu^$2=$2V^{0)EvWN#Hq#h%ov`Wm#o5pP$%OyW@oLP@{WoHw~t;AX+p5+4hNfG1$~vC_+s734ZJ`bKbd zp(^mb03!xxYc_I)?3L5FAmj=TSiNX+$BH{}CmVOcI}U&o)1IejPam-XJX@2OhK8aW z-8j4lYKNqw_;mU{9NqggYE+(hI~x$qj8GIGVDRNy^jvZ22ve!>k7SgwWF2gX(4l>> zD|9esXK}IOeNa1+Cn;f9NHng1JabS0?)ZTZSo$3F?KujA)1ns)cqjxgiRTt8J{kyq zTe1f?vrZ_>1cxq_8sEBgF$S=kx`-#pR@owtY4&>I>34e?Oql{ajy+g#% zJdRu`Ks&o~_4p{EBUZd_jRUtD=umTTT>gc;@$aO>6TD4lbh5Juj3btFXoQ(DvD0;1 zAnaWyyaGGjme^?s++Q{_{lw>@4IH#rgP;f*N0-5!rrd<%=b7XmkIp}-Hs3h9oKX~a zRD0r5`0lV^X4{O2>`-+v?D`oc;No_h=>V^I1_iM);xEOm)4bn3QHiLiM!a|dgyQ+5oSRe3qGTHjoCr?(W zm66=fAd#SlWhly?6E+}6FO^UR9{E1-$jgRtk=$L7PE&cwzuz_%HZ;Hv@(DQ(ZIaxU z*Rs;LByz&TLK4gZ?xE66mGBT4*8t;(!?<{Ig|X>20?Gts5RIBaV!U|%o``+|J%};3 z86;xb zJ79389D^*w;lvVV4*oQqT2QY896Dw3Nv(aHLizD33kvBYf?FnEEuz()?@DSFO*=I~>_W`wLlN!m z%AFbc-!6`uS;BTwQn%27I0PraBnY6NCr}S8K$EiubF(_CEsT}-MI8i3>^c#;L1A<%0&D>NjL(_1w;1(ein zf>XdcxLT449zVJx)lcN$RMZx?`|lmkB$EO5uB0x-gNv^d_GLm#ahaqyc~p`BgqMH1DpWk-~_lKo{++^a30rN>e*TJ z5@Bl4M2NhEqKQ4ZRahX@n}9k2s5ixPpF?LGhlGkF2-hI8Z5NN^;5hj53610q;JN>= zSD@!N&RWDNfrmrmkj~<02nO4kj*w_Mta!L_0-Pg9bLHR_lXE5d(@}(5;^R!2_u; ztRJ+>WY`N^T)F>rI^2PRpbHvCoQdnwQ1C+@g@{5q?r~KmT%W`xSBh}m9SHnug-1e# zG?YX=gj(!C0yK{%aiv+8r>995OKgr@%c=paRmhcwO9`qwUj>x6R}1^P4;k~>#7!}K zqO?Np$hgUVgY7VV+XGo$ySOVqUn9ho_%hGoFpre`3OAO0Q_ckGnTT!^ZGh+J z_MFlnEl2Ifap*8Pp~2glfg<8PI3Y;ji!SCG_3=t{Ejn#4$~<3B7~8@ zQ%w&}ovv@Xe^2nQHJbskRN_}(BAWhj3s|{Vo73nY-^jDS2ao7gIS0ufzZOX@x=cu* zWDd92ME&O8o4Z>?6liO@vRK5KuPdSe^8Sze{I~{cNGsB9PQ7uy3Rghxohncr5QVB8 zsDrAI-6**+F04{=fqRxFf*j%8DJgcZDCF$roJh@}YMafss^0XvUIpF*8b~U`F|L#9 zl~)C}!WIKPFuOo=i@mly_e_nt@>qo5m=JwTgjRSKF?H_D#UYm0*=5^)*s}kirSR(H z>7ujO?UYUqyG1EBnZw8+Zhs?3U8T3R;)3*rscCjmThsRJ*|ufxu8fVz-+?-zMtM4Y z@Qr+v)Mp*+Ia2pOI-qdC?YF-<@kVeZHJ5N``X5VR!a}7!D7?cTP{0&znqH)(%aDVVD2iG^1RpM{g zRdAd0nn>PG0Z42r4CCN#A%kYv0wI*bj}hRqC&?ltpI=wyik`N)qVf!f#=*_Uo~Sc$ z>&(FWZ}9pUbq03ux(e9AyD$a_!Z=3w{xReN)4yjBvd>LqP%&BrvYtTZ2~?lHE6;J? z_k*}0TGp5hKY@YQn~j?DB0k@!0m!XJUeoV)@v8W}?lmJb4uu=k{0sjJP=Wx z>9uhMdA$N)DO&cPRgsC68?Y)gvD);W)uxZEw!LSy&BThlnpkZER-t4Rdujn8JeViG zMvivK@&4;KJK;_(cAeH9+hbolkN`r2;^3HY934C>Cf&Ekj&|6wkG(Dl?z$q^V}HVl z1_;Zznrm{@QEDg`E6G)qG7fn_hQ}Ng?&yu;8pOA>pdS1>&~s z?5&ztmF?M)Q>OT6v9BUIb3uw`iq{Et+v@o#B*W*#lrqhql@6?7e)cvkR7b9)zH5#u zW&V7F#=-kfw(P`-axL;zY+IfEo495>NtRDJQNa-gqZIm$Dck32lIPA!(Ual$z_OUe zT$m@mK|RQr-@MuJk1-RXrZE?u6=&Ypkumq^qx;90ABpBMKPwlj$e16A<}rT@V;=s= zn2&QWughV`sj5Q-;`Zz{?}r=;KT7abq-4&2Kja0bA&)Q(xrz*V4Gj4>2Sb)4*CR0E z1u){_rV&?|N4(}Y5vB!3TrnlTf?JUM_Yp_Ihy$dF>1YP5VTa>#)J*zT+ z;rJ`Xqw!k~JDq)WF7>d}c;?Tk?G;XEQ}qnElhTsn0MrG3+;u^iwnti`dX6J5por(J zkW<`6AxwKbRw3l{>;jJGM5)Euo9BX&#s;;$ARO8+tyDdC?=t>*-wXF%p6zt=B`Z{& z>!c74-GdrceW8YTr&8%zsm<1_88yhIW>&ROgZ_G;%GiZhja2T>`9!u8h#0JYrg-v&T40$N$$zZ(^ky^G(OBQGi;LG$P-aT(HbQ5WeyrP z&5f}Oi%JU}8@KCtre+A+Kl@_vOZCrXr*3M6n(bd~S_nVfd5EVWN7eK#GqxPG+r4i4 zo>dy;WY6qN-Ip3|moO(eJ`2DG@^dAWbh-L6+=y^iU2Y8YV{zMef#y_K-4ratvNw}| zgKeh2<>DvPvT_X;C7W<)f8k69sFbsziz25EfZY3h1Nd=gQ?Iw;Uz^M`E@6DWK zCthQAtXRK!kKNIkTf;Q{a9~~~TV0}>m$@KA6LIb+yJ_`;xmqRZH8PYU%aTW=+o(?! zYF~+%SrDQQR@I-$yHP(OZ=e=;H!@YomPPH6wJJI_HB94yEF0LoEruAdB~sZ5`b8m9 zo<{vo%Qs48s@piS5JlcPf#X@YbhAQLhCCSTaT=}gRSd@?hNBUTFJ5sPd9Y>JgHfJ? z_{y-0sKZ4xES=se?T|}9parUq?0(dNdB(1}$aH7(&@g5MI}HzGuswSWUcA{bcxlfr z7{mO|#^Mf4H+KFQ=BX*S!bFbjO)r(Emp@s&5lvM=9-##uO6)JeZ&Jh}I==|DE0VvE zzEU0DyZ6wcy>WVdTzphi+@8Z4a9OGXi@d!91BVYU3aqRwDyo8QA0jd3QoGA2w%jI6 z^1^j!h44~%QkgDp&Z&GZJ*((jb#U-}tUAXo$y~ZH({BFK1=>fSET4GbndlhRli)7qbL_u)pPdgGtp_ArrUPLfBlTDr|mAD zI#5}6ENa3A(EN;s;G$mZET0T7=Lo-doXO?(kmN#!eZtv*z)=#kRkGF-r}+x)}91Mm|$Wk<&{7^RI zhLCX;ZBQX+FYN4(oLTs(o866kxCo&DuFX`p!R+Wc5&F^UVIdbDr)!ZD zESDE7n?F1Q*RDIjSGM9#s2vs#hueZiDUv%QjQ%3mq{pTlv-BDu02EeSwRr z@;UqLnb^~`Y-83>C(BlFpt2U0Z6hpOdegFbmvR@$vi*_7lzmt>@8I2+)8O~Lo1Cr& z{<6?gx%mCERgq<@`v1CYi$5-#0LwO+EZfmD6@~i}LVnO(zab7S78j+=GcDT?^Rlfl zFI&%2+*6@k{OPjItQRt_{BzmrVcA+KkcWBMdcd;vFfW@2S+-WJa$S3lK3b2?*UQnC zEER$fs*3y+u_sbt5yOv|ROBYmV+4L@ca~*Me+&;Ktm(JsV2V2$t?C&qYpb|tK z!&c-4TvkX}HJQaD9U1Vty5C@o8|vZC?$T;0y_(*A3(bLG<}Xr^YHY{^UoQ=wh!dFc zQpak1LV=vnAf~jswB&}}E3Zm8T`+^1P8U~~A3b{=P8Z>RfGuQIqT~t`QE7vo)WYrE zClGqvuR6w77ljY^4w*V+;N<+Pnc9IYman=q1X-(5^XoTXR)rP$Y|;uZi#HrCs4@B*5kx>I!iMt#v(xBh|S26_ZtxT!(6 z(Js|5DPt~RN{!q0#I5k8p{qvk2-FTdTo!Rtjcjf{K@5_+Kf(M^ziFe=wab^RTW*Ki zl>PB@>He7U8#GGSoNL@h$zCq?l1{5ijP_orN`d2zxv=lUf0S?qEhtA*uh{Ib3#vt_ zwLv7H{8f=^V8E&Bs^U}iH;N|>_X?Oa01k7g(86zG?xm7~+{;%A!bkg04EF`R!bn>n z{!#Voo52@GYy_&}&3R`k?4G+`c4+VF*JVWRg!Abd;ScXwwTdNBxX9!T}~_40aKsarL6l=48bLpu=3_I$t? zgYi(JgC@~FdlN0FmrHUY+7m*2hiUK>lW2FX#-|mi7l`(is?t&r?O~O$!70q5eUrVq zBKK^qy7D*??ZqENTT<5g)`4ipfoSKm*NVf3j~E~7=|1^Hb*2{n2LNVG!!Tr{MnY}F zi|T2`Bg~?mM?`yQHQe2k4;a#Z9ue(T$MfO$gD0o@`%H)$p`8l0@uO&8A)@_kAxBy@ zi}u|zv=~HtJ&1PwIS}pOu>%K$5YdJv*>$(P$p7uo?CyPJg*eyy*m8VmS_W*XqhTfS z3;c75V%N4~+s~+B7-rEvQ;m*-XlsaQ7oTsqaUMi_+_(WA0YtQaGKseT1uRozJI5x` z-f0%?+aTJvO`_fZ3AP>#qMfE)v1Ba~?eae!T``OHVi4_`w(kTG?K8Po%FcjjPY55`B-+g$ zn?&22i1vB2X!pCUbLb1Ao%dd}gNbNA_CnS~=**&hqy`-Y(f)s$I}`XQitO=s&tx*m zbP|rqLB$bE|KC?VlT1RueZ`PM_0WrEu!77?X3;lBH9}_ zezkvti1raB+S&J+j&f$|_hHd~!WQkD5bc|kXn%dJnXm`Zo|^XJtIvvP-(9KBJ+^3v z){CM&Plx|D^laDIke==NjN#2I=11$yp&Rt~KmQ@eX|@c$=NmX|XhxqvC}y0e+oI-o zKk`tk7XzQi&U)=1)8~}?VDj)M(AqDVbJqQ^>dB#Ixy;h$eOVo{yh|A5#Qx3WUGm{m zvogj7yq~=5_wMUE`00KD?-x(frTbj=3xpDa_dCshDpM!k7XBo&-YcNqXwJUNZ+74M z!)M-o-tU8-U&n{EiJqYAVc(O(h6o|fah|S=A*4&IQGu8eLXL=W92G3pR?;gC(H*=S#?~teZ^cgyJ?#pQ{WLs_5UFCMMtu~E# z^PifXF*e}+u+hwMlV^RHx}n=*c56RebhkDuV)`jQ49a{mHrOn5bs@UuX9{5%nL^q8 zOh~)&rFH#>n3Y!@TPJJ@CS*GW}Y)E`)2IoE84OV?Dx#*J#@<4mjm~# z@b?*)=3TDM96Lqr8i$Uq58wA)o5&RGV-8`A?8c}`cMV;p1rR5AI+V+EH$f}6v{&_ zMLK4OrDNEDH1p(zMBj|#ens5qv=%G;84$N(#Ef4gZbhR(u}S8wSsq&;ayo7LF{{&N z@A7oXda%R_zOH2M@O(IZ2o^_%^h#sfIPdxmVdwZ%d*?X$%aq;YfsZ}BnLU28>>%&_ zVVi*W>GakQvWxs5>>^L={rrG_-BR0R_S_aAR_N=X1vegD=K0PR=zLkIm(y|6X(3>7 z-QfC%J>Ge>ru*>&dtR*>;)@0}Xwj$s?#Tb*y5S12xGgncXLJ)3P_7XiO~b1)0=A1?s>^36Lv17`Ogo5mwJmTwN@Sle@Zz&mvFr~c=H?R@jz zAJDtc;DIoB>YSJ8x8C#CCv5iKzT%T@TOL`_V$hHmMn0Fe&%Anl=>AZi*#0LAy#TZu@<8f9NkU+tx0~T4GbPN-J(ZeszB|dC!bk&2Dk5 z7_nR2tjbVxMQBhv^E!8WXpUTjm!3h15_<-;((sE?M$nuWsFX_3qZK_xvS+ z;Dif~9-h!=L9XT-7aTtC(9EeGbmQ8=L(CRy%_?inw6*LtpPXq1GDpb;>6{$=+t>c> z9o98#)}ceQKxWFKIdc~+oQrWuY}s}1J9l9q*f_lJIpAHH*{pqs=FQf3*q%npZR^%; zPrE;*d*6&6@~V4=B%HfQUM-xH(Id?}w9y4LsxPw7JZX|SIfwPLsK^&sCB(w9n_HPT zFZZk9FMzRUdDX?B?6S+*>c#EK!-3_Y^OKk4vK`*ZgH#FWdKDuKEjWi7tCteA$>2KZP1)K(=bdhXnNnigTzWt=sms_ z@N#21^VgZ*y2ei)Gc9Z%V$k4>ev^k!$38^pz0W;go_Bu9M+Bm)j|e<&eA*LwFKH0Q zV3O3gmU)#ugK`@jk9;j*@5v_~^Ci|Ek2YIn4a=UEJuItqPB6_oKF8ebo3rp8KV0n? zx;JL_!qJ`{X-VDv^7(oJ%W$7y(Zd23k_^f%zvS2#{@j6`JT;Hy=$~zKel`jeH?VG5 zZA;JXfu)`IvDqmzk?q!u%jyrSqtmW@b8a;ACV7vS6;lm&IH#_P# z@4ZlRZ?NR)Emhs#z1t=x=k(rb5YPp=6?u?stP$W`mG#^B6?q8g}Bj*@-6~`o3d} z(i3b^TF}j7&MB%jrsZpmS@_m^SG8H1Z$g5F$u3_pn&SsQ`Xb<+I-=S7l^$DFh?+x89X zpxfWz+F!%Ra=vw*30N$7b}%I-6~ejAX*x%F(!-03)Z#H&0&kX(PrfThun>Orh)#aK zh^MlS?XR(&h79XIQWkR!A3-HtIfBLTt2DJ5-mE-wcUQ4>#zvH2!hY6+bu;h4Qrnna zjifgpe{i;^S=XgIUI>KBGyBOBZ!wnSPMR7nuTeOtk3Zww23T4p0@Cd1@P;m-Sc4B ztGm5Rr+U|9vJY*gZ)x{=@TyPOZi{-uD_WGUDeF8FVa_vy1Kz zS58)IUuuO2aGO}oG1XqB?Oi_gIZvJE`RKTLpvTq+F`JwiV!6B~9+X>ezhAc5%_`7= zRB7+{{h|XGyyNHFxYB_OMtgcPZi_SvJx?be&JmL(iW6ovnum}5G!GvueY0G)KTV>K zoVS53Pb_NjAOBcZ;*o*PK-><#!6|YB*3APzy-Z18aF>J^h>wbQ0u=6;x z`q-K8#D(gQjo;(NP6FcBj^bhopu*bea&kS2+*sbr?4>??pn%Kweg3a%~j)9J$j^`aOVjpvY zW4>ddW0hlrW2@r}#{sN;f9E*qIPHAec^Vs-Z^e9rRqivcQmzzNx~r0_CKefby9T?S zcTIL}aBX#ci~Y;0*xBxY1u8w)YjSm#lXacJbu;F_VvG#**k zV7$c^_v*gWvO&2^te6xs{$0^y{MDZn-2Q^cc+`{h@O>TwlXI_PXNj$bv4yr8{&3+L z*Cvd~)a=^nmV3K?u;H(K@TfCkdpnsai9NK#tb&ESsOHt^GjLNE%tW$SbQNYIr(!0u zz%raMZ{~d~FssL^QDrM{2)6RVRx80QOE-;G=FO{&)n=nrn2wCyXng+s=NJhxQwvQH)73K%tNl#p`-Vhquim_ zLWf+P&7a(cZ|91oUt!nrktc`n6QrrjumQ;(ZrGM`cU>U57W`kjd<{Kk-x+k42?9;5CnTg)9> zjEL#Ot>$%GZ5u_{6)R!B?KIet^VpZhYp;$97_xrac*>LXyg$kNHJbZWO^@MQ-D6?r z&OLf`esE!r)vFgST!k9KlGMO~L#ND`Ic3U>8B?&#m_)1v#Om3(^TM9QTCkc}1BO0D ztjRNHPMJ)sr?7#fTIt3|{WQ<2Z4NizNqh&3cikP^oIPJ=n-qCyj`dD9fX(qIt?=#e z%%8ysY2c9FX~y;bo`}ToZhkQ=WiK``dSHPvykE@-Jxu>WEeRZI_%3OxjWd3VayFlU z)W%C=uUXH%YK2Q}L7wNqENIw%pP}|LtTx6C@Eg@b$6ZOPRWXLrzrzAj?2A2J)1K`! z?O`k=HLe`e)4XdNtZH#+@zUw@rv$u*dQMn0WM#P@fB4F*Z{8Y8HNBxup`jQMY#8bh zdeOYMvU&fv`=?G{leW=4pzWPQ>y``E2;KUH*^7Bm=H^)Dcbyq~O{j9n=+NxWKF>^8 z{5Ig5kN5Q%(r-Ywau4?VICJ+Wdv<^P!Jxk5(vtM0$|C26fB07RUh|o&=O-J7ZYdYB z6!^`+y?Tz2<5s4 zEcxsDoYY{2u$95i-6qb;2$&z4xvm-A#&>9)YWT1&#&C5|2G+({U^9I#hAu8t@m;;M zIg?>A`}Ui$?*?v;Z8EA`$2-b3dt~uvS!))4w3un5#mgtoe0@z^?=rGcs^rq)8L5-CkzrjjkQlS-u zB87(D&f~n_Z%%CFHa2_2q$SJd*xRU^>=>V<`ZDkAZe%9Xm-**x&t0l7gB4zEUyQg= z-__3im_bP>?F%<^ooS}_IlJeo-4Uu5>gZ0ArQWM$ske`XbpM}-dV)m`X)yE^X0x=1{_9B5vpFa7e2E=4z@;o?$F>1cld&3b1sx+ zg7IdvuDL2y&8#M?yv%HG9q*gQm;QA!VfAHX!piU+xOcrrfM62T9#^j8VpSbnQaIyyyd~jowv|$O!p*3*^D$-`NUw}vPZDzz-T{| zWLz@7QPu!w+13F2V-1iU@oRRvFL>_3v>o%XTDB+0ZB!LH*u`w_+wYWyoo($jlwv{H z$Tx#)@G1AeoEamBPYGau^?8@E)2x^ly!O@$*Sf29>DtH;V~?vn#+VB^zVBj(u|lr{ zqE?F)8|)j$R;_Iz(}?~1yRW=EK6TtHV_zMINyU4j>^~bjJp*U=8jC@?<7kE09W#~b zxL_*V`(0RpIT&k*ePhbSZUxQmBe%5t3@h6agPiwy)b_D2jhEL99KzzYuhw;4jn%%p zcbM;CwJ+SizuCOSX)qgXTU; zvKTD_6`P%loi^SGo7vM1Iwk1&sUI4V2{c1l=Yw$=+{F5t&cA*z=7w#xB+Y>p`u+p^ z_wA=S?!2pIdo3xW>!5yw$MRlcI*6H|=~m=FqmtHxwYD*Z;-`w8HvS}JDcJngt#Rk3 z{9UO@+xF>Nt+uUOrEAx>Z+lO=Sb|e=fTHeLm{WI5zo|P=)Ey&keR>S+r&YP~RZ%EZ z#)z#toF`!tPp1?$0}=xIE=P>>0_R@2Iv#c`Na*OS64Tx}I%Y^hpy;V$O6=%UrIe6_ zj&foPzkT=|!oPYrU5^_VT#v_$iJ2Ue8C%2EEoMI>gIM;%*Kj?KJ^aTx2jV{$TO+nX zY|q&7oRc|c#O`;;x$C;SxCgpNxId-mABd|KcUxThxQFTSzaIAmw(wiVPxK^s?($4B zQjPA$2gWBxma)$`XutXO_8Ogu164igR} zHKVFZ{9EcajP5m3e`jmLzn7ZwpR;EC+pIMsto!&Ami$b!7qsUrWK ztIgk;8t^x|JNO%2TfH4)vd;XUpbP(*`-@)O|G{42A9b(u=cbwZZ2oX2FsbG@IPRkC;x9)=SY#Oy=$GqfMaPb zldyICb!r2DQ`iWfvhZhXDSC|clb%Yd@>&9rcLMntpw0rdRr?O$cg#` zz+rr9uNFDUeoLXURud@{t_o)K%oAG+SG&pllu>zE?qCi!T#ytmD1`S=@-EX5r6< zpD~nVc_~dG*0c5jX(xPl>&>mxK)VREQ$RZbG&i;uA5k>onXw8!0ca=8=a(jJf_^#4oiIJ<8%@-DsVq zf+-nH$zVzbQ!<#6!IZ2Av?_X9`mEj)u0Cdci$za|-W$p7WBpstu+Hdxt-X3b>Pdg=IQjk?(wI#dPf+@^jCE9` zgtS4@ntCs|+#CM);W>jc=u64lFWBF(4w3pS^d92fZp!aXDTrd5OXL0>vR*V6tVtAtbYMpa(|JSaVn-Ooa0kq+-LIyt>+}ZaOw#7lc@z| z;7Ter?hWfAH7*(4xlo&{KL-BC!P^Tgy{*-HA5vz(Z&H!R(|UhoN=kAcsgFYSc~TyS z9yjn!=*c6c2g=>h+@yRA zXuY68D9<2%U!+<>-B9V|O#--_LM5qsL3DzNs2E2EG$kAhMUJPqJPb7FR~ z&V{LT>MxPM*TDTc`STJpS=XUm+Me3n>w&WYoKTt-n4;S{;5w1&A)H+zaf(xYgrCHD zjqumeI07vZXrirxP)=*ho3@H-CsgMFC0BolaN$8OauVhkl!xGsM@okrDEjz!r)C}1 zb!3*m)x(oL@I%^hr%j*rGy3;D7}ka{xY7QH!Lm*72&7Jg3#Oh5o757)=%G|Z7JdxN z!bPy1f+M-);i8rV#yqgmz7s=w49&sNmQ?(Y9_Z(RdPYGlC~b#8(tP2Zdq^$qT^_WC zfFR{25Tx9M0|MbZ5FEA?a4+D3lwTgu9AOURX=y+Wz|R1s^ELer50F;_Ih#^C3>S`4 zO3Cy)N`+g5-F6#D89bm>)H~8*b)tkG;x6^cmfcgx+&N@75t+-S^ql%A;J!i~e~mi& zI{NMnII@@;UK;F@AK}J1J5TskYfFA2d6Bwo=fRkCaY`dSuHwwVxhWKVXUsA=7Y^5LM5l4wekl za7LvNt@IuBT2if{-&+P9kqYF;p&!YkonA{XHEeJPQCa8@*alJ=hUi8jsJh_3z&JSpHQ z37!hzDHm?-1K=r1Pw9~ME%A<8+1f?^uIjk%qKruD9=`E5zGAdujB{SKK8&rb)ATDG z(1jkMA9x4r_-s)5@|=!6S88 zJFP>M@Ge?d&Dw2kv<_HXc-{^D`{CgUiNt6CS+ow5lW;0K?VoWKKG;&j)eSW}q31m3 z5i8ru&u?D=?YpLN{YQ;>=pkVnXV z>!*USKhkHdv4&X_6u&Uh4?R*J?ZZufDSU_zNuypyLU_JNs+8!Ef_Hy}kMi1&mhymU zskOdH{tIfJ=nk8fD5R=93)P3Hm;Yz4br7x{Cg)CkhYQ!cUjy8h&R-Mrx5lAX?j%iV zII@zOc)U=0rM*-LJe8v`9in3jN| zIJ(mD(n4IJjYNCUrvCASq75`F2=t?9`g6r=b!j6D+9BH)zMiJHrVgH^Mf(#DbnWkG zYyO-4B9-Y#t@Nng1lmmXEb{qLxa{m+ih9YfNdC+tiVtqeNP3d_2YnN1FZZclNjMZu z_%kyD>L~msKiMDVQL;z>)s`i|hIt6*qN)5Z_HgsFCOtFz5K5#p59YrUPq+_hhe;g> z^ErV&dKB%2()>XWkrFK|QI`Xr&)dsI_}$?OzshR?4t(J@366+tos}M20SZaOb2Nu4 z6}K)K@zw@!qJ6hs|i&e1oH3j9BL8CibB z2;ihDNA#x}uPcaXiL3}{@mX65k&&`y?NHafv_vv)|C0{-u~V&2D6=3qeh-%4lje`e zi`|-o{SrAZr2X=Hj*`1Sk5(i&GKQkh#+Y5q%CWWpz(G58gqbm!{mesy9TKW2 z$z(NlgNJf3o3@8AC#}Va=ze$j?G8A)hVj@bw9$HNF7f6H_kY^~e$@_9TBi$UrNGTR zI;ZG{1U2g+Gs<$Eq@{F(<=!D26n}B`fVnQ=lg#f*u0$rzsg$Cz&lagm04@GtwsB99*1Fh;s@GfW zo8kfs(;Gc27t!IxrMfhXc~4|qPL(H(nfR5+crNYy8G452>4P2D;*n@(0qxY#=@1-B ztDGwek(4L27-DY$&KdkNCmv2on&U;|U+I}Sy^Hi|7pORi%pY%M=J+IS(;4dvVEqfO zmgT;WSuB?-p*hxO;RM)s7R;GOFwl27Wlf~kZnM^MPKT}us^8*P-#sLn$jmPsz}O95 zWC-fMp=@PzTUtq%)UQN(h#ut3MGcmk%2yuME`+4+QD%kpZx|Px0yM3)pmx~vZ<#}$tqXo^$h)Ye+|7cp6bD4gRv8TiAsQFsMr^;DQDn;zavIm6Eg zcaRj(+BUTk&Jl@Q9AV*@Io50RY7dL_%Ylq+qqZ)l2Ao8XFJRQN7)f5kRqnFx$W5)t zW8AdS%DmiMCF6obzRs-VE2bOHuS73Xqg2|J^i#9JvoUIZ-$q^JisqMgCVX5zC&jfc zmyaERXWxIH)}RKhK*#3y8>nsaRp+#{B5;jXkuv5RDB(X!xZvVSo6nom1$in$3oQ|` z&r(~YrX16*Qmqo@NSc$Xv=yYnsR}<)LQ^QgZz38HuJ4jkLu;JEEx@-1&9IL1Q|8H( zR^r>ne<-E>a6A87P!Xt%j**IuK$7~%YPpC$L))yDZ$w4rmI^12dV(J|*F^rMuW8AL7M-YFVc>I zPig)FDJTjz!p(3W^iU*a(Rf#WMv6oO*|oW#Hb|QsK9qKq_N$0=6v20eS*oHb1+bJ0 zUv>-4wni}8cQl#Ei=wRXn?Lsn-6Hc4N^4)PE)}7`*0ypLsVG72F5;852-0(uBVIHu zM^T+Fxl@vqUz%s7KNapT`cw*m@N2jrGbd^+NnP6Yt5T4l;0WU^2*4*j^g@U9^&-?n z(?qY?ItfstRMrrEW9_sklg_|bv0-q{7^%$LozD%Td z98ELv7>jJ7o+TpP(jpaxSuhhNK2jELQ3OM=lD(^do`?@w-kI+|8up16&c+?%S-v-y zj+PGkT=b^k*?H*7E<#xZ)D`a0`Hw`4nuUx6aaSX=sAt~?#s zBZ+9JX%#95!Jgk9MkOsyqTrNpO&$4Aqz3E(w}&x!QSQqa zBMZ5cHg^ks3bnc>0^!%(^RYxlF1{WWXpN|-%nVQ?rN?Z~%c=2?{hofrH~13a#{$kM z%8;Uh9=y^Y()Wmh$_h?GqEbZOvEJ>H13dW}DWA`!&?OtSSVl1Rj4&lvkdU!t7PY(- zI9PpCY`zL27vn2dpGkXo$swAn$bpP7eqwA5$1r87RGDL%Ce?UkWe2PcuLzdx%{=awMy3eg zX-N80?3l6NyIG|k9xX@>r}Skm?Drh>T#Fo$vXS-EtOk>}HlL!nR3r&8;ENpgngHut zrO$*S#)e^OSMPuQh5U&0QC^f?et!%a5~M8ib4zapj$N9IFe2iiqZLnG;W497C8Zqm z>uLFYF@GuFk&?Fa65-(Q!)2!`j8UG#GIzv&6Xx14d_^R#v}MaJzzWB}Ryg%&pw zyXf7Pa9i^2R#L&c^!w%&ONCw=+C=4|C}l^A>(LdZqPS<_5E7;27dfMc73LdqX8R=- zF(O~3iUT5bS?Zx^2U~8LZwp6sMYK$@2@3)pjJlk(>7r+oMB{01DMq*mGS@`-*+nwY2?uZN0X3Qm?Dus{Nqfrr)NW*Bj}LG?N|JcW6QVPW?_T zSHDZYOZyKyvYTrmy|vz6yP)6C>CiiIvcpR65A?t3f7g@rS2;_v8+#^JwPtgcW>@yd zx>x^%o!QCyTC8cMP)pw+hfb{$THQr%V>xS*Q#Yf{I8L41$1_$<;H*YTCu-Hq_cw zT2InH#yVzdp}C`jMPBQkE}jx3E`! z6xd$kY)IL@OkY?^_YO+;HT!WgYJ`zFV-vuGS= z8+Mnz%kKU0ocC!HINM_XY#Ml{BN4Y~GqpM3oy*w-xmiNUQqHE@GAyJuWS9O*xVs8@ zx>L#19ZH^>D0#XQc{)hUe{$Y}9kp+u^~zc!y^3B1e^tFI{%U$P_W4%Vt80z*8hQ=OhLB12?ETaD%D?Zt6g5 zEnRP;-=~R{0%c8r{eAIzd+J65sT*9W8|@nNg#(Tct*6m8emlX!WR7 zE3gZ&7OMx>QnxZG1)Y6ppK`5&{8v$@eRqbR>~IOgY6fyr6S=vOx+nFn=qcZ_WAaa# z3$h_bUz_E>FYav>YC}Qn=okfXqkVQ<(F^t|x*-+_R~K_ufO0uSbI2*WBM!~cQfY-` zG)4*h_fU&la!UPAM#7W1r_jR+U@h<}E=1p4dWvqj@>v25a^41KTH@{rp9Ma_ zT~6T_8f+?r5}~EI(|#wK%sw?Jr5-@-rKe~*IYrmWnWj$2P)DtZ=dyRvnz9nXhwjnP zQL?hqubd<)i5?JF3Oy_CCJ97~$dQ0{6YVT(M(QXHExr5txUyl_fP1QP*KmzKDx+<0 zMpGK-Lqld2uW;Oj7HWbXyd5pv6dNRWYmJJHT^$`=gE!SVYv8J>yF{&stHdeS%Nj+m>%?D9blDE6X=6 zl;xYw;h5~DhQBhxu&5F8Wjl#7k^a9tOFy9mWdqmMa}0P(B3E!;J-gs=DayB;R{qhh zPxjE}UisQ{VAn^r1y{ai^m?qTw(J+K{U6QH)@Kx4SKIzU{Ra2dHedM)Z_r@sD!qBJ z)gxEosm*)Y{Td4&N~0B;YrD|k9rYs)(Owcm?y<<1q!^8}!yIreM(c@|Jcf=GnB8fu zzoXT%p-ZYkz%5D2yRbO5kUkhIsYCUr^kMpFeU83V zpP{e8Ug}DHs=h#9qEE(d>U@1XkOE=bJr7;hde6(M*Z2x;oNdMDJ^dg0EPXC^d{)Cr zn-V9Gl5sbN?=l*}_AB%ZQ!yg+mSm^<7;Lw`rN6DeLtJW$^fpvqLvuVr+=I4rwAXx& zRPAm@3$3!_A?{B47Du^vk5=N=^dFs?stFz?H9AHBOaI)fFDWbp_{qSo4Wfv?lasd+;rTt zIC-Ci+l1SKTZ~(;&C}9xiIKab2G3jQ5AD?I=nKHJfOdK|ZS!pU@{Q@GH>Rb2U-`Y* zp)M;SJ?a>(i9?+^e@1?I(Oc?J2xU2M=NPiRecF@y~ z`{lx0GBRmMnx??dCf*4~8$B4IOao7U^zRt%@!+F>BhIm2tE^Ab%E}#`Roc;rG;OqN zbgUaW(loz*kP*$N(D}WV=D3P@aav7W8C*SFQ(P_eoC@5#;Xw{*wt_DY%UXL#dyeo= zD9hu}gC#TKrsG=SB>lCx@;HGZ&$V&a;i_r};V*k<7+EH3yR6ZUx#)oRaO+9)A@>tn z9mits`*}X7)pfkjeWX@_v|dMfbPrD7t2I;ps#c1;Q5NZ_NEk zXF6?+v>$O=e|@Ufz%dCL)3tl$S>h9CIPN8-Z;&^_p5XZnhrkq?I7F{X-4fL5l)L>M TFY+xfVRx(RcelDhU9bOtw|#`3 literal 0 HcmV?d00001 diff --git a/apps/connect/src/assets/fonts/Calibre-Semibold.otf b/apps/connect/src/assets/fonts/Calibre-Semibold.otf new file mode 100644 index 0000000000000000000000000000000000000000..b63ca3b7efa8af8aaff59b3295e4000840470ffe GIT binary patch literal 53916 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 literal 0 HcmV?d00001 diff --git a/apps/connect/src/assets/images/geo-logo-branded.svg b/apps/connect/src/assets/images/geo-logo-branded.svg new file mode 100644 index 00000000..f564dd27 --- /dev/null +++ b/apps/connect/src/assets/images/geo-logo-branded.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/apps/connect/src/assets/images/geo-logo-mono.svg b/apps/connect/src/assets/images/geo-logo-mono.svg new file mode 100644 index 00000000..35c6d071 --- /dev/null +++ b/apps/connect/src/assets/images/geo-logo-mono.svg @@ -0,0 +1,4 @@ + + + + diff --git a/apps/connect/src/components/create-space.tsx b/apps/connect/src/components/CreateSpaceCard.tsx similarity index 75% rename from apps/connect/src/components/create-space.tsx rename to apps/connect/src/components/CreateSpaceCard.tsx index 61c98257..e5494784 100644 --- a/apps/connect/src/components/create-space.tsx +++ b/apps/connect/src/components/CreateSpaceCard.tsx @@ -1,14 +1,15 @@ +import { Loading } from '@/components/ui/Loading'; +import { cn } from '@/lib/utils'; import { Key, type Messages, SpaceEvents, SpaceInfo, StoreConnect, Utils } from '@graphprotocol/hypergraph'; import { useIdentityToken } from '@privy-io/react-auth'; import { useQueryClient } from '@tanstack/react-query'; import { useSelector } from '@xstate/store/react'; import { Effect } from 'effect'; import { useState } from 'react'; -import { Spinner } from './spinner'; -import { Button } from './ui/button'; -import { Input } from './ui/input'; -export function CreateSpace() { +interface CreateSpaceCardProps extends Omit, 'children'> {} + +export function CreateSpaceCard({ className, ...props }: CreateSpaceCardProps) { const [isLoading, setIsLoading] = useState(false); const [spaceName, setSpaceName] = useState(''); const { identityToken } = useIdentityToken(); @@ -19,7 +20,11 @@ export function CreateSpace() { const createSpace = async () => { setIsLoading(true); if (!accountAddress || !keys || !identityToken) { - console.error('Missing required fields', { accountAddress, keys, identityToken }); + console.error('Missing required fields', { + accountAddress, + keys, + identityToken, + }); setIsLoading(false); return; } @@ -93,14 +98,21 @@ export function CreateSpace() { }; return ( -

- Create a new space -
- setSpaceName(e.target.value)} /> - -
+
+

Create a new space

+
+ setSpaceName(e.target.value)} + className="c-input grow" + /> + +
); } diff --git a/apps/connect/src/components/logout.tsx b/apps/connect/src/components/LogoutButton.tsx similarity index 56% rename from apps/connect/src/components/logout.tsx rename to apps/connect/src/components/LogoutButton.tsx index fec38a3c..5e19fc65 100644 --- a/apps/connect/src/components/logout.tsx +++ b/apps/connect/src/components/LogoutButton.tsx @@ -1,10 +1,9 @@ +import { Loading } from '@/components/ui/Loading'; import { usePrivy } from '@privy-io/react-auth'; import { useRouter } from '@tanstack/react-router'; -import { Loader2 } from 'lucide-react'; import { useState } from 'react'; -import { Button } from './ui/button'; -export function Logout() { +export function LogoutButton() { const { logout: privyLogout, ready, authenticated } = usePrivy(); const router = useRouter(); const [isLoading, setIsLoading] = useState(false); @@ -18,14 +17,14 @@ export function Logout() { }; return ( - + ); } diff --git a/apps/connect/src/components/SpacesCard.tsx b/apps/connect/src/components/SpacesCard.tsx new file mode 100644 index 00000000..f716dc7f --- /dev/null +++ b/apps/connect/src/components/SpacesCard.tsx @@ -0,0 +1,123 @@ +import { Loading } from '@/components/ui/Loading'; +import type { PrivateSpaceData } from '@/hooks/use-private-spaces'; +import type { PublicSpaceData } from '@/hooks/use-public-spaces'; +import { cn } from '@/lib/utils'; +import { Popover } from '@base-ui-components/react/popover'; + +interface SpacesCardProps extends Omit, 'children'> { + spaces: (PublicSpaceData | PrivateSpaceData)[]; + status?: 'loading' | { error: boolean | string } | undefined; +} + +export function SpacesCard({ spaces, status, className, ...props }: SpacesCardProps) { + const error = + typeof status === 'object' && 'error' in status + ? typeof status.error === 'boolean' + ? status.error + : status.error || true + : false; + return ( +
+

+ Spaces +

+
+ {(() => { + if (status === 'loading') { + return ; + } + if (error) { + return ( +

+ An error has occurred loading spaces{typeof error === 'string' ? `: ${error}` : ''} +

+ ); + } + if (spaces.length === 0) { + return ( +

+ No spaces found +

+ ); + } + return ( +
    + {spaces.map((space) => ( +
  • + + + {space.name || space.id} + + + + + + + + {!('apps' in space) ? ( + Public space + ) : space.apps.length === 0 ? ( + + No app has access to this private space + + ) : ( + <> + + Apps with access to this private space + + +
      + {space.apps.map((app) => ( +
    • {app.name || app.id}
    • + ))} +
    +
    + + )} +
    +
    +
    +
    +
  • + ))} +
+ ); + })()} +
+
+ ); +} + +function ArrowSvg(props: React.ComponentProps<'svg'>) { + return ( + + + + ); +} diff --git a/apps/connect/src/components/spaces.tsx b/apps/connect/src/components/spaces.tsx deleted file mode 100644 index f90a55fb..00000000 --- a/apps/connect/src/components/spaces.tsx +++ /dev/null @@ -1,29 +0,0 @@ -import { usePrivateSpaces } from '@/hooks/use-private-spaces'; - -export function Spaces() { - const { isPending, error, data } = usePrivateSpaces(); - - return ( -
-

Spaces

-
    - {!isPending && !error && data && data.length === 0 &&

    No spaces found

    } - {isPending &&

    Loading spaces …

    } - {error &&

    An error has occurred loading spaces: {error.message}

    } - {data?.map((space) => ( -
  • -

    {space.name}

    -

    Apps with access to this space

    -
      - {space.apps.map((app) => ( -
    • - {app.name} -
    • - ))} -
    -
  • - ))} -
-
- ); -} diff --git a/apps/connect/src/components/spinner.tsx b/apps/connect/src/components/spinner.tsx deleted file mode 100644 index d8484311..00000000 --- a/apps/connect/src/components/spinner.tsx +++ /dev/null @@ -1,42 +0,0 @@ -'use client'; - -import { cn } from '@/lib/utils'; -import { motion } from 'framer-motion'; - -interface SpinnerProps { - size?: 'sm' | 'md' | 'lg' | 'xl'; - color?: 'default' | 'primary' | 'secondary' | 'accent' | 'white'; - className?: string; -} - -export function Spinner({ size = 'md', color = 'primary', className }: SpinnerProps) { - const sizeClasses = { - sm: 'h-4 w-4 border-2', - md: 'h-6 w-6 border-2', - lg: 'h-8 w-8 border-3', - xl: 'h-12 w-12 border-4', - }; - - const colorClasses = { - default: 'border-muted-foreground/30 border-t-muted-foreground', - primary: 'border-primary/30 border-t-primary', - secondary: 'border-secondary/30 border-t-secondary', - accent: 'border-accent/30 border-t-accent', - white: 'border-white/30 border-t-white', - }; - - return ( - - Loading... - - ); -} diff --git a/apps/connect/src/components/ui/AppTitle.tsx b/apps/connect/src/components/ui/AppTitle.tsx new file mode 100644 index 00000000..c92b00c3 --- /dev/null +++ b/apps/connect/src/components/ui/AppTitle.tsx @@ -0,0 +1,16 @@ +'use client'; + +import { cn } from '@/lib/utils'; + +interface AppTitleProps extends Omit, 'children'> {} + +export function AppTitle({ className, ...props }: AppTitleProps) { + return ( +

+ Geo{' '} + + Connect + +

+ ); +} diff --git a/apps/connect/src/components/ui/Loading.tsx b/apps/connect/src/components/ui/Loading.tsx new file mode 100644 index 00000000..0614380f --- /dev/null +++ b/apps/connect/src/components/ui/Loading.tsx @@ -0,0 +1,24 @@ +'use client'; + +import { cn } from '@/lib/utils'; +import { Loader2 } from 'lucide-react'; + +interface LoadingProps extends React.HTMLAttributes { + /** @default false */ + hideLabel?: boolean; + /** @default 'Loading...' */ + children?: React.ReactNode; +} + +export function Loading({ hideLabel = false, className, children = 'Loading...', ...props }: LoadingProps) { + return ( +
+ + {children ?
{children}
: null} +
+ ); +} diff --git a/apps/connect/src/components/ui/avatar.tsx b/apps/connect/src/components/ui/avatar.tsx deleted file mode 100644 index c5f14c9a..00000000 --- a/apps/connect/src/components/ui/avatar.tsx +++ /dev/null @@ -1,38 +0,0 @@ -import * as AvatarPrimitive from '@radix-ui/react-avatar'; -import * as React from 'react'; - -import { cn } from '@/lib/utils'; - -const Avatar = React.forwardRef< - React.ElementRef, - React.ComponentPropsWithoutRef ->(({ className, ...props }, ref) => ( - -)); -Avatar.displayName = AvatarPrimitive.Root.displayName; - -const AvatarImage = React.forwardRef< - React.ElementRef, - React.ComponentPropsWithoutRef ->(({ className, ...props }, ref) => ( - -)); -AvatarImage.displayName = AvatarPrimitive.Image.displayName; - -const AvatarFallback = React.forwardRef< - React.ElementRef, - React.ComponentPropsWithoutRef ->(({ className, ...props }, ref) => ( - -)); -AvatarFallback.displayName = AvatarPrimitive.Fallback.displayName; - -export { Avatar, AvatarImage, AvatarFallback }; diff --git a/apps/connect/src/components/ui/button.tsx b/apps/connect/src/components/ui/button.tsx deleted file mode 100644 index 64c1083c..00000000 --- a/apps/connect/src/components/ui/button.tsx +++ /dev/null @@ -1,48 +0,0 @@ -import { Slot } from '@radix-ui/react-slot'; -import { type VariantProps, cva } from 'class-variance-authority'; -import * as React from 'react'; - -import { cn } from '@/lib/utils'; - -const buttonVariants = cva( - 'inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-hidden focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50', - { - variants: { - variant: { - default: 'bg-primary text-primary-foreground shadow-sm hover:bg-primary/90', - destructive: 'bg-destructive text-destructive-foreground shadow-xs hover:bg-destructive/90', - outline: 'border border-input bg-background shadow-xs hover:bg-accent hover:text-accent-foreground', - secondary: 'bg-secondary text-secondary-foreground shadow-xs hover:bg-secondary/80', - ghost: 'hover:bg-accent hover:text-accent-foreground', - link: 'text-primary underline-offset-4 hover:underline', - }, - size: { - default: 'h-9 px-4 py-2', - sm: 'h-8 rounded-md px-3 text-xs', - lg: 'h-10 rounded-md px-8', - icon: 'h-9 w-9', - }, - }, - defaultVariants: { - variant: 'default', - size: 'default', - }, - }, -); - -export interface ButtonProps - extends React.ButtonHTMLAttributes, - VariantProps { - asChild?: boolean; -} - -const Button = React.forwardRef( - ({ className, variant, size, asChild = false, ...props }, ref) => { - const Comp = asChild ? Slot : 'button'; - return ; - }, -); -Button.displayName = 'Button'; - -// eslint-disable-next-line react-refresh/only-export-components -export { Button, buttonVariants }; diff --git a/apps/connect/src/components/ui/card.tsx b/apps/connect/src/components/ui/card.tsx deleted file mode 100644 index bdba623a..00000000 --- a/apps/connect/src/components/ui/card.tsx +++ /dev/null @@ -1,43 +0,0 @@ -import * as React from 'react'; - -import { cn } from '@/lib/utils'; - -const Card = React.forwardRef>(({ className, ...props }, ref) => ( -
-)); -Card.displayName = 'Card'; - -const CardHeader = React.forwardRef>( - ({ className, ...props }, ref) => ( -
- ), -); -CardHeader.displayName = 'CardHeader'; - -const CardTitle = React.forwardRef>( - ({ className, ...props }, ref) => ( -

- ), -); -CardTitle.displayName = 'CardTitle'; - -const CardDescription = React.forwardRef>( - ({ className, ...props }, ref) => ( -

- ), -); -CardDescription.displayName = 'CardDescription'; - -const CardContent = React.forwardRef>( - ({ className, ...props }, ref) =>

, -); -CardContent.displayName = 'CardContent'; - -const CardFooter = React.forwardRef>( - ({ className, ...props }, ref) => ( -
- ), -); -CardFooter.displayName = 'CardFooter'; - -export { Card, CardHeader, CardFooter, CardTitle, CardDescription, CardContent }; diff --git a/apps/connect/src/components/ui/input.tsx b/apps/connect/src/components/ui/input.tsx deleted file mode 100644 index 5bbdf03e..00000000 --- a/apps/connect/src/components/ui/input.tsx +++ /dev/null @@ -1,23 +0,0 @@ -import * as React from 'react'; - -import { cn } from '@/lib/utils'; - -// eslint-disable-next-line @typescript-eslint/no-empty-object-type -export interface InputProps extends React.InputHTMLAttributes {} - -const Input = React.forwardRef(({ className, type, ...props }, ref) => { - return ( - - ); -}); -Input.displayName = 'Input'; - -export { Input }; diff --git a/apps/connect/src/components/ui/modal.tsx b/apps/connect/src/components/ui/modal.tsx deleted file mode 100644 index 508b9daf..00000000 --- a/apps/connect/src/components/ui/modal.tsx +++ /dev/null @@ -1,39 +0,0 @@ -import { useEffect } from 'react'; - -type ModalProps = { - isOpen: boolean; - onOpenChange: (open: boolean) => void; - children: React.ReactNode; -}; - -export function Modal({ isOpen, onOpenChange, children }: ModalProps) { - useEffect(() => { - const handleEsc = (event: KeyboardEvent) => { - if (event.key === 'Escape') { - onOpenChange(false); - } - }; - - if (isOpen) { - document.addEventListener('keydown', handleEsc); - document.body.style.overflow = 'hidden'; - } - - return () => { - document.removeEventListener('keydown', handleEsc); - document.body.style.overflow = 'unset'; - }; - }, [isOpen, onOpenChange]); - - if (!isOpen) return null; - - return ( -
- {/* biome-ignore lint/a11y/useKeyWithClickEvents: Modal has keyboard support via Escape key */} -
onOpenChange(false)} /> -
-
{children}
-
-
- ); -} diff --git a/apps/connect/src/css/_base.css b/apps/connect/src/css/_base.css new file mode 100644 index 00000000..3da498cf --- /dev/null +++ b/apps/connect/src/css/_base.css @@ -0,0 +1,38 @@ +@layer base { + *, + *::before, + *::after { + /* Prevent flex items from overflowing their containers */ + min-width: 0; + min-height: 0; + /* Make the inheritable text properties actually inherit on form controls */ + color: inherit; + font: inherit; + letter-spacing: inherit; + text-align: inherit; + text-transform: inherit; + /* Prevent weird outline color transition when `:focus-visible` is triggered */ + outline-color: var(--color-ring); + outline-width: 2px; + outline-offset: 2px; + &:focus-visible { + outline-style: solid; /* default is `auto`, which lets us customize the color but not the width, weirdly */ + } + } + + /* Prevent base styles (notably the `min-width` and `min-height` reset above) from affecting Privy dialogs */ + #privy-dialog { + &, + &::before, + &::after, + *, + *::before, + *::after { + all: revert-layer; + } + } + + body { + @apply bg-background text-foreground font-regular font-sans text-lg antialiased scheme-light-dark; + } +} diff --git a/apps/connect/src/css/_components.css b/apps/connect/src/css/_components.css new file mode 100644 index 00000000..6e4ee5ac --- /dev/null +++ b/apps/connect/src/css/_components.css @@ -0,0 +1,49 @@ +@utility c-link { + @apply text-primary hover:text-primary-hover font-semibold transition; +} + +@utility c-button { + @apply c-button--medium c-button--secondary flex max-w-full items-center justify-center gap-2 font-semibold transition disabled:opacity-25; +} +@utility c-button--small { + @apply min-h-10 rounded-md px-3 py-1.5 text-base; +} +@utility c-button--medium { + @apply min-h-12 rounded-lg px-4 py-2 text-lg; +} +@utility c-button--large { + @apply min-h-14 rounded-xl px-6 py-3 text-xl; +} +@utility c-button--primary { + @apply bg-primary text-primary-foreground not-disabled:hover:bg-primary-hover; +} +@utility c-button--secondary { + @apply bg-secondary text-secondary-foreground not-disabled:hover:bg-secondary-hover; +} + +@utility c-input { + @apply text-foreground font-regular placeholder:text-foreground/25 bg-background min-h-12 rounded-lg indent-3 text-lg inset-shadow-xs/15 -outline-offset-2 transition disabled:opacity-25; +} + +@utility c-card { + @apply c-card--medium bg-card max-w-full rounded-(--card-radius) p-(--card-padding); +} +@utility c-card--small { + @apply [--card-padding:theme(spacing.4)] [--card-radius:var(--radius-2xl)]; +} +@utility c-card--medium { + @apply [--card-padding:theme(spacing.8)] [--card-radius:var(--radius-3xl)]; +} +@utility c-card--large { + @apply [--card-padding:theme(spacing.12)] [--card-radius:var(--radius-4xl)]; +} +@utility c-card-title { + @apply text-foreground-muted mx-(--offset) mt-(--offset) mb-4 w-max max-w-[calc(100%-2*var(--offset))] rounded-[calc(var(--card-radius)-(1-var(--offset-ratio))*var(--card-padding))] px-4 py-2 text-lg leading-tight font-semibold [--offset-ratio:0.5] [--offset:calc(-1*var(--offset-ratio)*var(--card-padding))]; +} + +@utility c-popover { + @apply bg-popover text-popover-foreground origin-(--transform-origin) rounded-lg px-6 py-4 text-base shadow-xl transition outline-none data-[ending-style]:scale-90 data-[ending-style]:opacity-0 data-[starting-style]:scale-90 data-[starting-style]:opacity-0; +} +@utility c-popover-arrow { + @apply text-popover data-[side=bottom]:top-[calc(-1*theme(spacing.2))] data-[side=bottom]:rotate-180 data-[side=top]:bottom-[calc(-1*theme(spacing.2))]; +} diff --git a/apps/connect/src/css/_theme.css b/apps/connect/src/css/_theme.css new file mode 100644 index 00000000..43d69f4b --- /dev/null +++ b/apps/connect/src/css/_theme.css @@ -0,0 +1,62 @@ +@theme { + --breakpoint-xs: 32rem; + --breakpoint-2xs: 24rem; + --spacing-container: 1rem; + + --font-sans: 'Calibre', sans-serif; + + --font-weight-*: initial; + --font-weight-regular: 400; + --font-weight-semibold: 600; + --font-weight-bold: 700; + + --color-*: initial; + --color-transparent: transparent; + --color-white: #fff; + --color-black: #000; + --color-gray-100: #fbfbfb; + --color-gray-200: #f6f6f6; + --color-gray-300: #dbdbdb; + --color-gray-400: #bdbdbd; + --color-gray-500: #999; + --color-gray-600: #606060; + --color-gray-700: #424242; + --color-gray-800: #2a2b2e; + --color-gray-900: #1a1b1e; + --color-blue: #002fd9; + --color-purple: #6833ff; + --color-magenta: #fe31c5; + --color-violet-1: #c067ff; + --color-violet-2: #a931ff; + --color-peach-1: #ffe7c4; + --color-peach-2: #ffc2c2; + --color-lavender-1: #fe533d; + --color-lavender-2: #f320b8; + --color-lavender-3: #5b24f6; + --color-aqua-1: #bdefff; + --color-aqua-2: #b0d4ff; + --color-clearmint-1: #c4f1ff; + --color-clearmint-2: #b5ffb3; + --color-success-dark: #2ace9d; + --color-success-light: #d4f5eb; + --color-error-dark: #ff523a; + --color-error-light: #ffdad4; +} + +@theme inline { + --color-background: light-dark(var(--color-white), var(--color-gray-900)); + --color-foreground-light: var(--color-white); + --color-foreground-dark: var(--color-gray-800); + --color-foreground: light-dark(var(--color-foreground-dark), var(--color-foreground-light)); + --color-foreground-muted: light-dark(var(--color-gray-600), var(--color-gray-500)); + --color-primary: var(--color-purple); + --color-primary-hover: color-mix(in oklab, var(--color-primary) 90%, var(--color-white)); + --color-primary-foreground: var(--color-white); + --color-secondary: light-dark(var(--color-gray-300), var(--color-gray-700)); + --color-secondary-hover: color-mix(in oklab, var(--color-secondary) 80%, var(--color-white)); + --color-secondary-foreground: var(--color-foreground); + --color-card: light-dark(var(--color-gray-200), var(--color-gray-800)); + --color-ring: light-dark(var(--color-violet-1), var(--color-aqua-1)); + --color-popover: var(--color-gray-600); + --color-popover-foreground: var(--color-white); +} diff --git a/apps/connect/src/css/_utilities.css b/apps/connect/src/css/_utilities.css new file mode 100644 index 00000000..a37de602 --- /dev/null +++ b/apps/connect/src/css/_utilities.css @@ -0,0 +1,79 @@ +@utility bg-gradient-violet { + @apply from-violet-1 to-violet-2 text-foreground-light bg-linear-to-b; +} +@utility bg-gradient-peach { + @apply from-peach-1 to-peach-2 text-foreground-dark bg-linear-45; +} +@utility bg-gradient-lavender { + @apply from-lavender-1 to-lavender-3 via-lavender-2 text-foreground-light bg-linear-45; +} +@utility bg-gradient-aqua { + @apply from-aqua-1 to-aqua-2 text-foreground-dark bg-linear-to-l; +} +@utility bg-gradient-clearmint { + @apply from-clearmint-1 to-clearmint-2 text-foreground-dark bg-linear-45; +} + +@utility grid-cols-auto-fill-* { + grid-template-columns: repeat(auto-fill, minmax(min(--spacing(--value(integer)), 100%), 1fr)); + grid-template-columns: repeat(auto-fill, minmax(min(--value([percentage], [length]), 100%), 1fr)); +} + +@utility scrollbar-none { + scrollbar-width: none; + &::-webkit-scrollbar { + display: none; + } +} +@utility scrollbar-thin { + scrollbar-width: thin; + &::-webkit-scrollbar { + display: initial; + } +} +@utility scrollbar-auto { + scrollbar-width: auto; + &::-webkit-scrollbar { + display: initial; + } +} +@utility scroll-x { + overflow-x: auto; + animation-name: scroll-x; + animation-timing-function: linear; + animation-timeline: scroll(x self); + animation-range: 0 9999px; +} +@utility scroll-y { + overflow-y: auto; + animation-name: scroll-y; + animation-timing-function: linear; + animation-timeline: scroll(y self); + animation-range: 0 9999px; +} +@property --scroll-x { + syntax: ''; + inherits: true; + initial-value: 0; +} +@property --scroll-y { + syntax: ''; + inherits: true; + initial-value: 0; +} +@keyframes scroll-x { + from { + --scroll-x: 0; + } + to { + --scroll-x: 9999; + } +} +@keyframes scroll-y { + from { + --scroll-y: 0; + } + to { + --scroll-y: 9999; + } +} diff --git a/apps/connect/src/css/_variants.css b/apps/connect/src/css/_variants.css new file mode 100644 index 00000000..a955b7c3 --- /dev/null +++ b/apps/connect/src/css/_variants.css @@ -0,0 +1,4 @@ +/* Important variants */ +@custom-variant i (&:is(:is(:root, #i) *)); +@custom-variant ii (&:is(:is(:root, #i#i) *)); +@custom-variant iii (&:is(:is(:root, #i#i#i) *)); diff --git a/apps/connect/src/css/index.css b/apps/connect/src/css/index.css new file mode 100644 index 00000000..7887de34 --- /dev/null +++ b/apps/connect/src/css/index.css @@ -0,0 +1,7 @@ +@layer theme, base, components, utilities.xx-unimportant, utilities.x-unimportant, utilities.unimportant, utilities; +@import 'tailwindcss'; +@import './_theme.css'; +@import './_base.css'; +@import './_variants.css'; +@import './_utilities.css'; +@import './_components.css'; diff --git a/apps/connect/src/hooks/use-private-spaces.ts b/apps/connect/src/hooks/use-private-spaces.ts index ad4b3538..1460ac8c 100644 --- a/apps/connect/src/hooks/use-private-spaces.ts +++ b/apps/connect/src/hooks/use-private-spaces.ts @@ -3,7 +3,7 @@ import { Connect } from '@graphprotocol/hypergraph'; import { useIdentityToken } from '@privy-io/react-auth'; import { type UseQueryResult, useQuery } from '@tanstack/react-query'; -type SpaceData = { +export type PrivateSpaceData = { id: string; name: string; appIdentities: { address: string; appId: string }[]; @@ -16,10 +16,10 @@ type SpaceData = { }[]; }; -export const usePrivateSpaces = (): UseQueryResult => { +export const usePrivateSpaces = (): UseQueryResult => { const { identityToken } = useIdentityToken(); - return useQuery({ + return useQuery({ queryKey: ['private-spaces'], queryFn: async () => { if (!identityToken) return []; @@ -36,7 +36,7 @@ export const usePrivateSpaces = (): UseQueryResult => { } } const appInfo = await getAppInfoByIds(Array.from(appIds)); - const spaces = data.spaces.map((space: SpaceData) => { + const spaces = data.spaces.map((space: PrivateSpaceData) => { const spaceAppIds = new Set(); for (const appIdentity of space.appIdentities) { spaceAppIds.add(appIdentity.appId); diff --git a/apps/connect/src/hooks/use-public-spaces.ts b/apps/connect/src/hooks/use-public-spaces.ts index 399268c4..87bde7b8 100644 --- a/apps/connect/src/hooks/use-public-spaces.ts +++ b/apps/connect/src/hooks/use-public-spaces.ts @@ -3,19 +3,17 @@ import { type UseQueryResult, useQuery } from '@tanstack/react-query'; import { gql, request } from 'graphql-request'; const publicSpacesQueryDocument = gql` -query Spaces($accountAddress: String!) { - spaces(filter: { - member: { is: $accountAddress } - }) { - id - type - mainVotingAddress - personalAddress - entity { - name + query Spaces($accountAddress: String!) { + spaces(filter: { member: { is: $accountAddress } }) { + id + type + mainVotingAddress + personalAddress + entity { + name + } } } -} `; type SpaceQueryResult = { diff --git a/apps/connect/src/index.css b/apps/connect/src/index.css deleted file mode 100644 index a5b733f7..00000000 --- a/apps/connect/src/index.css +++ /dev/null @@ -1,129 +0,0 @@ -@import "tailwindcss"; - -@plugin 'tailwindcss-animate'; - -@source '../../../packages/hypergraph-react/src/**/*.{js,ts,jsx,tsx}'; - -@custom-variant dark (&:is(.dark *)); - -@theme { - --radius-lg: var(--radius); - --radius-md: calc(var(--radius) - 2px); - --radius-sm: calc(var(--radius) - 4px); - - --color-background: hsl(var(--background)); - --color-foreground: hsl(var(--foreground)); - - --color-card: hsl(var(--card)); - --color-card-foreground: hsl(var(--card-foreground)); - - --color-popover: hsl(var(--popover)); - --color-popover-foreground: hsl(var(--popover-foreground)); - - --color-primary: hsl(var(--primary)); - --color-primary-foreground: hsl(var(--primary-foreground)); - - --color-secondary: hsl(var(--secondary)); - --color-secondary-foreground: hsl(var(--secondary-foreground)); - - --color-muted: hsl(var(--muted)); - --color-muted-foreground: hsl(var(--muted-foreground)); - - --color-accent: hsl(var(--accent)); - --color-accent-foreground: hsl(var(--accent-foreground)); - - --color-destructive: hsl(var(--destructive)); - --color-destructive-foreground: hsl(var(--destructive-foreground)); - - --color-border: hsl(var(--border)); - --color-input: hsl(var(--input)); - --color-ring: hsl(var(--ring)); - - --color-chart-1: hsl(var(--chart-1)); - --color-chart-2: hsl(var(--chart-2)); - --color-chart-3: hsl(var(--chart-3)); - --color-chart-4: hsl(var(--chart-4)); - --color-chart-5: hsl(var(--chart-5)); -} - -/* - The default border color has changed to `currentcolor` in Tailwind CSS v4, - so we've added these compatibility styles to make sure everything still - looks the same as it did with Tailwind CSS v3. - - If we ever want to remove these styles, we need to add an explicit border - color utility to any element that depends on these defaults. -*/ -@layer base { - *, - ::after, - ::before, - ::backdrop, - ::file-selector-button { - border-color: var(--color-gray-200, currentcolor); - } -} - -@layer base { - :root { - --background: 0 0% 100%; - --foreground: 0 0% 3.9%; - --card: 0 0% 100%; - --card-foreground: 0 0% 3.9%; - --popover: 0 0% 100%; - --popover-foreground: 0 0% 3.9%; - --primary: 0 0% 9%; - --primary-foreground: 0 0% 98%; - --secondary: 0 0% 96.1%; - --secondary-foreground: 0 0% 9%; - --muted: 0 0% 96.1%; - --muted-foreground: 0 0% 45.1%; - --accent: 0 0% 96.1%; - --accent-foreground: 0 0% 9%; - --destructive: 0 84.2% 60.2%; - --destructive-foreground: 0 0% 98%; - --border: 0 0% 89.8%; - --input: 0 0% 89.8%; - --ring: 0 0% 3.9%; - --chart-1: 12 76% 61%; - --chart-2: 173 58% 39%; - --chart-3: 197 37% 24%; - --chart-4: 43 74% 66%; - --chart-5: 27 87% 67%; - --radius: 0.5rem; - } - .dark { - --background: 0 0% 3.9%; - --foreground: 0 0% 98%; - --card: 0 0% 3.9%; - --card-foreground: 0 0% 98%; - --popover: 0 0% 3.9%; - --popover-foreground: 0 0% 98%; - --primary: 0 0% 98%; - --primary-foreground: 0 0% 9%; - --secondary: 0 0% 14.9%; - --secondary-foreground: 0 0% 98%; - --muted: 0 0% 14.9%; - --muted-foreground: 0 0% 63.9%; - --accent: 0 0% 14.9%; - --accent-foreground: 0 0% 98%; - --destructive: 0 62.8% 30.6%; - --destructive-foreground: 0 0% 98%; - --border: 0 0% 14.9%; - --input: 0 0% 14.9%; - --ring: 0 0% 83.1%; - --chart-1: 220 70% 50%; - --chart-2: 160 60% 45%; - --chart-3: 30 80% 55%; - --chart-4: 280 65% 60%; - --chart-5: 340 75% 55%; - } -} -@layer base { - * { - @apply border-border; - } - body { - @apply bg-background text-foreground; - } -} diff --git a/apps/connect/src/main.tsx b/apps/connect/src/main.tsx index 0f1639cb..463659af 100644 --- a/apps/connect/src/main.tsx +++ b/apps/connect/src/main.tsx @@ -1,11 +1,13 @@ import { StrictMode } from 'react'; import { createRoot } from 'react-dom/client'; import { Boot } from './Boot.js'; -import './index.css'; + +import 'unfonts.css'; +import '@/css/index.css'; // biome-ignore lint/style/noNonNullAssertion: root element is always there createRoot(document.getElementById('root')!).render( - , + , ); diff --git a/apps/connect/src/routes/__root.tsx b/apps/connect/src/routes/__root.tsx index 7d04ed6e..b5b69b17 100644 --- a/apps/connect/src/routes/__root.tsx +++ b/apps/connect/src/routes/__root.tsx @@ -1,7 +1,9 @@ -import { Logout } from '@/components/logout'; +import GeoLogo from '@/assets/images/geo-logo-branded.svg?react'; +import { LogoutButton } from '@/components/LogoutButton'; +import { AppTitle } from '@/components/ui/AppTitle'; import { StoreConnect } from '@graphprotocol/hypergraph'; import { usePrivy } from '@privy-io/react-auth'; -import { Link, Outlet, createRootRoute, useLayoutEffect, useRouter } from '@tanstack/react-router'; +import { Outlet, createRootRoute, useLayoutEffect, useRouter } from '@tanstack/react-router'; import { TanStackRouterDevtools } from '@tanstack/router-devtools'; import { useSelector } from '@xstate/store/react'; @@ -27,41 +29,25 @@ export const Route = createRootRoute({ }, [authenticated, ready, accountAddress]); return ( - <> -
); }, }); diff --git a/apps/connect/src/routes/authenticate.tsx b/apps/connect/src/routes/authenticate.tsx index 2afca5d4..7358021c 100644 --- a/apps/connect/src/routes/authenticate.tsx +++ b/apps/connect/src/routes/authenticate.tsx @@ -1,7 +1,8 @@ -import { CreateSpace } from '@/components/create-space'; -import { Button } from '@/components/ui/button'; +import { CreateSpaceCard } from '@/components/CreateSpaceCard'; +import { SpacesCard } from '@/components/SpacesCard'; +import { Loading } from '@/components/ui/Loading'; import { usePrivateSpaces } from '@/hooks/use-private-spaces'; -import { type PublicSpaceData, usePublicSpaces } from '@/hooks/use-public-spaces'; +import { usePublicSpaces } from '@/hooks/use-public-spaces'; import { Connect, Identity, Key, type Messages, StoreConnect, Utils } from '@graphprotocol/hypergraph'; import { GEOGENESIS, GEO_TESTNET, getSmartAccountWalletClient } from '@graphprotocol/hypergraph/connect/smart-account'; import { useIdentityToken, usePrivy, useWallets } from '@privy-io/react-auth'; @@ -9,6 +10,7 @@ import { createFileRoute } from '@tanstack/react-router'; import { createStore } from '@xstate/store'; import { useSelector } from '@xstate/store/react'; import { Effect, Schema } from 'effect'; +import { TriangleAlert } from 'lucide-react'; import { useEffect } from 'react'; import { createWalletClient, custom } from 'viem'; @@ -513,83 +515,81 @@ function AuthenticateComponent() { }; return ( -
-
-

Authenticating with Geo Connect

- {state.step === 'fetching-app-identity' &&

Loading…

} - {state.step === 'error' &&

Error: {state.error}

} - {(state.step === 'selecting-spaces-existing-app-identity' || - state.step === 'selecting-spaces-new-app-identity') && ( -
-
- App Id -
{state.appInfo.appId ?? 'unknown'}
- Redirect: -
{state.appInfo.redirect ?? 'unknown'}
-
-

Spaces

-
    - {privateSpacesPending &&

    Loading private spaces …

    } - {privateSpacesError &&

    An error has occurred loading private spaces: {privateSpacesError.message}

    } - {!privateSpacesPending && !privateSpacesError && privateSpacesData?.length === 0 && ( -

    No private spaces found

    - )} - {privateSpacesData?.map((space) => ( -
  • - handlePrivateSpaceToggle(space.id, e.target.checked)} - className="w-4 h-4 text-blue-600 bg-gray-100 border-gray-300 rounded focus:ring-blue-500 focus:ring-2" +
    + {(() => { + switch (state.step) { + case 'fetching-app-identity': + return ( +
    + +
    + ); + case 'error': + return
    Error: {state.error}
    ; + case 'selecting-spaces-existing-app-identity': + case 'selecting-spaces-new-app-identity': + return ( +
    +
    +
    +

    A third-party application is requesting access to your personal Geo spaces.

    +
    +
    +
    App ID
    +
    {state.appInfo?.appId ?? 'unknown'}
    +
    +
    +
    Redirect URL
    +
    {state.appInfo?.redirect ?? 'unknown'}
    +
    +
    + {state.step !== 'selecting-spaces-existing-app-identity' ? ( +
    + + + {' '} + This is the first time you are authenticating with this app. Please verify the above information + before proceeding. +
    + ) : null} +
    + {state.step === 'selecting-spaces-new-app-identity' ? ( + + ) : ( + + )} +
    +
    + +
    + - -
  • - ))} -
-

Public Spaces

-
    - {publicSpacesPending &&

    Loading public spaces …

    } - {publicSpacesError &&

    An error has occurred loading public spaces: {publicSpacesError.message}

    } - {!publicSpacesPending && !publicSpacesError && publicSpacesData?.length === 0 && ( -

    No public spaces found

    - )} - {publicSpacesData?.map((space: PublicSpaceData) => ( -
  • - handlePublicSpaceToggle(space.id, e.target.checked)} - className="w-4 h-4 text-blue-600 bg-gray-100 border-gray-300 rounded focus:ring-blue-500 focus:ring-2" - /> - -
  • - ))} -
- -
- {state.step === 'selecting-spaces-new-app-identity' ? ( - - ) : ( - - )} -
-
- )} -
+
+
+ ); + } + })()}
); } diff --git a/apps/connect/src/routes/index.tsx b/apps/connect/src/routes/index.tsx index cfaf0399..bbff8d1e 100644 --- a/apps/connect/src/routes/index.tsx +++ b/apps/connect/src/routes/index.tsx @@ -1,7 +1,9 @@ +import { CreateSpaceCard } from '@/components/CreateSpaceCard'; +import { SpacesCard } from '@/components/SpacesCard'; +import { Loading } from '@/components/ui/Loading'; +import { usePrivateSpaces } from '@/hooks/use-private-spaces'; import { useIdentityToken } from '@privy-io/react-auth'; import { createFileRoute } from '@tanstack/react-router'; -import { CreateSpace } from '../components/create-space'; -import { Spaces } from '../components/spaces'; export const Route = createFileRoute('/')({ component: Index, @@ -9,15 +11,50 @@ export const Route = createFileRoute('/')({ function Index() { const { identityToken } = useIdentityToken(); + if (!identityToken) { - return
Loading…
; + return ( +
+
+ +
+
+ ); } + return ; +} + +function Authorized() { + const { isPending: privateSpacesPending, error: privateSpacesError, data: privateSpacesData } = usePrivateSpaces(); + return ( -
-

Welcome to Geo Connect

- - +
+
+
+ +
+ +
+

What is this?

+

+ Geo Connect allows you to create and manage personal{' '} + + Geo + {' '} + spaces, as well as authorize access to these spaces by third-party applications. +

+

+ Geo is a web3 browser built on top of a knowledge graph, where data is interconnected and verifiable. +

+
+
); } diff --git a/apps/connect/src/routes/login.lazy.tsx b/apps/connect/src/routes/login.lazy.tsx index fa39c47b..dd46b9db 100644 --- a/apps/connect/src/routes/login.lazy.tsx +++ b/apps/connect/src/routes/login.lazy.tsx @@ -1,4 +1,5 @@ -import { Button } from '@/components/ui/button'; +import GeoLogo from '@/assets/images/geo-logo-branded.svg?react'; +import { AppTitle } from '@/components/ui/AppTitle'; import { Connect, type Identity } from '@graphprotocol/hypergraph'; import { GEOGENESIS, GEO_TESTNET } from '@graphprotocol/hypergraph/connect/smart-account'; import { type ConnectedWallet, useIdentityToken, usePrivy, useWallets } from '@privy-io/react-auth'; @@ -60,7 +61,7 @@ function Login() { useEffect(() => { console.log('useEffect in login.lazy.tsx'); if ( - !hypergraphLoginStarted && // avoid re-running the effect to often + !hypergraphLoginStarted && // avoid re-running the effect too often privyAuthenticated && // privy must be authenticated to run it walletsReady && // wallets must be ready to run it wallets.length > 0 // wallets must have at least one wallet to run it @@ -96,17 +97,22 @@ function Login() { }, [privyAuthenticated, walletsReady, wallets, hypergraphLogin, navigate, hypergraphLoginStarted]); return ( -
-
- +
); diff --git a/apps/connect/src/vite-env.d.ts b/apps/connect/src/vite-env.d.ts index 11f02fe2..b1f45c78 100644 --- a/apps/connect/src/vite-env.d.ts +++ b/apps/connect/src/vite-env.d.ts @@ -1 +1,2 @@ /// +/// diff --git a/apps/connect/tsconfig.app.json b/apps/connect/tsconfig.app.json index 0ce5612c..f50fb4b8 100644 --- a/apps/connect/tsconfig.app.json +++ b/apps/connect/tsconfig.app.json @@ -28,7 +28,6 @@ "noUnusedParameters": true, "noFallthroughCasesInSwitch": true, - /* Shadcn */ "baseUrl": ".", "paths": { "@/*": ["./src/*"], diff --git a/apps/connect/tsconfig.json b/apps/connect/tsconfig.json index 1bfa43d4..de14d9e4 100644 --- a/apps/connect/tsconfig.json +++ b/apps/connect/tsconfig.json @@ -1,8 +1,5 @@ { "extends": "../../tsconfig.base.json", "include": [], - "references": [ - { "path": "./tsconfig.app.json" }, - { "path": "./tsconfig.node.json" } - ] + "references": [{ "path": "./tsconfig.app.json" }, { "path": "./tsconfig.node.json" }] } diff --git a/apps/connect/vite.config.ts b/apps/connect/vite.config.ts index cec60fe0..07033a64 100644 --- a/apps/connect/vite.config.ts +++ b/apps/connect/vite.config.ts @@ -2,14 +2,27 @@ import path from 'node:path'; import tailwindcss from '@tailwindcss/vite'; import { TanStackRouterVite } from '@tanstack/router-plugin/vite'; import react from '@vitejs/plugin-react'; +import unfonts from 'unplugin-fonts/vite'; import { defineConfig } from 'vite'; +import svgr from 'vite-plugin-svgr'; // https://vitejs.dev/config/ export default defineConfig({ server: { port: 5180, }, - plugins: [TanStackRouterVite(), react(), tailwindcss()], + plugins: [ + TanStackRouterVite(), + react(), + tailwindcss(), + unfonts({ + custom: { + display: 'swap', + families: { Calibre: { src: './src/assets/fonts/Calibre*' } }, + }, + }), + svgr(), + ], resolve: { alias: { '@': path.resolve(__dirname, './src'), diff --git a/biome.jsonc b/biome.jsonc index c890b0e5..f1b0e06c 100644 --- a/biome.jsonc +++ b/biome.jsonc @@ -15,7 +15,8 @@ "tsconfig.json", "tsconfig.*.json", "**/variant-schema.ts", - "apps/typesync/client/src/generated" + "apps/typesync/client/src/generated", + "*.css" ] }, "formatter": { @@ -35,11 +36,7 @@ }, "javascript": { "formatter": { - "enabled": true, "quoteStyle": "single", - "indentStyle": "space", - "indentWidth": 2, - "lineWidth": 120, "trailingCommas": "all" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e0f52550..f24d4824 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -38,6 +38,9 @@ importers: apps/connect: dependencies: + '@base-ui-components/react': + specifier: 1.0.0-beta.0 + version: 1.0.0-beta.0(@types/react@19.1.3)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@graphprotocol/hypergraph': specifier: workspace:* version: link:../../packages/hypergraph/publish @@ -47,15 +50,6 @@ importers: '@privy-io/react-auth': specifier: ^2.13.0 version: 2.13.0(@solana/web3.js@1.98.2(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.8.3)(utf-8-validate@5.0.10))(@types/react@19.1.3)(bs58@6.0.0)(bufferutil@4.0.9)(immer@9.0.21)(permissionless@0.2.47(ox@0.6.7(typescript@5.8.3)(zod@3.25.51))(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51)))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.8.3)(use-sync-external-store@1.5.0(react@19.1.0))(utf-8-validate@5.0.10)(zod@3.25.51) - '@radix-ui/react-avatar': - specifier: ^1.1.9 - version: 1.1.9(@types/react-dom@19.1.3(@types/react@19.1.3))(@types/react@19.1.3)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-icons': - specifier: ^1.3.2 - version: 1.3.2(react@19.1.0) - '@radix-ui/react-slot': - specifier: ^1.2.2 - version: 1.2.2(@types/react@19.1.3)(react@19.1.0) '@tanstack/react-query': specifier: ^5.75.5 version: 5.75.5(react@19.1.0) @@ -65,18 +59,12 @@ importers: '@xstate/store': specifier: ^3.5.1 version: 3.5.1(react@19.1.0)(solid-js@1.9.5) - class-variance-authority: - specifier: ^0.7.1 - version: 0.7.1 clsx: specifier: ^2.1.1 version: 2.1.1 effect: specifier: ^3.16.3 version: 3.16.3 - framer-motion: - specifier: ^12.10.1 - version: 12.10.1(@emotion/is-prop-valid@1.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) graphql-request: specifier: ^7.2.0 version: 7.2.0(graphql@16.11.0) @@ -92,9 +80,6 @@ importers: tailwind-merge: specifier: ^3.2.0 version: 3.2.0 - tailwindcss-animate: - specifier: ^1.0.7 - version: 1.0.7(tailwindcss@4.1.5) viem: specifier: ^2.30.6 version: 2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) @@ -103,8 +88,8 @@ importers: version: 6.3.5(@types/node@22.15.15)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.39.1)(tsx@4.19.4)(yaml@2.7.0) devDependencies: '@tailwindcss/vite': - specifier: ^4.1.5 - version: 4.1.5(vite@6.3.5(@types/node@22.15.15)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.39.1)(tsx@4.19.4)(yaml@2.7.0)) + specifier: ^4.1.10 + version: 4.1.10(vite@6.3.5(@types/node@22.15.15)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.39.1)(tsx@4.19.4)(yaml@2.7.0)) '@tanstack/router-devtools': specifier: ^1.120.2 version: 1.120.2(@tanstack/react-router@1.120.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(@tanstack/router-core@1.120.15)(csstype@3.1.3)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(tiny-invariant@1.3.3) @@ -123,9 +108,21 @@ importers: '@vitejs/plugin-react': specifier: ^4.4.1 version: 4.4.1(vite@6.3.5(@types/node@22.15.15)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.39.1)(tsx@4.19.4)(yaml@2.7.0)) + prettier: + specifier: ^3.6.0 + version: 3.6.0 + prettier-plugin-tailwindcss: + specifier: ^0.6.13 + version: 0.6.13(prettier@3.6.0) tailwindcss: - specifier: ^4.1.5 - version: 4.1.5 + specifier: ^4.1.10 + version: 4.1.10 + unplugin-fonts: + specifier: ^1.3.1 + version: 1.3.1(vite@6.3.5(@types/node@22.15.15)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.39.1)(tsx@4.19.4)(yaml@2.7.0)) + vite-plugin-svgr: + specifier: ^4.3.0 + version: 4.3.0(rollup@4.39.0)(typescript@5.8.3)(vite@6.3.5(@types/node@22.15.15)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.39.1)(tsx@4.19.4)(yaml@2.7.0)) apps/events: dependencies: @@ -176,7 +173,7 @@ importers: version: 7.1.2(graphql@16.11.0) isomorphic-ws: specifier: ^5.0.0 - version: 5.0.0(ws@8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + version: 5.0.0(ws@8.18.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)) lucide-react: specifier: ^0.508.0 version: 0.508.0(react@19.1.0) @@ -899,10 +896,6 @@ packages: resolution: {integrity: sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==} engines: {node: '>=6.9.0'} - '@babel/helper-string-parser@7.25.9': - resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} - engines: {node: '>=6.9.0'} - '@babel/helper-string-parser@7.27.1': resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} engines: {node: '>=6.9.0'} @@ -1588,18 +1581,21 @@ packages: resolution: {integrity: sha512-ZCYtZciz1IWJB4U61UPu4KEaqyfj+r5T1Q5mqPo+IBpcG9kHv30Z0aD8LXPgC1trYa6rK0orRyAhqUgk4MjmEg==} engines: {node: '>=6.9.0'} - '@babel/types@7.26.5': - resolution: {integrity: sha512-L6mZmwFDK6Cjh1nRCLXpa6no13ZIioJDz7mdkzHv399pThrTa/k0nUlNaenOeh2kWu/iaOQYElEpKPUswUa9Vg==} - engines: {node: '>=6.9.0'} - - '@babel/types@7.26.9': - resolution: {integrity: sha512-Y3IR1cRnOxOCDvMmNiym7XpXQ93iGDDPHx+Zj+NM+rg0fBaShfQLkg+hKPaZCEvg5N/LeCo4+Rj/i3FuJsIQaw==} - engines: {node: '>=6.9.0'} - '@babel/types@7.27.1': resolution: {integrity: sha512-+EzkxvLNfiUeKMgy/3luqfsCWFRXLb7U6wNQTk60tovuckwB15B191tJWvpp4HjiQWdJkCxO3Wbvc6jlk3Xb2Q==} engines: {node: '>=6.9.0'} + '@base-ui-components/react@1.0.0-beta.0': + resolution: {integrity: sha512-lPw5/40g/TbpSG1e1g4drl10kaSY2VBOFFQ9axmGhwPGqrQmTuW42jcUq/7OPdXQAyMakfWMWLSXyk3NXbRk+Q==} + engines: {node: '>=14.0.0'} + peerDependencies: + '@types/react': ^17 || ^18 || ^19 + react: ^17 || ^18 || ^19 + react-dom: ^17 || ^18 || ^19 + peerDependenciesMeta: + '@types/react': + optional: true + '@biomejs/biome@1.9.4': resolution: {integrity: sha512-1rkd7G70+o9KkTn5KLmDYXihGoTaIGO9PIIN2ZB7UJxFrWw04CZHPYiMRjYsaDvVV7hP1dYNRLxSANLaBFGpog==} engines: {node: '>=14.21.3'} @@ -2634,12 +2630,24 @@ packages: react: '>=16.8.0' react-dom: '>=16.8.0' + '@floating-ui/react-dom@2.1.3': + resolution: {integrity: sha512-huMBfiU9UnQ2oBwIhgzyIiSpVgvlDstU8CX0AF+wS+KzmYMs0J2a3GwuFHV1Lz+jlrQGeC1fF+Nv0QoumyV0bA==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + '@floating-ui/react@0.26.28': resolution: {integrity: sha512-yORQuuAtVpiRjpMhdc0wJj06b9JFjrYF4qp96j++v2NBpbi6SEGF7donUJ3TMieerQ6qVkAv1tgr7L4r5roTqw==} peerDependencies: react: '>=16.8.0' react-dom: '>=16.8.0' + '@floating-ui/react@0.27.12': + resolution: {integrity: sha512-kKlWNrpIQxF1B/a2MZvE0/uyKby4960yjO91W7nVyNKmmfNi62xU9HCjL1M1eWzx/LFj/VPSwJVbwQk9Pq/68A==} + peerDependencies: + react: '>=17.0.0' + react-dom: '>=17.0.0' + '@floating-ui/utils@0.2.9': resolution: {integrity: sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==} @@ -3881,6 +3889,15 @@ packages: '@rolldown/pluginutils@1.0.0-beta.9': resolution: {integrity: sha512-e9MeMtVWo186sgvFFJOPGy7/d2j2mZhLJIdVW0C/xDluuOvymEATqz6zKsP0ZmXGzQtqlyjz5sC1sYQUoJG98w==} + '@rollup/pluginutils@5.2.0': + resolution: {integrity: sha512-qWJ2ZTbmumwiLFomfzTyt5Kng4hwPi9rwCYN4SHb6eaRU1KNO4ccxINHr/VhH4GgPlt1XfSTLX2LBTme8ne4Zw==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + '@rollup/rollup-android-arm-eabi@4.39.0': resolution: {integrity: sha512-lGVys55Qb00Wvh8DMAocp5kIcaNzEFTmGhfFd88LfaogYTRKrdxgtlO5H6S49v2Nd8R2C6wLOal0qv6/kCkOwA==} cpu: [arm] @@ -4306,12 +4323,21 @@ packages: resolution: {integrity: sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==} engines: {node: '>=14.16'} + '@tailwindcss/node@4.1.10': + resolution: {integrity: sha512-2ACf1znY5fpRBwRhMgj9ZXvb2XZW8qs+oTfotJ2C5xR0/WNL7UHZ7zXl6s+rUqedL1mNi+0O+WQr5awGowS3PQ==} + '@tailwindcss/node@4.1.5': resolution: {integrity: sha512-CBhSWo0vLnWhXIvpD0qsPephiaUYfHUX3U9anwDaHZAeuGpTiB3XmsxPAN6qX7bFhipyGBqOa1QYQVVhkOUGxg==} '@tailwindcss/node@4.1.8': resolution: {integrity: sha512-OWwBsbC9BFAJelmnNcrKuf+bka2ZxCE2A4Ft53Tkg4uoiE67r/PMEYwCsourC26E+kmxfwE0hVzMdxqeW+xu7Q==} + '@tailwindcss/oxide-android-arm64@4.1.10': + resolution: {integrity: sha512-VGLazCoRQ7rtsCzThaI1UyDu/XRYVyH4/EWiaSX6tFglE+xZB5cvtC5Omt0OQ+FfiIVP98su16jDVHDEIuH4iQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [android] + '@tailwindcss/oxide-android-arm64@4.1.5': resolution: {integrity: sha512-LVvM0GirXHED02j7hSECm8l9GGJ1RfgpWCW+DRn5TvSaxVsv28gRtoL4aWKGnXqwvI3zu1GABeDNDVZeDPOQrw==} engines: {node: '>= 10'} @@ -4324,6 +4350,12 @@ packages: cpu: [arm64] os: [android] + '@tailwindcss/oxide-darwin-arm64@4.1.10': + resolution: {integrity: sha512-ZIFqvR1irX2yNjWJzKCqTCcHZbgkSkSkZKbRM3BPzhDL/18idA8uWCoopYA2CSDdSGFlDAxYdU2yBHwAwx8euQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + '@tailwindcss/oxide-darwin-arm64@4.1.5': resolution: {integrity: sha512-//TfCA3pNrgnw4rRJOqavW7XUk8gsg9ddi8cwcsWXp99tzdBAZW0WXrD8wDyNbqjW316Pk2hiN/NJx/KWHl8oA==} engines: {node: '>= 10'} @@ -4336,6 +4368,12 @@ packages: cpu: [arm64] os: [darwin] + '@tailwindcss/oxide-darwin-x64@4.1.10': + resolution: {integrity: sha512-eCA4zbIhWUFDXoamNztmS0MjXHSEJYlvATzWnRiTqJkcUteSjO94PoRHJy1Xbwp9bptjeIxxBHh+zBWFhttbrQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + '@tailwindcss/oxide-darwin-x64@4.1.5': resolution: {integrity: sha512-XQorp3Q6/WzRd9OalgHgaqgEbjP3qjHrlSUb5k1EuS1Z9NE9+BbzSORraO+ecW432cbCN7RVGGL/lSnHxcd+7Q==} engines: {node: '>= 10'} @@ -4348,6 +4386,12 @@ packages: cpu: [x64] os: [darwin] + '@tailwindcss/oxide-freebsd-x64@4.1.10': + resolution: {integrity: sha512-8/392Xu12R0cc93DpiJvNpJ4wYVSiciUlkiOHOSOQNH3adq9Gi/dtySK7dVQjXIOzlpSHjeCL89RUUI8/GTI6g==} + engines: {node: '>= 10'} + cpu: [x64] + os: [freebsd] + '@tailwindcss/oxide-freebsd-x64@4.1.5': resolution: {integrity: sha512-bPrLWbxo8gAo97ZmrCbOdtlz/Dkuy8NK97aFbVpkJ2nJ2Jo/rsCbu0TlGx8joCuA3q6vMWTSn01JY46iwG+clg==} engines: {node: '>= 10'} @@ -4360,6 +4404,12 @@ packages: cpu: [x64] os: [freebsd] + '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.10': + resolution: {integrity: sha512-t9rhmLT6EqeuPT+MXhWhlRYIMSfh5LZ6kBrC4FS6/+M1yXwfCtp24UumgCWOAJVyjQwG+lYva6wWZxrfvB+NhQ==} + engines: {node: '>= 10'} + cpu: [arm] + os: [linux] + '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.5': resolution: {integrity: sha512-1gtQJY9JzMAhgAfvd/ZaVOjh/Ju/nCoAsvOVJenWZfs05wb8zq+GOTnZALWGqKIYEtyNpCzvMk+ocGpxwdvaVg==} engines: {node: '>= 10'} @@ -4372,6 +4422,12 @@ packages: cpu: [arm] os: [linux] + '@tailwindcss/oxide-linux-arm64-gnu@4.1.10': + resolution: {integrity: sha512-3oWrlNlxLRxXejQ8zImzrVLuZ/9Z2SeKoLhtCu0hpo38hTO2iL86eFOu4sVR8cZc6n3z7eRXXqtHJECa6mFOvA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + '@tailwindcss/oxide-linux-arm64-gnu@4.1.5': resolution: {integrity: sha512-dtlaHU2v7MtdxBXoqhxwsWjav7oim7Whc6S9wq/i/uUMTWAzq/gijq1InSgn2yTnh43kR+SFvcSyEF0GCNu1PQ==} engines: {node: '>= 10'} @@ -4384,6 +4440,12 @@ packages: cpu: [arm64] os: [linux] + '@tailwindcss/oxide-linux-arm64-musl@4.1.10': + resolution: {integrity: sha512-saScU0cmWvg/Ez4gUmQWr9pvY9Kssxt+Xenfx1LG7LmqjcrvBnw4r9VjkFcqmbBb7GCBwYNcZi9X3/oMda9sqQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + '@tailwindcss/oxide-linux-arm64-musl@4.1.5': resolution: {integrity: sha512-fg0F6nAeYcJ3CriqDT1iVrqALMwD37+sLzXs8Rjy8Z1ZHshJoYceodfyUwGJEsQoTyWbliFNRs2wMQNXtT7MVA==} engines: {node: '>= 10'} @@ -4396,6 +4458,12 @@ packages: cpu: [arm64] os: [linux] + '@tailwindcss/oxide-linux-x64-gnu@4.1.10': + resolution: {integrity: sha512-/G3ao/ybV9YEEgAXeEg28dyH6gs1QG8tvdN9c2MNZdUXYBaIY/Gx0N6RlJzfLy/7Nkdok4kaxKPHKJUlAaoTdA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + '@tailwindcss/oxide-linux-x64-gnu@4.1.5': resolution: {integrity: sha512-SO+F2YEIAHa1AITwc8oPwMOWhgorPzzcbhWEb+4oLi953h45FklDmM8dPSZ7hNHpIk9p/SCZKUYn35t5fjGtHA==} engines: {node: '>= 10'} @@ -4408,6 +4476,12 @@ packages: cpu: [x64] os: [linux] + '@tailwindcss/oxide-linux-x64-musl@4.1.10': + resolution: {integrity: sha512-LNr7X8fTiKGRtQGOerSayc2pWJp/9ptRYAa4G+U+cjw9kJZvkopav1AQc5HHD+U364f71tZv6XamaHKgrIoVzA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + '@tailwindcss/oxide-linux-x64-musl@4.1.5': resolution: {integrity: sha512-6UbBBplywkk/R+PqqioskUeXfKcBht3KU7juTi1UszJLx0KPXUo10v2Ok04iBJIaDPkIFkUOVboXms5Yxvaz+g==} engines: {node: '>= 10'} @@ -4420,6 +4494,18 @@ packages: cpu: [x64] os: [linux] + '@tailwindcss/oxide-wasm32-wasi@4.1.10': + resolution: {integrity: sha512-d6ekQpopFQJAcIK2i7ZzWOYGZ+A6NzzvQ3ozBvWFdeyqfOZdYHU66g5yr+/HC4ipP1ZgWsqa80+ISNILk+ae/Q==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + bundledDependencies: + - '@napi-rs/wasm-runtime' + - '@emnapi/core' + - '@emnapi/runtime' + - '@tybys/wasm-util' + - '@emnapi/wasi-threads' + - tslib + '@tailwindcss/oxide-wasm32-wasi@4.1.5': resolution: {integrity: sha512-hwALf2K9FHuiXTPqmo1KeOb83fTRNbe9r/Ixv9ZNQ/R24yw8Ge1HOWDDgTdtzntIaIUJG5dfXCf4g9AD4RiyhQ==} engines: {node: '>=14.0.0'} @@ -4444,6 +4530,12 @@ packages: - '@emnapi/wasi-threads' - tslib + '@tailwindcss/oxide-win32-arm64-msvc@4.1.10': + resolution: {integrity: sha512-i1Iwg9gRbwNVOCYmnigWCCgow8nDWSFmeTUU5nbNx3rqbe4p0kRbEqLwLJbYZKmSSp23g4N6rCDmm7OuPBXhDA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + '@tailwindcss/oxide-win32-arm64-msvc@4.1.5': resolution: {integrity: sha512-oDKncffWzaovJbkuR7/OTNFRJQVdiw/n8HnzaCItrNQUeQgjy7oUiYpsm9HUBgpmvmDpSSbGaCa2Evzvk3eFmA==} engines: {node: '>= 10'} @@ -4456,6 +4548,12 @@ packages: cpu: [arm64] os: [win32] + '@tailwindcss/oxide-win32-x64-msvc@4.1.10': + resolution: {integrity: sha512-sGiJTjcBSfGq2DVRtaSljq5ZgZS2SDHSIfhOylkBvHVjwOsodBhnb3HdmiKkVuUGKD0I7G63abMOVaskj1KpOA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + '@tailwindcss/oxide-win32-x64-msvc@4.1.5': resolution: {integrity: sha512-WiR4dtyrFdbb+ov0LK+7XsFOsG+0xs0PKZKkt41KDn9jYpO7baE3bXiudPVkTqUEwNfiglCygQHl2jklvSBi7Q==} engines: {node: '>= 10'} @@ -4468,6 +4566,10 @@ packages: cpu: [x64] os: [win32] + '@tailwindcss/oxide@4.1.10': + resolution: {integrity: sha512-v0C43s7Pjw+B9w21htrQwuFObSkio2aV/qPx/mhrRldbqxbWJK6KizM+q7BF1/1CmuLqZqX3CeYF7s7P9fbA8Q==} + engines: {node: '>= 10'} + '@tailwindcss/oxide@4.1.5': resolution: {integrity: sha512-1n4br1znquEvyW/QuqMKQZlBen+jxAbvyduU87RS8R3tUSvByAkcaMTkJepNIrTlYhD+U25K4iiCIxE6BGdRYA==} engines: {node: '>= 10'} @@ -4476,6 +4578,11 @@ packages: resolution: {integrity: sha512-d7qvv9PsM5N3VNKhwVUhpK6r4h9wtLkJ6lz9ZY9aeZgrUWk1Z8VPyqyDT9MZlem7GTGseRQHkeB1j3tC7W1P+A==} engines: {node: '>= 10'} + '@tailwindcss/vite@4.1.10': + resolution: {integrity: sha512-QWnD5HDY2IADv+vYR82lOhqOlS1jSCUUAmfem52cXAhRTKxpDh3ARX8TTXJTCCO7Rv7cD2Nlekabv02bwP3a2A==} + peerDependencies: + vite: ^5.2.0 || ^6 + '@tailwindcss/vite@4.1.5': resolution: {integrity: sha512-FE1stRoqdHSb7RxesMfCXE8icwI1W6zGE/512ae3ZDrpkQYTTYeSyUJPRCjZd8CwVAhpDUbi1YR8pcZioFJQ/w==} peerDependencies: @@ -6592,6 +6699,9 @@ packages: estree-util-visit@2.0.0: resolution: {integrity: sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==} + estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + estree-walker@3.0.3: resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} @@ -9379,13 +9489,68 @@ packages: engines: {node: '>=10'} hasBin: true + prettier-plugin-tailwindcss@0.6.13: + resolution: {integrity: sha512-uQ0asli1+ic8xrrSmIOaElDu0FacR4x69GynTh2oZjFY10JUt6EEumTQl5tB4fMeD6I1naKd+4rXQQ7esT2i1g==} + engines: {node: '>=14.21.3'} + peerDependencies: + '@ianvs/prettier-plugin-sort-imports': '*' + '@prettier/plugin-pug': '*' + '@shopify/prettier-plugin-liquid': '*' + '@trivago/prettier-plugin-sort-imports': '*' + '@zackad/prettier-plugin-twig': '*' + prettier: ^3.0 + prettier-plugin-astro: '*' + prettier-plugin-css-order: '*' + prettier-plugin-import-sort: '*' + prettier-plugin-jsdoc: '*' + prettier-plugin-marko: '*' + prettier-plugin-multiline-arrays: '*' + prettier-plugin-organize-attributes: '*' + prettier-plugin-organize-imports: '*' + prettier-plugin-sort-imports: '*' + prettier-plugin-style-order: '*' + prettier-plugin-svelte: '*' + peerDependenciesMeta: + '@ianvs/prettier-plugin-sort-imports': + optional: true + '@prettier/plugin-pug': + optional: true + '@shopify/prettier-plugin-liquid': + optional: true + '@trivago/prettier-plugin-sort-imports': + optional: true + '@zackad/prettier-plugin-twig': + optional: true + prettier-plugin-astro: + optional: true + prettier-plugin-css-order: + optional: true + prettier-plugin-import-sort: + optional: true + prettier-plugin-jsdoc: + optional: true + prettier-plugin-marko: + optional: true + prettier-plugin-multiline-arrays: + optional: true + prettier-plugin-organize-attributes: + optional: true + prettier-plugin-organize-imports: + optional: true + prettier-plugin-sort-imports: + optional: true + prettier-plugin-style-order: + optional: true + prettier-plugin-svelte: + optional: true + prettier@2.8.8: resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} engines: {node: '>=10.13.0'} hasBin: true - prettier@3.5.1: - resolution: {integrity: sha512-hPpFQvHwL3Qv5AdRvBFMhnKo4tYxp0ReXiPn2bxkiohEX6mBeBwEpBSQTkD458RaaDKQMYSp4hX4UtfUTA5wDw==} + prettier@3.6.0: + resolution: {integrity: sha512-ujSB9uXHJKzM/2GBuE0hBOUgC77CN3Bnpqa+g80bkv3T3A93wL/xlzDATHhnhkzifz/UE2SNOvmbTz5hSkDlHw==} engines: {node: '>=14'} hasBin: true @@ -10407,6 +10572,9 @@ packages: peerDependencies: tailwindcss: '>=3.0.0 || insiders' + tailwindcss@4.1.10: + resolution: {integrity: sha512-P3nr6WkvKV/ONsTzj6Gb57sWPMX29EPNPopo7+FcpkQaNsrNpZ1pv8QmrYI2RqEKD7mlGqLnGovlcYnBK0IqUA==} + tailwindcss@4.1.5: resolution: {integrity: sha512-nYtSPfWGDiWgCkwQG/m+aX83XCwf62sBgg3bIlNiiOcggnS1x3uVRDAuyelBFL+vJdOPPCGElxv9DjHJjRHiVA==} @@ -10774,6 +10942,19 @@ packages: resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} engines: {node: '>= 0.8'} + unplugin-fonts@1.3.1: + resolution: {integrity: sha512-GmaJWPAWH6lBI4fP8xKdbMZJwTgsnr8PGJOfQE52jlod8QkqSO4M529Nox2L8zYapjB5hox2wCu4N3c/LOal/A==} + peerDependencies: + '@nuxt/kit': ^3.0.0 + vite: ^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 + peerDependenciesMeta: + '@nuxt/kit': + optional: true + + unplugin@2.0.0-beta.1: + resolution: {integrity: sha512-2qzQo5LN2DmUZXkWDHvGKLF5BP0WN+KthD6aPnPJ8plRBIjv4lh5O07eYcSxgO2znNw9s4MNhEO1sB+JDllDbQ==} + engines: {node: '>=18.12.0'} + unplugin@2.1.2: resolution: {integrity: sha512-Q3LU0e4zxKfRko1wMV2HmP8lB9KWislY7hxXpxd+lGx0PRInE4vhMBVEZwpdVYHvtqzhSrzuIfErsob6bQfCzw==} engines: {node: '>=18.12.0'} @@ -11013,6 +11194,11 @@ packages: engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true + vite-plugin-svgr@4.3.0: + resolution: {integrity: sha512-Jy9qLB2/PyWklpYy0xk0UU3TlU0t2UMpJXZvf+hWII1lAmRHrOUKi11Uw8N3rxoNk7atZNYO3pR3vI1f7oi+6w==} + peerDependencies: + vite: '>=2.6.0' + vite@6.3.5: resolution: {integrity: sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} @@ -11643,7 +11829,7 @@ snapshots: '@babel/generator@7.26.5': dependencies: '@babel/parser': 7.26.5 - '@babel/types': 7.26.5 + '@babel/types': 7.27.1 '@jridgewell/gen-mapping': 0.3.8 '@jridgewell/trace-mapping': 0.3.25 jsesc: 3.1.0 @@ -11651,7 +11837,7 @@ snapshots: '@babel/generator@7.26.9': dependencies: '@babel/parser': 7.26.9 - '@babel/types': 7.26.9 + '@babel/types': 7.27.1 '@jridgewell/gen-mapping': 0.3.8 '@jridgewell/trace-mapping': 0.3.25 jsesc: 3.1.0 @@ -11743,7 +11929,7 @@ snapshots: '@babel/helper-member-expression-to-functions@7.25.9': dependencies: '@babel/traverse': 7.26.9 - '@babel/types': 7.26.9 + '@babel/types': 7.27.1 transitivePeerDependencies: - supports-color @@ -11757,7 +11943,7 @@ snapshots: '@babel/helper-module-imports@7.25.9': dependencies: '@babel/traverse': 7.26.5 - '@babel/types': 7.26.5 + '@babel/types': 7.27.1 transitivePeerDependencies: - supports-color @@ -11788,7 +11974,7 @@ snapshots: '@babel/helper-optimise-call-expression@7.25.9': dependencies: - '@babel/types': 7.26.9 + '@babel/types': 7.27.1 '@babel/helper-optimise-call-expression@7.27.1': dependencies: @@ -11828,7 +12014,7 @@ snapshots: '@babel/helper-skip-transparent-expression-wrappers@7.25.9': dependencies: '@babel/traverse': 7.26.9 - '@babel/types': 7.26.9 + '@babel/types': 7.27.1 transitivePeerDependencies: - supports-color @@ -11839,8 +12025,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/helper-string-parser@7.25.9': {} - '@babel/helper-string-parser@7.27.1': {} '@babel/helper-validator-identifier@7.25.9': {} @@ -11866,11 +12050,11 @@ snapshots: '@babel/parser@7.26.5': dependencies: - '@babel/types': 7.26.5 + '@babel/types': 7.27.1 '@babel/parser@7.26.9': dependencies: - '@babel/types': 7.26.9 + '@babel/types': 7.27.1 '@babel/parser@7.27.1': dependencies: @@ -12376,7 +12560,7 @@ snapshots: '@babel/helper-module-imports': 7.25.9 '@babel/helper-plugin-utils': 7.26.5 '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.27.1) - '@babel/types': 7.26.9 + '@babel/types': 7.27.1 transitivePeerDependencies: - supports-color @@ -12620,13 +12804,13 @@ snapshots: dependencies: '@babel/code-frame': 7.26.2 '@babel/parser': 7.26.5 - '@babel/types': 7.26.5 + '@babel/types': 7.27.1 '@babel/template@7.26.9': dependencies: '@babel/code-frame': 7.26.2 '@babel/parser': 7.26.9 - '@babel/types': 7.26.9 + '@babel/types': 7.27.1 '@babel/template@7.27.1': dependencies: @@ -12640,7 +12824,7 @@ snapshots: '@babel/generator': 7.26.5 '@babel/parser': 7.26.5 '@babel/template': 7.25.9 - '@babel/types': 7.26.5 + '@babel/types': 7.27.1 debug: 4.4.0 globals: 11.12.0 transitivePeerDependencies: @@ -12670,21 +12854,22 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/types@7.26.5': - dependencies: - '@babel/helper-string-parser': 7.25.9 - '@babel/helper-validator-identifier': 7.25.9 - - '@babel/types@7.26.9': - dependencies: - '@babel/helper-string-parser': 7.25.9 - '@babel/helper-validator-identifier': 7.25.9 - '@babel/types@7.27.1': dependencies: '@babel/helper-string-parser': 7.27.1 '@babel/helper-validator-identifier': 7.27.1 + '@base-ui-components/react@1.0.0-beta.0(@types/react@19.1.3)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@babel/runtime': 7.27.1 + '@floating-ui/react': 0.27.12(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@floating-ui/utils': 0.2.9 + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + use-sync-external-store: 1.5.0(react@19.1.0) + optionalDependencies: + '@types/react': 19.1.3 + '@biomejs/biome@1.9.4': optionalDependencies: '@biomejs/cli-darwin-arm64': 1.9.4 @@ -14504,6 +14689,12 @@ snapshots: react: 19.1.0 react-dom: 19.1.0(react@19.1.0) + '@floating-ui/react-dom@2.1.3(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@floating-ui/dom': 1.6.13 + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + '@floating-ui/react@0.26.28(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: '@floating-ui/react-dom': 2.1.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0) @@ -14512,6 +14703,14 @@ snapshots: react-dom: 19.1.0(react@19.1.0) tabbable: 6.2.0 + '@floating-ui/react@0.27.12(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@floating-ui/react-dom': 2.1.3(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@floating-ui/utils': 0.2.9 + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + tabbable: 6.2.0 + '@floating-ui/utils@0.2.9': {} '@graphprotocol/grc-20@0.21.2(bufferutil@4.0.9)(graphql@16.11.0)(ox@0.6.7(typescript@5.8.3)(zod@3.25.51))(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51)': @@ -16326,6 +16525,14 @@ snapshots: '@rolldown/pluginutils@1.0.0-beta.9': {} + '@rollup/pluginutils@5.2.0(rollup@4.39.0)': + dependencies: + '@types/estree': 1.0.7 + estree-walker: 2.0.2 + picomatch: 4.0.2 + optionalDependencies: + rollup: 4.39.0 + '@rollup/rollup-android-arm-eabi@4.39.0': optional: true @@ -16771,6 +16978,16 @@ snapshots: dependencies: defer-to-connect: 2.0.1 + '@tailwindcss/node@4.1.10': + dependencies: + '@ampproject/remapping': 2.3.0 + enhanced-resolve: 5.18.1 + jiti: 2.4.2 + lightningcss: 1.30.1 + magic-string: 0.30.17 + source-map-js: 1.2.1 + tailwindcss: 4.1.10 + '@tailwindcss/node@4.1.5': dependencies: enhanced-resolve: 5.18.1 @@ -16788,78 +17005,132 @@ snapshots: source-map-js: 1.2.1 tailwindcss: 4.1.8 + '@tailwindcss/oxide-android-arm64@4.1.10': + optional: true + '@tailwindcss/oxide-android-arm64@4.1.5': optional: true '@tailwindcss/oxide-android-arm64@4.1.8': optional: true + '@tailwindcss/oxide-darwin-arm64@4.1.10': + optional: true + '@tailwindcss/oxide-darwin-arm64@4.1.5': optional: true '@tailwindcss/oxide-darwin-arm64@4.1.8': optional: true + '@tailwindcss/oxide-darwin-x64@4.1.10': + optional: true + '@tailwindcss/oxide-darwin-x64@4.1.5': optional: true '@tailwindcss/oxide-darwin-x64@4.1.8': optional: true + '@tailwindcss/oxide-freebsd-x64@4.1.10': + optional: true + '@tailwindcss/oxide-freebsd-x64@4.1.5': optional: true '@tailwindcss/oxide-freebsd-x64@4.1.8': optional: true + '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.10': + optional: true + '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.5': optional: true '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.8': optional: true + '@tailwindcss/oxide-linux-arm64-gnu@4.1.10': + optional: true + '@tailwindcss/oxide-linux-arm64-gnu@4.1.5': optional: true '@tailwindcss/oxide-linux-arm64-gnu@4.1.8': optional: true + '@tailwindcss/oxide-linux-arm64-musl@4.1.10': + optional: true + '@tailwindcss/oxide-linux-arm64-musl@4.1.5': optional: true '@tailwindcss/oxide-linux-arm64-musl@4.1.8': optional: true + '@tailwindcss/oxide-linux-x64-gnu@4.1.10': + optional: true + '@tailwindcss/oxide-linux-x64-gnu@4.1.5': optional: true '@tailwindcss/oxide-linux-x64-gnu@4.1.8': optional: true + '@tailwindcss/oxide-linux-x64-musl@4.1.10': + optional: true + '@tailwindcss/oxide-linux-x64-musl@4.1.5': optional: true '@tailwindcss/oxide-linux-x64-musl@4.1.8': optional: true + '@tailwindcss/oxide-wasm32-wasi@4.1.10': + optional: true + '@tailwindcss/oxide-wasm32-wasi@4.1.5': optional: true '@tailwindcss/oxide-wasm32-wasi@4.1.8': optional: true + '@tailwindcss/oxide-win32-arm64-msvc@4.1.10': + optional: true + '@tailwindcss/oxide-win32-arm64-msvc@4.1.5': optional: true '@tailwindcss/oxide-win32-arm64-msvc@4.1.8': optional: true + '@tailwindcss/oxide-win32-x64-msvc@4.1.10': + optional: true + '@tailwindcss/oxide-win32-x64-msvc@4.1.5': optional: true '@tailwindcss/oxide-win32-x64-msvc@4.1.8': optional: true + '@tailwindcss/oxide@4.1.10': + dependencies: + detect-libc: 2.0.4 + tar: 7.4.3 + optionalDependencies: + '@tailwindcss/oxide-android-arm64': 4.1.10 + '@tailwindcss/oxide-darwin-arm64': 4.1.10 + '@tailwindcss/oxide-darwin-x64': 4.1.10 + '@tailwindcss/oxide-freebsd-x64': 4.1.10 + '@tailwindcss/oxide-linux-arm-gnueabihf': 4.1.10 + '@tailwindcss/oxide-linux-arm64-gnu': 4.1.10 + '@tailwindcss/oxide-linux-arm64-musl': 4.1.10 + '@tailwindcss/oxide-linux-x64-gnu': 4.1.10 + '@tailwindcss/oxide-linux-x64-musl': 4.1.10 + '@tailwindcss/oxide-wasm32-wasi': 4.1.10 + '@tailwindcss/oxide-win32-arm64-msvc': 4.1.10 + '@tailwindcss/oxide-win32-x64-msvc': 4.1.10 + '@tailwindcss/oxide@4.1.5': optionalDependencies: '@tailwindcss/oxide-android-arm64': 4.1.5 @@ -16893,6 +17164,13 @@ snapshots: '@tailwindcss/oxide-win32-arm64-msvc': 4.1.8 '@tailwindcss/oxide-win32-x64-msvc': 4.1.8 + '@tailwindcss/vite@4.1.10(vite@6.3.5(@types/node@22.15.15)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.39.1)(tsx@4.19.4)(yaml@2.7.0))': + dependencies: + '@tailwindcss/node': 4.1.10 + '@tailwindcss/oxide': 4.1.10 + tailwindcss: 4.1.10 + vite: 6.3.5(@types/node@22.15.15)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.39.1)(tsx@4.19.4)(yaml@2.7.0) + '@tailwindcss/vite@4.1.5(vite@6.3.5(@types/node@22.15.15)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.39.1)(tsx@4.19.4)(yaml@2.7.0))': dependencies: '@tailwindcss/node': 4.1.5 @@ -17072,7 +17350,7 @@ snapshots: '@tanstack/router-generator@1.120.13(@tanstack/react-router@1.120.15(react-dom@19.1.0(react@19.1.0))(react@19.1.0))': dependencies: '@tanstack/virtual-file-routes': 1.115.0 - prettier: 3.5.1 + prettier: 3.6.0 tsx: 4.19.4 zod: 3.24.2 optionalDependencies: @@ -17081,7 +17359,7 @@ snapshots: '@tanstack/router-generator@1.120.2(@tanstack/react-router@1.120.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0))': dependencies: '@tanstack/virtual-file-routes': 1.115.0 - prettier: 3.5.1 + prettier: 3.6.0 tsx: 4.19.4 zod: 3.24.2 optionalDependencies: @@ -19705,6 +19983,8 @@ snapshots: '@types/estree-jsx': 1.0.5 '@types/unist': 3.0.3 + estree-walker@2.0.2: {} + estree-walker@3.0.3: dependencies: '@types/estree': 1.0.7 @@ -20876,6 +21156,10 @@ snapshots: dependencies: ws: 7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10) + isomorphic-ws@5.0.0(ws@8.18.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)): + dependencies: + ws: 8.18.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) + isomorphic-ws@5.0.0(ws@8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)): dependencies: ws: 8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10) @@ -21125,7 +21409,7 @@ snapshots: lightningcss@1.29.2: dependencies: - detect-libc: 2.0.3 + detect-libc: 2.0.4 optionalDependencies: lightningcss-darwin-arm64: 1.29.2 lightningcss-darwin-x64: 1.29.2 @@ -23001,9 +23285,13 @@ snapshots: tar-fs: 2.1.2 tunnel-agent: 0.6.0 + prettier-plugin-tailwindcss@0.6.13(prettier@3.6.0): + dependencies: + prettier: 3.6.0 + prettier@2.8.8: {} - prettier@3.5.1: {} + prettier@3.6.0: {} pretty-error@4.0.0: dependencies: @@ -24278,6 +24566,8 @@ snapshots: dependencies: tailwindcss: 4.1.5 + tailwindcss@4.1.10: {} + tailwindcss@4.1.5: {} tailwindcss@4.1.8: {} @@ -24635,6 +24925,17 @@ snapshots: unpipe@1.0.0: {} + unplugin-fonts@1.3.1(vite@6.3.5(@types/node@22.15.15)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.39.1)(tsx@4.19.4)(yaml@2.7.0)): + dependencies: + fast-glob: 3.3.3 + unplugin: 2.0.0-beta.1 + vite: 6.3.5(@types/node@22.15.15)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.39.1)(tsx@4.19.4)(yaml@2.7.0) + + unplugin@2.0.0-beta.1: + dependencies: + acorn: 8.14.0 + webpack-virtual-modules: 0.6.2 + unplugin@2.1.2: dependencies: acorn: 8.14.0 @@ -24895,6 +25196,17 @@ snapshots: - tsx - yaml + vite-plugin-svgr@4.3.0(rollup@4.39.0)(typescript@5.8.3)(vite@6.3.5(@types/node@22.15.15)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.39.1)(tsx@4.19.4)(yaml@2.7.0)): + dependencies: + '@rollup/pluginutils': 5.2.0(rollup@4.39.0) + '@svgr/core': 8.1.0(typescript@5.8.3) + '@svgr/plugin-jsx': 8.1.0(@svgr/core@8.1.0(typescript@5.8.3)) + vite: 6.3.5(@types/node@22.15.15)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.39.1)(tsx@4.19.4)(yaml@2.7.0) + transitivePeerDependencies: + - rollup + - supports-color + - typescript + vite@6.3.5(@types/node@22.15.15)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.39.1)(tsx@4.19.4)(yaml@2.7.0): dependencies: esbuild: 0.25.2 From 2b159776b736084e1ed5e2df057c9da948d612ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benoi=CC=82t=20Rouleau?= Date: Tue, 24 Jun 2025 17:54:07 -0400 Subject: [PATCH 2/2] Make space name required on the frontend --- apps/connect/src/components/CreateSpaceCard.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/connect/src/components/CreateSpaceCard.tsx b/apps/connect/src/components/CreateSpaceCard.tsx index e5494784..b472e47c 100644 --- a/apps/connect/src/components/CreateSpaceCard.tsx +++ b/apps/connect/src/components/CreateSpaceCard.tsx @@ -106,6 +106,7 @@ export function CreateSpaceCard({ className, ...props }: CreateSpaceCardProps) { placeholder="My cool space" value={spaceName} onChange={(e) => setSpaceName(e.target.value)} + required className="c-input grow" />