@exegia/corpora-ui 0.13.0 → 0.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (29) hide show
  1. package/dist-lib/components/blocks/layout.d.ts +5 -0
  2. package/dist-lib/components/{agents → blocks/nav/sidebar}/ai-sidebar.d.ts +1 -1
  3. package/dist-lib/components/{agents → blocks/nav/sidebar}/sidebar-row.d.ts +1 -1
  4. package/dist-lib/components/blocks/shell/index.d.ts +2 -1
  5. package/dist-lib/components/blocks/shell/type.d.ts +1 -0
  6. package/dist-lib/index.d.ts +3 -1
  7. package/dist-lib/index.js +257 -260
  8. package/dist-lib/index.js.map +1 -1
  9. package/package.json +1 -1
  10. package/src/components/blocks/layout.ts +7 -0
  11. package/src/components/{agents → blocks/nav/sidebar}/ai-sidebar.tsx +13 -17
  12. package/src/components/{agents → blocks/nav/sidebar}/marquee-label.tsx +1 -1
  13. package/src/components/{agents → blocks/nav/sidebar}/sidebar-icon.tsx +1 -1
  14. package/src/components/{agents → blocks/nav/sidebar}/sidebar-row.tsx +4 -4
  15. package/src/components/{agents → blocks/nav/sidebar}/use-ai-sidebar.ts +2 -2
  16. package/src/components/{agents → blocks/nav/sidebar}/utils.ts +1 -1
  17. package/src/components/blocks/shell/index.ts +4 -1
  18. package/src/components/blocks/shell/type.ts +2 -22
  19. package/src/index.ts +3 -3
  20. /package/dist-lib/components/{agents → blocks/nav/sidebar}/__tests__/ai-sidebar.test.d.ts +0 -0
  21. /package/dist-lib/components/{agents → blocks/nav/sidebar}/index.d.ts +0 -0
  22. /package/dist-lib/components/{agents → blocks/nav/sidebar}/marquee-label.d.ts +0 -0
  23. /package/dist-lib/components/{agents → blocks/nav/sidebar}/sidebar-icon.d.ts +0 -0
  24. /package/dist-lib/components/{agents → blocks/nav/sidebar}/type.d.ts +0 -0
  25. /package/dist-lib/components/{agents → blocks/nav/sidebar}/use-ai-sidebar.d.ts +0 -0
  26. /package/dist-lib/components/{agents → blocks/nav/sidebar}/utils.d.ts +0 -0
  27. /package/src/components/{agents → blocks/nav/sidebar}/__tests__/ai-sidebar.test.tsx +0 -0
  28. /package/src/components/{agents → blocks/nav/sidebar}/index.ts +0 -0
  29. /package/src/components/{agents → blocks/nav/sidebar}/type.ts +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../src/lib/utils.ts","../src/components/ui/avatar.tsx","../src/components/ui/spinner.tsx","../src/components/ui/glasscn/liquid-glass.tsx","../src/lib/glass-variants.ts","../src/components/ui/button.tsx","../src/components/ui/card.tsx","../src/lib/sound.ts","../src/components/ui/checkbox.tsx","../src/components/ui/field.tsx","../src/components/ui/frame.tsx","../src/components/ui/input.tsx","../src/components/ui/textarea.tsx","../src/components/ui/input-group.tsx","../src/components/ui/label.tsx","../src/components/ui/menu.tsx","../src/components/ui/separator.tsx","../src/components/ui/otp-field.tsx","../src/components/ui/skeleton.tsx","../src/components/composed/password-input.tsx","../src/components/composed/social-providers.tsx","../src/components/composed/user-avatar.tsx","../src/lib/auth-accent.ts","../src/components/blocks/auth/auth-shell.tsx","../src/components/blocks/auth/code-auth-block.tsx","../src/components/blocks/auth/forgot-password-block.tsx","../src/components/blocks/auth/linked-accounts-block.tsx","../src/components/blocks/auth/login-block.tsx","../src/components/blocks/auth/onboarding/profile-step.tsx","../src/components/blocks/auth/onboarding-block.tsx","../src/components/blocks/auth/passkey-manager-block.tsx","../src/components/blocks/auth/passkey-sign-in-block.tsx","../src/components/blocks/auth/signup-block.tsx","../src/components/blocks/auth/update-password-block.tsx","../src/lib/ease.ts","../src/components/motion/shared-layout-bg.tsx","../src/components/motion/animated-sidebar.tsx","../src/components/blocks/nav/utils.ts","../src/components/blocks/nav/sidebar-nav-row.tsx","../src/components/blocks/nav/sidebar-block.tsx","../src/components/blocks/shell/utils.ts","../src/components/blocks/shell/shell-layout.tsx","../src/components/blocks/profile/profile-card-block.tsx","../src/components/agents/utils.ts","../src/components/agents/use-ai-sidebar.ts","../src/components/agents/sidebar-icon.tsx","../src/components/agents/marquee-label.tsx","../src/components/motion/popover-position.ts","../src/components/motion/popover-morph.tsx","../src/components/agents/sidebar-row.tsx","../src/components/agents/ai-sidebar.tsx","../src/components/agents/index.ts"],"sourcesContent":["import { clsx, type ClassValue } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n","\"use client\";\n\nimport { Avatar as AvatarPrimitive } from \"@base-ui/react/avatar\";\nimport type React from \"react\";\nimport { cn } from \"@/lib/utils\";\n\nexport function Avatar({\n className,\n ...props\n}: AvatarPrimitive.Root.Props): React.ReactElement {\n return (\n <AvatarPrimitive.Root\n className={cn(\n \"inline-flex size-8 shrink-0 select-none items-center justify-center overflow-hidden rounded-full bg-background align-middle font-medium text-xs\",\n className,\n )}\n data-slot=\"avatar\"\n {...props}\n />\n );\n}\n\nexport function AvatarImage({\n className,\n ...props\n}: AvatarPrimitive.Image.Props): React.ReactElement {\n return (\n <AvatarPrimitive.Image\n className={cn(\"size-full object-cover\", className)}\n data-slot=\"avatar-image\"\n {...props}\n />\n );\n}\n\nexport function AvatarFallback({\n className,\n ...props\n}: AvatarPrimitive.Fallback.Props): React.ReactElement {\n return (\n <AvatarPrimitive.Fallback\n className={cn(\n \"flex size-full items-center justify-center rounded-full bg-muted\",\n className,\n )}\n data-slot=\"avatar-fallback\"\n {...props}\n />\n );\n}\n\nexport { AvatarPrimitive };\n","import { Loader2Icon } from \"lucide-react\";\nimport type React from \"react\";\nimport { cn } from \"@/lib/utils\";\n\nexport function Spinner({\n className,\n ...props\n}: React.ComponentProps<typeof Loader2Icon>): React.ReactElement {\n return (\n <Loader2Icon\n aria-label=\"Loading\"\n className={cn(\"animate-spin\", className)}\n role=\"status\"\n {...props}\n />\n );\n}\n","\"use client\";\n\nimport {\n type CSSProperties,\n type HTMLAttributes,\n forwardRef,\n useCallback,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n} from \"react\";\n\nimport { cn } from \"@/lib/utils\";\n\ntype MapGeometry = {\n width: number; // element width, CSS px, integer\n height: number; // element height, CSS px, integer\n radius: number; // corner radius, CSS px, already clamped to min(width, height) / 2\n bezel: number; // fraction (0..1] of the half-min-dimension used as the refractive band\n};\n\nconst MAX_TEXTURE_SIZE = 480;\nconst EDGE_TAPER_PX = 1.25;\n\nconst displacementMapCache = new Map<string, string>();\n\n// CSS.supports(\"backdrop-filter\", \"url(#f)\") returns true in Safari and\n// Firefox (they parse the value) but neither browser actually renders SVG\n// filters through backdrop-filter. UA sniffing is the only reliable approach.\n// When WebKit ships support (track WebKit bug 245510), loosen this function.\nfunction supportsSvgBackdropFilter() {\n if (typeof navigator === \"undefined\") return false;\n const ua = navigator.userAgent;\n const isChromium = /Chrom(e|ium)/.test(ua) || /Edg\\//.test(ua);\n return isChromium && !/Firefox/.test(ua);\n}\n\n// NOTE: Per-corner radii and percentage radii are NOT supported. The map\n// reads only borderTopLeftRadius in px. If a future consumer needs\n// asymmetric corners, extend the corner SDF branch to accept four radii.\n//\n// NOTE: Map regeneration renders a ≤480 px texture and encodes a PNG for\n// each unique (width, height, radius, bezel). Continuously animating the\n// element's SIZE will thrash the cache; animate transform: scale instead.\nfunction createDisplacementMap({ width, height, radius, bezel }: MapGeometry) {\n const cacheKey = `${width}:${height}:${radius}:${bezel}`;\n const cached = displacementMapCache.get(cacheKey);\n if (cached !== undefined) return cached;\n\n const downscale = Math.min(1, MAX_TEXTURE_SIZE / Math.max(width, height));\n const texWidth = Math.max(2, Math.round(width * downscale));\n const texHeight = Math.max(2, Math.round(height * downscale));\n\n const canvas = document.createElement(\"canvas\");\n canvas.width = texWidth;\n canvas.height = texHeight;\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) return \"\";\n\n const image = ctx.createImageData(texWidth, texHeight);\n const data = image.data;\n const halfWidth = width / 2;\n const halfHeight = height / 2;\n const r = Math.min(radius, halfWidth, halfHeight);\n const bezelPx = Math.max(1, bezel * Math.min(halfWidth, halfHeight));\n\n for (let ty = 0; ty < texHeight; ty += 1) {\n for (let tx = 0; tx < texWidth; tx += 1) {\n // Texel center in element coordinates, origin at element center.\n const px = ((tx + 0.5) / texWidth) * width - halfWidth;\n const py = ((ty + 0.5) / texHeight) * height - halfHeight;\n\n // Signed distance + outward normal of the rounded-rectangle contour.\n const qx = Math.abs(px) - (halfWidth - r);\n const qy = Math.abs(py) - (halfHeight - r);\n let signedDistance: number;\n let dirX = 0;\n let dirY = 0;\n if (qx > 0 && qy > 0) {\n const len = Math.hypot(qx, qy);\n signedDistance = len - r;\n dirX = (Math.sign(px) * qx) / len;\n dirY = (Math.sign(py) * qy) / len;\n } else if (qx > qy) {\n signedDistance = qx - r;\n dirX = Math.sign(px);\n } else {\n signedDistance = qy - r;\n dirY = Math.sign(py);\n }\n\n const index = (ty * texWidth + tx) * 4;\n const inside = -signedDistance; // px from the contour, positive inside\n\n if (inside <= 0) {\n data[index] = 128;\n data[index + 1] = 128;\n data[index + 2] = 128;\n data[index + 3] = 255;\n continue;\n }\n\n const t = Math.min(1, inside / bezelPx); // 0 at the edge → 1 at the bezel's inner end\n let magnitude = 1 - convexSquircle(t); // max refraction at the edge, optically flat interior\n magnitude *= Math.min(1, inside / EDGE_TAPER_PX); // avoid sampling artifacts on the outermost pixels\n\n data[index] = Math.round(128 + dirX * magnitude * 127);\n data[index + 1] = Math.round(128 + dirY * magnitude * 127);\n data[index + 2] = 128;\n data[index + 3] = 255;\n }\n }\n\n ctx.putImageData(image, 0, 0);\n const mapUrl = canvas.toDataURL(\"image/png\");\n displacementMapCache.set(cacheKey, mapUrl);\n return mapUrl;\n}\n\nfunction convexSquircle(x: number) {\n return Math.pow(1 - Math.pow(1 - x, 4), 0.25);\n}\n\nexport type LiquidGlassProps = HTMLAttributes<HTMLDivElement> & {\n /** Extra blur mixed into the backdrop-filter after the SVG refraction. */\n blur?: number;\n /** SVG displacement strength. Higher values bend the sampled backdrop more. */\n refraction?: number;\n /**\n * @deprecated Texture size now derives from element size. Accepted for\n * backwards-compatibility but has no effect.\n */\n mapSize?: number;\n /** Fraction of the radius used as the curved edge where most refraction happens. */\n bezel?: number;\n /** Backdrop saturation. */\n saturation?: number;\n};\n\nexport const LiquidGlass = forwardRef<HTMLDivElement, LiquidGlassProps>(function LiquidGlass(\n {\n blur = 2,\n refraction = 15,\n mapSize: _mapSize,\n bezel = 0.34,\n saturation = 1.28,\n className,\n style,\n children,\n ...props\n },\n ref,\n) {\n const rawId = useId();\n const filterId = useMemo(() => `liquid-glass-${rawId.replace(/:/g, \"\")}`, [rawId]);\n console.log(_mapSize)\n // -------------------------------------------------------------------------\n // Ref merge — we need the DOM node to measure geometry while still\n // forwarding the ref to the consumer.\n // -------------------------------------------------------------------------\n\n const localRef = useRef<HTMLDivElement | null>(null);\n const setRefs = useCallback(\n (node: HTMLDivElement | null) => {\n localRef.current = node;\n if (typeof ref === \"function\") ref(node);\n else if (ref) ref.current = node;\n },\n [ref],\n );\n\n // -------------------------------------------------------------------------\n // Geometry measurement via ResizeObserver\n // -------------------------------------------------------------------------\n\n const [geometry, setGeometry] = useState<MapGeometry | null>(null);\n\n useEffect(() => {\n const el = localRef.current;\n if (!el) return;\n const measure = () => {\n const rect = el.getBoundingClientRect();\n const width = Math.round(rect.width);\n const height = Math.round(rect.height);\n if (!width || !height) return;\n const parsed = Number.parseFloat(getComputedStyle(el).borderTopLeftRadius);\n const radius = Math.min(Number.isFinite(parsed) ? parsed : Math.min(width, height) / 2, width / 2, height / 2);\n setGeometry((prev) =>\n prev && prev.width === width && prev.height === height && prev.radius === radius && prev.bezel === bezel\n ? prev\n : { width, height, radius, bezel },\n );\n };\n measure();\n const observer = new ResizeObserver(measure);\n observer.observe(el);\n return () => observer.disconnect();\n }, [bezel]);\n\n const mapUrl = useMemo(() => (geometry ? createDisplacementMap(geometry) : \"\"), [geometry]);\n\n // -------------------------------------------------------------------------\n // Browser capability gate\n //\n // Both SSR and the first client render take the fallback branch so hydration\n // never mismatches. The state is set in an effect (client-only).\n // -------------------------------------------------------------------------\n\n const [supported, setSupported] = useState(false);\n\n useEffect(() => {\n setSupported(supportsSvgBackdropFilter());\n }, []);\n\n const refractionActive = supported && mapUrl !== \"\";\n const backdropFilter = refractionActive\n ? `url(#${filterId}) blur(${blur}px) saturate(${saturation})`\n : `blur(${blur + 2}px) saturate(${saturation})`;\n\n return (\n <>\n <div\n ref={setRefs}\n className={cn(\n \"relative overflow-hidden rounded-full bg-white/[0.08]\",\n className,\n )}\n style={{ ...style, backdropFilter, WebkitBackdropFilter: backdropFilter } as CSSProperties}\n {...props}\n >\n {children}\n <span\n aria-hidden\n className=\"pointer-events-none absolute inset-0 rounded-[inherit]\"\n style={{\n // Rim thickness, overridable per-consumer via --liquid-glass-rim-width.\n padding: \"var(--liquid-glass-rim-width, 0.5px)\",\n background:\n // iOS 27 liquid-glass rim. Each gradient runs ALONG its edges and\n // fades to nothing at the corners, uniform in between:\n // - to right → white streak on the top + bottom runs\n // - to bottom → dark streak on the left + right runs\n // Streak colors are overridable per-consumer via the\n // --liquid-glass-rim-light / --liquid-glass-rim-dark variables;\n // --liquid-glass-rim-fade sets how far from each corner the\n // streak takes to reach full strength (smaller = longer streak).\n \"linear-gradient(to right, rgba(255,255,255,0), var(--liquid-glass-rim-light, rgba(255,255,255,0.25)) var(--liquid-glass-rim-fade, 18%), var(--liquid-glass-rim-light, rgba(255,255,255,0.25)) calc(100% - var(--liquid-glass-rim-fade, 18%)), rgba(255,255,255,0)), \" +\n \"linear-gradient(to bottom, rgba(0,0,0,0), var(--liquid-glass-rim-dark, rgba(0,0,0,0.2)) var(--liquid-glass-rim-fade, 18%), var(--liquid-glass-rim-dark, rgba(0,0,0,0.2)) calc(100% - var(--liquid-glass-rim-fade, 18%)), rgba(0,0,0,0))\",\n WebkitMask: \"linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0)\",\n WebkitMaskComposite: \"xor\",\n mask: \"linear-gradient(#000 0 0) content-box exclude, linear-gradient(#000 0 0)\",\n }}\n />\n </div>\n\n {refractionActive && (\n <svg className=\"absolute size-0 overflow-hidden\" aria-hidden>\n <filter id={filterId} x=\"0\" y=\"0\" width=\"100%\" height=\"100%\" colorInterpolationFilters=\"sRGB\">\n <feImage href={mapUrl} x=\"0\" y=\"0\" width=\"100%\" height=\"100%\" preserveAspectRatio=\"none\" result=\"map\" />\n <feDisplacementMap\n in=\"SourceGraphic\"\n in2=\"map\"\n scale={refraction}\n xChannelSelector=\"R\"\n yChannelSelector=\"G\"\n result=\"displaced\"\n />\n <feGaussianBlur in=\"displaced\" stdDeviation=\"0.15\" />\n </filter>\n </svg>\n )}\n </>\n );\n});\n","export type FrostGlassVariant = \"clear\" | \"frosted\" | \"subtle\" | \"liquid\" | \"liquid-refract\";\nexport type FrostGlassVariantProp = { glassVariant?: FrostGlassVariant };\n\nexport const liquidRefractStyles = \"bg-transparent border-0 shadow-none\";\n\nexport const glassVariantStyles: Record<FrostGlassVariant, string> = {\n clear: [\n \"backdrop-blur-[2px] backdrop-saturate-[1.9]\",\n \"bg-white/[0.25] dark:bg-black/[0.25]\",\n \"border border-white/[0.5] dark:border-white/[0.12]\",\n \"shadow-[0_1px_12px_rgba(0,0,0,0.05)] dark:shadow-[0_1px_12px_rgba(0,0,0,0.2)]\",\n ].join(\" \"),\n frosted: [\n \"backdrop-blur-[16px] backdrop-saturate-[1.6]\",\n \"bg-white/[0.55] dark:bg-black/[0.35]\",\n \"border border-white/[0.4] dark:border-white/10\",\n \"shadow-[0_2px_20px_rgba(0,0,0,0.06)] dark:shadow-[0_2px_20px_rgba(0,0,0,0.3)]\",\n ].join(\" \"),\n subtle: [\n \"backdrop-blur-[4px] backdrop-saturate-[1.5]\",\n \"bg-white/[0.3] dark:bg-white/[0.06]\",\n \"border border-black/[0.05] dark:border-white/[0.08]\",\n \"shadow-sm\",\n ].join(\" \"),\n liquid: [\n // 1) Refractive backdrop — lighter than frosted so the background reads\n // clearly through the lens; saturation + brightness lift makes it bloom.\n \"backdrop-blur-[12px] backdrop-saturate-[1.8] backdrop-brightness-[1.05]\",\n \"dark:backdrop-saturate-[1.6] dark:backdrop-brightness-[0.95]\",\n\n // 2) Base translucent fill (acts as the panel's \"tint\").\n \"bg-white/[0.10] dark:bg-white/[0.04]\",\n\n // 3) Layered radial-gradient sheen + warm bottom tint + vertical wash.\n // Underscores represent spaces inside Tailwind arbitrary values.\n \"[background-image:radial-gradient(120%_85%_at_15%_8%,rgba(255,255,255,0.55)_0%,rgba(255,255,255,0.18)_38%,rgba(255,255,255,0)_70%),radial-gradient(110%_80%_at_85%_100%,rgba(255,210,230,0.22)_0%,rgba(255,255,255,0)_60%),linear-gradient(180deg,rgba(255,255,255,0.28)_0%,rgba(255,255,255,0.12)_100%)]\",\n \"dark:[background-image:radial-gradient(120%_85%_at_15%_8%,rgba(255,255,255,0.18)_0%,rgba(255,255,255,0.05)_40%,rgba(255,255,255,0)_70%),radial-gradient(110%_80%_at_85%_100%,rgba(120,170,255,0.12)_0%,rgba(0,0,0,0)_60%),linear-gradient(180deg,rgba(255,255,255,0.06)_0%,rgba(0,0,0,0.18)_100%)]\",\n \"[background-size:200%_200%,180%_180%,100%_100%]\",\n \"[background-repeat:no-repeat]\",\n\n // 4) Multi-layer bevel:\n // - inset top hairline highlight (light-from-above)\n // - inset fish-eye glow at the bottom (lensing artifact)\n // - thin inset side rails\n // - outer contact shadow + broader halo (panel feels floating)\n \"shadow-[inset_0_1px_0_0_rgba(255,255,255,0.65),inset_0_-12px_24px_-10px_rgba(255,255,255,0.45),inset_1px_0_0_0_rgba(255,255,255,0.22),inset_-1px_0_0_0_rgba(255,255,255,0.18),0_24px_60px_-18px_rgba(15,23,42,0.30),0_8px_24px_-8px_rgba(15,23,42,0.18)]\",\n \"dark:shadow-[inset_0_1px_0_0_rgba(255,255,255,0.30),inset_0_-14px_28px_-10px_rgba(180,210,255,0.18),inset_1px_0_0_0_rgba(255,255,255,0.10),inset_-1px_0_0_0_rgba(255,255,255,0.08),0_28px_70px_-18px_rgba(0,0,0,0.55),0_10px_28px_-10px_rgba(0,0,0,0.40)]\",\n\n // 5) Hairline border for the chamfer's outer edge.\n \"border border-white/[0.45] dark:border-white/[0.10]\",\n\n // 6) Slow ambient drift; respects prefers-reduced-motion.\n \"animate-[liquid-drift_18s_ease-in-out_infinite] motion-reduce:animate-none\",\n \"[will-change:background-position]\",\n ].join(\" \"),\n \"liquid-refract\": \"\",\n};\n","\"use client\";\n\nimport { mergeProps } from \"@base-ui/react/merge-props\";\nimport { useRender } from \"@base-ui/react/use-render\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport type * as React from \"react\";\nimport { cn } from \"@/lib/utils\";\nimport { Spinner } from \"@/components/ui/spinner\";\nimport { LiquidGlass } from \"@/components/ui/glasscn/liquid-glass\";\nimport {\n type FrostGlassVariant,\n glassVariantStyles,\n liquidRefractStyles,\n} from \"@/lib/glass-variants\";\n\nexport const buttonVariants = cva(\n \"relative inline-flex shrink-0 cursor-pointer items-center justify-center gap-2 whitespace-nowrap rounded-lg border font-medium text-base outline-none transition-[scale,box-shadow,width,height,background-color,border-color] [transition-duration:150ms,150ms,300ms,300ms,150ms,150ms] ease-smooth-out active:scale-97 data-pressed:scale-97 motion-reduce:transition-none motion-reduce:active:scale-100 motion-reduce:data-pressed:scale-100 [&_svg]:transition-transform [&_svg]:duration-150 [&_svg]:ease-smooth-out motion-reduce:[&_svg]:transition-none before:pointer-events-none before:absolute before:inset-0 before:rounded-[calc(var(--radius-lg)-1px)] pointer-coarse:after:absolute pointer-coarse:after:size-full pointer-coarse:after:min-h-11 pointer-coarse:after:min-w-11 focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-1 focus-visible:ring-offset-background disabled:pointer-events-none disabled:opacity-64 data-loading:select-none sm:text-sm [&_svg:not([class*='opacity-'])]:opacity-80 [&_svg:not([class*='size-'])]:size-4.5 sm:[&_svg:not([class*='size-'])]:size-4 [&_svg]:pointer-events-none [&_svg]:-mx-0.5 [&_svg]:shrink-0\",\n {\n compoundVariants: [\n {\n // `link` is inline text, not a control surface: drop the button box so\n // it sits with the surrounding copy instead of riding high in a 32/36px\n // flex box. Both the bare and `sm:` heights have to be reset —\n // tailwind-merge keeps modifier-prefixed classes in a separate group,\n // so a call-site `h-auto` alone still loses to `sm:h-8`. border-0 makes\n // the inline box exactly one line-height so it doesn't grow the line.\n //\n // align-middle is the alignment that holds: an inline-flex box exposes\n // the baseline of its *first* flex item, which here is the always-\n // mounted loading indicator rather than the label, so plain baseline\n // alignment leaves the text ~3px high. `items-baseline` fixes that but\n // then hangs icons 3px above the label. Centering the box lands within\n // ~1px in every state without touching the loading-morph machinery.\n //\n // Icon sizes are excluded; they keep their square hit area.\n class: \"h-auto border-0 px-0 align-middle sm:h-auto\",\n size: [\"xs\", \"sm\", \"default\", \"lg\", \"xl\"],\n variant: \"link\",\n },\n ],\n defaultVariants: {\n size: \"default\",\n variant: \"default\",\n },\n variants: {\n size: {\n default: \"h-9 px-[calc(--spacing(3)-1px)] sm:h-8\",\n icon: \"size-9 sm:size-8\",\n \"icon-lg\": \"size-10 sm:size-9\",\n \"icon-sm\": \"size-8 sm:size-7\",\n \"icon-xl\":\n \"size-11 sm:size-10 [&_svg:not([class*='size-'])]:size-5 sm:[&_svg:not([class*='size-'])]:size-4.5\",\n \"icon-xs\":\n \"size-7 rounded-md before:rounded-[calc(var(--radius-md)-1px)] sm:size-6 not-in-data-[slot=input-group]:[&_svg:not([class*='size-'])]:size-4 sm:not-in-data-[slot=input-group]:[&_svg:not([class*='size-'])]:size-3.5\",\n lg: \"h-10 px-[calc(--spacing(3.5)-1px)] sm:h-9\",\n sm: \"h-8 gap-1.5 px-[calc(--spacing(2.5)-1px)] sm:h-7\",\n xl: \"h-11 px-[calc(--spacing(4)-1px)] text-lg sm:h-10 sm:text-base [&_svg:not([class*='size-'])]:size-5 sm:[&_svg:not([class*='size-'])]:size-4.5\",\n xs: \"h-7 gap-1 rounded-md px-[calc(--spacing(2)-1px)] text-sm before:rounded-[calc(var(--radius-md)-1px)] sm:h-6 sm:text-xs [&_svg:not([class*='size-'])]:size-4 sm:[&_svg:not([class*='size-'])]:size-3.5\",\n },\n variant: {\n default:\n \"not-disabled:inset-shadow-[0_1px_--theme(--color-white/16%)] border-primary bg-primary text-primary-foreground shadow-primary/24 shadow-xs hover:bg-primary/90 data-pressed:bg-primary/90 *:data-[slot=button-loading-indicator]:text-primary-foreground [:active,[data-pressed]]:inset-shadow-[0_1px_--theme(--color-black/8%)] [:disabled,:active,[data-pressed]]:shadow-none\",\n destructive:\n \"not-disabled:inset-shadow-[0_1px_--theme(--color-white/16%)] border-destructive bg-destructive text-white shadow-destructive/24 shadow-xs hover:bg-destructive/90 data-pressed:bg-destructive/90 *:data-[slot=button-loading-indicator]:text-white [:active,[data-pressed]]:inset-shadow-[0_1px_--theme(--color-black/8%)] [:disabled,:active,[data-pressed]]:shadow-none\",\n \"destructive-outline\":\n \"border-input bg-popover not-dark:bg-clip-padding text-destructive-foreground shadow-xs/5 not-disabled:not-active:not-data-pressed:before:shadow-[0_1px_--theme(--color-black/4%)] hover:border-destructive/32 hover:bg-destructive/4 data-pressed:border-destructive/32 data-pressed:bg-destructive/4 *:data-[slot=button-loading-indicator]:text-foreground dark:bg-input/32 dark:not-disabled:before:shadow-[0_-1px_--theme(--color-white/2%)] dark:not-disabled:not-active:not-data-pressed:before:shadow-[0_-1px_--theme(--color-white/6%)] [:disabled,:active,[data-pressed]]:shadow-none\",\n ghost:\n \"border-transparent text-foreground hover:bg-accent data-pressed:bg-accent *:data-[slot=button-loading-indicator]:text-foreground\",\n // Base for the glass treatment. The finish itself (blur, tint, bevel)\n // comes from glassVariantStyles keyed by the `glassVariant` prop,\n // which is only accepted when variant is \"glass\".\n glass:\n \"border-transparent text-foreground *:data-[slot=button-loading-indicator]:text-foreground\",\n link: \"border-transparent text-foreground underline-offset-4 hover:underline data-pressed:underline *:data-[slot=button-loading-indicator]:text-foreground\",\n outline:\n \"border-input bg-popover not-dark:bg-clip-padding text-foreground shadow-xs/5 not-disabled:not-active:not-data-pressed:before:shadow-[0_1px_--theme(--color-black/4%)] hover:bg-accent/50 data-pressed:bg-accent/50 *:data-[slot=button-loading-indicator]:text-foreground dark:bg-input/32 dark:data-pressed:bg-input/64 dark:hover:bg-input/64 dark:not-disabled:before:shadow-[0_-1px_--theme(--color-white/2%)] dark:not-disabled:not-active:not-data-pressed:before:shadow-[0_-1px_--theme(--color-white/6%)] [:disabled,:active,[data-pressed]]:shadow-none\",\n secondary:\n \"border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/90 data-pressed:bg-secondary/90 *:data-[slot=button-loading-indicator]:text-secondary-foreground [:active,[data-pressed]]:bg-secondary/80\",\n },\n },\n },\n);\n\ntype ButtonVariant = VariantProps<typeof buttonVariants>[\"variant\"];\n\ninterface ButtonBaseProps extends useRender.ComponentProps<\"button\"> {\n size?: VariantProps<typeof buttonVariants>[\"size\"];\n loading?: boolean;\n /**\n * Emit cuelume press/release attributes. Inert unless the app opts into\n * interaction sound by calling `bindSounds()` once.\n */\n sound?: boolean;\n}\n\nexport type ButtonProps = ButtonBaseProps &\n (\n | {\n variant: \"glass\";\n /** Glass finish. Only available when `variant` is \"glass\". */\n glassVariant?: FrostGlassVariant;\n }\n | {\n variant?: Exclude<ButtonVariant, \"glass\">;\n glassVariant?: never;\n }\n );\n\nexport function Button({\n className,\n variant,\n size,\n render,\n children,\n loading = false,\n disabled: disabledProp,\n glassVariant,\n sound = true,\n ...props\n}: ButtonProps): React.ReactElement {\n const isDisabled: boolean = Boolean(loading || disabledProp);\n const typeValue: React.ButtonHTMLAttributes<HTMLButtonElement>[\"type\"] =\n render ? undefined : \"button\";\n\n const resolvedGlassVariant: FrostGlassVariant | undefined =\n variant === \"glass\" ? (glassVariant ?? \"liquid-refract\") : undefined;\n const isLiquidRefract = resolvedGlassVariant === \"liquid-refract\";\n\n // Icon-only sizes overlay the spinner on top of the (hidden) icon; text\n // sizes keep the label visible and show the spinner inline before it.\n const isIconSize = (size ?? \"default\").startsWith(\"icon\");\n\n const defaultProps = {\n children: (\n <>\n {!isIconSize && (\n // Always mounted so the button width morphs as the slot collapses\n // and expands; the closed state cancels the flex gap (which varies\n // per size) with a matching negative margin.\n <span\n aria-hidden={loading ? undefined : true}\n data-slot=\"button-loading-indicator\"\n className={cn(\n \"pointer-events-none inline-flex shrink-0 items-center overflow-hidden transition-[max-width,margin-inline-start,opacity,filter] duration-300 ease-smooth-out motion-reduce:transition-none\",\n loading\n ? \"max-w-6\"\n : cn(\n \"max-w-0 opacity-0 blur-[2px]\",\n size === \"xs\" ? \"-ms-1\" : size === \"sm\" ? \"-ms-1.5\" : \"-ms-2\",\n ),\n )}\n >\n <Spinner className={loading ? undefined : \"animate-none\"} />\n </span>\n )}\n {children}\n {loading && isIconSize && (\n <Spinner\n className=\"pointer-events-none absolute\"\n data-slot=\"button-loading-indicator\"\n />\n )}\n </>\n ),\n className: cn(\n buttonVariants({ size, variant }),\n // Label + icon buttons: icons do a gentle scale bump on hover. The\n // class-based :not() skips the spinner (animate-spin / animate-none).\n !isIconSize &&\n \"hover:[&_svg:not([class*='animate-'])]:scale-110 motion-reduce:hover:[&_svg]:scale-100\",\n loading && isIconSize && \"data-loading:text-transparent\",\n resolvedGlassVariant && glassVariantStyles[resolvedGlassVariant],\n isLiquidRefract && liquidRefractStyles,\n className,\n ),\n \"aria-disabled\": loading || undefined,\n \"data-cuelume-press\": sound ? \"\" : undefined,\n \"data-cuelume-release\": sound ? \"\" : undefined,\n \"data-loading\": loading ? \"\" : undefined,\n \"data-glass-variant\": resolvedGlassVariant,\n \"data-slot\": \"button\",\n disabled: isDisabled,\n type: typeValue,\n };\n\n const element = useRender({\n defaultTagName: \"button\",\n props: mergeProps<\"button\">(defaultProps, props),\n render,\n });\n\n // liquid-refract delegates the finish to the LiquidGlass wrapper, which\n // renders the SVG-displacement backdrop behind an unstyled button.\n if (isLiquidRefract) {\n return <LiquidGlass>{element}</LiquidGlass>;\n }\n\n return element;\n}\n","\"use client\";\n\nimport { mergeProps } from \"@base-ui/react/merge-props\";\nimport { useRender } from \"@base-ui/react/use-render\";\nimport type React from \"react\";\nimport { cn } from \"@/lib/utils\";\n\nexport function Card({\n className,\n render,\n ...props\n}: useRender.ComponentProps<\"div\">): React.ReactElement {\n const defaultProps = {\n className: cn(\n \"relative flex flex-col rounded-2xl border bg-card not-dark:bg-clip-padding text-card-foreground shadow-xs/5 before:pointer-events-none before:absolute before:inset-0 before:rounded-[calc(var(--radius-2xl)-1px)] before:shadow-[0_1px_--theme(--color-black/4%)] dark:before:shadow-[0_-1px_--theme(--color-white/6%)]\",\n className,\n ),\n \"data-slot\": \"card\",\n };\n\n return useRender({\n defaultTagName: \"div\",\n props: mergeProps<\"div\">(defaultProps, props),\n render,\n });\n}\n\nexport function CardFrame({\n className,\n render,\n ...props\n}: useRender.ComponentProps<\"div\">): React.ReactElement {\n const defaultProps = {\n className: cn(\n \"relative flex flex-col rounded-2xl border bg-card not-dark:bg-clip-padding text-card-foreground shadow-xs/5 [--clip-bottom:-1rem] [--clip-top:-1rem] before:pointer-events-none before:absolute before:inset-0 before:rounded-[calc(var(--radius-2xl)-1px)] before:bg-muted/72 before:shadow-[0_1px_--theme(--color-black/4%)] has-data-[slot=table-container]:overflow-hidden *:data-[slot=card]:-m-px *:data-[slot=table-container]:-m-px *:data-[slot=table-container]:w-[calc(100%+2px)] *:not-first:data-[slot=card]:rounded-t-xl *:not-last:data-[slot=card]:rounded-b-xl *:data-[slot=card]:bg-clip-padding *:data-[slot=card]:shadow-none *:data-[slot=card]:before:hidden *:not-first:data-[slot=card]:before:rounded-t-[calc(var(--radius-xl)-1px)] *:not-last:data-[slot=card]:before:rounded-b-[calc(var(--radius-xl)-1px)] dark:before:shadow-[0_-1px_--theme(--color-white/6%)] *:data-[slot=card]:[clip-path:inset(var(--clip-top)_1px_var(--clip-bottom)_1px_round_calc(var(--radius-2xl)-1px))] *:data-[slot=card]:last:[--clip-bottom:1px] *:data-[slot=card]:first:[--clip-top:1px]\",\n className,\n ),\n \"data-slot\": \"card-frame\",\n };\n\n return useRender({\n defaultTagName: \"div\",\n props: mergeProps<\"div\">(defaultProps, props),\n render,\n });\n}\n\nexport function CardFrameHeader({\n className,\n render,\n ...props\n}: useRender.ComponentProps<\"div\">): React.ReactElement {\n const defaultProps = {\n className: cn(\n \"relative flex grid auto-rows-min grid-rows-[auto_auto] flex-col items-start gap-x-4 px-6 py-4 has-data-[slot=card-frame-action]:grid-cols-[1fr_auto]\",\n className,\n ),\n \"data-slot\": \"card-frame-header\",\n };\n\n return useRender({\n defaultTagName: \"div\",\n props: mergeProps<\"div\">(defaultProps, props),\n render,\n });\n}\n\nexport function CardFrameTitle({\n className,\n render,\n ...props\n}: useRender.ComponentProps<\"div\">): React.ReactElement {\n const defaultProps = {\n className: cn(\"self-center font-semibold text-sm\", className),\n \"data-slot\": \"card-frame-title\",\n };\n\n return useRender({\n defaultTagName: \"div\",\n props: mergeProps<\"div\">(defaultProps, props),\n render,\n });\n}\n\nexport function CardFrameDescription({\n className,\n render,\n ...props\n}: useRender.ComponentProps<\"div\">): React.ReactElement {\n const defaultProps = {\n className: cn(\"self-center text-muted-foreground text-sm\", className),\n \"data-slot\": \"card-frame-description\",\n };\n\n return useRender({\n defaultTagName: \"div\",\n props: mergeProps<\"div\">(defaultProps, props),\n render,\n });\n}\n\nexport function CardFrameAction({\n className,\n render,\n ...props\n}: useRender.ComponentProps<\"div\">): React.ReactElement {\n const defaultProps = {\n className: cn(\n \"col-start-2 nth-3:row-span-2 nth-3:row-start-1 inline-flex self-center justify-self-end\",\n className,\n ),\n \"data-slot\": \"card-frame-action\",\n };\n\n return useRender({\n defaultTagName: \"div\",\n props: mergeProps<\"div\">(defaultProps, props),\n render,\n });\n}\n\nexport function CardFrameFooter({\n className,\n render,\n ...props\n}: useRender.ComponentProps<\"div\">): React.ReactElement {\n const defaultProps = {\n className: cn(\"px-6 py-4\", className),\n \"data-slot\": \"card-frame-footer\",\n };\n\n return useRender({\n defaultTagName: \"div\",\n props: mergeProps<\"div\">(defaultProps, props),\n render,\n });\n}\n\nexport function CardHeader({\n className,\n render,\n ...props\n}: useRender.ComponentProps<\"div\">): React.ReactElement {\n const defaultProps = {\n className: cn(\n \"grid auto-rows-min grid-rows-[auto_auto] items-start gap-1.5 p-6 in-[[data-slot=card]:has(>[data-slot=card-panel])]:pb-4 has-data-[slot=card-action]:grid-cols-[1fr_auto]\",\n className,\n ),\n \"data-slot\": \"card-header\",\n };\n\n return useRender({\n defaultTagName: \"div\",\n props: mergeProps<\"div\">(defaultProps, props),\n render,\n });\n}\n\nexport function CardTitle({\n className,\n render,\n ...props\n}: useRender.ComponentProps<\"div\">): React.ReactElement {\n const defaultProps = {\n className: cn(\"font-heading font-semibold text-lg leading-none\", className),\n \"data-slot\": \"card-title\",\n };\n\n return useRender({\n defaultTagName: \"div\",\n props: mergeProps<\"div\">(defaultProps, props),\n render,\n });\n}\n\nexport function CardDescription({\n className,\n render,\n ...props\n}: useRender.ComponentProps<\"div\">): React.ReactElement {\n const defaultProps = {\n className: cn(\"text-muted-foreground text-sm\", className),\n \"data-slot\": \"card-description\",\n };\n\n return useRender({\n defaultTagName: \"div\",\n props: mergeProps<\"div\">(defaultProps, props),\n render,\n });\n}\n\nexport function CardAction({\n className,\n render,\n ...props\n}: useRender.ComponentProps<\"div\">): React.ReactElement {\n const defaultProps = {\n className: cn(\n \"col-start-2 row-span-2 row-start-1 inline-flex self-start justify-self-end\",\n className,\n ),\n \"data-slot\": \"card-action\",\n };\n\n return useRender({\n defaultTagName: \"div\",\n props: mergeProps<\"div\">(defaultProps, props),\n render,\n });\n}\n\nexport function CardPanel({\n className,\n render,\n ...props\n}: useRender.ComponentProps<\"div\">): React.ReactElement {\n const defaultProps = {\n className: cn(\n \"flex-1 p-6 in-[[data-slot=card]:has(>[data-slot=card-header]:not(.border-b))]:pt-0 in-[[data-slot=card]:has(>[data-slot=card-footer]:not(.border-t))]:pb-0\",\n className,\n ),\n \"data-slot\": \"card-panel\",\n };\n\n return useRender({\n defaultTagName: \"div\",\n props: mergeProps<\"div\">(defaultProps, props),\n render,\n });\n}\n\nexport function CardFooter({\n className,\n render,\n ...props\n}: useRender.ComponentProps<\"div\">): React.ReactElement {\n const defaultProps = {\n className: cn(\n \"flex items-center p-6 in-[[data-slot=card]:has(>[data-slot=card-panel])]:pt-4\",\n className,\n ),\n \"data-slot\": \"card-footer\",\n };\n\n return useRender({\n defaultTagName: \"div\",\n props: mergeProps<\"div\">(defaultProps, props),\n render,\n });\n}\n\nexport { CardPanel as CardContent };\n","/**\n * Interaction sound for the library, powered by cuelume (Web Audio synthesis,\n * zero runtime deps, SSR-safe).\n *\n * Components only emit inert `data-cuelume-*` attributes — nothing plays\n * until the consuming app opts in once:\n *\n * import { bindSounds } from \"@corpora/ui\"\n * bindSounds()\n *\n * The app owns preferences via setSoundEnabled / setSoundVolume.\n */\nimport { bind, play } from \"cuelume\";\nimport type { SoundName } from \"cuelume\";\n\nlet bound = false;\n\n/** Opt into interaction sound. Delegated and idempotent (see cuelume bind). */\nexport function bindSounds(root?: ParentNode): void {\n bound = true;\n bind(root);\n}\n\n/**\n * Imperative cue used by library components for keyboard-driven interactions\n * the data attributes can't cover (OTP typing, visibility toggles, …).\n * No-op until the app has opted in via bindSounds().\n */\nexport function playCue(name: SoundName, options?: { volume?: number }): void {\n if (bound) play(name, options);\n}\n\nexport {\n play as playSound,\n setEnabled as setSoundEnabled,\n setVolume as setSoundVolume,\n sounds,\n} from \"cuelume\";\nexport type { SoundName };\n","\"use client\";\n\nimport { Checkbox as CheckboxPrimitive } from \"@base-ui/react/checkbox\";\nimport type React from \"react\";\nimport { playCue } from \"@/lib/sound\";\nimport { cn } from \"@/lib/utils\";\n\nexport function Checkbox({\n className,\n sound = true,\n onCheckedChange,\n ...props\n}: CheckboxPrimitive.Root.Props & {\n /** Play the cuelume toggle cue on check/uncheck. Silent until bindSounds(). */\n sound?: boolean;\n}): React.ReactElement {\n return (\n <CheckboxPrimitive.Root\n // Cued off the state change rather than data-cuelume-toggle: Base UI\n // renders the native input as a *sibling* of this root, so a click on an\n // associated <label> never bubbles through an element carrying the\n // attribute and would toggle silently. This fires once for box clicks,\n // label clicks and keyboard Space alike, and not for programmatic changes.\n onCheckedChange={(checked, eventDetails) => {\n if (sound) playCue(\"toggle\");\n onCheckedChange?.(checked, eventDetails);\n }}\n className={cn(\n \"relative inline-flex size-4.5 shrink-0 cursor-pointer items-center justify-center rounded-[.25rem] border border-input bg-background not-dark:bg-clip-padding shadow-xs/5 outline-none ring-ring transition-shadow before:pointer-events-none before:absolute before:inset-0 before:rounded-[3px] not-data-disabled:not-data-checked:not-aria-invalid:before:shadow-[0_1px_--theme(--color-black/4%)] focus-visible:ring-2 focus-visible:ring-offset-1 focus-visible:ring-offset-background aria-invalid:border-destructive/36 focus-visible:aria-invalid:border-destructive/64 focus-visible:aria-invalid:ring-destructive/48 data-disabled:cursor-not-allowed data-disabled:opacity-64 sm:size-4 dark:not-data-checked:bg-input/32 dark:aria-invalid:ring-destructive/24 dark:not-data-disabled:not-data-checked:not-aria-invalid:before:shadow-[0_-1px_--theme(--color-white/6%)] [[data-disabled],[data-checked],[aria-invalid]]:shadow-none\",\n className,\n )}\n data-slot=\"checkbox\"\n {...props}\n >\n <CheckboxPrimitive.Indicator\n className=\"absolute -inset-px flex items-center justify-center rounded-[.25rem] text-primary-foreground data-unchecked:hidden data-checked:bg-primary data-indeterminate:text-foreground\"\n data-slot=\"checkbox-indicator\"\n render={(\n props: React.ComponentProps<\"span\">,\n state: CheckboxPrimitive.Indicator.State,\n ) => (\n <span {...props}>\n {state.indeterminate ? (\n <svg\n aria-hidden=\"true\"\n className=\"size-3.5 sm:size-3\"\n fill=\"none\"\n height=\"24\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"3\"\n viewBox=\"0 0 24 24\"\n width=\"24\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path d=\"M5.252 12h13.496\" />\n </svg>\n ) : (\n <svg\n aria-hidden=\"true\"\n className=\"size-3.5 sm:size-3\"\n fill=\"none\"\n height=\"24\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"3\"\n viewBox=\"0 0 24 24\"\n width=\"24\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path d=\"M5.252 12.7 10.2 18.63 18.748 5.37\" />\n </svg>\n )}\n </span>\n )}\n />\n </CheckboxPrimitive.Root>\n );\n}\n\nexport { CheckboxPrimitive };\n","\"use client\";\n\nimport { Field as FieldPrimitive } from \"@base-ui/react/field\";\nimport type React from \"react\";\nimport { cn } from \"@/lib/utils\";\n\nexport function Field({\n className,\n ...props\n}: FieldPrimitive.Root.Props): React.ReactElement {\n return (\n <FieldPrimitive.Root\n className={cn(\"flex flex-col items-start gap-2\", className)}\n data-slot=\"field\"\n {...props}\n />\n );\n}\n\nexport function FieldLabel({\n className,\n ...props\n}: FieldPrimitive.Label.Props): React.ReactElement {\n return (\n <FieldPrimitive.Label\n className={cn(\n \"inline-flex cursor-pointer items-center gap-2 font-medium text-base/4 text-foreground data-disabled:cursor-not-allowed data-disabled:opacity-64 sm:text-xs/3.5 ml-3\",\n className,\n )}\n data-slot=\"field-label\"\n {...props}\n />\n );\n}\n\nexport function FieldItem({\n className,\n ...props\n}: FieldPrimitive.Item.Props): React.ReactElement {\n return (\n <FieldPrimitive.Item\n className={cn(\"flex\", className)}\n data-slot=\"field-item\"\n {...props}\n />\n );\n}\n\nexport function FieldDescription({\n className,\n ...props\n}: FieldPrimitive.Description.Props): React.ReactElement {\n return (\n <FieldPrimitive.Description\n // Entrance morph when conditionally shown: height tweens from 0 via\n // interpolate-size (set on :root) plus a fade/blur rise. Removal is\n // unmount-instant; wrap in AnimatePresence when an exit is needed.\n className={cn(\n \"overflow-hidden text-muted-foreground text-xs transition-[height,opacity,filter,translate] duration-300 ease-smooth-out starting:h-0 starting:translate-y-1 starting:opacity-0 starting:blur-[2px] motion-reduce:transition-none\",\n className,\n )}\n data-slot=\"field-description\"\n {...props}\n />\n );\n}\n\nexport function FieldError({\n className,\n ...props\n}: FieldPrimitive.Error.Props): React.ReactElement {\n return (\n <FieldPrimitive.Error\n className={cn(\n \"overflow-hidden text-destructive-foreground text-xs transition-[height,opacity,filter,translate] duration-300 ease-smooth-out starting:h-0 starting:translate-y-1 starting:opacity-0 starting:blur-[2px] motion-reduce:transition-none\",\n className,\n )}\n data-slot=\"field-error\"\n {...props}\n />\n );\n}\n\nexport const FieldControl: typeof FieldPrimitive.Control =\n FieldPrimitive.Control;\nexport const FieldValidity: typeof FieldPrimitive.Validity =\n FieldPrimitive.Validity;\n\nexport { FieldPrimitive };\n","import type * as React from \"react\";\nimport { cn } from \"@/lib/utils\";\n\nexport function Frame({\n className,\n ...props\n}: React.ComponentProps<\"div\">): React.ReactElement {\n return (\n <div\n className={cn(\n \"relative flex flex-col rounded-2xl bg-muted/72 p-1\",\n \"*:[[data-slot=frame-panel]+[data-slot=frame-panel]]:mt-1\",\n className,\n )}\n data-slot=\"frame\"\n {...props}\n />\n );\n}\n\nexport function FramePanel({\n className,\n ...props\n}: React.ComponentProps<\"div\">): React.ReactElement {\n return (\n <div\n className={cn(\n \"relative rounded-xl border bg-background bg-clip-padding p-5 shadow-xs/5 before:pointer-events-none before:absolute before:inset-0 before:rounded-[calc(var(--radius-xl)-1px)] before:shadow-[0_1px_--theme(--color-black/4%)] dark:before:shadow-[0_-1px_--theme(--color-white/6%)]\",\n className,\n )}\n data-slot=\"frame-panel\"\n {...props}\n />\n );\n}\n\nexport function FrameHeader({\n className,\n ...props\n}: React.ComponentProps<\"header\">): React.ReactElement {\n return (\n <header\n className={cn(\"flex flex-col px-5 py-4\", className)}\n data-slot=\"frame-panel-header\"\n {...props}\n />\n );\n}\n\nexport function FrameTitle({\n className,\n ...props\n}: React.ComponentProps<\"div\">): React.ReactElement {\n return (\n <div\n className={cn(\"font-semibold text-sm\", className)}\n data-slot=\"frame-panel-title\"\n {...props}\n />\n );\n}\n\nexport function FrameDescription({\n className,\n ...props\n}: React.ComponentProps<\"div\">): React.ReactElement {\n return (\n <div\n className={cn(\"text-muted-foreground text-sm\", className)}\n data-slot=\"frame-panel-description\"\n {...props}\n />\n );\n}\n\nexport function FrameFooter({\n className,\n ...props\n}: React.ComponentProps<\"footer\">): React.ReactElement {\n return (\n <footer\n className={cn(\"px-5 py-4\", className)}\n data-slot=\"frame-panel-footer\"\n {...props}\n />\n );\n}\n","\"use client\";\n\nimport { Input as InputPrimitive } from \"@base-ui/react/input\";\nimport type * as React from \"react\";\nimport { cn } from \"@/lib/utils\";\n\nexport type InputProps = Omit<\n InputPrimitive.Props & React.RefAttributes<HTMLInputElement>,\n \"size\"\n> & {\n size?: \"sm\" | \"default\" | \"lg\" | number;\n unstyled?: boolean;\n nativeInput?: boolean;\n};\n\nexport function Input({\n className,\n size = \"default\",\n unstyled = false,\n nativeInput = false,\n style,\n ...props\n}: InputProps): React.ReactElement {\n const inputClassName = cn(\n // The 5000000s background-color entry is the autofill-flash suppression\n // hack; height/line-height/padding tween size-prop changes.\n \"h-8.5 w-full min-w-0 rounded-[inherit] px-[calc(--spacing(3)-1px)] leading-8.5 outline-none [transition:background-color_5000000s_ease-in-out_0s,height_300ms_var(--ease-smooth-out),line-height_300ms_var(--ease-smooth-out),padding_300ms_var(--ease-smooth-out),font-size_300ms_var(--ease-smooth-out)] placeholder:text-muted-foreground/72 motion-reduce:[transition:background-color_5000000s_ease-in-out_0s] sm:h-7.5 sm:leading-7.5\",\n size === \"sm\" &&\n \"h-7.5 px-[calc(--spacing(2.5)-1px)] leading-7.5 sm:h-6.5 sm:leading-6.5\",\n size === \"lg\" && \"h-9.5 leading-9.5 sm:h-8.5 sm:leading-8.5\",\n props.type === \"search\" &&\n \"[&::-webkit-search-cancel-button]:appearance-none [&::-webkit-search-decoration]:appearance-none [&::-webkit-search-results-button]:appearance-none [&::-webkit-search-results-decoration]:appearance-none\",\n props.type === \"file\" &&\n \"text-muted-foreground file:me-3 file:bg-transparent file:font-medium file:text-foreground file:text-sm\",\n );\n\n return (\n <span\n className={\n cn(\n !unstyled &&\n \"relative inline-flex w-full rounded-lg border border-input bg-background not-dark:bg-clip-padding text-base text-foreground shadow-xs/5 ring-ring/24 transition-[box-shadow,border-color] duration-150 ease-smooth-out has-aria-invalid:animate-input-shake motion-reduce:animate-none motion-reduce:transition-none before:pointer-events-none before:absolute before:inset-0 before:rounded-[calc(var(--radius-lg)-1px)] not-has-disabled:not-has-focus-visible:not-has-aria-invalid:before:shadow-[0_1px_--theme(--color-black/4%)] has-focus-visible:has-aria-invalid:border-destructive/64 has-focus-visible:has-aria-invalid:ring-destructive/16 has-aria-invalid:border-destructive/36 has-focus-visible:border-ring has-autofill:bg-foreground/4 has-disabled:opacity-64 has-[:disabled,:focus-visible,[aria-invalid]]:shadow-none has-focus-visible:ring-[3px] sm:text-sm dark:bg-input/32 dark:has-autofill:bg-foreground/8 dark:has-aria-invalid:ring-destructive/24 dark:not-has-disabled:not-has-focus-visible:not-has-aria-invalid:before:shadow-[0_-1px_--theme(--color-white/6%)]\",\n className,\n ) || undefined\n }\n data-size={size}\n data-slot=\"input-control\"\n >\n {nativeInput ? (\n <input\n className={inputClassName}\n data-slot=\"input\"\n size={typeof size === \"number\" ? size : undefined}\n style={typeof style === \"function\" ? undefined : style}\n {...props}\n />\n ) : (\n <InputPrimitive\n className={inputClassName}\n data-slot=\"input\"\n size={typeof size === \"number\" ? size : undefined}\n style={style}\n {...props}\n />\n )}\n </span>\n );\n}\n\nexport { InputPrimitive };\n","\"use client\";\n\nimport { Field as FieldPrimitive } from \"@base-ui/react/field\";\nimport { mergeProps } from \"@base-ui/react/merge-props\";\nimport type * as React from \"react\";\nimport { cn } from \"@/lib/utils\";\n\nexport type TextareaProps = React.ComponentPropsWithoutRef<\"textarea\"> &\n React.RefAttributes<HTMLTextAreaElement> & {\n size?: \"sm\" | \"default\" | \"lg\" | number;\n unstyled?: boolean;\n };\n\nexport function Textarea({\n className,\n size = \"default\",\n unstyled = false,\n ref,\n ...props\n}: TextareaProps): React.ReactElement {\n return (\n <span\n className={\n cn(\n !unstyled &&\n \"relative inline-flex w-full rounded-lg border border-input bg-background not-dark:bg-clip-padding text-base text-foreground shadow-xs/5 ring-ring/24 transition-shadow before:pointer-events-none before:absolute before:inset-0 before:rounded-[calc(var(--radius-lg)-1px)] has-focus-visible:has-aria-invalid:border-destructive/64 has-focus-visible:has-aria-invalid:ring-destructive/16 has-aria-invalid:border-destructive/36 has-focus-visible:border-ring has-disabled:opacity-64 has-[:disabled,:focus-visible,[aria-invalid]]:shadow-none has-focus-visible:ring-[3px] not-has-disabled:has-not-focus-visible:not-has-aria-invalid:before:shadow-[0_1px_--theme(--color-black/4%)] sm:text-sm dark:bg-input/32 dark:has-aria-invalid:ring-destructive/24 dark:not-has-disabled:has-not-focus-visible:not-has-aria-invalid:before:shadow-[0_-1px_--theme(--color-white/6%)]\",\n className,\n ) || undefined\n }\n data-size={size}\n data-slot=\"textarea-control\"\n >\n <FieldPrimitive.Control\n ref={ref}\n value={props.value}\n defaultValue={props.defaultValue}\n disabled={props.disabled}\n id={props.id}\n name={props.name}\n render={(defaultProps: React.ComponentProps<\"textarea\">) => (\n <textarea\n className={cn(\n \"field-sizing-content min-h-17.5 w-full rounded-[inherit] px-[calc(--spacing(3)-1px)] py-[calc(--spacing(1.5)-1px)] outline-none max-sm:min-h-20.5\",\n size === \"sm\" &&\n \"min-h-16.5 px-[calc(--spacing(2.5)-1px)] py-[calc(--spacing(1)-1px)] max-sm:min-h-19.5\",\n size === \"lg\" &&\n \"min-h-18.5 py-[calc(--spacing(2)-1px)] max-sm:min-h-21.5\",\n )}\n data-slot=\"textarea\"\n {...mergeProps(defaultProps, props)}\n />\n )}\n />\n </span>\n );\n}\n\nexport { FieldPrimitive };\n","\"use client\";\n\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport type * as React from \"react\";\nimport { cn } from \"@/lib/utils\";\nimport { Input, type InputProps } from \"@/components/ui/input\";\nimport { Textarea, type TextareaProps } from \"@/components/ui/textarea\";\n\nconst inputGroupAddonVariants = cva(\n \"flex h-auto cursor-text select-none items-center justify-center gap-2 leading-none [&>kbd]:rounded-[calc(var(--radius)-5px)] in-[[data-slot=input-group]:has([data-slot=input-control],[data-slot=textarea-control])]:[&_svg:not([class*='size-'])]:size-4.5 sm:in-[[data-slot=input-group]:has([data-slot=input-control],[data-slot=textarea-control])]:[&_svg:not([class*='size-'])]:size-4 [&_svg]:-mx-0.5 not-has-[button]:**:[svg:not([class*='opacity-'])]:opacity-80\",\n {\n defaultVariants: {\n align: \"inline-start\",\n },\n variants: {\n align: {\n \"block-end\":\n \"order-last w-full justify-start px-[calc(--spacing(3)-1px)] pb-[calc(--spacing(3)-1px)] [.border-t]:pt-[calc(--spacing(3)-1px)] [[data-size=sm]+&]:px-[calc(--spacing(2.5)-1px)]\",\n \"block-start\":\n \"order-first w-full justify-start px-[calc(--spacing(3)-1px)] pt-[calc(--spacing(3)-1px)] [.border-b]:pb-[calc(--spacing(3)-1px)] [[data-size=sm]+&]:px-[calc(--spacing(2.5)-1px)]\",\n \"inline-end\":\n \"order-last pe-[calc(--spacing(3)-1px)] has-[>:last-child[data-slot=badge]]:-me-1.5 has-[>button]:-me-2 has-[>kbd:last-child]:me-[-0.35rem] [[data-size=sm]+&]:pe-[calc(--spacing(2.5)-1px)]\",\n \"inline-start\":\n \"order-first ps-[calc(--spacing(3)-1px)] has-[>:last-child[data-slot=badge]]:-ms-1.5 has-[>button]:-ms-2 has-[>kbd:last-child]:ms-[-0.35rem] [[data-size=sm]+&]:ps-[calc(--spacing(2.5)-1px)]\",\n },\n },\n },\n);\n\nexport function InputGroup({\n className,\n ...props\n}: React.ComponentProps<\"div\">): React.ReactElement {\n return (\n <div\n className={cn(\n \"relative inline-flex w-full min-w-0 items-center rounded-lg border border-input bg-background not-dark:bg-clip-padding text-base text-foreground shadow-xs/5 ring-ring/24 transition-shadow before:pointer-events-none before:absolute before:inset-0 before:rounded-[calc(var(--radius-lg)-1px)] not-has-[input:disabled,textarea:disabled]:not-has-[input:focus-visible,textarea:focus-visible]:not-has-[input[aria-invalid],textarea[aria-invalid]]:before:shadow-[0_1px_--theme(--color-black/4%)] has-[input:focus-visible,textarea:focus-visible]:has-[input[aria-invalid],textarea[aria-invalid]]:border-destructive/64 has-[input:focus-visible,textarea:focus-visible]:has-[input[aria-invalid],textarea[aria-invalid]]:ring-destructive/16 has-[textarea]:h-auto has-data-[align=block-end]:h-auto has-data-[align=block-start]:h-auto has-data-[align=block-end]:flex-col has-data-[align=block-start]:flex-col has-[input:focus-visible,textarea:focus-visible]:border-ring has-[input[aria-invalid],textarea[aria-invalid]]:border-destructive/36 has-autofill:bg-foreground/4 has-[input:disabled,textarea:disabled]:opacity-64 has-[input:disabled,textarea:disabled,input:focus-visible,textarea:focus-visible,input[aria-invalid],textarea[aria-invalid]]:shadow-none has-[input:focus-visible,textarea:focus-visible]:ring-[3px] sm:text-sm dark:bg-input/32 dark:has-autofill:bg-foreground/8 dark:has-[input[aria-invalid],textarea[aria-invalid]]:ring-destructive/24 dark:not-has-[input:disabled,textarea:disabled]:not-has-[input:focus-visible,textarea:focus-visible]:not-has-[input[aria-invalid],textarea[aria-invalid]]:before:shadow-[0_-1px_--theme(--color-white/6%)] has-data-[align=inline-start]:**:[[data-size=sm]_input]:ps-1.5 has-data-[align=inline-end]:**:[[data-size=sm]_input]:pe-1.5 *:[[data-slot=input-control],[data-slot=textarea-control]]:contents *:[[data-slot=input-control],[data-slot=textarea-control]]:before:hidden has-[[data-align=block-start],[data-align=block-end]]:**:[input]:h-auto has-data-[align=inline-start]:**:[input]:ps-2 has-data-[align=inline-end]:**:[input]:pe-2 has-data-[align=block-end]:**:[input]:pt-1.5 has-data-[align=block-start]:**:[input]:pb-1.5 **:[textarea]:min-h-20.5 **:[textarea]:resize-none **:[textarea]:py-[calc(--spacing(3)-1px)] **:[textarea]:max-sm:min-h-23.5 **:[textarea_button]:rounded-[calc(var(--radius-md)-1px)]\",\n className,\n )}\n data-slot=\"input-group\"\n role=\"group\"\n {...props}\n />\n );\n}\n\nexport function InputGroupAddon({\n className,\n align = \"inline-start\",\n ...props\n}: React.ComponentProps<\"div\"> &\n VariantProps<typeof inputGroupAddonVariants>): React.ReactElement {\n return (\n <div\n className={cn(inputGroupAddonVariants({ align }), className)}\n data-align={align}\n data-slot=\"input-group-addon\"\n onMouseDown={(e: React.MouseEvent<HTMLDivElement>) => {\n const target = e.target as HTMLElement;\n const isInteractive = target.closest(\n \"button, a, input, select, textarea, [role='button'], [role='combobox'], [role='listbox'], [data-slot='select-trigger']\",\n );\n if (isInteractive) return;\n e.preventDefault();\n const parent = e.currentTarget.parentElement;\n const input = parent?.querySelector<\n HTMLInputElement | HTMLTextAreaElement\n >(\"input, textarea\");\n if (input && !parent?.querySelector(\"input:focus, textarea:focus\")) {\n input.focus();\n }\n }}\n {...props}\n />\n );\n}\n\nexport function InputGroupText({\n className,\n ...props\n}: React.ComponentProps<\"span\">): React.ReactElement {\n return (\n <span\n className={cn(\n \"line-clamp-1 flex items-center gap-2 whitespace-nowrap text-muted-foreground leading-none in-[[data-slot=input-group]:has([data-slot=input-control],[data-slot=textarea-control])]:[&_svg:not([class*='size-'])]:size-4.5 sm:in-[[data-slot=input-group]:has([data-slot=input-control],[data-slot=textarea-control])]:[&_svg:not([class*='size-'])]:size-4 [&_svg]:pointer-events-none [&_svg]:-mx-0.5\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport function InputGroupInput({\n className,\n ...props\n}: InputProps): React.ReactElement {\n return <Input className={className} unstyled {...props} />;\n}\n\nexport function InputGroupTextarea({\n className,\n ...props\n}: TextareaProps): React.ReactElement {\n return <Textarea className={className} unstyled {...props} />;\n}\n","\"use client\";\n\nimport { mergeProps } from \"@base-ui/react/merge-props\";\nimport { useRender } from \"@base-ui/react/use-render\";\nimport type React from \"react\";\nimport { cn } from \"@/lib/utils\";\n\nexport function Label({\n className,\n render,\n sound = false,\n ...props\n}: useRender.ComponentProps<\"label\"> & {\n /**\n * Emit the cuelume hover tick. Opt-in: a label is a click target for its\n * control, and that control already owns the interaction cue (Checkbox\n * plays `toggle` on check/uncheck), so hover-ticking here double-sounds.\n * Inert until the app calls bindSounds().\n */\n sound?: boolean;\n}): React.ReactElement {\n const defaultProps = {\n className: cn(\n \"inline-flex cursor-pointer items-center gap-2 font-medium text-base/4.5 text-foreground sm:text-sm/4\",\n className,\n ),\n \"data-cuelume-hover\": sound ? \"tick\" : undefined,\n \"data-slot\": \"label\",\n };\n\n return useRender({\n defaultTagName: \"label\",\n props: mergeProps<\"label\">(defaultProps, props),\n render,\n });\n}\n","\"use client\";\n\nimport { Menu as MenuPrimitive } from \"@base-ui/react/menu\";\nimport { ChevronRightIcon } from \"lucide-react\";\nimport type * as React from \"react\";\nimport { cn } from \"@/lib/utils\";\n\nexport const MenuCreateHandle: typeof MenuPrimitive.createHandle =\n MenuPrimitive.createHandle;\n\nexport const Menu: typeof MenuPrimitive.Root = MenuPrimitive.Root;\n\nexport const MenuPortal: typeof MenuPrimitive.Portal = MenuPrimitive.Portal;\n\nexport function MenuTrigger({\n className,\n children,\n ...props\n}: MenuPrimitive.Trigger.Props): React.ReactElement {\n return (\n <MenuPrimitive.Trigger\n className={className}\n data-slot=\"menu-trigger\"\n {...props}\n >\n {children}\n </MenuPrimitive.Trigger>\n );\n}\n\nexport function MenuPopup({\n children,\n className,\n sideOffset = 4,\n align = \"center\",\n alignOffset,\n side = \"bottom\",\n anchor,\n portalProps,\n ...props\n}: MenuPrimitive.Popup.Props & {\n align?: MenuPrimitive.Positioner.Props[\"align\"];\n sideOffset?: MenuPrimitive.Positioner.Props[\"sideOffset\"];\n alignOffset?: MenuPrimitive.Positioner.Props[\"alignOffset\"];\n side?: MenuPrimitive.Positioner.Props[\"side\"];\n anchor?: MenuPrimitive.Positioner.Props[\"anchor\"];\n portalProps?: MenuPrimitive.Portal.Props;\n}): React.ReactElement {\n return (\n <MenuPortal {...portalProps}>\n <MenuPrimitive.Positioner\n align={align}\n alignOffset={alignOffset}\n anchor={anchor}\n className=\"z-50\"\n data-slot=\"menu-positioner\"\n side={side}\n sideOffset={sideOffset}\n >\n <MenuPrimitive.Popup\n className={cn(\n \"relative flex not-[class*='w-']:min-w-32 origin-(--transform-origin) rounded-lg border bg-popover not-dark:bg-clip-padding shadow-lg/5 outline-none before:pointer-events-none before:absolute before:inset-0 before:rounded-[calc(var(--radius-lg)-1px)] before:shadow-[0_1px_--theme(--color-black/4%)] focus:outline-none dark:before:shadow-[0_-1px_--theme(--color-white/6%)]\",\n className,\n )}\n data-slot=\"menu-popup\"\n {...props}\n >\n <div className=\"max-h-(--available-height) w-full overflow-y-auto p-1\">\n {children}\n </div>\n </MenuPrimitive.Popup>\n </MenuPrimitive.Positioner>\n </MenuPortal>\n );\n}\n\nexport function MenuGroup(\n props: MenuPrimitive.Group.Props,\n): React.ReactElement {\n return <MenuPrimitive.Group data-slot=\"menu-group\" {...props} />;\n}\n\nexport function MenuItem({\n className,\n inset,\n variant = \"default\",\n ...props\n}: MenuPrimitive.Item.Props & {\n inset?: boolean;\n variant?: \"default\" | \"destructive\";\n}): React.ReactElement {\n return (\n <MenuPrimitive.Item\n className={cn(\n \"flex min-h-8 cursor-default select-none items-center gap-2 rounded-sm px-2 py-1 text-base text-foreground outline-none data-disabled:pointer-events-none data-highlighted:bg-accent data-inset:ps-8 data-[variant=destructive]:text-destructive-foreground data-highlighted:text-accent-foreground data-disabled:opacity-64 sm:min-h-7 sm:text-sm [&>svg:not([class*='opacity-'])]:opacity-80 [&>svg:not([class*='size-'])]:size-4.5 sm:[&>svg:not([class*='size-'])]:size-4 [&>svg]:pointer-events-none [&>svg]:-mx-0.5 [&>svg]:shrink-0\",\n className,\n )}\n data-inset={inset}\n data-slot=\"menu-item\"\n data-variant={variant}\n {...props}\n />\n );\n}\n\nexport function MenuLinkItem({\n className,\n inset,\n variant = \"default\",\n closeOnClick = true,\n ...props\n}: MenuPrimitive.LinkItem.Props & {\n inset?: boolean;\n variant?: \"default\" | \"destructive\";\n}): React.ReactElement {\n return (\n <MenuPrimitive.LinkItem\n className={cn(\n \"flex min-h-8 cursor-default select-none items-center gap-2 rounded-sm px-2 py-1 text-base text-foreground outline-none data-disabled:pointer-events-none data-highlighted:bg-accent data-inset:ps-8 data-[variant=destructive]:text-destructive-foreground data-highlighted:text-accent-foreground data-disabled:opacity-64 sm:min-h-7 sm:text-sm [&>svg:not([class*='opacity-'])]:opacity-80 [&>svg:not([class*='size-'])]:size-4.5 sm:[&>svg:not([class*='size-'])]:size-4 [&>svg]:pointer-events-none [&>svg]:-mx-0.5 [&>svg]:shrink-0\",\n className,\n )}\n closeOnClick={closeOnClick}\n data-inset={inset}\n data-slot=\"menu-link-item\"\n data-variant={variant}\n {...props}\n />\n );\n}\n\nexport function MenuCheckboxItem({\n className,\n children,\n checked,\n variant = \"default\",\n ...props\n}: MenuPrimitive.CheckboxItem.Props & {\n variant?: \"default\" | \"switch\";\n}): React.ReactElement {\n return (\n <MenuPrimitive.CheckboxItem\n checked={checked}\n className={cn(\n \"grid min-h-8 in-data-[side=none]:min-w-[calc(var(--anchor-width)+1.25rem)] cursor-default items-center gap-2 rounded-sm py-1 ps-2 text-base text-foreground outline-none data-disabled:pointer-events-none data-highlighted:bg-accent data-highlighted:text-accent-foreground data-disabled:opacity-64 sm:min-h-7 sm:text-sm [&_svg:not([class*='size-'])]:size-4.5 sm:[&_svg:not([class*='size-'])]:size-4 [&_svg]:pointer-events-none [&_svg]:shrink-0\",\n variant === \"switch\"\n ? \"grid-cols-[1fr_auto] gap-4 pe-1.5\"\n : \"grid-cols-[.75rem_1fr] pe-4\",\n className,\n )}\n data-slot=\"menu-checkbox-item\"\n {...props}\n >\n {variant === \"switch\" ? (\n <>\n <span className=\"col-start-1\">{children}</span>\n <MenuPrimitive.CheckboxItemIndicator\n className=\"inset-shadow-[0_1px_--theme(--color-black/4%)] inline-flex h-[calc(var(--thumb-size)+2px)] w-[calc(var(--thumb-size)*2-2px)] shrink-0 items-center rounded-full p-px outline-none transition-[background-color,box-shadow] duration-200 [--thumb-size:--spacing(4)] focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-1 focus-visible:ring-offset-background data-checked:bg-primary data-unchecked:bg-input data-disabled:opacity-64 sm:[--thumb-size:--spacing(3)]\"\n keepMounted\n >\n <span className=\"pointer-events-none block aspect-square h-full in-[[data-slot=menu-checkbox-item][data-checked]]:origin-[var(--thumb-size)_50%] origin-left in-[[data-slot=menu-checkbox-item][data-checked]]:translate-x-[calc(var(--thumb-size)-4px)] in-[[data-slot=menu-checkbox-item]:active]:not-data-disabled:scale-x-110 in-[[data-slot=menu-checkbox-item]:active]:rounded-[var(--thumb-size)/calc(var(--thumb-size)*1.10)] rounded-(--thumb-size) bg-background shadow-sm/5 will-change-transform [transition:translate_.15s,border-radius_.15s,scale_.1s_.1s,transform-origin_.15s]\" />\n </MenuPrimitive.CheckboxItemIndicator>\n </>\n ) : (\n <>\n <MenuPrimitive.CheckboxItemIndicator className=\"col-start-1 -ms-0.5\">\n <svg\n aria-hidden=\"true\"\n fill=\"none\"\n height=\"24\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"2\"\n viewBox=\"0 0 24 24\"\n width=\"24\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path d=\"M5.252 12.7 10.2 18.63 18.748 5.37\" />\n </svg>\n </MenuPrimitive.CheckboxItemIndicator>\n <span className=\"col-start-2\">{children}</span>\n </>\n )}\n </MenuPrimitive.CheckboxItem>\n );\n}\n\nexport function MenuRadioGroup(\n props: MenuPrimitive.RadioGroup.Props,\n): React.ReactElement {\n return <MenuPrimitive.RadioGroup data-slot=\"menu-radio-group\" {...props} />;\n}\n\nexport function MenuRadioItem({\n className,\n children,\n ...props\n}: MenuPrimitive.RadioItem.Props): React.ReactElement {\n return (\n <MenuPrimitive.RadioItem\n className={cn(\n \"grid min-h-8 in-data-[side=none]:min-w-[calc(var(--anchor-width)+1.25rem)] cursor-default grid-cols-[.75rem_1fr] items-center gap-2 rounded-sm py-1 ps-2 pe-4 text-base text-foreground outline-none data-disabled:pointer-events-none data-highlighted:bg-accent data-highlighted:text-accent-foreground data-disabled:opacity-64 sm:min-h-7 sm:text-sm [&_svg:not([class*='size-'])]:size-4.5 sm:[&_svg:not([class*='size-'])]:size-4 [&_svg]:pointer-events-none [&_svg]:shrink-0\",\n className,\n )}\n data-slot=\"menu-radio-item\"\n {...props}\n >\n <MenuPrimitive.RadioItemIndicator className=\"col-start-1 -ms-0.5\">\n <svg\n aria-hidden=\"true\"\n fill=\"none\"\n height=\"24\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"2\"\n viewBox=\"0 0 24 24\"\n width=\"24\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path d=\"M5.252 12.7 10.2 18.63 18.748 5.37\" />\n </svg>\n </MenuPrimitive.RadioItemIndicator>\n <span className=\"col-start-2\">{children}</span>\n </MenuPrimitive.RadioItem>\n );\n}\n\nexport function MenuGroupLabel({\n className,\n inset,\n ...props\n}: MenuPrimitive.GroupLabel.Props & {\n inset?: boolean;\n}): React.ReactElement {\n return (\n <MenuPrimitive.GroupLabel\n className={cn(\n \"px-2 py-1.5 font-medium text-muted-foreground text-xs data-inset:ps-9 sm:data-inset:ps-8\",\n className,\n )}\n data-inset={inset}\n data-slot=\"menu-label\"\n {...props}\n />\n );\n}\n\nexport function MenuSeparator({\n className,\n ...props\n}: MenuPrimitive.Separator.Props): React.ReactElement {\n return (\n <MenuPrimitive.Separator\n className={cn(\"mx-2 my-1 h-px bg-border\", className)}\n data-slot=\"menu-separator\"\n {...props}\n />\n );\n}\n\nexport function MenuShortcut({\n className,\n ...props\n}: React.ComponentProps<\"kbd\">): React.ReactElement {\n return (\n <kbd\n className={cn(\n \"ms-auto font-medium font-sans text-muted-foreground/72 text-xs tracking-widest\",\n className,\n )}\n data-slot=\"menu-shortcut\"\n {...props}\n />\n );\n}\n\nexport function MenuSub(\n props: MenuPrimitive.SubmenuRoot.Props,\n): React.ReactElement {\n return <MenuPrimitive.SubmenuRoot data-slot=\"menu-sub\" {...props} />;\n}\n\nexport function MenuSubTrigger({\n className,\n inset,\n children,\n ...props\n}: MenuPrimitive.SubmenuTrigger.Props & {\n inset?: boolean;\n}): React.ReactElement {\n return (\n <MenuPrimitive.SubmenuTrigger\n className={cn(\n \"flex min-h-8 items-center gap-2 rounded-sm px-2 py-1 text-base text-foreground outline-none data-disabled:pointer-events-none data-highlighted:bg-accent data-popup-open:bg-accent data-inset:ps-8 data-highlighted:text-accent-foreground data-popup-open:text-accent-foreground data-disabled:opacity-64 sm:min-h-7 sm:text-sm [&>svg:not(:last-child)]:-mx-0.5 [&_svg:not([class*='size-'])]:size-4.5 sm:[&_svg:not([class*='size-'])]:size-4 [&_svg]:pointer-events-none\",\n className,\n )}\n data-inset={inset}\n data-slot=\"menu-sub-trigger\"\n {...props}\n >\n {children}\n <ChevronRightIcon className=\"ms-auto -me-0.5 opacity-80\" />\n </MenuPrimitive.SubmenuTrigger>\n );\n}\n\nexport function MenuSubPopup({\n className,\n sideOffset = 0,\n alignOffset,\n align = \"start\",\n ...props\n}: MenuPrimitive.Popup.Props & {\n align?: MenuPrimitive.Positioner.Props[\"align\"];\n sideOffset?: MenuPrimitive.Positioner.Props[\"sideOffset\"];\n alignOffset?: MenuPrimitive.Positioner.Props[\"alignOffset\"];\n}): React.ReactElement {\n const defaultAlignOffset = align !== \"center\" ? -5 : undefined;\n\n return (\n <MenuPopup\n align={align}\n alignOffset={alignOffset ?? defaultAlignOffset}\n className={className}\n data-slot=\"menu-sub-content\"\n side=\"inline-end\"\n sideOffset={sideOffset}\n {...props}\n />\n );\n}\n\nexport {\n MenuPrimitive,\n MenuCreateHandle as DropdownMenuCreateHandle,\n Menu as DropdownMenu,\n MenuPortal as DropdownMenuPortal,\n MenuTrigger as DropdownMenuTrigger,\n MenuPopup as DropdownMenuContent,\n MenuGroup as DropdownMenuGroup,\n MenuItem as DropdownMenuItem,\n MenuCheckboxItem as DropdownMenuCheckboxItem,\n MenuRadioGroup as DropdownMenuRadioGroup,\n MenuRadioItem as DropdownMenuRadioItem,\n MenuGroupLabel as DropdownMenuLabel,\n MenuSeparator as DropdownMenuSeparator,\n MenuShortcut as DropdownMenuShortcut,\n MenuSub as DropdownMenuSub,\n MenuSubTrigger as DropdownMenuSubTrigger,\n MenuSubPopup as DropdownMenuSubContent,\n};\n","import { Separator as SeparatorPrimitive } from \"@base-ui/react/separator\";\nimport type React from \"react\";\nimport { cn } from \"@/lib/utils\";\n\nexport function Separator({\n className,\n orientation = \"horizontal\",\n ...props\n}: SeparatorPrimitive.Props): React.ReactElement {\n return (\n <SeparatorPrimitive\n className={cn(\n \"shrink-0 bg-border data-[orientation=horizontal]:h-px data-[orientation=horizontal]:w-full data-[orientation=vertical]:w-px data-[orientation=vertical]:not-[[class^='h-']]:not-[[class*='_h-']]:self-stretch\",\n className,\n )}\n data-slot=\"separator\"\n orientation={orientation}\n {...props}\n />\n );\n}\n\nexport { SeparatorPrimitive };\n","\"use client\";\n\nimport { OTPField as OTPFieldPrimitive } from \"@base-ui/react/otp-field\";\nimport * as React from \"react\";\nimport { cn } from \"@/lib/utils\";\nimport { playCue } from \"@/lib/sound\";\nimport { Separator } from \"@/components/ui/separator\";\n\nexport function OTPField({\n className,\n size = \"default\",\n sound = true,\n onValueChange,\n ...props\n}: React.ComponentProps<typeof OTPFieldPrimitive.Root> & {\n size?: \"default\" | \"lg\";\n /** Play a tick cue per entered character. Inert until bindSounds(). */\n sound?: boolean;\n}): React.ReactElement {\n // Typing is keyboard-driven, so the cue is imperative (playCue is gated on\n // the app having called bindSounds). Tick only when characters are added.\n const lastLength = React.useRef(\n String(props.value ?? props.defaultValue ?? \"\").length,\n );\n\n const handleValueChange: NonNullable<typeof onValueChange> = (\n value,\n ...rest\n ) => {\n if (sound && value.length > lastLength.current) {\n playCue(\"tick\");\n }\n lastLength.current = value.length;\n onValueChange?.(value, ...rest);\n };\n\n return (\n <OTPFieldPrimitive.Root\n className={cn(\n \"flex items-center gap-2 has-disabled:opacity-64 has-disabled:**:data-[slot=otp-field-input]:shadow-none has-disabled:**:data-[slot=otp-field-input]:before:shadow-none!\",\n className,\n )}\n data-size={size}\n data-slot=\"otp-field\"\n onValueChange={handleValueChange}\n {...props}\n />\n );\n}\n\nexport function OTPFieldInput({\n className,\n ...props\n}: React.ComponentProps<typeof OTPFieldPrimitive.Input>): React.ReactElement {\n return (\n <OTPFieldPrimitive.Input\n className={cn(\n \"relative in-[[data-slot=otp-field][data-size=lg]]:size-10 size-9 min-w-0 rounded-lg border border-input bg-background not-dark:bg-clip-padding text-center in-[[data-slot=otp-field][data-size=lg]]:text-lg text-base text-foreground in-[[data-slot=otp-field][data-size=lg]]:leading-10 leading-9 shadow-xs/5 outline-none ring-ring/24 transition-shadow before:pointer-events-none before:absolute before:inset-0 before:rounded-[calc(var(--radius-lg)-1px)] not-focus-visible:not-aria-invalid:before:shadow-[0_1px_--theme(--color-black/4%)] focus-visible:z-10 focus-visible:border-ring focus-visible:shadow-none focus-visible:ring-[3px] focus-visible:ring-ring/24 aria-invalid:border-destructive/36 aria-invalid:shadow-none aria-invalid:focus-visible:border-destructive/64 aria-invalid:focus-visible:ring-destructive/16 sm:in-[[data-slot=otp-field][data-size=lg]]:size-9 sm:size-8 sm:in-[[data-slot=otp-field][data-size=lg]]:text-base sm:text-sm sm:in-[[data-slot=otp-field][data-size=lg]]:leading-9 sm:leading-8 dark:bg-input/32 dark:aria-invalid:focus-visible:ring-destructive/24 dark:not-focus-visible:not-aria-invalid:before:shadow-[0_-1px_--theme(--color-white/6%)]\",\n className,\n )}\n data-slot=\"otp-field-input\"\n spellCheck={false}\n {...props}\n />\n );\n}\n\nexport function OTPFieldSeparator({\n className,\n ...props\n}: React.ComponentProps<typeof Separator>): React.ReactElement {\n return (\n <OTPFieldPrimitive.Separator\n render={\n <Separator\n className={cn(\n \"rounded-full bg-input data-[orientation=horizontal]:h-0.5 data-[orientation=horizontal]:w-3\",\n className,\n )}\n orientation=\"horizontal\"\n {...props}\n />\n }\n />\n );\n}\n\nexport { OTPFieldPrimitive };\n","import type React from \"react\";\nimport { cn } from \"@/lib/utils\";\n\nexport function Skeleton({\n className,\n ...props\n}: React.ComponentProps<\"div\">): React.ReactElement {\n return (\n <div\n className={cn(\n \"animate-skeleton rounded-sm [--skeleton-highlight:--alpha(var(--color-white)/64%)] [background:linear-gradient(120deg,transparent_40%,var(--skeleton-highlight),transparent_60%)_var(--color-muted)_0_0/200%_100%_fixed] dark:[--skeleton-highlight:--alpha(var(--color-white)/4%)]\",\n className,\n )}\n data-slot=\"skeleton\"\n {...props}\n />\n );\n}\n","\"use client\";\n\nimport { CheckIcon, EyeIcon, EyeOffIcon, XIcon } from \"lucide-react\";\nimport { AnimatePresence, motion } from \"motion/react\";\nimport * as React from \"react\";\n\nimport { Button } from \"@/components/ui/button\";\nimport {\n InputGroup,\n InputGroupAddon,\n InputGroupInput,\n} from \"@/components/ui/input-group\";\nimport { playCue } from \"@/lib/sound\";\nimport { cn } from \"@/lib/utils\";\n\n// transitions.dev motion scale\nconst EASE = [0.22, 1, 0.36, 1] as const;\n\nexport const passwordRequirements = [\n { regex: /.{8,}/, text: \"At least 8 characters\" },\n { regex: /[0-9]/, text: \"At least 1 number\" },\n { regex: /[a-z]/, text: \"At least 1 lowercase letter\" },\n { regex: /[A-Z]/, text: \"At least 1 uppercase letter\" },\n] as const;\n\nexport function getPasswordStrength(password: string): number {\n return passwordRequirements.filter((req) => req.regex.test(password)).length;\n}\n\nconst STRENGTH_COLORS = [\n \"bg-border\",\n \"bg-red-500\",\n \"bg-orange-500\",\n \"bg-amber-500\",\n \"bg-emerald-500\",\n] as const;\n\nexport interface PasswordInputProps\n extends Omit<React.ComponentProps<typeof InputGroupInput>, \"type\" | \"size\"> {\n /** Render the eye toggle button. */\n visibilityToggle?: boolean;\n /** Render the animated strength meter and requirement checklist. */\n showStrength?: boolean;\n /** Play reveal/hide cues on the visibility toggle. Inert until bindSounds(). */\n sound?: boolean;\n}\n\n/**\n * Password field with visibility toggle and optional strength meter.\n * Composition of InputGroup + Button (coss particles p-input-9 and\n * p-input-group-26).\n */\nexport function PasswordInput({\n visibilityToggle = true,\n showStrength = false,\n sound = true,\n className,\n value: valueProp,\n defaultValue,\n onChange,\n ...props\n}: PasswordInputProps) {\n const [visible, setVisible] = React.useState(false);\n const [uncontrolled, setUncontrolled] = React.useState(\n String(defaultValue ?? \"\"),\n );\n const value = valueProp !== undefined ? String(valueProp) : uncontrolled;\n const score = getPasswordStrength(value);\n\n return (\n <div className={cn(\"flex w-full flex-col gap-3\", className)}>\n <InputGroup>\n <InputGroupInput\n placeholder=\"Enter your password\"\n {...props}\n type={visible ? \"text\" : \"password\"}\n value={value}\n onChange={(event) => {\n setUncontrolled(event.target.value);\n onChange?.(event);\n }}\n />\n {visibilityToggle && (\n <InputGroupAddon align=\"inline-end\">\n <Button\n aria-label={visible ? \"Hide password\" : \"Show password\"}\n onClick={() => {\n // Semantic cues from the cuelume palette: bloom = reveal,\n // droplet = dismiss. Press/release stays off to avoid layering.\n if (sound) playCue(visible ? \"droplet\" : \"bloom\");\n setVisible((v) => !v);\n }}\n size=\"icon-xs\"\n variant=\"ghost\"\n sound={false}\n >\n <AnimatePresence mode=\"wait\" initial={false}>\n <motion.span\n key={visible ? \"off\" : \"on\"}\n className=\"inline-flex\"\n initial={{ opacity: 0, scale: 0.8, filter: \"blur(2px)\" }}\n animate={{ opacity: 1, scale: 1, filter: \"blur(0px)\" }}\n exit={{ opacity: 0, scale: 0.8, filter: \"blur(2px)\" }}\n transition={{ duration: 0.15, ease: EASE }}\n >\n {visible ? (\n <EyeOffIcon aria-hidden=\"true\" />\n ) : (\n <EyeIcon aria-hidden=\"true\" />\n )}\n </motion.span>\n </AnimatePresence>\n </Button>\n </InputGroupAddon>\n )}\n </InputGroup>\n\n <AnimatePresence initial={false}>\n {showStrength && (\n <motion.div\n className=\"flex flex-col gap-2 overflow-hidden\"\n initial={{ height: 0, opacity: 0 }}\n animate={{ height: \"auto\", opacity: 1 }}\n exit={{ height: 0, opacity: 0 }}\n transition={{ duration: 0.25, ease: EASE }}\n >\n <div\n aria-label=\"Password strength\"\n aria-valuemax={4}\n aria-valuemin={0}\n aria-valuenow={score}\n className=\"h-1 w-full overflow-hidden rounded-full bg-border\"\n role=\"progressbar\"\n >\n <motion.div\n className={cn(\"h-full rounded-full\", STRENGTH_COLORS[score])}\n animate={{ width: `${(score / 4) * 100}%` }}\n transition={{ duration: 0.4, ease: EASE }}\n />\n </div>\n <ul\n aria-label=\"Password requirements\"\n className=\"flex flex-col gap-1\"\n >\n {passwordRequirements.map((req) => {\n const met = req.regex.test(value);\n return (\n <li className=\"flex items-center gap-2 text-xs\" key={req.text}>\n {met ? (\n <CheckIcon\n aria-hidden=\"true\"\n className=\"size-3.5 text-emerald-500\"\n />\n ) : (\n <XIcon\n aria-hidden=\"true\"\n className=\"size-3.5 text-muted-foreground/80\"\n />\n )}\n <span\n className={\n met ? \"text-emerald-600\" : \"text-muted-foreground\"\n }\n >\n {req.text}\n <span className=\"sr-only\">\n {met ? \" - met\" : \" - not met\"}\n </span>\n </span>\n </li>\n );\n })}\n </ul>\n </motion.div>\n )}\n </AnimatePresence>\n </div>\n );\n}\n","\"use client\"\n\nimport {\n RiAppleFill,\n RiGithubFill,\n RiGoogleFill,\n RiTwitterXFill,\n} from \"@remixicon/react\"\nimport type * as React from \"react\"\n\nimport { Button } from \"@/components/ui/button\"\nimport { cn } from \"@/lib/utils\"\n\nexport type SocialProvider = \"google\" | \"apple\" | \"github\" | \"x\"\n\n/** Google's four-color \"G\" — the only provider whose mark isn't monochrome. */\nfunction GoogleColorIcon(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg viewBox=\"0 0 24 24\" fill=\"none\" {...props}>\n <path\n fill=\"#4285F4\"\n d=\"M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92a5.06 5.06 0 0 1-2.2 3.32v2.76h3.56c2.09-1.92 3.28-4.74 3.28-8.09Z\"\n />\n <path\n fill=\"#34A853\"\n d=\"M12 23c2.97 0 5.46-.98 7.28-2.66l-3.56-2.76c-.99.66-2.25 1.05-3.72 1.05-2.86 0-5.28-1.93-6.15-4.53H2.18v2.85A11 11 0 0 0 12 23Z\"\n />\n <path\n fill=\"#FBBC05\"\n d=\"M5.85 14.1A6.6 6.6 0 0 1 5.5 12c0-.73.13-1.44.35-2.1V7.05H2.18a11 11 0 0 0 0 9.9l3.67-2.85Z\"\n />\n <path\n fill=\"#EA4335\"\n d=\"M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15A11 11 0 0 0 2.18 7.05L5.85 9.9C6.72 7.3 9.14 5.38 12 5.38Z\"\n />\n </svg>\n )\n}\n\n/**\n * Label + brand mark per provider, shared with the auth blocks. `Icon` is the\n * monochrome mark that inherits the current text color; `BrandIcon` +\n * `brandClassName` render it in the provider's own colors.\n */\nexport const SOCIAL_PROVIDERS: Record<\n SocialProvider,\n {\n label: string\n Icon: React.ComponentType<{ className?: string }>\n BrandIcon: React.ComponentType<{ className?: string }>\n brandClassName: string\n }\n> = {\n google: {\n label: \"Google\",\n Icon: RiGoogleFill,\n BrandIcon: GoogleColorIcon,\n brandClassName: \"\",\n },\n apple: {\n label: \"Apple\",\n Icon: RiAppleFill,\n BrandIcon: RiAppleFill,\n brandClassName: \"text-foreground\",\n },\n github: {\n label: \"GitHub\",\n Icon: RiGithubFill,\n BrandIcon: RiGithubFill,\n brandClassName: \"text-foreground\",\n },\n x: {\n label: \"X\",\n Icon: RiTwitterXFill,\n BrandIcon: RiTwitterXFill,\n brandClassName: \"text-foreground\",\n },\n}\n\nconst ACTION_LABELS = {\n login: \"Login with\",\n signup: \"Sign up with\",\n continue: \"Continue with\",\n} as const\n\nexport interface SocialProvidersProps {\n providers?: SocialProvider[]\n /** Verb used in the stacked layout labels. */\n action?: keyof typeof ACTION_LABELS\n /** \"stack\" = full-width labeled buttons; \"row\" = icon-only buttons. */\n layout?: \"stack\" | \"row\"\n /** Shows the matching button in its loading state and disables the rest. */\n loadingProvider?: SocialProvider | null\n disabled?: boolean\n onSelect?: (provider: SocialProvider) => void\n className?: string\n}\n\n/** Social auth buttons (coss particle p-button-38). UI only — wire onSelect. */\nexport function SocialProviders({\n providers = [\"google\", \"apple\", \"github\"],\n action = \"continue\",\n layout = \"stack\",\n loadingProvider = null,\n disabled = false,\n onSelect,\n className,\n}: SocialProvidersProps) {\n const row = layout === \"row\"\n\n return (\n <div\n className={cn(\n \"flex w-full gap-2\",\n row ? \"flex-row justify-center\" : \"flex-col\",\n className\n )}\n >\n {providers.map((provider) => {\n const { label, Icon } = SOCIAL_PROVIDERS[provider]\n return (\n <Button\n key={provider}\n variant=\"outline\"\n size={row ? \"icon\" : \"default\"}\n className={row ? undefined : \"w-full\"}\n aria-label={`${ACTION_LABELS[action]} ${label}`}\n loading={loadingProvider === provider}\n disabled={\n disabled ||\n (loadingProvider !== null && loadingProvider !== provider)\n }\n onClick={() => onSelect?.(provider)}\n >\n <Icon aria-hidden=\"true\" />\n {!row && (\n <span className=\"flex-1\">\n {ACTION_LABELS[action]} {label}\n </span>\n )}\n </Button>\n )\n })}\n </div>\n )\n}\n","\"use client\"\n\nimport * as React from \"react\"\n\nimport {\n Avatar,\n AvatarFallback,\n AvatarImage,\n type AvatarPrimitive,\n} from \"@/components/ui/avatar\"\nimport { Skeleton } from \"@/components/ui/skeleton\"\nimport { cn } from \"@/lib/utils\"\n\ntype ImageStatus = Parameters<\n NonNullable<AvatarPrimitive.Image.Props[\"onLoadingStatusChange\"]>\n>[0]\n\nexport interface UserAvatarProps extends Omit<\n AvatarPrimitive.Root.Props,\n \"children\"\n> {\n /** Image URL. Without one the initials show immediately — no skeleton. */\n src?: string\n /** Drives the initials, and the alt text unless `alt` overrides it. */\n name?: string\n /** Overrides the initials derived from `name`. */\n initials?: string\n /**\n * Alt text for the image. Pass \"\" when adjacent text already names the\n * person — the image is then decorative.\n */\n alt?: string\n /**\n * Force the skeleton, for when the identity itself is still being fetched.\n * Omitted, it follows the image: a passed `src` skeletons until it resolves.\n */\n loading?: boolean\n}\n\n/** \"Jenny Hamilton\" → \"JH\", \"luna\" → \"L\". */\nexport function initialsFrom(name: string): string {\n const parts = name.trim().split(/\\s+/).filter(Boolean)\n if (parts.length === 0) return \"\"\n const first = parts[0]?.[0] ?? \"\"\n const last = parts.length > 1 ? (parts.at(-1)?.[0] ?? \"\") : \"\"\n return (first + last).toUpperCase()\n}\n\n/**\n * Identity avatar: an image when one is given, initials otherwise.\n *\n * A passed `src` is assumed to be remote, so the slot holds a skeleton until\n * the image resolves rather than flashing initials that are about to be\n * replaced. A failed load settles on the initials.\n */\nexport function UserAvatar({\n src,\n name = \"\",\n initials,\n alt,\n loading: loadingProp,\n className,\n ...props\n}: UserAvatarProps): React.ReactElement {\n const [status, setStatus] = React.useState<ImageStatus>(\"idle\")\n const loading =\n loadingProp ??\n (src !== undefined && (status === \"idle\" || status === \"loading\"))\n\n return (\n <Avatar\n className={cn(\"size-8\", className)}\n data-loading={loading || undefined}\n data-slot=\"user-avatar\"\n {...props}\n >\n {/* Held back while forced-loading: a loaded image would hide the\n fallback the skeleton lives in. */}\n {src === undefined || loadingProp === true ? null : (\n <AvatarImage\n alt={alt ?? name}\n onLoadingStatusChange={setStatus}\n src={src}\n />\n )}\n <AvatarFallback>\n {loading ? (\n <Skeleton\n className=\"size-full rounded-full\"\n data-slot=\"avatar-skeleton\"\n />\n ) : (\n (initials ?? initialsFrom(name))\n )}\n </AvatarFallback>\n </Avatar>\n )\n}\n","/**\n * Brand accents for the auth blocks.\n *\n * An accent is a set of custom properties set on the AuthCard root plus one\n * class string applied to the card's primary action. Splitting it this way\n * keeps the accent inheritable — anything else inside the card can opt into\n * `var(--auth-accent)` without the shell knowing about it.\n */\n\n/** Brand accents available to the auth blocks. */\nexport type AuthAccent = \"corpora\" | \"exegia\";\n\n/**\n * Custom properties an accent contributes, set on the AuthCard root.\n *\n * The gradient lives in `--auth-accent-image` because `background-color` can't\n * hold one; `--auth-accent` sits underneath as the solid that paints wherever\n * the image is `none`. Foregrounds are fixed rather than themed — the accent\n * itself is a constant, so its contrast pair has to be too (white on the\n * corpora yellow fails badly).\n */\nexport const authAccentVars: Record<AuthAccent, Record<string, string>> = {\n corpora: {\n \"--auth-accent\": \"#E8B124\",\n \"--auth-accent-image\": \"none\",\n \"--auth-accent-foreground\": \"oklch(0.145 0 0)\",\n },\n exegia: {\n \"--auth-accent\": \"#3B0080\",\n \"--auth-accent-image\":\n \"linear-gradient(44deg in oklab, rgba(29,0,202,0.66) 3%, #3B0080 37%, rgba(36,0,72,0.86) 98%)\",\n \"--auth-accent-foreground\": \"oklch(0.985 0 0)\",\n },\n};\n\n/**\n * Applied to the primary action inside an accented AuthCard, after the button\n * cva output so tailwind-merge lets it win over `bg-primary`. The hover and\n * pressed background entries are required: `hover:bg-primary/90` lives in a\n * different modifier group from `bg-*` and would otherwise survive and repaint\n * the button on hover.\n *\n * Hover uses `brightness` rather than a background tween because the button's\n * `transition-property` list is shared with its press/size animations — adding\n * `filter` to it means restating the whole list and its per-property\n * durations. The trade is an instant hover change instead of a 150ms one.\n */\nexport const authAccentActionStyles =\n \"border-transparent bg-[var(--auth-accent)] bg-[image:var(--auth-accent-image)] text-[var(--auth-accent-foreground)] shadow-none hover:bg-[var(--auth-accent)] hover:brightness-110 data-pressed:bg-[var(--auth-accent)] data-pressed:brightness-110 *:data-[slot=button-loading-indicator]:text-[var(--auth-accent-foreground)]\";\n","\"use client\";\n\nimport { AnimatePresence, MotionConfig, motion } from \"motion/react\";\nimport * as React from \"react\";\n\nimport {\n Card,\n CardDescription,\n CardHeader,\n CardPanel,\n CardTitle,\n} from \"@/components/ui/card\";\nimport { Frame, FrameFooter } from \"@/components/ui/frame\";\nimport { Separator } from \"@/components/ui/separator\";\nimport { type AuthAccent, authAccentVars } from \"@/lib/auth-accent\";\nimport { cn } from \"@/lib/utils\";\n\n/** transitions.dev motion scale, shared by all auth blocks. */\nexport const EASE = [0.22, 1, 0.36, 1] as const;\n\nexport type AuthStatus = \"idle\" | \"loading\" | \"success\" | \"error\";\n\n/**\n * Frame shell shared by the auth blocks (coss particle p-card-8): a raised\n * Card inside a muted Frame, with the footer in the frame strip below the\n * card. Wraps content in a MotionConfig that honors prefers-reduced-motion\n * and layout-animates height changes so step swaps morph instead of jumping.\n */\nexport function AuthCard({\n title,\n description,\n children,\n footer,\n className,\n logo,\n accent,\n}: {\n title: React.ReactNode;\n description?: React.ReactNode;\n children: React.ReactNode;\n footer?: React.ReactNode;\n className?: string;\n /** Brand mark rendered above the title. Omit for no logo row at all. */\n logo?: React.ReactNode;\n /** Brand accent for the card's primary action. Omit to keep `bg-primary`. */\n accent?: AuthAccent;\n}) {\n return (\n <MotionConfig reducedMotion=\"user\">\n <Frame\n className={cn(\"w-full max-w-sm\", className)}\n data-accent={accent}\n style={\n accent ? (authAccentVars[accent] as React.CSSProperties) : undefined\n }\n >\n <motion.div\n layout\n transition={{ duration: 0.3, ease: EASE }}\n className=\"flex flex-col\"\n >\n <Card>\n <CardHeader>\n {logo && (\n // Sized like the button's icon rule: a bare img/svg gets a\n // default height, an explicitly sized one keeps its own.\n <div\n className=\"mb-1.5 flex items-center [&_img:not([class*='h-'])]:h-8 [&_img]:w-auto [&_svg:not([class*='size-'])]:size-8\"\n data-slot=\"auth-logo\"\n >\n {logo}\n </div>\n )}\n <CardTitle>{title}</CardTitle>\n {description && <CardDescription>{description}</CardDescription>}\n </CardHeader>\n <CardPanel className=\"overflow-hidden\">{children}</CardPanel>\n </Card>\n {footer && (\n <FrameFooter className=\"text-center text-sm text-muted-foreground\">\n {footer}\n </FrameFooter>\n )}\n </motion.div>\n </Frame>\n </MotionConfig>\n );\n}\n\n/** Cross-morphs between steps (form → success, …) keyed by `step`. */\nexport function MorphStep({\n step,\n children,\n className,\n}: {\n step: string;\n children: React.ReactNode;\n className?: string;\n}) {\n return (\n <AnimatePresence mode=\"popLayout\" initial={false}>\n <motion.div\n key={step}\n className={className}\n initial={{ opacity: 0, y: 8, filter: \"blur(2px)\" }}\n animate={{ opacity: 1, y: 0, filter: \"blur(0px)\" }}\n exit={{ opacity: 0, y: -8, filter: \"blur(2px)\" }}\n transition={{ duration: 0.25, ease: EASE }}\n >\n {children}\n </motion.div>\n </AnimatePresence>\n );\n}\n\n/**\n * Progressive-disclosure wrapper: collapses/expands a step as `show` flips.\n *\n * `overflow-hidden` is only worn while the height is in flight — leaving it on\n * would clip the focus ring of any full-width control inside (the ring sits\n * 3px outside the input's border box, so the left/right edges would be cut).\n */\nexport function Reveal({\n show,\n children,\n className,\n}: {\n show: boolean;\n children: React.ReactNode;\n className?: string;\n}) {\n // Reset during render (not in an effect) when `show` flips, matching\n // useCountdown below.\n const [state, setState] = React.useState({ show, settled: show });\n if (state.show !== show) setState({ show, settled: false });\n\n return (\n <AnimatePresence initial={false}>\n {show && (\n <motion.div\n className={cn(!state.settled && \"overflow-hidden\", className)}\n initial={{ height: 0, opacity: 0, y: -4, filter: \"blur(2px)\" }}\n animate={{ height: \"auto\", opacity: 1, y: 0, filter: \"blur(0px)\" }}\n exit={{ height: 0, opacity: 0, y: -4, filter: \"blur(2px)\" }}\n transition={{ duration: 0.25, ease: EASE }}\n onAnimationComplete={() =>\n setState((current) => ({ ...current, settled: true }))\n }\n >\n {children}\n </motion.div>\n )}\n </AnimatePresence>\n );\n}\n\n/** Inline error message that shakes each time `message` changes. */\nexport function AuthError({ message }: { message: string | null }) {\n return (\n <AnimatePresence initial={false}>\n {message && (\n <motion.p\n key={message}\n role=\"alert\"\n className=\"text-sm text-destructive-foreground\"\n initial={{ opacity: 0, height: 0 }}\n animate={{\n opacity: 1,\n height: \"auto\",\n x: [0, -6, 6, -4, 4, 0],\n }}\n exit={{ opacity: 0, height: 0 }}\n transition={{\n duration: 0.25,\n ease: EASE,\n x: { duration: 0.4, ease: \"easeInOut\" },\n }}\n >\n {message}\n </motion.p>\n )}\n </AnimatePresence>\n );\n}\n\n/** Success panel with a stroke-drawn check. */\nexport function AuthSuccess({\n title,\n description,\n children,\n}: {\n title: React.ReactNode;\n description?: React.ReactNode;\n children?: React.ReactNode;\n}) {\n return (\n <div className=\"flex flex-col items-center gap-3 py-4 text-center\">\n <motion.span\n className=\"flex size-12 items-center justify-center rounded-full bg-emerald-500/12 text-emerald-600\"\n initial={{ scale: 0.6, opacity: 0 }}\n animate={{ scale: 1, opacity: 1 }}\n transition={{ duration: 0.4, ease: EASE }}\n >\n <svg\n aria-hidden=\"true\"\n viewBox=\"0 0 24 24\"\n className=\"size-6\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <motion.path\n d=\"M4 12.5l5 5L20 6.5\"\n initial={{ pathLength: 0 }}\n animate={{ pathLength: 1 }}\n transition={{ duration: 0.4, delay: 0.15, ease: EASE }}\n />\n </svg>\n </motion.span>\n <div className=\"flex flex-col gap-1\">\n <p className=\"font-medium\">{title}</p>\n {description && (\n <p className=\"text-sm text-muted-foreground\">{description}</p>\n )}\n </div>\n {children}\n </div>\n );\n}\n\n/** \"Or continue with\" style divider. */\nexport function AuthSeparator({ label = \"Or\" }: { label?: string }) {\n return (\n <div className=\"flex items-center gap-3\">\n <Separator className=\"flex-1\" />\n <span className=\"text-xs text-muted-foreground uppercase\">{label}</span>\n <Separator className=\"flex-1\" />\n </div>\n );\n}\n\n/** Countdown for resend links; restarts when `restartKey` changes. */\nexport function useCountdown(seconds: number, restartKey: number) {\n const [state, setState] = React.useState({ restartKey, seconds, remaining: seconds });\n\n // Reset during render (not in an effect) when the inputs change.\n if (state.restartKey !== restartKey || state.seconds !== seconds) {\n setState({ restartKey, seconds, remaining: seconds });\n }\n\n React.useEffect(() => {\n if (seconds <= 0) return;\n const interval = window.setInterval(() => {\n setState((current) =>\n current.remaining <= 0\n ? current\n : { ...current, remaining: current.remaining - 1 },\n );\n }, 1000);\n return () => window.clearInterval(interval);\n }, [seconds, restartKey]);\n\n return state.remaining;\n}\n","\"use client\";\n\nimport { MailIcon, SmartphoneIcon } from \"lucide-react\";\nimport { motion } from \"motion/react\";\nimport * as React from \"react\";\n\nimport { Button } from \"@/components/ui/button\";\nimport { OTPField, OTPFieldInput } from \"@/components/ui/otp-field\";\nimport { type AuthAccent, authAccentActionStyles } from \"@/lib/auth-accent\";\nimport { cn } from \"@/lib/utils\";\nimport {\n AuthCard,\n AuthError,\n AuthSuccess,\n EASE,\n MorphStep,\n useCountdown,\n type AuthStatus,\n} from \"./auth-shell\";\n\nexport interface CodeAuthBlockProps {\n /** Brand mark rendered above the title. Omit for no logo row at all. */\n logo?: React.ReactNode;\n /** Brand accent for the primary action. Omit to keep the default primary. */\n accent?: AuthAccent;\n /** Where the code was sent; drives copy and icon. */\n channel?: \"email\" | \"sms\";\n /** Masked destination shown in the description, e.g. \"y•••@example.com\". */\n destination?: string;\n length?: number;\n /** Submit automatically once all digits are entered. */\n autoSubmit?: boolean;\n /** Seconds before \"Resend code\" becomes available. 0 disables the wait. */\n resendSeconds?: number;\n /** Reject (or throw) to show the error shake and clear the code. */\n onVerify?: (code: string) => Promise<void> | void;\n onResend?: () => Promise<void> | void;\n onBack?: () => void;\n}\n\nexport function CodeAuthBlock({\n channel = \"email\",\n logo,\n accent,\n destination,\n length = 6,\n autoSubmit = true,\n resendSeconds = 30,\n onVerify,\n onResend,\n onBack,\n}: CodeAuthBlockProps) {\n const [status, setStatus] = React.useState<AuthStatus>(\"idle\");\n const [error, setError] = React.useState<string | null>(null);\n const [code, setCode] = React.useState(\"\");\n const [resendCount, setResendCount] = React.useState(0);\n const remaining = useCountdown(resendSeconds, resendCount);\n\n const ChannelIcon = channel === \"sms\" ? SmartphoneIcon : MailIcon;\n const channelLabel = channel === \"sms\" ? \"phone\" : \"email\";\n\n const verify = React.useCallback(\n async (value: string) => {\n setError(null);\n setStatus(\"loading\");\n try {\n await onVerify?.(value);\n setStatus(\"success\");\n } catch (cause) {\n setStatus(\"idle\");\n setCode(\"\");\n setError(cause instanceof Error ? cause.message : \"Invalid code.\");\n }\n },\n [onVerify],\n );\n\n function handleChange(value: string) {\n setCode(value);\n if (error) setError(null);\n if (autoSubmit && value.length === length && status === \"idle\") {\n void verify(value);\n }\n }\n\n async function handleResend() {\n setResendCount((count) => count + 1);\n setCode(\"\");\n setError(null);\n await onResend?.();\n }\n\n return (\n <AuthCard\n title=\"Enter verification code\"\n logo={logo}\n accent={accent}\n description={\n <span className=\"inline-flex items-center gap-1.5\">\n <ChannelIcon className=\"size-3.5 shrink-0\" />\n <span>\n We sent a {length}-digit code to your {channelLabel}\n {destination ? (\n <>\n {\" \"}\n <span className=\"font-medium text-foreground\">\n {destination}\n </span>\n </>\n ) : null}\n .\n </span>\n </span>\n }\n footer={\n status !== \"success\" && (\n <Button variant=\"link\" onClick={onBack}>\n Use a different {channelLabel}\n </Button>\n )\n }\n >\n <MorphStep step={status === \"success\" ? \"success\" : \"form\"}>\n {status === \"success\" ? (\n <AuthSuccess\n title=\"Verified\"\n description=\"Your identity has been confirmed.\"\n />\n ) : (\n <div className=\"flex flex-col items-center gap-4\">\n <motion.div\n // Shake the whole field on error; keying by message replays it.\n key={error ?? \"steady\"}\n animate={error ? { x: [0, -8, 8, -5, 5, 0] } : { x: 0 }}\n transition={{ duration: 0.4, ease: \"easeInOut\" }}\n >\n <OTPField\n length={length}\n value={code}\n onValueChange={handleChange}\n disabled={status === \"loading\"}\n >\n {Array.from({ length }, (_, index) => (\n <OTPFieldInput\n key={`slot-${index}`}\n aria-invalid={error ? true : undefined}\n aria-label={`Digit ${index + 1} of ${length}`}\n />\n ))}\n </OTPField>\n </motion.div>\n <AuthError message={error} />\n {!autoSubmit && (\n <Button\n className={cn(\"w-full\", accent && authAccentActionStyles)}\n loading={status === \"loading\"}\n disabled={code.length !== length}\n onClick={() => void verify(code)}\n >\n Verify\n </Button>\n )}\n <motion.p\n layout\n transition={{ duration: 0.25, ease: EASE }}\n className=\"text-center text-sm text-muted-foreground\"\n >\n {remaining > 0 ? (\n <>\n Resend code in{\" \"}\n <span className=\"font-medium tabular-nums text-foreground\">\n {remaining}s\n </span>\n </>\n ) : (\n <Button\n variant=\"link\"\n disabled={status === \"loading\"}\n onClick={() => void handleResend()}\n >\n Resend code\n </Button>\n )}\n </motion.p>\n </div>\n )}\n </MorphStep>\n </AuthCard>\n );\n}\n","\"use client\";\n\nimport { ArrowLeftIcon } from \"lucide-react\";\nimport * as React from \"react\";\n\nimport { Button } from \"@/components/ui/button\";\nimport { Field, FieldLabel } from \"@/components/ui/field\";\nimport { Input } from \"@/components/ui/input\";\nimport { type AuthAccent, authAccentActionStyles } from \"@/lib/auth-accent\";\nimport { cn } from \"@/lib/utils\";\nimport {\n AuthCard,\n AuthError,\n AuthSuccess,\n MorphStep,\n type AuthStatus,\n} from \"./auth-shell\";\n\nexport interface ForgotPasswordBlockProps {\n title?: string;\n description?: string;\n /** Brand mark rendered above the title. Omit for no logo row at all. */\n logo?: React.ReactNode;\n /** Brand accent for the primary action. Omit to keep the default primary. */\n accent?: AuthAccent;\n onSubmit?: (data: { email: string }) => Promise<void> | void;\n onBackToLogin?: () => void;\n}\n\nexport function ForgotPasswordBlock({\n title = \"Reset your password\",\n logo,\n accent,\n description = \"Enter your email and we will send you a reset link\",\n onSubmit,\n onBackToLogin,\n}: ForgotPasswordBlockProps) {\n const emailId = React.useId();\n const [status, setStatus] = React.useState<AuthStatus>(\"idle\");\n const [error, setError] = React.useState<string | null>(null);\n const [email, setEmail] = React.useState(\"\");\n\n async function handleSubmit(event: React.FormEvent<HTMLFormElement>) {\n event.preventDefault();\n setError(null);\n setStatus(\"loading\");\n try {\n await onSubmit?.({ email });\n setStatus(\"success\");\n } catch (cause) {\n setStatus(\"idle\");\n setError(\n cause instanceof Error ? cause.message : \"Unable to send reset link.\",\n );\n }\n }\n\n return (\n <AuthCard\n title={title}\n description={description}\n logo={logo}\n accent={accent}\n footer={\n <Button\n variant=\"link\"\n className=\"gap-1\"\n onClick={onBackToLogin}\n >\n <ArrowLeftIcon className=\"size-3.5\" />\n Back to login\n </Button>\n }\n >\n <MorphStep step={status === \"success\" ? \"success\" : \"form\"}>\n {status === \"success\" ? (\n <AuthSuccess\n title=\"Check your inbox\"\n description={\n <>\n We sent a password reset link to{\" \"}\n <span className=\"font-medium text-foreground\">{email}</span>.\n </>\n }\n >\n <Button\n variant=\"link\"\n className=\"text-xs sm:text-xs\"\n onClick={() => setStatus(\"idle\")}\n >\n Use a different email\n </Button>\n </AuthSuccess>\n ) : (\n <form className=\"flex flex-col gap-4\" onSubmit={handleSubmit}>\n <Field name=\"email\">\n <FieldLabel htmlFor={emailId}>Email</FieldLabel>\n <Input\n id={emailId}\n name=\"email\"\n type=\"email\"\n autoComplete=\"email\"\n placeholder=\"you@example.com\"\n required\n disabled={status === \"loading\"}\n value={email}\n onChange={(event) => setEmail(event.target.value)}\n />\n </Field>\n <AuthError message={error} />\n <Button\n className={cn(\"w-full\", accent && authAccentActionStyles)}\n type=\"submit\"\n loading={status === \"loading\"}\n >\n Send reset link\n </Button>\n </form>\n )}\n </MorphStep>\n </AuthCard>\n );\n}\n","\"use client\"\n\nimport { AnimatePresence, MotionConfig, motion } from \"motion/react\"\nimport * as React from \"react\"\n\nimport {\n SOCIAL_PROVIDERS,\n type SocialProvider,\n} from \"@/components/composed/social-providers\"\nimport { Button } from \"@/components/ui/button\"\nimport {\n Card,\n CardDescription,\n CardHeader,\n CardPanel,\n CardTitle,\n} from \"@/components/ui/card\"\nimport { Spinner } from \"@/components/ui/spinner\"\nimport { cn } from \"@/lib/utils\"\nimport { AuthError, EASE } from \"./auth-shell\"\n\n/** One sign-in identity attached to the account. */\nexport interface LinkedIdentity {\n id: string\n provider: SocialProvider\n /** Account address shown under the provider name, when known. */\n email?: string | null\n}\n\nexport interface LinkedAccountsBlockProps {\n title?: string\n description?: string\n /** Identities already attached to the account. */\n identities?: LinkedIdentity[]\n /** Providers offered as connect candidates; connected ones are filtered out. */\n providers?: SocialProvider[]\n /** Shows the loading row instead of the list. */\n loading?: boolean\n /**\n * The account can also sign in through a method that has no row in this\n * list — an email/password credential, say. Lifts the last-method guard,\n * which otherwise refuses to disconnect the final listed identity.\n */\n hasOtherSignInMethods?: boolean\n /** Reject (or throw) to show the inline error. */\n onLink?: (provider: SocialProvider) => Promise<void> | void\n onUnlink?: (id: string) => Promise<void> | void\n className?: string\n}\n\nconst LAST_METHOD_EXPLANATION =\n \"This is your only way to sign in, so it can't be disconnected.\"\n\n/**\n * Settings panel for the sign-in identities attached to an account: lists the\n * connected ones, offers connect buttons for the rest, and guards the last\n * remaining method from being disconnected — the guard is a disabled button\n * plus an explanation rather than an error after the fact.\n */\nexport function LinkedAccountsBlock({\n title = \"Connected accounts\",\n description = \"Manage the accounts you can use to sign in.\",\n identities = [],\n providers = [\"google\", \"apple\", \"github\"],\n loading = false,\n hasOtherSignInMethods = false,\n onLink,\n onUnlink,\n className,\n}: LinkedAccountsBlockProps) {\n const noteId = React.useId()\n const [error, setError] = React.useState<string | null>(null)\n const [linking, setLinking] = React.useState<SocialProvider | null>(null)\n const [unlinking, setUnlinking] = React.useState<string | null>(null)\n\n const connected = new Set(identities.map((identity) => identity.provider))\n const connectable = providers.filter((provider) => !connected.has(provider))\n const busy = linking !== null || unlinking !== null\n // The backend rule, enforced here so we never fire a request that would\n // remove the account's only way in. An off-list method (a password) keeps\n // the account reachable, so it lifts the guard.\n const lastMethod = !hasOtherSignInMethods && identities.length <= 1\n\n async function connect(provider: SocialProvider) {\n if (busy) return\n setError(null)\n setLinking(provider)\n try {\n await onLink?.(provider)\n } catch (cause) {\n setError(\n cause instanceof Error ? cause.message : \"Unable to connect account.\"\n )\n } finally {\n setLinking(null)\n }\n }\n\n async function disconnect(id: string) {\n if (busy || lastMethod) return\n setError(null)\n setUnlinking(id)\n try {\n await onUnlink?.(id)\n } catch (cause) {\n setError(\n cause instanceof Error ? cause.message : \"Unable to disconnect account.\"\n )\n } finally {\n setUnlinking(null)\n }\n }\n\n return (\n <MotionConfig reducedMotion=\"user\">\n <Card className={cn(\"w-full\", className)} data-slot=\"auth-block\">\n <CardHeader>\n <CardTitle>{title}</CardTitle>\n <CardDescription>{description}</CardDescription>\n </CardHeader>\n <CardPanel>\n {loading ? (\n <div className=\"flex items-center gap-2 text-sm text-muted-foreground\">\n <Spinner className=\"size-4\" />\n Loading connected accounts…\n </div>\n ) : (\n <motion.div\n layout\n transition={{ duration: 0.3, ease: EASE }}\n className=\"flex flex-col gap-3\"\n >\n <AuthError message={error} />\n\n {identities.length > 0 ? (\n <ul\n aria-label=\"Connected accounts\"\n className=\"flex flex-col gap-2\"\n >\n <AnimatePresence initial={false}>\n {identities.map((identity, index) => {\n const { label, BrandIcon, brandClassName } =\n SOCIAL_PROVIDERS[identity.provider]\n return (\n <motion.li\n key={identity.id}\n layout\n className=\"flex items-center justify-between gap-3 rounded-lg border px-3 py-2\"\n initial={{ opacity: 0, y: -4 }}\n animate={{ opacity: 1, y: 0 }}\n exit={{ opacity: 0, y: -4 }}\n // 40ms per row, capped so a long identity list never\n // leaves the last row arriving noticeably late.\n transition={{\n duration: 0.25,\n ease: EASE,\n delay: Math.min(index, 5) * 0.04,\n }}\n >\n <div className=\"flex min-w-0 items-center gap-2.5\">\n <BrandIcon\n aria-hidden=\"true\"\n className={cn(\"size-4\", brandClassName)}\n />\n <div className=\"flex min-w-0 flex-col\">\n <span className=\"text-sm font-medium\">\n {label}\n </span>\n {identity.email && (\n <span className=\"truncate text-xs text-muted-foreground\">\n {identity.email}\n </span>\n )}\n </div>\n </div>\n <Button\n aria-describedby={lastMethod ? noteId : undefined}\n aria-label={`Disconnect ${label}`}\n size=\"sm\"\n type=\"button\"\n variant=\"destructive-outline\"\n disabled={busy || lastMethod}\n loading={unlinking === identity.id}\n onClick={() => void disconnect(identity.id)}\n >\n Disconnect\n </Button>\n </motion.li>\n )\n })}\n </AnimatePresence>\n </ul>\n ) : (\n <p className=\"text-sm text-muted-foreground\">\n No sign-in methods connected yet.\n </p>\n )}\n\n {lastMethod && identities.length > 0 && (\n <p className=\"text-xs text-muted-foreground\" id={noteId}>\n {LAST_METHOD_EXPLANATION}\n </p>\n )}\n\n {connectable.map((provider) => {\n const { label, BrandIcon, brandClassName } =\n SOCIAL_PROVIDERS[provider]\n return (\n <Button\n key={provider}\n className=\"w-full\"\n type=\"button\"\n variant=\"outline\"\n disabled={busy}\n loading={linking === provider}\n onClick={() => void connect(provider)}\n >\n <BrandIcon aria-hidden=\"true\" className={brandClassName} />\n <span className=\"flex-1\">Connect {label}</span>\n </Button>\n )\n })}\n </motion.div>\n )}\n </CardPanel>\n </Card>\n </MotionConfig>\n )\n}\n","\"use client\";\n\nimport * as React from \"react\";\n\nimport { PasswordInput } from \"@/components/composed/password-input\";\nimport {\n SocialProviders,\n type SocialProvider,\n} from \"@/components/composed/social-providers\";\nimport { Button } from \"@/components/ui/button\";\nimport { Checkbox } from \"@/components/ui/checkbox\";\nimport { Field, FieldLabel } from \"@/components/ui/field\";\nimport { Input } from \"@/components/ui/input\";\nimport { Label } from \"@/components/ui/label\";\nimport { type AuthAccent, authAccentActionStyles } from \"@/lib/auth-accent\";\nimport { cn } from \"@/lib/utils\";\nimport {\n AuthCard,\n AuthError,\n AuthSeparator,\n AuthSuccess,\n MorphStep,\n Reveal,\n type AuthStatus,\n} from \"./auth-shell\";\n\nexport interface LoginBlockProps {\n title?: string;\n description?: string;\n /** Brand mark rendered above the title. Omit for no logo row at all. */\n logo?: React.ReactNode;\n /** Brand accent for the primary action. Omit to keep the default primary. */\n accent?: AuthAccent;\n /** Social providers to offer; empty array hides the social section. */\n providers?: SocialProvider[];\n showRememberMe?: boolean;\n showForgotPassword?: boolean;\n /** Reject (or throw) to show the error state with the error's message. */\n onSubmit?: (data: {\n email: string;\n password: string;\n remember: boolean;\n }) => Promise<void> | void;\n onProviderSelect?: (provider: SocialProvider) => Promise<void> | void;\n onForgotPassword?: () => void;\n onSignup?: () => void;\n}\n\nexport function LoginBlock({\n title = \"Login to your account\",\n description = \"Enter your email and password to login\",\n logo,\n accent,\n providers = [\"google\", \"apple\", \"github\"],\n showRememberMe = true,\n showForgotPassword = true,\n onSubmit,\n onProviderSelect,\n onForgotPassword,\n onSignup,\n}: LoginBlockProps) {\n const emailId = React.useId();\n const rememberId = React.useId();\n const [status, setStatus] = React.useState<AuthStatus>(\"idle\");\n const [error, setError] = React.useState<string | null>(null);\n const [loadingProvider, setLoadingProvider] =\n React.useState<SocialProvider | null>(null);\n const [remember, setRemember] = React.useState(false);\n const [email, setEmail] = React.useState(\"\");\n const [emailValid, setEmailValid] = React.useState(false);\n const [password, setPassword] = React.useState(\"\");\n\n const busy = status === \"loading\" || loadingProvider !== null;\n\n // Progressive disclosure: each step unlocks the next. The password field is\n // gated on the email input's own constraint validation (required + type\n // email), the submit button on the password being non-empty — a login form\n // verifies a credential rather than enforcing policy, so strength rules here\n // would lock out anyone whose password predates them. The submit gate\n // re-checks emailValid so a stale password (typed, then the email was edited\n // back into an invalid state) can't leave the button on its own.\n const passwordValid = password.trim().length > 0;\n const canSubmit = emailValid && passwordValid;\n\n async function handleSubmit(event: React.FormEvent<HTMLFormElement>) {\n event.preventDefault();\n // Enter in any field submits the form even while the button is hidden.\n if (!canSubmit) return;\n const form = new FormData(event.currentTarget);\n setError(null);\n setStatus(\"loading\");\n try {\n await onSubmit?.({\n email: String(form.get(\"email\") ?? \"\"),\n password: String(form.get(\"password\") ?? \"\"),\n remember,\n });\n setStatus(\"success\");\n } catch (cause) {\n setStatus(\"idle\");\n setError(cause instanceof Error ? cause.message : \"Unable to login.\");\n }\n }\n\n async function handleProvider(provider: SocialProvider) {\n setError(null);\n setLoadingProvider(provider);\n try {\n await onProviderSelect?.(provider);\n setStatus(\"success\");\n } catch (cause) {\n setError(\n cause instanceof Error ? cause.message : \"Unable to login.\",\n );\n } finally {\n setLoadingProvider(null);\n }\n }\n\n return (\n <AuthCard\n title={title}\n description={description}\n logo={logo}\n accent={accent}\n footer={\n status !== \"success\" && (\n <>\n Don&apos;t have an account?{\" \"}\n <Button variant=\"link\" onClick={onSignup}>\n Sign up\n </Button>\n </>\n )\n }\n >\n <MorphStep step={status === \"success\" ? \"success\" : \"form\"}>\n {status === \"success\" ? (\n <AuthSuccess\n title=\"Welcome back\"\n description=\"You are now logged in.\"\n />\n ) : (\n <div className=\"flex flex-col gap-4\">\n <form className=\"flex flex-col gap-4\" onSubmit={handleSubmit}>\n <Field name=\"email\">\n <FieldLabel htmlFor={emailId}>Email</FieldLabel>\n <Input\n id={emailId}\n aria-label=\"Email\"\n name=\"email\"\n type=\"email\"\n autoComplete=\"email\"\n placeholder=\"you@example.com\"\n required\n disabled={busy}\n value={email}\n onChange={(event) => {\n setEmail(event.currentTarget.value);\n setEmailValid(event.currentTarget.validity.valid);\n }}\n />\n </Field>\n <Reveal show={emailValid}>\n <Field name=\"password\">\n <FieldLabel htmlFor=\"password\">Password</FieldLabel>\n <PasswordInput\n id=\"password\"\n name=\"password\"\n autoComplete=\"current-password\"\n required\n disabled={busy}\n value={password}\n onChange={(event) => setPassword(event.target.value)}\n />\n {showForgotPassword && (\n // self-end: Field root is items-start, so this aligns the\n // link with the input's trailing edge. sm:text-xs is\n // required — the cva's sm:text-sm survives tailwind-merge\n // and would otherwise win at the breakpoint.\n <Button\n variant=\"link\"\n type=\"button\"\n className=\"self-end font-normal text-muted-foreground text-xs hover:text-foreground sm:text-xs\"\n onClick={onForgotPassword}\n >\n Forgot password?\n </Button>\n )}\n </Field>\n </Reveal>\n {showRememberMe && (\n <div className=\"flex items-center gap-2\">\n <Checkbox\n id={rememberId}\n checked={remember}\n onCheckedChange={(checked) => setRemember(checked)}\n disabled={busy}\n />\n <Label htmlFor={rememberId} className=\"font-normal\">\n Remember me\n </Label>\n </div>\n )}\n <AuthError message={error} />\n <Reveal show={canSubmit}>\n <Button\n className={cn(\"w-full\", accent && authAccentActionStyles)}\n type=\"submit\"\n loading={status === \"loading\"}\n disabled={busy}\n >\n Login\n </Button>\n </Reveal>\n </form>\n {providers.length > 0 && (\n // The social providers retire once the email path is filled in\n // and valid — the user has committed to a path, so the\n // alternatives are just noise. They come back if a field is\n // invalidated again. gap-4 on the wrapper reproduces the spacing\n // the two children had as direct flex items of the column above.\n <Reveal show={!canSubmit} className=\"flex flex-col gap-4\">\n <AuthSeparator label=\"Or continue with\" />\n <SocialProviders\n providers={providers}\n action=\"login\"\n loadingProvider={loadingProvider}\n disabled={status === \"loading\"}\n onSelect={handleProvider}\n />\n </Reveal>\n )}\n </div>\n )}\n </MorphStep>\n </AuthCard>\n );\n}\n","\"use client\";\n\nimport * as React from \"react\";\n\nimport { Button } from \"@/components/ui/button\";\nimport { Checkbox } from \"@/components/ui/checkbox\";\nimport { Field, FieldError, FieldLabel } from \"@/components/ui/field\";\nimport { Input } from \"@/components/ui/input\";\nimport { Label } from \"@/components/ui/label\";\nimport { Textarea } from \"@/components/ui/textarea\";\nimport { cn } from \"@/lib/utils\";\nimport type {\n OnboardingFieldConfig,\n OnboardingStepConfig,\n OnboardingValue,\n} from \"../onboarding-block\";\n\nexport interface ProfileStepProps {\n step: OnboardingStepConfig;\n /** Seed values, so drafts survive back/forward navigation. */\n values: Record<string, OnboardingValue>;\n submitting?: boolean;\n submitLabel: string;\n onSubmit: (values: Record<string, OnboardingValue>) => void | Promise<void>;\n onBack?: () => void;\n /** Reports every edit so the flow can restore drafts across navigation. */\n onDraftChange?: (name: string, value: OnboardingValue) => void;\n}\n\nfunction initialValue(\n field: OnboardingFieldConfig,\n saved: OnboardingValue | undefined,\n): OnboardingValue {\n if (field.kind === \"checkbox\") return typeof saved === \"boolean\" ? saved : false;\n return typeof saved === \"string\" ? saved : \"\";\n}\n\n/** Built-in validation, mirroring the declared `FieldConfig` contract. */\nfunction validateField(\n field: OnboardingFieldConfig,\n value: OnboardingValue,\n): string | null {\n const required = field.required === true;\n\n if (field.kind === \"checkbox\") {\n if (required && value !== true) return `${field.label} is required`;\n return null;\n }\n\n const text = typeof value === \"string\" ? value.trim() : \"\";\n if (required && text.length === 0) return `${field.label} is required`;\n\n if (field.kind === \"url\" && text.length > 0) {\n try {\n new URL(text);\n } catch {\n return \"Enter a valid URL\";\n }\n }\n\n if (field.kind === \"select\" && text.length > 0) {\n const allowed = field.options.map((option) => option.value);\n if (!allowed.includes(text)) {\n return `Choose a valid option for ${field.label}`;\n }\n }\n\n return field.validate?.(text) ?? null;\n}\n\n/**\n * Renders one declared profile step: `OnboardingFieldConfig[]` → labeled\n * controls, validated locally before anything is handed to `onSubmit`. Mounted\n * keyed by `step.id` so drafts re-seed per step.\n */\nexport function ProfileStep({\n step,\n values,\n submitting = false,\n submitLabel,\n onSubmit,\n onBack,\n onDraftChange,\n}: ProfileStepProps) {\n const idPrefix = React.useId();\n const [draft, setDraft] = React.useState<Record<string, OnboardingValue>>(\n () =>\n Object.fromEntries(\n step.fields.map((field) => [\n field.name,\n initialValue(field, values[field.name]),\n ]),\n ),\n );\n const [errors, setErrors] = React.useState<Record<string, string>>({});\n\n function setValue(name: string, value: OnboardingValue) {\n setDraft((current) => ({ ...current, [name]: value }));\n onDraftChange?.(name, value);\n // Clear a field's error as soon as it is edited; re-validation happens on\n // the next submit rather than on every keystroke.\n setErrors((current) =>\n current[name] ? { ...current, [name]: \"\" } : current,\n );\n }\n\n async function handleSubmit(event: React.FormEvent<HTMLFormElement>) {\n event.preventDefault();\n if (submitting) return;\n\n const next: Record<string, string> = {};\n for (const field of step.fields) {\n const message = validateField(field, draft[field.name]);\n if (message) next[field.name] = message;\n }\n if (Object.keys(next).length > 0) {\n setErrors(next);\n return;\n }\n setErrors({});\n\n const submitted: Record<string, OnboardingValue> = {};\n for (const field of step.fields) {\n const value = draft[field.name];\n submitted[field.name] = typeof value === \"string\" ? value.trim() : value;\n }\n await onSubmit(submitted);\n }\n\n return (\n <form className=\"flex flex-col gap-4\" noValidate onSubmit={handleSubmit}>\n {step.fields.map((field) => {\n const error = errors[field.name] || undefined;\n const controlId = `${idPrefix}-${field.name}`;\n const value = draft[field.name];\n\n if (field.kind === \"checkbox\") {\n return (\n <Field\n key={field.name}\n name={field.name}\n invalid={Boolean(error)}\n className=\"gap-1.5\"\n >\n <div className=\"flex items-center gap-2\">\n <Checkbox\n id={controlId}\n checked={value === true}\n disabled={submitting}\n onCheckedChange={(checked) => setValue(field.name, checked)}\n />\n <Label htmlFor={controlId} className=\"font-normal\">\n {field.label}\n </Label>\n </div>\n {error && <FieldError match>{error}</FieldError>}\n </Field>\n );\n }\n\n return (\n <Field key={field.name} name={field.name} invalid={Boolean(error)}>\n <FieldLabel htmlFor={controlId}>{field.label}</FieldLabel>\n {field.kind === \"textarea\" ? (\n <Textarea\n id={controlId}\n aria-invalid={error ? true : undefined}\n disabled={submitting}\n placeholder={field.placeholder}\n value={String(value ?? \"\")}\n onChange={(event) => setValue(field.name, event.target.value)}\n />\n ) : field.kind === \"select\" ? (\n // No select atom exists in the library yet; a native control\n // styled to match Input keeps the flow self-contained without\n // inventing one here.\n <select\n id={controlId}\n aria-invalid={error ? true : undefined}\n className={cn(\n \"h-8.5 w-full rounded-lg border border-input bg-background px-[calc(--spacing(3)-1px)] text-base text-foreground shadow-xs/5 outline-none transition-[box-shadow,border-color] duration-150 ease-smooth-out focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/24 disabled:opacity-64 aria-invalid:border-destructive/36 sm:h-7.5 sm:text-sm dark:bg-input/32\",\n )}\n disabled={submitting}\n value={String(value ?? \"\")}\n onChange={(event) => setValue(field.name, event.target.value)}\n >\n <option value=\"\">{field.placeholder ?? \"Choose an option\"}</option>\n {field.options.map((option) => (\n <option key={option.value} value={option.value}>\n {option.label}\n </option>\n ))}\n </select>\n ) : (\n <Input\n id={controlId}\n aria-invalid={error ? true : undefined}\n disabled={submitting}\n placeholder={field.placeholder}\n type={field.kind === \"url\" ? \"url\" : \"text\"}\n value={String(value ?? \"\")}\n onChange={(event) => setValue(field.name, event.target.value)}\n />\n )}\n {error && <FieldError match>{error}</FieldError>}\n </Field>\n );\n })}\n\n <div className=\"flex gap-2\">\n {onBack && (\n <Button\n type=\"button\"\n variant=\"outline\"\n disabled={submitting}\n onClick={onBack}\n >\n Back\n </Button>\n )}\n <Button className=\"flex-1\" type=\"submit\" loading={submitting}>\n {submitLabel}\n </Button>\n </div>\n </form>\n );\n}\n","\"use client\";\n\nimport * as React from \"react\";\n\nimport { cn } from \"@/lib/utils\";\nimport type { AuthAccent } from \"@/lib/auth-accent\";\nimport {\n AuthCard,\n AuthError,\n AuthSuccess,\n MorphStep,\n type AuthStatus,\n} from \"./auth-shell\";\nimport { ProfileStep } from \"./onboarding/profile-step\";\n\n/** Value a single onboarding field can hold. */\nexport type OnboardingValue = string | boolean;\n\nexport interface OnboardingSelectOption {\n value: string;\n label: string;\n}\n\ninterface OnboardingFieldBase {\n /** Key the value is collected under; unique within the flow. */\n name: string;\n label: string;\n /** Required fields gate the step's advance. */\n required?: boolean;\n placeholder?: string;\n /** Extra validation; return a message to reject, `null` to accept. */\n validate?: (value: string) => string | null;\n}\n\nexport interface OnboardingTextField extends OnboardingFieldBase {\n kind: \"text\" | \"textarea\" | \"url\";\n}\n\nexport interface OnboardingCheckboxField extends OnboardingFieldBase {\n kind: \"checkbox\";\n}\n\nexport interface OnboardingSelectField extends OnboardingFieldBase {\n kind: \"select\";\n options: OnboardingSelectOption[];\n}\n\n/** Discriminated on `kind`. */\nexport type OnboardingFieldConfig =\n | OnboardingTextField\n | OnboardingCheckboxField\n | OnboardingSelectField;\n\nexport interface OnboardingStepConfig {\n /** Unique within the flow and stable across releases. */\n id: string;\n title: string;\n description?: string;\n fields: OnboardingFieldConfig[];\n}\n\n/** Default configuration: a single required display-name step. */\nexport const DEFAULT_ONBOARDING_STEPS: OnboardingStepConfig[] = [\n {\n id: \"profile\",\n title: \"Your profile\",\n fields: [\n { kind: \"text\", name: \"display_name\", label: \"Display name\", required: true },\n ],\n },\n];\n\nexport interface OnboardingBlockProps {\n /** Declared profile steps. */\n steps?: OnboardingStepConfig[];\n /** Brand mark rendered above the title. Omit for no logo row at all. */\n logo?: React.ReactNode;\n /** Brand accent for the primary action. Omit to keep the default primary. */\n accent?: AuthAccent;\n /**\n * Fires per step as it is submitted. Reject (or throw) to keep the user on\n * the step and show the error.\n */\n onStepSubmit?: (\n stepId: string,\n values: Record<string, OnboardingValue>,\n ) => Promise<void> | void;\n /** Fires once, after the final step is accepted, with the merged profile. */\n onComplete?: (profile: Record<string, OnboardingValue>) => Promise<void> | void;\n /** Shows a brief success screen once onboarding completes. */\n showCompleteScreen?: boolean;\n className?: string;\n}\n\n/**\n * Multi-step profile onboarding: a declared `steps` config renders as\n * progress-tracked forms with back/forward navigation, per-step submission and\n * a single completion signal. Drafts survive back-navigation, and the step\n * heading takes focus on advance so a screen reader announces where the flow\n * moved.\n *\n * Account creation and email confirmation are separate blocks (`SignupBlock`,\n * `CodeAuthBlock`) — this one picks up once the account exists.\n */\nexport function OnboardingBlock({\n steps = DEFAULT_ONBOARDING_STEPS,\n logo,\n accent,\n onStepSubmit,\n onComplete,\n showCompleteScreen = true,\n className,\n}: OnboardingBlockProps) {\n const headingRef = React.useRef<HTMLHeadingElement>(null);\n // Unsubmitted per-step drafts. Accumulated in a ref so a keystroke does not\n // re-render the whole flow, then published to state at each navigation —\n // the only moment the seed values are actually read.\n const draftsRef = React.useRef<\n Record<string, Record<string, OnboardingValue>>\n >({});\n const [drafts, setDrafts] = React.useState<\n Record<string, Record<string, OnboardingValue>>\n >({});\n\n const [index, setIndex] = React.useState(0);\n const [values, setValues] = React.useState<Record<string, OnboardingValue>>(\n {},\n );\n const [status, setStatus] = React.useState<AuthStatus>(\"idle\");\n const [error, setError] = React.useState<string | null>(null);\n\n const done = status === \"success\";\n const step = steps[index];\n const last = index >= steps.length - 1;\n\n // Focus the step heading on advance; on error the alert carries the message\n // and stealing focus would talk over it.\n React.useEffect(() => {\n if (error) return;\n headingRef.current?.focus();\n }, [index, done, error]);\n\n async function handleStepSubmit(stepValues: Record<string, OnboardingValue>) {\n if (!step) return;\n const merged = { ...values, ...stepValues };\n setError(null);\n setStatus(\"loading\");\n try {\n await onStepSubmit?.(step.id, stepValues);\n if (last) await onComplete?.(merged);\n setValues(merged);\n delete draftsRef.current[step.id];\n setDrafts({ ...draftsRef.current });\n setStatus(last ? \"success\" : \"idle\");\n if (!last) setIndex((current) => current + 1);\n } catch (cause) {\n setStatus(\"idle\");\n setError(\n cause instanceof Error ? cause.message : \"Unable to save your profile.\",\n );\n }\n }\n\n if (done && !showCompleteScreen) return null;\n\n const heading = done ? \"You're all set\" : (step?.title ?? \"Your profile\");\n\n return (\n <AuthCard\n title={heading}\n description={done ? undefined : step?.description}\n logo={logo}\n accent={accent}\n className={className}\n >\n <MorphStep step={done ? \"done\" : `step-${index}`}>\n {done ? (\n <AuthSuccess\n title=\"Profile saved\"\n description=\"Your account is ready and your profile has been saved.\"\n />\n ) : step ? (\n <div className=\"flex flex-col gap-4\">\n <nav aria-label=\"Onboarding progress\">\n <ol className=\"flex flex-wrap gap-x-3 gap-y-1 text-xs\">\n {steps.map((item, itemIndex) => (\n <li\n key={item.id}\n aria-current={itemIndex === index ? \"step\" : undefined}\n className={cn(\n \"text-muted-foreground\",\n itemIndex === index && \"font-medium text-foreground\",\n )}\n >\n {item.title}\n {itemIndex < index && (\n <span className=\"sr-only\"> (completed)</span>\n )}\n </li>\n ))}\n </ol>\n </nav>\n\n {/* The AuthCard title is the visible heading; this one exists to\n take focus on advance without duplicating it on screen. */}\n <h3 ref={headingRef} tabIndex={-1} className=\"sr-only\">\n {step.title}\n </h3>\n\n <AuthError message={error} />\n\n <ProfileStep\n key={step.id}\n step={step}\n values={{ ...values, ...drafts[step.id] }}\n submitting={status === \"loading\"}\n submitLabel={last ? \"Finish\" : \"Continue\"}\n onBack={\n index > 0\n ? () => {\n setError(null);\n setDrafts({ ...draftsRef.current });\n setIndex((current) => current - 1);\n }\n : undefined\n }\n onDraftChange={(name, value) => {\n draftsRef.current[step.id] = {\n ...draftsRef.current[step.id],\n [name]: value,\n };\n }}\n onSubmit={handleStepSubmit}\n />\n </div>\n ) : null}\n </MorphStep>\n </AuthCard>\n );\n}\n","\"use client\"\n\nimport { KeyRoundIcon } from \"lucide-react\"\nimport { AnimatePresence, MotionConfig, motion } from \"motion/react\"\nimport * as React from \"react\"\n\nimport { Button } from \"@/components/ui/button\"\nimport {\n Card,\n CardDescription,\n CardHeader,\n CardPanel,\n CardTitle,\n} from \"@/components/ui/card\"\nimport { Field, FieldError, FieldLabel } from \"@/components/ui/field\"\nimport { Input } from \"@/components/ui/input\"\nimport { Spinner } from \"@/components/ui/spinner\"\nimport { cn } from \"@/lib/utils\"\nimport { AuthError, EASE, Reveal } from \"./auth-shell\"\n\n/** One registered passkey, as rendered by {@link PasskeyManagerBlock}. */\nexport interface PasskeyRecord {\n id: string\n /** Server-derived name; falls back to \"Passkey\" when absent. */\n name?: string | null\n /** ISO timestamps. Unparseable values are simply not shown. */\n createdAt?: string | null\n lastUsedAt?: string | null\n}\n\nexport interface PasskeyManagerBlockProps {\n title?: string\n description?: string\n /** The account's passkeys, newest first. */\n passkeys?: PasskeyRecord[]\n /** Whether this device can register passkeys at all. */\n available?: boolean\n /** Shows the loading row instead of the list. */\n loading?: boolean\n /**\n * Reject (or throw) to show the error. Resolving with `{ cancelled: true }`\n * returns silently to idle — a dismissed OS prompt is not a failure.\n */\n onRegister?: () => Promise<{ cancelled?: boolean } | void> | void\n onRename?: (id: string, name: string) => Promise<void> | void\n onDelete?: (id: string) => Promise<void> | void\n className?: string\n}\n\nconst NAME_MAX = 120\n\nconst LAST_PASSKEY_WARNING =\n \"This is your last passkey. After deleting it you won't be able to sign in with a passkey until you register a new one.\"\n\nfunction formatDate(iso: string | null | undefined): string | null {\n if (!iso) return null\n const date = new Date(iso)\n return Number.isNaN(date.getTime()) ? null : date.toLocaleDateString()\n}\n\n/**\n * Settings panel for the passkeys on an account: register, inline rename with\n * field-level validation, and delete behind an explicit confirmation. Deleting\n * the last passkey is allowed — it is the account's passkey method that goes\n * away, not its only way in — so the confirmation carries a warning instead of\n * a block.\n */\nexport function PasskeyManagerBlock({\n title = \"Passkeys\",\n description = \"Sign in without a password using your device's biometrics or security key.\",\n passkeys = [],\n available = true,\n loading = false,\n onRegister,\n onRename,\n onDelete,\n className,\n}: PasskeyManagerBlockProps) {\n const [error, setError] = React.useState<string | null>(null)\n const [busy, setBusy] = React.useState(false)\n const [registering, setRegistering] = React.useState(false)\n const [renamingId, setRenamingId] = React.useState<string | null>(null)\n const [renameValue, setRenameValue] = React.useState(\"\")\n const [renameError, setRenameError] = React.useState<string | null>(null)\n const [confirmingId, setConfirmingId] = React.useState<string | null>(null)\n\n const lastPasskey = passkeys.length === 1\n\n async function run(action: () => Promise<unknown> | unknown) {\n if (busy) return { ok: false } as const\n setError(null)\n setBusy(true)\n try {\n const result = await action()\n return { ok: true, result } as const\n } catch (cause) {\n setError(cause instanceof Error ? cause.message : \"Something went wrong.\")\n return { ok: false } as const\n } finally {\n setBusy(false)\n }\n }\n\n async function handleRegister() {\n setRegistering(true)\n await run(() => onRegister?.())\n setRegistering(false)\n }\n\n function startRename(passkey: PasskeyRecord) {\n setConfirmingId(null)\n setRenamingId(passkey.id)\n setRenameValue(passkey.name ?? \"\")\n setRenameError(null)\n }\n\n async function submitRename(id: string) {\n const name = renameValue.trim()\n if (name.length < 1 || name.length > NAME_MAX) {\n setRenameError(`Name must be between 1 and ${NAME_MAX} characters.`)\n return\n }\n const outcome = await run(() => onRename?.(id, name))\n if (!outcome.ok) return\n setRenamingId(null)\n setRenameError(null)\n }\n\n async function confirmDelete(id: string) {\n const outcome = await run(() => onDelete?.(id))\n setConfirmingId(null)\n if (!outcome.ok) return\n if (renamingId === id) setRenamingId(null)\n }\n\n return (\n <MotionConfig reducedMotion=\"user\">\n <Card className={cn(\"w-full\", className)} data-slot=\"auth-block\">\n <CardHeader>\n <CardTitle>{title}</CardTitle>\n <CardDescription>{description}</CardDescription>\n </CardHeader>\n <CardPanel>\n {!available ? (\n <p className=\"text-sm text-muted-foreground\">\n Passkeys aren&apos;t available on this device. You can manage them\n from a device that supports passkeys.\n </p>\n ) : loading ? (\n <div className=\"flex items-center gap-2 text-sm text-muted-foreground\">\n <Spinner className=\"size-4\" />\n Loading passkeys…\n </div>\n ) : (\n <motion.div\n layout\n transition={{ duration: 0.3, ease: EASE }}\n className=\"flex flex-col gap-3\"\n >\n <AuthError message={error} />\n\n {passkeys.length > 0 ? (\n <ul aria-label=\"Passkeys\" className=\"flex flex-col gap-2\">\n <AnimatePresence initial={false}>\n {passkeys.map((passkey, index) => {\n const name = passkey.name ?? \"Passkey\"\n const created = formatDate(passkey.createdAt)\n const lastUsed = formatDate(passkey.lastUsedAt)\n return (\n <motion.li\n key={passkey.id}\n layout\n className=\"flex flex-col gap-2 rounded-lg border px-3 py-2\"\n initial={{ opacity: 0, y: -4 }}\n animate={{ opacity: 1, y: 0 }}\n exit={{ opacity: 0, y: -4 }}\n // 40ms per row, capped so a long list never leaves\n // the last row arriving noticeably late.\n transition={{\n duration: 0.25,\n ease: EASE,\n delay: Math.min(index, 5) * 0.04,\n }}\n >\n <div className=\"flex items-center justify-between gap-3\">\n <div className=\"flex min-w-0 items-center gap-2.5\">\n <span\n aria-hidden=\"true\"\n className=\"grid size-8 shrink-0 place-items-center rounded-md bg-muted text-muted-foreground\"\n >\n <KeyRoundIcon className=\"size-4\" />\n </span>\n <div className=\"flex min-w-0 flex-col\">\n <span className=\"truncate text-sm font-medium\">\n {name}\n </span>\n <span className=\"text-xs text-muted-foreground\">\n {created ? `Added ${created}` : null}\n {created && lastUsed ? \" · \" : null}\n {lastUsed ? `Last used ${lastUsed}` : null}\n </span>\n </div>\n </div>\n <div className=\"flex shrink-0 gap-2\">\n <Button\n aria-label={`Rename ${name}`}\n size=\"sm\"\n type=\"button\"\n variant=\"outline\"\n disabled={busy}\n onClick={() => startRename(passkey)}\n >\n Rename\n </Button>\n <Button\n aria-label={`Delete ${name}`}\n size=\"sm\"\n type=\"button\"\n variant=\"destructive-outline\"\n disabled={busy}\n onClick={() => {\n setRenamingId(null)\n setConfirmingId(passkey.id)\n }}\n >\n Delete\n </Button>\n </div>\n </div>\n\n <Reveal show={renamingId === passkey.id}>\n <form\n className=\"flex items-start gap-2 pt-1\"\n onSubmit={(event) => {\n event.preventDefault()\n void submitRename(passkey.id)\n }}\n >\n <Field\n className=\"min-w-0 grow\"\n invalid={Boolean(renameError)}\n >\n <FieldLabel className=\"sr-only\">\n Passkey name\n </FieldLabel>\n <Input\n aria-label=\"Passkey name\"\n aria-invalid={renameError ? true : undefined}\n autoFocus\n disabled={busy}\n maxLength={NAME_MAX + 1}\n value={renameValue}\n onChange={(event) =>\n setRenameValue(event.target.value)\n }\n />\n {renameError && (\n <FieldError match>{renameError}</FieldError>\n )}\n </Field>\n <Button size=\"sm\" type=\"submit\" loading={busy}>\n Save\n </Button>\n <Button\n size=\"sm\"\n type=\"button\"\n variant=\"ghost\"\n disabled={busy}\n onClick={() => setRenamingId(null)}\n >\n Cancel\n </Button>\n </form>\n </Reveal>\n\n <Reveal show={confirmingId === passkey.id}>\n <div\n className=\"flex flex-col gap-2 rounded-lg bg-muted/50 p-2\"\n role=\"alertdialog\"\n aria-label={`Confirm deleting ${name}`}\n >\n <p className=\"text-sm\">\n Delete this passkey? It can no longer be used to\n sign in.\n </p>\n {lastPasskey && (\n <p className=\"text-xs text-destructive-foreground\">\n {LAST_PASSKEY_WARNING}\n </p>\n )}\n <div className=\"flex gap-2\">\n <Button\n size=\"sm\"\n type=\"button\"\n variant=\"destructive\"\n loading={busy}\n onClick={() => void confirmDelete(passkey.id)}\n >\n Delete passkey\n </Button>\n <Button\n size=\"sm\"\n type=\"button\"\n variant=\"ghost\"\n disabled={busy}\n onClick={() => setConfirmingId(null)}\n >\n Keep it\n </Button>\n </div>\n </div>\n </Reveal>\n </motion.li>\n )\n })}\n </AnimatePresence>\n </ul>\n ) : (\n <p className=\"text-sm text-muted-foreground\">\n No passkeys registered yet. Add one to sign in without a\n password.\n </p>\n )}\n\n <Button\n className=\"w-full\"\n type=\"button\"\n variant=\"outline\"\n disabled={busy}\n loading={registering}\n onClick={() => void handleRegister()}\n >\n Add a passkey\n </Button>\n </motion.div>\n )}\n </CardPanel>\n </Card>\n </MotionConfig>\n )\n}\n","\"use client\";\n\nimport { FingerprintIcon } from \"lucide-react\";\nimport * as React from \"react\";\n\nimport { Button } from \"@/components/ui/button\";\nimport { cn } from \"@/lib/utils\";\nimport { AuthError, Reveal } from \"./auth-shell\";\n\nexport interface PasskeySignInBlockProps {\n /**\n * Whether this device can use passkeys. `false` renders nothing at all —\n * a passkey button that is guaranteed to fail is worse than no button.\n */\n available?: boolean;\n /** Button label. */\n label?: string;\n /**\n * Reject (or throw) to show the inline error. Resolving with\n * `{ cancelled: true }` returns silently to idle — a dismissed OS prompt is\n * not a failure and must not surface an error.\n */\n onSignIn?: () => Promise<{ cancelled?: boolean } | void> | void;\n /** Hint shown under an error, pointing at the remaining sign-in methods. */\n fallbackHint?: React.ReactNode;\n className?: string;\n}\n\n/**\n * Passkey sign-in entry point — a single button plus its error state, sized\n * to drop into a login card next to the password form rather than to stand on\n * its own. Renders `null` while passkeys are unavailable.\n */\nexport function PasskeySignInBlock({\n available = true,\n label = \"Sign in with a passkey\",\n onSignIn,\n fallbackHint = \"You can still sign in with your other methods below.\",\n className,\n}: PasskeySignInBlockProps) {\n const [error, setError] = React.useState<string | null>(null);\n const [loading, setLoading] = React.useState(false);\n\n if (!available) return null;\n\n async function handleClick() {\n if (loading) return;\n setError(null);\n setLoading(true);\n try {\n await onSignIn?.();\n } catch (cause) {\n setError(\n cause instanceof Error\n ? cause.message\n : \"Unable to sign in with a passkey.\",\n );\n } finally {\n setLoading(false);\n }\n }\n\n return (\n <div className={cn(\"flex w-full flex-col gap-2\", className)}>\n <Button\n variant=\"outline\"\n className=\"w-full\"\n type=\"button\"\n loading={loading}\n onClick={() => void handleClick()}\n >\n <FingerprintIcon aria-hidden=\"true\" />\n <span className=\"flex-1\">{label}</span>\n </Button>\n <AuthError message={error} />\n <Reveal show={Boolean(error) && Boolean(fallbackHint)}>\n <p className=\"text-xs text-muted-foreground\">{fallbackHint}</p>\n </Reveal>\n </div>\n );\n}\n","\"use client\";\n\nimport * as React from \"react\";\n\nimport {\n PasswordInput,\n getPasswordStrength,\n passwordRequirements,\n} from \"@/components/composed/password-input\";\nimport {\n SocialProviders,\n type SocialProvider,\n} from \"@/components/composed/social-providers\";\nimport { Button } from \"@/components/ui/button\";\nimport { Checkbox } from \"@/components/ui/checkbox\";\nimport { Field, FieldLabel } from \"@/components/ui/field\";\nimport { Input } from \"@/components/ui/input\";\nimport { Label } from \"@/components/ui/label\";\nimport { type AuthAccent, authAccentActionStyles } from \"@/lib/auth-accent\";\nimport { cn } from \"@/lib/utils\";\nimport {\n AuthCard,\n AuthError,\n AuthSeparator,\n AuthSuccess,\n MorphStep,\n Reveal,\n type AuthStatus,\n} from \"./auth-shell\";\n\nexport interface SignupBlockProps {\n title?: string;\n description?: string;\n /**\n * Replaces the built-in \"terms\" link inside the consent label — pass your\n * own dialog trigger to render it inline instead of wiring `onTerms`.\n */\n termsComponent?: React.ReactNode;\n /** Brand mark rendered above the title. Omit for no logo row at all. */\n logo?: React.ReactNode;\n /** Brand accent for the primary action. Omit keeping the default primary. */\n accent?: AuthAccent;\n providers?: SocialProvider[];\n showNameField?: boolean;\n /** Require the term checkbox before submitting. */\n showTerms?: boolean;\n /**\n * Controls the term checkbox. Pass it with `onTermsCheckedChange` when\n * something outside the block has to tick the box — an \"I agree\" action in\n * your own terms dialog, say. Omit letting the block own the state.\n */\n termsChecked?: boolean;\n /** Starting state of the term checkbox while it is uncontrolled. */\n defaultTermsChecked?: boolean;\n /** Fires on every change, controlled or not. */\n onTermsCheckedChange?: (checked: boolean) => void;\n /** Block submission until every password requirement is met. */\n enforceStrongPassword?: boolean;\n onSubmit?: (data: {\n name: string;\n email: string;\n password: string;\n }) => Promise<void> | void;\n onProviderSelect?: (provider: SocialProvider) => Promise<void> | void;\n onLogin?: () => void;\n onTerms?: () => void;\n}\n\nexport function SignupBlock({\n title = \"Create your account\",\n description = \"Start exploring manuscripts in minutes\",\n logo,\n accent,\n providers = [\"google\", \"apple\", \"github\"],\n showNameField = true,\n showTerms = true,\n termsChecked,\n defaultTermsChecked = false,\n onTermsCheckedChange,\n enforceStrongPassword = true,\n onSubmit,\n termsComponent,\n onProviderSelect,\n onLogin,\n onTerms,\n}: SignupBlockProps) {\n const nameId = React.useId();\n const emailId = React.useId();\n const passwordId = React.useId();\n const termsId = React.useId();\n const [status, setStatus] = React.useState<AuthStatus>(\"idle\");\n const [error, setError] = React.useState<string | null>(null);\n const [loadingProvider, setLoadingProvider] =\n React.useState<SocialProvider | null>(null);\n const [password, setPassword] = React.useState(\"\");\n // Controlled when `termsChecked` is passed, uncontrolled otherwise. The\n // internal state is kept either way, so a block that switches between the\n // two mid-life does not lose the box, and the callback fires in both modes.\n const [uncontrolledTerms, setUncontrolledTerms] =\n React.useState(defaultTermsChecked);\n const terms = termsChecked ?? uncontrolledTerms;\n\n function handleTermsChange(checked: boolean) {\n if (termsChecked === undefined) setUncontrolledTerms(checked);\n onTermsCheckedChange?.(checked);\n }\n // Tracked from each input's own constraint validation rather than a regex.\n // The values stay uncontrolled — only validity is needed, and the form reads\n // values from FormData on submit.\n const [emailValid, setEmailValid] = React.useState(false);\n const [nameValid, setNameValid] = React.useState(false);\n\n const busy = status === \"loading\" || loadingProvider !== null;\n const strongEnough =\n !enforceStrongPassword ||\n getPasswordStrength(password) === passwordRequirements.length;\n\n // The social providers retire once the email path is filled in and valid —\n // the user has committed to a path, so the alternatives are just noise. It\n // comes back if they invalidate a field again.\n const passwordValid = password.trim().length > 0 && strongEnough;\n const emailPathComplete =\n (!showNameField || nameValid) && emailValid && passwordValid;\n\n async function handleSubmit(event: React.SubmitEvent<HTMLFormElement>) {\n event.preventDefault();\n setError(null);\n if (!strongEnough) {\n setError(\"Please meet all password requirements.\");\n return;\n }\n if (showTerms && !terms) {\n setError(\"Please accept the terms to continue.\");\n return;\n }\n const form = new FormData(event.currentTarget);\n setStatus(\"loading\");\n try {\n await onSubmit?.({\n name: String(form.get(\"name\") ?? \"\"),\n email: String(form.get(\"email\") ?? \"\"),\n password,\n });\n setStatus(\"success\");\n } catch (cause) {\n setStatus(\"idle\");\n setError(\n cause instanceof Error ? cause.message : \"Unable to create account.\",\n );\n }\n }\n\n async function handleProvider(provider: SocialProvider) {\n setError(null);\n setLoadingProvider(provider);\n try {\n await onProviderSelect?.(provider);\n setStatus(\"success\");\n } catch (cause) {\n setError(\n cause instanceof Error ? cause.message : \"Unable to create account.\",\n );\n } finally {\n setLoadingProvider(null);\n }\n }\n\n return (\n <AuthCard\n title={title}\n description={description}\n logo={logo}\n accent={accent}\n footer={\n status !== \"success\" && (\n <>\n Already have an account?{\" \"}\n <Button variant=\"link\" onClick={onLogin}>\n Login\n </Button>\n </>\n )\n }\n >\n <MorphStep step={status === \"success\" ? \"success\" : \"form\"}>\n {status === \"success\" ? (\n <AuthSuccess\n title=\"Account created\"\n description=\"Check your inbox to confirm your email address.\"\n />\n ) : (\n <div className=\"flex flex-col gap-4\">\n {providers.length > 0 && (\n // gap-4 on the wrapper reproduces the spacing the two children\n // had as direct flex items of the column above.\n <Reveal show={!emailPathComplete} className=\"flex flex-col gap-4\">\n <SocialProviders\n providers={providers}\n action=\"signup\"\n loadingProvider={loadingProvider}\n disabled={status === \"loading\"}\n onSelect={handleProvider}\n />\n <AuthSeparator label=\"Or with email\" />\n </Reveal>\n )}\n <form className=\"flex flex-col gap-4\" onSubmit={handleSubmit}>\n {showNameField && (\n <Field name=\"name\">\n <FieldLabel htmlFor={nameId}>Name</FieldLabel>\n <Input\n aria-label=\"Name\"\n id={nameId}\n name=\"name\"\n autoComplete=\"name\"\n placeholder=\"Your name\"\n required\n disabled={busy}\n onChange={(event) =>\n setNameValid(event.currentTarget.validity.valid)\n }\n />\n </Field>\n )}\n <Field name=\"email\">\n <FieldLabel htmlFor={emailId}>Email</FieldLabel>\n <Input\n id={emailId}\n name=\"email\"\n type=\"email\"\n aria-label=\"Email\"\n autoComplete=\"email\"\n placeholder=\"you@example.com\"\n required\n disabled={busy}\n onChange={(event) =>\n setEmailValid(event.currentTarget.validity.valid)\n }\n />\n </Field>\n <Reveal show={emailValid}>\n <Field name=\"password\">\n <FieldLabel htmlFor={passwordId}>Password</FieldLabel>\n <PasswordInput\n id={passwordId}\n name=\"password\"\n aria-label=\"Password\"\n autoComplete=\"new-password\"\n placeholder=\"Create a password\"\n showStrength\n required\n disabled={busy}\n value={password}\n onChange={(event) => setPassword(event.target.value)}\n />\n </Field>\n </Reveal>\n {showTerms && (\n <div className=\"flex items-center gap-2\">\n <Checkbox\n id={termsId}\n checked={terms}\n onCheckedChange={(checked) =>\n handleTermsChange(checked === true)\n }\n disabled={busy}\n />\n <Label htmlFor={termsId} className=\"font-normal\">\n I agree to the{\" \"}\n {termsComponent ?? (\n <Button variant=\"link\" type=\"button\" onClick={onTerms}>\n terms\n </Button>\n )}\n </Label>\n </div>\n )}\n <AuthError message={error} />\n <Button\n className={cn(\"w-full\", accent && authAccentActionStyles)}\n type=\"submit\"\n loading={status === \"loading\"}\n disabled={busy}\n >\n Create account\n </Button>\n </form>\n </div>\n )}\n </MorphStep>\n </AuthCard>\n );\n}\n","\"use client\";\n\nimport * as React from \"react\";\n\nimport {\n getPasswordStrength,\n PasswordInput,\n} from \"@/components/composed/password-input\";\nimport { Button } from \"@/components/ui/button\";\nimport { Field, FieldLabel } from \"@/components/ui/field\";\nimport { type AuthAccent, authAccentActionStyles } from \"@/lib/auth-accent\";\nimport { cn } from \"@/lib/utils\";\nimport {\n AuthCard,\n AuthError,\n AuthSuccess,\n MorphStep,\n Reveal,\n type AuthStatus,\n} from \"./auth-shell\";\n\nexport interface UpdatePasswordBlockProps {\n title?: string;\n description?: string;\n /** Brand mark rendered above the title. Omit for no logo row at all. */\n logo?: React.ReactNode;\n /** Brand accent for the primary action. Omit to keep the default primary. */\n accent?: AuthAccent;\n /**\n * Minimum strength (0-4, as scored by `getPasswordStrength`) the new\n * password must reach before the confirm field is revealed. 0 disables the\n * gate.\n */\n minStrength?: number;\n /** Reject (or throw) to show the error state with the error's message. */\n onSubmit?: (data: { password: string }) => Promise<void> | void;\n onDone?: () => void;\n}\n\n/**\n * Password change form for an already-authenticated user: a strength-metered\n * new password gates the confirm field, which in turn gates the submit\n * button. Mismatch is caught client-side; everything else comes back as a\n * rejection from `onSubmit`.\n */\nexport function UpdatePasswordBlock({\n title = \"Update your password\",\n description = \"Choose a new password for your account\",\n logo,\n accent,\n minStrength = 4,\n onSubmit,\n onDone,\n}: UpdatePasswordBlockProps) {\n const passwordId = React.useId();\n const confirmId = React.useId();\n const [status, setStatus] = React.useState<AuthStatus>(\"idle\");\n const [error, setError] = React.useState<string | null>(null);\n const [password, setPassword] = React.useState(\"\");\n const [confirmPassword, setConfirmPassword] = React.useState(\"\");\n\n // Progressive disclosure, matching the signup block: the confirm field\n // appears once the new password clears the policy, the submit button once\n // the two match.\n const strongEnough = getPasswordStrength(password) >= minStrength;\n const matches = confirmPassword.length > 0 && confirmPassword === password;\n const canSubmit = strongEnough && matches;\n\n // Only flag a mismatch once the confirmation has diverged — while it is\n // still a prefix of the new password the user is simply mid-keystroke, and\n // nagging on every character would shake the field the whole way through.\n const mismatch =\n confirmPassword.length > 0 && !password.startsWith(confirmPassword);\n\n async function handleSubmit(event: React.FormEvent<HTMLFormElement>) {\n event.preventDefault();\n // Enter in any field submits the form even while the button is hidden.\n if (!canSubmit) return;\n setError(null);\n setStatus(\"loading\");\n try {\n await onSubmit?.({ password });\n setStatus(\"success\");\n } catch (cause) {\n setStatus(\"idle\");\n setError(\n cause instanceof Error ? cause.message : \"Unable to update password.\",\n );\n }\n }\n\n return (\n <AuthCard\n title={title}\n description={description}\n logo={logo}\n accent={accent}\n >\n <MorphStep step={status === \"success\" ? \"success\" : \"form\"}>\n {status === \"success\" ? (\n <AuthSuccess\n title=\"Password updated\"\n description=\"Your password has been changed successfully.\"\n >\n {onDone && (\n <Button variant=\"link\" onClick={onDone}>\n Continue\n </Button>\n )}\n </AuthSuccess>\n ) : (\n <form className=\"flex flex-col gap-4\" onSubmit={handleSubmit}>\n <Field name=\"password\">\n <FieldLabel htmlFor={passwordId}>New password</FieldLabel>\n <PasswordInput\n id={passwordId}\n name=\"password\"\n autoComplete=\"new-password\"\n required\n showStrength\n disabled={status === \"loading\"}\n value={password}\n onChange={(event) => setPassword(event.target.value)}\n />\n </Field>\n <Reveal show={strongEnough}>\n <Field name=\"confirmPassword\">\n <FieldLabel htmlFor={confirmId}>Confirm new password</FieldLabel>\n <PasswordInput\n id={confirmId}\n name=\"confirmPassword\"\n autoComplete=\"new-password\"\n required\n disabled={status === \"loading\"}\n value={confirmPassword}\n onChange={(event) => setConfirmPassword(event.target.value)}\n />\n </Field>\n </Reveal>\n <AuthError\n message={error ?? (mismatch ? \"Passwords do not match.\" : null)}\n />\n <Reveal show={canSubmit}>\n <Button\n className={cn(\"w-full\", accent && authAccentActionStyles)}\n type=\"submit\"\n loading={status === \"loading\"}\n >\n Update password\n </Button>\n </Reveal>\n </form>\n )}\n </MorphStep>\n </AuthCard>\n );\n}\n","export const EASE_OUT = [0.16, 1, 0.3, 1] as const;\nexport const EASE_IN_OUT = [0.77, 0, 0.175, 1] as const;\nexport const EASE_DRAWER = [0.32, 0.72, 0, 1] as const;\n\n/** CSS string form of EASE_OUT for inline style transitions. */\nexport const EASE_OUT_CSS = \"cubic-bezier(0.16, 1, 0.3, 1)\";\n\n/** Press feedback on buttons and other tappable surfaces. */\nexport const SPRING_PRESS = {\n type: \"spring\",\n stiffness: 500,\n damping: 30,\n mass: 0.6,\n} as const;\n\n/** Content swaps — label/icon slots trading places inside a control. */\nexport const SPRING_SWAP = {\n type: \"spring\",\n stiffness: 460,\n damping: 30,\n mass: 0.55,\n} as const;\n\n/** Overlay panel entrances — modals and sheets summoned by pointer. */\nexport const SPRING_PANEL = {\n type: \"spring\",\n stiffness: 420,\n damping: 40,\n mass: 0.5,\n} as const;\n\n/** Shared-layout glides — pills, indicators and panels morphing between positions. */\nexport const SPRING_LAYOUT = {\n type: \"spring\",\n stiffness: 360,\n damping: 32,\n mass: 0.6,\n} as const;\n\n/** Cursor-follow physics for decorative mouse tracking (magnetic, tilt, dock). */\nexport const SPRING_MOUSE = {\n stiffness: 200,\n damping: 15,\n mass: 0.3,\n} as const;\n\n/** Dragged handles and fills (sliders) — critically damped `useSpring` config,\n * so the value follows the pointer butterily and never rebounds off an end. */\nexport const SPRING_GLIDE = {\n stiffness: 700,\n damping: 50,\n mass: 0.5,\n} as const;\n","\"use client\";\n\nimport {\n AnimatePresence,\n type HTMLMotionProps,\n motion,\n useReducedMotion,\n type Variants,\n} from \"motion/react\";\nimport {\n Children,\n cloneElement,\n forwardRef,\n type HTMLAttributes,\n isValidElement,\n type MouseEvent,\n type ReactElement,\n type ReactNode,\n type Ref,\n useId,\n useState,\n} from \"react\";\nimport { SPRING_LAYOUT } from \"@/lib/ease\";\nimport { cn } from \"@/lib/utils\";\n\nexport interface SharedLayoutBgProps\n extends Omit<HTMLAttributes<HTMLElement>, \"children\"> {\n children: ReactNode;\n /** Semantic container used for the children. */\n as?: \"div\" | \"ul\";\n /** Tailwind class applied to the moving pill. Defaults to a subtle foreground tint. */\n pillClassName?: string;\n /** Horizontal inset of the pill relative to each row (px). Default 20. */\n inset?: number;\n /** Optional positioning override for the pill wrapper inside each item. */\n pillContainerClassName?: string;\n}\n\nconst variants: Variants = {\n initial: { opacity: 0, filter: \"blur(6px)\" },\n animate: { opacity: 1, filter: \"blur(0px)\" },\n exit: (isActive: boolean) =>\n !isActive ? { opacity: 0, filter: \"blur(6px)\" } : {},\n};\n\nconst reducedVariants: Variants = {\n initial: { opacity: 0 },\n animate: { opacity: 1 },\n exit: (isActive: boolean) => (!isActive ? { opacity: 0 } : {}),\n};\n\nexport const SharedLayoutBg = forwardRef<HTMLElement, SharedLayoutBgProps>(\n function SharedLayoutBg(\n {\n children,\n as = \"div\",\n className,\n onMouseLeave,\n pillClassName,\n pillContainerClassName,\n inset = 20,\n ...props\n },\n forwardedRef,\n ) {\n const [activeId, setActiveId] = useState<string | null>(null);\n const uid = useId();\n const reduce = useReducedMotion();\n\n const renderedChildren = Children.toArray(children)\n .filter(isValidElement)\n .map((child, index) => {\n const el = child as ReactElement<{\n className?: string;\n onMouseEnter?: () => void;\n children?: ReactNode;\n }>;\n const childKey = el.key ? String(el.key) : `item-${index}`;\n return cloneElement(\n el,\n {\n key: childKey,\n className: cn(\"relative\", el.props.className),\n onMouseEnter: () => {\n el.props.onMouseEnter?.();\n setActiveId(childKey);\n },\n },\n <>\n <AnimatePresence custom={activeId !== null}>\n {activeId !== null ? (\n <motion.div\n variants={reduce ? reducedVariants : variants}\n initial=\"initial\"\n animate=\"animate\"\n exit=\"exit\"\n custom={activeId !== null}\n className={cn(\n \"pointer-events-none absolute inset-y-0\",\n pillContainerClassName,\n )}\n style={{ left: -inset, right: -inset }}\n >\n {activeId === childKey ? (\n <motion.div\n layoutId={`shared-bg-${uid}`}\n transition={reduce ? { duration: 0 } : SPRING_LAYOUT}\n className={cn(\n \"pointer-events-none h-full w-full rounded-2xl bg-primary/[0.06]\",\n pillClassName,\n )}\n />\n ) : null}\n </motion.div>\n ) : null}\n </AnimatePresence>\n <div className=\"relative z-10\">{el.props.children}</div>\n </>,\n );\n });\n\n const handleMouseLeave = (event: MouseEvent<HTMLElement>) => {\n setActiveId(null);\n onMouseLeave?.(event);\n };\n\n // layoutRoot scopes the pill's layout projection to this list, so fixed or\n // scrolled ancestors can't smear scroll offsets into its movement.\n return as === \"ul\" ? (\n <motion.ul\n {...(props as HTMLMotionProps<\"ul\">)}\n ref={forwardedRef as Ref<HTMLUListElement>}\n layoutRoot\n onMouseLeave={handleMouseLeave}\n className={cn(\"flex w-full flex-col\", className)}\n >\n {renderedChildren}\n </motion.ul>\n ) : (\n <motion.div\n {...(props as HTMLMotionProps<\"div\">)}\n ref={forwardedRef as Ref<HTMLDivElement>}\n layoutRoot\n onMouseLeave={handleMouseLeave}\n className={cn(\"flex w-full flex-col\", className)}\n >\n {renderedChildren}\n </motion.div>\n );\n },\n);\n","\"use client\"\n// beui.dev/components/motion/animated-sidebar\n\nimport { ChevronRight } from \"lucide-react\"\nimport {\n AnimatePresence,\n type HTMLMotionProps,\n motion,\n useReducedMotion,\n type Variants,\n} from \"motion/react\"\nimport {\n type ButtonHTMLAttributes,\n type CSSProperties,\n createContext,\n forwardRef,\n type HTMLAttributes,\n type ReactNode,\n useCallback,\n useContext,\n useEffect,\n useId,\n useRef,\n useState,\n useSyncExternalStore,\n} from \"react\"\nimport { createPortal } from \"react-dom\"\nimport { SharedLayoutBg } from \"@/components/motion/shared-layout-bg\"\nimport { EASE_DRAWER, EASE_OUT, SPRING_LAYOUT, SPRING_PRESS } from \"@/lib/ease\"\nimport { cn } from \"@/lib/utils\"\n\ntype SidebarState = \"expanded\" | \"collapsed\"\ntype SidebarSide = \"left\" | \"right\"\ntype SidebarVariant = \"sidebar\" | \"floating\" | \"inset\"\ntype SidebarCollapsible = \"offcanvas\" | \"icon\" | \"none\"\n\nconst MOBILE_QUERY = \"(max-width: 767px)\"\nconst SIDEBAR_KEYBOARD_SHORTCUT = \"b\"\n\nconst PANEL_TRANSITION = {\n duration: 0.36,\n ease: EASE_DRAWER,\n} as const\n\n// The desktop rail settles at a hard zero-width boundary. Keep the spring\n// critically damped so it cannot overshoot, pause against that boundary, and\n// then snap back during the final frame.\nconst SIDEBAR_MORPH_TRANSITION = {\n type: \"spring\",\n stiffness: 380,\n damping: 35,\n mass: 0.75,\n} as const\n\nconst LABEL_ENTER_TRANSITION = {\n duration: 0.2,\n delay: 0.08,\n ease: EASE_OUT,\n} as const\n\nconst LABEL_EXIT_TRANSITION = {\n duration: 0.12,\n ease: EASE_OUT,\n} as const\n\nconst SUBMENU_TRANSITION = {\n duration: 0.18,\n ease: EASE_OUT,\n} as const\n\nconst SUBMENU_VARIANTS: Variants = {\n closed: {\n opacity: 0,\n clipPath: \"inset(0 0 100% 0 round 8px)\",\n transition: {\n duration: 0.14,\n ease: EASE_OUT,\n staggerChildren: 0.025,\n staggerDirection: -1,\n },\n },\n open: {\n opacity: 1,\n clipPath: \"inset(0 0 0% 0 round 8px)\",\n transition: {\n duration: 0.2,\n delayChildren: 0.035,\n ease: EASE_OUT,\n staggerChildren: 0.045,\n },\n },\n}\n\nconst SUBMENU_ITEM_VARIANTS: Variants = {\n closed: {\n opacity: 0,\n y: -6,\n filter: \"blur(3px)\",\n },\n open: {\n opacity: 1,\n y: 0,\n filter: \"blur(0px)\",\n transition: SUBMENU_TRANSITION,\n },\n}\n\nconst REDUCED_TRANSITION = {\n duration: 0.16,\n ease: EASE_OUT,\n} as const\n\nconst FOCUSABLE_SELECTOR = [\n \"a[href]\",\n \"button:not([disabled])\",\n \"input:not([disabled])\",\n \"select:not([disabled])\",\n \"textarea:not([disabled])\",\n \"[tabindex]:not([tabindex='-1'])\",\n].join(\",\")\n\nfunction subscribeToMobileQuery(callback: () => void) {\n const query = window.matchMedia(MOBILE_QUERY)\n query.addEventListener(\"change\", callback)\n return () => query.removeEventListener(\"change\", callback)\n}\n\nfunction getMobileSnapshot() {\n return window.matchMedia(MOBILE_QUERY).matches\n}\n\nfunction getServerMobileSnapshot() {\n return false\n}\n\nfunction useIsMobile() {\n return useSyncExternalStore(\n subscribeToMobileQuery,\n getMobileSnapshot,\n getServerMobileSnapshot\n )\n}\n\ninterface AnimatedSidebarContextValue {\n isMobile: boolean\n layoutId: string\n open: boolean\n openMobile: boolean\n /** The right panel is a single hidden/shown state — no icon rail, no\n * separate mobile state. */\n openRight: boolean\n reduce: boolean\n setOpen: (open: boolean) => void\n setOpenMobile: (open: boolean) => void\n setOpenRight: (open: boolean) => void\n state: SidebarState\n toggleSidebar: () => void\n toggleRightSidebar: () => void\n triggerRef: React.RefObject<HTMLButtonElement | null>\n rightTriggerRef: React.RefObject<HTMLButtonElement | null>\n}\n\nconst AnimatedSidebarContext =\n createContext<AnimatedSidebarContextValue | null>(null)\n\ninterface AnimatedSidebarPanelContextValue {\n collapsed: boolean\n collapsible: SidebarCollapsible\n side: SidebarSide\n}\n\nconst AnimatedSidebarPanelContext =\n createContext<AnimatedSidebarPanelContextValue | null>(null)\n\nexport function useAnimatedSidebar() {\n const context = useContext(AnimatedSidebarContext)\n if (!context) {\n throw new Error(\n \"useAnimatedSidebar must be used inside AnimatedSidebarProvider.\"\n )\n }\n return context\n}\n\nfunction useAnimatedSidebarPanel() {\n const context = useContext(AnimatedSidebarPanelContext)\n if (!context) {\n throw new Error(\n \"Animated Sidebar parts must be used inside AnimatedSidebar.\"\n )\n }\n return context\n}\n\ntype SidebarProviderStyle = CSSProperties & {\n \"--sidebar-width\"?: string\n \"--sidebar-width-icon\"?: string\n \"--sidebar-width-mobile\"?: string\n}\n\nexport interface AnimatedSidebarProviderProps extends HTMLAttributes<HTMLDivElement> {\n open?: boolean\n defaultOpen?: boolean\n onOpenChange?: (open: boolean) => void\n openMobile?: boolean\n defaultOpenMobile?: boolean\n onOpenMobileChange?: (open: boolean) => void\n openRight?: boolean\n defaultOpenRight?: boolean\n onOpenRightChange?: (open: boolean) => void\n style?: SidebarProviderStyle\n}\n\nexport function AnimatedSidebarProvider({\n children,\n open,\n defaultOpen = true,\n onOpenChange,\n openMobile,\n defaultOpenMobile = false,\n onOpenMobileChange,\n openRight,\n defaultOpenRight = false,\n onOpenRightChange,\n className,\n style,\n ...props\n}: AnimatedSidebarProviderProps) {\n const [internalOpen, setInternalOpen] = useState(defaultOpen)\n const [internalOpenMobile, setInternalOpenMobile] =\n useState(defaultOpenMobile)\n const [internalOpenRight, setInternalOpenRight] = useState(defaultOpenRight)\n const isMobile = useIsMobile()\n const reduce = useReducedMotion() ?? false\n const generatedId = useId()\n const triggerRef = useRef<HTMLButtonElement>(null)\n const rightTriggerRef = useRef<HTMLButtonElement>(null)\n const desktopOpen = open ?? internalOpen\n const mobileOpen = openMobile ?? internalOpenMobile\n const rightOpen = openRight ?? internalOpenRight\n\n const setOpen = useCallback(\n (nextOpen: boolean) => {\n if (open === undefined) setInternalOpen(nextOpen)\n onOpenChange?.(nextOpen)\n },\n [onOpenChange, open]\n )\n\n const setOpenMobile = useCallback(\n (nextOpen: boolean) => {\n if (openMobile === undefined) setInternalOpenMobile(nextOpen)\n onOpenMobileChange?.(nextOpen)\n },\n [onOpenMobileChange, openMobile]\n )\n\n const setOpenRight = useCallback(\n (nextOpen: boolean) => {\n if (openRight === undefined) setInternalOpenRight(nextOpen)\n onOpenRightChange?.(nextOpen)\n },\n [onOpenRightChange, openRight]\n )\n\n const toggleSidebar = useCallback(() => {\n if (isMobile) setOpenMobile(!mobileOpen)\n else setOpen(!desktopOpen)\n }, [desktopOpen, isMobile, mobileOpen, setOpen, setOpenMobile])\n\n const toggleRightSidebar = useCallback(() => {\n setOpenRight(!rightOpen)\n }, [rightOpen, setOpenRight])\n\n useEffect(() => {\n const handleShortcut = (event: KeyboardEvent) => {\n if (\n event.key.toLowerCase() === SIDEBAR_KEYBOARD_SHORTCUT &&\n (event.metaKey || event.ctrlKey)\n ) {\n event.preventDefault()\n toggleSidebar()\n }\n }\n\n window.addEventListener(\"keydown\", handleShortcut)\n return () => window.removeEventListener(\"keydown\", handleShortcut)\n }, [toggleSidebar])\n\n return (\n <AnimatedSidebarContext.Provider\n value={{\n isMobile,\n layoutId: `${generatedId}-active`,\n open: desktopOpen,\n openMobile: mobileOpen,\n openRight: rightOpen,\n reduce,\n setOpen,\n setOpenMobile,\n setOpenRight,\n state: desktopOpen ? \"expanded\" : \"collapsed\",\n toggleSidebar,\n toggleRightSidebar,\n triggerRef,\n rightTriggerRef,\n }}\n >\n <div\n {...props}\n data-slot=\"sidebar-wrapper\"\n data-state={desktopOpen ? \"expanded\" : \"collapsed\"}\n data-right-state={rightOpen ? \"expanded\" : \"collapsed\"}\n style={{\n \"--sidebar-width\": \"19rem\",\n \"--sidebar-width-icon\": \"4.25rem\",\n \"--sidebar-width-mobile\": \"18rem\",\n ...style,\n }}\n className={cn(\n \"group/sidebar-wrapper flex min-h-svh w-full min-w-0\",\n className\n )}\n >\n {children}\n </div>\n </AnimatedSidebarContext.Provider>\n )\n}\n\nfunction MobileSidebar({\n ariaLabel,\n children,\n className,\n side,\n}: {\n ariaLabel: string\n children: ReactNode\n className?: string\n side: SidebarSide\n}) {\n const context = useAnimatedSidebar()\n const isRight = side === \"right\"\n const open = isRight ? context.openRight : context.openMobile\n const setOpen = isRight ? context.setOpenRight : context.setOpenMobile\n const triggerRef = isRight ? context.rightTriggerRef : context.triggerRef\n const panelRef = useRef<HTMLDivElement>(null)\n const [mounted, setMounted] = useState(false)\n\n useEffect(() => setMounted(true), [])\n\n useEffect(() => {\n if (!open) return\n\n const body = document.body\n const scrollY = window.scrollY\n const trigger = triggerRef.current\n const previousBodyStyles = {\n left: body.style.left,\n overflow: body.style.overflow,\n position: body.style.position,\n right: body.style.right,\n top: body.style.top,\n }\n\n body.style.position = \"fixed\"\n body.style.top = `-${scrollY}px`\n body.style.left = \"0\"\n body.style.right = \"0\"\n body.style.overflow = \"hidden\"\n\n const focusFrame = requestAnimationFrame(() => {\n const firstFocusable =\n panelRef.current?.querySelector<HTMLElement>(FOCUSABLE_SELECTOR)\n ;(firstFocusable ?? panelRef.current)?.focus({ preventScroll: true })\n })\n\n return () => {\n cancelAnimationFrame(focusFrame)\n body.style.position = previousBodyStyles.position\n body.style.top = previousBodyStyles.top\n body.style.left = previousBodyStyles.left\n body.style.right = previousBodyStyles.right\n body.style.overflow = previousBodyStyles.overflow\n window.scrollTo(0, scrollY)\n trigger?.focus({ preventScroll: true })\n }\n }, [open, triggerRef])\n\n if (!mounted) return null\n\n return createPortal(\n <div\n className={cn(\n \"pointer-events-none fixed inset-0 z-50 md:hidden\",\n open ? \"visible\" : \"invisible\"\n )}\n >\n <motion.button\n type=\"button\"\n aria-label=\"Close sidebar\"\n tabIndex={open ? 0 : -1}\n initial={false}\n animate={{ opacity: open ? 1 : 0 }}\n transition={context.reduce ? REDUCED_TRANSITION : PANEL_TRANSITION}\n onClick={() => setOpen(false)}\n className={cn(\n \"absolute inset-0\",\n open ? \"pointer-events-auto\" : \"pointer-events-none\"\n )}\n />\n\n <motion.div\n ref={panelRef}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={ariaLabel}\n aria-hidden={!open}\n inert={!open}\n tabIndex={-1}\n data-mobile=\"true\"\n data-state={open ? \"expanded\" : \"collapsed\"}\n data-side={side}\n initial={false}\n animate={{\n opacity: context.reduce ? (open ? 1 : 0) : 1,\n x: context.reduce\n ? 0\n : open\n ? \"0%\"\n : side === \"left\"\n ? \"-100%\"\n : \"100%\",\n }}\n transition={context.reduce ? REDUCED_TRANSITION : PANEL_TRANSITION}\n onKeyDown={(event) => {\n if (event.key === \"Escape\") {\n event.preventDefault()\n setOpen(false)\n return\n }\n\n if (event.key !== \"Tab\") return\n const focusable = panelRef.current\n ? Array.from(\n panelRef.current.querySelectorAll<HTMLElement>(\n FOCUSABLE_SELECTOR\n )\n )\n : []\n\n if (focusable.length === 0) {\n event.preventDefault()\n panelRef.current?.focus()\n return\n }\n\n const first = focusable[0]\n const last = focusable[focusable.length - 1]\n if (event.shiftKey && document.activeElement === first) {\n event.preventDefault()\n last.focus()\n } else if (!event.shiftKey && document.activeElement === last) {\n event.preventDefault()\n first.focus()\n }\n }}\n className={cn(\n \"pointer-events-auto absolute inset-y-0 flex h-dvh w-(--sidebar-width-mobile) max-w-[88vw] flex-col overflow-hidden\",\n \"will-change-transform\",\n side === \"left\" ? \"left-0 border-r\" : \"right-0\",\n !open && \"pointer-events-none\",\n className\n )}\n >\n <AnimatedSidebarPanelContext.Provider\n value={{ collapsed: false, collapsible: \"none\", side }}\n >\n {children}\n </AnimatedSidebarPanelContext.Provider>\n </motion.div>\n </div>,\n document.body\n )\n}\n\nexport interface AnimatedSidebarProps extends Omit<\n HTMLMotionProps<\"aside\">,\n \"children\"\n> {\n children?: ReactNode\n side?: SidebarSide\n variant?: SidebarVariant\n collapsible?: SidebarCollapsible\n ariaLabel?: string\n panelClassName?: string\n}\n\nexport const AnimatedSidebar = forwardRef<HTMLElement, AnimatedSidebarProps>(\n function AnimatedSidebar(\n {\n side = \"left\",\n variant = \"sidebar\",\n collapsible = \"icon\",\n ariaLabel = \"Sidebar\",\n children,\n className,\n panelClassName,\n style,\n ...props\n },\n forwardedRef\n ) {\n const context = useAnimatedSidebar()\n const sideOpen = side === \"right\" ? context.openRight : context.open\n const collapsed = collapsible !== \"none\" && !sideOpen\n const offcanvas = collapsed && collapsible === \"offcanvas\"\n const width = offcanvas\n ? \"0px\"\n : collapsed\n ? \"var(--sidebar-width-icon)\"\n : \"var(--sidebar-width)\"\n\n if (context.isMobile) {\n return (\n <MobileSidebar ariaLabel={ariaLabel} className={className} side={side}>\n {children}\n </MobileSidebar>\n )\n }\n\n return (\n <motion.aside\n {...props}\n ref={forwardedRef}\n initial={false}\n aria-label={ariaLabel}\n data-slot=\"sidebar\"\n data-state={collapsed ? \"collapsed\" : \"expanded\"}\n data-collapsible={collapsible}\n data-variant={variant}\n data-side={side}\n animate={{ width }}\n transition={context.reduce ? { duration: 0 } : SIDEBAR_MORPH_TRANSITION}\n style={style}\n className={cn(\n \"group/sidebar relative hidden h-auto shrink-0 will-change-[width] md:block\",\n \"peer flex!\",\n // The offcanvas panel keeps its full width and slides out of the\n // zero-width rail, so clip it rather than letting it bleed past the\n // shell edge. The clip margin lets the panel's own shadow escape\n // without letting the slid-out panel escape with it\n collapsible === \"offcanvas\" &&\n \"overflow-x-visible [overflow-clip-margin:1rem]\",\n side === \"right\" && \"order-last\",\n className\n )}\n >\n {side === \"right\" && !collapsed && (\n <motion.div className=\"h-full p-0.5 flex flex-1 bg-radial/decreasing from-amber-400 to-0% hover:to-50% ease-smooth-out to-amber-500/0 cursor-col-resize transition-colors duration-1000 animate-in\" />\n )}\n <motion.div\n initial={false}\n animate={{\n opacity: offcanvas ? 0 : 1,\n x: offcanvas ? (side === \"left\" ? \"-100%\" : \"100%\") : \"0%\",\n }}\n transition={context.reduce ? REDUCED_TRANSITION : PANEL_TRANSITION}\n className={cn(\n \"sticky top-0 flex h-svh w-full flex-col overflow-hidden\",\n collapsible === \"offcanvas\" && \"w-[var(--sidebar-width)]\",\n\n variant === \"floating\" && \"m-2 h-[calc(100svh-1rem)]\",\n variant === \"inset\" && \"m-2 h-[calc(100svh-1rem)]\",\n panelClassName\n )}\n >\n <AnimatedSidebarPanelContext.Provider\n value={{ collapsed, collapsible, side }}\n >\n {children}\n </AnimatedSidebarPanelContext.Provider>\n </motion.div>\n </motion.aside>\n )\n }\n)\n\nexport interface AnimatedSidebarTriggerProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n side?: SidebarSide\n}\n\nexport const AnimatedSidebarTrigger = forwardRef<\n HTMLButtonElement,\n AnimatedSidebarTriggerProps\n>(function AnimatedSidebarTrigger(\n { className, onClick, side = \"left\", type = \"button\", ...props },\n forwardedRef\n) {\n const context = useAnimatedSidebar()\n const isRight = side === \"right\"\n const expanded = isRight\n ? context.openRight\n : context.isMobile\n ? context.openMobile\n : context.open\n const triggerRef = isRight ? context.rightTriggerRef : context.triggerRef\n\n return (\n <button\n {...props}\n ref={(node) => {\n triggerRef.current = node\n if (typeof forwardedRef === \"function\") forwardedRef(node)\n else if (forwardedRef) forwardedRef.current = node\n }}\n type={type}\n aria-label={props[\"aria-label\"] ?? \"Toggle sidebar\"}\n aria-expanded={expanded}\n data-slot=\"sidebar-trigger\"\n data-side={side}\n data-state={expanded ? \"expanded\" : \"collapsed\"}\n onClick={(event) => {\n onClick?.(event)\n if (event.defaultPrevented) return\n if (isRight) context.toggleRightSidebar()\n else context.toggleSidebar()\n }}\n className={cn(\n \"inline-flex size-10 shrink-0 items-center justify-center rounded-xl outline-none\",\n \"focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background\",\n className\n )}\n />\n )\n})\n\nexport interface AnimatedSidebarCloseProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n side?: SidebarSide\n}\n\nexport const AnimatedSidebarClose = forwardRef<\n HTMLButtonElement,\n AnimatedSidebarCloseProps\n>(function AnimatedSidebarClose(\n { className, onClick, side = \"left\", type = \"button\", ...props },\n forwardedRef\n) {\n const context = useAnimatedSidebar()\n\n return (\n <button\n {...props}\n ref={forwardedRef}\n type={type}\n data-side={side}\n aria-label={props[\"aria-label\"] ?? \"Close sidebar\"}\n onClick={(event) => {\n onClick?.(event)\n if (event.defaultPrevented) return\n if (side === \"right\") context.setOpenRight(false)\n else if (context.isMobile) context.setOpenMobile(false)\n else context.setOpen(false)\n }}\n className={cn(\n \"inline-flex size-10 shrink-0 items-center justify-center rounded-xl outline-none\",\n \"focus-visible:ring-2 focus-visible:ring-ring\",\n className\n )}\n />\n )\n})\n\nexport interface AnimatedSidebarRailProps extends ButtonHTMLAttributes<HTMLButtonElement> {}\n\nexport const AnimatedSidebarRail = forwardRef<\n HTMLButtonElement,\n AnimatedSidebarRailProps\n>(function AnimatedSidebarRail(\n { className, onClick, type = \"button\", ...props },\n forwardedRef\n) {\n const context = useAnimatedSidebar()\n const panel = useAnimatedSidebarPanel()\n\n return (\n <button\n {...props}\n ref={forwardedRef}\n type={type}\n data-side={panel.side}\n aria-label={props[\"aria-label\"] ?? \"Toggle sidebar\"}\n title=\"Toggle sidebar\"\n tabIndex={-1}\n onClick={(event) => {\n onClick?.(event)\n if (event.defaultPrevented) return\n if (panel.side === \"right\") context.toggleRightSidebar()\n else context.toggleSidebar()\n }}\n className={cn(\n \"absolute inset-y-0 z-20 hidden w-4 -translate-x-1/2 outline-none md:block\",\n \"after:absolute after:inset-y-0 after:left-1/2 after:w-px after:bg-transparent after:transition-colors hover:after:bg-border\",\n \"data-[side=left]:left-full data-[side=right]:right-0 data-[side=right]:translate-x-1/2\",\n className\n )}\n />\n )\n})\n\nexport interface AnimatedSidebarInsetProps extends HTMLMotionProps<\"main\"> {}\n\nexport const AnimatedSidebarInset = forwardRef<\n HTMLElement,\n AnimatedSidebarInsetProps\n>(function AnimatedSidebarInset({ className, ...props }, forwardedRef) {\n return (\n <motion.main\n {...props}\n ref={forwardedRef}\n data-slot=\"sidebar-inset\"\n className={cn(\n \"relative flex min-w-0 flex-1 flex-col bg-background\",\n \"md:peer-data-[variant=inset]:m-2 md:peer-data-[variant=inset]:ml-0 md:peer-data-[variant=inset]:mr-1.5 md:peer-data-[variant=inset]:rounded-md md:peer-data-[variant=inset]:shadow-md\",\n className\n )}\n />\n )\n})\n\nexport const AnimatedSidebarHeader = forwardRef<\n HTMLDivElement,\n HTMLAttributes<HTMLDivElement>\n>(function AnimatedSidebarHeader({ className, ...props }, forwardedRef) {\n return (\n <div\n {...props}\n ref={forwardedRef}\n data-slot=\"sidebar-header\"\n className={cn(\"flex shrink-0 flex-col gap-2 p-3\", className)}\n />\n )\n})\n\nexport const AnimatedSidebarContent = forwardRef<\n HTMLDivElement,\n HTMLAttributes<HTMLDivElement>\n>(function AnimatedSidebarContent({ className, ...props }, forwardedRef) {\n return (\n <div\n {...props}\n ref={forwardedRef}\n data-slot=\"sidebar-content\"\n className={cn(\n \"flex min-h-0 flex-1 flex-col gap-2 overflow-x-hidden overflow-y-auto overscroll-contain px-2 py-2\",\n className\n )}\n />\n )\n})\n\nexport const AnimatedSidebarFooter = forwardRef<\n HTMLDivElement,\n HTMLAttributes<HTMLDivElement>\n>(function AnimatedSidebarFooter({ className, ...props }, forwardedRef) {\n return (\n <div\n {...props}\n ref={forwardedRef}\n data-slot=\"sidebar-footer\"\n className={cn(\n \"flex shrink-0 flex-col gap-2 border-t border-border p-3 pb-[max(0.75rem,env(safe-area-inset-bottom))]\",\n className\n )}\n />\n )\n})\n\nexport const AnimatedSidebarGroup = forwardRef<\n HTMLDivElement,\n HTMLAttributes<HTMLDivElement>\n>(function AnimatedSidebarGroup({ className, ...props }, forwardedRef) {\n return (\n <div\n {...props}\n ref={forwardedRef}\n data-slot=\"sidebar-group\"\n className={cn(\"flex w-full min-w-0 flex-col px-1 py-1.5\", className)}\n />\n )\n})\n\nexport const AnimatedSidebarGroupLabel = forwardRef<\n HTMLDivElement,\n HTMLAttributes<HTMLDivElement>\n>(function AnimatedSidebarGroupLabel(\n { children, className, ...props },\n forwardedRef\n) {\n const { collapsed } = useAnimatedSidebarPanel()\n\n return (\n <div\n {...props}\n ref={forwardedRef}\n aria-hidden={collapsed}\n data-slot=\"sidebar-group-label\"\n className={cn(\n \"mb-1 h-7 overflow-hidden px-2 text-[10px] font-medium tracking-[0.14em] text-muted-foreground uppercase transition-opacity\",\n collapsed ? \"opacity-0\" : \"opacity-100\",\n className\n )}\n >\n {children}\n </div>\n )\n})\n\nexport const AnimatedSidebarGroupContent = forwardRef<\n HTMLDivElement,\n HTMLAttributes<HTMLDivElement>\n>(function AnimatedSidebarGroupContent({ className, ...props }, forwardedRef) {\n return (\n <div\n {...props}\n ref={forwardedRef}\n data-slot=\"sidebar-group-content\"\n className={cn(\"w-full min-w-0\", className)}\n />\n )\n})\n\nexport const AnimatedSidebarMenu = forwardRef<\n HTMLUListElement,\n HTMLAttributes<HTMLUListElement>\n>(function AnimatedSidebarMenu(\n { children, className, ...props },\n forwardedRef\n) {\n return (\n <SharedLayoutBg\n {...props}\n ref={forwardedRef as React.Ref<HTMLElement>}\n as=\"ul\"\n inset={0}\n pillClassName=\"rounded-xl bg-muted/70\"\n pillContainerClassName=\"inset-y-auto top-0 h-9\"\n data-slot=\"sidebar-menu\"\n className={cn(\n \"flex w-full min-w-0 list-none flex-col gap-0.5\",\n className\n )}\n >\n {children}\n </SharedLayoutBg>\n )\n})\n\nexport const AnimatedSidebarMenuItem = forwardRef<\n HTMLLIElement,\n HTMLMotionProps<\"li\">\n>(function AnimatedSidebarMenuItem({ className, ...props }, forwardedRef) {\n return (\n <motion.li\n {...props}\n ref={forwardedRef}\n layout=\"position\"\n transition={SPRING_LAYOUT}\n data-slot=\"sidebar-menu-item\"\n className={cn(\"relative\", className)}\n />\n )\n})\n\nexport interface AnimatedSidebarMenuSubProps extends Omit<\n HTMLMotionProps<\"ul\">,\n \"children\"\n> {\n open: boolean\n children?: ReactNode\n}\n\nexport const AnimatedSidebarMenuSub = forwardRef<\n HTMLUListElement,\n AnimatedSidebarMenuSubProps\n>(function AnimatedSidebarMenuSub(\n { open, children, className, ...props },\n forwardedRef\n) {\n const context = useAnimatedSidebar()\n const panel = useAnimatedSidebarPanel()\n\n return (\n <AnimatePresence initial={false} mode=\"popLayout\">\n {open && !panel.collapsed ? (\n <motion.ul\n {...props}\n ref={forwardedRef}\n key=\"sidebar-submenu\"\n variants={context.reduce ? undefined : SUBMENU_VARIANTS}\n initial={context.reduce ? false : \"closed\"}\n animate={context.reduce ? { opacity: 1 } : \"open\"}\n exit={context.reduce ? { opacity: 0 } : \"closed\"}\n transition={context.reduce ? { duration: 0.12 } : undefined}\n data-slot=\"sidebar-menu-sub\"\n className={cn(\n \"relative mt-1 ml-5 flex min-w-0 flex-col gap-0.5 border-l border-border pl-3\",\n className\n )}\n >\n {children}\n </motion.ul>\n ) : null}\n </AnimatePresence>\n )\n})\n\nexport const AnimatedSidebarMenuSubItem = forwardRef<\n HTMLLIElement,\n HTMLMotionProps<\"li\">\n>(function AnimatedSidebarMenuSubItem({ className, ...props }, forwardedRef) {\n return (\n <motion.li\n {...props}\n ref={forwardedRef}\n variants={SUBMENU_ITEM_VARIANTS}\n data-slot=\"sidebar-menu-sub-item\"\n className={cn(\"relative min-w-0\", className)}\n />\n )\n})\n\nexport interface AnimatedSidebarMenuSubButtonProps {\n children: ReactNode\n icon?: ReactNode\n href?: string\n isActive?: boolean\n disabled?: boolean\n closeOnSelect?: boolean\n target?: \"_blank\" | \"_self\" | \"_parent\" | \"_top\"\n rel?: string\n onSelect?: () => void\n className?: string\n}\n\nexport function AnimatedSidebarMenuSubButton({\n children,\n icon,\n href,\n isActive = false,\n disabled = false,\n closeOnSelect = true,\n target,\n rel,\n onSelect,\n className,\n}: AnimatedSidebarMenuSubButtonProps) {\n const context = useAnimatedSidebar()\n\n const select = (\n event: React.MouseEvent<HTMLAnchorElement | HTMLButtonElement>\n ) => {\n if (disabled) {\n event.preventDefault()\n return\n }\n onSelect?.()\n if (context.isMobile && closeOnSelect) context.setOpenMobile(false)\n }\n\n const content = (\n <>\n <span\n aria-hidden=\"true\"\n className=\"grid size-4 shrink-0 place-items-center\"\n >\n {icon ?? <span className=\"size-1 rounded-full bg-current\" />}\n </span>\n <span className=\"min-w-0 flex-1 truncate\">{children}</span>\n </>\n )\n\n const interactiveClassName = cn(\n \"flex min-h-8 w-full min-w-0 items-center gap-2 rounded-lg px-2 text-left text-xs outline-none\",\n \"text-muted-foreground transition-colors hover:bg-muted/60 hover:text-foreground\",\n \"focus-visible:bg-muted/70 focus-visible:ring-2 focus-visible:ring-ring\",\n isActive && \"bg-muted/70 text-foreground\",\n disabled && \"cursor-not-allowed opacity-40\",\n className\n )\n\n return href ? (\n <motion.a\n href={href}\n target={target}\n rel={rel ?? (target === \"_blank\" ? \"noreferrer noopener\" : undefined)}\n aria-current={isActive ? \"page\" : undefined}\n aria-disabled={disabled || undefined}\n tabIndex={disabled ? -1 : undefined}\n onClick={select}\n whileTap={context.reduce || disabled ? undefined : { scale: 0.98 }}\n transition={SPRING_PRESS}\n className={interactiveClassName}\n >\n {content}\n </motion.a>\n ) : (\n <motion.button\n type=\"button\"\n disabled={disabled}\n aria-current={isActive ? \"page\" : undefined}\n onClick={select}\n whileTap={context.reduce || disabled ? undefined : { scale: 0.98 }}\n transition={SPRING_PRESS}\n className={interactiveClassName}\n >\n {content}\n </motion.button>\n )\n}\n\nexport interface AnimatedSidebarMenuButtonProps {\n children: ReactNode\n icon?: ReactNode\n badge?: ReactNode\n href?: string\n isActive?: boolean\n ariaExpanded?: boolean\n disabled?: boolean\n closeOnSelect?: boolean\n target?: \"_blank\" | \"_self\" | \"_parent\" | \"_top\"\n rel?: string\n onSelect?: () => void\n className?: string\n}\n\nexport function AnimatedSidebarMenuButton({\n children,\n icon,\n badge,\n href,\n isActive = false,\n ariaExpanded,\n disabled = false,\n closeOnSelect,\n target,\n rel,\n onSelect,\n className,\n}: AnimatedSidebarMenuButtonProps) {\n const context = useAnimatedSidebar()\n const panel = useAnimatedSidebarPanel()\n const textLabel = typeof children === \"string\" ? children : undefined\n\n const select = (\n event: React.MouseEvent<HTMLAnchorElement | HTMLButtonElement>\n ) => {\n if (disabled) {\n event.preventDefault()\n return\n }\n onSelect?.()\n const shouldCloseOnSelect = closeOnSelect ?? ariaExpanded === undefined\n if (context.isMobile && shouldCloseOnSelect) {\n context.setOpenMobile(false)\n }\n }\n\n const content = (\n <>\n {isActive ? (\n <motion.span\n layoutId={context.layoutId}\n transition={context.reduce ? { duration: 0 } : SPRING_LAYOUT}\n className=\"absolute inset-0 rounded-xl bg-muted\"\n />\n ) : null}\n {icon ? (\n <span\n aria-hidden=\"true\"\n className=\"relative z-10 grid size-5 shrink-0 place-items-center\"\n >\n {icon}\n </span>\n ) : null}\n <motion.span\n initial={false}\n animate={{\n opacity: panel.collapsed ? 0 : 1,\n x: panel.collapsed ? -4 : 0,\n }}\n transition={\n context.reduce\n ? REDUCED_TRANSITION\n : panel.collapsed\n ? LABEL_EXIT_TRANSITION\n : LABEL_ENTER_TRANSITION\n }\n aria-hidden={panel.collapsed}\n className={cn(\n \"relative z-10 min-w-0 flex-1 truncate\",\n panel.collapsed && \"pointer-events-none\"\n )}\n >\n {children}\n </motion.span>\n {badge && !panel.collapsed ? (\n <span className=\"relative z-10 shrink-0 text-xs text-muted-foreground\">\n {badge}\n </span>\n ) : null}\n {ariaExpanded !== undefined ? (\n <motion.span\n aria-hidden=\"true\"\n initial={false}\n animate={{\n opacity: panel.collapsed ? 0 : 1,\n rotate: ariaExpanded ? 90 : 0,\n x: panel.collapsed ? 4 : 0,\n }}\n transition={context.reduce ? { duration: 0 } : SPRING_LAYOUT}\n className=\"relative z-10 grid size-4 shrink-0 place-items-center text-muted-foreground\"\n >\n <ChevronRight className=\"size-3.5\" />\n </motion.span>\n ) : null}\n </>\n )\n\n const interactiveClassName = cn(\n \"relative flex min-h-9 w-full min-w-0 items-center gap-2.5 overflow-hidden rounded-xl px-3 text-left text-sm font-medium outline-none\",\n \"text-muted-foreground transition-colors hover:text-foreground\",\n \"focus-visible:bg-muted/70 focus-visible:ring-2 focus-visible:ring-ring\",\n isActive && \"text-foreground\",\n disabled && \"cursor-not-allowed opacity-40\",\n className\n )\n\n return href ? (\n <motion.a\n href={href}\n target={target}\n rel={rel ?? (target === \"_blank\" ? \"noreferrer noopener\" : undefined)}\n aria-current={isActive ? \"page\" : undefined}\n aria-expanded={ariaExpanded}\n aria-disabled={disabled || undefined}\n aria-label={panel.collapsed ? textLabel : undefined}\n title={panel.collapsed ? textLabel : undefined}\n tabIndex={disabled ? -1 : undefined}\n onClick={select}\n whileTap={context.reduce || disabled ? undefined : { scale: 0.98 }}\n transition={SPRING_PRESS}\n className={interactiveClassName}\n >\n {content}\n </motion.a>\n ) : (\n <motion.button\n type=\"button\"\n disabled={disabled}\n aria-current={isActive ? \"page\" : undefined}\n aria-expanded={ariaExpanded}\n aria-label={panel.collapsed ? textLabel : undefined}\n title={panel.collapsed ? textLabel : undefined}\n onClick={select}\n whileTap={context.reduce || disabled ? undefined : { scale: 0.98 }}\n transition={SPRING_PRESS}\n className={interactiveClassName}\n >\n {content}\n </motion.button>\n )\n}\n","\nexport function isActive(id: string, activeId?: string): boolean {\n return activeId !== undefined && id === activeId\n}","\"use client\"\n\nimport * as React from \"react\"\n\nimport {\n AnimatedSidebarMenuButton,\n AnimatedSidebarMenuItem,\n AnimatedSidebarMenuSub,\n AnimatedSidebarMenuSubButton,\n AnimatedSidebarMenuSubItem,\n} from \"@/components/motion/animated-sidebar\"\n\nimport type { IRowProps, ISidebarNavItem, ISidebarNavSubItem } from \"@/components/blocks/nav/types\"\nimport { isActive } from \"@/components/blocks/nav/utils\"\n\nexport function SidebarNavRow({ item, activeId, onNavigate }: IRowProps) {\n const children = item.items ?? []\n const hasChildren = children.length > 0\n const childActive = children.some((child) => isActive(child.id, activeId))\n // null = follow the active child; a boolean = the reader has said otherwise.\n const [toggled, setToggled] = React.useState<boolean | null>(null)\n const [wasChildActive, setWasChildActive] = React.useState(childActive)\n\n // Navigating into a nested route from elsewhere reveals its parent, even if\n // the reader had collapsed it. Adjusted during render rather than in an\n // effect, so the group never paints closed for a frame first.\n if (childActive !== wasChildActive) {\n setWasChildActive(childActive)\n if (childActive) setToggled(null)\n }\n\n const open = toggled ?? item.defaultOpen ?? childActive\n\n function select(entry: ISidebarNavItem | ISidebarNavSubItem) {\n entry.onSelect?.()\n onNavigate?.(entry)\n }\n\n return (\n <AnimatedSidebarMenuItem>\n <AnimatedSidebarMenuButton\n ariaExpanded={hasChildren ? open : undefined}\n badge={item.badge}\n disabled={item.disabled}\n href={hasChildren ? undefined : item.href}\n icon={item.icon}\n isActive={isActive(item.id, activeId)}\n onSelect={() => {\n if (hasChildren) {\n setToggled(!open)\n return\n }\n select(item)\n }}\n target={item.target}\n >\n {item.label}\n </AnimatedSidebarMenuButton>\n {hasChildren ? (\n <AnimatedSidebarMenuSub open={open}>\n {children.map((child) => (\n <AnimatedSidebarMenuSubItem key={child.id}>\n <AnimatedSidebarMenuSubButton\n disabled={child.disabled}\n href={child.href}\n icon={child.icon}\n isActive={isActive(child.id, activeId)}\n onSelect={() => select(child)}\n target={child.target}\n >\n {child.label}\n </AnimatedSidebarMenuSubButton>\n </AnimatedSidebarMenuSubItem>\n ))}\n </AnimatedSidebarMenuSub>\n ) : null}\n </AnimatedSidebarMenuItem>\n )\n}","\"use client\"\n\nimport { PanelLeftIcon } from \"lucide-react\"\nimport * as React from \"react\"\n\nimport {\n AnimatedSidebar,\n AnimatedSidebarContent,\n AnimatedSidebarFooter,\n AnimatedSidebarGroup,\n AnimatedSidebarGroupContent,\n AnimatedSidebarGroupLabel,\n AnimatedSidebarHeader,\n AnimatedSidebarMenu,\n AnimatedSidebarProvider,\n AnimatedSidebarTrigger,\n} from \"@/components/motion/animated-sidebar\"\nimport { cn } from \"@/lib/utils\"\nimport { SidebarNavRow } from \"@/components/blocks/nav/sidebar-nav-row\"\n\nimport type { ISidebarBlockProps } from \"@/components/blocks/nav/types\"\n\nexport type {\n ISidebarBlockProps as SidebarBlockProps,\n ISidebarNavItem as SidebarNavItem,\n ISidebarNavSection as SidebarNavSection,\n ISidebarNavSubItem as SidebarNavSubItem,\n} from \"@/components/blocks/nav/types\"\n\n/**\n * Application sidebar navigation, driven by data rather than composition.\n *\n * This is the navigation panel only — it claims no page layout, so place it\n * beside your own content. It owns its own sidebar context (⌘B toggles it);\n * pass `open`/`onOpenChange` to drive the rail, and `openMobile`/\n * `onOpenMobileChange` to open the drawer from a header button of your own.\n * Compose the underlying `AnimatedSidebar*` parts directly when a screen\n * needs something this API does not cover.\n */\nexport function SidebarBlock({\n sections,\n activeId,\n onNavigate,\n header,\n footer,\n showTrigger = true,\n side = \"left\",\n variant = \"sidebar\",\n collapsible = \"icon\",\n open,\n defaultOpen,\n onOpenChange,\n openMobile,\n defaultOpenMobile,\n onOpenMobileChange,\n width,\n iconWidth,\n mobileWidth,\n ariaLabel = \"Main\",\n className,\n}: ISidebarBlockProps): React.ReactElement {\n return (\n <AnimatedSidebarProvider\n // The provider ships a full-page flex shell; this block is just the\n // panel, so the shell is flattened back to the panel's own box.\n className=\"h-full min-h-0 w-auto\"\n defaultOpen={defaultOpen}\n defaultOpenMobile={defaultOpenMobile}\n onOpenChange={onOpenChange}\n onOpenMobileChange={onOpenMobileChange}\n open={open}\n openMobile={openMobile}\n style={{\n ...(width ? { \"--sidebar-width\": width } : null),\n ...(iconWidth ? { \"--sidebar-width-icon\": iconWidth } : null),\n ...(mobileWidth ? { \"--sidebar-width-mobile\": mobileWidth } : null),\n }}\n >\n <AnimatedSidebar\n ariaLabel={ariaLabel}\n // The panel is built for a full-page shell (`h-svh`, so its footer\n // hangs below any shorter box). Fill the parent instead — in a\n // full-height layout that comes to the same thing.\n className={cn(\"h-full\", className)}\n collapsible={collapsible}\n panelClassName=\"h-full\"\n // The panel is navigation and nothing else, so it names a navigation\n // landmark rather than the complementary one <aside> implies. (The\n // mobile drawer is a dialog and keeps that role.)\n role=\"navigation\"\n side={side}\n variant={variant}\n >\n {header ||\n (showTrigger && (\n <AnimatedSidebarHeader>\n <div className=\"flex min-w-0 items-center justify-between gap-2\">\n {header && <div className=\"min-w-0 flex-1\">{header}</div>}\n {showTrigger && (\n <AnimatedSidebarTrigger className=\"text-muted-foreground hover:text-foreground\">\n <PanelLeftIcon className=\"size-4.5\" />\n </AnimatedSidebarTrigger>\n )}\n </div>\n </AnimatedSidebarHeader>\n ))}\n <AnimatedSidebarContent>\n {sections.map((section) => (\n <AnimatedSidebarGroup key={section.id}>\n {section.label && (\n <AnimatedSidebarGroupLabel>\n {section.label}\n </AnimatedSidebarGroupLabel>\n )}\n <AnimatedSidebarGroupContent>\n <AnimatedSidebarMenu>\n {section.items.map((item) => (\n <SidebarNavRow\n activeId={activeId}\n item={item}\n key={item.id}\n onNavigate={onNavigate}\n />\n ))}\n </AnimatedSidebarMenu>\n </AnimatedSidebarGroupContent>\n </AnimatedSidebarGroup>\n ))}\n </AnimatedSidebarContent>\n {footer && <AnimatedSidebarFooter>{footer}</AnimatedSidebarFooter>}\n </AnimatedSidebar>\n </AnimatedSidebarProvider>\n )\n}\n","\nexport const TITLE_BAR_HEIGHT = 48\n","\"use client\"\n\nimport { MenuIcon, PanelRightIcon } from \"lucide-react\"\nimport * as React from \"react\"\n\nimport {\n AnimatedSidebar,\n AnimatedSidebarInset,\n AnimatedSidebarProvider,\n AnimatedSidebarTrigger,\n} from \"@/components/motion/animated-sidebar\"\nimport { cn } from \"@/lib/utils\"\nimport type { ShellLayoutProps } from \"./type\"\nimport { TITLE_BAR_HEIGHT } from \"./utils\"\nimport type { ClassNameValue } from \"tailwind-merge\"\n\nexport function ShellLayout({\n children,\n open,\n defaultOpen,\n onOpenChange,\n rightDrawer,\n rightOpen,\n defaultRightOpen,\n onRightOpenChange,\n variant = \"desktop\",\n className,\n}: ShellLayoutProps): React.ReactElement {\n\n const background: ClassNameValue = `bg-linear-to-tr/increasing from-neutral-200 via-neutral-100 to-stone-200 dark:from-neutral-900 dark:via-neutral-950 dark:to-stone-950`\n return (\n <AnimatedSidebarProvider\n className={cn(\"block-full\", className, background, 'relative pr-2')}\n defaultOpen={defaultOpen}\n defaultOpenRight={defaultRightOpen}\n onOpenChange={onOpenChange}\n onOpenRightChange={onRightOpenChange}\n open={open}\n openRight={rightOpen}\n style={{\n paddingTop: variant === \"desktop\" ? TITLE_BAR_HEIGHT : 0\n }}\n >\n <AnimatedSidebar\n ariaLabel=\"Primary navigation\"\n className={cn(\"\")}\n collapsible=\"icon\"\n role=\"navigation\"\n variant=\"inset\"\n ></AnimatedSidebar>\n\n <AnimatedSidebarInset\n className={cn(\n \"min-w-24 overflow-hidden border-t border-neutral-200 dark:border-neutral-700 inset-ring-1 inset-ring-neutral-50 dark:inset-ring-black bg-white dark:bg-card rounded-lg!\",\n `mx-0!`\n )}\n >\n <header className=\"flex h-16 items-center justify-between gap-3 px-4 sm:px-6\">\n <div className=\"flex min-w-0 items-center gap-3\">\n <AnimatedSidebarTrigger>\n <MenuIcon className=\"size-5\" />\n </AnimatedSidebarTrigger>\n </div>\n <div className=\"flex shrink-0 items-center gap-3\">\n <AnimatedSidebarTrigger aria-label=\"Toggle panel\" side=\"right\">\n <PanelRightIcon className=\"size-5\" />\n </AnimatedSidebarTrigger>\n </div>\n </header>\n <div className=\"min-h-24 flex-1 overflow-auto\">\n {children ?? <ShellLayoutPlaceholder />}\n </div>\n </AnimatedSidebarInset>\n\n\n\n <AnimatedSidebar\n ariaLabel=\"Secondary panel\"\n // Below md the panel is portal led over the page, so it carries the\n // surface itself; the desktop rail keeps it on the inner panel.\n className={cn(\"max-md:border-l max-md:border-neutral-200 max-md:bg-white dark:max-md:border-neutral-700 dark:max-md:bg-card\")}\n collapsible=\"offcanvas\"\n panelClassName={cn(\n // The off canvas panel keeps a fixed width so it can slide out of the\n // zero-width rail, so the inset gutter has to come out of that width\n // rather than from a left margin.\n \"top-2 ml-0 h-[calc(100%-1rem)] min-w-[calc(var(--sidebar-width))]\",\n \"rounded-lg border-t border-neutral-200 bg-white shadow-md inset-ring-1 inset-ring-neutral-50\",\n \"dark:border-neutral-700 dark:bg-card dark:inset-ring-black\"\n )}\n role=\"complementary\"\n side=\"right\"\n variant=\"inset\"\n >\n {rightDrawer}\n </AnimatedSidebar>\n </AnimatedSidebarProvider>\n )\n}\n\nfunction ShellLayoutPlaceholder() {\n return (\n <div className=\"grid gap-5\">\n <div className=\"grid gap-5 lg:grid-cols-3\">\n {Array.from({ length: 3 }).map((_, index) => (\n <div\n className=\"h-32 border border-border bg-background/60\"\n key={index}\n />\n ))}\n </div>\n <div className=\"h-72 border border-border bg-background/60\" />\n </div>\n )\n}\n","\"use client\"\n\nimport {\n ChevronsUpDownIcon,\n LogOutIcon,\n SettingsIcon,\n UserIcon,\n UserPlusIcon,\n UsersIcon,\n} from \"lucide-react\"\nimport * as React from \"react\"\n\nimport { UserAvatar } from \"@/components/composed/user-avatar\"\nimport { Button } from \"@/components/ui/button\"\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuGroup,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuShortcut,\n DropdownMenuTrigger,\n type MenuPrimitive,\n} from \"@/components/ui/menu\"\nimport { playCue } from \"@/lib/sound\"\nimport { cn } from \"@/lib/utils\"\n\n/** The identity shown on the card. */\nexport interface ProfileCardUser {\n name: string\n /** Secondary line under the name — a handle, an email, a role. */\n username?: string\n /** Avatar image URL. Falls back to the initials when absent or broken. */\n avatar?: string\n /** Fallback initials. Derived from `name` when omitted. */\n initials?: string\n}\n\n/** An actionable row of the menu. */\nexport interface ProfileCardAction {\n type?: \"item\"\n id: string\n label: string\n icon?: React.ReactNode\n /** Right-aligned hint, e.g. \"⌘K\". Purely decorative — bind the key yourself. */\n shortcut?: string\n disabled?: boolean\n variant?: \"default\" | \"destructive\"\n /** Returning a promise puts the card in its loading state until it settles. */\n onSelect?: () => void | Promise<void>\n}\n\n/** A heading over the rows that follow it, up to the next separator. */\nexport interface ProfileCardLabel {\n type: \"label\"\n label: string\n}\n\n/** A rule between two sections. */\nexport interface ProfileCardSeparator {\n type: \"separator\"\n}\n\n/**\n * One entry of `items`. Authored flat; the block renders each run between\n * separators as its own menu group so a label actually names its section.\n */\nexport type ProfileCardItem =\n ProfileCardAction | ProfileCardLabel | ProfileCardSeparator\n\n/**\n * The menu the card ships with. Spread it to keep the shape and attach your\n * own handlers, or ignore it and pass `items` of your own.\n */\nexport const defaultProfileCardItems: ProfileCardItem[] = [\n { type: \"label\", label: \"Management\" },\n { id: \"profile\", label: \"Profile\", icon: <UserIcon aria-hidden=\"true\" /> },\n {\n id: \"settings\",\n label: \"Settings\",\n icon: <SettingsIcon aria-hidden=\"true\" />,\n },\n { type: \"separator\" },\n { id: \"teams\", label: \"Teams\", icon: <UsersIcon aria-hidden=\"true\" /> },\n { id: \"invite\", label: \"Invite\", icon: <UserPlusIcon aria-hidden=\"true\" /> },\n { type: \"separator\" },\n {\n id: \"sign-out\",\n label: \"Log out\",\n icon: <LogOutIcon aria-hidden=\"true\" />,\n variant: \"destructive\",\n },\n]\n\ntype PopupProps = React.ComponentProps<typeof DropdownMenuContent>\n\nexport interface ProfileCardBlockProps {\n user: ProfileCardUser\n /**\n * The menu, flat: actions plus `{ type: \"separator\" }` / `{ type: \"label\" }`\n * entries. Defaults to `defaultProfileCardItems` (no handlers attached).\n */\n items?: ProfileCardItem[]\n /** Menu placement relative to the card. */\n align?: PopupProps[\"align\"]\n side?: PopupProps[\"side\"]\n sideOffset?: PopupProps[\"sideOffset\"]\n open?: boolean\n defaultOpen?: boolean\n onOpenChange?: MenuPrimitive.Root.Props[\"onOpenChange\"]\n /**\n * \"content\" sizes the menu to its items; \"card\" locks it to the trigger's\n * width, so `align` stops mattering horizontally.\n */\n menuWidth?: \"content\" | \"card\"\n /**\n * Emit cuelume press/release on the card and play the open/close cues.\n * Inert unless the app opts into interaction sound via `bindSounds()`.\n */\n sound?: boolean\n /** Called when an action's promise rejects — the card leaves its loading state either way. */\n onError?: (error: unknown) => void\n className?: string\n}\n\n/** Split a flat item list into the groups the menu renders. */\nfunction toGroups(\n items: ProfileCardItem[]\n): { label?: string; actions: ProfileCardAction[] }[] {\n const groups: { label?: string; actions: ProfileCardAction[] }[] = []\n let current: { label?: string; actions: ProfileCardAction[] } = {\n actions: [],\n }\n\n for (const item of items) {\n if (item.type === \"separator\") {\n groups.push(current)\n current = { actions: [] }\n } else if (item.type === \"label\") {\n current.label = item.label\n } else {\n current.actions.push(item)\n }\n }\n groups.push(current)\n\n return groups.filter(\n (group) => group.actions.length > 0 || group.label !== undefined\n )\n}\n\n/**\n * Avatar card that opens an account menu.\n *\n * The trigger is the rich identity chip (avatar + name over handle) and the\n * popup is a plain action menu. `items` is the whole menu — a flat list of\n * actions, separators and labels — defaulting to `defaultProfileCardItems`.\n */\nexport function ProfileCardBlock({\n user,\n items = defaultProfileCardItems,\n align = \"center\",\n side = \"bottom\",\n sideOffset = 8,\n menuWidth = \"content\",\n open,\n defaultOpen,\n onOpenChange,\n sound = true,\n onError,\n className,\n}: ProfileCardBlockProps): React.ReactElement {\n const [pending, setPending] = React.useState<string | null>(null)\n // Actions can outlive the card (sign-out unmounts it, typically).\n const mounted = React.useRef(true)\n React.useEffect(() => {\n mounted.current = true\n return () => {\n mounted.current = false\n }\n }, [])\n\n const groups = React.useMemo(() => toGroups(items), [items])\n\n function select(action: ProfileCardAction) {\n const result = action.onSelect?.()\n if (!(result instanceof Promise)) return\n setPending(action.id)\n result\n .catch((cause: unknown) => onError?.(cause))\n .finally(() => {\n if (mounted.current) setPending(null)\n })\n }\n\n const busy = pending !== null\n\n const handleOpenChange: MenuPrimitive.Root.Props[\"onOpenChange\"] = (\n nextOpen,\n details\n ) => {\n if (sound) playCue(nextOpen ? \"bloom\" : \"droplet\")\n onOpenChange?.(nextOpen, details)\n }\n\n return (\n <DropdownMenu\n defaultOpen={defaultOpen}\n onOpenChange={handleOpenChange}\n open={open}\n >\n <DropdownMenuTrigger\n disabled={busy}\n render={\n <Button\n // Spelled out rather than left to the name-from-contents rule: the\n // avatar sits inside the button and the handle is a second line.\n aria-label={`${user.name}${user.username ? ` ${user.username}` : \"\"}, account menu`}\n className={cn(\n // Quiet at rest — the background only surfaces on hover or\n // while the menu is open.\n \"h-auto w-full justify-between py-1.5 pl-1.5 data-popup-open:bg-accent sm:h-auto\",\n className\n )}\n data-slot=\"profile-card\"\n loading={busy}\n sound={sound}\n variant=\"ghost\"\n >\n <span className=\"flex w-full min-w-0 items-center justify-start gap-2\">\n <UserAvatar\n // Decorative: the name beside it already labels the card.\n alt=\"\"\n initials={user.initials}\n name={user.name}\n src={user.avatar}\n />\n <span className=\"flex min-w-0 flex-col text-left\">\n <span className=\"truncate font-medium\">{user.name}</span>\n {user.username ? (\n <span className=\"truncate text-xs font-normal text-muted-foreground\">\n {user.username}\n </span>\n ) : null}\n </span>\n </span>\n <ChevronsUpDownIcon aria-hidden=\"true\" className=\"size-3.5\" />\n </Button>\n }\n />\n <DropdownMenuContent\n align={align}\n // Content-width by default so `align` reads: a popup locked to\n // `--anchor-width` lands in the same place for every value. `!`\n // because the popup's own `not-[class*='w-']:min-w-32` compiles to\n // a higher-specificity `:not(:is())` that would otherwise win.\n className={cn(\n menuWidth === \"card\" ? \"w-(--anchor-width)\" : \"min-w-44!\",\n \"origin-(--transform-origin) transition-[opacity,scale,translate] duration-150 ease-smooth-out data-ending-style:scale-98 data-ending-style:opacity-0 data-ending-style:duration-100 data-starting-style:scale-98 data-starting-style:opacity-0 data-[side=bottom]:data-ending-style:-translate-y-1 data-[side=bottom]:data-starting-style:-translate-y-1 data-[side=top]:data-ending-style:translate-y-1 data-[side=top]:data-starting-style:translate-y-1 motion-reduce:transition-none\"\n )}\n side={side}\n sideOffset={sideOffset}\n >\n {groups.map((group, index) => (\n <React.Fragment key={group.label ?? `group-${group.actions[0]?.id}`}>\n {index > 0 ? <DropdownMenuSeparator /> : null}\n <DropdownMenuGroup>\n {group.label ? (\n <DropdownMenuLabel>{group.label}</DropdownMenuLabel>\n ) : null}\n {group.actions.map((item) => (\n <DropdownMenuItem\n disabled={item.disabled}\n key={item.id}\n onClick={() => select(item)}\n variant={item.variant}\n >\n {item.icon}\n <span>{item.label}</span>\n {item.shortcut ? (\n <DropdownMenuShortcut>{item.shortcut}</DropdownMenuShortcut>\n ) : null}\n </DropdownMenuItem>\n ))}\n </DropdownMenuGroup>\n </React.Fragment>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n )\n}\n","import { EASE_OUT } from \"@/lib/ease.ts\"\nimport type { FlatResource, SidebarResource, SidebarResourceDropPosition, SidebarResourceMove } from \"@/components/agents/type.ts\"\n\nexport const ROW_REVEAL = {\n duration: 0.16,\n ease: EASE_OUT,\n} as const\n\nexport function canContain(item: SidebarResource) {\n return item.kind === \"folder\" || item.kind === \"project\"\n}\n\nexport function flattenResources(\n items: SidebarResource[],\n expanded: Set<string>,\n depth = 0,\n parentId: string | null = null\n): FlatResource[] {\n return items.flatMap((item) => {\n const row = { item, depth, parentId }\n if (!item.children?.length || !expanded.has(item.id)) return [row]\n return [\n row,\n ...flattenResources(item.children, expanded, depth + 1, item.id),\n ]\n })\n}\n\nexport function findResource(\n items: SidebarResource[],\n id: string\n): SidebarResource | undefined {\n for (const item of items) {\n if (item.id === id) return item\n const child = item.children ? findResource(item.children, id) : undefined\n if (child) return child\n }\n}\n\n\nexport function containsResource(item: SidebarResource, id: string): boolean {\n return (\n item.id === id ||\n item.children?.some((child) => containsResource(child, id)) === true\n );\n}\n\nexport function removeResource(\n items: SidebarResource[],\n id: string,\n): { items: SidebarResource[]; removed?: SidebarResource } {\n let removed: SidebarResource | undefined;\n const next: SidebarResource[] = [];\n\n for (const item of items) {\n if (item.id === id) {\n removed = item;\n continue;\n }\n\n if (item.children?.length) {\n const childResult = removeResource(item.children, id);\n if (childResult.removed) {\n removed = childResult.removed;\n next.push({ ...item, children: childResult.items });\n continue;\n }\n }\n\n next.push(item);\n }\n\n return { items: next, removed };\n}\n\nexport function insertResource(\n items: SidebarResource[],\n resource: SidebarResource,\n targetId: string | null,\n position: SidebarResourceDropPosition,\n): SidebarResource[] {\n if (targetId === null) return [...items, resource];\n\n const next: SidebarResource[] = [];\n for (const item of items) {\n if (item.id === targetId) {\n if (position === \"before\") next.push(resource, item);\n else if (position === \"after\") next.push(item, resource);\n else next.push({ ...item, children: [...(item.children ?? []), resource] });\n continue;\n }\n\n if (item.children?.length) {\n next.push({\n ...item,\n children: insertResource(item.children, resource, targetId, position),\n });\n } else {\n next.push(item);\n }\n }\n return next;\n}\n\nexport function moveResource(\n items: SidebarResource[],\n move: SidebarResourceMove,\n): SidebarResource[] | null {\n const source = findResource(items, move.itemId);\n if (!source || source.disabled) return null;\n if (move.targetId && containsResource(source, move.targetId)) return null;\n\n const target = move.targetId ? findResource(items, move.targetId) : undefined;\n if (\n move.position === \"inside\" &&\n (!target || target.disabled || !canContain(target))\n )\n return null;\n\n const removed = removeResource(items, move.itemId);\n if (!removed.removed) return null;\n return insertResource(\n removed.items,\n removed.removed,\n move.targetId,\n move.position,\n );\n}\n\nexport function renameResource(\n items: SidebarResource[],\n id: string,\n label: string,\n): SidebarResource[] {\n return items.map((item) => ({\n ...item,\n label: item.id === id ? label : item.label,\n children: item.children\n ? renameResource(item.children, id, label)\n : undefined,\n }));\n}\n","\"use client\";\n\nimport {\n type DragEvent,\n type KeyboardEvent,\n useCallback,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport type {\n AISidebarProps,\n DropTarget,\n FlatResource,\n SidebarResource,\n SidebarResourceMove,\n} from \"@/components/agents/type.ts\"\nimport {\n canContain,\n containsResource,\n findResource,\n flattenResources,\n moveResource,\n renameResource,\n} from \"@/components/agents/utils.ts\"\n\nexport type UseAISidebarOptions = Pick<\n AISidebarProps,\n | \"items\"\n | \"defaultItems\"\n | \"onItemsChange\"\n | \"onMove\"\n | \"onMoveError\"\n | \"onRename\"\n | \"activeId\"\n | \"defaultActiveId\"\n | \"onActiveChange\"\n | \"defaultExpandedIds\"\n>\n\nexport function useAISidebar({\n items,\n defaultItems = [],\n onItemsChange,\n onMove,\n onMoveError,\n onRename,\n activeId,\n defaultActiveId = null,\n onActiveChange,\n defaultExpandedIds = [],\n}: UseAISidebarOptions) {\n const [internalItems, setInternalItems] = useState(items ?? defaultItems);\n const [internalActiveId, setInternalActiveId] = useState(defaultActiveId);\n const [expandedIds, setExpandedIds] = useState(\n () => new Set(defaultExpandedIds),\n );\n const [focusedId, setFocusedId] = useState<string | null>(\n activeId ?? defaultActiveId,\n );\n const [draggingId, setDraggingId] = useState<string | null>(null);\n const [dropTarget, setDropTarget] = useState<DropTarget | null>(null);\n const [menuOpenId, setMenuOpenId] = useState<string | null>(null);\n const [renamingId, setRenamingId] = useState<string | null>(null);\n const [hoveredId, setHoveredId] = useState<string | null>(null);\n const hoverLayoutId = useId();\n const [announcement, setAnnouncement] = useState(\"\");\n const rowRefs = useRef(new Map<string, HTMLDivElement>());\n const movePendingRef = useRef(false);\n const renderedItems = internalItems;\n const selectedId = activeId ?? internalActiveId;\n\n const [prevItems, setPrevItems] = useState(items);\n if (items !== prevItems) {\n setPrevItems(items);\n if (items) setInternalItems(items);\n }\n\n const flat = useMemo(\n () => flattenResources(renderedItems, expandedIds),\n [expandedIds, renderedItems],\n );\n\n const isFocusedItemStillVisible =\n focusedId !== null && flat.some((row) => row.item.id === focusedId);\n if (!isFocusedItemStillVisible) {\n const firstVisibleItemId = flat[0]?.item.id ?? null;\n if (focusedId !== firstVisibleItemId) setFocusedId(firstVisibleItemId);\n }\n\n useEffect(() => {\n if (!menuOpenId) return;\n const frame = requestAnimationFrame(() => {\n const menus = Array.from(\n document.querySelectorAll<HTMLElement>(\"[data-sidebar-resource-menu]\"),\n );\n menus\n .find((menu) => menu.dataset.sidebarResourceMenu === menuOpenId)\n ?.querySelector<HTMLElement>(\"button, a[href]\")\n ?.focus();\n });\n return () => cancelAnimationFrame(frame);\n }, [menuOpenId]);\n\n const updateItems = useCallback(\n (next: SidebarResource[]) => {\n setInternalItems(next);\n onItemsChange?.(next);\n },\n [onItemsChange],\n );\n\n const performMove = useCallback(\n async (move: SidebarResourceMove) => {\n if (movePendingRef.current) {\n setAnnouncement(\"Wait for the current move to finish.\");\n return;\n }\n const before = renderedItems;\n const next = moveResource(before, move);\n if (!next || next === before) return;\n\n movePendingRef.current = true;\n updateItems(next);\n setDropTarget(null);\n setDraggingId(null);\n const moved = findResource(before, move.itemId);\n const target = move.targetId ? findResource(before, move.targetId) : null;\n setAnnouncement(\n target\n ? `Moved ${moved?.label ?? \"item\"} ${move.position} ${target.label}.`\n : `Moved ${moved?.label ?? \"item\"} to the top level.`,\n );\n\n try {\n await onMove?.(move);\n } catch (error) {\n updateItems(before);\n setAnnouncement(`Move failed. ${moved?.label ?? \"Item\"} was restored.`);\n onMoveError?.(error, move);\n } finally {\n movePendingRef.current = false;\n }\n },\n [onMove, onMoveError, renderedItems, updateItems],\n );\n\n const focusRow = useCallback((id: string) => {\n setFocusedId(id);\n requestAnimationFrame(() => rowRefs.current.get(id)?.focus());\n }, []);\n\n const select = useCallback(\n (id: string) => {\n if (activeId === undefined) setInternalActiveId(id);\n onActiveChange?.(id);\n },\n [activeId, onActiveChange],\n );\n\n const toggle = useCallback((id: string) => {\n setExpandedIds((current) => {\n const next = new Set(current);\n if (next.has(id)) next.delete(id);\n else next.add(id);\n return next;\n });\n }, []);\n\n const handleKeyDown = useCallback(\n (event: KeyboardEvent<HTMLDivElement>, row: FlatResource) => {\n const index = flat.findIndex(({ item }) => item.id === row.item.id);\n const previous = flat[index - 1];\n const next = flat[index + 1];\n const moveModifier = event.altKey && event.shiftKey;\n\n if (event.key === \"ArrowDown\" && !moveModifier && next) {\n event.preventDefault();\n focusRow(next.item.id);\n return;\n }\n if (event.key === \"ArrowUp\" && !moveModifier && previous) {\n event.preventDefault();\n focusRow(previous.item.id);\n return;\n }\n if (event.key === \"Home\" && flat[0]) {\n event.preventDefault();\n focusRow(flat[0].item.id);\n return;\n }\n if (event.key === \"End\" && flat.at(-1)) {\n event.preventDefault();\n focusRow(flat.at(-1)?.item.id ?? row.item.id);\n return;\n }\n\n if (row.item.disabled) {\n if (event.key === \"ArrowLeft\" && row.parentId) {\n event.preventDefault();\n focusRow(row.parentId);\n } else if (\n moveModifier ||\n [\"ArrowRight\", \"Enter\", \" \", \"F2\", \"ContextMenu\"].includes(\n event.key,\n ) ||\n (event.shiftKey && event.key === \"F10\")\n ) {\n event.preventDefault();\n }\n return;\n }\n\n if (moveModifier && event.key === \"ArrowUp\" && previous) {\n event.preventDefault();\n void performMove({ itemId: row.item.id, targetId: previous.item.id, position: \"before\" });\n return;\n }\n if (moveModifier && event.key === \"ArrowDown\" && next) {\n event.preventDefault();\n void performMove({ itemId: row.item.id, targetId: next.item.id, position: \"after\" });\n return;\n }\n if (moveModifier && event.key === \"ArrowRight\" && previous && canContain(previous.item)) {\n event.preventDefault();\n setExpandedIds((current) => new Set(current).add(previous.item.id));\n void performMove({ itemId: row.item.id, targetId: previous.item.id, position: \"inside\" });\n return;\n }\n if (moveModifier && event.key === \"ArrowLeft\" && row.parentId) {\n event.preventDefault();\n void performMove({ itemId: row.item.id, targetId: row.parentId, position: \"after\" });\n return;\n }\n\n if (event.key === \"ArrowRight\" && canContain(row.item)) {\n event.preventDefault();\n if (!expandedIds.has(row.item.id)) toggle(row.item.id);\n else if (next?.parentId === row.item.id) focusRow(next.item.id);\n } else if (event.key === \"ArrowLeft\") {\n event.preventDefault();\n if (expandedIds.has(row.item.id)) toggle(row.item.id);\n else if (row.parentId) focusRow(row.parentId);\n } else if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n if (canContain(row.item)) toggle(row.item.id);\n else select(row.item.id);\n } else if (event.key === \"F2\") {\n event.preventDefault();\n setRenamingId(row.item.id);\n } else if (event.key === \"ContextMenu\" || (event.shiftKey && event.key === \"F10\")) {\n event.preventDefault();\n setMenuOpenId(row.item.id);\n }\n },\n [expandedIds, flat, focusRow, performMove, select, toggle],\n );\n\n const handleRootDragOver = useCallback(\n (event: DragEvent<HTMLDivElement>) => {\n if (!draggingId || event.target !== event.currentTarget) return;\n event.preventDefault();\n setDropTarget({ id: null, position: \"after\" });\n },\n [draggingId],\n );\n\n const handleDrop = useCallback(\n (event: DragEvent<HTMLDivElement>) => {\n event.preventDefault();\n event.stopPropagation();\n if (draggingId && dropTarget) {\n void performMove({\n itemId: draggingId,\n targetId: dropTarget.id,\n position: dropTarget.position,\n });\n }\n },\n [draggingId, dropTarget, performMove],\n );\n\n const handleRowDragStart = useCallback(\n (event: DragEvent<HTMLDivElement>, id: string) => {\n setDraggingId(id);\n event.dataTransfer.effectAllowed = \"move\";\n event.dataTransfer.setData(\"text/plain\", id);\n },\n [],\n );\n\n const handleRowDragEnd = useCallback(() => {\n setDraggingId(null);\n setDropTarget(null);\n }, []);\n\n const handleRowDragOver = useCallback(\n (event: DragEvent<HTMLDivElement>, targetRow: FlatResource) => {\n if (!draggingId || draggingId === targetRow.item.id) return;\n const source = findResource(renderedItems, draggingId);\n if (source && containsResource(source, targetRow.item.id)) return;\n event.preventDefault();\n event.stopPropagation();\n const rect = event.currentTarget.getBoundingClientRect();\n const ratio = (event.clientY - rect.top) / rect.height;\n const position =\n !targetRow.item.disabled &&\n canContain(targetRow.item) &&\n ratio >= 0.25 &&\n ratio <= 0.75\n ? \"inside\"\n : ratio < 0.5\n ? \"before\"\n : \"after\";\n setDropTarget({ id: targetRow.item.id, position });\n },\n [draggingId, renderedItems],\n );\n\n const commitRename = useCallback(\n (row: FlatResource, label: string) => {\n const trimmed = label.trim();\n setRenamingId(null);\n if (!trimmed || trimmed === row.item.label) return;\n const before = renderedItems;\n updateItems(renameResource(before, row.item.id, trimmed));\n void Promise.resolve(onRename?.(row.item, trimmed)).catch(() => {\n updateItems(before);\n setAnnouncement(`Rename failed. ${row.item.label} was restored.`);\n });\n },\n [onRename, renderedItems, updateItems],\n );\n\n const handleMenuOpenChange = useCallback(\n (row: FlatResource, open: boolean) => {\n setMenuOpenId(open ? row.item.id : null);\n if (!open) focusRow(row.item.id);\n },\n [focusRow],\n );\n\n const handleRowHover = useCallback((id: string, hovered: boolean) => {\n setHoveredId((current) =>\n hovered ? id : current === id ? null : current,\n );\n }, []);\n\n const clearHover = useCallback(() => setHoveredId(null), []);\n\n const setRowRef = useCallback((id: string, node: HTMLDivElement | null) => {\n if (node) rowRefs.current.set(id, node);\n else rowRefs.current.delete(id);\n }, []);\n\n return {\n flat,\n selectedId,\n expandedIds,\n focusedId,\n setFocusedId,\n draggingId,\n dropTarget,\n hoveredId,\n hoverLayoutId,\n handleRowHover,\n clearHover,\n menuOpenId,\n renamingId,\n setRenamingId,\n announcement,\n select,\n toggle,\n handleKeyDown,\n handleRootDragOver,\n handleDrop,\n handleRowDragStart,\n handleRowDragEnd,\n handleRowDragOver,\n commitRename,\n handleMenuOpenChange,\n setRowRef,\n };\n}\n","import type { SidebarResource } from \"@/components/agents/type.ts\"\nimport { Bookmark, FileText, Folder, FolderOpen } from \"lucide-react\"\n\nexport function SidebarIcon(item: SidebarResource, expanded: boolean) {\n const Icon =\n item.kind === \"folder\" || item.kind === \"project\"\n ? expanded\n ? FolderOpen\n : Folder\n : item.kind === \"bookmark\"\n ? Bookmark\n : FileText\n return <Icon className=\"size-4\" />\n}\n","import { motion, useReducedMotion } from \"motion/react\"\nimport { useEffect, useRef, useState } from \"react\"\nimport { ROW_REVEAL } from \"@/components/agents/utils.ts\"\n\nexport function MarqueeLabel({\n active,\n children,\n}: {\n active: boolean\n children: string\n}) {\n const reduce = useReducedMotion() ?? false\n const viewportRef = useRef<HTMLSpanElement>(null)\n const labelRef = useRef<HTMLSpanElement>(null)\n const [distance, setDistance] = useState(0)\n\n useEffect(() => {\n const measure = () => {\n const viewport = viewportRef.current\n const label = labelRef.current\n if (!viewport || !label) return\n setDistance(\n label.scrollWidth > viewport.clientWidth ? label.scrollWidth + 24 : 0\n )\n }\n measure()\n const observer = new ResizeObserver(measure)\n if (viewportRef.current) observer.observe(viewportRef.current)\n if (labelRef.current) observer.observe(labelRef.current)\n return () => observer.disconnect()\n }, [])\n\n const running = active && distance > 0 && !reduce\n\n return (\n <span\n ref={viewportRef}\n className=\"relative block min-w-0 flex-1 overflow-hidden\"\n >\n <motion.span\n className=\"flex w-max items-center gap-6 whitespace-nowrap\"\n animate={{ x: running ? [0, -distance] : 0 }}\n transition={\n running\n ? {\n duration: Math.max(2.4, distance / 34),\n ease: \"linear\",\n repeat: Number.POSITIVE_INFINITY,\n repeatDelay: 2,\n }\n : ROW_REVEAL\n }\n >\n <span ref={labelRef}>{children}</span>\n {running ? <span aria-hidden=\"true\">{children}</span> : null}\n </motion.span>\n </span>\n )\n}\n","\"use client\";\n\nimport {\n type MutableRefObject,\n useCallback,\n useLayoutEffect,\n useState,\n} from \"react\";\n\nexport type PortalLayout = {\n trigger: {\n left: number;\n top: number;\n width: number;\n height: number;\n };\n content: {\n width: number;\n height: number;\n };\n};\n\nfunction sameLayout(a: PortalLayout | null, b: PortalLayout) {\n return (\n a?.trigger.left === b.trigger.left &&\n a.trigger.top === b.trigger.top &&\n a.trigger.width === b.trigger.width &&\n a.trigger.height === b.trigger.height &&\n a.content.width === b.content.width &&\n a.content.height === b.content.height\n );\n}\n\n/** Measures a trigger and portalled panel in viewport coordinates. */\nexport function usePopoverPortalPosition<\n TriggerElement extends HTMLElement,\n ContentElement extends HTMLElement,\n>(\n triggerRef: MutableRefObject<TriggerElement | null>,\n contentRef: MutableRefObject<ContentElement | null>,\n active: boolean,\n) {\n const [layout, setLayout] = useState<PortalLayout | null>(null);\n\n const update = useCallback(() => {\n const trigger = triggerRef.current;\n const content = contentRef.current;\n if (!trigger || !content) return;\n\n const rect = trigger.getBoundingClientRect();\n const next: PortalLayout = {\n trigger: {\n left: rect.left,\n top: rect.top,\n width: rect.width,\n height: rect.height,\n },\n content: {\n width: content.offsetWidth,\n height: content.offsetHeight,\n },\n };\n setLayout((current) => (sameLayout(current, next) ? current : next));\n }, [contentRef, triggerRef]);\n\n useLayoutEffect(() => {\n update();\n if (!active) return;\n\n const trigger = triggerRef.current;\n const content = contentRef.current;\n const observer = new ResizeObserver(update);\n if (trigger) observer.observe(trigger);\n if (content) observer.observe(content);\n\n window.addEventListener(\"scroll\", update, true);\n window.addEventListener(\"resize\", update);\n return () => {\n observer.disconnect();\n window.removeEventListener(\"scroll\", update, true);\n window.removeEventListener(\"resize\", update);\n };\n }, [active, contentRef, triggerRef, update]);\n\n return layout;\n}\n","\"use client\";\n\nimport { AnimatePresence, motion, useReducedMotion } from \"motion/react\";\nimport {\n cloneElement,\n createContext,\n isValidElement,\n type ReactElement,\n type ReactNode,\n type Ref,\n useCallback,\n useContext,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { usePopoverPortalPosition } from \"@/components/motion/popover-position\";\nimport { EASE_OUT, SPRING_PANEL } from \"@/lib/ease\";\nimport { cn } from \"@/lib/utils\";\n\ntype Side = \"top\" | \"bottom\";\ntype Align = \"start\" | \"end\";\n\ntype MorphContextValue = {\n open: boolean;\n setOpen: (open: boolean) => void;\n toggle: () => void;\n triggerId: string;\n contentId: string;\n triggerRef: React.MutableRefObject<HTMLElement | null>;\n setContentRef: (node: HTMLDivElement | null) => void;\n contentRef: React.MutableRefObject<HTMLDivElement | null>;\n};\n\nconst MorphContext = createContext<MorphContextValue | null>(null);\n\nfunction useMorphContext(component: string) {\n const ctx = useContext(MorphContext);\n if (!ctx) throw new Error(`${component} must be used within <MorphPopover>`);\n return ctx;\n}\n\nexport interface MorphPopoverProps {\n children: ReactNode;\n /** Controlled open state. */\n open?: boolean;\n /** Uncontrolled initial open state. */\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean) => void;\n className?: string;\n}\n\n/**\n * A popover whose panel morphs open from the trigger corner: it's laid out at\n * full size but clipped to the corner nearest the trigger, then unclips as one\n * piece. Closes on outside pointer / Escape. Controlled or uncontrolled.\n */\nexport function MorphPopover({\n children,\n open: controlledOpen,\n defaultOpen = false,\n onOpenChange,\n className,\n}: MorphPopoverProps) {\n const baseId = useId();\n const rootRef = useRef<HTMLDivElement>(null);\n const triggerRef = useRef<HTMLElement | null>(null);\n const contentRef = useRef<HTMLDivElement | null>(null);\n const [internalOpen, setInternalOpen] = useState(defaultOpen);\n const controlled = controlledOpen !== undefined;\n const open = controlled ? controlledOpen : internalOpen;\n\n const setOpen = useCallback(\n (next: boolean) => {\n if (!controlled) setInternalOpen(next);\n onOpenChange?.(next);\n },\n [controlled, onOpenChange],\n );\n const toggle = useCallback(() => setOpen(!open), [setOpen, open]);\n\n useEffect(() => {\n if (!open) return;\n const onKey = (e: KeyboardEvent) => e.key === \"Escape\" && setOpen(false);\n const onPointer = (e: PointerEvent) => {\n const target = e.target as Node;\n if (\n rootRef.current &&\n !rootRef.current.contains(target) &&\n !contentRef.current?.contains(target)\n )\n setOpen(false);\n };\n window.addEventListener(\"keydown\", onKey);\n window.addEventListener(\"pointerdown\", onPointer);\n return () => {\n window.removeEventListener(\"keydown\", onKey);\n window.removeEventListener(\"pointerdown\", onPointer);\n };\n }, [open, setOpen]);\n\n const ctx = useMemo<MorphContextValue>(\n () => ({\n open,\n setOpen,\n toggle,\n triggerId: `${baseId}-trigger`,\n contentId: `${baseId}-content`,\n triggerRef,\n setContentRef: (node) => {\n contentRef.current = node;\n },\n contentRef,\n }),\n [open, setOpen, toggle, baseId],\n );\n\n return (\n <MorphContext.Provider value={ctx}>\n <div ref={rootRef} className={cn(\"relative inline-flex\", className)}>\n {children}\n </div>\n </MorphContext.Provider>\n );\n}\n\nexport interface MorphPopoverTriggerProps {\n children: ReactElement;\n}\n\nfunction mergeRefs<T>(...refs: Array<Ref<T> | undefined>) {\n return (node: T | null) => {\n for (const ref of refs) {\n if (typeof ref === \"function\") ref(node);\n else if (ref && typeof ref === \"object\")\n (ref as React.MutableRefObject<T | null>).current = node;\n }\n };\n}\n\n/** Wraps a single element, toggling the popover on click. */\nexport function MorphPopoverTrigger({ children }: MorphPopoverTriggerProps) {\n const ctx = useMorphContext(\"MorphPopoverTrigger\");\n if (!isValidElement(children)) return children;\n\n const child = children as ReactElement<Record<string, unknown>>;\n const childOnClick = child.props.onClick as\n | ((e: unknown) => void)\n | undefined;\n const childRef = (child.props as { ref?: Ref<HTMLElement> }).ref;\n\n return cloneElement(child, {\n id: ctx.triggerId,\n ref: mergeRefs(childRef, (node: HTMLElement | null) => {\n ctx.triggerRef.current = node;\n }),\n onClick: (e: unknown) => {\n childOnClick?.(e);\n ctx.toggle();\n },\n \"aria-haspopup\": \"dialog\",\n \"aria-expanded\": ctx.open,\n \"aria-controls\": ctx.open ? ctx.contentId : undefined,\n });\n}\n\nconst originFor = (side: Side, align: Align) =>\n `${side === \"bottom\" ? \"top\" : \"bottom\"} ${align === \"end\" ? \"right\" : \"left\"}`;\n\n// A clip that hides everything but the corner nearest the trigger, so the\n// panel appears to grow out of it. inset(top right bottom left).\nfunction clipHidden(side: Side, align: Align, radius: number) {\n const top = side === \"bottom\" ? \"0%\" : \"92%\";\n const bottom = side === \"bottom\" ? \"92%\" : \"0%\";\n const right = align === \"end\" ? \"0%\" : \"92%\";\n const left = align === \"end\" ? \"92%\" : \"0%\";\n return `inset(${top} ${right} ${bottom} ${left} round ${radius}px)`;\n}\nconst clipShown = (radius: number) => `inset(0% 0% 0% 0% round ${radius}px)`;\n\n// Preserve the original spring character on the wrapper, but tween the complex\n// clip-path so it cannot snap when the spring resolves its final distance.\nconst MORPH_CLIP_TRANSITION = { duration: 0.32, ease: EASE_OUT } as const;\n\nexport interface MorphPopoverContentProps {\n children: ReactNode;\n side?: Side;\n align?: Align;\n /** Gap between trigger and panel, in px. Default 8. */\n sideOffset?: number;\n /** Panel corner radius, in px. Default 16. */\n radius?: number;\n className?: string;\n}\n\nexport function MorphPopoverContent({\n children,\n side = \"bottom\",\n align = \"end\",\n sideOffset = 8,\n radius = 16,\n className,\n}: MorphPopoverContentProps) {\n const ctx = useMorphContext(\"MorphPopoverContent\");\n const { contentId, setContentRef, triggerId } = ctx;\n const reduce = useReducedMotion() ?? false;\n const [portalReady, setPortalReady] = useState(false);\n const layout = usePopoverPortalPosition(\n ctx.triggerRef,\n ctx.contentRef,\n portalReady && ctx.open,\n );\n\n useEffect(() => setPortalReady(true), []);\n const left = layout\n ? align === \"end\"\n ? layout.trigger.left + layout.trigger.width - layout.content.width\n : layout.trigger.left\n : 0;\n const top = layout\n ? side === \"bottom\"\n ? layout.trigger.top + layout.trigger.height + sideOffset\n : layout.trigger.top - layout.content.height - sideOffset\n : 0;\n\n // Both directions travel between the exact same hidden/show states. Exit\n // targets \"hidden\" directly instead of introducing separate choreography.\n const wrap = reduce\n ? undefined\n : {\n hidden: { opacity: 0, scale: 0.96, transition: SPRING_PANEL },\n show: { opacity: 1, scale: 1, transition: SPRING_PANEL },\n };\n const clip = reduce\n ? undefined\n : {\n hidden: {\n clipPath: clipHidden(side, align, radius),\n transition: MORPH_CLIP_TRANSITION,\n },\n show: {\n clipPath: clipShown(radius),\n transition: MORPH_CLIP_TRANSITION,\n },\n };\n\n // Keep the server and first client render identical, then mount the portal.\n if (!portalReady) return null;\n\n return createPortal(\n <AnimatePresence>\n {ctx.open ? (\n <motion.div\n data-morph-popover-portal=\"\"\n // Wrapper carries the shadow as a drop-shadow filter, which hugs the\n // clipped shape below (box-shadow would just get clipped away).\n variants={wrap}\n initial={reduce ? { opacity: 0 } : \"hidden\"}\n animate={reduce ? { opacity: 1 } : \"show\"}\n exit={reduce ? { opacity: 0 } : \"hidden\"}\n transition={reduce ? { duration: 0.12 } : undefined}\n style={{\n left,\n top,\n visibility: layout ? \"visible\" : \"hidden\",\n transformOrigin: originFor(side, align),\n }}\n className=\"fixed z-[9999] [filter:drop-shadow(0_10px_18px_rgba(0,0,0,0.14))]\"\n >\n <motion.div\n ref={setContentRef}\n id={contentId}\n role=\"dialog\"\n aria-labelledby={triggerId}\n variants={clip}\n style={{ borderRadius: radius }}\n className={cn(\n \"overflow-hidden border border-border bg-background\",\n className,\n )}\n >\n {children}\n </motion.div>\n </motion.div>\n ) : null}\n </AnimatePresence>,\n document.body,\n );\n}\n","import {\n cloneElement,\n useEffect,\n useRef,\n useState,\n type MouseEvent,\n} from \"react\"\nimport type { ResourceRowProps } from \"@/components/agents/type.ts\"\nimport {\n AnimatePresence,\n motion,\n useReducedMotion,\n type Variants,\n} from \"motion/react\"\nimport { ChevronRight, MoreHorizontal, Pencil } from \"lucide-react\"\nimport { SPRING_LAYOUT } from \"@/lib/ease.ts\"\nimport { cn } from \"@/lib/utils.ts\"\nimport { canContain } from \"@/components/agents/utils.ts\"\nimport { SidebarIcon } from \"@/components/agents/sidebar-icon.tsx\"\nimport { MarqueeLabel } from \"@/components/agents/marquee-label.tsx\"\nimport {\n MorphPopover,\n MorphPopoverContent,\n MorphPopoverTrigger,\n} from \"@/components/motion/popover-morph.tsx\"\nimport { Button } from \"@/components/ui/button\";\n\n// Same choreography as SharedLayoutBg: the wrapper only fades/blurs out when\n// the pointer leaves the whole tree; a row-to-row move exits instantly so the\n// layoutId pill slides instead of crossfading.\nconst pillVariants: Variants = {\n initial: { opacity: 0, filter: \"blur(6px)\" },\n animate: { opacity: 1, filter: \"blur(0px)\" },\n exit: (hoverActive: boolean) =>\n !hoverActive ? { opacity: 0, filter: \"blur(6px)\" } : {},\n}\n\nconst reducedPillVariants: Variants = {\n initial: { opacity: 0 },\n animate: { opacity: 1 },\n exit: (hoverActive: boolean) => (!hoverActive ? { opacity: 0 } : {}),\n}\n\nexport function ResourceRow({\n row,\n active,\n expanded,\n focused,\n draggingId,\n dropTarget,\n menuOpen,\n renaming,\n onDragEnd,\n onDragOver,\n onDragStart,\n onDrop,\n onFocus,\n onKeyDown,\n onMenuOpenChange,\n onRenameCancel,\n onRenameCommit,\n onRenameStart,\n onSelect,\n onToggle,\n hoverActive = false,\n hoverPill = false,\n hoverLayoutId,\n onHoverChange,\n renderIcon,\n renderMenu,\n renderActionsTrigger,\n setRef,\n}: ResourceRowProps) {\n const reduce = useReducedMotion() ?? false\n const [hovered, setHovered] = useState(false)\n const inputRef = useRef<HTMLInputElement>(null)\n const skipRenameBlurRef = useRef(false)\n const draggedRef = useRef(false)\n const [draft, setDraft] = useState(row.item.label)\n const acceptsChildren = canContain(row.item)\n const isDragging = draggingId === row.item.id\n const dropPosition =\n dropTarget?.id === row.item.id ? dropTarget.position : null\n\n useEffect(() => {\n if (!renaming) return\n skipRenameBlurRef.current = false\n // setDraft(row.item.label);\n requestAnimationFrame(() => {\n inputRef.current?.focus()\n inputRef.current?.select()\n })\n }, [renaming, row.item.label])\n\n const menu = renderMenu?.(row.item, {\n close: () => onMenuOpenChange(false),\n rename: () => {\n onMenuOpenChange(false)\n onRenameStart()\n },\n }) ?? (\n <button\n type=\"button\"\n onClick={() => {\n onMenuOpenChange(false)\n onRenameStart()\n }}\n className=\"flex h-8 w-full items-center gap-2 rounded-lg px-2.5 text-left text-xs text-foreground transition-colors outline-none hover:bg-muted focus-visible:bg-muted focus-visible:ring-2 focus-visible:ring-ring\"\n >\n <Pencil aria-hidden=\"true\" className=\"size-3.5\" />\n Rename\n </button>\n )\n\n return (\n <motion.div\n ref={setRef}\n layout=\"position\"\n transition={reduce ? { duration: 0 } : SPRING_LAYOUT}\n role=\"treeitem\"\n aria-level={row.depth + 1}\n aria-selected={acceptsChildren ? undefined : active}\n aria-expanded={acceptsChildren ? expanded : undefined}\n aria-disabled={row.item.disabled || undefined}\n tabIndex={focused ? 0 : -1}\n draggable={!row.item.disabled && !renaming}\n data-menu-open={menuOpen || undefined}\n data-drop={dropPosition ?? undefined}\n data-dragging={isDragging || undefined}\n onFocus={onFocus}\n onKeyDown={onKeyDown}\n onClick={(event) => {\n if (\n event.defaultPrevented ||\n draggedRef.current ||\n renaming ||\n row.item.disabled\n )\n return\n if (acceptsChildren) onToggle()\n else onSelect()\n }}\n onDoubleClick={(event) => {\n if (acceptsChildren || row.item.disabled) return\n event.preventDefault()\n onRenameStart()\n }}\n onMouseEnter={() => {\n setHovered(true)\n onHoverChange?.(true)\n }}\n onMouseLeave={() => {\n setHovered(false)\n onHoverChange?.(false)\n }}\n onDragStartCapture={(event) => {\n draggedRef.current = true\n onDragStart(event, row.item.id)\n }}\n onDragEndCapture={() => {\n onDragEnd()\n requestAnimationFrame(() => {\n draggedRef.current = false\n })\n }}\n onDragOver={(event) => onDragOver(event, row)}\n onDrop={onDrop}\n className={cn(\n \"group/resource relative flex min-h-9 min-w-0 cursor-pointer items-center gap-2.5 rounded-md pr-3 text-sm outline-none\",\n \"text-muted-foreground transition-[color,background-color,scale] duration-150 ease-smooth-out hover:text-foreground motion-reduce:transition-none\",\n !row.item.disabled &&\n !renaming &&\n \"active:scale-97 motion-reduce:active:scale-100\",\n // Fallback for standalone rows that render without the shared pill.\n hoverLayoutId === undefined && \"hover:bg-muted\",\n \"focus-visible:bg-muted/70 focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-inset\",\n \"data-[menu-open=true]:bg-muted data-[menu-open=true]:text-foreground\",\n \"data-[dragging=true]:opacity-40\",\n \"data-[drop=inside]:bg-primary/10 data-[drop=inside]:ring-1 data-[drop=inside]:ring-primary/45\",\n \"data-[drop=before]:before:absolute data-[drop=before]:before:-top-0.5 data-[drop=before]:before:right-2 data-[drop=before]:before:left-2 data-[drop=before]:before:h-0.5 data-[drop=before]:before:rounded-full data-[drop=before]:before:bg-primary\",\n \"data-[drop=after]:after:absolute data-[drop=after]:after:right-2 data-[drop=after]:after:-bottom-0.5 data-[drop=after]:after:left-2 data-[drop=after]:after:h-0.5 data-[drop=after]:after:rounded-full data-[drop=after]:after:bg-primary\",\n !acceptsChildren &&\n active &&\n \"bg-primary/10 text-primary dark:bg-primary/25 dark:text-primary-foreground\",\n row.item.disabled && \"cursor-not-allowed opacity-45\"\n )}\n style={{ paddingLeft: `${12 + row.depth * 16}px` }}\n >\n {hoverLayoutId ? (\n <AnimatePresence custom={hoverActive}>\n {hoverActive ? (\n <motion.span\n aria-hidden=\"true\"\n variants={reduce ? reducedPillVariants : pillVariants}\n initial=\"initial\"\n animate=\"animate\"\n exit=\"exit\"\n custom={hoverActive}\n className=\"pointer-events-none absolute inset-0\"\n >\n {hoverPill ? (\n <motion.span\n layoutId={hoverLayoutId}\n transition={reduce ? { duration: 0 } : SPRING_LAYOUT}\n className=\"block h-full w-full rounded-md bg-foreground/8 dark:bg-muted/50\"\n />\n ) : null}\n </motion.span>\n ) : null}\n </AnimatePresence>\n ) : null}\n <span\n aria-hidden=\"true\"\n className=\"relative grid size-5 shrink-0 place-items-center\"\n >\n {renderIcon?.(row.item) ?? SidebarIcon(row.item, expanded)}\n </span>\n\n {renaming ? (\n <input\n ref={inputRef}\n value={draft}\n aria-label={`Rename ${row.item.label}`}\n onChange={(event) => setDraft(event.target.value)}\n draggable={false}\n onClick={(event) => event.stopPropagation()}\n onDoubleClick={(event) => event.stopPropagation()}\n onBlur={() => {\n if (!skipRenameBlurRef.current) onRenameCommit(draft)\n }}\n onKeyDown={(event) => {\n event.stopPropagation()\n if (event.key === \"Enter\") {\n skipRenameBlurRef.current = true\n onRenameCommit(draft)\n }\n if (event.key === \"Escape\") {\n skipRenameBlurRef.current = true\n onRenameCancel()\n }\n }}\n className=\"relative h-7 min-w-0 flex-1 text-sm text-foreground outline-none focus-visible:ring-0 focus-visible:ring-ring\"\n />\n ) : (\n <MarqueeLabel active={hovered || menuOpen}>\n {row.item.label}\n </MarqueeLabel>\n )}\n\n {!renaming && !row.item.disabled ? (\n <MorphPopover open={menuOpen} onOpenChange={onMenuOpenChange}>\n <MorphPopoverTrigger>\n {(() => {\n const custom = renderActionsTrigger?.(row.item)\n if (custom) {\n // A row click selects/toggles — the trigger must not bubble.\n const customOnClick = (\n custom.props as {\n onClick?: (event: MouseEvent<HTMLElement>) => void\n }\n ).onClick\n return cloneElement(custom, {\n draggable: false,\n onClick: (event: MouseEvent<HTMLElement>) => {\n event.stopPropagation()\n customOnClick?.(event)\n },\n } as Partial<unknown>)\n }\n return (\n <Button\n draggable={false}\n tabIndex={-1}\n variant=\"link\"\n aria-label={`Actions for ${row.item.label}`}\n onClick={(event) => event.stopPropagation()}\n className=\"relative grid size-7 shrink-0 place-items-center rounded-lg opacity-0 transition-opacity duration-150 ease-smooth-out outline-none group-hover/resource:opacity-80 group-hover/resource:delay-150 group-data-[menu-open=true]/resource:opacity-100 hover:bg-foreground/5 focus-visible:opacity-100 focus-visible:ring-2 focus-visible:ring-ring motion-reduce:transition-none\"\n >\n <MoreHorizontal aria-hidden=\"true\" className=\"size-4\" />\n </Button>\n )\n })()}\n </MorphPopoverTrigger>\n <MorphPopoverContent\n side=\"bottom\"\n align=\"end\"\n sideOffset={8}\n radius={12}\n className=\"w-40 p-1.5\"\n >\n <div data-sidebar-resource-menu={row.item.id}>{menu}</div>\n </MorphPopoverContent>\n </MorphPopover>\n ) : null}\n\n {row.depth === 0 &&\n acceptsChildren &&\n (row.item.children?.length ?? 0) > 0 ? (\n <ChevronRight\n aria-hidden=\"true\"\n className={cn(\n \"relative size-3.5 shrink-0 text-muted-foreground transition-transform duration-200 ease-smooth-out motion-reduce:transition-none\",\n expanded && \"rotate-90\"\n )}\n />\n ) : null}\n </motion.div>\n )\n}\n","\"use client\";\n\nimport { AnimatePresence } from \"motion/react\";\nimport { cn } from \"@/lib/utils\";\nimport type { AISidebarProps } from \"@/components/agents/type.ts\"\nimport { useAISidebar } from \"@/components/agents/use-ai-sidebar.ts\"\nimport { ResourceRow } from \"@/components/agents/sidebar-row.tsx\"\n\nexport function AISidebar({\n renderIcon,\n renderMenu,\n renderActionsTrigger,\n ariaLabel = \"Resources\",\n className,\n ...options\n}: AISidebarProps) {\n const {\n flat,\n selectedId,\n expandedIds,\n focusedId,\n setFocusedId,\n draggingId,\n dropTarget,\n hoveredId,\n hoverLayoutId,\n handleRowHover,\n clearHover,\n menuOpenId,\n renamingId,\n setRenamingId,\n announcement,\n select,\n toggle,\n handleKeyDown,\n handleRootDragOver,\n handleDrop,\n handleRowDragStart,\n handleRowDragEnd,\n handleRowDragOver,\n commitRename,\n handleMenuOpenChange,\n setRowRef,\n } = useAISidebar(options);\n\n return (\n <>\n <div\n role=\"tree\"\n aria-label={ariaLabel}\n aria-multiselectable=\"false\"\n onDragOver={handleRootDragOver}\n onDrop={handleDrop}\n onMouseLeave={clearHover}\n className={cn(\n \"relative flex min-w-0 flex-col gap-0.5 [overflow-anchor:none] group-data-[state=collapsed]/sidebar:hidden\",\n draggingId && \"select-none pb-9\",\n className,\n )}\n >\n <AnimatePresence initial={false}>\n {flat.map((row) => (\n <ResourceRow\n key={row.item.id}\n row={row}\n active={selectedId === row.item.id}\n expanded={expandedIds.has(row.item.id)}\n focused={focusedId === row.item.id}\n draggingId={draggingId}\n dropTarget={dropTarget}\n menuOpen={menuOpenId === row.item.id}\n renaming={renamingId === row.item.id}\n hoverActive={hoveredId !== null && !draggingId}\n hoverPill={\n hoveredId === row.item.id &&\n !draggingId &&\n !row.item.disabled\n }\n hoverLayoutId={hoverLayoutId}\n onHoverChange={(hovered) =>\n handleRowHover(row.item.id, hovered)\n }\n onFocus={() => setFocusedId(row.item.id)}\n onSelect={() => select(row.item.id)}\n onToggle={() => toggle(row.item.id)}\n onKeyDown={(event) => handleKeyDown(event, row)}\n onRenameStart={() => setRenamingId(row.item.id)}\n onRenameCancel={() => setRenamingId(null)}\n onRenameCommit={(label) => commitRename(row, label)}\n onMenuOpenChange={(open) => handleMenuOpenChange(row, open)}\n onDragStart={handleRowDragStart}\n onDragEnd={handleRowDragEnd}\n onDragOver={handleRowDragOver}\n onDrop={handleDrop}\n renderIcon={renderIcon}\n renderMenu={renderMenu}\n renderActionsTrigger={renderActionsTrigger}\n setRef={(node) => setRowRef(row.item.id, node)}\n />\n ))}\n </AnimatePresence>\n\n {draggingId ? (\n <div\n aria-hidden=\"true\"\n data-active={dropTarget?.id === null || undefined}\n className=\"absolute inset-x-1 bottom-0 flex h-8 items-center justify-center rounded-md border border-dashed border-border text-[10px] text-muted-foreground data-[active=true]:border-primary/50 data-[active=true]:bg-primary/10 data-[active=true]:text-foreground\"\n >\n Move to top level\n </div>\n ) : null}\n </div>\n <span className=\"sr-only\" aria-live=\"polite\">\n {announcement}\n </span>\n </>\n );\n}\n","import { AISidebar } from \"./ai-sidebar\"\nimport { MarqueeLabel } from \"./marquee-label.tsx\"\nimport { ResourceRow } from \"./sidebar-row.tsx\"\nimport { SidebarIcon } from \"./sidebar-icon.tsx\"\nexport { useAISidebar, type UseAISidebarOptions } from \"./use-ai-sidebar.ts\"\nexport type * from \"./type.ts\"\n\nexport { AISidebar, MarqueeLabel, ResourceRow, SidebarIcon }\n\nexport const Sidebar = {\n Wrapper: AISidebar,\n MarqueeLabel,\n Row: ResourceRow,\n Icon: SidebarIcon\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../src/lib/utils.ts","../src/components/ui/avatar.tsx","../src/components/ui/spinner.tsx","../src/components/ui/glasscn/liquid-glass.tsx","../src/lib/glass-variants.ts","../src/components/ui/button.tsx","../src/components/ui/card.tsx","../src/lib/sound.ts","../src/components/ui/checkbox.tsx","../src/components/ui/field.tsx","../src/components/ui/frame.tsx","../src/components/ui/input.tsx","../src/components/ui/textarea.tsx","../src/components/ui/input-group.tsx","../src/components/ui/label.tsx","../src/components/ui/menu.tsx","../src/components/ui/separator.tsx","../src/components/ui/otp-field.tsx","../src/components/ui/skeleton.tsx","../src/components/composed/password-input.tsx","../src/components/composed/social-providers.tsx","../src/components/composed/user-avatar.tsx","../src/lib/auth-accent.ts","../src/components/blocks/auth/auth-shell.tsx","../src/components/blocks/auth/code-auth-block.tsx","../src/components/blocks/auth/forgot-password-block.tsx","../src/components/blocks/auth/linked-accounts-block.tsx","../src/components/blocks/auth/login-block.tsx","../src/components/blocks/auth/onboarding/profile-step.tsx","../src/components/blocks/auth/onboarding-block.tsx","../src/components/blocks/auth/passkey-manager-block.tsx","../src/components/blocks/auth/passkey-sign-in-block.tsx","../src/components/blocks/auth/signup-block.tsx","../src/components/blocks/auth/update-password-block.tsx","../src/lib/ease.ts","../src/components/motion/shared-layout-bg.tsx","../src/components/motion/animated-sidebar.tsx","../src/components/blocks/nav/utils.ts","../src/components/blocks/nav/sidebar-nav-row.tsx","../src/components/blocks/nav/sidebar-block.tsx","../src/components/blocks/nav/sidebar/utils.ts","../src/components/blocks/nav/sidebar/use-ai-sidebar.ts","../src/components/blocks/nav/sidebar/sidebar-icon.tsx","../src/components/blocks/nav/sidebar/marquee-label.tsx","../src/components/motion/popover-position.ts","../src/components/motion/popover-morph.tsx","../src/components/blocks/nav/sidebar/sidebar-row.tsx","../src/components/blocks/nav/sidebar/ai-sidebar.tsx","../src/components/blocks/nav/sidebar/index.ts","../src/components/blocks/shell/utils.ts","../src/components/blocks/shell/shell-layout.tsx","../src/components/blocks/layout.ts","../src/components/blocks/profile/profile-card-block.tsx"],"sourcesContent":["import { clsx, type ClassValue } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n","\"use client\";\n\nimport { Avatar as AvatarPrimitive } from \"@base-ui/react/avatar\";\nimport type React from \"react\";\nimport { cn } from \"@/lib/utils\";\n\nexport function Avatar({\n className,\n ...props\n}: AvatarPrimitive.Root.Props): React.ReactElement {\n return (\n <AvatarPrimitive.Root\n className={cn(\n \"inline-flex size-8 shrink-0 select-none items-center justify-center overflow-hidden rounded-full bg-background align-middle font-medium text-xs\",\n className,\n )}\n data-slot=\"avatar\"\n {...props}\n />\n );\n}\n\nexport function AvatarImage({\n className,\n ...props\n}: AvatarPrimitive.Image.Props): React.ReactElement {\n return (\n <AvatarPrimitive.Image\n className={cn(\"size-full object-cover\", className)}\n data-slot=\"avatar-image\"\n {...props}\n />\n );\n}\n\nexport function AvatarFallback({\n className,\n ...props\n}: AvatarPrimitive.Fallback.Props): React.ReactElement {\n return (\n <AvatarPrimitive.Fallback\n className={cn(\n \"flex size-full items-center justify-center rounded-full bg-muted\",\n className,\n )}\n data-slot=\"avatar-fallback\"\n {...props}\n />\n );\n}\n\nexport { AvatarPrimitive };\n","import { Loader2Icon } from \"lucide-react\";\nimport type React from \"react\";\nimport { cn } from \"@/lib/utils\";\n\nexport function Spinner({\n className,\n ...props\n}: React.ComponentProps<typeof Loader2Icon>): React.ReactElement {\n return (\n <Loader2Icon\n aria-label=\"Loading\"\n className={cn(\"animate-spin\", className)}\n role=\"status\"\n {...props}\n />\n );\n}\n","\"use client\";\n\nimport {\n type CSSProperties,\n type HTMLAttributes,\n forwardRef,\n useCallback,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n} from \"react\";\n\nimport { cn } from \"@/lib/utils\";\n\ntype MapGeometry = {\n width: number; // element width, CSS px, integer\n height: number; // element height, CSS px, integer\n radius: number; // corner radius, CSS px, already clamped to min(width, height) / 2\n bezel: number; // fraction (0..1] of the half-min-dimension used as the refractive band\n};\n\nconst MAX_TEXTURE_SIZE = 480;\nconst EDGE_TAPER_PX = 1.25;\n\nconst displacementMapCache = new Map<string, string>();\n\n// CSS.supports(\"backdrop-filter\", \"url(#f)\") returns true in Safari and\n// Firefox (they parse the value) but neither browser actually renders SVG\n// filters through backdrop-filter. UA sniffing is the only reliable approach.\n// When WebKit ships support (track WebKit bug 245510), loosen this function.\nfunction supportsSvgBackdropFilter() {\n if (typeof navigator === \"undefined\") return false;\n const ua = navigator.userAgent;\n const isChromium = /Chrom(e|ium)/.test(ua) || /Edg\\//.test(ua);\n return isChromium && !/Firefox/.test(ua);\n}\n\n// NOTE: Per-corner radii and percentage radii are NOT supported. The map\n// reads only borderTopLeftRadius in px. If a future consumer needs\n// asymmetric corners, extend the corner SDF branch to accept four radii.\n//\n// NOTE: Map regeneration renders a ≤480 px texture and encodes a PNG for\n// each unique (width, height, radius, bezel). Continuously animating the\n// element's SIZE will thrash the cache; animate transform: scale instead.\nfunction createDisplacementMap({ width, height, radius, bezel }: MapGeometry) {\n const cacheKey = `${width}:${height}:${radius}:${bezel}`;\n const cached = displacementMapCache.get(cacheKey);\n if (cached !== undefined) return cached;\n\n const downscale = Math.min(1, MAX_TEXTURE_SIZE / Math.max(width, height));\n const texWidth = Math.max(2, Math.round(width * downscale));\n const texHeight = Math.max(2, Math.round(height * downscale));\n\n const canvas = document.createElement(\"canvas\");\n canvas.width = texWidth;\n canvas.height = texHeight;\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) return \"\";\n\n const image = ctx.createImageData(texWidth, texHeight);\n const data = image.data;\n const halfWidth = width / 2;\n const halfHeight = height / 2;\n const r = Math.min(radius, halfWidth, halfHeight);\n const bezelPx = Math.max(1, bezel * Math.min(halfWidth, halfHeight));\n\n for (let ty = 0; ty < texHeight; ty += 1) {\n for (let tx = 0; tx < texWidth; tx += 1) {\n // Texel center in element coordinates, origin at element center.\n const px = ((tx + 0.5) / texWidth) * width - halfWidth;\n const py = ((ty + 0.5) / texHeight) * height - halfHeight;\n\n // Signed distance + outward normal of the rounded-rectangle contour.\n const qx = Math.abs(px) - (halfWidth - r);\n const qy = Math.abs(py) - (halfHeight - r);\n let signedDistance: number;\n let dirX = 0;\n let dirY = 0;\n if (qx > 0 && qy > 0) {\n const len = Math.hypot(qx, qy);\n signedDistance = len - r;\n dirX = (Math.sign(px) * qx) / len;\n dirY = (Math.sign(py) * qy) / len;\n } else if (qx > qy) {\n signedDistance = qx - r;\n dirX = Math.sign(px);\n } else {\n signedDistance = qy - r;\n dirY = Math.sign(py);\n }\n\n const index = (ty * texWidth + tx) * 4;\n const inside = -signedDistance; // px from the contour, positive inside\n\n if (inside <= 0) {\n data[index] = 128;\n data[index + 1] = 128;\n data[index + 2] = 128;\n data[index + 3] = 255;\n continue;\n }\n\n const t = Math.min(1, inside / bezelPx); // 0 at the edge → 1 at the bezel's inner end\n let magnitude = 1 - convexSquircle(t); // max refraction at the edge, optically flat interior\n magnitude *= Math.min(1, inside / EDGE_TAPER_PX); // avoid sampling artifacts on the outermost pixels\n\n data[index] = Math.round(128 + dirX * magnitude * 127);\n data[index + 1] = Math.round(128 + dirY * magnitude * 127);\n data[index + 2] = 128;\n data[index + 3] = 255;\n }\n }\n\n ctx.putImageData(image, 0, 0);\n const mapUrl = canvas.toDataURL(\"image/png\");\n displacementMapCache.set(cacheKey, mapUrl);\n return mapUrl;\n}\n\nfunction convexSquircle(x: number) {\n return Math.pow(1 - Math.pow(1 - x, 4), 0.25);\n}\n\nexport type LiquidGlassProps = HTMLAttributes<HTMLDivElement> & {\n /** Extra blur mixed into the backdrop-filter after the SVG refraction. */\n blur?: number;\n /** SVG displacement strength. Higher values bend the sampled backdrop more. */\n refraction?: number;\n /**\n * @deprecated Texture size now derives from element size. Accepted for\n * backwards-compatibility but has no effect.\n */\n mapSize?: number;\n /** Fraction of the radius used as the curved edge where most refraction happens. */\n bezel?: number;\n /** Backdrop saturation. */\n saturation?: number;\n};\n\nexport const LiquidGlass = forwardRef<HTMLDivElement, LiquidGlassProps>(function LiquidGlass(\n {\n blur = 2,\n refraction = 15,\n mapSize: _mapSize,\n bezel = 0.34,\n saturation = 1.28,\n className,\n style,\n children,\n ...props\n },\n ref,\n) {\n const rawId = useId();\n const filterId = useMemo(() => `liquid-glass-${rawId.replace(/:/g, \"\")}`, [rawId]);\n console.log(_mapSize)\n // -------------------------------------------------------------------------\n // Ref merge — we need the DOM node to measure geometry while still\n // forwarding the ref to the consumer.\n // -------------------------------------------------------------------------\n\n const localRef = useRef<HTMLDivElement | null>(null);\n const setRefs = useCallback(\n (node: HTMLDivElement | null) => {\n localRef.current = node;\n if (typeof ref === \"function\") ref(node);\n else if (ref) ref.current = node;\n },\n [ref],\n );\n\n // -------------------------------------------------------------------------\n // Geometry measurement via ResizeObserver\n // -------------------------------------------------------------------------\n\n const [geometry, setGeometry] = useState<MapGeometry | null>(null);\n\n useEffect(() => {\n const el = localRef.current;\n if (!el) return;\n const measure = () => {\n const rect = el.getBoundingClientRect();\n const width = Math.round(rect.width);\n const height = Math.round(rect.height);\n if (!width || !height) return;\n const parsed = Number.parseFloat(getComputedStyle(el).borderTopLeftRadius);\n const radius = Math.min(Number.isFinite(parsed) ? parsed : Math.min(width, height) / 2, width / 2, height / 2);\n setGeometry((prev) =>\n prev && prev.width === width && prev.height === height && prev.radius === radius && prev.bezel === bezel\n ? prev\n : { width, height, radius, bezel },\n );\n };\n measure();\n const observer = new ResizeObserver(measure);\n observer.observe(el);\n return () => observer.disconnect();\n }, [bezel]);\n\n const mapUrl = useMemo(() => (geometry ? createDisplacementMap(geometry) : \"\"), [geometry]);\n\n // -------------------------------------------------------------------------\n // Browser capability gate\n //\n // Both SSR and the first client render take the fallback branch so hydration\n // never mismatches. The state is set in an effect (client-only).\n // -------------------------------------------------------------------------\n\n const [supported, setSupported] = useState(false);\n\n useEffect(() => {\n setSupported(supportsSvgBackdropFilter());\n }, []);\n\n const refractionActive = supported && mapUrl !== \"\";\n const backdropFilter = refractionActive\n ? `url(#${filterId}) blur(${blur}px) saturate(${saturation})`\n : `blur(${blur + 2}px) saturate(${saturation})`;\n\n return (\n <>\n <div\n ref={setRefs}\n className={cn(\n \"relative overflow-hidden rounded-full bg-white/[0.08]\",\n className,\n )}\n style={{ ...style, backdropFilter, WebkitBackdropFilter: backdropFilter } as CSSProperties}\n {...props}\n >\n {children}\n <span\n aria-hidden\n className=\"pointer-events-none absolute inset-0 rounded-[inherit]\"\n style={{\n // Rim thickness, overridable per-consumer via --liquid-glass-rim-width.\n padding: \"var(--liquid-glass-rim-width, 0.5px)\",\n background:\n // iOS 27 liquid-glass rim. Each gradient runs ALONG its edges and\n // fades to nothing at the corners, uniform in between:\n // - to right → white streak on the top + bottom runs\n // - to bottom → dark streak on the left + right runs\n // Streak colors are overridable per-consumer via the\n // --liquid-glass-rim-light / --liquid-glass-rim-dark variables;\n // --liquid-glass-rim-fade sets how far from each corner the\n // streak takes to reach full strength (smaller = longer streak).\n \"linear-gradient(to right, rgba(255,255,255,0), var(--liquid-glass-rim-light, rgba(255,255,255,0.25)) var(--liquid-glass-rim-fade, 18%), var(--liquid-glass-rim-light, rgba(255,255,255,0.25)) calc(100% - var(--liquid-glass-rim-fade, 18%)), rgba(255,255,255,0)), \" +\n \"linear-gradient(to bottom, rgba(0,0,0,0), var(--liquid-glass-rim-dark, rgba(0,0,0,0.2)) var(--liquid-glass-rim-fade, 18%), var(--liquid-glass-rim-dark, rgba(0,0,0,0.2)) calc(100% - var(--liquid-glass-rim-fade, 18%)), rgba(0,0,0,0))\",\n WebkitMask: \"linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0)\",\n WebkitMaskComposite: \"xor\",\n mask: \"linear-gradient(#000 0 0) content-box exclude, linear-gradient(#000 0 0)\",\n }}\n />\n </div>\n\n {refractionActive && (\n <svg className=\"absolute size-0 overflow-hidden\" aria-hidden>\n <filter id={filterId} x=\"0\" y=\"0\" width=\"100%\" height=\"100%\" colorInterpolationFilters=\"sRGB\">\n <feImage href={mapUrl} x=\"0\" y=\"0\" width=\"100%\" height=\"100%\" preserveAspectRatio=\"none\" result=\"map\" />\n <feDisplacementMap\n in=\"SourceGraphic\"\n in2=\"map\"\n scale={refraction}\n xChannelSelector=\"R\"\n yChannelSelector=\"G\"\n result=\"displaced\"\n />\n <feGaussianBlur in=\"displaced\" stdDeviation=\"0.15\" />\n </filter>\n </svg>\n )}\n </>\n );\n});\n","export type FrostGlassVariant = \"clear\" | \"frosted\" | \"subtle\" | \"liquid\" | \"liquid-refract\";\nexport type FrostGlassVariantProp = { glassVariant?: FrostGlassVariant };\n\nexport const liquidRefractStyles = \"bg-transparent border-0 shadow-none\";\n\nexport const glassVariantStyles: Record<FrostGlassVariant, string> = {\n clear: [\n \"backdrop-blur-[2px] backdrop-saturate-[1.9]\",\n \"bg-white/[0.25] dark:bg-black/[0.25]\",\n \"border border-white/[0.5] dark:border-white/[0.12]\",\n \"shadow-[0_1px_12px_rgba(0,0,0,0.05)] dark:shadow-[0_1px_12px_rgba(0,0,0,0.2)]\",\n ].join(\" \"),\n frosted: [\n \"backdrop-blur-[16px] backdrop-saturate-[1.6]\",\n \"bg-white/[0.55] dark:bg-black/[0.35]\",\n \"border border-white/[0.4] dark:border-white/10\",\n \"shadow-[0_2px_20px_rgba(0,0,0,0.06)] dark:shadow-[0_2px_20px_rgba(0,0,0,0.3)]\",\n ].join(\" \"),\n subtle: [\n \"backdrop-blur-[4px] backdrop-saturate-[1.5]\",\n \"bg-white/[0.3] dark:bg-white/[0.06]\",\n \"border border-black/[0.05] dark:border-white/[0.08]\",\n \"shadow-sm\",\n ].join(\" \"),\n liquid: [\n // 1) Refractive backdrop — lighter than frosted so the background reads\n // clearly through the lens; saturation + brightness lift makes it bloom.\n \"backdrop-blur-[12px] backdrop-saturate-[1.8] backdrop-brightness-[1.05]\",\n \"dark:backdrop-saturate-[1.6] dark:backdrop-brightness-[0.95]\",\n\n // 2) Base translucent fill (acts as the panel's \"tint\").\n \"bg-white/[0.10] dark:bg-white/[0.04]\",\n\n // 3) Layered radial-gradient sheen + warm bottom tint + vertical wash.\n // Underscores represent spaces inside Tailwind arbitrary values.\n \"[background-image:radial-gradient(120%_85%_at_15%_8%,rgba(255,255,255,0.55)_0%,rgba(255,255,255,0.18)_38%,rgba(255,255,255,0)_70%),radial-gradient(110%_80%_at_85%_100%,rgba(255,210,230,0.22)_0%,rgba(255,255,255,0)_60%),linear-gradient(180deg,rgba(255,255,255,0.28)_0%,rgba(255,255,255,0.12)_100%)]\",\n \"dark:[background-image:radial-gradient(120%_85%_at_15%_8%,rgba(255,255,255,0.18)_0%,rgba(255,255,255,0.05)_40%,rgba(255,255,255,0)_70%),radial-gradient(110%_80%_at_85%_100%,rgba(120,170,255,0.12)_0%,rgba(0,0,0,0)_60%),linear-gradient(180deg,rgba(255,255,255,0.06)_0%,rgba(0,0,0,0.18)_100%)]\",\n \"[background-size:200%_200%,180%_180%,100%_100%]\",\n \"[background-repeat:no-repeat]\",\n\n // 4) Multi-layer bevel:\n // - inset top hairline highlight (light-from-above)\n // - inset fish-eye glow at the bottom (lensing artifact)\n // - thin inset side rails\n // - outer contact shadow + broader halo (panel feels floating)\n \"shadow-[inset_0_1px_0_0_rgba(255,255,255,0.65),inset_0_-12px_24px_-10px_rgba(255,255,255,0.45),inset_1px_0_0_0_rgba(255,255,255,0.22),inset_-1px_0_0_0_rgba(255,255,255,0.18),0_24px_60px_-18px_rgba(15,23,42,0.30),0_8px_24px_-8px_rgba(15,23,42,0.18)]\",\n \"dark:shadow-[inset_0_1px_0_0_rgba(255,255,255,0.30),inset_0_-14px_28px_-10px_rgba(180,210,255,0.18),inset_1px_0_0_0_rgba(255,255,255,0.10),inset_-1px_0_0_0_rgba(255,255,255,0.08),0_28px_70px_-18px_rgba(0,0,0,0.55),0_10px_28px_-10px_rgba(0,0,0,0.40)]\",\n\n // 5) Hairline border for the chamfer's outer edge.\n \"border border-white/[0.45] dark:border-white/[0.10]\",\n\n // 6) Slow ambient drift; respects prefers-reduced-motion.\n \"animate-[liquid-drift_18s_ease-in-out_infinite] motion-reduce:animate-none\",\n \"[will-change:background-position]\",\n ].join(\" \"),\n \"liquid-refract\": \"\",\n};\n","\"use client\";\n\nimport { mergeProps } from \"@base-ui/react/merge-props\";\nimport { useRender } from \"@base-ui/react/use-render\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport type * as React from \"react\";\nimport { cn } from \"@/lib/utils\";\nimport { Spinner } from \"@/components/ui/spinner\";\nimport { LiquidGlass } from \"@/components/ui/glasscn/liquid-glass\";\nimport {\n type FrostGlassVariant,\n glassVariantStyles,\n liquidRefractStyles,\n} from \"@/lib/glass-variants\";\n\nexport const buttonVariants = cva(\n \"relative inline-flex shrink-0 cursor-pointer items-center justify-center gap-2 whitespace-nowrap rounded-lg border font-medium text-base outline-none transition-[scale,box-shadow,width,height,background-color,border-color] [transition-duration:150ms,150ms,300ms,300ms,150ms,150ms] ease-smooth-out active:scale-97 data-pressed:scale-97 motion-reduce:transition-none motion-reduce:active:scale-100 motion-reduce:data-pressed:scale-100 [&_svg]:transition-transform [&_svg]:duration-150 [&_svg]:ease-smooth-out motion-reduce:[&_svg]:transition-none before:pointer-events-none before:absolute before:inset-0 before:rounded-[calc(var(--radius-lg)-1px)] pointer-coarse:after:absolute pointer-coarse:after:size-full pointer-coarse:after:min-h-11 pointer-coarse:after:min-w-11 focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-1 focus-visible:ring-offset-background disabled:pointer-events-none disabled:opacity-64 data-loading:select-none sm:text-sm [&_svg:not([class*='opacity-'])]:opacity-80 [&_svg:not([class*='size-'])]:size-4.5 sm:[&_svg:not([class*='size-'])]:size-4 [&_svg]:pointer-events-none [&_svg]:-mx-0.5 [&_svg]:shrink-0\",\n {\n compoundVariants: [\n {\n // `link` is inline text, not a control surface: drop the button box so\n // it sits with the surrounding copy instead of riding high in a 32/36px\n // flex box. Both the bare and `sm:` heights have to be reset —\n // tailwind-merge keeps modifier-prefixed classes in a separate group,\n // so a call-site `h-auto` alone still loses to `sm:h-8`. border-0 makes\n // the inline box exactly one line-height so it doesn't grow the line.\n //\n // align-middle is the alignment that holds: an inline-flex box exposes\n // the baseline of its *first* flex item, which here is the always-\n // mounted loading indicator rather than the label, so plain baseline\n // alignment leaves the text ~3px high. `items-baseline` fixes that but\n // then hangs icons 3px above the label. Centering the box lands within\n // ~1px in every state without touching the loading-morph machinery.\n //\n // Icon sizes are excluded; they keep their square hit area.\n class: \"h-auto border-0 px-0 align-middle sm:h-auto\",\n size: [\"xs\", \"sm\", \"default\", \"lg\", \"xl\"],\n variant: \"link\",\n },\n ],\n defaultVariants: {\n size: \"default\",\n variant: \"default\",\n },\n variants: {\n size: {\n default: \"h-9 px-[calc(--spacing(3)-1px)] sm:h-8\",\n icon: \"size-9 sm:size-8\",\n \"icon-lg\": \"size-10 sm:size-9\",\n \"icon-sm\": \"size-8 sm:size-7\",\n \"icon-xl\":\n \"size-11 sm:size-10 [&_svg:not([class*='size-'])]:size-5 sm:[&_svg:not([class*='size-'])]:size-4.5\",\n \"icon-xs\":\n \"size-7 rounded-md before:rounded-[calc(var(--radius-md)-1px)] sm:size-6 not-in-data-[slot=input-group]:[&_svg:not([class*='size-'])]:size-4 sm:not-in-data-[slot=input-group]:[&_svg:not([class*='size-'])]:size-3.5\",\n lg: \"h-10 px-[calc(--spacing(3.5)-1px)] sm:h-9\",\n sm: \"h-8 gap-1.5 px-[calc(--spacing(2.5)-1px)] sm:h-7\",\n xl: \"h-11 px-[calc(--spacing(4)-1px)] text-lg sm:h-10 sm:text-base [&_svg:not([class*='size-'])]:size-5 sm:[&_svg:not([class*='size-'])]:size-4.5\",\n xs: \"h-7 gap-1 rounded-md px-[calc(--spacing(2)-1px)] text-sm before:rounded-[calc(var(--radius-md)-1px)] sm:h-6 sm:text-xs [&_svg:not([class*='size-'])]:size-4 sm:[&_svg:not([class*='size-'])]:size-3.5\",\n },\n variant: {\n default:\n \"not-disabled:inset-shadow-[0_1px_--theme(--color-white/16%)] border-primary bg-primary text-primary-foreground shadow-primary/24 shadow-xs hover:bg-primary/90 data-pressed:bg-primary/90 *:data-[slot=button-loading-indicator]:text-primary-foreground [:active,[data-pressed]]:inset-shadow-[0_1px_--theme(--color-black/8%)] [:disabled,:active,[data-pressed]]:shadow-none\",\n destructive:\n \"not-disabled:inset-shadow-[0_1px_--theme(--color-white/16%)] border-destructive bg-destructive text-white shadow-destructive/24 shadow-xs hover:bg-destructive/90 data-pressed:bg-destructive/90 *:data-[slot=button-loading-indicator]:text-white [:active,[data-pressed]]:inset-shadow-[0_1px_--theme(--color-black/8%)] [:disabled,:active,[data-pressed]]:shadow-none\",\n \"destructive-outline\":\n \"border-input bg-popover not-dark:bg-clip-padding text-destructive-foreground shadow-xs/5 not-disabled:not-active:not-data-pressed:before:shadow-[0_1px_--theme(--color-black/4%)] hover:border-destructive/32 hover:bg-destructive/4 data-pressed:border-destructive/32 data-pressed:bg-destructive/4 *:data-[slot=button-loading-indicator]:text-foreground dark:bg-input/32 dark:not-disabled:before:shadow-[0_-1px_--theme(--color-white/2%)] dark:not-disabled:not-active:not-data-pressed:before:shadow-[0_-1px_--theme(--color-white/6%)] [:disabled,:active,[data-pressed]]:shadow-none\",\n ghost:\n \"border-transparent text-foreground hover:bg-accent data-pressed:bg-accent *:data-[slot=button-loading-indicator]:text-foreground\",\n // Base for the glass treatment. The finish itself (blur, tint, bevel)\n // comes from glassVariantStyles keyed by the `glassVariant` prop,\n // which is only accepted when variant is \"glass\".\n glass:\n \"border-transparent text-foreground *:data-[slot=button-loading-indicator]:text-foreground\",\n link: \"border-transparent text-foreground underline-offset-4 hover:underline data-pressed:underline *:data-[slot=button-loading-indicator]:text-foreground\",\n outline:\n \"border-input bg-popover not-dark:bg-clip-padding text-foreground shadow-xs/5 not-disabled:not-active:not-data-pressed:before:shadow-[0_1px_--theme(--color-black/4%)] hover:bg-accent/50 data-pressed:bg-accent/50 *:data-[slot=button-loading-indicator]:text-foreground dark:bg-input/32 dark:data-pressed:bg-input/64 dark:hover:bg-input/64 dark:not-disabled:before:shadow-[0_-1px_--theme(--color-white/2%)] dark:not-disabled:not-active:not-data-pressed:before:shadow-[0_-1px_--theme(--color-white/6%)] [:disabled,:active,[data-pressed]]:shadow-none\",\n secondary:\n \"border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/90 data-pressed:bg-secondary/90 *:data-[slot=button-loading-indicator]:text-secondary-foreground [:active,[data-pressed]]:bg-secondary/80\",\n },\n },\n },\n);\n\ntype ButtonVariant = VariantProps<typeof buttonVariants>[\"variant\"];\n\ninterface ButtonBaseProps extends useRender.ComponentProps<\"button\"> {\n size?: VariantProps<typeof buttonVariants>[\"size\"];\n loading?: boolean;\n /**\n * Emit cuelume press/release attributes. Inert unless the app opts into\n * interaction sound by calling `bindSounds()` once.\n */\n sound?: boolean;\n}\n\nexport type ButtonProps = ButtonBaseProps &\n (\n | {\n variant: \"glass\";\n /** Glass finish. Only available when `variant` is \"glass\". */\n glassVariant?: FrostGlassVariant;\n }\n | {\n variant?: Exclude<ButtonVariant, \"glass\">;\n glassVariant?: never;\n }\n );\n\nexport function Button({\n className,\n variant,\n size,\n render,\n children,\n loading = false,\n disabled: disabledProp,\n glassVariant,\n sound = true,\n ...props\n}: ButtonProps): React.ReactElement {\n const isDisabled: boolean = Boolean(loading || disabledProp);\n const typeValue: React.ButtonHTMLAttributes<HTMLButtonElement>[\"type\"] =\n render ? undefined : \"button\";\n\n const resolvedGlassVariant: FrostGlassVariant | undefined =\n variant === \"glass\" ? (glassVariant ?? \"liquid-refract\") : undefined;\n const isLiquidRefract = resolvedGlassVariant === \"liquid-refract\";\n\n // Icon-only sizes overlay the spinner on top of the (hidden) icon; text\n // sizes keep the label visible and show the spinner inline before it.\n const isIconSize = (size ?? \"default\").startsWith(\"icon\");\n\n const defaultProps = {\n children: (\n <>\n {!isIconSize && (\n // Always mounted so the button width morphs as the slot collapses\n // and expands; the closed state cancels the flex gap (which varies\n // per size) with a matching negative margin.\n <span\n aria-hidden={loading ? undefined : true}\n data-slot=\"button-loading-indicator\"\n className={cn(\n \"pointer-events-none inline-flex shrink-0 items-center overflow-hidden transition-[max-width,margin-inline-start,opacity,filter] duration-300 ease-smooth-out motion-reduce:transition-none\",\n loading\n ? \"max-w-6\"\n : cn(\n \"max-w-0 opacity-0 blur-[2px]\",\n size === \"xs\" ? \"-ms-1\" : size === \"sm\" ? \"-ms-1.5\" : \"-ms-2\",\n ),\n )}\n >\n <Spinner className={loading ? undefined : \"animate-none\"} />\n </span>\n )}\n {children}\n {loading && isIconSize && (\n <Spinner\n className=\"pointer-events-none absolute\"\n data-slot=\"button-loading-indicator\"\n />\n )}\n </>\n ),\n className: cn(\n buttonVariants({ size, variant }),\n // Label + icon buttons: icons do a gentle scale bump on hover. The\n // class-based :not() skips the spinner (animate-spin / animate-none).\n !isIconSize &&\n \"hover:[&_svg:not([class*='animate-'])]:scale-110 motion-reduce:hover:[&_svg]:scale-100\",\n loading && isIconSize && \"data-loading:text-transparent\",\n resolvedGlassVariant && glassVariantStyles[resolvedGlassVariant],\n isLiquidRefract && liquidRefractStyles,\n className,\n ),\n \"aria-disabled\": loading || undefined,\n \"data-cuelume-press\": sound ? \"\" : undefined,\n \"data-cuelume-release\": sound ? \"\" : undefined,\n \"data-loading\": loading ? \"\" : undefined,\n \"data-glass-variant\": resolvedGlassVariant,\n \"data-slot\": \"button\",\n disabled: isDisabled,\n type: typeValue,\n };\n\n const element = useRender({\n defaultTagName: \"button\",\n props: mergeProps<\"button\">(defaultProps, props),\n render,\n });\n\n // liquid-refract delegates the finish to the LiquidGlass wrapper, which\n // renders the SVG-displacement backdrop behind an unstyled button.\n if (isLiquidRefract) {\n return <LiquidGlass>{element}</LiquidGlass>;\n }\n\n return element;\n}\n","\"use client\";\n\nimport { mergeProps } from \"@base-ui/react/merge-props\";\nimport { useRender } from \"@base-ui/react/use-render\";\nimport type React from \"react\";\nimport { cn } from \"@/lib/utils\";\n\nexport function Card({\n className,\n render,\n ...props\n}: useRender.ComponentProps<\"div\">): React.ReactElement {\n const defaultProps = {\n className: cn(\n \"relative flex flex-col rounded-2xl border bg-card not-dark:bg-clip-padding text-card-foreground shadow-xs/5 before:pointer-events-none before:absolute before:inset-0 before:rounded-[calc(var(--radius-2xl)-1px)] before:shadow-[0_1px_--theme(--color-black/4%)] dark:before:shadow-[0_-1px_--theme(--color-white/6%)]\",\n className,\n ),\n \"data-slot\": \"card\",\n };\n\n return useRender({\n defaultTagName: \"div\",\n props: mergeProps<\"div\">(defaultProps, props),\n render,\n });\n}\n\nexport function CardFrame({\n className,\n render,\n ...props\n}: useRender.ComponentProps<\"div\">): React.ReactElement {\n const defaultProps = {\n className: cn(\n \"relative flex flex-col rounded-2xl border bg-card not-dark:bg-clip-padding text-card-foreground shadow-xs/5 [--clip-bottom:-1rem] [--clip-top:-1rem] before:pointer-events-none before:absolute before:inset-0 before:rounded-[calc(var(--radius-2xl)-1px)] before:bg-muted/72 before:shadow-[0_1px_--theme(--color-black/4%)] has-data-[slot=table-container]:overflow-hidden *:data-[slot=card]:-m-px *:data-[slot=table-container]:-m-px *:data-[slot=table-container]:w-[calc(100%+2px)] *:not-first:data-[slot=card]:rounded-t-xl *:not-last:data-[slot=card]:rounded-b-xl *:data-[slot=card]:bg-clip-padding *:data-[slot=card]:shadow-none *:data-[slot=card]:before:hidden *:not-first:data-[slot=card]:before:rounded-t-[calc(var(--radius-xl)-1px)] *:not-last:data-[slot=card]:before:rounded-b-[calc(var(--radius-xl)-1px)] dark:before:shadow-[0_-1px_--theme(--color-white/6%)] *:data-[slot=card]:[clip-path:inset(var(--clip-top)_1px_var(--clip-bottom)_1px_round_calc(var(--radius-2xl)-1px))] *:data-[slot=card]:last:[--clip-bottom:1px] *:data-[slot=card]:first:[--clip-top:1px]\",\n className,\n ),\n \"data-slot\": \"card-frame\",\n };\n\n return useRender({\n defaultTagName: \"div\",\n props: mergeProps<\"div\">(defaultProps, props),\n render,\n });\n}\n\nexport function CardFrameHeader({\n className,\n render,\n ...props\n}: useRender.ComponentProps<\"div\">): React.ReactElement {\n const defaultProps = {\n className: cn(\n \"relative flex grid auto-rows-min grid-rows-[auto_auto] flex-col items-start gap-x-4 px-6 py-4 has-data-[slot=card-frame-action]:grid-cols-[1fr_auto]\",\n className,\n ),\n \"data-slot\": \"card-frame-header\",\n };\n\n return useRender({\n defaultTagName: \"div\",\n props: mergeProps<\"div\">(defaultProps, props),\n render,\n });\n}\n\nexport function CardFrameTitle({\n className,\n render,\n ...props\n}: useRender.ComponentProps<\"div\">): React.ReactElement {\n const defaultProps = {\n className: cn(\"self-center font-semibold text-sm\", className),\n \"data-slot\": \"card-frame-title\",\n };\n\n return useRender({\n defaultTagName: \"div\",\n props: mergeProps<\"div\">(defaultProps, props),\n render,\n });\n}\n\nexport function CardFrameDescription({\n className,\n render,\n ...props\n}: useRender.ComponentProps<\"div\">): React.ReactElement {\n const defaultProps = {\n className: cn(\"self-center text-muted-foreground text-sm\", className),\n \"data-slot\": \"card-frame-description\",\n };\n\n return useRender({\n defaultTagName: \"div\",\n props: mergeProps<\"div\">(defaultProps, props),\n render,\n });\n}\n\nexport function CardFrameAction({\n className,\n render,\n ...props\n}: useRender.ComponentProps<\"div\">): React.ReactElement {\n const defaultProps = {\n className: cn(\n \"col-start-2 nth-3:row-span-2 nth-3:row-start-1 inline-flex self-center justify-self-end\",\n className,\n ),\n \"data-slot\": \"card-frame-action\",\n };\n\n return useRender({\n defaultTagName: \"div\",\n props: mergeProps<\"div\">(defaultProps, props),\n render,\n });\n}\n\nexport function CardFrameFooter({\n className,\n render,\n ...props\n}: useRender.ComponentProps<\"div\">): React.ReactElement {\n const defaultProps = {\n className: cn(\"px-6 py-4\", className),\n \"data-slot\": \"card-frame-footer\",\n };\n\n return useRender({\n defaultTagName: \"div\",\n props: mergeProps<\"div\">(defaultProps, props),\n render,\n });\n}\n\nexport function CardHeader({\n className,\n render,\n ...props\n}: useRender.ComponentProps<\"div\">): React.ReactElement {\n const defaultProps = {\n className: cn(\n \"grid auto-rows-min grid-rows-[auto_auto] items-start gap-1.5 p-6 in-[[data-slot=card]:has(>[data-slot=card-panel])]:pb-4 has-data-[slot=card-action]:grid-cols-[1fr_auto]\",\n className,\n ),\n \"data-slot\": \"card-header\",\n };\n\n return useRender({\n defaultTagName: \"div\",\n props: mergeProps<\"div\">(defaultProps, props),\n render,\n });\n}\n\nexport function CardTitle({\n className,\n render,\n ...props\n}: useRender.ComponentProps<\"div\">): React.ReactElement {\n const defaultProps = {\n className: cn(\"font-heading font-semibold text-lg leading-none\", className),\n \"data-slot\": \"card-title\",\n };\n\n return useRender({\n defaultTagName: \"div\",\n props: mergeProps<\"div\">(defaultProps, props),\n render,\n });\n}\n\nexport function CardDescription({\n className,\n render,\n ...props\n}: useRender.ComponentProps<\"div\">): React.ReactElement {\n const defaultProps = {\n className: cn(\"text-muted-foreground text-sm\", className),\n \"data-slot\": \"card-description\",\n };\n\n return useRender({\n defaultTagName: \"div\",\n props: mergeProps<\"div\">(defaultProps, props),\n render,\n });\n}\n\nexport function CardAction({\n className,\n render,\n ...props\n}: useRender.ComponentProps<\"div\">): React.ReactElement {\n const defaultProps = {\n className: cn(\n \"col-start-2 row-span-2 row-start-1 inline-flex self-start justify-self-end\",\n className,\n ),\n \"data-slot\": \"card-action\",\n };\n\n return useRender({\n defaultTagName: \"div\",\n props: mergeProps<\"div\">(defaultProps, props),\n render,\n });\n}\n\nexport function CardPanel({\n className,\n render,\n ...props\n}: useRender.ComponentProps<\"div\">): React.ReactElement {\n const defaultProps = {\n className: cn(\n \"flex-1 p-6 in-[[data-slot=card]:has(>[data-slot=card-header]:not(.border-b))]:pt-0 in-[[data-slot=card]:has(>[data-slot=card-footer]:not(.border-t))]:pb-0\",\n className,\n ),\n \"data-slot\": \"card-panel\",\n };\n\n return useRender({\n defaultTagName: \"div\",\n props: mergeProps<\"div\">(defaultProps, props),\n render,\n });\n}\n\nexport function CardFooter({\n className,\n render,\n ...props\n}: useRender.ComponentProps<\"div\">): React.ReactElement {\n const defaultProps = {\n className: cn(\n \"flex items-center p-6 in-[[data-slot=card]:has(>[data-slot=card-panel])]:pt-4\",\n className,\n ),\n \"data-slot\": \"card-footer\",\n };\n\n return useRender({\n defaultTagName: \"div\",\n props: mergeProps<\"div\">(defaultProps, props),\n render,\n });\n}\n\nexport { CardPanel as CardContent };\n","/**\n * Interaction sound for the library, powered by cuelume (Web Audio synthesis,\n * zero runtime deps, SSR-safe).\n *\n * Components only emit inert `data-cuelume-*` attributes — nothing plays\n * until the consuming app opts in once:\n *\n * import { bindSounds } from \"@corpora/ui\"\n * bindSounds()\n *\n * The app owns preferences via setSoundEnabled / setSoundVolume.\n */\nimport { bind, play } from \"cuelume\";\nimport type { SoundName } from \"cuelume\";\n\nlet bound = false;\n\n/** Opt into interaction sound. Delegated and idempotent (see cuelume bind). */\nexport function bindSounds(root?: ParentNode): void {\n bound = true;\n bind(root);\n}\n\n/**\n * Imperative cue used by library components for keyboard-driven interactions\n * the data attributes can't cover (OTP typing, visibility toggles, …).\n * No-op until the app has opted in via bindSounds().\n */\nexport function playCue(name: SoundName, options?: { volume?: number }): void {\n if (bound) play(name, options);\n}\n\nexport {\n play as playSound,\n setEnabled as setSoundEnabled,\n setVolume as setSoundVolume,\n sounds,\n} from \"cuelume\";\nexport type { SoundName };\n","\"use client\";\n\nimport { Checkbox as CheckboxPrimitive } from \"@base-ui/react/checkbox\";\nimport type React from \"react\";\nimport { playCue } from \"@/lib/sound\";\nimport { cn } from \"@/lib/utils\";\n\nexport function Checkbox({\n className,\n sound = true,\n onCheckedChange,\n ...props\n}: CheckboxPrimitive.Root.Props & {\n /** Play the cuelume toggle cue on check/uncheck. Silent until bindSounds(). */\n sound?: boolean;\n}): React.ReactElement {\n return (\n <CheckboxPrimitive.Root\n // Cued off the state change rather than data-cuelume-toggle: Base UI\n // renders the native input as a *sibling* of this root, so a click on an\n // associated <label> never bubbles through an element carrying the\n // attribute and would toggle silently. This fires once for box clicks,\n // label clicks and keyboard Space alike, and not for programmatic changes.\n onCheckedChange={(checked, eventDetails) => {\n if (sound) playCue(\"toggle\");\n onCheckedChange?.(checked, eventDetails);\n }}\n className={cn(\n \"relative inline-flex size-4.5 shrink-0 cursor-pointer items-center justify-center rounded-[.25rem] border border-input bg-background not-dark:bg-clip-padding shadow-xs/5 outline-none ring-ring transition-shadow before:pointer-events-none before:absolute before:inset-0 before:rounded-[3px] not-data-disabled:not-data-checked:not-aria-invalid:before:shadow-[0_1px_--theme(--color-black/4%)] focus-visible:ring-2 focus-visible:ring-offset-1 focus-visible:ring-offset-background aria-invalid:border-destructive/36 focus-visible:aria-invalid:border-destructive/64 focus-visible:aria-invalid:ring-destructive/48 data-disabled:cursor-not-allowed data-disabled:opacity-64 sm:size-4 dark:not-data-checked:bg-input/32 dark:aria-invalid:ring-destructive/24 dark:not-data-disabled:not-data-checked:not-aria-invalid:before:shadow-[0_-1px_--theme(--color-white/6%)] [[data-disabled],[data-checked],[aria-invalid]]:shadow-none\",\n className,\n )}\n data-slot=\"checkbox\"\n {...props}\n >\n <CheckboxPrimitive.Indicator\n className=\"absolute -inset-px flex items-center justify-center rounded-[.25rem] text-primary-foreground data-unchecked:hidden data-checked:bg-primary data-indeterminate:text-foreground\"\n data-slot=\"checkbox-indicator\"\n render={(\n props: React.ComponentProps<\"span\">,\n state: CheckboxPrimitive.Indicator.State,\n ) => (\n <span {...props}>\n {state.indeterminate ? (\n <svg\n aria-hidden=\"true\"\n className=\"size-3.5 sm:size-3\"\n fill=\"none\"\n height=\"24\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"3\"\n viewBox=\"0 0 24 24\"\n width=\"24\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path d=\"M5.252 12h13.496\" />\n </svg>\n ) : (\n <svg\n aria-hidden=\"true\"\n className=\"size-3.5 sm:size-3\"\n fill=\"none\"\n height=\"24\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"3\"\n viewBox=\"0 0 24 24\"\n width=\"24\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path d=\"M5.252 12.7 10.2 18.63 18.748 5.37\" />\n </svg>\n )}\n </span>\n )}\n />\n </CheckboxPrimitive.Root>\n );\n}\n\nexport { CheckboxPrimitive };\n","\"use client\";\n\nimport { Field as FieldPrimitive } from \"@base-ui/react/field\";\nimport type React from \"react\";\nimport { cn } from \"@/lib/utils\";\n\nexport function Field({\n className,\n ...props\n}: FieldPrimitive.Root.Props): React.ReactElement {\n return (\n <FieldPrimitive.Root\n className={cn(\"flex flex-col items-start gap-2\", className)}\n data-slot=\"field\"\n {...props}\n />\n );\n}\n\nexport function FieldLabel({\n className,\n ...props\n}: FieldPrimitive.Label.Props): React.ReactElement {\n return (\n <FieldPrimitive.Label\n className={cn(\n \"inline-flex cursor-pointer items-center gap-2 font-medium text-base/4 text-foreground data-disabled:cursor-not-allowed data-disabled:opacity-64 sm:text-xs/3.5 ml-3\",\n className,\n )}\n data-slot=\"field-label\"\n {...props}\n />\n );\n}\n\nexport function FieldItem({\n className,\n ...props\n}: FieldPrimitive.Item.Props): React.ReactElement {\n return (\n <FieldPrimitive.Item\n className={cn(\"flex\", className)}\n data-slot=\"field-item\"\n {...props}\n />\n );\n}\n\nexport function FieldDescription({\n className,\n ...props\n}: FieldPrimitive.Description.Props): React.ReactElement {\n return (\n <FieldPrimitive.Description\n // Entrance morph when conditionally shown: height tweens from 0 via\n // interpolate-size (set on :root) plus a fade/blur rise. Removal is\n // unmount-instant; wrap in AnimatePresence when an exit is needed.\n className={cn(\n \"overflow-hidden text-muted-foreground text-xs transition-[height,opacity,filter,translate] duration-300 ease-smooth-out starting:h-0 starting:translate-y-1 starting:opacity-0 starting:blur-[2px] motion-reduce:transition-none\",\n className,\n )}\n data-slot=\"field-description\"\n {...props}\n />\n );\n}\n\nexport function FieldError({\n className,\n ...props\n}: FieldPrimitive.Error.Props): React.ReactElement {\n return (\n <FieldPrimitive.Error\n className={cn(\n \"overflow-hidden text-destructive-foreground text-xs transition-[height,opacity,filter,translate] duration-300 ease-smooth-out starting:h-0 starting:translate-y-1 starting:opacity-0 starting:blur-[2px] motion-reduce:transition-none\",\n className,\n )}\n data-slot=\"field-error\"\n {...props}\n />\n );\n}\n\nexport const FieldControl: typeof FieldPrimitive.Control =\n FieldPrimitive.Control;\nexport const FieldValidity: typeof FieldPrimitive.Validity =\n FieldPrimitive.Validity;\n\nexport { FieldPrimitive };\n","import type * as React from \"react\";\nimport { cn } from \"@/lib/utils\";\n\nexport function Frame({\n className,\n ...props\n}: React.ComponentProps<\"div\">): React.ReactElement {\n return (\n <div\n className={cn(\n \"relative flex flex-col rounded-2xl bg-muted/72 p-1\",\n \"*:[[data-slot=frame-panel]+[data-slot=frame-panel]]:mt-1\",\n className,\n )}\n data-slot=\"frame\"\n {...props}\n />\n );\n}\n\nexport function FramePanel({\n className,\n ...props\n}: React.ComponentProps<\"div\">): React.ReactElement {\n return (\n <div\n className={cn(\n \"relative rounded-xl border bg-background bg-clip-padding p-5 shadow-xs/5 before:pointer-events-none before:absolute before:inset-0 before:rounded-[calc(var(--radius-xl)-1px)] before:shadow-[0_1px_--theme(--color-black/4%)] dark:before:shadow-[0_-1px_--theme(--color-white/6%)]\",\n className,\n )}\n data-slot=\"frame-panel\"\n {...props}\n />\n );\n}\n\nexport function FrameHeader({\n className,\n ...props\n}: React.ComponentProps<\"header\">): React.ReactElement {\n return (\n <header\n className={cn(\"flex flex-col px-5 py-4\", className)}\n data-slot=\"frame-panel-header\"\n {...props}\n />\n );\n}\n\nexport function FrameTitle({\n className,\n ...props\n}: React.ComponentProps<\"div\">): React.ReactElement {\n return (\n <div\n className={cn(\"font-semibold text-sm\", className)}\n data-slot=\"frame-panel-title\"\n {...props}\n />\n );\n}\n\nexport function FrameDescription({\n className,\n ...props\n}: React.ComponentProps<\"div\">): React.ReactElement {\n return (\n <div\n className={cn(\"text-muted-foreground text-sm\", className)}\n data-slot=\"frame-panel-description\"\n {...props}\n />\n );\n}\n\nexport function FrameFooter({\n className,\n ...props\n}: React.ComponentProps<\"footer\">): React.ReactElement {\n return (\n <footer\n className={cn(\"px-5 py-4\", className)}\n data-slot=\"frame-panel-footer\"\n {...props}\n />\n );\n}\n","\"use client\";\n\nimport { Input as InputPrimitive } from \"@base-ui/react/input\";\nimport type * as React from \"react\";\nimport { cn } from \"@/lib/utils\";\n\nexport type InputProps = Omit<\n InputPrimitive.Props & React.RefAttributes<HTMLInputElement>,\n \"size\"\n> & {\n size?: \"sm\" | \"default\" | \"lg\" | number;\n unstyled?: boolean;\n nativeInput?: boolean;\n};\n\nexport function Input({\n className,\n size = \"default\",\n unstyled = false,\n nativeInput = false,\n style,\n ...props\n}: InputProps): React.ReactElement {\n const inputClassName = cn(\n // The 5000000s background-color entry is the autofill-flash suppression\n // hack; height/line-height/padding tween size-prop changes.\n \"h-8.5 w-full min-w-0 rounded-[inherit] px-[calc(--spacing(3)-1px)] leading-8.5 outline-none [transition:background-color_5000000s_ease-in-out_0s,height_300ms_var(--ease-smooth-out),line-height_300ms_var(--ease-smooth-out),padding_300ms_var(--ease-smooth-out),font-size_300ms_var(--ease-smooth-out)] placeholder:text-muted-foreground/72 motion-reduce:[transition:background-color_5000000s_ease-in-out_0s] sm:h-7.5 sm:leading-7.5\",\n size === \"sm\" &&\n \"h-7.5 px-[calc(--spacing(2.5)-1px)] leading-7.5 sm:h-6.5 sm:leading-6.5\",\n size === \"lg\" && \"h-9.5 leading-9.5 sm:h-8.5 sm:leading-8.5\",\n props.type === \"search\" &&\n \"[&::-webkit-search-cancel-button]:appearance-none [&::-webkit-search-decoration]:appearance-none [&::-webkit-search-results-button]:appearance-none [&::-webkit-search-results-decoration]:appearance-none\",\n props.type === \"file\" &&\n \"text-muted-foreground file:me-3 file:bg-transparent file:font-medium file:text-foreground file:text-sm\",\n );\n\n return (\n <span\n className={\n cn(\n !unstyled &&\n \"relative inline-flex w-full rounded-lg border border-input bg-background not-dark:bg-clip-padding text-base text-foreground shadow-xs/5 ring-ring/24 transition-[box-shadow,border-color] duration-150 ease-smooth-out has-aria-invalid:animate-input-shake motion-reduce:animate-none motion-reduce:transition-none before:pointer-events-none before:absolute before:inset-0 before:rounded-[calc(var(--radius-lg)-1px)] not-has-disabled:not-has-focus-visible:not-has-aria-invalid:before:shadow-[0_1px_--theme(--color-black/4%)] has-focus-visible:has-aria-invalid:border-destructive/64 has-focus-visible:has-aria-invalid:ring-destructive/16 has-aria-invalid:border-destructive/36 has-focus-visible:border-ring has-autofill:bg-foreground/4 has-disabled:opacity-64 has-[:disabled,:focus-visible,[aria-invalid]]:shadow-none has-focus-visible:ring-[3px] sm:text-sm dark:bg-input/32 dark:has-autofill:bg-foreground/8 dark:has-aria-invalid:ring-destructive/24 dark:not-has-disabled:not-has-focus-visible:not-has-aria-invalid:before:shadow-[0_-1px_--theme(--color-white/6%)]\",\n className,\n ) || undefined\n }\n data-size={size}\n data-slot=\"input-control\"\n >\n {nativeInput ? (\n <input\n className={inputClassName}\n data-slot=\"input\"\n size={typeof size === \"number\" ? size : undefined}\n style={typeof style === \"function\" ? undefined : style}\n {...props}\n />\n ) : (\n <InputPrimitive\n className={inputClassName}\n data-slot=\"input\"\n size={typeof size === \"number\" ? size : undefined}\n style={style}\n {...props}\n />\n )}\n </span>\n );\n}\n\nexport { InputPrimitive };\n","\"use client\";\n\nimport { Field as FieldPrimitive } from \"@base-ui/react/field\";\nimport { mergeProps } from \"@base-ui/react/merge-props\";\nimport type * as React from \"react\";\nimport { cn } from \"@/lib/utils\";\n\nexport type TextareaProps = React.ComponentPropsWithoutRef<\"textarea\"> &\n React.RefAttributes<HTMLTextAreaElement> & {\n size?: \"sm\" | \"default\" | \"lg\" | number;\n unstyled?: boolean;\n };\n\nexport function Textarea({\n className,\n size = \"default\",\n unstyled = false,\n ref,\n ...props\n}: TextareaProps): React.ReactElement {\n return (\n <span\n className={\n cn(\n !unstyled &&\n \"relative inline-flex w-full rounded-lg border border-input bg-background not-dark:bg-clip-padding text-base text-foreground shadow-xs/5 ring-ring/24 transition-shadow before:pointer-events-none before:absolute before:inset-0 before:rounded-[calc(var(--radius-lg)-1px)] has-focus-visible:has-aria-invalid:border-destructive/64 has-focus-visible:has-aria-invalid:ring-destructive/16 has-aria-invalid:border-destructive/36 has-focus-visible:border-ring has-disabled:opacity-64 has-[:disabled,:focus-visible,[aria-invalid]]:shadow-none has-focus-visible:ring-[3px] not-has-disabled:has-not-focus-visible:not-has-aria-invalid:before:shadow-[0_1px_--theme(--color-black/4%)] sm:text-sm dark:bg-input/32 dark:has-aria-invalid:ring-destructive/24 dark:not-has-disabled:has-not-focus-visible:not-has-aria-invalid:before:shadow-[0_-1px_--theme(--color-white/6%)]\",\n className,\n ) || undefined\n }\n data-size={size}\n data-slot=\"textarea-control\"\n >\n <FieldPrimitive.Control\n ref={ref}\n value={props.value}\n defaultValue={props.defaultValue}\n disabled={props.disabled}\n id={props.id}\n name={props.name}\n render={(defaultProps: React.ComponentProps<\"textarea\">) => (\n <textarea\n className={cn(\n \"field-sizing-content min-h-17.5 w-full rounded-[inherit] px-[calc(--spacing(3)-1px)] py-[calc(--spacing(1.5)-1px)] outline-none max-sm:min-h-20.5\",\n size === \"sm\" &&\n \"min-h-16.5 px-[calc(--spacing(2.5)-1px)] py-[calc(--spacing(1)-1px)] max-sm:min-h-19.5\",\n size === \"lg\" &&\n \"min-h-18.5 py-[calc(--spacing(2)-1px)] max-sm:min-h-21.5\",\n )}\n data-slot=\"textarea\"\n {...mergeProps(defaultProps, props)}\n />\n )}\n />\n </span>\n );\n}\n\nexport { FieldPrimitive };\n","\"use client\";\n\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport type * as React from \"react\";\nimport { cn } from \"@/lib/utils\";\nimport { Input, type InputProps } from \"@/components/ui/input\";\nimport { Textarea, type TextareaProps } from \"@/components/ui/textarea\";\n\nconst inputGroupAddonVariants = cva(\n \"flex h-auto cursor-text select-none items-center justify-center gap-2 leading-none [&>kbd]:rounded-[calc(var(--radius)-5px)] in-[[data-slot=input-group]:has([data-slot=input-control],[data-slot=textarea-control])]:[&_svg:not([class*='size-'])]:size-4.5 sm:in-[[data-slot=input-group]:has([data-slot=input-control],[data-slot=textarea-control])]:[&_svg:not([class*='size-'])]:size-4 [&_svg]:-mx-0.5 not-has-[button]:**:[svg:not([class*='opacity-'])]:opacity-80\",\n {\n defaultVariants: {\n align: \"inline-start\",\n },\n variants: {\n align: {\n \"block-end\":\n \"order-last w-full justify-start px-[calc(--spacing(3)-1px)] pb-[calc(--spacing(3)-1px)] [.border-t]:pt-[calc(--spacing(3)-1px)] [[data-size=sm]+&]:px-[calc(--spacing(2.5)-1px)]\",\n \"block-start\":\n \"order-first w-full justify-start px-[calc(--spacing(3)-1px)] pt-[calc(--spacing(3)-1px)] [.border-b]:pb-[calc(--spacing(3)-1px)] [[data-size=sm]+&]:px-[calc(--spacing(2.5)-1px)]\",\n \"inline-end\":\n \"order-last pe-[calc(--spacing(3)-1px)] has-[>:last-child[data-slot=badge]]:-me-1.5 has-[>button]:-me-2 has-[>kbd:last-child]:me-[-0.35rem] [[data-size=sm]+&]:pe-[calc(--spacing(2.5)-1px)]\",\n \"inline-start\":\n \"order-first ps-[calc(--spacing(3)-1px)] has-[>:last-child[data-slot=badge]]:-ms-1.5 has-[>button]:-ms-2 has-[>kbd:last-child]:ms-[-0.35rem] [[data-size=sm]+&]:ps-[calc(--spacing(2.5)-1px)]\",\n },\n },\n },\n);\n\nexport function InputGroup({\n className,\n ...props\n}: React.ComponentProps<\"div\">): React.ReactElement {\n return (\n <div\n className={cn(\n \"relative inline-flex w-full min-w-0 items-center rounded-lg border border-input bg-background not-dark:bg-clip-padding text-base text-foreground shadow-xs/5 ring-ring/24 transition-shadow before:pointer-events-none before:absolute before:inset-0 before:rounded-[calc(var(--radius-lg)-1px)] not-has-[input:disabled,textarea:disabled]:not-has-[input:focus-visible,textarea:focus-visible]:not-has-[input[aria-invalid],textarea[aria-invalid]]:before:shadow-[0_1px_--theme(--color-black/4%)] has-[input:focus-visible,textarea:focus-visible]:has-[input[aria-invalid],textarea[aria-invalid]]:border-destructive/64 has-[input:focus-visible,textarea:focus-visible]:has-[input[aria-invalid],textarea[aria-invalid]]:ring-destructive/16 has-[textarea]:h-auto has-data-[align=block-end]:h-auto has-data-[align=block-start]:h-auto has-data-[align=block-end]:flex-col has-data-[align=block-start]:flex-col has-[input:focus-visible,textarea:focus-visible]:border-ring has-[input[aria-invalid],textarea[aria-invalid]]:border-destructive/36 has-autofill:bg-foreground/4 has-[input:disabled,textarea:disabled]:opacity-64 has-[input:disabled,textarea:disabled,input:focus-visible,textarea:focus-visible,input[aria-invalid],textarea[aria-invalid]]:shadow-none has-[input:focus-visible,textarea:focus-visible]:ring-[3px] sm:text-sm dark:bg-input/32 dark:has-autofill:bg-foreground/8 dark:has-[input[aria-invalid],textarea[aria-invalid]]:ring-destructive/24 dark:not-has-[input:disabled,textarea:disabled]:not-has-[input:focus-visible,textarea:focus-visible]:not-has-[input[aria-invalid],textarea[aria-invalid]]:before:shadow-[0_-1px_--theme(--color-white/6%)] has-data-[align=inline-start]:**:[[data-size=sm]_input]:ps-1.5 has-data-[align=inline-end]:**:[[data-size=sm]_input]:pe-1.5 *:[[data-slot=input-control],[data-slot=textarea-control]]:contents *:[[data-slot=input-control],[data-slot=textarea-control]]:before:hidden has-[[data-align=block-start],[data-align=block-end]]:**:[input]:h-auto has-data-[align=inline-start]:**:[input]:ps-2 has-data-[align=inline-end]:**:[input]:pe-2 has-data-[align=block-end]:**:[input]:pt-1.5 has-data-[align=block-start]:**:[input]:pb-1.5 **:[textarea]:min-h-20.5 **:[textarea]:resize-none **:[textarea]:py-[calc(--spacing(3)-1px)] **:[textarea]:max-sm:min-h-23.5 **:[textarea_button]:rounded-[calc(var(--radius-md)-1px)]\",\n className,\n )}\n data-slot=\"input-group\"\n role=\"group\"\n {...props}\n />\n );\n}\n\nexport function InputGroupAddon({\n className,\n align = \"inline-start\",\n ...props\n}: React.ComponentProps<\"div\"> &\n VariantProps<typeof inputGroupAddonVariants>): React.ReactElement {\n return (\n <div\n className={cn(inputGroupAddonVariants({ align }), className)}\n data-align={align}\n data-slot=\"input-group-addon\"\n onMouseDown={(e: React.MouseEvent<HTMLDivElement>) => {\n const target = e.target as HTMLElement;\n const isInteractive = target.closest(\n \"button, a, input, select, textarea, [role='button'], [role='combobox'], [role='listbox'], [data-slot='select-trigger']\",\n );\n if (isInteractive) return;\n e.preventDefault();\n const parent = e.currentTarget.parentElement;\n const input = parent?.querySelector<\n HTMLInputElement | HTMLTextAreaElement\n >(\"input, textarea\");\n if (input && !parent?.querySelector(\"input:focus, textarea:focus\")) {\n input.focus();\n }\n }}\n {...props}\n />\n );\n}\n\nexport function InputGroupText({\n className,\n ...props\n}: React.ComponentProps<\"span\">): React.ReactElement {\n return (\n <span\n className={cn(\n \"line-clamp-1 flex items-center gap-2 whitespace-nowrap text-muted-foreground leading-none in-[[data-slot=input-group]:has([data-slot=input-control],[data-slot=textarea-control])]:[&_svg:not([class*='size-'])]:size-4.5 sm:in-[[data-slot=input-group]:has([data-slot=input-control],[data-slot=textarea-control])]:[&_svg:not([class*='size-'])]:size-4 [&_svg]:pointer-events-none [&_svg]:-mx-0.5\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport function InputGroupInput({\n className,\n ...props\n}: InputProps): React.ReactElement {\n return <Input className={className} unstyled {...props} />;\n}\n\nexport function InputGroupTextarea({\n className,\n ...props\n}: TextareaProps): React.ReactElement {\n return <Textarea className={className} unstyled {...props} />;\n}\n","\"use client\";\n\nimport { mergeProps } from \"@base-ui/react/merge-props\";\nimport { useRender } from \"@base-ui/react/use-render\";\nimport type React from \"react\";\nimport { cn } from \"@/lib/utils\";\n\nexport function Label({\n className,\n render,\n sound = false,\n ...props\n}: useRender.ComponentProps<\"label\"> & {\n /**\n * Emit the cuelume hover tick. Opt-in: a label is a click target for its\n * control, and that control already owns the interaction cue (Checkbox\n * plays `toggle` on check/uncheck), so hover-ticking here double-sounds.\n * Inert until the app calls bindSounds().\n */\n sound?: boolean;\n}): React.ReactElement {\n const defaultProps = {\n className: cn(\n \"inline-flex cursor-pointer items-center gap-2 font-medium text-base/4.5 text-foreground sm:text-sm/4\",\n className,\n ),\n \"data-cuelume-hover\": sound ? \"tick\" : undefined,\n \"data-slot\": \"label\",\n };\n\n return useRender({\n defaultTagName: \"label\",\n props: mergeProps<\"label\">(defaultProps, props),\n render,\n });\n}\n","\"use client\";\n\nimport { Menu as MenuPrimitive } from \"@base-ui/react/menu\";\nimport { ChevronRightIcon } from \"lucide-react\";\nimport type * as React from \"react\";\nimport { cn } from \"@/lib/utils\";\n\nexport const MenuCreateHandle: typeof MenuPrimitive.createHandle =\n MenuPrimitive.createHandle;\n\nexport const Menu: typeof MenuPrimitive.Root = MenuPrimitive.Root;\n\nexport const MenuPortal: typeof MenuPrimitive.Portal = MenuPrimitive.Portal;\n\nexport function MenuTrigger({\n className,\n children,\n ...props\n}: MenuPrimitive.Trigger.Props): React.ReactElement {\n return (\n <MenuPrimitive.Trigger\n className={className}\n data-slot=\"menu-trigger\"\n {...props}\n >\n {children}\n </MenuPrimitive.Trigger>\n );\n}\n\nexport function MenuPopup({\n children,\n className,\n sideOffset = 4,\n align = \"center\",\n alignOffset,\n side = \"bottom\",\n anchor,\n portalProps,\n ...props\n}: MenuPrimitive.Popup.Props & {\n align?: MenuPrimitive.Positioner.Props[\"align\"];\n sideOffset?: MenuPrimitive.Positioner.Props[\"sideOffset\"];\n alignOffset?: MenuPrimitive.Positioner.Props[\"alignOffset\"];\n side?: MenuPrimitive.Positioner.Props[\"side\"];\n anchor?: MenuPrimitive.Positioner.Props[\"anchor\"];\n portalProps?: MenuPrimitive.Portal.Props;\n}): React.ReactElement {\n return (\n <MenuPortal {...portalProps}>\n <MenuPrimitive.Positioner\n align={align}\n alignOffset={alignOffset}\n anchor={anchor}\n className=\"z-50\"\n data-slot=\"menu-positioner\"\n side={side}\n sideOffset={sideOffset}\n >\n <MenuPrimitive.Popup\n className={cn(\n \"relative flex not-[class*='w-']:min-w-32 origin-(--transform-origin) rounded-lg border bg-popover not-dark:bg-clip-padding shadow-lg/5 outline-none before:pointer-events-none before:absolute before:inset-0 before:rounded-[calc(var(--radius-lg)-1px)] before:shadow-[0_1px_--theme(--color-black/4%)] focus:outline-none dark:before:shadow-[0_-1px_--theme(--color-white/6%)]\",\n className,\n )}\n data-slot=\"menu-popup\"\n {...props}\n >\n <div className=\"max-h-(--available-height) w-full overflow-y-auto p-1\">\n {children}\n </div>\n </MenuPrimitive.Popup>\n </MenuPrimitive.Positioner>\n </MenuPortal>\n );\n}\n\nexport function MenuGroup(\n props: MenuPrimitive.Group.Props,\n): React.ReactElement {\n return <MenuPrimitive.Group data-slot=\"menu-group\" {...props} />;\n}\n\nexport function MenuItem({\n className,\n inset,\n variant = \"default\",\n ...props\n}: MenuPrimitive.Item.Props & {\n inset?: boolean;\n variant?: \"default\" | \"destructive\";\n}): React.ReactElement {\n return (\n <MenuPrimitive.Item\n className={cn(\n \"flex min-h-8 cursor-default select-none items-center gap-2 rounded-sm px-2 py-1 text-base text-foreground outline-none data-disabled:pointer-events-none data-highlighted:bg-accent data-inset:ps-8 data-[variant=destructive]:text-destructive-foreground data-highlighted:text-accent-foreground data-disabled:opacity-64 sm:min-h-7 sm:text-sm [&>svg:not([class*='opacity-'])]:opacity-80 [&>svg:not([class*='size-'])]:size-4.5 sm:[&>svg:not([class*='size-'])]:size-4 [&>svg]:pointer-events-none [&>svg]:-mx-0.5 [&>svg]:shrink-0\",\n className,\n )}\n data-inset={inset}\n data-slot=\"menu-item\"\n data-variant={variant}\n {...props}\n />\n );\n}\n\nexport function MenuLinkItem({\n className,\n inset,\n variant = \"default\",\n closeOnClick = true,\n ...props\n}: MenuPrimitive.LinkItem.Props & {\n inset?: boolean;\n variant?: \"default\" | \"destructive\";\n}): React.ReactElement {\n return (\n <MenuPrimitive.LinkItem\n className={cn(\n \"flex min-h-8 cursor-default select-none items-center gap-2 rounded-sm px-2 py-1 text-base text-foreground outline-none data-disabled:pointer-events-none data-highlighted:bg-accent data-inset:ps-8 data-[variant=destructive]:text-destructive-foreground data-highlighted:text-accent-foreground data-disabled:opacity-64 sm:min-h-7 sm:text-sm [&>svg:not([class*='opacity-'])]:opacity-80 [&>svg:not([class*='size-'])]:size-4.5 sm:[&>svg:not([class*='size-'])]:size-4 [&>svg]:pointer-events-none [&>svg]:-mx-0.5 [&>svg]:shrink-0\",\n className,\n )}\n closeOnClick={closeOnClick}\n data-inset={inset}\n data-slot=\"menu-link-item\"\n data-variant={variant}\n {...props}\n />\n );\n}\n\nexport function MenuCheckboxItem({\n className,\n children,\n checked,\n variant = \"default\",\n ...props\n}: MenuPrimitive.CheckboxItem.Props & {\n variant?: \"default\" | \"switch\";\n}): React.ReactElement {\n return (\n <MenuPrimitive.CheckboxItem\n checked={checked}\n className={cn(\n \"grid min-h-8 in-data-[side=none]:min-w-[calc(var(--anchor-width)+1.25rem)] cursor-default items-center gap-2 rounded-sm py-1 ps-2 text-base text-foreground outline-none data-disabled:pointer-events-none data-highlighted:bg-accent data-highlighted:text-accent-foreground data-disabled:opacity-64 sm:min-h-7 sm:text-sm [&_svg:not([class*='size-'])]:size-4.5 sm:[&_svg:not([class*='size-'])]:size-4 [&_svg]:pointer-events-none [&_svg]:shrink-0\",\n variant === \"switch\"\n ? \"grid-cols-[1fr_auto] gap-4 pe-1.5\"\n : \"grid-cols-[.75rem_1fr] pe-4\",\n className,\n )}\n data-slot=\"menu-checkbox-item\"\n {...props}\n >\n {variant === \"switch\" ? (\n <>\n <span className=\"col-start-1\">{children}</span>\n <MenuPrimitive.CheckboxItemIndicator\n className=\"inset-shadow-[0_1px_--theme(--color-black/4%)] inline-flex h-[calc(var(--thumb-size)+2px)] w-[calc(var(--thumb-size)*2-2px)] shrink-0 items-center rounded-full p-px outline-none transition-[background-color,box-shadow] duration-200 [--thumb-size:--spacing(4)] focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-1 focus-visible:ring-offset-background data-checked:bg-primary data-unchecked:bg-input data-disabled:opacity-64 sm:[--thumb-size:--spacing(3)]\"\n keepMounted\n >\n <span className=\"pointer-events-none block aspect-square h-full in-[[data-slot=menu-checkbox-item][data-checked]]:origin-[var(--thumb-size)_50%] origin-left in-[[data-slot=menu-checkbox-item][data-checked]]:translate-x-[calc(var(--thumb-size)-4px)] in-[[data-slot=menu-checkbox-item]:active]:not-data-disabled:scale-x-110 in-[[data-slot=menu-checkbox-item]:active]:rounded-[var(--thumb-size)/calc(var(--thumb-size)*1.10)] rounded-(--thumb-size) bg-background shadow-sm/5 will-change-transform [transition:translate_.15s,border-radius_.15s,scale_.1s_.1s,transform-origin_.15s]\" />\n </MenuPrimitive.CheckboxItemIndicator>\n </>\n ) : (\n <>\n <MenuPrimitive.CheckboxItemIndicator className=\"col-start-1 -ms-0.5\">\n <svg\n aria-hidden=\"true\"\n fill=\"none\"\n height=\"24\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"2\"\n viewBox=\"0 0 24 24\"\n width=\"24\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path d=\"M5.252 12.7 10.2 18.63 18.748 5.37\" />\n </svg>\n </MenuPrimitive.CheckboxItemIndicator>\n <span className=\"col-start-2\">{children}</span>\n </>\n )}\n </MenuPrimitive.CheckboxItem>\n );\n}\n\nexport function MenuRadioGroup(\n props: MenuPrimitive.RadioGroup.Props,\n): React.ReactElement {\n return <MenuPrimitive.RadioGroup data-slot=\"menu-radio-group\" {...props} />;\n}\n\nexport function MenuRadioItem({\n className,\n children,\n ...props\n}: MenuPrimitive.RadioItem.Props): React.ReactElement {\n return (\n <MenuPrimitive.RadioItem\n className={cn(\n \"grid min-h-8 in-data-[side=none]:min-w-[calc(var(--anchor-width)+1.25rem)] cursor-default grid-cols-[.75rem_1fr] items-center gap-2 rounded-sm py-1 ps-2 pe-4 text-base text-foreground outline-none data-disabled:pointer-events-none data-highlighted:bg-accent data-highlighted:text-accent-foreground data-disabled:opacity-64 sm:min-h-7 sm:text-sm [&_svg:not([class*='size-'])]:size-4.5 sm:[&_svg:not([class*='size-'])]:size-4 [&_svg]:pointer-events-none [&_svg]:shrink-0\",\n className,\n )}\n data-slot=\"menu-radio-item\"\n {...props}\n >\n <MenuPrimitive.RadioItemIndicator className=\"col-start-1 -ms-0.5\">\n <svg\n aria-hidden=\"true\"\n fill=\"none\"\n height=\"24\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"2\"\n viewBox=\"0 0 24 24\"\n width=\"24\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path d=\"M5.252 12.7 10.2 18.63 18.748 5.37\" />\n </svg>\n </MenuPrimitive.RadioItemIndicator>\n <span className=\"col-start-2\">{children}</span>\n </MenuPrimitive.RadioItem>\n );\n}\n\nexport function MenuGroupLabel({\n className,\n inset,\n ...props\n}: MenuPrimitive.GroupLabel.Props & {\n inset?: boolean;\n}): React.ReactElement {\n return (\n <MenuPrimitive.GroupLabel\n className={cn(\n \"px-2 py-1.5 font-medium text-muted-foreground text-xs data-inset:ps-9 sm:data-inset:ps-8\",\n className,\n )}\n data-inset={inset}\n data-slot=\"menu-label\"\n {...props}\n />\n );\n}\n\nexport function MenuSeparator({\n className,\n ...props\n}: MenuPrimitive.Separator.Props): React.ReactElement {\n return (\n <MenuPrimitive.Separator\n className={cn(\"mx-2 my-1 h-px bg-border\", className)}\n data-slot=\"menu-separator\"\n {...props}\n />\n );\n}\n\nexport function MenuShortcut({\n className,\n ...props\n}: React.ComponentProps<\"kbd\">): React.ReactElement {\n return (\n <kbd\n className={cn(\n \"ms-auto font-medium font-sans text-muted-foreground/72 text-xs tracking-widest\",\n className,\n )}\n data-slot=\"menu-shortcut\"\n {...props}\n />\n );\n}\n\nexport function MenuSub(\n props: MenuPrimitive.SubmenuRoot.Props,\n): React.ReactElement {\n return <MenuPrimitive.SubmenuRoot data-slot=\"menu-sub\" {...props} />;\n}\n\nexport function MenuSubTrigger({\n className,\n inset,\n children,\n ...props\n}: MenuPrimitive.SubmenuTrigger.Props & {\n inset?: boolean;\n}): React.ReactElement {\n return (\n <MenuPrimitive.SubmenuTrigger\n className={cn(\n \"flex min-h-8 items-center gap-2 rounded-sm px-2 py-1 text-base text-foreground outline-none data-disabled:pointer-events-none data-highlighted:bg-accent data-popup-open:bg-accent data-inset:ps-8 data-highlighted:text-accent-foreground data-popup-open:text-accent-foreground data-disabled:opacity-64 sm:min-h-7 sm:text-sm [&>svg:not(:last-child)]:-mx-0.5 [&_svg:not([class*='size-'])]:size-4.5 sm:[&_svg:not([class*='size-'])]:size-4 [&_svg]:pointer-events-none\",\n className,\n )}\n data-inset={inset}\n data-slot=\"menu-sub-trigger\"\n {...props}\n >\n {children}\n <ChevronRightIcon className=\"ms-auto -me-0.5 opacity-80\" />\n </MenuPrimitive.SubmenuTrigger>\n );\n}\n\nexport function MenuSubPopup({\n className,\n sideOffset = 0,\n alignOffset,\n align = \"start\",\n ...props\n}: MenuPrimitive.Popup.Props & {\n align?: MenuPrimitive.Positioner.Props[\"align\"];\n sideOffset?: MenuPrimitive.Positioner.Props[\"sideOffset\"];\n alignOffset?: MenuPrimitive.Positioner.Props[\"alignOffset\"];\n}): React.ReactElement {\n const defaultAlignOffset = align !== \"center\" ? -5 : undefined;\n\n return (\n <MenuPopup\n align={align}\n alignOffset={alignOffset ?? defaultAlignOffset}\n className={className}\n data-slot=\"menu-sub-content\"\n side=\"inline-end\"\n sideOffset={sideOffset}\n {...props}\n />\n );\n}\n\nexport {\n MenuPrimitive,\n MenuCreateHandle as DropdownMenuCreateHandle,\n Menu as DropdownMenu,\n MenuPortal as DropdownMenuPortal,\n MenuTrigger as DropdownMenuTrigger,\n MenuPopup as DropdownMenuContent,\n MenuGroup as DropdownMenuGroup,\n MenuItem as DropdownMenuItem,\n MenuCheckboxItem as DropdownMenuCheckboxItem,\n MenuRadioGroup as DropdownMenuRadioGroup,\n MenuRadioItem as DropdownMenuRadioItem,\n MenuGroupLabel as DropdownMenuLabel,\n MenuSeparator as DropdownMenuSeparator,\n MenuShortcut as DropdownMenuShortcut,\n MenuSub as DropdownMenuSub,\n MenuSubTrigger as DropdownMenuSubTrigger,\n MenuSubPopup as DropdownMenuSubContent,\n};\n","import { Separator as SeparatorPrimitive } from \"@base-ui/react/separator\";\nimport type React from \"react\";\nimport { cn } from \"@/lib/utils\";\n\nexport function Separator({\n className,\n orientation = \"horizontal\",\n ...props\n}: SeparatorPrimitive.Props): React.ReactElement {\n return (\n <SeparatorPrimitive\n className={cn(\n \"shrink-0 bg-border data-[orientation=horizontal]:h-px data-[orientation=horizontal]:w-full data-[orientation=vertical]:w-px data-[orientation=vertical]:not-[[class^='h-']]:not-[[class*='_h-']]:self-stretch\",\n className,\n )}\n data-slot=\"separator\"\n orientation={orientation}\n {...props}\n />\n );\n}\n\nexport { SeparatorPrimitive };\n","\"use client\";\n\nimport { OTPField as OTPFieldPrimitive } from \"@base-ui/react/otp-field\";\nimport * as React from \"react\";\nimport { cn } from \"@/lib/utils\";\nimport { playCue } from \"@/lib/sound\";\nimport { Separator } from \"@/components/ui/separator\";\n\nexport function OTPField({\n className,\n size = \"default\",\n sound = true,\n onValueChange,\n ...props\n}: React.ComponentProps<typeof OTPFieldPrimitive.Root> & {\n size?: \"default\" | \"lg\";\n /** Play a tick cue per entered character. Inert until bindSounds(). */\n sound?: boolean;\n}): React.ReactElement {\n // Typing is keyboard-driven, so the cue is imperative (playCue is gated on\n // the app having called bindSounds). Tick only when characters are added.\n const lastLength = React.useRef(\n String(props.value ?? props.defaultValue ?? \"\").length,\n );\n\n const handleValueChange: NonNullable<typeof onValueChange> = (\n value,\n ...rest\n ) => {\n if (sound && value.length > lastLength.current) {\n playCue(\"tick\");\n }\n lastLength.current = value.length;\n onValueChange?.(value, ...rest);\n };\n\n return (\n <OTPFieldPrimitive.Root\n className={cn(\n \"flex items-center gap-2 has-disabled:opacity-64 has-disabled:**:data-[slot=otp-field-input]:shadow-none has-disabled:**:data-[slot=otp-field-input]:before:shadow-none!\",\n className,\n )}\n data-size={size}\n data-slot=\"otp-field\"\n onValueChange={handleValueChange}\n {...props}\n />\n );\n}\n\nexport function OTPFieldInput({\n className,\n ...props\n}: React.ComponentProps<typeof OTPFieldPrimitive.Input>): React.ReactElement {\n return (\n <OTPFieldPrimitive.Input\n className={cn(\n \"relative in-[[data-slot=otp-field][data-size=lg]]:size-10 size-9 min-w-0 rounded-lg border border-input bg-background not-dark:bg-clip-padding text-center in-[[data-slot=otp-field][data-size=lg]]:text-lg text-base text-foreground in-[[data-slot=otp-field][data-size=lg]]:leading-10 leading-9 shadow-xs/5 outline-none ring-ring/24 transition-shadow before:pointer-events-none before:absolute before:inset-0 before:rounded-[calc(var(--radius-lg)-1px)] not-focus-visible:not-aria-invalid:before:shadow-[0_1px_--theme(--color-black/4%)] focus-visible:z-10 focus-visible:border-ring focus-visible:shadow-none focus-visible:ring-[3px] focus-visible:ring-ring/24 aria-invalid:border-destructive/36 aria-invalid:shadow-none aria-invalid:focus-visible:border-destructive/64 aria-invalid:focus-visible:ring-destructive/16 sm:in-[[data-slot=otp-field][data-size=lg]]:size-9 sm:size-8 sm:in-[[data-slot=otp-field][data-size=lg]]:text-base sm:text-sm sm:in-[[data-slot=otp-field][data-size=lg]]:leading-9 sm:leading-8 dark:bg-input/32 dark:aria-invalid:focus-visible:ring-destructive/24 dark:not-focus-visible:not-aria-invalid:before:shadow-[0_-1px_--theme(--color-white/6%)]\",\n className,\n )}\n data-slot=\"otp-field-input\"\n spellCheck={false}\n {...props}\n />\n );\n}\n\nexport function OTPFieldSeparator({\n className,\n ...props\n}: React.ComponentProps<typeof Separator>): React.ReactElement {\n return (\n <OTPFieldPrimitive.Separator\n render={\n <Separator\n className={cn(\n \"rounded-full bg-input data-[orientation=horizontal]:h-0.5 data-[orientation=horizontal]:w-3\",\n className,\n )}\n orientation=\"horizontal\"\n {...props}\n />\n }\n />\n );\n}\n\nexport { OTPFieldPrimitive };\n","import type React from \"react\";\nimport { cn } from \"@/lib/utils\";\n\nexport function Skeleton({\n className,\n ...props\n}: React.ComponentProps<\"div\">): React.ReactElement {\n return (\n <div\n className={cn(\n \"animate-skeleton rounded-sm [--skeleton-highlight:--alpha(var(--color-white)/64%)] [background:linear-gradient(120deg,transparent_40%,var(--skeleton-highlight),transparent_60%)_var(--color-muted)_0_0/200%_100%_fixed] dark:[--skeleton-highlight:--alpha(var(--color-white)/4%)]\",\n className,\n )}\n data-slot=\"skeleton\"\n {...props}\n />\n );\n}\n","\"use client\";\n\nimport { CheckIcon, EyeIcon, EyeOffIcon, XIcon } from \"lucide-react\";\nimport { AnimatePresence, motion } from \"motion/react\";\nimport * as React from \"react\";\n\nimport { Button } from \"@/components/ui/button\";\nimport {\n InputGroup,\n InputGroupAddon,\n InputGroupInput,\n} from \"@/components/ui/input-group\";\nimport { playCue } from \"@/lib/sound\";\nimport { cn } from \"@/lib/utils\";\n\n// transitions.dev motion scale\nconst EASE = [0.22, 1, 0.36, 1] as const;\n\nexport const passwordRequirements = [\n { regex: /.{8,}/, text: \"At least 8 characters\" },\n { regex: /[0-9]/, text: \"At least 1 number\" },\n { regex: /[a-z]/, text: \"At least 1 lowercase letter\" },\n { regex: /[A-Z]/, text: \"At least 1 uppercase letter\" },\n] as const;\n\nexport function getPasswordStrength(password: string): number {\n return passwordRequirements.filter((req) => req.regex.test(password)).length;\n}\n\nconst STRENGTH_COLORS = [\n \"bg-border\",\n \"bg-red-500\",\n \"bg-orange-500\",\n \"bg-amber-500\",\n \"bg-emerald-500\",\n] as const;\n\nexport interface PasswordInputProps\n extends Omit<React.ComponentProps<typeof InputGroupInput>, \"type\" | \"size\"> {\n /** Render the eye toggle button. */\n visibilityToggle?: boolean;\n /** Render the animated strength meter and requirement checklist. */\n showStrength?: boolean;\n /** Play reveal/hide cues on the visibility toggle. Inert until bindSounds(). */\n sound?: boolean;\n}\n\n/**\n * Password field with visibility toggle and optional strength meter.\n * Composition of InputGroup + Button (coss particles p-input-9 and\n * p-input-group-26).\n */\nexport function PasswordInput({\n visibilityToggle = true,\n showStrength = false,\n sound = true,\n className,\n value: valueProp,\n defaultValue,\n onChange,\n ...props\n}: PasswordInputProps) {\n const [visible, setVisible] = React.useState(false);\n const [uncontrolled, setUncontrolled] = React.useState(\n String(defaultValue ?? \"\"),\n );\n const value = valueProp !== undefined ? String(valueProp) : uncontrolled;\n const score = getPasswordStrength(value);\n\n return (\n <div className={cn(\"flex w-full flex-col gap-3\", className)}>\n <InputGroup>\n <InputGroupInput\n placeholder=\"Enter your password\"\n {...props}\n type={visible ? \"text\" : \"password\"}\n value={value}\n onChange={(event) => {\n setUncontrolled(event.target.value);\n onChange?.(event);\n }}\n />\n {visibilityToggle && (\n <InputGroupAddon align=\"inline-end\">\n <Button\n aria-label={visible ? \"Hide password\" : \"Show password\"}\n onClick={() => {\n // Semantic cues from the cuelume palette: bloom = reveal,\n // droplet = dismiss. Press/release stays off to avoid layering.\n if (sound) playCue(visible ? \"droplet\" : \"bloom\");\n setVisible((v) => !v);\n }}\n size=\"icon-xs\"\n variant=\"ghost\"\n sound={false}\n >\n <AnimatePresence mode=\"wait\" initial={false}>\n <motion.span\n key={visible ? \"off\" : \"on\"}\n className=\"inline-flex\"\n initial={{ opacity: 0, scale: 0.8, filter: \"blur(2px)\" }}\n animate={{ opacity: 1, scale: 1, filter: \"blur(0px)\" }}\n exit={{ opacity: 0, scale: 0.8, filter: \"blur(2px)\" }}\n transition={{ duration: 0.15, ease: EASE }}\n >\n {visible ? (\n <EyeOffIcon aria-hidden=\"true\" />\n ) : (\n <EyeIcon aria-hidden=\"true\" />\n )}\n </motion.span>\n </AnimatePresence>\n </Button>\n </InputGroupAddon>\n )}\n </InputGroup>\n\n <AnimatePresence initial={false}>\n {showStrength && (\n <motion.div\n className=\"flex flex-col gap-2 overflow-hidden\"\n initial={{ height: 0, opacity: 0 }}\n animate={{ height: \"auto\", opacity: 1 }}\n exit={{ height: 0, opacity: 0 }}\n transition={{ duration: 0.25, ease: EASE }}\n >\n <div\n aria-label=\"Password strength\"\n aria-valuemax={4}\n aria-valuemin={0}\n aria-valuenow={score}\n className=\"h-1 w-full overflow-hidden rounded-full bg-border\"\n role=\"progressbar\"\n >\n <motion.div\n className={cn(\"h-full rounded-full\", STRENGTH_COLORS[score])}\n animate={{ width: `${(score / 4) * 100}%` }}\n transition={{ duration: 0.4, ease: EASE }}\n />\n </div>\n <ul\n aria-label=\"Password requirements\"\n className=\"flex flex-col gap-1\"\n >\n {passwordRequirements.map((req) => {\n const met = req.regex.test(value);\n return (\n <li className=\"flex items-center gap-2 text-xs\" key={req.text}>\n {met ? (\n <CheckIcon\n aria-hidden=\"true\"\n className=\"size-3.5 text-emerald-500\"\n />\n ) : (\n <XIcon\n aria-hidden=\"true\"\n className=\"size-3.5 text-muted-foreground/80\"\n />\n )}\n <span\n className={\n met ? \"text-emerald-600\" : \"text-muted-foreground\"\n }\n >\n {req.text}\n <span className=\"sr-only\">\n {met ? \" - met\" : \" - not met\"}\n </span>\n </span>\n </li>\n );\n })}\n </ul>\n </motion.div>\n )}\n </AnimatePresence>\n </div>\n );\n}\n","\"use client\"\n\nimport {\n RiAppleFill,\n RiGithubFill,\n RiGoogleFill,\n RiTwitterXFill,\n} from \"@remixicon/react\"\nimport type * as React from \"react\"\n\nimport { Button } from \"@/components/ui/button\"\nimport { cn } from \"@/lib/utils\"\n\nexport type SocialProvider = \"google\" | \"apple\" | \"github\" | \"x\"\n\n/** Google's four-color \"G\" — the only provider whose mark isn't monochrome. */\nfunction GoogleColorIcon(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg viewBox=\"0 0 24 24\" fill=\"none\" {...props}>\n <path\n fill=\"#4285F4\"\n d=\"M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92a5.06 5.06 0 0 1-2.2 3.32v2.76h3.56c2.09-1.92 3.28-4.74 3.28-8.09Z\"\n />\n <path\n fill=\"#34A853\"\n d=\"M12 23c2.97 0 5.46-.98 7.28-2.66l-3.56-2.76c-.99.66-2.25 1.05-3.72 1.05-2.86 0-5.28-1.93-6.15-4.53H2.18v2.85A11 11 0 0 0 12 23Z\"\n />\n <path\n fill=\"#FBBC05\"\n d=\"M5.85 14.1A6.6 6.6 0 0 1 5.5 12c0-.73.13-1.44.35-2.1V7.05H2.18a11 11 0 0 0 0 9.9l3.67-2.85Z\"\n />\n <path\n fill=\"#EA4335\"\n d=\"M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15A11 11 0 0 0 2.18 7.05L5.85 9.9C6.72 7.3 9.14 5.38 12 5.38Z\"\n />\n </svg>\n )\n}\n\n/**\n * Label + brand mark per provider, shared with the auth blocks. `Icon` is the\n * monochrome mark that inherits the current text color; `BrandIcon` +\n * `brandClassName` render it in the provider's own colors.\n */\nexport const SOCIAL_PROVIDERS: Record<\n SocialProvider,\n {\n label: string\n Icon: React.ComponentType<{ className?: string }>\n BrandIcon: React.ComponentType<{ className?: string }>\n brandClassName: string\n }\n> = {\n google: {\n label: \"Google\",\n Icon: RiGoogleFill,\n BrandIcon: GoogleColorIcon,\n brandClassName: \"\",\n },\n apple: {\n label: \"Apple\",\n Icon: RiAppleFill,\n BrandIcon: RiAppleFill,\n brandClassName: \"text-foreground\",\n },\n github: {\n label: \"GitHub\",\n Icon: RiGithubFill,\n BrandIcon: RiGithubFill,\n brandClassName: \"text-foreground\",\n },\n x: {\n label: \"X\",\n Icon: RiTwitterXFill,\n BrandIcon: RiTwitterXFill,\n brandClassName: \"text-foreground\",\n },\n}\n\nconst ACTION_LABELS = {\n login: \"Login with\",\n signup: \"Sign up with\",\n continue: \"Continue with\",\n} as const\n\nexport interface SocialProvidersProps {\n providers?: SocialProvider[]\n /** Verb used in the stacked layout labels. */\n action?: keyof typeof ACTION_LABELS\n /** \"stack\" = full-width labeled buttons; \"row\" = icon-only buttons. */\n layout?: \"stack\" | \"row\"\n /** Shows the matching button in its loading state and disables the rest. */\n loadingProvider?: SocialProvider | null\n disabled?: boolean\n onSelect?: (provider: SocialProvider) => void\n className?: string\n}\n\n/** Social auth buttons (coss particle p-button-38). UI only — wire onSelect. */\nexport function SocialProviders({\n providers = [\"google\", \"apple\", \"github\"],\n action = \"continue\",\n layout = \"stack\",\n loadingProvider = null,\n disabled = false,\n onSelect,\n className,\n}: SocialProvidersProps) {\n const row = layout === \"row\"\n\n return (\n <div\n className={cn(\n \"flex w-full gap-2\",\n row ? \"flex-row justify-center\" : \"flex-col\",\n className\n )}\n >\n {providers.map((provider) => {\n const { label, Icon } = SOCIAL_PROVIDERS[provider]\n return (\n <Button\n key={provider}\n variant=\"outline\"\n size={row ? \"icon\" : \"default\"}\n className={row ? undefined : \"w-full\"}\n aria-label={`${ACTION_LABELS[action]} ${label}`}\n loading={loadingProvider === provider}\n disabled={\n disabled ||\n (loadingProvider !== null && loadingProvider !== provider)\n }\n onClick={() => onSelect?.(provider)}\n >\n <Icon aria-hidden=\"true\" />\n {!row && (\n <span className=\"flex-1\">\n {ACTION_LABELS[action]} {label}\n </span>\n )}\n </Button>\n )\n })}\n </div>\n )\n}\n","\"use client\"\n\nimport * as React from \"react\"\n\nimport {\n Avatar,\n AvatarFallback,\n AvatarImage,\n type AvatarPrimitive,\n} from \"@/components/ui/avatar\"\nimport { Skeleton } from \"@/components/ui/skeleton\"\nimport { cn } from \"@/lib/utils\"\n\ntype ImageStatus = Parameters<\n NonNullable<AvatarPrimitive.Image.Props[\"onLoadingStatusChange\"]>\n>[0]\n\nexport interface UserAvatarProps extends Omit<\n AvatarPrimitive.Root.Props,\n \"children\"\n> {\n /** Image URL. Without one the initials show immediately — no skeleton. */\n src?: string\n /** Drives the initials, and the alt text unless `alt` overrides it. */\n name?: string\n /** Overrides the initials derived from `name`. */\n initials?: string\n /**\n * Alt text for the image. Pass \"\" when adjacent text already names the\n * person — the image is then decorative.\n */\n alt?: string\n /**\n * Force the skeleton, for when the identity itself is still being fetched.\n * Omitted, it follows the image: a passed `src` skeletons until it resolves.\n */\n loading?: boolean\n}\n\n/** \"Jenny Hamilton\" → \"JH\", \"luna\" → \"L\". */\nexport function initialsFrom(name: string): string {\n const parts = name.trim().split(/\\s+/).filter(Boolean)\n if (parts.length === 0) return \"\"\n const first = parts[0]?.[0] ?? \"\"\n const last = parts.length > 1 ? (parts.at(-1)?.[0] ?? \"\") : \"\"\n return (first + last).toUpperCase()\n}\n\n/**\n * Identity avatar: an image when one is given, initials otherwise.\n *\n * A passed `src` is assumed to be remote, so the slot holds a skeleton until\n * the image resolves rather than flashing initials that are about to be\n * replaced. A failed load settles on the initials.\n */\nexport function UserAvatar({\n src,\n name = \"\",\n initials,\n alt,\n loading: loadingProp,\n className,\n ...props\n}: UserAvatarProps): React.ReactElement {\n const [status, setStatus] = React.useState<ImageStatus>(\"idle\")\n const loading =\n loadingProp ??\n (src !== undefined && (status === \"idle\" || status === \"loading\"))\n\n return (\n <Avatar\n className={cn(\"size-8\", className)}\n data-loading={loading || undefined}\n data-slot=\"user-avatar\"\n {...props}\n >\n {/* Held back while forced-loading: a loaded image would hide the\n fallback the skeleton lives in. */}\n {src === undefined || loadingProp === true ? null : (\n <AvatarImage\n alt={alt ?? name}\n onLoadingStatusChange={setStatus}\n src={src}\n />\n )}\n <AvatarFallback>\n {loading ? (\n <Skeleton\n className=\"size-full rounded-full\"\n data-slot=\"avatar-skeleton\"\n />\n ) : (\n (initials ?? initialsFrom(name))\n )}\n </AvatarFallback>\n </Avatar>\n )\n}\n","/**\n * Brand accents for the auth blocks.\n *\n * An accent is a set of custom properties set on the AuthCard root plus one\n * class string applied to the card's primary action. Splitting it this way\n * keeps the accent inheritable — anything else inside the card can opt into\n * `var(--auth-accent)` without the shell knowing about it.\n */\n\n/** Brand accents available to the auth blocks. */\nexport type AuthAccent = \"corpora\" | \"exegia\";\n\n/**\n * Custom properties an accent contributes, set on the AuthCard root.\n *\n * The gradient lives in `--auth-accent-image` because `background-color` can't\n * hold one; `--auth-accent` sits underneath as the solid that paints wherever\n * the image is `none`. Foregrounds are fixed rather than themed — the accent\n * itself is a constant, so its contrast pair has to be too (white on the\n * corpora yellow fails badly).\n */\nexport const authAccentVars: Record<AuthAccent, Record<string, string>> = {\n corpora: {\n \"--auth-accent\": \"#E8B124\",\n \"--auth-accent-image\": \"none\",\n \"--auth-accent-foreground\": \"oklch(0.145 0 0)\",\n },\n exegia: {\n \"--auth-accent\": \"#3B0080\",\n \"--auth-accent-image\":\n \"linear-gradient(44deg in oklab, rgba(29,0,202,0.66) 3%, #3B0080 37%, rgba(36,0,72,0.86) 98%)\",\n \"--auth-accent-foreground\": \"oklch(0.985 0 0)\",\n },\n};\n\n/**\n * Applied to the primary action inside an accented AuthCard, after the button\n * cva output so tailwind-merge lets it win over `bg-primary`. The hover and\n * pressed background entries are required: `hover:bg-primary/90` lives in a\n * different modifier group from `bg-*` and would otherwise survive and repaint\n * the button on hover.\n *\n * Hover uses `brightness` rather than a background tween because the button's\n * `transition-property` list is shared with its press/size animations — adding\n * `filter` to it means restating the whole list and its per-property\n * durations. The trade is an instant hover change instead of a 150ms one.\n */\nexport const authAccentActionStyles =\n \"border-transparent bg-[var(--auth-accent)] bg-[image:var(--auth-accent-image)] text-[var(--auth-accent-foreground)] shadow-none hover:bg-[var(--auth-accent)] hover:brightness-110 data-pressed:bg-[var(--auth-accent)] data-pressed:brightness-110 *:data-[slot=button-loading-indicator]:text-[var(--auth-accent-foreground)]\";\n","\"use client\";\n\nimport { AnimatePresence, MotionConfig, motion } from \"motion/react\";\nimport * as React from \"react\";\n\nimport {\n Card,\n CardDescription,\n CardHeader,\n CardPanel,\n CardTitle,\n} from \"@/components/ui/card\";\nimport { Frame, FrameFooter } from \"@/components/ui/frame\";\nimport { Separator } from \"@/components/ui/separator\";\nimport { type AuthAccent, authAccentVars } from \"@/lib/auth-accent\";\nimport { cn } from \"@/lib/utils\";\n\n/** transitions.dev motion scale, shared by all auth blocks. */\nexport const EASE = [0.22, 1, 0.36, 1] as const;\n\nexport type AuthStatus = \"idle\" | \"loading\" | \"success\" | \"error\";\n\n/**\n * Frame shell shared by the auth blocks (coss particle p-card-8): a raised\n * Card inside a muted Frame, with the footer in the frame strip below the\n * card. Wraps content in a MotionConfig that honors prefers-reduced-motion\n * and layout-animates height changes so step swaps morph instead of jumping.\n */\nexport function AuthCard({\n title,\n description,\n children,\n footer,\n className,\n logo,\n accent,\n}: {\n title: React.ReactNode;\n description?: React.ReactNode;\n children: React.ReactNode;\n footer?: React.ReactNode;\n className?: string;\n /** Brand mark rendered above the title. Omit for no logo row at all. */\n logo?: React.ReactNode;\n /** Brand accent for the card's primary action. Omit to keep `bg-primary`. */\n accent?: AuthAccent;\n}) {\n return (\n <MotionConfig reducedMotion=\"user\">\n <Frame\n className={cn(\"w-full max-w-sm\", className)}\n data-accent={accent}\n style={\n accent ? (authAccentVars[accent] as React.CSSProperties) : undefined\n }\n >\n <motion.div\n layout\n transition={{ duration: 0.3, ease: EASE }}\n className=\"flex flex-col\"\n >\n <Card>\n <CardHeader>\n {logo && (\n // Sized like the button's icon rule: a bare img/svg gets a\n // default height, an explicitly sized one keeps its own.\n <div\n className=\"mb-1.5 flex items-center [&_img:not([class*='h-'])]:h-8 [&_img]:w-auto [&_svg:not([class*='size-'])]:size-8\"\n data-slot=\"auth-logo\"\n >\n {logo}\n </div>\n )}\n <CardTitle>{title}</CardTitle>\n {description && <CardDescription>{description}</CardDescription>}\n </CardHeader>\n <CardPanel className=\"overflow-hidden\">{children}</CardPanel>\n </Card>\n {footer && (\n <FrameFooter className=\"text-center text-sm text-muted-foreground\">\n {footer}\n </FrameFooter>\n )}\n </motion.div>\n </Frame>\n </MotionConfig>\n );\n}\n\n/** Cross-morphs between steps (form → success, …) keyed by `step`. */\nexport function MorphStep({\n step,\n children,\n className,\n}: {\n step: string;\n children: React.ReactNode;\n className?: string;\n}) {\n return (\n <AnimatePresence mode=\"popLayout\" initial={false}>\n <motion.div\n key={step}\n className={className}\n initial={{ opacity: 0, y: 8, filter: \"blur(2px)\" }}\n animate={{ opacity: 1, y: 0, filter: \"blur(0px)\" }}\n exit={{ opacity: 0, y: -8, filter: \"blur(2px)\" }}\n transition={{ duration: 0.25, ease: EASE }}\n >\n {children}\n </motion.div>\n </AnimatePresence>\n );\n}\n\n/**\n * Progressive-disclosure wrapper: collapses/expands a step as `show` flips.\n *\n * `overflow-hidden` is only worn while the height is in flight — leaving it on\n * would clip the focus ring of any full-width control inside (the ring sits\n * 3px outside the input's border box, so the left/right edges would be cut).\n */\nexport function Reveal({\n show,\n children,\n className,\n}: {\n show: boolean;\n children: React.ReactNode;\n className?: string;\n}) {\n // Reset during render (not in an effect) when `show` flips, matching\n // useCountdown below.\n const [state, setState] = React.useState({ show, settled: show });\n if (state.show !== show) setState({ show, settled: false });\n\n return (\n <AnimatePresence initial={false}>\n {show && (\n <motion.div\n className={cn(!state.settled && \"overflow-hidden\", className)}\n initial={{ height: 0, opacity: 0, y: -4, filter: \"blur(2px)\" }}\n animate={{ height: \"auto\", opacity: 1, y: 0, filter: \"blur(0px)\" }}\n exit={{ height: 0, opacity: 0, y: -4, filter: \"blur(2px)\" }}\n transition={{ duration: 0.25, ease: EASE }}\n onAnimationComplete={() =>\n setState((current) => ({ ...current, settled: true }))\n }\n >\n {children}\n </motion.div>\n )}\n </AnimatePresence>\n );\n}\n\n/** Inline error message that shakes each time `message` changes. */\nexport function AuthError({ message }: { message: string | null }) {\n return (\n <AnimatePresence initial={false}>\n {message && (\n <motion.p\n key={message}\n role=\"alert\"\n className=\"text-sm text-destructive-foreground\"\n initial={{ opacity: 0, height: 0 }}\n animate={{\n opacity: 1,\n height: \"auto\",\n x: [0, -6, 6, -4, 4, 0],\n }}\n exit={{ opacity: 0, height: 0 }}\n transition={{\n duration: 0.25,\n ease: EASE,\n x: { duration: 0.4, ease: \"easeInOut\" },\n }}\n >\n {message}\n </motion.p>\n )}\n </AnimatePresence>\n );\n}\n\n/** Success panel with a stroke-drawn check. */\nexport function AuthSuccess({\n title,\n description,\n children,\n}: {\n title: React.ReactNode;\n description?: React.ReactNode;\n children?: React.ReactNode;\n}) {\n return (\n <div className=\"flex flex-col items-center gap-3 py-4 text-center\">\n <motion.span\n className=\"flex size-12 items-center justify-center rounded-full bg-emerald-500/12 text-emerald-600\"\n initial={{ scale: 0.6, opacity: 0 }}\n animate={{ scale: 1, opacity: 1 }}\n transition={{ duration: 0.4, ease: EASE }}\n >\n <svg\n aria-hidden=\"true\"\n viewBox=\"0 0 24 24\"\n className=\"size-6\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <motion.path\n d=\"M4 12.5l5 5L20 6.5\"\n initial={{ pathLength: 0 }}\n animate={{ pathLength: 1 }}\n transition={{ duration: 0.4, delay: 0.15, ease: EASE }}\n />\n </svg>\n </motion.span>\n <div className=\"flex flex-col gap-1\">\n <p className=\"font-medium\">{title}</p>\n {description && (\n <p className=\"text-sm text-muted-foreground\">{description}</p>\n )}\n </div>\n {children}\n </div>\n );\n}\n\n/** \"Or continue with\" style divider. */\nexport function AuthSeparator({ label = \"Or\" }: { label?: string }) {\n return (\n <div className=\"flex items-center gap-3\">\n <Separator className=\"flex-1\" />\n <span className=\"text-xs text-muted-foreground uppercase\">{label}</span>\n <Separator className=\"flex-1\" />\n </div>\n );\n}\n\n/** Countdown for resend links; restarts when `restartKey` changes. */\nexport function useCountdown(seconds: number, restartKey: number) {\n const [state, setState] = React.useState({ restartKey, seconds, remaining: seconds });\n\n // Reset during render (not in an effect) when the inputs change.\n if (state.restartKey !== restartKey || state.seconds !== seconds) {\n setState({ restartKey, seconds, remaining: seconds });\n }\n\n React.useEffect(() => {\n if (seconds <= 0) return;\n const interval = window.setInterval(() => {\n setState((current) =>\n current.remaining <= 0\n ? current\n : { ...current, remaining: current.remaining - 1 },\n );\n }, 1000);\n return () => window.clearInterval(interval);\n }, [seconds, restartKey]);\n\n return state.remaining;\n}\n","\"use client\";\n\nimport { MailIcon, SmartphoneIcon } from \"lucide-react\";\nimport { motion } from \"motion/react\";\nimport * as React from \"react\";\n\nimport { Button } from \"@/components/ui/button\";\nimport { OTPField, OTPFieldInput } from \"@/components/ui/otp-field\";\nimport { type AuthAccent, authAccentActionStyles } from \"@/lib/auth-accent\";\nimport { cn } from \"@/lib/utils\";\nimport {\n AuthCard,\n AuthError,\n AuthSuccess,\n EASE,\n MorphStep,\n useCountdown,\n type AuthStatus,\n} from \"./auth-shell\";\n\nexport interface CodeAuthBlockProps {\n /** Brand mark rendered above the title. Omit for no logo row at all. */\n logo?: React.ReactNode;\n /** Brand accent for the primary action. Omit to keep the default primary. */\n accent?: AuthAccent;\n /** Where the code was sent; drives copy and icon. */\n channel?: \"email\" | \"sms\";\n /** Masked destination shown in the description, e.g. \"y•••@example.com\". */\n destination?: string;\n length?: number;\n /** Submit automatically once all digits are entered. */\n autoSubmit?: boolean;\n /** Seconds before \"Resend code\" becomes available. 0 disables the wait. */\n resendSeconds?: number;\n /** Reject (or throw) to show the error shake and clear the code. */\n onVerify?: (code: string) => Promise<void> | void;\n onResend?: () => Promise<void> | void;\n onBack?: () => void;\n}\n\nexport function CodeAuthBlock({\n channel = \"email\",\n logo,\n accent,\n destination,\n length = 6,\n autoSubmit = true,\n resendSeconds = 30,\n onVerify,\n onResend,\n onBack,\n}: CodeAuthBlockProps) {\n const [status, setStatus] = React.useState<AuthStatus>(\"idle\");\n const [error, setError] = React.useState<string | null>(null);\n const [code, setCode] = React.useState(\"\");\n const [resendCount, setResendCount] = React.useState(0);\n const remaining = useCountdown(resendSeconds, resendCount);\n\n const ChannelIcon = channel === \"sms\" ? SmartphoneIcon : MailIcon;\n const channelLabel = channel === \"sms\" ? \"phone\" : \"email\";\n\n const verify = React.useCallback(\n async (value: string) => {\n setError(null);\n setStatus(\"loading\");\n try {\n await onVerify?.(value);\n setStatus(\"success\");\n } catch (cause) {\n setStatus(\"idle\");\n setCode(\"\");\n setError(cause instanceof Error ? cause.message : \"Invalid code.\");\n }\n },\n [onVerify],\n );\n\n function handleChange(value: string) {\n setCode(value);\n if (error) setError(null);\n if (autoSubmit && value.length === length && status === \"idle\") {\n void verify(value);\n }\n }\n\n async function handleResend() {\n setResendCount((count) => count + 1);\n setCode(\"\");\n setError(null);\n await onResend?.();\n }\n\n return (\n <AuthCard\n title=\"Enter verification code\"\n logo={logo}\n accent={accent}\n description={\n <span className=\"inline-flex items-center gap-1.5\">\n <ChannelIcon className=\"size-3.5 shrink-0\" />\n <span>\n We sent a {length}-digit code to your {channelLabel}\n {destination ? (\n <>\n {\" \"}\n <span className=\"font-medium text-foreground\">\n {destination}\n </span>\n </>\n ) : null}\n .\n </span>\n </span>\n }\n footer={\n status !== \"success\" && (\n <Button variant=\"link\" onClick={onBack}>\n Use a different {channelLabel}\n </Button>\n )\n }\n >\n <MorphStep step={status === \"success\" ? \"success\" : \"form\"}>\n {status === \"success\" ? (\n <AuthSuccess\n title=\"Verified\"\n description=\"Your identity has been confirmed.\"\n />\n ) : (\n <div className=\"flex flex-col items-center gap-4\">\n <motion.div\n // Shake the whole field on error; keying by message replays it.\n key={error ?? \"steady\"}\n animate={error ? { x: [0, -8, 8, -5, 5, 0] } : { x: 0 }}\n transition={{ duration: 0.4, ease: \"easeInOut\" }}\n >\n <OTPField\n length={length}\n value={code}\n onValueChange={handleChange}\n disabled={status === \"loading\"}\n >\n {Array.from({ length }, (_, index) => (\n <OTPFieldInput\n key={`slot-${index}`}\n aria-invalid={error ? true : undefined}\n aria-label={`Digit ${index + 1} of ${length}`}\n />\n ))}\n </OTPField>\n </motion.div>\n <AuthError message={error} />\n {!autoSubmit && (\n <Button\n className={cn(\"w-full\", accent && authAccentActionStyles)}\n loading={status === \"loading\"}\n disabled={code.length !== length}\n onClick={() => void verify(code)}\n >\n Verify\n </Button>\n )}\n <motion.p\n layout\n transition={{ duration: 0.25, ease: EASE }}\n className=\"text-center text-sm text-muted-foreground\"\n >\n {remaining > 0 ? (\n <>\n Resend code in{\" \"}\n <span className=\"font-medium tabular-nums text-foreground\">\n {remaining}s\n </span>\n </>\n ) : (\n <Button\n variant=\"link\"\n disabled={status === \"loading\"}\n onClick={() => void handleResend()}\n >\n Resend code\n </Button>\n )}\n </motion.p>\n </div>\n )}\n </MorphStep>\n </AuthCard>\n );\n}\n","\"use client\";\n\nimport { ArrowLeftIcon } from \"lucide-react\";\nimport * as React from \"react\";\n\nimport { Button } from \"@/components/ui/button\";\nimport { Field, FieldLabel } from \"@/components/ui/field\";\nimport { Input } from \"@/components/ui/input\";\nimport { type AuthAccent, authAccentActionStyles } from \"@/lib/auth-accent\";\nimport { cn } from \"@/lib/utils\";\nimport {\n AuthCard,\n AuthError,\n AuthSuccess,\n MorphStep,\n type AuthStatus,\n} from \"./auth-shell\";\n\nexport interface ForgotPasswordBlockProps {\n title?: string;\n description?: string;\n /** Brand mark rendered above the title. Omit for no logo row at all. */\n logo?: React.ReactNode;\n /** Brand accent for the primary action. Omit to keep the default primary. */\n accent?: AuthAccent;\n onSubmit?: (data: { email: string }) => Promise<void> | void;\n onBackToLogin?: () => void;\n}\n\nexport function ForgotPasswordBlock({\n title = \"Reset your password\",\n logo,\n accent,\n description = \"Enter your email and we will send you a reset link\",\n onSubmit,\n onBackToLogin,\n}: ForgotPasswordBlockProps) {\n const emailId = React.useId();\n const [status, setStatus] = React.useState<AuthStatus>(\"idle\");\n const [error, setError] = React.useState<string | null>(null);\n const [email, setEmail] = React.useState(\"\");\n\n async function handleSubmit(event: React.FormEvent<HTMLFormElement>) {\n event.preventDefault();\n setError(null);\n setStatus(\"loading\");\n try {\n await onSubmit?.({ email });\n setStatus(\"success\");\n } catch (cause) {\n setStatus(\"idle\");\n setError(\n cause instanceof Error ? cause.message : \"Unable to send reset link.\",\n );\n }\n }\n\n return (\n <AuthCard\n title={title}\n description={description}\n logo={logo}\n accent={accent}\n footer={\n <Button\n variant=\"link\"\n className=\"gap-1\"\n onClick={onBackToLogin}\n >\n <ArrowLeftIcon className=\"size-3.5\" />\n Back to login\n </Button>\n }\n >\n <MorphStep step={status === \"success\" ? \"success\" : \"form\"}>\n {status === \"success\" ? (\n <AuthSuccess\n title=\"Check your inbox\"\n description={\n <>\n We sent a password reset link to{\" \"}\n <span className=\"font-medium text-foreground\">{email}</span>.\n </>\n }\n >\n <Button\n variant=\"link\"\n className=\"text-xs sm:text-xs\"\n onClick={() => setStatus(\"idle\")}\n >\n Use a different email\n </Button>\n </AuthSuccess>\n ) : (\n <form className=\"flex flex-col gap-4\" onSubmit={handleSubmit}>\n <Field name=\"email\">\n <FieldLabel htmlFor={emailId}>Email</FieldLabel>\n <Input\n id={emailId}\n name=\"email\"\n type=\"email\"\n autoComplete=\"email\"\n placeholder=\"you@example.com\"\n required\n disabled={status === \"loading\"}\n value={email}\n onChange={(event) => setEmail(event.target.value)}\n />\n </Field>\n <AuthError message={error} />\n <Button\n className={cn(\"w-full\", accent && authAccentActionStyles)}\n type=\"submit\"\n loading={status === \"loading\"}\n >\n Send reset link\n </Button>\n </form>\n )}\n </MorphStep>\n </AuthCard>\n );\n}\n","\"use client\"\n\nimport { AnimatePresence, MotionConfig, motion } from \"motion/react\"\nimport * as React from \"react\"\n\nimport {\n SOCIAL_PROVIDERS,\n type SocialProvider,\n} from \"@/components/composed/social-providers\"\nimport { Button } from \"@/components/ui/button\"\nimport {\n Card,\n CardDescription,\n CardHeader,\n CardPanel,\n CardTitle,\n} from \"@/components/ui/card\"\nimport { Spinner } from \"@/components/ui/spinner\"\nimport { cn } from \"@/lib/utils\"\nimport { AuthError, EASE } from \"./auth-shell\"\n\n/** One sign-in identity attached to the account. */\nexport interface LinkedIdentity {\n id: string\n provider: SocialProvider\n /** Account address shown under the provider name, when known. */\n email?: string | null\n}\n\nexport interface LinkedAccountsBlockProps {\n title?: string\n description?: string\n /** Identities already attached to the account. */\n identities?: LinkedIdentity[]\n /** Providers offered as connect candidates; connected ones are filtered out. */\n providers?: SocialProvider[]\n /** Shows the loading row instead of the list. */\n loading?: boolean\n /**\n * The account can also sign in through a method that has no row in this\n * list — an email/password credential, say. Lifts the last-method guard,\n * which otherwise refuses to disconnect the final listed identity.\n */\n hasOtherSignInMethods?: boolean\n /** Reject (or throw) to show the inline error. */\n onLink?: (provider: SocialProvider) => Promise<void> | void\n onUnlink?: (id: string) => Promise<void> | void\n className?: string\n}\n\nconst LAST_METHOD_EXPLANATION =\n \"This is your only way to sign in, so it can't be disconnected.\"\n\n/**\n * Settings panel for the sign-in identities attached to an account: lists the\n * connected ones, offers connect buttons for the rest, and guards the last\n * remaining method from being disconnected — the guard is a disabled button\n * plus an explanation rather than an error after the fact.\n */\nexport function LinkedAccountsBlock({\n title = \"Connected accounts\",\n description = \"Manage the accounts you can use to sign in.\",\n identities = [],\n providers = [\"google\", \"apple\", \"github\"],\n loading = false,\n hasOtherSignInMethods = false,\n onLink,\n onUnlink,\n className,\n}: LinkedAccountsBlockProps) {\n const noteId = React.useId()\n const [error, setError] = React.useState<string | null>(null)\n const [linking, setLinking] = React.useState<SocialProvider | null>(null)\n const [unlinking, setUnlinking] = React.useState<string | null>(null)\n\n const connected = new Set(identities.map((identity) => identity.provider))\n const connectable = providers.filter((provider) => !connected.has(provider))\n const busy = linking !== null || unlinking !== null\n // The backend rule, enforced here so we never fire a request that would\n // remove the account's only way in. An off-list method (a password) keeps\n // the account reachable, so it lifts the guard.\n const lastMethod = !hasOtherSignInMethods && identities.length <= 1\n\n async function connect(provider: SocialProvider) {\n if (busy) return\n setError(null)\n setLinking(provider)\n try {\n await onLink?.(provider)\n } catch (cause) {\n setError(\n cause instanceof Error ? cause.message : \"Unable to connect account.\"\n )\n } finally {\n setLinking(null)\n }\n }\n\n async function disconnect(id: string) {\n if (busy || lastMethod) return\n setError(null)\n setUnlinking(id)\n try {\n await onUnlink?.(id)\n } catch (cause) {\n setError(\n cause instanceof Error ? cause.message : \"Unable to disconnect account.\"\n )\n } finally {\n setUnlinking(null)\n }\n }\n\n return (\n <MotionConfig reducedMotion=\"user\">\n <Card className={cn(\"w-full\", className)} data-slot=\"auth-block\">\n <CardHeader>\n <CardTitle>{title}</CardTitle>\n <CardDescription>{description}</CardDescription>\n </CardHeader>\n <CardPanel>\n {loading ? (\n <div className=\"flex items-center gap-2 text-sm text-muted-foreground\">\n <Spinner className=\"size-4\" />\n Loading connected accounts…\n </div>\n ) : (\n <motion.div\n layout\n transition={{ duration: 0.3, ease: EASE }}\n className=\"flex flex-col gap-3\"\n >\n <AuthError message={error} />\n\n {identities.length > 0 ? (\n <ul\n aria-label=\"Connected accounts\"\n className=\"flex flex-col gap-2\"\n >\n <AnimatePresence initial={false}>\n {identities.map((identity, index) => {\n const { label, BrandIcon, brandClassName } =\n SOCIAL_PROVIDERS[identity.provider]\n return (\n <motion.li\n key={identity.id}\n layout\n className=\"flex items-center justify-between gap-3 rounded-lg border px-3 py-2\"\n initial={{ opacity: 0, y: -4 }}\n animate={{ opacity: 1, y: 0 }}\n exit={{ opacity: 0, y: -4 }}\n // 40ms per row, capped so a long identity list never\n // leaves the last row arriving noticeably late.\n transition={{\n duration: 0.25,\n ease: EASE,\n delay: Math.min(index, 5) * 0.04,\n }}\n >\n <div className=\"flex min-w-0 items-center gap-2.5\">\n <BrandIcon\n aria-hidden=\"true\"\n className={cn(\"size-4\", brandClassName)}\n />\n <div className=\"flex min-w-0 flex-col\">\n <span className=\"text-sm font-medium\">\n {label}\n </span>\n {identity.email && (\n <span className=\"truncate text-xs text-muted-foreground\">\n {identity.email}\n </span>\n )}\n </div>\n </div>\n <Button\n aria-describedby={lastMethod ? noteId : undefined}\n aria-label={`Disconnect ${label}`}\n size=\"sm\"\n type=\"button\"\n variant=\"destructive-outline\"\n disabled={busy || lastMethod}\n loading={unlinking === identity.id}\n onClick={() => void disconnect(identity.id)}\n >\n Disconnect\n </Button>\n </motion.li>\n )\n })}\n </AnimatePresence>\n </ul>\n ) : (\n <p className=\"text-sm text-muted-foreground\">\n No sign-in methods connected yet.\n </p>\n )}\n\n {lastMethod && identities.length > 0 && (\n <p className=\"text-xs text-muted-foreground\" id={noteId}>\n {LAST_METHOD_EXPLANATION}\n </p>\n )}\n\n {connectable.map((provider) => {\n const { label, BrandIcon, brandClassName } =\n SOCIAL_PROVIDERS[provider]\n return (\n <Button\n key={provider}\n className=\"w-full\"\n type=\"button\"\n variant=\"outline\"\n disabled={busy}\n loading={linking === provider}\n onClick={() => void connect(provider)}\n >\n <BrandIcon aria-hidden=\"true\" className={brandClassName} />\n <span className=\"flex-1\">Connect {label}</span>\n </Button>\n )\n })}\n </motion.div>\n )}\n </CardPanel>\n </Card>\n </MotionConfig>\n )\n}\n","\"use client\";\n\nimport * as React from \"react\";\n\nimport { PasswordInput } from \"@/components/composed/password-input\";\nimport {\n SocialProviders,\n type SocialProvider,\n} from \"@/components/composed/social-providers\";\nimport { Button } from \"@/components/ui/button\";\nimport { Checkbox } from \"@/components/ui/checkbox\";\nimport { Field, FieldLabel } from \"@/components/ui/field\";\nimport { Input } from \"@/components/ui/input\";\nimport { Label } from \"@/components/ui/label\";\nimport { type AuthAccent, authAccentActionStyles } from \"@/lib/auth-accent\";\nimport { cn } from \"@/lib/utils\";\nimport {\n AuthCard,\n AuthError,\n AuthSeparator,\n AuthSuccess,\n MorphStep,\n Reveal,\n type AuthStatus,\n} from \"./auth-shell\";\n\nexport interface LoginBlockProps {\n title?: string;\n description?: string;\n /** Brand mark rendered above the title. Omit for no logo row at all. */\n logo?: React.ReactNode;\n /** Brand accent for the primary action. Omit to keep the default primary. */\n accent?: AuthAccent;\n /** Social providers to offer; empty array hides the social section. */\n providers?: SocialProvider[];\n showRememberMe?: boolean;\n showForgotPassword?: boolean;\n /** Reject (or throw) to show the error state with the error's message. */\n onSubmit?: (data: {\n email: string;\n password: string;\n remember: boolean;\n }) => Promise<void> | void;\n onProviderSelect?: (provider: SocialProvider) => Promise<void> | void;\n onForgotPassword?: () => void;\n onSignup?: () => void;\n}\n\nexport function LoginBlock({\n title = \"Login to your account\",\n description = \"Enter your email and password to login\",\n logo,\n accent,\n providers = [\"google\", \"apple\", \"github\"],\n showRememberMe = true,\n showForgotPassword = true,\n onSubmit,\n onProviderSelect,\n onForgotPassword,\n onSignup,\n}: LoginBlockProps) {\n const emailId = React.useId();\n const rememberId = React.useId();\n const [status, setStatus] = React.useState<AuthStatus>(\"idle\");\n const [error, setError] = React.useState<string | null>(null);\n const [loadingProvider, setLoadingProvider] =\n React.useState<SocialProvider | null>(null);\n const [remember, setRemember] = React.useState(false);\n const [email, setEmail] = React.useState(\"\");\n const [emailValid, setEmailValid] = React.useState(false);\n const [password, setPassword] = React.useState(\"\");\n\n const busy = status === \"loading\" || loadingProvider !== null;\n\n // Progressive disclosure: each step unlocks the next. The password field is\n // gated on the email input's own constraint validation (required + type\n // email), the submit button on the password being non-empty — a login form\n // verifies a credential rather than enforcing policy, so strength rules here\n // would lock out anyone whose password predates them. The submit gate\n // re-checks emailValid so a stale password (typed, then the email was edited\n // back into an invalid state) can't leave the button on its own.\n const passwordValid = password.trim().length > 0;\n const canSubmit = emailValid && passwordValid;\n\n async function handleSubmit(event: React.FormEvent<HTMLFormElement>) {\n event.preventDefault();\n // Enter in any field submits the form even while the button is hidden.\n if (!canSubmit) return;\n const form = new FormData(event.currentTarget);\n setError(null);\n setStatus(\"loading\");\n try {\n await onSubmit?.({\n email: String(form.get(\"email\") ?? \"\"),\n password: String(form.get(\"password\") ?? \"\"),\n remember,\n });\n setStatus(\"success\");\n } catch (cause) {\n setStatus(\"idle\");\n setError(cause instanceof Error ? cause.message : \"Unable to login.\");\n }\n }\n\n async function handleProvider(provider: SocialProvider) {\n setError(null);\n setLoadingProvider(provider);\n try {\n await onProviderSelect?.(provider);\n setStatus(\"success\");\n } catch (cause) {\n setError(\n cause instanceof Error ? cause.message : \"Unable to login.\",\n );\n } finally {\n setLoadingProvider(null);\n }\n }\n\n return (\n <AuthCard\n title={title}\n description={description}\n logo={logo}\n accent={accent}\n footer={\n status !== \"success\" && (\n <>\n Don&apos;t have an account?{\" \"}\n <Button variant=\"link\" onClick={onSignup}>\n Sign up\n </Button>\n </>\n )\n }\n >\n <MorphStep step={status === \"success\" ? \"success\" : \"form\"}>\n {status === \"success\" ? (\n <AuthSuccess\n title=\"Welcome back\"\n description=\"You are now logged in.\"\n />\n ) : (\n <div className=\"flex flex-col gap-4\">\n <form className=\"flex flex-col gap-4\" onSubmit={handleSubmit}>\n <Field name=\"email\">\n <FieldLabel htmlFor={emailId}>Email</FieldLabel>\n <Input\n id={emailId}\n aria-label=\"Email\"\n name=\"email\"\n type=\"email\"\n autoComplete=\"email\"\n placeholder=\"you@example.com\"\n required\n disabled={busy}\n value={email}\n onChange={(event) => {\n setEmail(event.currentTarget.value);\n setEmailValid(event.currentTarget.validity.valid);\n }}\n />\n </Field>\n <Reveal show={emailValid}>\n <Field name=\"password\">\n <FieldLabel htmlFor=\"password\">Password</FieldLabel>\n <PasswordInput\n id=\"password\"\n name=\"password\"\n autoComplete=\"current-password\"\n required\n disabled={busy}\n value={password}\n onChange={(event) => setPassword(event.target.value)}\n />\n {showForgotPassword && (\n // self-end: Field root is items-start, so this aligns the\n // link with the input's trailing edge. sm:text-xs is\n // required — the cva's sm:text-sm survives tailwind-merge\n // and would otherwise win at the breakpoint.\n <Button\n variant=\"link\"\n type=\"button\"\n className=\"self-end font-normal text-muted-foreground text-xs hover:text-foreground sm:text-xs\"\n onClick={onForgotPassword}\n >\n Forgot password?\n </Button>\n )}\n </Field>\n </Reveal>\n {showRememberMe && (\n <div className=\"flex items-center gap-2\">\n <Checkbox\n id={rememberId}\n checked={remember}\n onCheckedChange={(checked) => setRemember(checked)}\n disabled={busy}\n />\n <Label htmlFor={rememberId} className=\"font-normal\">\n Remember me\n </Label>\n </div>\n )}\n <AuthError message={error} />\n <Reveal show={canSubmit}>\n <Button\n className={cn(\"w-full\", accent && authAccentActionStyles)}\n type=\"submit\"\n loading={status === \"loading\"}\n disabled={busy}\n >\n Login\n </Button>\n </Reveal>\n </form>\n {providers.length > 0 && (\n // The social providers retire once the email path is filled in\n // and valid — the user has committed to a path, so the\n // alternatives are just noise. They come back if a field is\n // invalidated again. gap-4 on the wrapper reproduces the spacing\n // the two children had as direct flex items of the column above.\n <Reveal show={!canSubmit} className=\"flex flex-col gap-4\">\n <AuthSeparator label=\"Or continue with\" />\n <SocialProviders\n providers={providers}\n action=\"login\"\n loadingProvider={loadingProvider}\n disabled={status === \"loading\"}\n onSelect={handleProvider}\n />\n </Reveal>\n )}\n </div>\n )}\n </MorphStep>\n </AuthCard>\n );\n}\n","\"use client\";\n\nimport * as React from \"react\";\n\nimport { Button } from \"@/components/ui/button\";\nimport { Checkbox } from \"@/components/ui/checkbox\";\nimport { Field, FieldError, FieldLabel } from \"@/components/ui/field\";\nimport { Input } from \"@/components/ui/input\";\nimport { Label } from \"@/components/ui/label\";\nimport { Textarea } from \"@/components/ui/textarea\";\nimport { cn } from \"@/lib/utils\";\nimport type {\n OnboardingFieldConfig,\n OnboardingStepConfig,\n OnboardingValue,\n} from \"../onboarding-block\";\n\nexport interface ProfileStepProps {\n step: OnboardingStepConfig;\n /** Seed values, so drafts survive back/forward navigation. */\n values: Record<string, OnboardingValue>;\n submitting?: boolean;\n submitLabel: string;\n onSubmit: (values: Record<string, OnboardingValue>) => void | Promise<void>;\n onBack?: () => void;\n /** Reports every edit so the flow can restore drafts across navigation. */\n onDraftChange?: (name: string, value: OnboardingValue) => void;\n}\n\nfunction initialValue(\n field: OnboardingFieldConfig,\n saved: OnboardingValue | undefined,\n): OnboardingValue {\n if (field.kind === \"checkbox\") return typeof saved === \"boolean\" ? saved : false;\n return typeof saved === \"string\" ? saved : \"\";\n}\n\n/** Built-in validation, mirroring the declared `FieldConfig` contract. */\nfunction validateField(\n field: OnboardingFieldConfig,\n value: OnboardingValue,\n): string | null {\n const required = field.required === true;\n\n if (field.kind === \"checkbox\") {\n if (required && value !== true) return `${field.label} is required`;\n return null;\n }\n\n const text = typeof value === \"string\" ? value.trim() : \"\";\n if (required && text.length === 0) return `${field.label} is required`;\n\n if (field.kind === \"url\" && text.length > 0) {\n try {\n new URL(text);\n } catch {\n return \"Enter a valid URL\";\n }\n }\n\n if (field.kind === \"select\" && text.length > 0) {\n const allowed = field.options.map((option) => option.value);\n if (!allowed.includes(text)) {\n return `Choose a valid option for ${field.label}`;\n }\n }\n\n return field.validate?.(text) ?? null;\n}\n\n/**\n * Renders one declared profile step: `OnboardingFieldConfig[]` → labeled\n * controls, validated locally before anything is handed to `onSubmit`. Mounted\n * keyed by `step.id` so drafts re-seed per step.\n */\nexport function ProfileStep({\n step,\n values,\n submitting = false,\n submitLabel,\n onSubmit,\n onBack,\n onDraftChange,\n}: ProfileStepProps) {\n const idPrefix = React.useId();\n const [draft, setDraft] = React.useState<Record<string, OnboardingValue>>(\n () =>\n Object.fromEntries(\n step.fields.map((field) => [\n field.name,\n initialValue(field, values[field.name]),\n ]),\n ),\n );\n const [errors, setErrors] = React.useState<Record<string, string>>({});\n\n function setValue(name: string, value: OnboardingValue) {\n setDraft((current) => ({ ...current, [name]: value }));\n onDraftChange?.(name, value);\n // Clear a field's error as soon as it is edited; re-validation happens on\n // the next submit rather than on every keystroke.\n setErrors((current) =>\n current[name] ? { ...current, [name]: \"\" } : current,\n );\n }\n\n async function handleSubmit(event: React.FormEvent<HTMLFormElement>) {\n event.preventDefault();\n if (submitting) return;\n\n const next: Record<string, string> = {};\n for (const field of step.fields) {\n const message = validateField(field, draft[field.name]);\n if (message) next[field.name] = message;\n }\n if (Object.keys(next).length > 0) {\n setErrors(next);\n return;\n }\n setErrors({});\n\n const submitted: Record<string, OnboardingValue> = {};\n for (const field of step.fields) {\n const value = draft[field.name];\n submitted[field.name] = typeof value === \"string\" ? value.trim() : value;\n }\n await onSubmit(submitted);\n }\n\n return (\n <form className=\"flex flex-col gap-4\" noValidate onSubmit={handleSubmit}>\n {step.fields.map((field) => {\n const error = errors[field.name] || undefined;\n const controlId = `${idPrefix}-${field.name}`;\n const value = draft[field.name];\n\n if (field.kind === \"checkbox\") {\n return (\n <Field\n key={field.name}\n name={field.name}\n invalid={Boolean(error)}\n className=\"gap-1.5\"\n >\n <div className=\"flex items-center gap-2\">\n <Checkbox\n id={controlId}\n checked={value === true}\n disabled={submitting}\n onCheckedChange={(checked) => setValue(field.name, checked)}\n />\n <Label htmlFor={controlId} className=\"font-normal\">\n {field.label}\n </Label>\n </div>\n {error && <FieldError match>{error}</FieldError>}\n </Field>\n );\n }\n\n return (\n <Field key={field.name} name={field.name} invalid={Boolean(error)}>\n <FieldLabel htmlFor={controlId}>{field.label}</FieldLabel>\n {field.kind === \"textarea\" ? (\n <Textarea\n id={controlId}\n aria-invalid={error ? true : undefined}\n disabled={submitting}\n placeholder={field.placeholder}\n value={String(value ?? \"\")}\n onChange={(event) => setValue(field.name, event.target.value)}\n />\n ) : field.kind === \"select\" ? (\n // No select atom exists in the library yet; a native control\n // styled to match Input keeps the flow self-contained without\n // inventing one here.\n <select\n id={controlId}\n aria-invalid={error ? true : undefined}\n className={cn(\n \"h-8.5 w-full rounded-lg border border-input bg-background px-[calc(--spacing(3)-1px)] text-base text-foreground shadow-xs/5 outline-none transition-[box-shadow,border-color] duration-150 ease-smooth-out focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/24 disabled:opacity-64 aria-invalid:border-destructive/36 sm:h-7.5 sm:text-sm dark:bg-input/32\",\n )}\n disabled={submitting}\n value={String(value ?? \"\")}\n onChange={(event) => setValue(field.name, event.target.value)}\n >\n <option value=\"\">{field.placeholder ?? \"Choose an option\"}</option>\n {field.options.map((option) => (\n <option key={option.value} value={option.value}>\n {option.label}\n </option>\n ))}\n </select>\n ) : (\n <Input\n id={controlId}\n aria-invalid={error ? true : undefined}\n disabled={submitting}\n placeholder={field.placeholder}\n type={field.kind === \"url\" ? \"url\" : \"text\"}\n value={String(value ?? \"\")}\n onChange={(event) => setValue(field.name, event.target.value)}\n />\n )}\n {error && <FieldError match>{error}</FieldError>}\n </Field>\n );\n })}\n\n <div className=\"flex gap-2\">\n {onBack && (\n <Button\n type=\"button\"\n variant=\"outline\"\n disabled={submitting}\n onClick={onBack}\n >\n Back\n </Button>\n )}\n <Button className=\"flex-1\" type=\"submit\" loading={submitting}>\n {submitLabel}\n </Button>\n </div>\n </form>\n );\n}\n","\"use client\";\n\nimport * as React from \"react\";\n\nimport { cn } from \"@/lib/utils\";\nimport type { AuthAccent } from \"@/lib/auth-accent\";\nimport {\n AuthCard,\n AuthError,\n AuthSuccess,\n MorphStep,\n type AuthStatus,\n} from \"./auth-shell\";\nimport { ProfileStep } from \"./onboarding/profile-step\";\n\n/** Value a single onboarding field can hold. */\nexport type OnboardingValue = string | boolean;\n\nexport interface OnboardingSelectOption {\n value: string;\n label: string;\n}\n\ninterface OnboardingFieldBase {\n /** Key the value is collected under; unique within the flow. */\n name: string;\n label: string;\n /** Required fields gate the step's advance. */\n required?: boolean;\n placeholder?: string;\n /** Extra validation; return a message to reject, `null` to accept. */\n validate?: (value: string) => string | null;\n}\n\nexport interface OnboardingTextField extends OnboardingFieldBase {\n kind: \"text\" | \"textarea\" | \"url\";\n}\n\nexport interface OnboardingCheckboxField extends OnboardingFieldBase {\n kind: \"checkbox\";\n}\n\nexport interface OnboardingSelectField extends OnboardingFieldBase {\n kind: \"select\";\n options: OnboardingSelectOption[];\n}\n\n/** Discriminated on `kind`. */\nexport type OnboardingFieldConfig =\n | OnboardingTextField\n | OnboardingCheckboxField\n | OnboardingSelectField;\n\nexport interface OnboardingStepConfig {\n /** Unique within the flow and stable across releases. */\n id: string;\n title: string;\n description?: string;\n fields: OnboardingFieldConfig[];\n}\n\n/** Default configuration: a single required display-name step. */\nexport const DEFAULT_ONBOARDING_STEPS: OnboardingStepConfig[] = [\n {\n id: \"profile\",\n title: \"Your profile\",\n fields: [\n { kind: \"text\", name: \"display_name\", label: \"Display name\", required: true },\n ],\n },\n];\n\nexport interface OnboardingBlockProps {\n /** Declared profile steps. */\n steps?: OnboardingStepConfig[];\n /** Brand mark rendered above the title. Omit for no logo row at all. */\n logo?: React.ReactNode;\n /** Brand accent for the primary action. Omit to keep the default primary. */\n accent?: AuthAccent;\n /**\n * Fires per step as it is submitted. Reject (or throw) to keep the user on\n * the step and show the error.\n */\n onStepSubmit?: (\n stepId: string,\n values: Record<string, OnboardingValue>,\n ) => Promise<void> | void;\n /** Fires once, after the final step is accepted, with the merged profile. */\n onComplete?: (profile: Record<string, OnboardingValue>) => Promise<void> | void;\n /** Shows a brief success screen once onboarding completes. */\n showCompleteScreen?: boolean;\n className?: string;\n}\n\n/**\n * Multi-step profile onboarding: a declared `steps` config renders as\n * progress-tracked forms with back/forward navigation, per-step submission and\n * a single completion signal. Drafts survive back-navigation, and the step\n * heading takes focus on advance so a screen reader announces where the flow\n * moved.\n *\n * Account creation and email confirmation are separate blocks (`SignupBlock`,\n * `CodeAuthBlock`) — this one picks up once the account exists.\n */\nexport function OnboardingBlock({\n steps = DEFAULT_ONBOARDING_STEPS,\n logo,\n accent,\n onStepSubmit,\n onComplete,\n showCompleteScreen = true,\n className,\n}: OnboardingBlockProps) {\n const headingRef = React.useRef<HTMLHeadingElement>(null);\n // Unsubmitted per-step drafts. Accumulated in a ref so a keystroke does not\n // re-render the whole flow, then published to state at each navigation —\n // the only moment the seed values are actually read.\n const draftsRef = React.useRef<\n Record<string, Record<string, OnboardingValue>>\n >({});\n const [drafts, setDrafts] = React.useState<\n Record<string, Record<string, OnboardingValue>>\n >({});\n\n const [index, setIndex] = React.useState(0);\n const [values, setValues] = React.useState<Record<string, OnboardingValue>>(\n {},\n );\n const [status, setStatus] = React.useState<AuthStatus>(\"idle\");\n const [error, setError] = React.useState<string | null>(null);\n\n const done = status === \"success\";\n const step = steps[index];\n const last = index >= steps.length - 1;\n\n // Focus the step heading on advance; on error the alert carries the message\n // and stealing focus would talk over it.\n React.useEffect(() => {\n if (error) return;\n headingRef.current?.focus();\n }, [index, done, error]);\n\n async function handleStepSubmit(stepValues: Record<string, OnboardingValue>) {\n if (!step) return;\n const merged = { ...values, ...stepValues };\n setError(null);\n setStatus(\"loading\");\n try {\n await onStepSubmit?.(step.id, stepValues);\n if (last) await onComplete?.(merged);\n setValues(merged);\n delete draftsRef.current[step.id];\n setDrafts({ ...draftsRef.current });\n setStatus(last ? \"success\" : \"idle\");\n if (!last) setIndex((current) => current + 1);\n } catch (cause) {\n setStatus(\"idle\");\n setError(\n cause instanceof Error ? cause.message : \"Unable to save your profile.\",\n );\n }\n }\n\n if (done && !showCompleteScreen) return null;\n\n const heading = done ? \"You're all set\" : (step?.title ?? \"Your profile\");\n\n return (\n <AuthCard\n title={heading}\n description={done ? undefined : step?.description}\n logo={logo}\n accent={accent}\n className={className}\n >\n <MorphStep step={done ? \"done\" : `step-${index}`}>\n {done ? (\n <AuthSuccess\n title=\"Profile saved\"\n description=\"Your account is ready and your profile has been saved.\"\n />\n ) : step ? (\n <div className=\"flex flex-col gap-4\">\n <nav aria-label=\"Onboarding progress\">\n <ol className=\"flex flex-wrap gap-x-3 gap-y-1 text-xs\">\n {steps.map((item, itemIndex) => (\n <li\n key={item.id}\n aria-current={itemIndex === index ? \"step\" : undefined}\n className={cn(\n \"text-muted-foreground\",\n itemIndex === index && \"font-medium text-foreground\",\n )}\n >\n {item.title}\n {itemIndex < index && (\n <span className=\"sr-only\"> (completed)</span>\n )}\n </li>\n ))}\n </ol>\n </nav>\n\n {/* The AuthCard title is the visible heading; this one exists to\n take focus on advance without duplicating it on screen. */}\n <h3 ref={headingRef} tabIndex={-1} className=\"sr-only\">\n {step.title}\n </h3>\n\n <AuthError message={error} />\n\n <ProfileStep\n key={step.id}\n step={step}\n values={{ ...values, ...drafts[step.id] }}\n submitting={status === \"loading\"}\n submitLabel={last ? \"Finish\" : \"Continue\"}\n onBack={\n index > 0\n ? () => {\n setError(null);\n setDrafts({ ...draftsRef.current });\n setIndex((current) => current - 1);\n }\n : undefined\n }\n onDraftChange={(name, value) => {\n draftsRef.current[step.id] = {\n ...draftsRef.current[step.id],\n [name]: value,\n };\n }}\n onSubmit={handleStepSubmit}\n />\n </div>\n ) : null}\n </MorphStep>\n </AuthCard>\n );\n}\n","\"use client\"\n\nimport { KeyRoundIcon } from \"lucide-react\"\nimport { AnimatePresence, MotionConfig, motion } from \"motion/react\"\nimport * as React from \"react\"\n\nimport { Button } from \"@/components/ui/button\"\nimport {\n Card,\n CardDescription,\n CardHeader,\n CardPanel,\n CardTitle,\n} from \"@/components/ui/card\"\nimport { Field, FieldError, FieldLabel } from \"@/components/ui/field\"\nimport { Input } from \"@/components/ui/input\"\nimport { Spinner } from \"@/components/ui/spinner\"\nimport { cn } from \"@/lib/utils\"\nimport { AuthError, EASE, Reveal } from \"./auth-shell\"\n\n/** One registered passkey, as rendered by {@link PasskeyManagerBlock}. */\nexport interface PasskeyRecord {\n id: string\n /** Server-derived name; falls back to \"Passkey\" when absent. */\n name?: string | null\n /** ISO timestamps. Unparseable values are simply not shown. */\n createdAt?: string | null\n lastUsedAt?: string | null\n}\n\nexport interface PasskeyManagerBlockProps {\n title?: string\n description?: string\n /** The account's passkeys, newest first. */\n passkeys?: PasskeyRecord[]\n /** Whether this device can register passkeys at all. */\n available?: boolean\n /** Shows the loading row instead of the list. */\n loading?: boolean\n /**\n * Reject (or throw) to show the error. Resolving with `{ cancelled: true }`\n * returns silently to idle — a dismissed OS prompt is not a failure.\n */\n onRegister?: () => Promise<{ cancelled?: boolean } | void> | void\n onRename?: (id: string, name: string) => Promise<void> | void\n onDelete?: (id: string) => Promise<void> | void\n className?: string\n}\n\nconst NAME_MAX = 120\n\nconst LAST_PASSKEY_WARNING =\n \"This is your last passkey. After deleting it you won't be able to sign in with a passkey until you register a new one.\"\n\nfunction formatDate(iso: string | null | undefined): string | null {\n if (!iso) return null\n const date = new Date(iso)\n return Number.isNaN(date.getTime()) ? null : date.toLocaleDateString()\n}\n\n/**\n * Settings panel for the passkeys on an account: register, inline rename with\n * field-level validation, and delete behind an explicit confirmation. Deleting\n * the last passkey is allowed — it is the account's passkey method that goes\n * away, not its only way in — so the confirmation carries a warning instead of\n * a block.\n */\nexport function PasskeyManagerBlock({\n title = \"Passkeys\",\n description = \"Sign in without a password using your device's biometrics or security key.\",\n passkeys = [],\n available = true,\n loading = false,\n onRegister,\n onRename,\n onDelete,\n className,\n}: PasskeyManagerBlockProps) {\n const [error, setError] = React.useState<string | null>(null)\n const [busy, setBusy] = React.useState(false)\n const [registering, setRegistering] = React.useState(false)\n const [renamingId, setRenamingId] = React.useState<string | null>(null)\n const [renameValue, setRenameValue] = React.useState(\"\")\n const [renameError, setRenameError] = React.useState<string | null>(null)\n const [confirmingId, setConfirmingId] = React.useState<string | null>(null)\n\n const lastPasskey = passkeys.length === 1\n\n async function run(action: () => Promise<unknown> | unknown) {\n if (busy) return { ok: false } as const\n setError(null)\n setBusy(true)\n try {\n const result = await action()\n return { ok: true, result } as const\n } catch (cause) {\n setError(cause instanceof Error ? cause.message : \"Something went wrong.\")\n return { ok: false } as const\n } finally {\n setBusy(false)\n }\n }\n\n async function handleRegister() {\n setRegistering(true)\n await run(() => onRegister?.())\n setRegistering(false)\n }\n\n function startRename(passkey: PasskeyRecord) {\n setConfirmingId(null)\n setRenamingId(passkey.id)\n setRenameValue(passkey.name ?? \"\")\n setRenameError(null)\n }\n\n async function submitRename(id: string) {\n const name = renameValue.trim()\n if (name.length < 1 || name.length > NAME_MAX) {\n setRenameError(`Name must be between 1 and ${NAME_MAX} characters.`)\n return\n }\n const outcome = await run(() => onRename?.(id, name))\n if (!outcome.ok) return\n setRenamingId(null)\n setRenameError(null)\n }\n\n async function confirmDelete(id: string) {\n const outcome = await run(() => onDelete?.(id))\n setConfirmingId(null)\n if (!outcome.ok) return\n if (renamingId === id) setRenamingId(null)\n }\n\n return (\n <MotionConfig reducedMotion=\"user\">\n <Card className={cn(\"w-full\", className)} data-slot=\"auth-block\">\n <CardHeader>\n <CardTitle>{title}</CardTitle>\n <CardDescription>{description}</CardDescription>\n </CardHeader>\n <CardPanel>\n {!available ? (\n <p className=\"text-sm text-muted-foreground\">\n Passkeys aren&apos;t available on this device. You can manage them\n from a device that supports passkeys.\n </p>\n ) : loading ? (\n <div className=\"flex items-center gap-2 text-sm text-muted-foreground\">\n <Spinner className=\"size-4\" />\n Loading passkeys…\n </div>\n ) : (\n <motion.div\n layout\n transition={{ duration: 0.3, ease: EASE }}\n className=\"flex flex-col gap-3\"\n >\n <AuthError message={error} />\n\n {passkeys.length > 0 ? (\n <ul aria-label=\"Passkeys\" className=\"flex flex-col gap-2\">\n <AnimatePresence initial={false}>\n {passkeys.map((passkey, index) => {\n const name = passkey.name ?? \"Passkey\"\n const created = formatDate(passkey.createdAt)\n const lastUsed = formatDate(passkey.lastUsedAt)\n return (\n <motion.li\n key={passkey.id}\n layout\n className=\"flex flex-col gap-2 rounded-lg border px-3 py-2\"\n initial={{ opacity: 0, y: -4 }}\n animate={{ opacity: 1, y: 0 }}\n exit={{ opacity: 0, y: -4 }}\n // 40ms per row, capped so a long list never leaves\n // the last row arriving noticeably late.\n transition={{\n duration: 0.25,\n ease: EASE,\n delay: Math.min(index, 5) * 0.04,\n }}\n >\n <div className=\"flex items-center justify-between gap-3\">\n <div className=\"flex min-w-0 items-center gap-2.5\">\n <span\n aria-hidden=\"true\"\n className=\"grid size-8 shrink-0 place-items-center rounded-md bg-muted text-muted-foreground\"\n >\n <KeyRoundIcon className=\"size-4\" />\n </span>\n <div className=\"flex min-w-0 flex-col\">\n <span className=\"truncate text-sm font-medium\">\n {name}\n </span>\n <span className=\"text-xs text-muted-foreground\">\n {created ? `Added ${created}` : null}\n {created && lastUsed ? \" · \" : null}\n {lastUsed ? `Last used ${lastUsed}` : null}\n </span>\n </div>\n </div>\n <div className=\"flex shrink-0 gap-2\">\n <Button\n aria-label={`Rename ${name}`}\n size=\"sm\"\n type=\"button\"\n variant=\"outline\"\n disabled={busy}\n onClick={() => startRename(passkey)}\n >\n Rename\n </Button>\n <Button\n aria-label={`Delete ${name}`}\n size=\"sm\"\n type=\"button\"\n variant=\"destructive-outline\"\n disabled={busy}\n onClick={() => {\n setRenamingId(null)\n setConfirmingId(passkey.id)\n }}\n >\n Delete\n </Button>\n </div>\n </div>\n\n <Reveal show={renamingId === passkey.id}>\n <form\n className=\"flex items-start gap-2 pt-1\"\n onSubmit={(event) => {\n event.preventDefault()\n void submitRename(passkey.id)\n }}\n >\n <Field\n className=\"min-w-0 grow\"\n invalid={Boolean(renameError)}\n >\n <FieldLabel className=\"sr-only\">\n Passkey name\n </FieldLabel>\n <Input\n aria-label=\"Passkey name\"\n aria-invalid={renameError ? true : undefined}\n autoFocus\n disabled={busy}\n maxLength={NAME_MAX + 1}\n value={renameValue}\n onChange={(event) =>\n setRenameValue(event.target.value)\n }\n />\n {renameError && (\n <FieldError match>{renameError}</FieldError>\n )}\n </Field>\n <Button size=\"sm\" type=\"submit\" loading={busy}>\n Save\n </Button>\n <Button\n size=\"sm\"\n type=\"button\"\n variant=\"ghost\"\n disabled={busy}\n onClick={() => setRenamingId(null)}\n >\n Cancel\n </Button>\n </form>\n </Reveal>\n\n <Reveal show={confirmingId === passkey.id}>\n <div\n className=\"flex flex-col gap-2 rounded-lg bg-muted/50 p-2\"\n role=\"alertdialog\"\n aria-label={`Confirm deleting ${name}`}\n >\n <p className=\"text-sm\">\n Delete this passkey? It can no longer be used to\n sign in.\n </p>\n {lastPasskey && (\n <p className=\"text-xs text-destructive-foreground\">\n {LAST_PASSKEY_WARNING}\n </p>\n )}\n <div className=\"flex gap-2\">\n <Button\n size=\"sm\"\n type=\"button\"\n variant=\"destructive\"\n loading={busy}\n onClick={() => void confirmDelete(passkey.id)}\n >\n Delete passkey\n </Button>\n <Button\n size=\"sm\"\n type=\"button\"\n variant=\"ghost\"\n disabled={busy}\n onClick={() => setConfirmingId(null)}\n >\n Keep it\n </Button>\n </div>\n </div>\n </Reveal>\n </motion.li>\n )\n })}\n </AnimatePresence>\n </ul>\n ) : (\n <p className=\"text-sm text-muted-foreground\">\n No passkeys registered yet. Add one to sign in without a\n password.\n </p>\n )}\n\n <Button\n className=\"w-full\"\n type=\"button\"\n variant=\"outline\"\n disabled={busy}\n loading={registering}\n onClick={() => void handleRegister()}\n >\n Add a passkey\n </Button>\n </motion.div>\n )}\n </CardPanel>\n </Card>\n </MotionConfig>\n )\n}\n","\"use client\";\n\nimport { FingerprintIcon } from \"lucide-react\";\nimport * as React from \"react\";\n\nimport { Button } from \"@/components/ui/button\";\nimport { cn } from \"@/lib/utils\";\nimport { AuthError, Reveal } from \"./auth-shell\";\n\nexport interface PasskeySignInBlockProps {\n /**\n * Whether this device can use passkeys. `false` renders nothing at all —\n * a passkey button that is guaranteed to fail is worse than no button.\n */\n available?: boolean;\n /** Button label. */\n label?: string;\n /**\n * Reject (or throw) to show the inline error. Resolving with\n * `{ cancelled: true }` returns silently to idle — a dismissed OS prompt is\n * not a failure and must not surface an error.\n */\n onSignIn?: () => Promise<{ cancelled?: boolean } | void> | void;\n /** Hint shown under an error, pointing at the remaining sign-in methods. */\n fallbackHint?: React.ReactNode;\n className?: string;\n}\n\n/**\n * Passkey sign-in entry point — a single button plus its error state, sized\n * to drop into a login card next to the password form rather than to stand on\n * its own. Renders `null` while passkeys are unavailable.\n */\nexport function PasskeySignInBlock({\n available = true,\n label = \"Sign in with a passkey\",\n onSignIn,\n fallbackHint = \"You can still sign in with your other methods below.\",\n className,\n}: PasskeySignInBlockProps) {\n const [error, setError] = React.useState<string | null>(null);\n const [loading, setLoading] = React.useState(false);\n\n if (!available) return null;\n\n async function handleClick() {\n if (loading) return;\n setError(null);\n setLoading(true);\n try {\n await onSignIn?.();\n } catch (cause) {\n setError(\n cause instanceof Error\n ? cause.message\n : \"Unable to sign in with a passkey.\",\n );\n } finally {\n setLoading(false);\n }\n }\n\n return (\n <div className={cn(\"flex w-full flex-col gap-2\", className)}>\n <Button\n variant=\"outline\"\n className=\"w-full\"\n type=\"button\"\n loading={loading}\n onClick={() => void handleClick()}\n >\n <FingerprintIcon aria-hidden=\"true\" />\n <span className=\"flex-1\">{label}</span>\n </Button>\n <AuthError message={error} />\n <Reveal show={Boolean(error) && Boolean(fallbackHint)}>\n <p className=\"text-xs text-muted-foreground\">{fallbackHint}</p>\n </Reveal>\n </div>\n );\n}\n","\"use client\";\n\nimport * as React from \"react\";\n\nimport {\n PasswordInput,\n getPasswordStrength,\n passwordRequirements,\n} from \"@/components/composed/password-input\";\nimport {\n SocialProviders,\n type SocialProvider,\n} from \"@/components/composed/social-providers\";\nimport { Button } from \"@/components/ui/button\";\nimport { Checkbox } from \"@/components/ui/checkbox\";\nimport { Field, FieldLabel } from \"@/components/ui/field\";\nimport { Input } from \"@/components/ui/input\";\nimport { Label } from \"@/components/ui/label\";\nimport { type AuthAccent, authAccentActionStyles } from \"@/lib/auth-accent\";\nimport { cn } from \"@/lib/utils\";\nimport {\n AuthCard,\n AuthError,\n AuthSeparator,\n AuthSuccess,\n MorphStep,\n Reveal,\n type AuthStatus,\n} from \"./auth-shell\";\n\nexport interface SignupBlockProps {\n title?: string;\n description?: string;\n /**\n * Replaces the built-in \"terms\" link inside the consent label — pass your\n * own dialog trigger to render it inline instead of wiring `onTerms`.\n */\n termsComponent?: React.ReactNode;\n /** Brand mark rendered above the title. Omit for no logo row at all. */\n logo?: React.ReactNode;\n /** Brand accent for the primary action. Omit keeping the default primary. */\n accent?: AuthAccent;\n providers?: SocialProvider[];\n showNameField?: boolean;\n /** Require the term checkbox before submitting. */\n showTerms?: boolean;\n /**\n * Controls the term checkbox. Pass it with `onTermsCheckedChange` when\n * something outside the block has to tick the box — an \"I agree\" action in\n * your own terms dialog, say. Omit letting the block own the state.\n */\n termsChecked?: boolean;\n /** Starting state of the term checkbox while it is uncontrolled. */\n defaultTermsChecked?: boolean;\n /** Fires on every change, controlled or not. */\n onTermsCheckedChange?: (checked: boolean) => void;\n /** Block submission until every password requirement is met. */\n enforceStrongPassword?: boolean;\n onSubmit?: (data: {\n name: string;\n email: string;\n password: string;\n }) => Promise<void> | void;\n onProviderSelect?: (provider: SocialProvider) => Promise<void> | void;\n onLogin?: () => void;\n onTerms?: () => void;\n}\n\nexport function SignupBlock({\n title = \"Create your account\",\n description = \"Start exploring manuscripts in minutes\",\n logo,\n accent,\n providers = [\"google\", \"apple\", \"github\"],\n showNameField = true,\n showTerms = true,\n termsChecked,\n defaultTermsChecked = false,\n onTermsCheckedChange,\n enforceStrongPassword = true,\n onSubmit,\n termsComponent,\n onProviderSelect,\n onLogin,\n onTerms,\n}: SignupBlockProps) {\n const nameId = React.useId();\n const emailId = React.useId();\n const passwordId = React.useId();\n const termsId = React.useId();\n const [status, setStatus] = React.useState<AuthStatus>(\"idle\");\n const [error, setError] = React.useState<string | null>(null);\n const [loadingProvider, setLoadingProvider] =\n React.useState<SocialProvider | null>(null);\n const [password, setPassword] = React.useState(\"\");\n // Controlled when `termsChecked` is passed, uncontrolled otherwise. The\n // internal state is kept either way, so a block that switches between the\n // two mid-life does not lose the box, and the callback fires in both modes.\n const [uncontrolledTerms, setUncontrolledTerms] =\n React.useState(defaultTermsChecked);\n const terms = termsChecked ?? uncontrolledTerms;\n\n function handleTermsChange(checked: boolean) {\n if (termsChecked === undefined) setUncontrolledTerms(checked);\n onTermsCheckedChange?.(checked);\n }\n // Tracked from each input's own constraint validation rather than a regex.\n // The values stay uncontrolled — only validity is needed, and the form reads\n // values from FormData on submit.\n const [emailValid, setEmailValid] = React.useState(false);\n const [nameValid, setNameValid] = React.useState(false);\n\n const busy = status === \"loading\" || loadingProvider !== null;\n const strongEnough =\n !enforceStrongPassword ||\n getPasswordStrength(password) === passwordRequirements.length;\n\n // The social providers retire once the email path is filled in and valid —\n // the user has committed to a path, so the alternatives are just noise. It\n // comes back if they invalidate a field again.\n const passwordValid = password.trim().length > 0 && strongEnough;\n const emailPathComplete =\n (!showNameField || nameValid) && emailValid && passwordValid;\n\n async function handleSubmit(event: React.SubmitEvent<HTMLFormElement>) {\n event.preventDefault();\n setError(null);\n if (!strongEnough) {\n setError(\"Please meet all password requirements.\");\n return;\n }\n if (showTerms && !terms) {\n setError(\"Please accept the terms to continue.\");\n return;\n }\n const form = new FormData(event.currentTarget);\n setStatus(\"loading\");\n try {\n await onSubmit?.({\n name: String(form.get(\"name\") ?? \"\"),\n email: String(form.get(\"email\") ?? \"\"),\n password,\n });\n setStatus(\"success\");\n } catch (cause) {\n setStatus(\"idle\");\n setError(\n cause instanceof Error ? cause.message : \"Unable to create account.\",\n );\n }\n }\n\n async function handleProvider(provider: SocialProvider) {\n setError(null);\n setLoadingProvider(provider);\n try {\n await onProviderSelect?.(provider);\n setStatus(\"success\");\n } catch (cause) {\n setError(\n cause instanceof Error ? cause.message : \"Unable to create account.\",\n );\n } finally {\n setLoadingProvider(null);\n }\n }\n\n return (\n <AuthCard\n title={title}\n description={description}\n logo={logo}\n accent={accent}\n footer={\n status !== \"success\" && (\n <>\n Already have an account?{\" \"}\n <Button variant=\"link\" onClick={onLogin}>\n Login\n </Button>\n </>\n )\n }\n >\n <MorphStep step={status === \"success\" ? \"success\" : \"form\"}>\n {status === \"success\" ? (\n <AuthSuccess\n title=\"Account created\"\n description=\"Check your inbox to confirm your email address.\"\n />\n ) : (\n <div className=\"flex flex-col gap-4\">\n {providers.length > 0 && (\n // gap-4 on the wrapper reproduces the spacing the two children\n // had as direct flex items of the column above.\n <Reveal show={!emailPathComplete} className=\"flex flex-col gap-4\">\n <SocialProviders\n providers={providers}\n action=\"signup\"\n loadingProvider={loadingProvider}\n disabled={status === \"loading\"}\n onSelect={handleProvider}\n />\n <AuthSeparator label=\"Or with email\" />\n </Reveal>\n )}\n <form className=\"flex flex-col gap-4\" onSubmit={handleSubmit}>\n {showNameField && (\n <Field name=\"name\">\n <FieldLabel htmlFor={nameId}>Name</FieldLabel>\n <Input\n aria-label=\"Name\"\n id={nameId}\n name=\"name\"\n autoComplete=\"name\"\n placeholder=\"Your name\"\n required\n disabled={busy}\n onChange={(event) =>\n setNameValid(event.currentTarget.validity.valid)\n }\n />\n </Field>\n )}\n <Field name=\"email\">\n <FieldLabel htmlFor={emailId}>Email</FieldLabel>\n <Input\n id={emailId}\n name=\"email\"\n type=\"email\"\n aria-label=\"Email\"\n autoComplete=\"email\"\n placeholder=\"you@example.com\"\n required\n disabled={busy}\n onChange={(event) =>\n setEmailValid(event.currentTarget.validity.valid)\n }\n />\n </Field>\n <Reveal show={emailValid}>\n <Field name=\"password\">\n <FieldLabel htmlFor={passwordId}>Password</FieldLabel>\n <PasswordInput\n id={passwordId}\n name=\"password\"\n aria-label=\"Password\"\n autoComplete=\"new-password\"\n placeholder=\"Create a password\"\n showStrength\n required\n disabled={busy}\n value={password}\n onChange={(event) => setPassword(event.target.value)}\n />\n </Field>\n </Reveal>\n {showTerms && (\n <div className=\"flex items-center gap-2\">\n <Checkbox\n id={termsId}\n checked={terms}\n onCheckedChange={(checked) =>\n handleTermsChange(checked === true)\n }\n disabled={busy}\n />\n <Label htmlFor={termsId} className=\"font-normal\">\n I agree to the{\" \"}\n {termsComponent ?? (\n <Button variant=\"link\" type=\"button\" onClick={onTerms}>\n terms\n </Button>\n )}\n </Label>\n </div>\n )}\n <AuthError message={error} />\n <Button\n className={cn(\"w-full\", accent && authAccentActionStyles)}\n type=\"submit\"\n loading={status === \"loading\"}\n disabled={busy}\n >\n Create account\n </Button>\n </form>\n </div>\n )}\n </MorphStep>\n </AuthCard>\n );\n}\n","\"use client\";\n\nimport * as React from \"react\";\n\nimport {\n getPasswordStrength,\n PasswordInput,\n} from \"@/components/composed/password-input\";\nimport { Button } from \"@/components/ui/button\";\nimport { Field, FieldLabel } from \"@/components/ui/field\";\nimport { type AuthAccent, authAccentActionStyles } from \"@/lib/auth-accent\";\nimport { cn } from \"@/lib/utils\";\nimport {\n AuthCard,\n AuthError,\n AuthSuccess,\n MorphStep,\n Reveal,\n type AuthStatus,\n} from \"./auth-shell\";\n\nexport interface UpdatePasswordBlockProps {\n title?: string;\n description?: string;\n /** Brand mark rendered above the title. Omit for no logo row at all. */\n logo?: React.ReactNode;\n /** Brand accent for the primary action. Omit to keep the default primary. */\n accent?: AuthAccent;\n /**\n * Minimum strength (0-4, as scored by `getPasswordStrength`) the new\n * password must reach before the confirm field is revealed. 0 disables the\n * gate.\n */\n minStrength?: number;\n /** Reject (or throw) to show the error state with the error's message. */\n onSubmit?: (data: { password: string }) => Promise<void> | void;\n onDone?: () => void;\n}\n\n/**\n * Password change form for an already-authenticated user: a strength-metered\n * new password gates the confirm field, which in turn gates the submit\n * button. Mismatch is caught client-side; everything else comes back as a\n * rejection from `onSubmit`.\n */\nexport function UpdatePasswordBlock({\n title = \"Update your password\",\n description = \"Choose a new password for your account\",\n logo,\n accent,\n minStrength = 4,\n onSubmit,\n onDone,\n}: UpdatePasswordBlockProps) {\n const passwordId = React.useId();\n const confirmId = React.useId();\n const [status, setStatus] = React.useState<AuthStatus>(\"idle\");\n const [error, setError] = React.useState<string | null>(null);\n const [password, setPassword] = React.useState(\"\");\n const [confirmPassword, setConfirmPassword] = React.useState(\"\");\n\n // Progressive disclosure, matching the signup block: the confirm field\n // appears once the new password clears the policy, the submit button once\n // the two match.\n const strongEnough = getPasswordStrength(password) >= minStrength;\n const matches = confirmPassword.length > 0 && confirmPassword === password;\n const canSubmit = strongEnough && matches;\n\n // Only flag a mismatch once the confirmation has diverged — while it is\n // still a prefix of the new password the user is simply mid-keystroke, and\n // nagging on every character would shake the field the whole way through.\n const mismatch =\n confirmPassword.length > 0 && !password.startsWith(confirmPassword);\n\n async function handleSubmit(event: React.FormEvent<HTMLFormElement>) {\n event.preventDefault();\n // Enter in any field submits the form even while the button is hidden.\n if (!canSubmit) return;\n setError(null);\n setStatus(\"loading\");\n try {\n await onSubmit?.({ password });\n setStatus(\"success\");\n } catch (cause) {\n setStatus(\"idle\");\n setError(\n cause instanceof Error ? cause.message : \"Unable to update password.\",\n );\n }\n }\n\n return (\n <AuthCard\n title={title}\n description={description}\n logo={logo}\n accent={accent}\n >\n <MorphStep step={status === \"success\" ? \"success\" : \"form\"}>\n {status === \"success\" ? (\n <AuthSuccess\n title=\"Password updated\"\n description=\"Your password has been changed successfully.\"\n >\n {onDone && (\n <Button variant=\"link\" onClick={onDone}>\n Continue\n </Button>\n )}\n </AuthSuccess>\n ) : (\n <form className=\"flex flex-col gap-4\" onSubmit={handleSubmit}>\n <Field name=\"password\">\n <FieldLabel htmlFor={passwordId}>New password</FieldLabel>\n <PasswordInput\n id={passwordId}\n name=\"password\"\n autoComplete=\"new-password\"\n required\n showStrength\n disabled={status === \"loading\"}\n value={password}\n onChange={(event) => setPassword(event.target.value)}\n />\n </Field>\n <Reveal show={strongEnough}>\n <Field name=\"confirmPassword\">\n <FieldLabel htmlFor={confirmId}>Confirm new password</FieldLabel>\n <PasswordInput\n id={confirmId}\n name=\"confirmPassword\"\n autoComplete=\"new-password\"\n required\n disabled={status === \"loading\"}\n value={confirmPassword}\n onChange={(event) => setConfirmPassword(event.target.value)}\n />\n </Field>\n </Reveal>\n <AuthError\n message={error ?? (mismatch ? \"Passwords do not match.\" : null)}\n />\n <Reveal show={canSubmit}>\n <Button\n className={cn(\"w-full\", accent && authAccentActionStyles)}\n type=\"submit\"\n loading={status === \"loading\"}\n >\n Update password\n </Button>\n </Reveal>\n </form>\n )}\n </MorphStep>\n </AuthCard>\n );\n}\n","export const EASE_OUT = [0.16, 1, 0.3, 1] as const;\nexport const EASE_IN_OUT = [0.77, 0, 0.175, 1] as const;\nexport const EASE_DRAWER = [0.32, 0.72, 0, 1] as const;\n\n/** CSS string form of EASE_OUT for inline style transitions. */\nexport const EASE_OUT_CSS = \"cubic-bezier(0.16, 1, 0.3, 1)\";\n\n/** Press feedback on buttons and other tappable surfaces. */\nexport const SPRING_PRESS = {\n type: \"spring\",\n stiffness: 500,\n damping: 30,\n mass: 0.6,\n} as const;\n\n/** Content swaps — label/icon slots trading places inside a control. */\nexport const SPRING_SWAP = {\n type: \"spring\",\n stiffness: 460,\n damping: 30,\n mass: 0.55,\n} as const;\n\n/** Overlay panel entrances — modals and sheets summoned by pointer. */\nexport const SPRING_PANEL = {\n type: \"spring\",\n stiffness: 420,\n damping: 40,\n mass: 0.5,\n} as const;\n\n/** Shared-layout glides — pills, indicators and panels morphing between positions. */\nexport const SPRING_LAYOUT = {\n type: \"spring\",\n stiffness: 360,\n damping: 32,\n mass: 0.6,\n} as const;\n\n/** Cursor-follow physics for decorative mouse tracking (magnetic, tilt, dock). */\nexport const SPRING_MOUSE = {\n stiffness: 200,\n damping: 15,\n mass: 0.3,\n} as const;\n\n/** Dragged handles and fills (sliders) — critically damped `useSpring` config,\n * so the value follows the pointer butterily and never rebounds off an end. */\nexport const SPRING_GLIDE = {\n stiffness: 700,\n damping: 50,\n mass: 0.5,\n} as const;\n","\"use client\";\n\nimport {\n AnimatePresence,\n type HTMLMotionProps,\n motion,\n useReducedMotion,\n type Variants,\n} from \"motion/react\";\nimport {\n Children,\n cloneElement,\n forwardRef,\n type HTMLAttributes,\n isValidElement,\n type MouseEvent,\n type ReactElement,\n type ReactNode,\n type Ref,\n useId,\n useState,\n} from \"react\";\nimport { SPRING_LAYOUT } from \"@/lib/ease\";\nimport { cn } from \"@/lib/utils\";\n\nexport interface SharedLayoutBgProps\n extends Omit<HTMLAttributes<HTMLElement>, \"children\"> {\n children: ReactNode;\n /** Semantic container used for the children. */\n as?: \"div\" | \"ul\";\n /** Tailwind class applied to the moving pill. Defaults to a subtle foreground tint. */\n pillClassName?: string;\n /** Horizontal inset of the pill relative to each row (px). Default 20. */\n inset?: number;\n /** Optional positioning override for the pill wrapper inside each item. */\n pillContainerClassName?: string;\n}\n\nconst variants: Variants = {\n initial: { opacity: 0, filter: \"blur(6px)\" },\n animate: { opacity: 1, filter: \"blur(0px)\" },\n exit: (isActive: boolean) =>\n !isActive ? { opacity: 0, filter: \"blur(6px)\" } : {},\n};\n\nconst reducedVariants: Variants = {\n initial: { opacity: 0 },\n animate: { opacity: 1 },\n exit: (isActive: boolean) => (!isActive ? { opacity: 0 } : {}),\n};\n\nexport const SharedLayoutBg = forwardRef<HTMLElement, SharedLayoutBgProps>(\n function SharedLayoutBg(\n {\n children,\n as = \"div\",\n className,\n onMouseLeave,\n pillClassName,\n pillContainerClassName,\n inset = 20,\n ...props\n },\n forwardedRef,\n ) {\n const [activeId, setActiveId] = useState<string | null>(null);\n const uid = useId();\n const reduce = useReducedMotion();\n\n const renderedChildren = Children.toArray(children)\n .filter(isValidElement)\n .map((child, index) => {\n const el = child as ReactElement<{\n className?: string;\n onMouseEnter?: () => void;\n children?: ReactNode;\n }>;\n const childKey = el.key ? String(el.key) : `item-${index}`;\n return cloneElement(\n el,\n {\n key: childKey,\n className: cn(\"relative\", el.props.className),\n onMouseEnter: () => {\n el.props.onMouseEnter?.();\n setActiveId(childKey);\n },\n },\n <>\n <AnimatePresence custom={activeId !== null}>\n {activeId !== null ? (\n <motion.div\n variants={reduce ? reducedVariants : variants}\n initial=\"initial\"\n animate=\"animate\"\n exit=\"exit\"\n custom={activeId !== null}\n className={cn(\n \"pointer-events-none absolute inset-y-0\",\n pillContainerClassName,\n )}\n style={{ left: -inset, right: -inset }}\n >\n {activeId === childKey ? (\n <motion.div\n layoutId={`shared-bg-${uid}`}\n transition={reduce ? { duration: 0 } : SPRING_LAYOUT}\n className={cn(\n \"pointer-events-none h-full w-full rounded-2xl bg-primary/[0.06]\",\n pillClassName,\n )}\n />\n ) : null}\n </motion.div>\n ) : null}\n </AnimatePresence>\n <div className=\"relative z-10\">{el.props.children}</div>\n </>,\n );\n });\n\n const handleMouseLeave = (event: MouseEvent<HTMLElement>) => {\n setActiveId(null);\n onMouseLeave?.(event);\n };\n\n // layoutRoot scopes the pill's layout projection to this list, so fixed or\n // scrolled ancestors can't smear scroll offsets into its movement.\n return as === \"ul\" ? (\n <motion.ul\n {...(props as HTMLMotionProps<\"ul\">)}\n ref={forwardedRef as Ref<HTMLUListElement>}\n layoutRoot\n onMouseLeave={handleMouseLeave}\n className={cn(\"flex w-full flex-col\", className)}\n >\n {renderedChildren}\n </motion.ul>\n ) : (\n <motion.div\n {...(props as HTMLMotionProps<\"div\">)}\n ref={forwardedRef as Ref<HTMLDivElement>}\n layoutRoot\n onMouseLeave={handleMouseLeave}\n className={cn(\"flex w-full flex-col\", className)}\n >\n {renderedChildren}\n </motion.div>\n );\n },\n);\n","\"use client\"\n// beui.dev/components/motion/animated-sidebar\n\nimport { ChevronRight } from \"lucide-react\"\nimport {\n AnimatePresence,\n type HTMLMotionProps,\n motion,\n useReducedMotion,\n type Variants,\n} from \"motion/react\"\nimport {\n type ButtonHTMLAttributes,\n type CSSProperties,\n createContext,\n forwardRef,\n type HTMLAttributes,\n type ReactNode,\n useCallback,\n useContext,\n useEffect,\n useId,\n useRef,\n useState,\n useSyncExternalStore,\n} from \"react\"\nimport { createPortal } from \"react-dom\"\nimport { SharedLayoutBg } from \"@/components/motion/shared-layout-bg\"\nimport { EASE_DRAWER, EASE_OUT, SPRING_LAYOUT, SPRING_PRESS } from \"@/lib/ease\"\nimport { cn } from \"@/lib/utils\"\n\ntype SidebarState = \"expanded\" | \"collapsed\"\ntype SidebarSide = \"left\" | \"right\"\ntype SidebarVariant = \"sidebar\" | \"floating\" | \"inset\"\ntype SidebarCollapsible = \"offcanvas\" | \"icon\" | \"none\"\n\nconst MOBILE_QUERY = \"(max-width: 767px)\"\nconst SIDEBAR_KEYBOARD_SHORTCUT = \"b\"\n\nconst PANEL_TRANSITION = {\n duration: 0.36,\n ease: EASE_DRAWER,\n} as const\n\n// The desktop rail settles at a hard zero-width boundary. Keep the spring\n// critically damped so it cannot overshoot, pause against that boundary, and\n// then snap back during the final frame.\nconst SIDEBAR_MORPH_TRANSITION = {\n type: \"spring\",\n stiffness: 380,\n damping: 35,\n mass: 0.75,\n} as const\n\nconst LABEL_ENTER_TRANSITION = {\n duration: 0.2,\n delay: 0.08,\n ease: EASE_OUT,\n} as const\n\nconst LABEL_EXIT_TRANSITION = {\n duration: 0.12,\n ease: EASE_OUT,\n} as const\n\nconst SUBMENU_TRANSITION = {\n duration: 0.18,\n ease: EASE_OUT,\n} as const\n\nconst SUBMENU_VARIANTS: Variants = {\n closed: {\n opacity: 0,\n clipPath: \"inset(0 0 100% 0 round 8px)\",\n transition: {\n duration: 0.14,\n ease: EASE_OUT,\n staggerChildren: 0.025,\n staggerDirection: -1,\n },\n },\n open: {\n opacity: 1,\n clipPath: \"inset(0 0 0% 0 round 8px)\",\n transition: {\n duration: 0.2,\n delayChildren: 0.035,\n ease: EASE_OUT,\n staggerChildren: 0.045,\n },\n },\n}\n\nconst SUBMENU_ITEM_VARIANTS: Variants = {\n closed: {\n opacity: 0,\n y: -6,\n filter: \"blur(3px)\",\n },\n open: {\n opacity: 1,\n y: 0,\n filter: \"blur(0px)\",\n transition: SUBMENU_TRANSITION,\n },\n}\n\nconst REDUCED_TRANSITION = {\n duration: 0.16,\n ease: EASE_OUT,\n} as const\n\nconst FOCUSABLE_SELECTOR = [\n \"a[href]\",\n \"button:not([disabled])\",\n \"input:not([disabled])\",\n \"select:not([disabled])\",\n \"textarea:not([disabled])\",\n \"[tabindex]:not([tabindex='-1'])\",\n].join(\",\")\n\nfunction subscribeToMobileQuery(callback: () => void) {\n const query = window.matchMedia(MOBILE_QUERY)\n query.addEventListener(\"change\", callback)\n return () => query.removeEventListener(\"change\", callback)\n}\n\nfunction getMobileSnapshot() {\n return window.matchMedia(MOBILE_QUERY).matches\n}\n\nfunction getServerMobileSnapshot() {\n return false\n}\n\nfunction useIsMobile() {\n return useSyncExternalStore(\n subscribeToMobileQuery,\n getMobileSnapshot,\n getServerMobileSnapshot\n )\n}\n\ninterface AnimatedSidebarContextValue {\n isMobile: boolean\n layoutId: string\n open: boolean\n openMobile: boolean\n /** The right panel is a single hidden/shown state — no icon rail, no\n * separate mobile state. */\n openRight: boolean\n reduce: boolean\n setOpen: (open: boolean) => void\n setOpenMobile: (open: boolean) => void\n setOpenRight: (open: boolean) => void\n state: SidebarState\n toggleSidebar: () => void\n toggleRightSidebar: () => void\n triggerRef: React.RefObject<HTMLButtonElement | null>\n rightTriggerRef: React.RefObject<HTMLButtonElement | null>\n}\n\nconst AnimatedSidebarContext =\n createContext<AnimatedSidebarContextValue | null>(null)\n\ninterface AnimatedSidebarPanelContextValue {\n collapsed: boolean\n collapsible: SidebarCollapsible\n side: SidebarSide\n}\n\nconst AnimatedSidebarPanelContext =\n createContext<AnimatedSidebarPanelContextValue | null>(null)\n\nexport function useAnimatedSidebar() {\n const context = useContext(AnimatedSidebarContext)\n if (!context) {\n throw new Error(\n \"useAnimatedSidebar must be used inside AnimatedSidebarProvider.\"\n )\n }\n return context\n}\n\nfunction useAnimatedSidebarPanel() {\n const context = useContext(AnimatedSidebarPanelContext)\n if (!context) {\n throw new Error(\n \"Animated Sidebar parts must be used inside AnimatedSidebar.\"\n )\n }\n return context\n}\n\ntype SidebarProviderStyle = CSSProperties & {\n \"--sidebar-width\"?: string\n \"--sidebar-width-icon\"?: string\n \"--sidebar-width-mobile\"?: string\n}\n\nexport interface AnimatedSidebarProviderProps extends HTMLAttributes<HTMLDivElement> {\n open?: boolean\n defaultOpen?: boolean\n onOpenChange?: (open: boolean) => void\n openMobile?: boolean\n defaultOpenMobile?: boolean\n onOpenMobileChange?: (open: boolean) => void\n openRight?: boolean\n defaultOpenRight?: boolean\n onOpenRightChange?: (open: boolean) => void\n style?: SidebarProviderStyle\n}\n\nexport function AnimatedSidebarProvider({\n children,\n open,\n defaultOpen = true,\n onOpenChange,\n openMobile,\n defaultOpenMobile = false,\n onOpenMobileChange,\n openRight,\n defaultOpenRight = false,\n onOpenRightChange,\n className,\n style,\n ...props\n}: AnimatedSidebarProviderProps) {\n const [internalOpen, setInternalOpen] = useState(defaultOpen)\n const [internalOpenMobile, setInternalOpenMobile] =\n useState(defaultOpenMobile)\n const [internalOpenRight, setInternalOpenRight] = useState(defaultOpenRight)\n const isMobile = useIsMobile()\n const reduce = useReducedMotion() ?? false\n const generatedId = useId()\n const triggerRef = useRef<HTMLButtonElement>(null)\n const rightTriggerRef = useRef<HTMLButtonElement>(null)\n const desktopOpen = open ?? internalOpen\n const mobileOpen = openMobile ?? internalOpenMobile\n const rightOpen = openRight ?? internalOpenRight\n\n const setOpen = useCallback(\n (nextOpen: boolean) => {\n if (open === undefined) setInternalOpen(nextOpen)\n onOpenChange?.(nextOpen)\n },\n [onOpenChange, open]\n )\n\n const setOpenMobile = useCallback(\n (nextOpen: boolean) => {\n if (openMobile === undefined) setInternalOpenMobile(nextOpen)\n onOpenMobileChange?.(nextOpen)\n },\n [onOpenMobileChange, openMobile]\n )\n\n const setOpenRight = useCallback(\n (nextOpen: boolean) => {\n if (openRight === undefined) setInternalOpenRight(nextOpen)\n onOpenRightChange?.(nextOpen)\n },\n [onOpenRightChange, openRight]\n )\n\n const toggleSidebar = useCallback(() => {\n if (isMobile) setOpenMobile(!mobileOpen)\n else setOpen(!desktopOpen)\n }, [desktopOpen, isMobile, mobileOpen, setOpen, setOpenMobile])\n\n const toggleRightSidebar = useCallback(() => {\n setOpenRight(!rightOpen)\n }, [rightOpen, setOpenRight])\n\n useEffect(() => {\n const handleShortcut = (event: KeyboardEvent) => {\n if (\n event.key.toLowerCase() === SIDEBAR_KEYBOARD_SHORTCUT &&\n (event.metaKey || event.ctrlKey)\n ) {\n event.preventDefault()\n toggleSidebar()\n }\n }\n\n window.addEventListener(\"keydown\", handleShortcut)\n return () => window.removeEventListener(\"keydown\", handleShortcut)\n }, [toggleSidebar])\n\n return (\n <AnimatedSidebarContext.Provider\n value={{\n isMobile,\n layoutId: `${generatedId}-active`,\n open: desktopOpen,\n openMobile: mobileOpen,\n openRight: rightOpen,\n reduce,\n setOpen,\n setOpenMobile,\n setOpenRight,\n state: desktopOpen ? \"expanded\" : \"collapsed\",\n toggleSidebar,\n toggleRightSidebar,\n triggerRef,\n rightTriggerRef,\n }}\n >\n <div\n {...props}\n data-slot=\"sidebar-wrapper\"\n data-state={desktopOpen ? \"expanded\" : \"collapsed\"}\n data-right-state={rightOpen ? \"expanded\" : \"collapsed\"}\n style={{\n \"--sidebar-width\": \"19rem\",\n \"--sidebar-width-icon\": \"4.25rem\",\n \"--sidebar-width-mobile\": \"18rem\",\n ...style,\n }}\n className={cn(\n \"group/sidebar-wrapper flex min-h-svh w-full min-w-0\",\n className\n )}\n >\n {children}\n </div>\n </AnimatedSidebarContext.Provider>\n )\n}\n\nfunction MobileSidebar({\n ariaLabel,\n children,\n className,\n side,\n}: {\n ariaLabel: string\n children: ReactNode\n className?: string\n side: SidebarSide\n}) {\n const context = useAnimatedSidebar()\n const isRight = side === \"right\"\n const open = isRight ? context.openRight : context.openMobile\n const setOpen = isRight ? context.setOpenRight : context.setOpenMobile\n const triggerRef = isRight ? context.rightTriggerRef : context.triggerRef\n const panelRef = useRef<HTMLDivElement>(null)\n const [mounted, setMounted] = useState(false)\n\n useEffect(() => setMounted(true), [])\n\n useEffect(() => {\n if (!open) return\n\n const body = document.body\n const scrollY = window.scrollY\n const trigger = triggerRef.current\n const previousBodyStyles = {\n left: body.style.left,\n overflow: body.style.overflow,\n position: body.style.position,\n right: body.style.right,\n top: body.style.top,\n }\n\n body.style.position = \"fixed\"\n body.style.top = `-${scrollY}px`\n body.style.left = \"0\"\n body.style.right = \"0\"\n body.style.overflow = \"hidden\"\n\n const focusFrame = requestAnimationFrame(() => {\n const firstFocusable =\n panelRef.current?.querySelector<HTMLElement>(FOCUSABLE_SELECTOR)\n ;(firstFocusable ?? panelRef.current)?.focus({ preventScroll: true })\n })\n\n return () => {\n cancelAnimationFrame(focusFrame)\n body.style.position = previousBodyStyles.position\n body.style.top = previousBodyStyles.top\n body.style.left = previousBodyStyles.left\n body.style.right = previousBodyStyles.right\n body.style.overflow = previousBodyStyles.overflow\n window.scrollTo(0, scrollY)\n trigger?.focus({ preventScroll: true })\n }\n }, [open, triggerRef])\n\n if (!mounted) return null\n\n return createPortal(\n <div\n className={cn(\n \"pointer-events-none fixed inset-0 z-50 md:hidden\",\n open ? \"visible\" : \"invisible\"\n )}\n >\n <motion.button\n type=\"button\"\n aria-label=\"Close sidebar\"\n tabIndex={open ? 0 : -1}\n initial={false}\n animate={{ opacity: open ? 1 : 0 }}\n transition={context.reduce ? REDUCED_TRANSITION : PANEL_TRANSITION}\n onClick={() => setOpen(false)}\n className={cn(\n \"absolute inset-0\",\n open ? \"pointer-events-auto\" : \"pointer-events-none\"\n )}\n />\n\n <motion.div\n ref={panelRef}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={ariaLabel}\n aria-hidden={!open}\n inert={!open}\n tabIndex={-1}\n data-mobile=\"true\"\n data-state={open ? \"expanded\" : \"collapsed\"}\n data-side={side}\n initial={false}\n animate={{\n opacity: context.reduce ? (open ? 1 : 0) : 1,\n x: context.reduce\n ? 0\n : open\n ? \"0%\"\n : side === \"left\"\n ? \"-100%\"\n : \"100%\",\n }}\n transition={context.reduce ? REDUCED_TRANSITION : PANEL_TRANSITION}\n onKeyDown={(event) => {\n if (event.key === \"Escape\") {\n event.preventDefault()\n setOpen(false)\n return\n }\n\n if (event.key !== \"Tab\") return\n const focusable = panelRef.current\n ? Array.from(\n panelRef.current.querySelectorAll<HTMLElement>(\n FOCUSABLE_SELECTOR\n )\n )\n : []\n\n if (focusable.length === 0) {\n event.preventDefault()\n panelRef.current?.focus()\n return\n }\n\n const first = focusable[0]\n const last = focusable[focusable.length - 1]\n if (event.shiftKey && document.activeElement === first) {\n event.preventDefault()\n last.focus()\n } else if (!event.shiftKey && document.activeElement === last) {\n event.preventDefault()\n first.focus()\n }\n }}\n className={cn(\n \"pointer-events-auto absolute inset-y-0 flex h-dvh w-(--sidebar-width-mobile) max-w-[88vw] flex-col overflow-hidden\",\n \"will-change-transform\",\n side === \"left\" ? \"left-0 border-r\" : \"right-0\",\n !open && \"pointer-events-none\",\n className\n )}\n >\n <AnimatedSidebarPanelContext.Provider\n value={{ collapsed: false, collapsible: \"none\", side }}\n >\n {children}\n </AnimatedSidebarPanelContext.Provider>\n </motion.div>\n </div>,\n document.body\n )\n}\n\nexport interface AnimatedSidebarProps extends Omit<\n HTMLMotionProps<\"aside\">,\n \"children\"\n> {\n children?: ReactNode\n side?: SidebarSide\n variant?: SidebarVariant\n collapsible?: SidebarCollapsible\n ariaLabel?: string\n panelClassName?: string\n}\n\nexport const AnimatedSidebar = forwardRef<HTMLElement, AnimatedSidebarProps>(\n function AnimatedSidebar(\n {\n side = \"left\",\n variant = \"sidebar\",\n collapsible = \"icon\",\n ariaLabel = \"Sidebar\",\n children,\n className,\n panelClassName,\n style,\n ...props\n },\n forwardedRef\n ) {\n const context = useAnimatedSidebar()\n const sideOpen = side === \"right\" ? context.openRight : context.open\n const collapsed = collapsible !== \"none\" && !sideOpen\n const offcanvas = collapsed && collapsible === \"offcanvas\"\n const width = offcanvas\n ? \"0px\"\n : collapsed\n ? \"var(--sidebar-width-icon)\"\n : \"var(--sidebar-width)\"\n\n if (context.isMobile) {\n return (\n <MobileSidebar ariaLabel={ariaLabel} className={className} side={side}>\n {children}\n </MobileSidebar>\n )\n }\n\n return (\n <motion.aside\n {...props}\n ref={forwardedRef}\n initial={false}\n aria-label={ariaLabel}\n data-slot=\"sidebar\"\n data-state={collapsed ? \"collapsed\" : \"expanded\"}\n data-collapsible={collapsible}\n data-variant={variant}\n data-side={side}\n animate={{ width }}\n transition={context.reduce ? { duration: 0 } : SIDEBAR_MORPH_TRANSITION}\n style={style}\n className={cn(\n \"group/sidebar relative hidden h-auto shrink-0 will-change-[width] md:block\",\n \"peer flex!\",\n // The offcanvas panel keeps its full width and slides out of the\n // zero-width rail, so clip it rather than letting it bleed past the\n // shell edge. The clip margin lets the panel's own shadow escape\n // without letting the slid-out panel escape with it\n collapsible === \"offcanvas\" &&\n \"overflow-x-visible [overflow-clip-margin:1rem]\",\n side === \"right\" && \"order-last\",\n className\n )}\n >\n {side === \"right\" && !collapsed && (\n <motion.div className=\"h-full p-0.5 flex flex-1 bg-radial/decreasing from-amber-400 to-0% hover:to-50% ease-smooth-out to-amber-500/0 cursor-col-resize transition-colors duration-1000 animate-in\" />\n )}\n <motion.div\n initial={false}\n animate={{\n opacity: offcanvas ? 0 : 1,\n x: offcanvas ? (side === \"left\" ? \"-100%\" : \"100%\") : \"0%\",\n }}\n transition={context.reduce ? REDUCED_TRANSITION : PANEL_TRANSITION}\n className={cn(\n \"sticky top-0 flex h-svh w-full flex-col overflow-hidden\",\n collapsible === \"offcanvas\" && \"w-[var(--sidebar-width)]\",\n\n variant === \"floating\" && \"m-2 h-[calc(100svh-1rem)]\",\n variant === \"inset\" && \"m-2 h-[calc(100svh-1rem)]\",\n panelClassName\n )}\n >\n <AnimatedSidebarPanelContext.Provider\n value={{ collapsed, collapsible, side }}\n >\n {children}\n </AnimatedSidebarPanelContext.Provider>\n </motion.div>\n </motion.aside>\n )\n }\n)\n\nexport interface AnimatedSidebarTriggerProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n side?: SidebarSide\n}\n\nexport const AnimatedSidebarTrigger = forwardRef<\n HTMLButtonElement,\n AnimatedSidebarTriggerProps\n>(function AnimatedSidebarTrigger(\n { className, onClick, side = \"left\", type = \"button\", ...props },\n forwardedRef\n) {\n const context = useAnimatedSidebar()\n const isRight = side === \"right\"\n const expanded = isRight\n ? context.openRight\n : context.isMobile\n ? context.openMobile\n : context.open\n const triggerRef = isRight ? context.rightTriggerRef : context.triggerRef\n\n return (\n <button\n {...props}\n ref={(node) => {\n triggerRef.current = node\n if (typeof forwardedRef === \"function\") forwardedRef(node)\n else if (forwardedRef) forwardedRef.current = node\n }}\n type={type}\n aria-label={props[\"aria-label\"] ?? \"Toggle sidebar\"}\n aria-expanded={expanded}\n data-slot=\"sidebar-trigger\"\n data-side={side}\n data-state={expanded ? \"expanded\" : \"collapsed\"}\n onClick={(event) => {\n onClick?.(event)\n if (event.defaultPrevented) return\n if (isRight) context.toggleRightSidebar()\n else context.toggleSidebar()\n }}\n className={cn(\n \"inline-flex size-10 shrink-0 items-center justify-center rounded-xl outline-none\",\n \"focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background\",\n className\n )}\n />\n )\n})\n\nexport interface AnimatedSidebarCloseProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n side?: SidebarSide\n}\n\nexport const AnimatedSidebarClose = forwardRef<\n HTMLButtonElement,\n AnimatedSidebarCloseProps\n>(function AnimatedSidebarClose(\n { className, onClick, side = \"left\", type = \"button\", ...props },\n forwardedRef\n) {\n const context = useAnimatedSidebar()\n\n return (\n <button\n {...props}\n ref={forwardedRef}\n type={type}\n data-side={side}\n aria-label={props[\"aria-label\"] ?? \"Close sidebar\"}\n onClick={(event) => {\n onClick?.(event)\n if (event.defaultPrevented) return\n if (side === \"right\") context.setOpenRight(false)\n else if (context.isMobile) context.setOpenMobile(false)\n else context.setOpen(false)\n }}\n className={cn(\n \"inline-flex size-10 shrink-0 items-center justify-center rounded-xl outline-none\",\n \"focus-visible:ring-2 focus-visible:ring-ring\",\n className\n )}\n />\n )\n})\n\nexport interface AnimatedSidebarRailProps extends ButtonHTMLAttributes<HTMLButtonElement> {}\n\nexport const AnimatedSidebarRail = forwardRef<\n HTMLButtonElement,\n AnimatedSidebarRailProps\n>(function AnimatedSidebarRail(\n { className, onClick, type = \"button\", ...props },\n forwardedRef\n) {\n const context = useAnimatedSidebar()\n const panel = useAnimatedSidebarPanel()\n\n return (\n <button\n {...props}\n ref={forwardedRef}\n type={type}\n data-side={panel.side}\n aria-label={props[\"aria-label\"] ?? \"Toggle sidebar\"}\n title=\"Toggle sidebar\"\n tabIndex={-1}\n onClick={(event) => {\n onClick?.(event)\n if (event.defaultPrevented) return\n if (panel.side === \"right\") context.toggleRightSidebar()\n else context.toggleSidebar()\n }}\n className={cn(\n \"absolute inset-y-0 z-20 hidden w-4 -translate-x-1/2 outline-none md:block\",\n \"after:absolute after:inset-y-0 after:left-1/2 after:w-px after:bg-transparent after:transition-colors hover:after:bg-border\",\n \"data-[side=left]:left-full data-[side=right]:right-0 data-[side=right]:translate-x-1/2\",\n className\n )}\n />\n )\n})\n\nexport interface AnimatedSidebarInsetProps extends HTMLMotionProps<\"main\"> {}\n\nexport const AnimatedSidebarInset = forwardRef<\n HTMLElement,\n AnimatedSidebarInsetProps\n>(function AnimatedSidebarInset({ className, ...props }, forwardedRef) {\n return (\n <motion.main\n {...props}\n ref={forwardedRef}\n data-slot=\"sidebar-inset\"\n className={cn(\n \"relative flex min-w-0 flex-1 flex-col bg-background\",\n \"md:peer-data-[variant=inset]:m-2 md:peer-data-[variant=inset]:ml-0 md:peer-data-[variant=inset]:mr-1.5 md:peer-data-[variant=inset]:rounded-md md:peer-data-[variant=inset]:shadow-md\",\n className\n )}\n />\n )\n})\n\nexport const AnimatedSidebarHeader = forwardRef<\n HTMLDivElement,\n HTMLAttributes<HTMLDivElement>\n>(function AnimatedSidebarHeader({ className, ...props }, forwardedRef) {\n return (\n <div\n {...props}\n ref={forwardedRef}\n data-slot=\"sidebar-header\"\n className={cn(\"flex shrink-0 flex-col gap-2 p-3\", className)}\n />\n )\n})\n\nexport const AnimatedSidebarContent = forwardRef<\n HTMLDivElement,\n HTMLAttributes<HTMLDivElement>\n>(function AnimatedSidebarContent({ className, ...props }, forwardedRef) {\n return (\n <div\n {...props}\n ref={forwardedRef}\n data-slot=\"sidebar-content\"\n className={cn(\n \"flex min-h-0 flex-1 flex-col gap-2 overflow-x-hidden overflow-y-auto overscroll-contain px-2 py-2\",\n className\n )}\n />\n )\n})\n\nexport const AnimatedSidebarFooter = forwardRef<\n HTMLDivElement,\n HTMLAttributes<HTMLDivElement>\n>(function AnimatedSidebarFooter({ className, ...props }, forwardedRef) {\n return (\n <div\n {...props}\n ref={forwardedRef}\n data-slot=\"sidebar-footer\"\n className={cn(\n \"flex shrink-0 flex-col gap-2 border-t border-border p-3 pb-[max(0.75rem,env(safe-area-inset-bottom))]\",\n className\n )}\n />\n )\n})\n\nexport const AnimatedSidebarGroup = forwardRef<\n HTMLDivElement,\n HTMLAttributes<HTMLDivElement>\n>(function AnimatedSidebarGroup({ className, ...props }, forwardedRef) {\n return (\n <div\n {...props}\n ref={forwardedRef}\n data-slot=\"sidebar-group\"\n className={cn(\"flex w-full min-w-0 flex-col px-1 py-1.5\", className)}\n />\n )\n})\n\nexport const AnimatedSidebarGroupLabel = forwardRef<\n HTMLDivElement,\n HTMLAttributes<HTMLDivElement>\n>(function AnimatedSidebarGroupLabel(\n { children, className, ...props },\n forwardedRef\n) {\n const { collapsed } = useAnimatedSidebarPanel()\n\n return (\n <div\n {...props}\n ref={forwardedRef}\n aria-hidden={collapsed}\n data-slot=\"sidebar-group-label\"\n className={cn(\n \"mb-1 h-7 overflow-hidden px-2 text-[10px] font-medium tracking-[0.14em] text-muted-foreground uppercase transition-opacity\",\n collapsed ? \"opacity-0\" : \"opacity-100\",\n className\n )}\n >\n {children}\n </div>\n )\n})\n\nexport const AnimatedSidebarGroupContent = forwardRef<\n HTMLDivElement,\n HTMLAttributes<HTMLDivElement>\n>(function AnimatedSidebarGroupContent({ className, ...props }, forwardedRef) {\n return (\n <div\n {...props}\n ref={forwardedRef}\n data-slot=\"sidebar-group-content\"\n className={cn(\"w-full min-w-0\", className)}\n />\n )\n})\n\nexport const AnimatedSidebarMenu = forwardRef<\n HTMLUListElement,\n HTMLAttributes<HTMLUListElement>\n>(function AnimatedSidebarMenu(\n { children, className, ...props },\n forwardedRef\n) {\n return (\n <SharedLayoutBg\n {...props}\n ref={forwardedRef as React.Ref<HTMLElement>}\n as=\"ul\"\n inset={0}\n pillClassName=\"rounded-xl bg-muted/70\"\n pillContainerClassName=\"inset-y-auto top-0 h-9\"\n data-slot=\"sidebar-menu\"\n className={cn(\n \"flex w-full min-w-0 list-none flex-col gap-0.5\",\n className\n )}\n >\n {children}\n </SharedLayoutBg>\n )\n})\n\nexport const AnimatedSidebarMenuItem = forwardRef<\n HTMLLIElement,\n HTMLMotionProps<\"li\">\n>(function AnimatedSidebarMenuItem({ className, ...props }, forwardedRef) {\n return (\n <motion.li\n {...props}\n ref={forwardedRef}\n layout=\"position\"\n transition={SPRING_LAYOUT}\n data-slot=\"sidebar-menu-item\"\n className={cn(\"relative\", className)}\n />\n )\n})\n\nexport interface AnimatedSidebarMenuSubProps extends Omit<\n HTMLMotionProps<\"ul\">,\n \"children\"\n> {\n open: boolean\n children?: ReactNode\n}\n\nexport const AnimatedSidebarMenuSub = forwardRef<\n HTMLUListElement,\n AnimatedSidebarMenuSubProps\n>(function AnimatedSidebarMenuSub(\n { open, children, className, ...props },\n forwardedRef\n) {\n const context = useAnimatedSidebar()\n const panel = useAnimatedSidebarPanel()\n\n return (\n <AnimatePresence initial={false} mode=\"popLayout\">\n {open && !panel.collapsed ? (\n <motion.ul\n {...props}\n ref={forwardedRef}\n key=\"sidebar-submenu\"\n variants={context.reduce ? undefined : SUBMENU_VARIANTS}\n initial={context.reduce ? false : \"closed\"}\n animate={context.reduce ? { opacity: 1 } : \"open\"}\n exit={context.reduce ? { opacity: 0 } : \"closed\"}\n transition={context.reduce ? { duration: 0.12 } : undefined}\n data-slot=\"sidebar-menu-sub\"\n className={cn(\n \"relative mt-1 ml-5 flex min-w-0 flex-col gap-0.5 border-l border-border pl-3\",\n className\n )}\n >\n {children}\n </motion.ul>\n ) : null}\n </AnimatePresence>\n )\n})\n\nexport const AnimatedSidebarMenuSubItem = forwardRef<\n HTMLLIElement,\n HTMLMotionProps<\"li\">\n>(function AnimatedSidebarMenuSubItem({ className, ...props }, forwardedRef) {\n return (\n <motion.li\n {...props}\n ref={forwardedRef}\n variants={SUBMENU_ITEM_VARIANTS}\n data-slot=\"sidebar-menu-sub-item\"\n className={cn(\"relative min-w-0\", className)}\n />\n )\n})\n\nexport interface AnimatedSidebarMenuSubButtonProps {\n children: ReactNode\n icon?: ReactNode\n href?: string\n isActive?: boolean\n disabled?: boolean\n closeOnSelect?: boolean\n target?: \"_blank\" | \"_self\" | \"_parent\" | \"_top\"\n rel?: string\n onSelect?: () => void\n className?: string\n}\n\nexport function AnimatedSidebarMenuSubButton({\n children,\n icon,\n href,\n isActive = false,\n disabled = false,\n closeOnSelect = true,\n target,\n rel,\n onSelect,\n className,\n}: AnimatedSidebarMenuSubButtonProps) {\n const context = useAnimatedSidebar()\n\n const select = (\n event: React.MouseEvent<HTMLAnchorElement | HTMLButtonElement>\n ) => {\n if (disabled) {\n event.preventDefault()\n return\n }\n onSelect?.()\n if (context.isMobile && closeOnSelect) context.setOpenMobile(false)\n }\n\n const content = (\n <>\n <span\n aria-hidden=\"true\"\n className=\"grid size-4 shrink-0 place-items-center\"\n >\n {icon ?? <span className=\"size-1 rounded-full bg-current\" />}\n </span>\n <span className=\"min-w-0 flex-1 truncate\">{children}</span>\n </>\n )\n\n const interactiveClassName = cn(\n \"flex min-h-8 w-full min-w-0 items-center gap-2 rounded-lg px-2 text-left text-xs outline-none\",\n \"text-muted-foreground transition-colors hover:bg-muted/60 hover:text-foreground\",\n \"focus-visible:bg-muted/70 focus-visible:ring-2 focus-visible:ring-ring\",\n isActive && \"bg-muted/70 text-foreground\",\n disabled && \"cursor-not-allowed opacity-40\",\n className\n )\n\n return href ? (\n <motion.a\n href={href}\n target={target}\n rel={rel ?? (target === \"_blank\" ? \"noreferrer noopener\" : undefined)}\n aria-current={isActive ? \"page\" : undefined}\n aria-disabled={disabled || undefined}\n tabIndex={disabled ? -1 : undefined}\n onClick={select}\n whileTap={context.reduce || disabled ? undefined : { scale: 0.98 }}\n transition={SPRING_PRESS}\n className={interactiveClassName}\n >\n {content}\n </motion.a>\n ) : (\n <motion.button\n type=\"button\"\n disabled={disabled}\n aria-current={isActive ? \"page\" : undefined}\n onClick={select}\n whileTap={context.reduce || disabled ? undefined : { scale: 0.98 }}\n transition={SPRING_PRESS}\n className={interactiveClassName}\n >\n {content}\n </motion.button>\n )\n}\n\nexport interface AnimatedSidebarMenuButtonProps {\n children: ReactNode\n icon?: ReactNode\n badge?: ReactNode\n href?: string\n isActive?: boolean\n ariaExpanded?: boolean\n disabled?: boolean\n closeOnSelect?: boolean\n target?: \"_blank\" | \"_self\" | \"_parent\" | \"_top\"\n rel?: string\n onSelect?: () => void\n className?: string\n}\n\nexport function AnimatedSidebarMenuButton({\n children,\n icon,\n badge,\n href,\n isActive = false,\n ariaExpanded,\n disabled = false,\n closeOnSelect,\n target,\n rel,\n onSelect,\n className,\n}: AnimatedSidebarMenuButtonProps) {\n const context = useAnimatedSidebar()\n const panel = useAnimatedSidebarPanel()\n const textLabel = typeof children === \"string\" ? children : undefined\n\n const select = (\n event: React.MouseEvent<HTMLAnchorElement | HTMLButtonElement>\n ) => {\n if (disabled) {\n event.preventDefault()\n return\n }\n onSelect?.()\n const shouldCloseOnSelect = closeOnSelect ?? ariaExpanded === undefined\n if (context.isMobile && shouldCloseOnSelect) {\n context.setOpenMobile(false)\n }\n }\n\n const content = (\n <>\n {isActive ? (\n <motion.span\n layoutId={context.layoutId}\n transition={context.reduce ? { duration: 0 } : SPRING_LAYOUT}\n className=\"absolute inset-0 rounded-xl bg-muted\"\n />\n ) : null}\n {icon ? (\n <span\n aria-hidden=\"true\"\n className=\"relative z-10 grid size-5 shrink-0 place-items-center\"\n >\n {icon}\n </span>\n ) : null}\n <motion.span\n initial={false}\n animate={{\n opacity: panel.collapsed ? 0 : 1,\n x: panel.collapsed ? -4 : 0,\n }}\n transition={\n context.reduce\n ? REDUCED_TRANSITION\n : panel.collapsed\n ? LABEL_EXIT_TRANSITION\n : LABEL_ENTER_TRANSITION\n }\n aria-hidden={panel.collapsed}\n className={cn(\n \"relative z-10 min-w-0 flex-1 truncate\",\n panel.collapsed && \"pointer-events-none\"\n )}\n >\n {children}\n </motion.span>\n {badge && !panel.collapsed ? (\n <span className=\"relative z-10 shrink-0 text-xs text-muted-foreground\">\n {badge}\n </span>\n ) : null}\n {ariaExpanded !== undefined ? (\n <motion.span\n aria-hidden=\"true\"\n initial={false}\n animate={{\n opacity: panel.collapsed ? 0 : 1,\n rotate: ariaExpanded ? 90 : 0,\n x: panel.collapsed ? 4 : 0,\n }}\n transition={context.reduce ? { duration: 0 } : SPRING_LAYOUT}\n className=\"relative z-10 grid size-4 shrink-0 place-items-center text-muted-foreground\"\n >\n <ChevronRight className=\"size-3.5\" />\n </motion.span>\n ) : null}\n </>\n )\n\n const interactiveClassName = cn(\n \"relative flex min-h-9 w-full min-w-0 items-center gap-2.5 overflow-hidden rounded-xl px-3 text-left text-sm font-medium outline-none\",\n \"text-muted-foreground transition-colors hover:text-foreground\",\n \"focus-visible:bg-muted/70 focus-visible:ring-2 focus-visible:ring-ring\",\n isActive && \"text-foreground\",\n disabled && \"cursor-not-allowed opacity-40\",\n className\n )\n\n return href ? (\n <motion.a\n href={href}\n target={target}\n rel={rel ?? (target === \"_blank\" ? \"noreferrer noopener\" : undefined)}\n aria-current={isActive ? \"page\" : undefined}\n aria-expanded={ariaExpanded}\n aria-disabled={disabled || undefined}\n aria-label={panel.collapsed ? textLabel : undefined}\n title={panel.collapsed ? textLabel : undefined}\n tabIndex={disabled ? -1 : undefined}\n onClick={select}\n whileTap={context.reduce || disabled ? undefined : { scale: 0.98 }}\n transition={SPRING_PRESS}\n className={interactiveClassName}\n >\n {content}\n </motion.a>\n ) : (\n <motion.button\n type=\"button\"\n disabled={disabled}\n aria-current={isActive ? \"page\" : undefined}\n aria-expanded={ariaExpanded}\n aria-label={panel.collapsed ? textLabel : undefined}\n title={panel.collapsed ? textLabel : undefined}\n onClick={select}\n whileTap={context.reduce || disabled ? undefined : { scale: 0.98 }}\n transition={SPRING_PRESS}\n className={interactiveClassName}\n >\n {content}\n </motion.button>\n )\n}\n","\nexport function isActive(id: string, activeId?: string): boolean {\n return activeId !== undefined && id === activeId\n}","\"use client\"\n\nimport * as React from \"react\"\n\nimport {\n AnimatedSidebarMenuButton,\n AnimatedSidebarMenuItem,\n AnimatedSidebarMenuSub,\n AnimatedSidebarMenuSubButton,\n AnimatedSidebarMenuSubItem,\n} from \"@/components/motion/animated-sidebar\"\n\nimport type { IRowProps, ISidebarNavItem, ISidebarNavSubItem } from \"@/components/blocks/nav/types\"\nimport { isActive } from \"@/components/blocks/nav/utils\"\n\nexport function SidebarNavRow({ item, activeId, onNavigate }: IRowProps) {\n const children = item.items ?? []\n const hasChildren = children.length > 0\n const childActive = children.some((child) => isActive(child.id, activeId))\n // null = follow the active child; a boolean = the reader has said otherwise.\n const [toggled, setToggled] = React.useState<boolean | null>(null)\n const [wasChildActive, setWasChildActive] = React.useState(childActive)\n\n // Navigating into a nested route from elsewhere reveals its parent, even if\n // the reader had collapsed it. Adjusted during render rather than in an\n // effect, so the group never paints closed for a frame first.\n if (childActive !== wasChildActive) {\n setWasChildActive(childActive)\n if (childActive) setToggled(null)\n }\n\n const open = toggled ?? item.defaultOpen ?? childActive\n\n function select(entry: ISidebarNavItem | ISidebarNavSubItem) {\n entry.onSelect?.()\n onNavigate?.(entry)\n }\n\n return (\n <AnimatedSidebarMenuItem>\n <AnimatedSidebarMenuButton\n ariaExpanded={hasChildren ? open : undefined}\n badge={item.badge}\n disabled={item.disabled}\n href={hasChildren ? undefined : item.href}\n icon={item.icon}\n isActive={isActive(item.id, activeId)}\n onSelect={() => {\n if (hasChildren) {\n setToggled(!open)\n return\n }\n select(item)\n }}\n target={item.target}\n >\n {item.label}\n </AnimatedSidebarMenuButton>\n {hasChildren ? (\n <AnimatedSidebarMenuSub open={open}>\n {children.map((child) => (\n <AnimatedSidebarMenuSubItem key={child.id}>\n <AnimatedSidebarMenuSubButton\n disabled={child.disabled}\n href={child.href}\n icon={child.icon}\n isActive={isActive(child.id, activeId)}\n onSelect={() => select(child)}\n target={child.target}\n >\n {child.label}\n </AnimatedSidebarMenuSubButton>\n </AnimatedSidebarMenuSubItem>\n ))}\n </AnimatedSidebarMenuSub>\n ) : null}\n </AnimatedSidebarMenuItem>\n )\n}","\"use client\"\n\nimport { PanelLeftIcon } from \"lucide-react\"\nimport * as React from \"react\"\n\nimport {\n AnimatedSidebar,\n AnimatedSidebarContent,\n AnimatedSidebarFooter,\n AnimatedSidebarGroup,\n AnimatedSidebarGroupContent,\n AnimatedSidebarGroupLabel,\n AnimatedSidebarHeader,\n AnimatedSidebarMenu,\n AnimatedSidebarProvider,\n AnimatedSidebarTrigger,\n} from \"@/components/motion/animated-sidebar\"\nimport { cn } from \"@/lib/utils\"\nimport { SidebarNavRow } from \"@/components/blocks/nav/sidebar-nav-row\"\n\nimport type { ISidebarBlockProps } from \"@/components/blocks/nav/types\"\n\nexport type {\n ISidebarBlockProps as SidebarBlockProps,\n ISidebarNavItem as SidebarNavItem,\n ISidebarNavSection as SidebarNavSection,\n ISidebarNavSubItem as SidebarNavSubItem,\n} from \"@/components/blocks/nav/types\"\n\n/**\n * Application sidebar navigation, driven by data rather than composition.\n *\n * This is the navigation panel only — it claims no page layout, so place it\n * beside your own content. It owns its own sidebar context (⌘B toggles it);\n * pass `open`/`onOpenChange` to drive the rail, and `openMobile`/\n * `onOpenMobileChange` to open the drawer from a header button of your own.\n * Compose the underlying `AnimatedSidebar*` parts directly when a screen\n * needs something this API does not cover.\n */\nexport function SidebarBlock({\n sections,\n activeId,\n onNavigate,\n header,\n footer,\n showTrigger = true,\n side = \"left\",\n variant = \"sidebar\",\n collapsible = \"icon\",\n open,\n defaultOpen,\n onOpenChange,\n openMobile,\n defaultOpenMobile,\n onOpenMobileChange,\n width,\n iconWidth,\n mobileWidth,\n ariaLabel = \"Main\",\n className,\n}: ISidebarBlockProps): React.ReactElement {\n return (\n <AnimatedSidebarProvider\n // The provider ships a full-page flex shell; this block is just the\n // panel, so the shell is flattened back to the panel's own box.\n className=\"h-full min-h-0 w-auto\"\n defaultOpen={defaultOpen}\n defaultOpenMobile={defaultOpenMobile}\n onOpenChange={onOpenChange}\n onOpenMobileChange={onOpenMobileChange}\n open={open}\n openMobile={openMobile}\n style={{\n ...(width ? { \"--sidebar-width\": width } : null),\n ...(iconWidth ? { \"--sidebar-width-icon\": iconWidth } : null),\n ...(mobileWidth ? { \"--sidebar-width-mobile\": mobileWidth } : null),\n }}\n >\n <AnimatedSidebar\n ariaLabel={ariaLabel}\n // The panel is built for a full-page shell (`h-svh`, so its footer\n // hangs below any shorter box). Fill the parent instead — in a\n // full-height layout that comes to the same thing.\n className={cn(\"h-full\", className)}\n collapsible={collapsible}\n panelClassName=\"h-full\"\n // The panel is navigation and nothing else, so it names a navigation\n // landmark rather than the complementary one <aside> implies. (The\n // mobile drawer is a dialog and keeps that role.)\n role=\"navigation\"\n side={side}\n variant={variant}\n >\n {header ||\n (showTrigger && (\n <AnimatedSidebarHeader>\n <div className=\"flex min-w-0 items-center justify-between gap-2\">\n {header && <div className=\"min-w-0 flex-1\">{header}</div>}\n {showTrigger && (\n <AnimatedSidebarTrigger className=\"text-muted-foreground hover:text-foreground\">\n <PanelLeftIcon className=\"size-4.5\" />\n </AnimatedSidebarTrigger>\n )}\n </div>\n </AnimatedSidebarHeader>\n ))}\n <AnimatedSidebarContent>\n {sections.map((section) => (\n <AnimatedSidebarGroup key={section.id}>\n {section.label && (\n <AnimatedSidebarGroupLabel>\n {section.label}\n </AnimatedSidebarGroupLabel>\n )}\n <AnimatedSidebarGroupContent>\n <AnimatedSidebarMenu>\n {section.items.map((item) => (\n <SidebarNavRow\n activeId={activeId}\n item={item}\n key={item.id}\n onNavigate={onNavigate}\n />\n ))}\n </AnimatedSidebarMenu>\n </AnimatedSidebarGroupContent>\n </AnimatedSidebarGroup>\n ))}\n </AnimatedSidebarContent>\n {footer && <AnimatedSidebarFooter>{footer}</AnimatedSidebarFooter>}\n </AnimatedSidebar>\n </AnimatedSidebarProvider>\n )\n}\n","import { EASE_OUT } from \"@/lib/ease.ts\"\nimport type { FlatResource, SidebarResource, SidebarResourceDropPosition, SidebarResourceMove } from \"./type.ts\"\n\nexport const ROW_REVEAL = {\n duration: 0.16,\n ease: EASE_OUT,\n} as const\n\nexport function canContain(item: SidebarResource) {\n return item.kind === \"folder\" || item.kind === \"project\"\n}\n\nexport function flattenResources(\n items: SidebarResource[],\n expanded: Set<string>,\n depth = 0,\n parentId: string | null = null\n): FlatResource[] {\n return items.flatMap((item) => {\n const row = { item, depth, parentId }\n if (!item.children?.length || !expanded.has(item.id)) return [row]\n return [\n row,\n ...flattenResources(item.children, expanded, depth + 1, item.id),\n ]\n })\n}\n\nexport function findResource(\n items: SidebarResource[],\n id: string\n): SidebarResource | undefined {\n for (const item of items) {\n if (item.id === id) return item\n const child = item.children ? findResource(item.children, id) : undefined\n if (child) return child\n }\n}\n\n\nexport function containsResource(item: SidebarResource, id: string): boolean {\n return (\n item.id === id ||\n item.children?.some((child) => containsResource(child, id)) === true\n );\n}\n\nexport function removeResource(\n items: SidebarResource[],\n id: string,\n): { items: SidebarResource[]; removed?: SidebarResource } {\n let removed: SidebarResource | undefined;\n const next: SidebarResource[] = [];\n\n for (const item of items) {\n if (item.id === id) {\n removed = item;\n continue;\n }\n\n if (item.children?.length) {\n const childResult = removeResource(item.children, id);\n if (childResult.removed) {\n removed = childResult.removed;\n next.push({ ...item, children: childResult.items });\n continue;\n }\n }\n\n next.push(item);\n }\n\n return { items: next, removed };\n}\n\nexport function insertResource(\n items: SidebarResource[],\n resource: SidebarResource,\n targetId: string | null,\n position: SidebarResourceDropPosition,\n): SidebarResource[] {\n if (targetId === null) return [...items, resource];\n\n const next: SidebarResource[] = [];\n for (const item of items) {\n if (item.id === targetId) {\n if (position === \"before\") next.push(resource, item);\n else if (position === \"after\") next.push(item, resource);\n else next.push({ ...item, children: [...(item.children ?? []), resource] });\n continue;\n }\n\n if (item.children?.length) {\n next.push({\n ...item,\n children: insertResource(item.children, resource, targetId, position),\n });\n } else {\n next.push(item);\n }\n }\n return next;\n}\n\nexport function moveResource(\n items: SidebarResource[],\n move: SidebarResourceMove,\n): SidebarResource[] | null {\n const source = findResource(items, move.itemId);\n if (!source || source.disabled) return null;\n if (move.targetId && containsResource(source, move.targetId)) return null;\n\n const target = move.targetId ? findResource(items, move.targetId) : undefined;\n if (\n move.position === \"inside\" &&\n (!target || target.disabled || !canContain(target))\n )\n return null;\n\n const removed = removeResource(items, move.itemId);\n if (!removed.removed) return null;\n return insertResource(\n removed.items,\n removed.removed,\n move.targetId,\n move.position,\n );\n}\n\nexport function renameResource(\n items: SidebarResource[],\n id: string,\n label: string,\n): SidebarResource[] {\n return items.map((item) => ({\n ...item,\n label: item.id === id ? label : item.label,\n children: item.children\n ? renameResource(item.children, id, label)\n : undefined,\n }));\n}\n","\"use client\";\n\nimport {\n type DragEvent,\n type KeyboardEvent,\n useCallback,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport type {\n AISidebarProps,\n DropTarget,\n FlatResource,\n SidebarResource,\n SidebarResourceMove,\n} from \"./type.ts\"\nimport {\n canContain,\n containsResource,\n findResource,\n flattenResources,\n moveResource,\n renameResource,\n} from \"./utils.ts\"\n\nexport type UseAISidebarOptions = Pick<\n AISidebarProps,\n | \"items\"\n | \"defaultItems\"\n | \"onItemsChange\"\n | \"onMove\"\n | \"onMoveError\"\n | \"onRename\"\n | \"activeId\"\n | \"defaultActiveId\"\n | \"onActiveChange\"\n | \"defaultExpandedIds\"\n>\n\nexport function useAISidebar({\n items,\n defaultItems = [],\n onItemsChange,\n onMove,\n onMoveError,\n onRename,\n activeId,\n defaultActiveId = null,\n onActiveChange,\n defaultExpandedIds = [],\n}: UseAISidebarOptions) {\n const [internalItems, setInternalItems] = useState(items ?? defaultItems);\n const [internalActiveId, setInternalActiveId] = useState(defaultActiveId);\n const [expandedIds, setExpandedIds] = useState(\n () => new Set(defaultExpandedIds),\n );\n const [focusedId, setFocusedId] = useState<string | null>(\n activeId ?? defaultActiveId,\n );\n const [draggingId, setDraggingId] = useState<string | null>(null);\n const [dropTarget, setDropTarget] = useState<DropTarget | null>(null);\n const [menuOpenId, setMenuOpenId] = useState<string | null>(null);\n const [renamingId, setRenamingId] = useState<string | null>(null);\n const [hoveredId, setHoveredId] = useState<string | null>(null);\n const hoverLayoutId = useId();\n const [announcement, setAnnouncement] = useState(\"\");\n const rowRefs = useRef(new Map<string, HTMLDivElement>());\n const movePendingRef = useRef(false);\n const renderedItems = internalItems;\n const selectedId = activeId ?? internalActiveId;\n\n const [prevItems, setPrevItems] = useState(items);\n if (items !== prevItems) {\n setPrevItems(items);\n if (items) setInternalItems(items);\n }\n\n const flat = useMemo(\n () => flattenResources(renderedItems, expandedIds),\n [expandedIds, renderedItems],\n );\n\n const isFocusedItemStillVisible =\n focusedId !== null && flat.some((row) => row.item.id === focusedId);\n if (!isFocusedItemStillVisible) {\n const firstVisibleItemId = flat[0]?.item.id ?? null;\n if (focusedId !== firstVisibleItemId) setFocusedId(firstVisibleItemId);\n }\n\n useEffect(() => {\n if (!menuOpenId) return;\n const frame = requestAnimationFrame(() => {\n const menus = Array.from(\n document.querySelectorAll<HTMLElement>(\"[data-sidebar-resource-menu]\"),\n );\n menus\n .find((menu) => menu.dataset.sidebarResourceMenu === menuOpenId)\n ?.querySelector<HTMLElement>(\"button, a[href]\")\n ?.focus();\n });\n return () => cancelAnimationFrame(frame);\n }, [menuOpenId]);\n\n const updateItems = useCallback(\n (next: SidebarResource[]) => {\n setInternalItems(next);\n onItemsChange?.(next);\n },\n [onItemsChange],\n );\n\n const performMove = useCallback(\n async (move: SidebarResourceMove) => {\n if (movePendingRef.current) {\n setAnnouncement(\"Wait for the current move to finish.\");\n return;\n }\n const before = renderedItems;\n const next = moveResource(before, move);\n if (!next || next === before) return;\n\n movePendingRef.current = true;\n updateItems(next);\n setDropTarget(null);\n setDraggingId(null);\n const moved = findResource(before, move.itemId);\n const target = move.targetId ? findResource(before, move.targetId) : null;\n setAnnouncement(\n target\n ? `Moved ${moved?.label ?? \"item\"} ${move.position} ${target.label}.`\n : `Moved ${moved?.label ?? \"item\"} to the top level.`,\n );\n\n try {\n await onMove?.(move);\n } catch (error) {\n updateItems(before);\n setAnnouncement(`Move failed. ${moved?.label ?? \"Item\"} was restored.`);\n onMoveError?.(error, move);\n } finally {\n movePendingRef.current = false;\n }\n },\n [onMove, onMoveError, renderedItems, updateItems],\n );\n\n const focusRow = useCallback((id: string) => {\n setFocusedId(id);\n requestAnimationFrame(() => rowRefs.current.get(id)?.focus());\n }, []);\n\n const select = useCallback(\n (id: string) => {\n if (activeId === undefined) setInternalActiveId(id);\n onActiveChange?.(id);\n },\n [activeId, onActiveChange],\n );\n\n const toggle = useCallback((id: string) => {\n setExpandedIds((current) => {\n const next = new Set(current);\n if (next.has(id)) next.delete(id);\n else next.add(id);\n return next;\n });\n }, []);\n\n const handleKeyDown = useCallback(\n (event: KeyboardEvent<HTMLDivElement>, row: FlatResource) => {\n const index = flat.findIndex(({ item }) => item.id === row.item.id);\n const previous = flat[index - 1];\n const next = flat[index + 1];\n const moveModifier = event.altKey && event.shiftKey;\n\n if (event.key === \"ArrowDown\" && !moveModifier && next) {\n event.preventDefault();\n focusRow(next.item.id);\n return;\n }\n if (event.key === \"ArrowUp\" && !moveModifier && previous) {\n event.preventDefault();\n focusRow(previous.item.id);\n return;\n }\n if (event.key === \"Home\" && flat[0]) {\n event.preventDefault();\n focusRow(flat[0].item.id);\n return;\n }\n if (event.key === \"End\" && flat.at(-1)) {\n event.preventDefault();\n focusRow(flat.at(-1)?.item.id ?? row.item.id);\n return;\n }\n\n if (row.item.disabled) {\n if (event.key === \"ArrowLeft\" && row.parentId) {\n event.preventDefault();\n focusRow(row.parentId);\n } else if (\n moveModifier ||\n [\"ArrowRight\", \"Enter\", \" \", \"F2\", \"ContextMenu\"].includes(\n event.key,\n ) ||\n (event.shiftKey && event.key === \"F10\")\n ) {\n event.preventDefault();\n }\n return;\n }\n\n if (moveModifier && event.key === \"ArrowUp\" && previous) {\n event.preventDefault();\n void performMove({ itemId: row.item.id, targetId: previous.item.id, position: \"before\" });\n return;\n }\n if (moveModifier && event.key === \"ArrowDown\" && next) {\n event.preventDefault();\n void performMove({ itemId: row.item.id, targetId: next.item.id, position: \"after\" });\n return;\n }\n if (moveModifier && event.key === \"ArrowRight\" && previous && canContain(previous.item)) {\n event.preventDefault();\n setExpandedIds((current) => new Set(current).add(previous.item.id));\n void performMove({ itemId: row.item.id, targetId: previous.item.id, position: \"inside\" });\n return;\n }\n if (moveModifier && event.key === \"ArrowLeft\" && row.parentId) {\n event.preventDefault();\n void performMove({ itemId: row.item.id, targetId: row.parentId, position: \"after\" });\n return;\n }\n\n if (event.key === \"ArrowRight\" && canContain(row.item)) {\n event.preventDefault();\n if (!expandedIds.has(row.item.id)) toggle(row.item.id);\n else if (next?.parentId === row.item.id) focusRow(next.item.id);\n } else if (event.key === \"ArrowLeft\") {\n event.preventDefault();\n if (expandedIds.has(row.item.id)) toggle(row.item.id);\n else if (row.parentId) focusRow(row.parentId);\n } else if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n if (canContain(row.item)) toggle(row.item.id);\n else select(row.item.id);\n } else if (event.key === \"F2\") {\n event.preventDefault();\n setRenamingId(row.item.id);\n } else if (event.key === \"ContextMenu\" || (event.shiftKey && event.key === \"F10\")) {\n event.preventDefault();\n setMenuOpenId(row.item.id);\n }\n },\n [expandedIds, flat, focusRow, performMove, select, toggle],\n );\n\n const handleRootDragOver = useCallback(\n (event: DragEvent<HTMLDivElement>) => {\n if (!draggingId || event.target !== event.currentTarget) return;\n event.preventDefault();\n setDropTarget({ id: null, position: \"after\" });\n },\n [draggingId],\n );\n\n const handleDrop = useCallback(\n (event: DragEvent<HTMLDivElement>) => {\n event.preventDefault();\n event.stopPropagation();\n if (draggingId && dropTarget) {\n void performMove({\n itemId: draggingId,\n targetId: dropTarget.id,\n position: dropTarget.position,\n });\n }\n },\n [draggingId, dropTarget, performMove],\n );\n\n const handleRowDragStart = useCallback(\n (event: DragEvent<HTMLDivElement>, id: string) => {\n setDraggingId(id);\n event.dataTransfer.effectAllowed = \"move\";\n event.dataTransfer.setData(\"text/plain\", id);\n },\n [],\n );\n\n const handleRowDragEnd = useCallback(() => {\n setDraggingId(null);\n setDropTarget(null);\n }, []);\n\n const handleRowDragOver = useCallback(\n (event: DragEvent<HTMLDivElement>, targetRow: FlatResource) => {\n if (!draggingId || draggingId === targetRow.item.id) return;\n const source = findResource(renderedItems, draggingId);\n if (source && containsResource(source, targetRow.item.id)) return;\n event.preventDefault();\n event.stopPropagation();\n const rect = event.currentTarget.getBoundingClientRect();\n const ratio = (event.clientY - rect.top) / rect.height;\n const position =\n !targetRow.item.disabled &&\n canContain(targetRow.item) &&\n ratio >= 0.25 &&\n ratio <= 0.75\n ? \"inside\"\n : ratio < 0.5\n ? \"before\"\n : \"after\";\n setDropTarget({ id: targetRow.item.id, position });\n },\n [draggingId, renderedItems],\n );\n\n const commitRename = useCallback(\n (row: FlatResource, label: string) => {\n const trimmed = label.trim();\n setRenamingId(null);\n if (!trimmed || trimmed === row.item.label) return;\n const before = renderedItems;\n updateItems(renameResource(before, row.item.id, trimmed));\n void Promise.resolve(onRename?.(row.item, trimmed)).catch(() => {\n updateItems(before);\n setAnnouncement(`Rename failed. ${row.item.label} was restored.`);\n });\n },\n [onRename, renderedItems, updateItems],\n );\n\n const handleMenuOpenChange = useCallback(\n (row: FlatResource, open: boolean) => {\n setMenuOpenId(open ? row.item.id : null);\n if (!open) focusRow(row.item.id);\n },\n [focusRow],\n );\n\n const handleRowHover = useCallback((id: string, hovered: boolean) => {\n setHoveredId((current) =>\n hovered ? id : current === id ? null : current,\n );\n }, []);\n\n const clearHover = useCallback(() => setHoveredId(null), []);\n\n const setRowRef = useCallback((id: string, node: HTMLDivElement | null) => {\n if (node) rowRefs.current.set(id, node);\n else rowRefs.current.delete(id);\n }, []);\n\n return {\n flat,\n selectedId,\n expandedIds,\n focusedId,\n setFocusedId,\n draggingId,\n dropTarget,\n hoveredId,\n hoverLayoutId,\n handleRowHover,\n clearHover,\n menuOpenId,\n renamingId,\n setRenamingId,\n announcement,\n select,\n toggle,\n handleKeyDown,\n handleRootDragOver,\n handleDrop,\n handleRowDragStart,\n handleRowDragEnd,\n handleRowDragOver,\n commitRename,\n handleMenuOpenChange,\n setRowRef,\n };\n}\n","import type { SidebarResource } from \"./type.ts\"\nimport { Bookmark, FileText, Folder, FolderOpen } from \"lucide-react\"\n\nexport function SidebarIcon(item: SidebarResource, expanded: boolean) {\n const Icon =\n item.kind === \"folder\" || item.kind === \"project\"\n ? expanded\n ? FolderOpen\n : Folder\n : item.kind === \"bookmark\"\n ? Bookmark\n : FileText\n return <Icon className=\"size-4\" />\n}\n","import { motion, useReducedMotion } from \"motion/react\"\nimport { useEffect, useRef, useState } from \"react\"\nimport { ROW_REVEAL } from \"./utils.ts\"\n\nexport function MarqueeLabel({\n active,\n children,\n}: {\n active: boolean\n children: string\n}) {\n const reduce = useReducedMotion() ?? false\n const viewportRef = useRef<HTMLSpanElement>(null)\n const labelRef = useRef<HTMLSpanElement>(null)\n const [distance, setDistance] = useState(0)\n\n useEffect(() => {\n const measure = () => {\n const viewport = viewportRef.current\n const label = labelRef.current\n if (!viewport || !label) return\n setDistance(\n label.scrollWidth > viewport.clientWidth ? label.scrollWidth + 24 : 0\n )\n }\n measure()\n const observer = new ResizeObserver(measure)\n if (viewportRef.current) observer.observe(viewportRef.current)\n if (labelRef.current) observer.observe(labelRef.current)\n return () => observer.disconnect()\n }, [])\n\n const running = active && distance > 0 && !reduce\n\n return (\n <span\n ref={viewportRef}\n className=\"relative block min-w-0 flex-1 overflow-hidden\"\n >\n <motion.span\n className=\"flex w-max items-center gap-6 whitespace-nowrap\"\n animate={{ x: running ? [0, -distance] : 0 }}\n transition={\n running\n ? {\n duration: Math.max(2.4, distance / 34),\n ease: \"linear\",\n repeat: Number.POSITIVE_INFINITY,\n repeatDelay: 2,\n }\n : ROW_REVEAL\n }\n >\n <span ref={labelRef}>{children}</span>\n {running ? <span aria-hidden=\"true\">{children}</span> : null}\n </motion.span>\n </span>\n )\n}\n","\"use client\";\n\nimport {\n type MutableRefObject,\n useCallback,\n useLayoutEffect,\n useState,\n} from \"react\";\n\nexport type PortalLayout = {\n trigger: {\n left: number;\n top: number;\n width: number;\n height: number;\n };\n content: {\n width: number;\n height: number;\n };\n};\n\nfunction sameLayout(a: PortalLayout | null, b: PortalLayout) {\n return (\n a?.trigger.left === b.trigger.left &&\n a.trigger.top === b.trigger.top &&\n a.trigger.width === b.trigger.width &&\n a.trigger.height === b.trigger.height &&\n a.content.width === b.content.width &&\n a.content.height === b.content.height\n );\n}\n\n/** Measures a trigger and portalled panel in viewport coordinates. */\nexport function usePopoverPortalPosition<\n TriggerElement extends HTMLElement,\n ContentElement extends HTMLElement,\n>(\n triggerRef: MutableRefObject<TriggerElement | null>,\n contentRef: MutableRefObject<ContentElement | null>,\n active: boolean,\n) {\n const [layout, setLayout] = useState<PortalLayout | null>(null);\n\n const update = useCallback(() => {\n const trigger = triggerRef.current;\n const content = contentRef.current;\n if (!trigger || !content) return;\n\n const rect = trigger.getBoundingClientRect();\n const next: PortalLayout = {\n trigger: {\n left: rect.left,\n top: rect.top,\n width: rect.width,\n height: rect.height,\n },\n content: {\n width: content.offsetWidth,\n height: content.offsetHeight,\n },\n };\n setLayout((current) => (sameLayout(current, next) ? current : next));\n }, [contentRef, triggerRef]);\n\n useLayoutEffect(() => {\n update();\n if (!active) return;\n\n const trigger = triggerRef.current;\n const content = contentRef.current;\n const observer = new ResizeObserver(update);\n if (trigger) observer.observe(trigger);\n if (content) observer.observe(content);\n\n window.addEventListener(\"scroll\", update, true);\n window.addEventListener(\"resize\", update);\n return () => {\n observer.disconnect();\n window.removeEventListener(\"scroll\", update, true);\n window.removeEventListener(\"resize\", update);\n };\n }, [active, contentRef, triggerRef, update]);\n\n return layout;\n}\n","\"use client\";\n\nimport { AnimatePresence, motion, useReducedMotion } from \"motion/react\";\nimport {\n cloneElement,\n createContext,\n isValidElement,\n type ReactElement,\n type ReactNode,\n type Ref,\n useCallback,\n useContext,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { usePopoverPortalPosition } from \"@/components/motion/popover-position\";\nimport { EASE_OUT, SPRING_PANEL } from \"@/lib/ease\";\nimport { cn } from \"@/lib/utils\";\n\ntype Side = \"top\" | \"bottom\";\ntype Align = \"start\" | \"end\";\n\ntype MorphContextValue = {\n open: boolean;\n setOpen: (open: boolean) => void;\n toggle: () => void;\n triggerId: string;\n contentId: string;\n triggerRef: React.MutableRefObject<HTMLElement | null>;\n setContentRef: (node: HTMLDivElement | null) => void;\n contentRef: React.MutableRefObject<HTMLDivElement | null>;\n};\n\nconst MorphContext = createContext<MorphContextValue | null>(null);\n\nfunction useMorphContext(component: string) {\n const ctx = useContext(MorphContext);\n if (!ctx) throw new Error(`${component} must be used within <MorphPopover>`);\n return ctx;\n}\n\nexport interface MorphPopoverProps {\n children: ReactNode;\n /** Controlled open state. */\n open?: boolean;\n /** Uncontrolled initial open state. */\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean) => void;\n className?: string;\n}\n\n/**\n * A popover whose panel morphs open from the trigger corner: it's laid out at\n * full size but clipped to the corner nearest the trigger, then unclips as one\n * piece. Closes on outside pointer / Escape. Controlled or uncontrolled.\n */\nexport function MorphPopover({\n children,\n open: controlledOpen,\n defaultOpen = false,\n onOpenChange,\n className,\n}: MorphPopoverProps) {\n const baseId = useId();\n const rootRef = useRef<HTMLDivElement>(null);\n const triggerRef = useRef<HTMLElement | null>(null);\n const contentRef = useRef<HTMLDivElement | null>(null);\n const [internalOpen, setInternalOpen] = useState(defaultOpen);\n const controlled = controlledOpen !== undefined;\n const open = controlled ? controlledOpen : internalOpen;\n\n const setOpen = useCallback(\n (next: boolean) => {\n if (!controlled) setInternalOpen(next);\n onOpenChange?.(next);\n },\n [controlled, onOpenChange],\n );\n const toggle = useCallback(() => setOpen(!open), [setOpen, open]);\n\n useEffect(() => {\n if (!open) return;\n const onKey = (e: KeyboardEvent) => e.key === \"Escape\" && setOpen(false);\n const onPointer = (e: PointerEvent) => {\n const target = e.target as Node;\n if (\n rootRef.current &&\n !rootRef.current.contains(target) &&\n !contentRef.current?.contains(target)\n )\n setOpen(false);\n };\n window.addEventListener(\"keydown\", onKey);\n window.addEventListener(\"pointerdown\", onPointer);\n return () => {\n window.removeEventListener(\"keydown\", onKey);\n window.removeEventListener(\"pointerdown\", onPointer);\n };\n }, [open, setOpen]);\n\n const ctx = useMemo<MorphContextValue>(\n () => ({\n open,\n setOpen,\n toggle,\n triggerId: `${baseId}-trigger`,\n contentId: `${baseId}-content`,\n triggerRef,\n setContentRef: (node) => {\n contentRef.current = node;\n },\n contentRef,\n }),\n [open, setOpen, toggle, baseId],\n );\n\n return (\n <MorphContext.Provider value={ctx}>\n <div ref={rootRef} className={cn(\"relative inline-flex\", className)}>\n {children}\n </div>\n </MorphContext.Provider>\n );\n}\n\nexport interface MorphPopoverTriggerProps {\n children: ReactElement;\n}\n\nfunction mergeRefs<T>(...refs: Array<Ref<T> | undefined>) {\n return (node: T | null) => {\n for (const ref of refs) {\n if (typeof ref === \"function\") ref(node);\n else if (ref && typeof ref === \"object\")\n (ref as React.MutableRefObject<T | null>).current = node;\n }\n };\n}\n\n/** Wraps a single element, toggling the popover on click. */\nexport function MorphPopoverTrigger({ children }: MorphPopoverTriggerProps) {\n const ctx = useMorphContext(\"MorphPopoverTrigger\");\n if (!isValidElement(children)) return children;\n\n const child = children as ReactElement<Record<string, unknown>>;\n const childOnClick = child.props.onClick as\n | ((e: unknown) => void)\n | undefined;\n const childRef = (child.props as { ref?: Ref<HTMLElement> }).ref;\n\n return cloneElement(child, {\n id: ctx.triggerId,\n ref: mergeRefs(childRef, (node: HTMLElement | null) => {\n ctx.triggerRef.current = node;\n }),\n onClick: (e: unknown) => {\n childOnClick?.(e);\n ctx.toggle();\n },\n \"aria-haspopup\": \"dialog\",\n \"aria-expanded\": ctx.open,\n \"aria-controls\": ctx.open ? ctx.contentId : undefined,\n });\n}\n\nconst originFor = (side: Side, align: Align) =>\n `${side === \"bottom\" ? \"top\" : \"bottom\"} ${align === \"end\" ? \"right\" : \"left\"}`;\n\n// A clip that hides everything but the corner nearest the trigger, so the\n// panel appears to grow out of it. inset(top right bottom left).\nfunction clipHidden(side: Side, align: Align, radius: number) {\n const top = side === \"bottom\" ? \"0%\" : \"92%\";\n const bottom = side === \"bottom\" ? \"92%\" : \"0%\";\n const right = align === \"end\" ? \"0%\" : \"92%\";\n const left = align === \"end\" ? \"92%\" : \"0%\";\n return `inset(${top} ${right} ${bottom} ${left} round ${radius}px)`;\n}\nconst clipShown = (radius: number) => `inset(0% 0% 0% 0% round ${radius}px)`;\n\n// Preserve the original spring character on the wrapper, but tween the complex\n// clip-path so it cannot snap when the spring resolves its final distance.\nconst MORPH_CLIP_TRANSITION = { duration: 0.32, ease: EASE_OUT } as const;\n\nexport interface MorphPopoverContentProps {\n children: ReactNode;\n side?: Side;\n align?: Align;\n /** Gap between trigger and panel, in px. Default 8. */\n sideOffset?: number;\n /** Panel corner radius, in px. Default 16. */\n radius?: number;\n className?: string;\n}\n\nexport function MorphPopoverContent({\n children,\n side = \"bottom\",\n align = \"end\",\n sideOffset = 8,\n radius = 16,\n className,\n}: MorphPopoverContentProps) {\n const ctx = useMorphContext(\"MorphPopoverContent\");\n const { contentId, setContentRef, triggerId } = ctx;\n const reduce = useReducedMotion() ?? false;\n const [portalReady, setPortalReady] = useState(false);\n const layout = usePopoverPortalPosition(\n ctx.triggerRef,\n ctx.contentRef,\n portalReady && ctx.open,\n );\n\n useEffect(() => setPortalReady(true), []);\n const left = layout\n ? align === \"end\"\n ? layout.trigger.left + layout.trigger.width - layout.content.width\n : layout.trigger.left\n : 0;\n const top = layout\n ? side === \"bottom\"\n ? layout.trigger.top + layout.trigger.height + sideOffset\n : layout.trigger.top - layout.content.height - sideOffset\n : 0;\n\n // Both directions travel between the exact same hidden/show states. Exit\n // targets \"hidden\" directly instead of introducing separate choreography.\n const wrap = reduce\n ? undefined\n : {\n hidden: { opacity: 0, scale: 0.96, transition: SPRING_PANEL },\n show: { opacity: 1, scale: 1, transition: SPRING_PANEL },\n };\n const clip = reduce\n ? undefined\n : {\n hidden: {\n clipPath: clipHidden(side, align, radius),\n transition: MORPH_CLIP_TRANSITION,\n },\n show: {\n clipPath: clipShown(radius),\n transition: MORPH_CLIP_TRANSITION,\n },\n };\n\n // Keep the server and first client render identical, then mount the portal.\n if (!portalReady) return null;\n\n return createPortal(\n <AnimatePresence>\n {ctx.open ? (\n <motion.div\n data-morph-popover-portal=\"\"\n // Wrapper carries the shadow as a drop-shadow filter, which hugs the\n // clipped shape below (box-shadow would just get clipped away).\n variants={wrap}\n initial={reduce ? { opacity: 0 } : \"hidden\"}\n animate={reduce ? { opacity: 1 } : \"show\"}\n exit={reduce ? { opacity: 0 } : \"hidden\"}\n transition={reduce ? { duration: 0.12 } : undefined}\n style={{\n left,\n top,\n visibility: layout ? \"visible\" : \"hidden\",\n transformOrigin: originFor(side, align),\n }}\n className=\"fixed z-[9999] [filter:drop-shadow(0_10px_18px_rgba(0,0,0,0.14))]\"\n >\n <motion.div\n ref={setContentRef}\n id={contentId}\n role=\"dialog\"\n aria-labelledby={triggerId}\n variants={clip}\n style={{ borderRadius: radius }}\n className={cn(\n \"overflow-hidden border border-border bg-background\",\n className,\n )}\n >\n {children}\n </motion.div>\n </motion.div>\n ) : null}\n </AnimatePresence>,\n document.body,\n );\n}\n","import {\n cloneElement,\n useEffect,\n useRef,\n useState,\n type MouseEvent,\n} from \"react\"\nimport type { ResourceRowProps } from \"./type\"\nimport {\n AnimatePresence,\n motion,\n useReducedMotion,\n type Variants,\n} from \"motion/react\"\nimport { ChevronRight, MoreHorizontal, Pencil } from \"lucide-react\"\nimport { SPRING_LAYOUT } from \"@/lib/ease.ts\"\nimport { cn } from \"@/lib/utils.ts\"\nimport { canContain } from \"./utils\"\nimport { SidebarIcon } from \"./sidebar-icon\"\nimport { MarqueeLabel } from \"./marquee-label\"\nimport {\n MorphPopover,\n MorphPopoverContent,\n MorphPopoverTrigger,\n} from \"@/components/motion/popover-morph.tsx\"\nimport { Button } from \"@/components/ui/button\";\n\n// Same choreography as SharedLayoutBg: the wrapper only fades/blurs out when\n// the pointer leaves the whole tree; a row-to-row move exits instantly so the\n// layoutId pill slides instead of crossfading.\nconst pillVariants: Variants = {\n initial: { opacity: 0, filter: \"blur(6px)\" },\n animate: { opacity: 1, filter: \"blur(0px)\" },\n exit: (hoverActive: boolean) =>\n !hoverActive ? { opacity: 0, filter: \"blur(6px)\" } : {},\n}\n\nconst reducedPillVariants: Variants = {\n initial: { opacity: 0 },\n animate: { opacity: 1 },\n exit: (hoverActive: boolean) => (!hoverActive ? { opacity: 0 } : {}),\n}\n\nexport function ResourceRow({\n row,\n active,\n expanded,\n focused,\n draggingId,\n dropTarget,\n menuOpen,\n renaming,\n onDragEnd,\n onDragOver,\n onDragStart,\n onDrop,\n onFocus,\n onKeyDown,\n onMenuOpenChange,\n onRenameCancel,\n onRenameCommit,\n onRenameStart,\n onSelect,\n onToggle,\n hoverActive = false,\n hoverPill = false,\n hoverLayoutId,\n onHoverChange,\n renderIcon,\n renderMenu,\n renderActionsTrigger,\n setRef,\n}: ResourceRowProps) {\n const reduce = useReducedMotion() ?? false\n const [hovered, setHovered] = useState(false)\n const inputRef = useRef<HTMLInputElement>(null)\n const skipRenameBlurRef = useRef(false)\n const draggedRef = useRef(false)\n const [draft, setDraft] = useState(row.item.label)\n const acceptsChildren = canContain(row.item)\n const isDragging = draggingId === row.item.id\n const dropPosition =\n dropTarget?.id === row.item.id ? dropTarget.position : null\n\n useEffect(() => {\n if (!renaming) return\n skipRenameBlurRef.current = false\n // setDraft(row.item.label);\n requestAnimationFrame(() => {\n inputRef.current?.focus()\n inputRef.current?.select()\n })\n }, [renaming, row.item.label])\n\n const menu = renderMenu?.(row.item, {\n close: () => onMenuOpenChange(false),\n rename: () => {\n onMenuOpenChange(false)\n onRenameStart()\n },\n }) ?? (\n <button\n type=\"button\"\n onClick={() => {\n onMenuOpenChange(false)\n onRenameStart()\n }}\n className=\"flex h-8 w-full items-center gap-2 rounded-lg px-2.5 text-left text-xs text-foreground transition-colors outline-none hover:bg-muted focus-visible:bg-muted focus-visible:ring-2 focus-visible:ring-ring\"\n >\n <Pencil aria-hidden=\"true\" className=\"size-3.5\" />\n Rename\n </button>\n )\n\n return (\n <motion.div\n ref={setRef}\n layout=\"position\"\n transition={reduce ? { duration: 0 } : SPRING_LAYOUT}\n role=\"treeitem\"\n aria-level={row.depth + 1}\n aria-selected={acceptsChildren ? undefined : active}\n aria-expanded={acceptsChildren ? expanded : undefined}\n aria-disabled={row.item.disabled || undefined}\n tabIndex={focused ? 0 : -1}\n draggable={!row.item.disabled && !renaming}\n data-menu-open={menuOpen || undefined}\n data-drop={dropPosition ?? undefined}\n data-dragging={isDragging || undefined}\n onFocus={onFocus}\n onKeyDown={onKeyDown}\n onClick={(event) => {\n if (\n event.defaultPrevented ||\n draggedRef.current ||\n renaming ||\n row.item.disabled\n )\n return\n if (acceptsChildren) onToggle()\n else onSelect()\n }}\n onDoubleClick={(event) => {\n if (acceptsChildren || row.item.disabled) return\n event.preventDefault()\n onRenameStart()\n }}\n onMouseEnter={() => {\n setHovered(true)\n onHoverChange?.(true)\n }}\n onMouseLeave={() => {\n setHovered(false)\n onHoverChange?.(false)\n }}\n onDragStartCapture={(event) => {\n draggedRef.current = true\n onDragStart(event, row.item.id)\n }}\n onDragEndCapture={() => {\n onDragEnd()\n requestAnimationFrame(() => {\n draggedRef.current = false\n })\n }}\n onDragOver={(event) => onDragOver(event, row)}\n onDrop={onDrop}\n className={cn(\n \"group/resource relative flex min-h-9 min-w-0 cursor-pointer items-center gap-2.5 rounded-md pr-3 text-sm outline-none\",\n \"text-muted-foreground transition-[color,background-color,scale] duration-150 ease-smooth-out hover:text-foreground motion-reduce:transition-none\",\n !row.item.disabled &&\n !renaming &&\n \"active:scale-97 motion-reduce:active:scale-100\",\n // Fallback for standalone rows that render without the shared pill.\n hoverLayoutId === undefined && \"hover:bg-muted\",\n \"focus-visible:bg-muted/70 focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-inset\",\n \"data-[menu-open=true]:bg-muted data-[menu-open=true]:text-foreground\",\n \"data-[dragging=true]:opacity-40\",\n \"data-[drop=inside]:bg-primary/10 data-[drop=inside]:ring-1 data-[drop=inside]:ring-primary/45\",\n \"data-[drop=before]:before:absolute data-[drop=before]:before:-top-0.5 data-[drop=before]:before:right-2 data-[drop=before]:before:left-2 data-[drop=before]:before:h-0.5 data-[drop=before]:before:rounded-full data-[drop=before]:before:bg-primary\",\n \"data-[drop=after]:after:absolute data-[drop=after]:after:right-2 data-[drop=after]:after:-bottom-0.5 data-[drop=after]:after:left-2 data-[drop=after]:after:h-0.5 data-[drop=after]:after:rounded-full data-[drop=after]:after:bg-primary\",\n !acceptsChildren &&\n active &&\n \"bg-primary/10 text-primary dark:bg-primary/25 dark:text-primary-foreground\",\n row.item.disabled && \"cursor-not-allowed opacity-45\"\n )}\n style={{ paddingLeft: `${12 + row.depth * 16}px` }}\n >\n {hoverLayoutId ? (\n <AnimatePresence custom={hoverActive}>\n {hoverActive ? (\n <motion.span\n aria-hidden=\"true\"\n variants={reduce ? reducedPillVariants : pillVariants}\n initial=\"initial\"\n animate=\"animate\"\n exit=\"exit\"\n custom={hoverActive}\n className=\"pointer-events-none absolute inset-0\"\n >\n {hoverPill ? (\n <motion.span\n layoutId={hoverLayoutId}\n transition={reduce ? { duration: 0 } : SPRING_LAYOUT}\n className=\"block h-full w-full rounded-md bg-foreground/8 dark:bg-muted/50\"\n />\n ) : null}\n </motion.span>\n ) : null}\n </AnimatePresence>\n ) : null}\n <span\n aria-hidden=\"true\"\n className=\"relative grid size-5 shrink-0 place-items-center\"\n >\n {renderIcon?.(row.item) ?? SidebarIcon(row.item, expanded)}\n </span>\n\n {renaming ? (\n <input\n ref={inputRef}\n value={draft}\n aria-label={`Rename ${row.item.label}`}\n onChange={(event) => setDraft(event.target.value)}\n draggable={false}\n onClick={(event) => event.stopPropagation()}\n onDoubleClick={(event) => event.stopPropagation()}\n onBlur={() => {\n if (!skipRenameBlurRef.current) onRenameCommit(draft)\n }}\n onKeyDown={(event) => {\n event.stopPropagation()\n if (event.key === \"Enter\") {\n skipRenameBlurRef.current = true\n onRenameCommit(draft)\n }\n if (event.key === \"Escape\") {\n skipRenameBlurRef.current = true\n onRenameCancel()\n }\n }}\n className=\"relative h-7 min-w-0 flex-1 text-sm text-foreground outline-none focus-visible:ring-0 focus-visible:ring-ring\"\n />\n ) : (\n <MarqueeLabel active={hovered || menuOpen}>\n {row.item.label}\n </MarqueeLabel>\n )}\n\n {!renaming && !row.item.disabled ? (\n <MorphPopover open={menuOpen} onOpenChange={onMenuOpenChange}>\n <MorphPopoverTrigger>\n {(() => {\n const custom = renderActionsTrigger?.(row.item)\n if (custom) {\n // A row click selects/toggles — the trigger must not bubble.\n const customOnClick = (\n custom.props as {\n onClick?: (event: MouseEvent<HTMLElement>) => void\n }\n ).onClick\n return cloneElement(custom, {\n draggable: false,\n onClick: (event: MouseEvent<HTMLElement>) => {\n event.stopPropagation()\n customOnClick?.(event)\n },\n } as Partial<unknown>)\n }\n return (\n <Button\n draggable={false}\n tabIndex={-1}\n variant=\"link\"\n aria-label={`Actions for ${row.item.label}`}\n onClick={(event) => event.stopPropagation()}\n className=\"relative grid size-7 shrink-0 place-items-center rounded-lg opacity-0 transition-opacity duration-150 ease-smooth-out outline-none group-hover/resource:opacity-80 group-hover/resource:delay-150 group-data-[menu-open=true]/resource:opacity-100 hover:bg-foreground/5 focus-visible:opacity-100 focus-visible:ring-2 focus-visible:ring-ring motion-reduce:transition-none\"\n >\n <MoreHorizontal aria-hidden=\"true\" className=\"size-4\" />\n </Button>\n )\n })()}\n </MorphPopoverTrigger>\n <MorphPopoverContent\n side=\"bottom\"\n align=\"end\"\n sideOffset={8}\n radius={12}\n className=\"w-40 p-1.5\"\n >\n <div data-sidebar-resource-menu={row.item.id}>{menu}</div>\n </MorphPopoverContent>\n </MorphPopover>\n ) : null}\n\n {row.depth === 0 &&\n acceptsChildren &&\n (row.item.children?.length ?? 0) > 0 ? (\n <ChevronRight\n aria-hidden=\"true\"\n className={cn(\n \"relative size-3.5 shrink-0 text-muted-foreground transition-transform duration-200 ease-smooth-out motion-reduce:transition-none\",\n expanded && \"rotate-90\"\n )}\n />\n ) : null}\n </motion.div>\n )\n}\n","\"use client\";\n\nimport { AnimatePresence } from \"motion/react\";\nimport { cn } from \"@/lib/utils\";\nimport type { AISidebarProps, FlatResource } from \"./type\"\nimport { useAISidebar, type UseAISidebarOptions } from \"./use-ai-sidebar\"\nimport { ResourceRow } from \"./sidebar-row\"\n\nexport function AISidebar({\n renderIcon,\n renderMenu,\n renderActionsTrigger,\n ariaLabel = \"Resources\",\n className,\n ...options\n}: AISidebarProps) {\n const {\n flat,\n selectedId,\n expandedIds,\n focusedId,\n setFocusedId,\n draggingId,\n dropTarget,\n hoveredId,\n hoverLayoutId,\n handleRowHover,\n clearHover,\n menuOpenId,\n renamingId,\n setRenamingId,\n announcement,\n select,\n toggle,\n handleKeyDown,\n handleRootDragOver,\n handleDrop,\n handleRowDragStart,\n handleRowDragEnd,\n handleRowDragOver,\n commitRename,\n handleMenuOpenChange,\n setRowRef,\n } = useAISidebar(options as UseAISidebarOptions);\n\n return (\n <>\n <div\n role=\"tree\"\n aria-label={ariaLabel}\n aria-multiselectable=\"false\"\n onDragOver={handleRootDragOver}\n onDrop={handleDrop}\n onMouseLeave={clearHover}\n className={cn(\n \"relative min-w-0 flex-col gap-0.5 [overflow-anchor:none] group-data-[state=collapsed]/sidebar:hidden\",\n draggingId && \"pb-9 select-none\",\n className\n )}\n >\n <AnimatePresence initial={false}>\n {flat.map((row: FlatResource) => (\n <ResourceRow\n key={row.item.id}\n row={row}\n active={selectedId === row.item.id}\n expanded={expandedIds.has(row.item.id)}\n focused={focusedId === row.item.id}\n draggingId={draggingId}\n dropTarget={dropTarget}\n menuOpen={menuOpenId === row.item.id}\n renaming={renamingId === row.item.id}\n hoverActive={hoveredId !== null && !draggingId}\n hoverPill={\n hoveredId === row.item.id && !draggingId && !row.item.disabled\n }\n hoverLayoutId={hoverLayoutId}\n onHoverChange={(hovered) => handleRowHover(row.item.id, hovered)}\n onFocus={() => setFocusedId(row.item.id)}\n onSelect={() => select(row.item.id)}\n onToggle={() => toggle(row.item.id)}\n onKeyDown={(event) => handleKeyDown(event, row)}\n onRenameStart={() => setRenamingId(row.item.id)}\n onRenameCancel={() => setRenamingId(null)}\n onRenameCommit={(label) => commitRename(row, label)}\n onMenuOpenChange={(open) => handleMenuOpenChange(row, open)}\n onDragStart={handleRowDragStart}\n onDragEnd={handleRowDragEnd}\n onDragOver={handleRowDragOver}\n onDrop={handleDrop}\n renderIcon={renderIcon}\n renderMenu={renderMenu}\n renderActionsTrigger={renderActionsTrigger}\n setRef={(node) => setRowRef(row.item.id, node)}\n />\n ))}\n </AnimatePresence>\n\n {draggingId && (\n <div\n aria-hidden=\"true\"\n data-active={dropTarget?.id === null || undefined}\n className=\"absolute inset-x-1 bottom-0 flex h-8 items-center justify-center rounded-md border border-dashed border-border text-[10px] text-muted-foreground data-[active=true]:border-primary/50 data-[active=true]:bg-primary/10 data-[active=true]:text-foreground\"\n >\n Move to top level\n </div>\n )}\n </div>\n <span className=\"sr-only\" aria-live=\"polite\">\n {announcement}\n </span>\n </>\n )\n}\n","import { AISidebar } from \"./ai-sidebar\"\nimport { MarqueeLabel } from \"./marquee-label.tsx\"\nimport { ResourceRow } from \"./sidebar-row.tsx\"\nimport { SidebarIcon } from \"./sidebar-icon.tsx\"\nexport { useAISidebar, type UseAISidebarOptions } from \"./use-ai-sidebar.ts\"\nexport type * from \"./type.ts\"\n\nexport { AISidebar, MarqueeLabel, ResourceRow, SidebarIcon }\n\nexport const Sidebar = {\n Wrapper: AISidebar,\n MarqueeLabel,\n Row: ResourceRow,\n Icon: SidebarIcon\n}\n","\nexport const TITLE_BAR_HEIGHT = 48\n","\"use client\"\n\nimport { MenuIcon, PanelRightIcon } from \"lucide-react\"\nimport * as React from \"react\"\n\nimport {\n AnimatedSidebar,\n AnimatedSidebarInset,\n AnimatedSidebarProvider,\n AnimatedSidebarTrigger,\n} from \"@/components/motion/animated-sidebar\"\nimport { cn } from \"@/lib/utils\"\nimport type { ShellLayoutProps } from \"./type\"\nimport { TITLE_BAR_HEIGHT } from \"./utils\"\nimport type { ClassNameValue } from \"tailwind-merge\"\n\nexport function ShellLayout({\n children,\n open,\n defaultOpen,\n onOpenChange,\n rightDrawer,\n rightOpen,\n defaultRightOpen,\n onRightOpenChange,\n variant = \"desktop\",\n className,\n}: ShellLayoutProps): React.ReactElement {\n\n const background: ClassNameValue = `bg-linear-to-tr/increasing from-neutral-200 via-neutral-100 to-stone-200 dark:from-neutral-900 dark:via-neutral-950 dark:to-stone-950`\n return (\n <AnimatedSidebarProvider\n className={cn(\"block-full\", className, background, 'relative pr-2')}\n defaultOpen={defaultOpen}\n defaultOpenRight={defaultRightOpen}\n onOpenChange={onOpenChange}\n onOpenRightChange={onRightOpenChange}\n open={open}\n openRight={rightOpen}\n style={{\n paddingTop: variant === \"desktop\" ? TITLE_BAR_HEIGHT : 0\n }}\n >\n <AnimatedSidebar\n ariaLabel=\"Primary navigation\"\n className={cn(\"\")}\n collapsible=\"icon\"\n role=\"navigation\"\n variant=\"inset\"\n ></AnimatedSidebar>\n\n <AnimatedSidebarInset\n className={cn(\n \"min-w-24 overflow-hidden border-t border-neutral-200 dark:border-neutral-700 inset-ring-1 inset-ring-neutral-50 dark:inset-ring-black bg-white dark:bg-card rounded-lg!\",\n `mx-0!`\n )}\n >\n <header className=\"flex h-16 items-center justify-between gap-3 px-4 sm:px-6\">\n <div className=\"flex min-w-0 items-center gap-3\">\n <AnimatedSidebarTrigger>\n <MenuIcon className=\"size-5\" />\n </AnimatedSidebarTrigger>\n </div>\n <div className=\"flex shrink-0 items-center gap-3\">\n <AnimatedSidebarTrigger aria-label=\"Toggle panel\" side=\"right\">\n <PanelRightIcon className=\"size-5\" />\n </AnimatedSidebarTrigger>\n </div>\n </header>\n <div className=\"min-h-24 flex-1 overflow-auto\">\n {children ?? <ShellLayoutPlaceholder />}\n </div>\n </AnimatedSidebarInset>\n\n\n\n <AnimatedSidebar\n ariaLabel=\"Secondary panel\"\n // Below md the panel is portal led over the page, so it carries the\n // surface itself; the desktop rail keeps it on the inner panel.\n className={cn(\"max-md:border-l max-md:border-neutral-200 max-md:bg-white dark:max-md:border-neutral-700 dark:max-md:bg-card\")}\n collapsible=\"offcanvas\"\n panelClassName={cn(\n // The off canvas panel keeps a fixed width so it can slide out of the\n // zero-width rail, so the inset gutter has to come out of that width\n // rather than from a left margin.\n \"top-2 ml-0 h-[calc(100%-1rem)] min-w-[calc(var(--sidebar-width))]\",\n \"rounded-lg border-t border-neutral-200 bg-white shadow-md inset-ring-1 inset-ring-neutral-50\",\n \"dark:border-neutral-700 dark:bg-card dark:inset-ring-black\"\n )}\n role=\"complementary\"\n side=\"right\"\n variant=\"inset\"\n >\n {rightDrawer}\n </AnimatedSidebar>\n </AnimatedSidebarProvider>\n )\n}\n\nfunction ShellLayoutPlaceholder() {\n return (\n <div className=\"grid gap-5\">\n <div className=\"grid gap-5 lg:grid-cols-3\">\n {Array.from({ length: 3 }).map((_, index) => (\n <div\n className=\"h-32 border border-border bg-background/60\"\n key={index}\n />\n ))}\n </div>\n <div className=\"h-72 border border-border bg-background/60\" />\n </div>\n )\n}\n","import ShellLayout from \"@/components/blocks/shell\"\n\nconst Layout = {\n Main: ShellLayout\n}\n\nexport default Layout\n","\"use client\"\n\nimport {\n ChevronsUpDownIcon,\n LogOutIcon,\n SettingsIcon,\n UserIcon,\n UserPlusIcon,\n UsersIcon,\n} from \"lucide-react\"\nimport * as React from \"react\"\n\nimport { UserAvatar } from \"@/components/composed/user-avatar\"\nimport { Button } from \"@/components/ui/button\"\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuGroup,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuShortcut,\n DropdownMenuTrigger,\n type MenuPrimitive,\n} from \"@/components/ui/menu\"\nimport { playCue } from \"@/lib/sound\"\nimport { cn } from \"@/lib/utils\"\n\n/** The identity shown on the card. */\nexport interface ProfileCardUser {\n name: string\n /** Secondary line under the name — a handle, an email, a role. */\n username?: string\n /** Avatar image URL. Falls back to the initials when absent or broken. */\n avatar?: string\n /** Fallback initials. Derived from `name` when omitted. */\n initials?: string\n}\n\n/** An actionable row of the menu. */\nexport interface ProfileCardAction {\n type?: \"item\"\n id: string\n label: string\n icon?: React.ReactNode\n /** Right-aligned hint, e.g. \"⌘K\". Purely decorative — bind the key yourself. */\n shortcut?: string\n disabled?: boolean\n variant?: \"default\" | \"destructive\"\n /** Returning a promise puts the card in its loading state until it settles. */\n onSelect?: () => void | Promise<void>\n}\n\n/** A heading over the rows that follow it, up to the next separator. */\nexport interface ProfileCardLabel {\n type: \"label\"\n label: string\n}\n\n/** A rule between two sections. */\nexport interface ProfileCardSeparator {\n type: \"separator\"\n}\n\n/**\n * One entry of `items`. Authored flat; the block renders each run between\n * separators as its own menu group so a label actually names its section.\n */\nexport type ProfileCardItem =\n ProfileCardAction | ProfileCardLabel | ProfileCardSeparator\n\n/**\n * The menu the card ships with. Spread it to keep the shape and attach your\n * own handlers, or ignore it and pass `items` of your own.\n */\nexport const defaultProfileCardItems: ProfileCardItem[] = [\n { type: \"label\", label: \"Management\" },\n { id: \"profile\", label: \"Profile\", icon: <UserIcon aria-hidden=\"true\" /> },\n {\n id: \"settings\",\n label: \"Settings\",\n icon: <SettingsIcon aria-hidden=\"true\" />,\n },\n { type: \"separator\" },\n { id: \"teams\", label: \"Teams\", icon: <UsersIcon aria-hidden=\"true\" /> },\n { id: \"invite\", label: \"Invite\", icon: <UserPlusIcon aria-hidden=\"true\" /> },\n { type: \"separator\" },\n {\n id: \"sign-out\",\n label: \"Log out\",\n icon: <LogOutIcon aria-hidden=\"true\" />,\n variant: \"destructive\",\n },\n]\n\ntype PopupProps = React.ComponentProps<typeof DropdownMenuContent>\n\nexport interface ProfileCardBlockProps {\n user: ProfileCardUser\n /**\n * The menu, flat: actions plus `{ type: \"separator\" }` / `{ type: \"label\" }`\n * entries. Defaults to `defaultProfileCardItems` (no handlers attached).\n */\n items?: ProfileCardItem[]\n /** Menu placement relative to the card. */\n align?: PopupProps[\"align\"]\n side?: PopupProps[\"side\"]\n sideOffset?: PopupProps[\"sideOffset\"]\n open?: boolean\n defaultOpen?: boolean\n onOpenChange?: MenuPrimitive.Root.Props[\"onOpenChange\"]\n /**\n * \"content\" sizes the menu to its items; \"card\" locks it to the trigger's\n * width, so `align` stops mattering horizontally.\n */\n menuWidth?: \"content\" | \"card\"\n /**\n * Emit cuelume press/release on the card and play the open/close cues.\n * Inert unless the app opts into interaction sound via `bindSounds()`.\n */\n sound?: boolean\n /** Called when an action's promise rejects — the card leaves its loading state either way. */\n onError?: (error: unknown) => void\n className?: string\n}\n\n/** Split a flat item list into the groups the menu renders. */\nfunction toGroups(\n items: ProfileCardItem[]\n): { label?: string; actions: ProfileCardAction[] }[] {\n const groups: { label?: string; actions: ProfileCardAction[] }[] = []\n let current: { label?: string; actions: ProfileCardAction[] } = {\n actions: [],\n }\n\n for (const item of items) {\n if (item.type === \"separator\") {\n groups.push(current)\n current = { actions: [] }\n } else if (item.type === \"label\") {\n current.label = item.label\n } else {\n current.actions.push(item)\n }\n }\n groups.push(current)\n\n return groups.filter(\n (group) => group.actions.length > 0 || group.label !== undefined\n )\n}\n\n/**\n * Avatar card that opens an account menu.\n *\n * The trigger is the rich identity chip (avatar + name over handle) and the\n * popup is a plain action menu. `items` is the whole menu — a flat list of\n * actions, separators and labels — defaulting to `defaultProfileCardItems`.\n */\nexport function ProfileCardBlock({\n user,\n items = defaultProfileCardItems,\n align = \"center\",\n side = \"bottom\",\n sideOffset = 8,\n menuWidth = \"content\",\n open,\n defaultOpen,\n onOpenChange,\n sound = true,\n onError,\n className,\n}: ProfileCardBlockProps): React.ReactElement {\n const [pending, setPending] = React.useState<string | null>(null)\n // Actions can outlive the card (sign-out unmounts it, typically).\n const mounted = React.useRef(true)\n React.useEffect(() => {\n mounted.current = true\n return () => {\n mounted.current = false\n }\n }, [])\n\n const groups = React.useMemo(() => toGroups(items), [items])\n\n function select(action: ProfileCardAction) {\n const result = action.onSelect?.()\n if (!(result instanceof Promise)) return\n setPending(action.id)\n result\n .catch((cause: unknown) => onError?.(cause))\n .finally(() => {\n if (mounted.current) setPending(null)\n })\n }\n\n const busy = pending !== null\n\n const handleOpenChange: MenuPrimitive.Root.Props[\"onOpenChange\"] = (\n nextOpen,\n details\n ) => {\n if (sound) playCue(nextOpen ? \"bloom\" : \"droplet\")\n onOpenChange?.(nextOpen, details)\n }\n\n return (\n <DropdownMenu\n defaultOpen={defaultOpen}\n onOpenChange={handleOpenChange}\n open={open}\n >\n <DropdownMenuTrigger\n disabled={busy}\n render={\n <Button\n // Spelled out rather than left to the name-from-contents rule: the\n // avatar sits inside the button and the handle is a second line.\n aria-label={`${user.name}${user.username ? ` ${user.username}` : \"\"}, account menu`}\n className={cn(\n // Quiet at rest — the background only surfaces on hover or\n // while the menu is open.\n \"h-auto w-full justify-between py-1.5 pl-1.5 data-popup-open:bg-accent sm:h-auto\",\n className\n )}\n data-slot=\"profile-card\"\n loading={busy}\n sound={sound}\n variant=\"ghost\"\n >\n <span className=\"flex w-full min-w-0 items-center justify-start gap-2\">\n <UserAvatar\n // Decorative: the name beside it already labels the card.\n alt=\"\"\n initials={user.initials}\n name={user.name}\n src={user.avatar}\n />\n <span className=\"flex min-w-0 flex-col text-left\">\n <span className=\"truncate font-medium\">{user.name}</span>\n {user.username ? (\n <span className=\"truncate text-xs font-normal text-muted-foreground\">\n {user.username}\n </span>\n ) : null}\n </span>\n </span>\n <ChevronsUpDownIcon aria-hidden=\"true\" className=\"size-3.5\" />\n </Button>\n }\n />\n <DropdownMenuContent\n align={align}\n // Content-width by default so `align` reads: a popup locked to\n // `--anchor-width` lands in the same place for every value. `!`\n // because the popup's own `not-[class*='w-']:min-w-32` compiles to\n // a higher-specificity `:not(:is())` that would otherwise win.\n className={cn(\n menuWidth === \"card\" ? \"w-(--anchor-width)\" : \"min-w-44!\",\n \"origin-(--transform-origin) transition-[opacity,scale,translate] duration-150 ease-smooth-out data-ending-style:scale-98 data-ending-style:opacity-0 data-ending-style:duration-100 data-starting-style:scale-98 data-starting-style:opacity-0 data-[side=bottom]:data-ending-style:-translate-y-1 data-[side=bottom]:data-starting-style:-translate-y-1 data-[side=top]:data-ending-style:translate-y-1 data-[side=top]:data-starting-style:translate-y-1 motion-reduce:transition-none\"\n )}\n side={side}\n sideOffset={sideOffset}\n >\n {groups.map((group, index) => (\n <React.Fragment key={group.label ?? `group-${group.actions[0]?.id}`}>\n {index > 0 ? <DropdownMenuSeparator /> : null}\n <DropdownMenuGroup>\n {group.label ? (\n <DropdownMenuLabel>{group.label}</DropdownMenuLabel>\n ) : null}\n {group.actions.map((item) => (\n <DropdownMenuItem\n disabled={item.disabled}\n key={item.id}\n onClick={() => select(item)}\n variant={item.variant}\n >\n {item.icon}\n <span>{item.label}</span>\n {item.shortcut ? (\n <DropdownMenuShortcut>{item.shortcut}</DropdownMenuShortcut>\n ) : null}\n </DropdownMenuItem>\n ))}\n </DropdownMenuGroup>\n </React.Fragment>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n )\n}\n"],"mappings":"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"}