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 00000000..3a71e60c Binary files /dev/null and b/apps/connect/src/assets/fonts/Calibre-Bold.otf differ diff --git a/apps/connect/src/assets/fonts/Calibre-Medium.otf b/apps/connect/src/assets/fonts/Calibre-Medium.otf new file mode 100644 index 00000000..1bf48b92 Binary files /dev/null and b/apps/connect/src/assets/fonts/Calibre-Medium.otf differ 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 00000000..dee81385 Binary files /dev/null and b/apps/connect/src/assets/fonts/Calibre-Regular.otf differ 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 00000000..b63ca3b7 Binary files /dev/null and b/apps/connect/src/assets/fonts/Calibre-Semibold.otf differ 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..b472e47c 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,22 @@ export function CreateSpace() { }; return ( -
- Create a new space -
- setSpaceName(e.target.value)} /> - -
+
+

Create a new space

+
+ setSpaceName(e.target.value)} + required + 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 ( - <> -
-
- - Connect - - +
+ {authenticated ? ( +
+
+ + +
+
+ +
-
+ ) : null} +
+
- - -
-

© 2025 GeoBrowser. All rights reserved.

- -
-
- + +
); }, }); 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