@exegia/corpora-ui 0.16.0 → 0.18.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.
- package/dist-lib/components/blocks/nav/sidebar-block.d.ts +1 -1
- package/dist-lib/components/blocks/scaffold/__tests__/scaffold.test.d.ts +1 -0
- package/dist-lib/components/blocks/scaffold/constants.d.ts +20 -0
- package/dist-lib/components/blocks/scaffold/index.d.ts +25 -0
- package/dist-lib/components/blocks/scaffold/panel-close-button.d.ts +4 -0
- package/dist-lib/components/blocks/scaffold/panel-menu-button.d.ts +7 -0
- package/dist-lib/components/blocks/scaffold/scaffold-actions.d.ts +9 -0
- package/dist-lib/components/blocks/scaffold/scaffold-canvas.d.ts +7 -0
- package/dist-lib/components/blocks/scaffold/scaffold-context.d.ts +5 -0
- package/dist-lib/components/blocks/scaffold/scaffold-inspector.d.ts +9 -0
- package/dist-lib/components/blocks/scaffold/scaffold-main.d.ts +8 -0
- package/dist-lib/components/blocks/scaffold/scaffold-panel.d.ts +10 -0
- package/dist-lib/components/blocks/scaffold/scaffold-root.d.ts +8 -0
- package/dist-lib/components/blocks/scaffold/scaffold-sidebar.d.ts +7 -0
- package/dist-lib/components/blocks/scaffold/scaffold-sub-panel.d.ts +3 -0
- package/dist-lib/components/blocks/scaffold/type.d.ts +133 -0
- package/dist-lib/components/blocks/scaffold/use-scaffold.d.ts +8 -0
- package/dist-lib/components/blocks/scaffold/utils.d.ts +15 -0
- package/dist-lib/components/blocks/shell/animated-panel-inset.d.ts +2 -0
- package/dist-lib/components/blocks/shell/animated-panel-provider.d.ts +2 -0
- package/dist-lib/components/blocks/shell/animated-panel-trigger.d.ts +2 -0
- package/dist-lib/components/blocks/shell/animated-panel.d.ts +2 -0
- package/dist-lib/components/blocks/shell/animated-sidebar-content.d.ts +2 -0
- package/dist-lib/components/blocks/shell/animated-sidebar-footer.d.ts +2 -0
- package/dist-lib/components/blocks/shell/animated-sidebar-group-content.d.ts +2 -0
- package/dist-lib/components/blocks/shell/animated-sidebar-group-label.d.ts +2 -0
- package/dist-lib/components/blocks/shell/animated-sidebar-group.d.ts +2 -0
- package/dist-lib/components/blocks/shell/animated-sidebar-header.d.ts +2 -0
- package/dist-lib/components/blocks/shell/animated-sidebar-menu-button.d.ts +3 -0
- package/dist-lib/components/blocks/shell/animated-sidebar-menu-item.d.ts +2 -0
- package/dist-lib/components/blocks/shell/animated-sidebar-menu-sub-button.d.ts +3 -0
- package/dist-lib/components/blocks/shell/animated-sidebar-menu-sub-item.d.ts +2 -0
- package/dist-lib/components/blocks/shell/animated-sidebar-menu-sub.d.ts +2 -0
- package/dist-lib/components/blocks/shell/animated-sidebar-menu.d.ts +2 -0
- package/dist-lib/components/blocks/shell/index.d.ts +16 -0
- package/dist-lib/components/blocks/shell/shell-layout.d.ts +1 -1
- package/dist-lib/components/blocks/shell/type.d.ts +91 -4
- package/dist-lib/components/blocks/shell/utils.d.ts +37 -0
- package/dist-lib/components/motion/index.d.ts +1 -0
- package/dist-lib/components/motion/overflow-actions.d.ts +35 -0
- package/dist-lib/components/ui/button-group.d.ts +11 -0
- package/dist-lib/components/ui/glasscn/glass-button-group.d.ts +5 -0
- package/dist-lib/components/ui/glasscn/glass-container.d.ts +7 -0
- package/dist-lib/components/ui/glasscn/glass-separator.d.ts +5 -0
- package/dist-lib/components/ui/group.d.ts +17 -0
- package/dist-lib/components/ui/separator.d.ts +2 -3
- package/dist-lib/components/ui/sheet.d.ts +14 -0
- package/dist-lib/components/ui/tooltip.d.ts +6 -0
- package/dist-lib/index.d.ts +2 -1
- package/dist-lib/index.js +1432 -932
- package/dist-lib/index.js.map +1 -1
- package/dist-lib/lib/ease.d.ts +3 -0
- package/dist-lib/lib/hooks/use-hover-capable.d.ts +6 -0
- package/package.json +2 -1
- package/src/components/beste/piece/browser-frame.tsx +2 -2
- package/src/components/blocks/nav/sidebar-block.tsx +5 -5
- package/src/components/blocks/nav/sidebar-nav-row.tsx +4 -5
- package/src/components/blocks/scaffold/__tests__/scaffold.test.tsx +203 -0
- package/src/components/blocks/scaffold/constants.ts +28 -0
- package/src/components/blocks/scaffold/index.ts +38 -0
- package/src/components/blocks/scaffold/panel-close-button.tsx +36 -0
- package/src/components/blocks/scaffold/panel-menu-button.tsx +240 -0
- package/src/components/blocks/scaffold/scaffold-actions.tsx +97 -0
- package/src/components/blocks/scaffold/scaffold-canvas.tsx +29 -0
- package/src/components/blocks/scaffold/scaffold-context.ts +18 -0
- package/src/components/blocks/scaffold/scaffold-inspector.tsx +57 -0
- package/src/components/blocks/scaffold/scaffold-main.tsx +28 -0
- package/src/components/blocks/scaffold/scaffold-panel.tsx +98 -0
- package/src/components/blocks/scaffold/scaffold-root.tsx +68 -0
- package/src/components/blocks/scaffold/scaffold-sidebar.tsx +31 -0
- package/src/components/blocks/scaffold/scaffold-sub-panel.tsx +51 -0
- package/src/components/blocks/scaffold/type.ts +171 -0
- package/src/components/blocks/scaffold/use-scaffold.ts +48 -0
- package/src/components/blocks/scaffold/utils.ts +30 -0
- package/src/components/blocks/shell/__tests__/shell-layout.test.tsx +3 -3
- package/src/components/blocks/shell/animated-panel-inset.tsx +23 -0
- package/src/components/blocks/shell/animated-panel-provider.tsx +155 -0
- package/src/components/blocks/shell/animated-panel-trigger.tsx +42 -0
- package/src/components/blocks/shell/animated-panel.tsx +135 -0
- package/src/components/blocks/shell/animated-sidebar-content.tsx +19 -0
- package/src/components/blocks/shell/animated-sidebar-footer.tsx +19 -0
- package/src/components/blocks/shell/animated-sidebar-group-content.tsx +16 -0
- package/src/components/blocks/shell/animated-sidebar-group-label.tsx +29 -0
- package/src/components/blocks/shell/animated-sidebar-group.tsx +16 -0
- package/src/components/blocks/shell/animated-sidebar-header.tsx +16 -0
- package/src/components/blocks/shell/animated-sidebar-menu-button.tsx +151 -0
- package/src/components/blocks/shell/animated-sidebar-menu-item.tsx +20 -0
- package/src/components/blocks/shell/animated-sidebar-menu-sub-button.tsx +85 -0
- package/src/components/blocks/shell/animated-sidebar-menu-sub-item.tsx +19 -0
- package/src/components/blocks/shell/animated-sidebar-menu-sub.tsx +44 -0
- package/src/components/blocks/shell/animated-sidebar-menu.tsx +26 -0
- package/src/components/blocks/shell/index.ts +18 -0
- package/src/components/blocks/shell/shell-layout.tsx +44 -64
- package/src/components/blocks/shell/type.ts +113 -6
- package/src/components/blocks/shell/use-shell-panels.ts +1 -1
- package/src/components/blocks/shell/utils.ts +142 -1
- package/src/components/docs/demo-controls.tsx +1 -1
- package/src/components/motion/index.ts +0 -0
- package/src/components/motion/overflow-actions.tsx +376 -0
- package/src/components/ui/button-group.tsx +88 -0
- package/src/components/ui/button.tsx +3 -3
- package/src/components/ui/glasscn/glass-button-group.tsx +48 -0
- package/src/components/ui/glasscn/glass-container.tsx +125 -0
- package/src/components/ui/glasscn/glass-separator.tsx +39 -0
- package/src/components/ui/glasscn/liquid-glass.tsx +250 -210
- package/src/components/ui/group.tsx +92 -0
- package/src/components/ui/separator.tsx +11 -11
- package/src/components/ui/sheet.tsx +135 -0
- package/src/components/ui/tooltip.tsx +66 -0
- package/src/index.css +1 -1
- package/src/index.ts +13 -1
- package/src/lib/ease.ts +26 -0
- package/src/lib/hooks/use-hover-capable.ts +23 -0
- package/dist-lib/components/motion/animated-sidebar.d.ts +0 -109
- package/src/components/motion/animated-sidebar.tsx +0 -1196
package/dist-lib/index.js.map
CHANGED
|
@@ -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/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/shell/use-shell-panels.ts","../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'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'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 useMemo,\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\nexport type SidebarSide = \"left\" | \"right\"\n/** Open flags keyed by the side. Sides left out stay uncontrolled / at their\n * default — there is no per-side prop, the record IS the API. */\nexport type SidebarOpenState = Partial<Record<SidebarSide, boolean>>\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 /** Desktop open state, keyed by side. */\n open: Record<SidebarSide, boolean>\n /** Mobile overlay open state, keyed by side. */\n openMobile: Record<SidebarSide, boolean>\n reduce: boolean\n setOpen: (open: boolean, side: SidebarSide) => void\n setOpenMobile: (open: boolean, side: SidebarSide) => void\n /** Mobile-aware: toggles the overlay below md, the docked panel above. */\n toggleSidebar: (side: SidebarSide) => void\n triggerRefs: Record<SidebarSide, 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 /** Controlled desktop open state, keyed by the side. A side left undefined\n * stays uncontrolled. */\n open?: SidebarOpenState\n /** Initial desktop open state, merged over `{ left: true, right: false }`. */\n defaultOpen?: SidebarOpenState\n onOpenChange?: (open: boolean, side: SidebarSide) => void\n /** Controlled mobile overlay state, keyed by side. */\n openMobile?: SidebarOpenState\n /** Initial mobile overlay state — every side starts closed. */\n defaultOpenMobile?: SidebarOpenState\n onOpenMobileChange?: (open: boolean, side: SidebarSide) => void\n style?: SidebarProviderStyle\n}\n\nexport function AnimatedSidebarProvider({\n children,\n open,\n defaultOpen,\n onOpenChange,\n openMobile,\n defaultOpenMobile,\n onOpenMobileChange,\n className,\n style,\n ...props\n}: AnimatedSidebarProviderProps) {\n const [internalOpen, setInternalOpen] = useState<\n Record<SidebarSide, boolean>\n >(() => ({\n left: defaultOpen?.left ?? true,\n right: defaultOpen?.right ?? false,\n }))\n const [internalOpenMobile, setInternalOpenMobile] = useState<\n Record<SidebarSide, boolean>\n >(() => ({\n left: defaultOpenMobile?.left ?? false,\n right: defaultOpenMobile?.right ?? false,\n }))\n const isMobile = useIsMobile()\n const reduce = useReducedMotion() ?? false\n const generatedId = useId()\n const leftTriggerRef = useRef<HTMLButtonElement>(null)\n const rightTriggerRef = useRef<HTMLButtonElement>(null)\n\n // Per-side controlled/uncontrolled merge — a side is controlled exactly\n // when its key is present on the controlled record.\n const controlledLeft = open?.left\n const controlledRight = open?.right\n const controlledMobileLeft = openMobile?.left\n const controlledMobileRight = openMobile?.right\n\n const openState = useMemo<Record<SidebarSide, boolean>>(\n () => ({\n left: controlledLeft ?? internalOpen.left,\n right: controlledRight ?? internalOpen.right,\n }),\n [controlledLeft, controlledRight, internalOpen]\n )\n const openMobileState = useMemo<Record<SidebarSide, boolean>>(\n () => ({\n left: controlledMobileLeft ?? internalOpenMobile.left,\n right: controlledMobileRight ?? internalOpenMobile.right,\n }),\n [controlledMobileLeft, controlledMobileRight, internalOpenMobile]\n )\n\n const setOpen = useCallback(\n (nextOpen: boolean, side: SidebarSide) => {\n const controlled = side === \"left\" ? controlledLeft : controlledRight\n if (controlled === undefined) {\n setInternalOpen((prev) =>\n prev[side] === nextOpen ? prev : { ...prev, [side]: nextOpen }\n )\n }\n onOpenChange?.(nextOpen, side)\n },\n [controlledLeft, controlledRight, onOpenChange]\n )\n\n const setOpenMobile = useCallback(\n (nextOpen: boolean, side: SidebarSide) => {\n const controlled =\n side === \"left\" ? controlledMobileLeft : controlledMobileRight\n if (controlled === undefined) {\n setInternalOpenMobile((prev) =>\n prev[side] === nextOpen ? prev : { ...prev, [side]: nextOpen }\n )\n }\n onOpenMobileChange?.(nextOpen, side)\n },\n [controlledMobileLeft, controlledMobileRight, onOpenMobileChange]\n )\n\n const toggleSidebar = useCallback(\n (side: SidebarSide) => {\n if (isMobile) setOpenMobile(!openMobileState[side], side)\n else setOpen(!openState[side], side)\n },\n [isMobile, openMobileState, openState, setOpen, setOpenMobile]\n )\n\n const triggerRefs = useMemo(\n () => ({ left: leftTriggerRef, right: rightTriggerRef }),\n []\n )\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(\"left\")\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: openState,\n openMobile: openMobileState,\n reduce,\n setOpen,\n setOpenMobile,\n toggleSidebar,\n triggerRefs,\n }}\n >\n <div\n {...props}\n data-slot=\"sidebar-wrapper\"\n data-state-left={openState.left ? \"expanded\" : \"collapsed\"}\n data-state-right={openState.right ? \"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 open = context.openMobile[side]\n const setOpen = (nextOpen: boolean) => context.setOpenMobile(nextOpen, side)\n const triggerRef = context.triggerRefs[side]\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 = context.open[side]\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 off canvas 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-(--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 expanded = context.isMobile\n ? context.openMobile[side]\n : context.open[side]\n const triggerRef = context.triggerRefs[side]\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 context.toggleSidebar(side)\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 (context.isMobile) context.setOpenMobile(false, side)\n else context.setOpen(false, side)\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 context.toggleSidebar(panel.side)\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 const panel = useAnimatedSidebarPanel()\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) {\n context.setOpenMobile(false, panel.side)\n }\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, panel.side)\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. The\n // block is a single panel, so its scalar open props map onto the\n // provider's side-keyed records under the block's own `side`.\n className=\"h-full min-h-0 w-auto\"\n defaultOpen={{ [side]: defaultOpen ?? true }}\n defaultOpenMobile={\n defaultOpenMobile === undefined ? undefined : { [side]: defaultOpenMobile }\n }\n onOpenChange={(nextOpen, changedSide) => {\n if (changedSide === side) onOpenChange?.(nextOpen)\n }}\n onOpenMobileChange={(nextOpen, changedSide) => {\n if (changedSide === side) onOpenMobileChange?.(nextOpen)\n }}\n open={open === undefined ? undefined : { [side]: open }}\n openMobile={openMobile === undefined ? undefined : { [side]: 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 { MotionIcon } from \"motion-icons-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, ShellPanelControlProps } from \"./type\"\nimport { TITLE_BAR_HEIGHT } from \"./utils\"\nimport type { ClassNameValue } from \"tailwind-merge\"\n\nexport function ShellLayout({\n children,\n variant = \"desktop\",\n panels,\n className,\n defaultOpen,\n ...panelControlProps\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\n // Each panel seeds its own side's initial state (`defaultOpen ?? open`);\n // an explicit `defaultOpen` record — usually from useShellPanels — wins\n // per side.\n const initialOpen: ShellPanelControlProps[\"defaultOpen\"] = {\n ...(panels?.left && {\n left: panels.left.defaultOpen ?? panels.left.open,\n }),\n ...(panels?.right && {\n right: panels.right.defaultOpen ?? panels.right.open,\n }),\n ...(defaultOpen)\n }\n\n return (\n <AnimatedSidebarProvider\n {...panelControlProps}\n defaultOpen={initialOpen}\n className={cn(\"block-full\", className, background, \"relative pr-2\")}\n style={{\n paddingTop: variant === \"desktop\" ? TITLE_BAR_HEIGHT : 0\n }}\n >\n <AnimatedSidebar\n ariaLabel=\"Primary navigation\"\n collapsible=\"icon\"\n role=\"navigation\"\n variant=\"inset\"\n >\n {panels?.left?.component}\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 {panels?.left?.trigger ?? (\n <MotionIcon name=\"PanelLeft\" size={24} animation=\"press\" />\n )}\n </AnimatedSidebarTrigger>\n </div>\n <div className=\"flex shrink-0 items-center gap-3\">\n <AnimatedSidebarTrigger aria-label=\"Toggle panel\" side=\"right\">\n {panels?.right?.trigger ?? (\n <MotionIcon name=\"PanelRight\" size={24} animation=\"press\" />\n )}\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 <AnimatedSidebar\n ariaLabel={panels?.right?.name ?? \"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 {panels?.right?.component}\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 { useCallback, useMemo, useState } from \"react\"\n\nimport type { SidebarSide } from \"@/components/motion/animated-sidebar\"\nimport type {\n ShellPanelControlProps,\n ShellPanelControls,\n UseShellPanelsOptions,\n} from \"./type\"\n\n/**\n * Owns the open/close state of the shell's panels, keyed by side, and\n * reports every change through a single `onPanelChange(open, side)`\n * callback. Spread the returned `providerProps` onto ShellLayout; the\n * setters and `toggle` are for UI that lives outside the shell (title-bar\n * buttons, command palette, shortcuts).\n */\nexport function useShellPanels({\n defaultOpen,\n defaultOpenMobile,\n onPanelChange,\n}: UseShellPanelsOptions = {}): ShellPanelControls {\n const [open, setOpenState] = useState<Record<SidebarSide, boolean>>(() => ({\n left: defaultOpen?.left ?? true,\n right: defaultOpen?.right ?? false,\n }))\n const [openMobile, setOpenMobileState] = useState<\n Record<SidebarSide, boolean>\n >(() => ({\n left: defaultOpenMobile?.left ?? false,\n right: defaultOpenMobile?.right ?? false,\n }))\n\n const setOpen = useCallback(\n (nextOpen: boolean, side: SidebarSide) => {\n setOpenState((prev) =>\n prev[side] === nextOpen ? prev : { ...prev, [side]: nextOpen }\n )\n onPanelChange?.(nextOpen, side)\n },\n [onPanelChange]\n )\n\n const setOpenMobile = useCallback(\n (nextOpen: boolean, side: SidebarSide) => {\n setOpenMobileState((prev) =>\n prev[side] === nextOpen ? prev : { ...prev, [side]: nextOpen }\n )\n onPanelChange?.(nextOpen, side)\n },\n [onPanelChange]\n )\n\n const toggle = useCallback(\n (side: SidebarSide) => setOpen(!open[side], side),\n [open, setOpen]\n )\n\n const providerProps = useMemo<ShellPanelControlProps>(\n () => ({\n open,\n onOpenChange: setOpen,\n openMobile,\n onOpenMobileChange: setOpenMobile,\n }),\n [open, openMobile, setOpen, setOpenMobile]\n )\n\n return {\n open,\n openMobile,\n setOpen,\n setOpenMobile,\n toggle,\n providerProps,\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":";;;;;;;;;;;;;;;;;;;;;;AAGA,SAAgB,EAAG,GAAG,GAAsB;CAC1C,OAAO,EAAQ,EAAK,CAAM,CAAC;AAC7B;;;ACCA,SAAgB,GAAO,EACrB,cACA,GAAG,KAC8C;CACjD,OACE,kBAAC,EAAgB,MAAjB;EACE,WAAW,EACT,mJACA,CACF;EACA,aAAU;EACV,GAAI;CACL,CAAA;AAEL;AAEA,SAAgB,GAAY,EAC1B,cACA,GAAG,KAC+C;CAClD,OACE,kBAAC,EAAgB,OAAjB;EACE,WAAW,EAAG,0BAA0B,CAAS;EACjD,aAAU;EACV,GAAI;CACL,CAAA;AAEL;AAEA,SAAgB,GAAe,EAC7B,cACA,GAAG,KACkD;CACrD,OACE,kBAAC,EAAgB,UAAjB;EACE,WAAW,EACT,oEACA,CACF;EACA,aAAU;EACV,GAAI;CACL,CAAA;AAEL;;;AC7CA,SAAgB,GAAQ,EACtB,cACA,GAAG,KAC4D;CAC/D,OACE,kBAAC,GAAD;EACE,cAAW;EACX,WAAW,EAAG,gBAAgB,CAAS;EACvC,MAAK;EACL,GAAI;CACL,CAAA;AAEL;;;ACOA,IAAM,KAAmB,KACnB,KAAgB,MAEhB,qBAAuB,IAAI,IAAoB;AAMrD,SAAS,KAA4B;CACnC,IAAI,OAAO,YAAc,KAAa,OAAO;CAC7C,IAAM,IAAK,UAAU;CAErB,QADmB,eAAe,KAAK,CAAE,KAAK,QAAQ,KAAK,CAAE,MACxC,CAAC,UAAU,KAAK,CAAE;AACzC;AASA,SAAS,GAAsB,EAAE,UAAO,WAAQ,WAAQ,YAAsB;CAC5E,IAAM,IAAW,GAAG,EAAM,GAAG,EAAO,GAAG,EAAO,GAAG,KAC3C,IAAS,GAAqB,IAAI,CAAQ;CAChD,IAAI,MAAW,KAAA,GAAW,OAAO;CAEjC,IAAM,IAAY,KAAK,IAAI,GAAG,KAAmB,KAAK,IAAI,GAAO,CAAM,CAAC,GAClE,IAAW,KAAK,IAAI,GAAG,KAAK,MAAM,IAAQ,CAAS,CAAC,GACpD,IAAY,KAAK,IAAI,GAAG,KAAK,MAAM,IAAS,CAAS,CAAC,GAEtD,IAAS,SAAS,cAAc,QAAQ;CAE9C,AADA,EAAO,QAAQ,GACf,EAAO,SAAS;CAChB,IAAM,IAAM,EAAO,WAAW,IAAI;CAClC,IAAI,CAAC,GAAK,OAAO;CAEjB,IAAM,IAAQ,EAAI,gBAAgB,GAAU,CAAS,GAC/C,IAAO,EAAM,MACb,IAAY,IAAQ,GACpB,IAAa,IAAS,GACtB,IAAI,KAAK,IAAI,GAAQ,GAAW,CAAU,GAC1C,IAAU,KAAK,IAAI,GAAG,IAAQ,KAAK,IAAI,GAAW,CAAU,CAAC;CAEnE,KAAK,IAAI,IAAK,GAAG,IAAK,GAAW,KAAM,GACrC,KAAK,IAAI,IAAK,GAAG,IAAK,GAAU,KAAM,GAAG;EAEvC,IAAM,KAAO,IAAK,MAAO,IAAY,IAAQ,GACvC,KAAO,IAAK,MAAO,IAAa,IAAS,GAGzC,IAAK,KAAK,IAAI,CAAE,KAAK,IAAY,IACjC,IAAK,KAAK,IAAI,CAAE,KAAK,IAAa,IACpC,GACA,IAAO,GACP,IAAO;EACX,IAAI,IAAK,KAAK,IAAK,GAAG;GACpB,IAAM,IAAM,KAAK,MAAM,GAAI,CAAE;GAG7B,AAFA,IAAiB,IAAM,GACvB,IAAQ,KAAK,KAAK,CAAE,IAAI,IAAM,GAC9B,IAAQ,KAAK,KAAK,CAAE,IAAI,IAAM;EAChC,OAAO,AAAI,IAAK,KACd,IAAiB,IAAK,GACtB,IAAO,KAAK,KAAK,CAAE,MAEnB,IAAiB,IAAK,GACtB,IAAO,KAAK,KAAK,CAAE;EAGrB,IAAM,KAAS,IAAK,IAAW,KAAM,GAC/B,IAAS,CAAC;EAEhB,IAAI,KAAU,GAAG;GAIf,AAHA,EAAK,KAAS,KACd,EAAK,IAAQ,KAAK,KAClB,EAAK,IAAQ,KAAK,KAClB,EAAK,IAAQ,KAAK;GAClB;EACF;EAGA,IAAI,IAAY,IAAI,GADV,KAAK,IAAI,GAAG,IAAS,CACI,CAAC;EAMpC,AALA,KAAa,KAAK,IAAI,GAAG,IAAS,EAAa,GAE/C,EAAK,KAAS,KAAK,MAAM,MAAM,IAAO,IAAY,GAAG,GACrD,EAAK,IAAQ,KAAK,KAAK,MAAM,MAAM,IAAO,IAAY,GAAG,GACzD,EAAK,IAAQ,KAAK,KAClB,EAAK,IAAQ,KAAK;CACpB;CAGF,EAAI,aAAa,GAAO,GAAG,CAAC;CAC5B,IAAM,IAAS,EAAO,UAAU,WAAW;CAE3C,OADA,GAAqB,IAAI,GAAU,CAAM,GAClC;AACT;AAEA,SAAS,GAAe,GAAW;CACjC,QAAgB,KAAa,IAAI,MAAG,MAAI;AAC1C;AAkBA,IAAa,KAAc,EAA6C,SACtE,EACE,UAAO,GACP,gBAAa,IACb,SAAS,GACT,WAAQ,KACR,gBAAa,MACb,cACA,UACA,aACA,GAAG,KAEL,GACA;CACA,IAAM,IAAQ,GAAM,GACd,IAAW,SAAc,gBAAgB,EAAM,QAAQ,MAAM,EAAE,KAAK,CAAC,CAAK,CAAC;CACjF,QAAQ,IAAI,CAAQ;CAMpB,IAAM,IAAW,EAA8B,IAAI,GAC7C,IAAU,GACb,MAAgC;EAE/B,AADA,EAAS,UAAU,GACf,OAAO,KAAQ,aAAY,EAAI,CAAI,IAC9B,MAAK,EAAI,UAAU;CAC9B,GACA,CAAC,CAAG,CACN,GAMM,CAAC,GAAU,KAAe,EAA6B,IAAI;CAEjE,QAAgB;EACd,IAAM,IAAK,EAAS;EACpB,IAAI,CAAC,GAAI;EACT,IAAM,UAAgB;GACpB,IAAM,IAAO,EAAG,sBAAsB,GAChC,IAAQ,KAAK,MAAM,EAAK,KAAK,GAC7B,IAAS,KAAK,MAAM,EAAK,MAAM;GACrC,IAAI,CAAC,KAAS,CAAC,GAAQ;GACvB,IAAM,IAAS,OAAO,WAAW,iBAAiB,CAAE,CAAC,CAAC,mBAAmB,GACnE,IAAS,KAAK,IAAI,OAAO,SAAS,CAAM,IAAI,IAAS,KAAK,IAAI,GAAO,CAAM,IAAI,GAAG,IAAQ,GAAG,IAAS,CAAC;GAC7G,GAAa,MACX,KAAQ,EAAK,UAAU,KAAS,EAAK,WAAW,KAAU,EAAK,WAAW,KAAU,EAAK,UAAU,IAC/F,IACA;IAAE;IAAO;IAAQ;IAAQ;GAAM,CACrC;EACF;EACA,EAAQ;EACR,IAAM,IAAW,IAAI,eAAe,CAAO;EAE3C,OADA,EAAS,QAAQ,CAAE,SACN,EAAS,WAAW;CACnC,GAAG,CAAC,CAAK,CAAC;CAEV,IAAM,IAAS,SAAe,IAAW,GAAsB,CAAQ,IAAI,IAAK,CAAC,CAAQ,CAAC,GASpF,CAAC,GAAW,KAAgB,EAAS,EAAK;CAEhD,QAAgB;EACd,EAAa,GAA0B,CAAC;CAC1C,GAAG,CAAC,CAAC;CAEL,IAAM,IAAmB,KAAa,MAAW,IAC3C,IAAiB,IACnB,QAAQ,EAAS,SAAS,EAAK,eAAe,EAAW,KACzD,QAAQ,IAAO,EAAE,eAAe,EAAW;CAE/C,OACE,kBAAA,GAAA,EAAA,UAAA,CACE,kBAAC,OAAD;EACE,KAAK;EACL,WAAW,EACT,yDACA,CACF;EACA,OAAO;GAAE,GAAG;GAAO;GAAgB,sBAAsB;EAAe;EACxE,GAAI;YAPN,CASG,GACD,kBAAC,QAAD;GACE,eAAA;GACA,WAAU;GACV,OAAO;IAEL,SAAS;IACT,YASE;IAEF,YAAY;IACZ,qBAAqB;IACrB,MAAM;GACR;EACD,CAAA,CACE;KAEJ,KACC,kBAAC,OAAD;EAAK,WAAU;EAAkC,eAAA;YAC/C,kBAAC,UAAD;GAAQ,IAAI;GAAU,GAAE;GAAI,GAAE;GAAI,OAAM;GAAO,QAAO;GAAO,2BAA0B;aAAvF;IACE,kBAAC,WAAD;KAAS,MAAM;KAAQ,GAAE;KAAI,GAAE;KAAI,OAAM;KAAO,QAAO;KAAO,qBAAoB;KAAO,QAAO;IAAO,CAAA;IACvG,kBAAC,qBAAD;KACE,IAAG;KACH,KAAI;KACJ,OAAO;KACP,kBAAiB;KACjB,kBAAiB;KACjB,QAAO;IACR,CAAA;IACD,kBAAC,kBAAD;KAAgB,IAAG;KAAY,cAAa;IAAQ,CAAA;GAC9C;;CACL,CAAA,CAEP,EAAA,CAAA;AAEN,CAAC,GC9QY,KAAwD;CACnE,OAAO;EACL;EACA;EACA;EACA;CACF,CAAC,CAAC,KAAK,GAAG;CACV,SAAS;EACP;EACA;EACA;EACA;CACF,CAAC,CAAC,KAAK,GAAG;CACV,QAAQ;EACN;EACA;EACA;EACA;CACF,CAAC,CAAC,KAAK,GAAG;CACV,QAAQ;EAGN;EACA;EAGA;EAIA;EACA;EACA;EACA;EAOA;EACA;EAGA;EAGA;EACA;CACF,CAAC,CAAC,KAAK,GAAG;CACV,kBAAkB;AACpB,GCzCa,KAAiB,EAC5B,8nCACA;CACE,kBAAkB,CAChB;EAgBE,OAAO;EACP,MAAM;GAAC;GAAM;GAAM;GAAW;GAAM;EAAI;EACxC,SAAS;CACX,CACF;CACA,iBAAiB;EACf,MAAM;EACN,SAAS;CACX;CACA,UAAU;EACR,MAAM;GACJ,SAAS;GACT,MAAM;GACN,WAAW;GACX,WAAW;GACX,WACE;GACF,WACE;GACF,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;EACN;EACA,SAAS;GACP,SACE;GACF,aACE;GACF,uBACE;GACF,OACE;GAIF,OACE;GACF,MAAM;GACN,SACE;GACF,WACE;EACJ;CACF;AACF,CACF;AA2BA,SAAgB,EAAO,EACrB,cACA,YACA,SACA,WACA,aACA,aAAU,IACV,UAAU,GACV,iBACA,WAAQ,IACR,GAAG,KAC+B;CAClC,IAAM,IAAsB,GAAQ,KAAW,IACzC,IACJ,IAAS,KAAA,IAAY,UAEjB,IACJ,MAAY,UAAW,KAAgB,mBAAoB,KAAA,GACvD,IAAkB,MAAyB,kBAI3C,KAAc,KAAQ,UAAA,CAAW,WAAW,MAAM,GAuDlD,IAAU,EAAU;EACxB,gBAAgB;EAChB,OAAO,EAAqB;GAtD5B,UACE,kBAAA,GAAA,EAAA,UAAA;IACG,CAAC,KAIA,kBAAC,QAAD;KACE,eAAa,MAAU,KAAA;KACvB,aAAU;KACV,WAAW,EACT,8LACA,IACI,YACA,EACE,gCACA,MAAS,OAAO,UAAU,MAAS,OAAO,YAAY,OACxD,CACN;eAEA,kBAAC,IAAD,EAAS,WAAW,IAAU,KAAA,IAAY,eAAiB,CAAA;IACvD,CAAA;IAEP;IACA,KAAW,KACV,kBAAC,IAAD;KACE,WAAU;KACV,aAAU;IACX,CAAA;GAEH,EAAA,CAAA;GAEJ,WAAW,EACT,GAAe;IAAE;IAAM;GAAQ,CAAC,GAGhC,CAAC,KACC,0FACF,KAAW,KAAc,iCACzB,KAAwB,GAAmB,IAC3C,KAAA,uCACA,CACF;GACA,iBAAiB,KAAW,KAAA;GAC5B,sBAAsB,IAAQ,KAAK,KAAA;GACnC,wBAAwB,IAAQ,KAAK,KAAA;GACrC,gBAAgB,IAAU,KAAK,KAAA;GAC/B,sBAAsB;GACtB,aAAa;GACb,UAAU;GACV,MAAM;EAKsB,GAAc,CAAK;EAC/C;CACF,CAAC;CAQD,OAJI,IACK,kBAAC,IAAD,EAAA,UAAc,EAAqB,CAAA,IAGrC;AACT;;;AC/LA,SAAgB,GAAK,EACnB,cACA,WACA,GAAG,KACmD;CAStD,OAAO,EAAU;EACf,gBAAgB;EAChB,OAAO,EAAkB;GATzB,WAAW,EACT,4TACA,CACF;GACA,aAAa;EAKY,GAAc,CAAK;EAC5C;CACF,CAAC;AACH;AAEA,SAAgB,GAAU,EACxB,cACA,WACA,GAAG,KACmD;CAStD,OAAO,EAAU;EACf,gBAAgB;EAChB,OAAO,EAAkB;GATzB,WAAW,EACT,0iCACA,CACF;GACA,aAAa;EAKY,GAAc,CAAK;EAC5C;CACF,CAAC;AACH;AAEA,SAAgB,GAAgB,EAC9B,cACA,WACA,GAAG,KACmD;CAStD,OAAO,EAAU;EACf,gBAAgB;EAChB,OAAO,EAAkB;GATzB,WAAW,EACT,wJACA,CACF;GACA,aAAa;EAKY,GAAc,CAAK;EAC5C;CACF,CAAC;AACH;AAEA,SAAgB,GAAe,EAC7B,cACA,WACA,GAAG,KACmD;CAMtD,OAAO,EAAU;EACf,gBAAgB;EAChB,OAAO,EAAkB;GANzB,WAAW,EAAG,qCAAqC,CAAS;GAC5D,aAAa;EAKY,GAAc,CAAK;EAC5C;CACF,CAAC;AACH;AAEA,SAAgB,GAAqB,EACnC,cACA,WACA,GAAG,KACmD;CAMtD,OAAO,EAAU;EACf,gBAAgB;EAChB,OAAO,EAAkB;GANzB,WAAW,EAAG,6CAA6C,CAAS;GACpE,aAAa;EAKY,GAAc,CAAK;EAC5C;CACF,CAAC;AACH;AAEA,SAAgB,GAAgB,EAC9B,cACA,WACA,GAAG,KACmD;CAStD,OAAO,EAAU;EACf,gBAAgB;EAChB,OAAO,EAAkB;GATzB,WAAW,EACT,2FACA,CACF;GACA,aAAa;EAKY,GAAc,CAAK;EAC5C;CACF,CAAC;AACH;AAEA,SAAgB,GAAgB,EAC9B,cACA,WACA,GAAG,KACmD;CAMtD,OAAO,EAAU;EACf,gBAAgB;EAChB,OAAO,EAAkB;GANzB,WAAW,EAAG,aAAa,CAAS;GACpC,aAAa;EAKY,GAAc,CAAK;EAC5C;CACF,CAAC;AACH;AAEA,SAAgB,GAAW,EACzB,cACA,WACA,GAAG,KACmD;CAStD,OAAO,EAAU;EACf,gBAAgB;EAChB,OAAO,EAAkB;GATzB,WAAW,EACT,6KACA,CACF;GACA,aAAa;EAKY,GAAc,CAAK;EAC5C;CACF,CAAC;AACH;AAEA,SAAgB,GAAU,EACxB,cACA,WACA,GAAG,KACmD;CAMtD,OAAO,EAAU;EACf,gBAAgB;EAChB,OAAO,EAAkB;GANzB,WAAW,EAAG,mDAAmD,CAAS;GAC1E,aAAa;EAKY,GAAc,CAAK;EAC5C;CACF,CAAC;AACH;AAEA,SAAgB,GAAgB,EAC9B,cACA,WACA,GAAG,KACmD;CAMtD,OAAO,EAAU;EACf,gBAAgB;EAChB,OAAO,EAAkB;GANzB,WAAW,EAAG,iCAAiC,CAAS;GACxD,aAAa;EAKY,GAAc,CAAK;EAC5C;CACF,CAAC;AACH;AAEA,SAAgB,GAAW,EACzB,cACA,WACA,GAAG,KACmD;CAStD,OAAO,EAAU;EACf,gBAAgB;EAChB,OAAO,EAAkB;GATzB,WAAW,EACT,8EACA,CACF;GACA,aAAa;EAKY,GAAc,CAAK;EAC5C;CACF,CAAC;AACH;AAEA,SAAgB,GAAU,EACxB,cACA,WACA,GAAG,KACmD;CAStD,OAAO,EAAU;EACf,gBAAgB;EAChB,OAAO,EAAkB;GATzB,WAAW,EACT,8JACA,CACF;GACA,aAAa;EAKY,GAAc,CAAK;EAC5C;CACF,CAAC;AACH;AAEA,SAAgB,GAAW,EACzB,cACA,WACA,GAAG,KACmD;CAStD,OAAO,EAAU;EACf,gBAAgB;EAChB,OAAO,EAAkB;GATzB,WAAW,EACT,iFACA,CACF;GACA,aAAa;EAKY,GAAc,CAAK;EAC5C;CACF,CAAC;AACH;;;AC3OA,IAAI,KAAQ;AAGZ,SAAgB,GAAW,GAAyB;CAElD,AADA,KAAQ,IACR,GAAK,CAAI;AACX;AAOA,SAAgB,GAAQ,GAAiB,GAAqC;CAC5E,AAAI,MAAO,GAAK,GAAM,CAAO;AAC/B;;;ACvBA,SAAgB,GAAS,EACvB,cACA,WAAQ,IACR,oBACA,GAAG,KAIkB;CACrB,OACE,kBAAC,GAAkB,MAAnB;EAME,kBAAkB,GAAS,MAAiB;GAE1C,AADI,KAAO,GAAQ,QAAQ,GAC3B,IAAkB,GAAS,CAAY;EACzC;EACA,WAAW,EACT,o5BACA,CACF;EACA,aAAU;EACV,GAAI;YAEJ,kBAAC,GAAkB,WAAnB;GACE,WAAU;GACV,aAAU;GACV,SACE,GACA,MAEA,kBAAC,QAAD;IAAM,GAAI;cACP,EAAM,gBACL,kBAAC,OAAD;KACE,eAAY;KACZ,WAAU;KACV,MAAK;KACL,QAAO;KACP,QAAO;KACP,eAAc;KACd,gBAAe;KACf,aAAY;KACZ,SAAQ;KACR,OAAM;KACN,OAAM;eAEN,kBAAC,QAAD,EAAM,GAAE,mBAAoB,CAAA;IACzB,CAAA,IAEL,kBAAC,OAAD;KACE,eAAY;KACZ,WAAU;KACV,MAAK;KACL,QAAO;KACP,QAAO;KACP,eAAc;KACd,gBAAe;KACf,aAAY;KACZ,SAAQ;KACR,OAAM;KACN,OAAM;eAEN,kBAAC,QAAD,EAAM,GAAE,qCAAsC,CAAA;IAC3C,CAAA;GAEH,CAAA;EAET,CAAA;CACqB,CAAA;AAE5B;;;AC1EA,SAAgB,EAAM,EACpB,cACA,GAAG,KAC6C;CAChD,OACE,kBAAC,GAAe,MAAhB;EACE,WAAW,EAAG,mCAAmC,CAAS;EAC1D,aAAU;EACV,GAAI;CACL,CAAA;AAEL;AAEA,SAAgB,EAAW,EACzB,cACA,GAAG,KAC8C;CACjD,OACE,kBAAC,GAAe,OAAhB;EACE,WAAW,EACT,uKACA,CACF;EACA,aAAU;EACV,GAAI;CACL,CAAA;AAEL;AAEA,SAAgB,GAAU,EACxB,cACA,GAAG,KAC6C;CAChD,OACE,kBAAC,GAAe,MAAhB;EACE,WAAW,EAAG,QAAQ,CAAS;EAC/B,aAAU;EACV,GAAI;CACL,CAAA;AAEL;AAEA,SAAgB,GAAiB,EAC/B,cACA,GAAG,KACoD;CACvD,OACE,kBAAC,GAAe,aAAhB;EAIE,WAAW,EACT,oOACA,CACF;EACA,aAAU;EACV,GAAI;CACL,CAAA;AAEL;AAEA,SAAgB,GAAW,EACzB,cACA,GAAG,KAC8C;CACjD,OACE,kBAAC,GAAe,OAAhB;EACE,WAAW,EACT,0OACA,CACF;EACA,aAAU;EACV,GAAI;CACL,CAAA;AAEL;AAEA,IAAa,KACX,GAAe,SACJ,KACX,GAAe;;;ACnFjB,SAAgB,GAAM,EACpB,cACA,GAAG,KAC+C;CAClD,OACE,kBAAC,OAAD;EACE,WAAW,EACT,sDACA,4DACA,CACF;EACA,aAAU;EACV,GAAI;CACL,CAAA;AAEL;AAEA,SAAgB,GAAW,EACzB,cACA,GAAG,KAC+C;CAClD,OACE,kBAAC,OAAD;EACE,WAAW,EACT,wRACA,CACF;EACA,aAAU;EACV,GAAI;CACL,CAAA;AAEL;AAEA,SAAgB,GAAY,EAC1B,cACA,GAAG,KACkD;CACrD,OACE,kBAAC,UAAD;EACE,WAAW,EAAG,2BAA2B,CAAS;EAClD,aAAU;EACV,GAAI;CACL,CAAA;AAEL;AAEA,SAAgB,GAAW,EACzB,cACA,GAAG,KAC+C;CAClD,OACE,kBAAC,OAAD;EACE,WAAW,EAAG,yBAAyB,CAAS;EAChD,aAAU;EACV,GAAI;CACL,CAAA;AAEL;AAEA,SAAgB,GAAiB,EAC/B,cACA,GAAG,KAC+C;CAClD,OACE,kBAAC,OAAD;EACE,WAAW,EAAG,iCAAiC,CAAS;EACxD,aAAU;EACV,GAAI;CACL,CAAA;AAEL;AAEA,SAAgB,GAAY,EAC1B,cACA,GAAG,KACkD;CACrD,OACE,kBAAC,UAAD;EACE,WAAW,EAAG,aAAa,CAAS;EACpC,aAAU;EACV,GAAI;CACL,CAAA;AAEL;;;ACvEA,SAAgB,GAAM,EACpB,cACA,UAAO,WACP,cAAW,IACX,iBAAc,IACd,UACA,GAAG,KAC8B;CACjC,IAAM,IAAiB,EAGrB,+aACA,MAAS,QACP,2EACF,MAAS,QAAQ,6CACjB,EAAM,SAAS,YACb,8MACF,EAAM,SAAS,UACb,wGACJ;CAEA,OACE,kBAAC,QAAD;EACE,WACE,EACE,CAAC,KACC,qiCACF,CACF,KAAK,KAAA;EAEP,aAAW;EACX,aAAU;YAET,IACC,kBAAC,SAAD;GACE,WAAW;GACX,aAAU;GACV,MAAM,OAAO,KAAS,WAAW,IAAO,KAAA;GACxC,OAAO,OAAO,KAAU,aAAa,KAAA,IAAY;GACjD,GAAI;EACL,CAAA,IAED,kBAAC,IAAD;GACE,WAAW;GACX,aAAU;GACV,MAAM,OAAO,KAAS,WAAW,IAAO,KAAA;GACjC;GACP,GAAI;EACL,CAAA;CAEC,CAAA;AAEV;;;ACtDA,SAAgB,GAAS,EACvB,cACA,UAAO,WACP,cAAW,IACX,QACA,GAAG,KACiC;CACpC,OACE,kBAAC,QAAD;EACE,WACE,EACE,CAAC,KACC,w1BACF,CACF,KAAK,KAAA;EAEP,aAAW;EACX,aAAU;YAEV,kBAAC,GAAe,SAAhB;GACO;GACL,OAAO,EAAM;GACb,cAAc,EAAM;GACpB,UAAU,EAAM;GAChB,IAAI,EAAM;GACV,MAAM,EAAM;GACZ,SAAS,MACP,kBAAC,YAAD;IACE,WAAW,EACT,qJACA,MAAS,QACP,0FACF,MAAS,QACP,0DACJ;IACA,aAAU;IACV,GAAI,EAAW,GAAc,CAAK;GACnC,CAAA;EAEJ,CAAA;CACG,CAAA;AAEV;;;AC/CA,IAAM,KAA0B,EAC9B,+cACA;CACE,iBAAiB,EACf,OAAO,eACT;CACA,UAAU,EACR,OAAO;EACL,aACE;EACF,eACE;EACF,cACE;EACF,gBACE;CACJ,EACF;AACF,CACF;AAEA,SAAgB,GAAW,EACzB,cACA,GAAG,KAC+C;CAClD,OACE,kBAAC,OAAD;EACE,WAAW,EACT,uyEACA,CACF;EACA,aAAU;EACV,MAAK;EACL,GAAI;CACL,CAAA;AAEL;AAEA,SAAgB,GAAgB,EAC9B,cACA,WAAQ,gBACR,GAAG,KAE+D;CAClE,OACE,kBAAC,OAAD;EACE,WAAW,EAAG,GAAwB,EAAE,SAAM,CAAC,GAAG,CAAS;EAC3D,cAAY;EACZ,aAAU;EACV,cAAc,MAAwC;GAKpD,IAJe,EAAE,OACY,QAC3B,wHAEE,GAAe;GACnB,EAAE,eAAe;GACjB,IAAM,IAAS,EAAE,cAAc,eACzB,IAAQ,GAAQ,cAEpB,iBAAiB;GACnB,AAAI,KAAS,CAAC,GAAQ,cAAc,6BAA6B,KAC/D,EAAM,MAAM;EAEhB;EACA,GAAI;CACL,CAAA;AAEL;AAEA,SAAgB,GAAe,EAC7B,cACA,GAAG,KACgD;CACnD,OACE,kBAAC,QAAD;EACE,WAAW,EACT,0YACA,CACF;EACA,GAAI;CACL,CAAA;AAEL;AAEA,SAAgB,GAAgB,EAC9B,cACA,GAAG,KAC8B;CACjC,OAAO,kBAAC,IAAD;EAAkB;EAAW,UAAA;EAAS,GAAI;CAAQ,CAAA;AAC3D;AAEA,SAAgB,GAAmB,EACjC,cACA,GAAG,KACiC;CACpC,OAAO,kBAAC,IAAD;EAAqB;EAAW,UAAA;EAAS,GAAI;CAAQ,CAAA;AAC9D;;;ACjGA,SAAgB,GAAM,EACpB,cACA,WACA,WAAQ,IACR,GAAG,KASkB;CAUrB,OAAO,EAAU;EACf,gBAAgB;EAChB,OAAO,EAAoB;GAV3B,WAAW,EACT,wGACA,CACF;GACA,sBAAsB,IAAQ,SAAS,KAAA;GACvC,aAAa;EAKc,GAAc,CAAK;EAC9C;CACF,CAAC;AACH;;;AC5BA,IAAa,KACX,EAAc,cAEH,KAAkC,EAAc,MAEhD,KAA0C,EAAc;AAErE,SAAgB,GAAY,EAC1B,cACA,aACA,GAAG,KAC+C;CAClD,OACE,kBAAC,EAAc,SAAf;EACa;EACX,aAAU;EACV,GAAI;EAEH;CACoB,CAAA;AAE3B;AAEA,SAAgB,GAAU,EACxB,aACA,cACA,gBAAa,GACb,WAAQ,UACR,gBACA,UAAO,UACP,WACA,gBACA,GAAG,KAQkB;CACrB,OACE,kBAAC,IAAD;EAAY,GAAI;YACd,kBAAC,EAAc,YAAf;GACS;GACM;GACL;GACR,WAAU;GACV,aAAU;GACJ;GACM;aAEZ,kBAAC,EAAc,OAAf;IACE,WAAW,EACT,sXACA,CACF;IACA,aAAU;IACV,GAAI;cAEJ,kBAAC,OAAD;KAAK,WAAU;KACZ;IACE,CAAA;GACc,CAAA;EACG,CAAA;CAChB,CAAA;AAEhB;AAEA,SAAgB,GACd,GACoB;CACpB,OAAO,kBAAC,EAAc,OAAf;EAAqB,aAAU;EAAa,GAAI;CAAQ,CAAA;AACjE;AAEA,SAAgB,GAAS,EACvB,cACA,UACA,aAAU,WACV,GAAG,KAIkB;CACrB,OACE,kBAAC,EAAc,MAAf;EACE,WAAW,EACT,6gBACA,CACF;EACA,cAAY;EACZ,aAAU;EACV,gBAAc;EACd,GAAI;CACL,CAAA;AAEL;AAEA,SAAgB,GAAa,EAC3B,cACA,UACA,aAAU,WACV,kBAAe,IACf,GAAG,KAIkB;CACrB,OACE,kBAAC,EAAc,UAAf;EACE,WAAW,EACT,6gBACA,CACF;EACc;EACd,cAAY;EACZ,aAAU;EACV,gBAAc;EACd,GAAI;CACL,CAAA;AAEL;AAEA,SAAgB,GAAiB,EAC/B,cACA,aACA,YACA,aAAU,WACV,GAAG,KAGkB;CACrB,OACE,kBAAC,EAAc,cAAf;EACW;EACT,WAAW,EACT,4bACA,MAAY,WACR,sCACA,+BACJ,CACF;EACA,aAAU;EACV,GAAI;YAEH,MAAY,WACX,kBAAA,GAAA,EAAA,UAAA,CACE,kBAAC,QAAD;GAAM,WAAU;GAAe;EAAe,CAAA,GAC9C,kBAAC,EAAc,uBAAf;GACE,WAAU;GACV,aAAA;aAEA,kBAAC,QAAD,EAAM,WAAU,ijBAAkjB,CAAA;EAC/hB,CAAA,CACrC,EAAA,CAAA,IAEF,kBAAA,GAAA,EAAA,UAAA,CACE,kBAAC,EAAc,uBAAf;GAAqC,WAAU;aAC7C,kBAAC,OAAD;IACE,eAAY;IACZ,MAAK;IACL,QAAO;IACP,QAAO;IACP,eAAc;IACd,gBAAe;IACf,aAAY;IACZ,SAAQ;IACR,OAAM;IACN,OAAM;cAEN,kBAAC,QAAD,EAAM,GAAE,qCAAsC,CAAA;GAC3C,CAAA;EAC8B,CAAA,GACrC,kBAAC,QAAD;GAAM,WAAU;GAAe;EAAe,CAAA,CAC9C,EAAA,CAAA;CAEsB,CAAA;AAEhC;AAEA,SAAgB,GACd,GACoB;CACpB,OAAO,kBAAC,EAAc,YAAf;EAA0B,aAAU;EAAmB,GAAI;CAAQ,CAAA;AAC5E;AAEA,SAAgB,GAAc,EAC5B,cACA,aACA,GAAG,KACiD;CACpD,OACE,kBAAC,EAAc,WAAf;EACE,WAAW,EACT,wdACA,CACF;EACA,aAAU;EACV,GAAI;YANN,CAQE,kBAAC,EAAc,oBAAf;GAAkC,WAAU;aAC1C,kBAAC,OAAD;IACE,eAAY;IACZ,MAAK;IACL,QAAO;IACP,QAAO;IACP,eAAc;IACd,gBAAe;IACf,aAAY;IACZ,SAAQ;IACR,OAAM;IACN,OAAM;cAEN,kBAAC,QAAD,EAAM,GAAE,qCAAsC,CAAA;GAC3C,CAAA;EAC2B,CAAA,GAClC,kBAAC,QAAD;GAAM,WAAU;GAAe;EAAe,CAAA,CACvB;;AAE7B;AAEA,SAAgB,GAAe,EAC7B,cACA,UACA,GAAG,KAGkB;CACrB,OACE,kBAAC,EAAc,YAAf;EACE,WAAW,EACT,4FACA,CACF;EACA,cAAY;EACZ,aAAU;EACV,GAAI;CACL,CAAA;AAEL;AAEA,SAAgB,GAAc,EAC5B,cACA,GAAG,KACiD;CACpD,OACE,kBAAC,EAAc,WAAf;EACE,WAAW,EAAG,4BAA4B,CAAS;EACnD,aAAU;EACV,GAAI;CACL,CAAA;AAEL;AAEA,SAAgB,GAAa,EAC3B,cACA,GAAG,KAC+C;CAClD,OACE,kBAAC,OAAD;EACE,WAAW,EACT,kFACA,CACF;EACA,aAAU;EACV,GAAI;CACL,CAAA;AAEL;AAEA,SAAgB,GACd,GACoB;CACpB,OAAO,kBAAC,EAAc,aAAf;EAA2B,aAAU;EAAW,GAAI;CAAQ,CAAA;AACrE;AAEA,SAAgB,GAAe,EAC7B,cACA,UACA,aACA,GAAG,KAGkB;CACrB,OACE,kBAAC,EAAc,gBAAf;EACE,WAAW,EACT,gdACA,CACF;EACA,cAAY;EACZ,aAAU;EACV,GAAI;YAPN,CASG,GACD,kBAAC,GAAD,EAAkB,WAAU,6BAA8B,CAAA,CAC9B;;AAElC;AAEA,SAAgB,GAAa,EAC3B,cACA,gBAAa,GACb,gBACA,WAAQ,SACR,GAAG,KAKkB;CAGrB,OACE,kBAAC,IAAD;EACS;EACP,aAAa,MALU,MAAU,WAAgB,KAAA,IAAL;EAMjC;EACX,aAAU;EACV,MAAK;EACO;EACZ,GAAI;CACL,CAAA;AAEL;;;ACvUA,SAAgB,GAAU,EACxB,cACA,iBAAc,cACd,GAAG,KAC4C;CAC/C,OACE,kBAAC,IAAD;EACE,WAAW,EACT,iNACA,CACF;EACA,aAAU;EACG;EACb,GAAI;CACL,CAAA;AAEL;;;ACZA,SAAgB,GAAS,EACvB,cACA,UAAO,WACP,WAAQ,IACR,kBACA,GAAG,KAKkB;CAGrB,IAAM,IAAa,EAAM,OACvB,OAAO,EAAM,SAAS,EAAM,gBAAgB,EAAE,CAAC,CAAC,MAClD;CAaA,OACE,kBAAC,GAAkB,MAAnB;EACE,WAAW,EACT,2KACA,CACF;EACA,aAAW;EACX,aAAU;EACV,gBAlBF,GACA,GAAG,MACA;GAKH,AAJI,KAAS,EAAM,SAAS,EAAW,WACrC,GAAQ,MAAM,GAEhB,EAAW,UAAU,EAAM,QAC3B,IAAgB,GAAO,GAAG,CAAI;EAChC;EAWI,GAAI;CACL,CAAA;AAEL;AAEA,SAAgB,GAAc,EAC5B,cACA,GAAG,KACwE;CAC3E,OACE,kBAAC,GAAkB,OAAnB;EACE,WAAW,EACT,8oCACA,CACF;EACA,aAAU;EACV,YAAY;EACZ,GAAI;CACL,CAAA;AAEL;AAEA,SAAgB,GAAkB,EAChC,cACA,GAAG,KAC0D;CAC7D,OACE,kBAAC,GAAkB,WAAnB,EACE,QACE,kBAAC,IAAD;EACE,WAAW,EACT,+FACA,CACF;EACA,aAAY;EACZ,GAAI;CACL,CAAA,EAEJ,CAAA;AAEL;;;AClFA,SAAgB,GAAS,EACvB,cACA,GAAG,KAC+C;CAClD,OACE,kBAAC,OAAD;EACE,WAAW,EACT,uRACA,CACF;EACA,aAAU;EACV,GAAI;CACL,CAAA;AAEL;;;ACDA,IAAM,KAAO;CAAC;CAAM;CAAG;CAAM;AAAC,GAEjB,KAAuB;CAClC;EAAE,OAAO;EAAS,MAAM;CAAwB;CAChD;EAAE,OAAO;EAAS,MAAM;CAAoB;CAC5C;EAAE,OAAO;EAAS,MAAM;CAA8B;CACtD;EAAE,OAAO;EAAS,MAAM;CAA8B;AACxD;AAEA,SAAgB,GAAoB,GAA0B;CAC5D,OAAO,GAAqB,QAAQ,MAAQ,EAAI,MAAM,KAAK,CAAQ,CAAC,CAAC,CAAC;AACxE;AAEA,IAAM,KAAkB;CACtB;CACA;CACA;CACA;CACA;AACF;AAiBA,SAAgB,GAAc,EAC5B,sBAAmB,IACnB,kBAAe,IACf,WAAQ,IACR,cACA,OAAO,GACP,iBACA,aACA,GAAG,KACkB;CACrB,IAAM,CAAC,GAAS,KAAc,EAAM,SAAS,EAAK,GAC5C,CAAC,GAAc,KAAmB,EAAM,SAC5C,OAAO,KAAgB,EAAE,CAC3B,GACM,IAAQ,MAAc,KAAA,IAAgC,IAApB,OAAO,CAAS,GAClD,IAAQ,GAAoB,CAAK;CAEvC,OACE,kBAAC,OAAD;EAAK,WAAW,EAAG,8BAA8B,CAAS;YAA1D,CACE,kBAAC,IAAD,EAAA,UAAA,CACE,kBAAC,IAAD;GACE,aAAY;GACZ,GAAI;GACJ,MAAM,IAAU,SAAS;GAClB;GACP,WAAW,MAAU;IAEnB,AADA,EAAgB,EAAM,OAAO,KAAK,GAClC,IAAW,CAAK;GAClB;EACD,CAAA,GACA,KACC,kBAAC,IAAD;GAAiB,OAAM;aACrB,kBAAC,GAAD;IACE,cAAY,IAAU,kBAAkB;IACxC,eAAe;KAIb,AADI,KAAO,GAAQ,IAAU,YAAY,OAAO,GAChD,GAAY,MAAM,CAAC,CAAC;IACtB;IACA,MAAK;IACL,SAAQ;IACR,OAAO;cAEP,kBAAC,GAAD;KAAiB,MAAK;KAAO,SAAS;eACpC,kBAAC,EAAO,MAAR;MAEE,WAAU;MACV,SAAS;OAAE,SAAS;OAAG,OAAO;OAAK,QAAQ;MAAY;MACvD,SAAS;OAAE,SAAS;OAAG,OAAO;OAAG,QAAQ;MAAY;MACrD,MAAM;OAAE,SAAS;OAAG,OAAO;OAAK,QAAQ;MAAY;MACpD,YAAY;OAAE,UAAU;OAAM,MAAM;MAAK;gBAGvC,EADD,IACE,IAEA,GAFD,EAAY,eAAY,OAAQ,CAEH;KAEpB,GAZN,IAAU,QAAQ,IAYZ;IACE,CAAA;GACX,CAAA;EACO,CAAA,CAET,EAAA,CAAA,GAEZ,kBAAC,GAAD;GAAiB,SAAS;aACvB,KACC,kBAAC,EAAO,KAAR;IACE,WAAU;IACV,SAAS;KAAE,QAAQ;KAAG,SAAS;IAAE;IACjC,SAAS;KAAE,QAAQ;KAAQ,SAAS;IAAE;IACtC,MAAM;KAAE,QAAQ;KAAG,SAAS;IAAE;IAC9B,YAAY;KAAE,UAAU;KAAM,MAAM;IAAK;cAL3C,CAOE,kBAAC,OAAD;KACE,cAAW;KACX,iBAAe;KACf,iBAAe;KACf,iBAAe;KACf,WAAU;KACV,MAAK;eAEL,kBAAC,EAAO,KAAR;MACE,WAAW,EAAG,uBAAuB,GAAgB,EAAM;MAC3D,SAAS,EAAE,OAAO,GAAI,IAAQ,IAAK,IAAI,GAAG;MAC1C,YAAY;OAAE,UAAU;OAAK,MAAM;MAAK;KACzC,CAAA;IACE,CAAA,GACL,kBAAC,MAAD;KACE,cAAW;KACX,WAAU;eAET,GAAqB,KAAK,MAAQ;MACjC,IAAM,IAAM,EAAI,MAAM,KAAK,CAAK;MAChC,OACE,kBAAC,MAAD;OAAI,WAAU;iBAAd,CACG,IACC,kBAAC,GAAD;QACE,eAAY;QACZ,WAAU;OACX,CAAA,IAED,kBAAC,GAAD;QACE,eAAY;QACZ,WAAU;OACX,CAAA,GAEH,kBAAC,QAAD;QACE,WACE,IAAM,qBAAqB;kBAF/B,CAKG,EAAI,MACL,kBAAC,QAAD;SAAM,WAAU;mBACb,IAAM,WAAW;QACd,CAAA,CACF;SACJ;SAtBiD,EAAI,IAsBrD;KAER,CAAC;IACC,CAAA,CACM;;EAEC,CAAA,CACd;;AAET;;;AClKA,SAAS,GAAgB,GAAsC;CAC7D,OACE,kBAAC,OAAD;EAAK,SAAQ;EAAY,MAAK;EAAO,GAAI;YAAzC;GACE,kBAAC,QAAD;IACE,MAAK;IACL,GAAE;GACH,CAAA;GACD,kBAAC,QAAD;IACE,MAAK;IACL,GAAE;GACH,CAAA;GACD,kBAAC,QAAD;IACE,MAAK;IACL,GAAE;GACH,CAAA;GACD,kBAAC,QAAD;IACE,MAAK;IACL,GAAE;GACH,CAAA;EACE;;AAET;AAOA,IAAa,KAQT;CACF,QAAQ;EACN,OAAO;EACP,MAAM;EACN,WAAW;EACX,gBAAgB;CAClB;CACA,OAAO;EACL,OAAO;EACP,MAAM;EACN,WAAW;EACX,gBAAgB;CAClB;CACA,QAAQ;EACN,OAAO;EACP,MAAM;EACN,WAAW;EACX,gBAAgB;CAClB;CACA,GAAG;EACD,OAAO;EACP,MAAM;EACN,WAAW;EACX,gBAAgB;CAClB;AACF,GAEM,KAAgB;CACpB,OAAO;CACP,QAAQ;CACR,UAAU;AACZ;AAgBA,SAAgB,GAAgB,EAC9B,eAAY;CAAC;CAAU;CAAS;AAAQ,GACxC,YAAS,YACT,YAAS,SACT,qBAAkB,MAClB,cAAW,IACX,aACA,gBACuB;CACvB,IAAM,IAAM,MAAW;CAEvB,OACE,kBAAC,OAAD;EACE,WAAW,EACT,qBACA,IAAM,4BAA4B,YAClC,CACF;YAEC,EAAU,KAAK,MAAa;GAC3B,IAAM,EAAE,UAAO,YAAS,GAAiB;GACzC,OACE,kBAAC,GAAD;IAEE,SAAQ;IACR,MAAM,IAAM,SAAS;IACrB,WAAW,IAAM,KAAA,IAAY;IAC7B,cAAY,GAAG,GAAc,GAAQ,GAAG;IACxC,SAAS,MAAoB;IAC7B,UACE,KACC,MAAoB,QAAQ,MAAoB;IAEnD,eAAe,IAAW,CAAQ;cAXpC,CAaE,kBAAC,GAAD,EAAM,eAAY,OAAQ,CAAA,GACzB,CAAC,KACA,kBAAC,QAAD;KAAM,WAAU;eAAhB;MACG,GAAc;MAAQ;MAAE;KACrB;MAEF;MAlBD,CAkBC;EAEZ,CAAC;CACE,CAAA;AAET;;;ACzGA,SAAgB,GAAa,GAAsB;CACjD,IAAM,IAAQ,EAAK,KAAK,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,OAAO,OAAO;CAIrD,OAHI,EAAM,WAAW,IAAU,OACjB,EAAM,EAAE,GAAG,MAAM,OAClB,EAAM,SAAS,IAAK,EAAM,GAAG,EAAE,CAAC,GAAG,MAAM,KAAM,IAAA,CACtC,YAAY;AACpC;AASA,SAAgB,GAAW,EACzB,QACA,UAAO,IACP,aACA,QACA,SAAS,GACT,cACA,GAAG,KACmC;CACtC,IAAM,CAAC,GAAQ,KAAa,EAAM,SAAsB,MAAM,GACxD,IACJ,MACC,MAAQ,KAAA,MAAc,MAAW,UAAU,MAAW;CAEzD,OACE,kBAAC,IAAD;EACE,WAAW,EAAG,UAAU,CAAS;EACjC,gBAAc,KAAW,KAAA;EACzB,aAAU;EACV,GAAI;YAJN,CAQG,MAAQ,KAAA,KAAa,MAAgB,KAAO,OAC3C,kBAAC,IAAD;GACE,KAAK,KAAO;GACZ,uBAAuB;GAClB;EACN,CAAA,GAEH,kBAAC,IAAD,EAAA,UACG,IACC,kBAAC,IAAD;GACE,WAAU;GACV,aAAU;EACX,CAAA,IAEA,KAAY,GAAa,CAAI,EAElB,CAAA,CACV;;AAEZ;;;AC5EA,IAAa,KAA6D;CACxE,SAAS;EACP,iBAAiB;EACjB,uBAAuB;EACvB,4BAA4B;CAC9B;CACA,QAAQ;EACN,iBAAiB;EACjB,uBACE;EACF,4BAA4B;CAC9B;AACF,GAca,KACX,mUC9BW,IAAO;CAAC;CAAM;CAAG;CAAM;AAAC;AAUrC,SAAgB,GAAS,EACvB,UACA,gBACA,aACA,WACA,cACA,SACA,aAWC;CACD,OACE,kBAAC,IAAD;EAAc,eAAc;YAC1B,kBAAC,IAAD;GACE,WAAW,EAAG,mBAAmB,CAAS;GAC1C,eAAa;GACb,OACE,IAAU,GAAe,KAAkC,KAAA;aAG7D,kBAAC,EAAO,KAAR;IACE,QAAA;IACA,YAAY;KAAE,UAAU;KAAK,MAAM;IAAK;IACxC,WAAU;cAHZ,CAKE,kBAAC,IAAD,EAAA,UAAA,CACE,kBAAC,IAAD,EAAA,UAAA;KACG,KAGC,kBAAC,OAAD;MACE,WAAU;MACV,aAAU;gBAET;KACE,CAAA;KAEP,kBAAC,IAAD,EAAA,UAAY,EAAiB,CAAA;KAC5B,KAAe,kBAAC,IAAD,EAAA,UAAkB,EAA6B,CAAA;IACrD,EAAA,CAAA,GACZ,kBAAC,IAAD;KAAW,WAAU;KAAmB;IAAoB,CAAA,CACxD,EAAA,CAAA,GACL,KACC,kBAAC,IAAD;KAAa,WAAU;eACpB;IACU,CAAA,CAEL;;EACP,CAAA;CACK,CAAA;AAElB;AAGA,SAAgB,GAAU,EACxB,SACA,aACA,gBAKC;CACD,OACE,kBAAC,GAAD;EAAiB,MAAK;EAAY,SAAS;YACzC,kBAAC,EAAO,KAAR;GAEa;GACX,SAAS;IAAE,SAAS;IAAG,GAAG;IAAG,QAAQ;GAAY;GACjD,SAAS;IAAE,SAAS;IAAG,GAAG;IAAG,QAAQ;GAAY;GACjD,MAAM;IAAE,SAAS;IAAG,GAAG;IAAI,QAAQ;GAAY;GAC/C,YAAY;IAAE,UAAU;IAAM,MAAM;GAAK;GAExC;EACS,GARL,CAQK;CACG,CAAA;AAErB;AASA,SAAgB,EAAO,EACrB,SACA,aACA,gBAKC;CAGD,IAAM,CAAC,GAAO,KAAY,EAAM,SAAS;EAAE;EAAM,SAAS;CAAK,CAAC;CAGhE,OAFI,EAAM,SAAS,KAAM,EAAS;EAAE;EAAM,SAAS;CAAM,CAAC,GAGxD,kBAAC,GAAD;EAAiB,SAAS;YACvB,KACC,kBAAC,EAAO,KAAR;GACE,WAAW,EAAG,CAAC,EAAM,WAAW,mBAAmB,CAAS;GAC5D,SAAS;IAAE,QAAQ;IAAG,SAAS;IAAG,GAAG;IAAI,QAAQ;GAAY;GAC7D,SAAS;IAAE,QAAQ;IAAQ,SAAS;IAAG,GAAG;IAAG,QAAQ;GAAY;GACjE,MAAM;IAAE,QAAQ;IAAG,SAAS;IAAG,GAAG;IAAI,QAAQ;GAAY;GAC1D,YAAY;IAAE,UAAU;IAAM,MAAM;GAAK;GACzC,2BACE,GAAU,OAAa;IAAE,GAAG;IAAS,SAAS;GAAK,EAAE;GAGtD;EACS,CAAA;CAEC,CAAA;AAErB;AAGA,SAAgB,EAAU,EAAE,cAAuC;CACjE,OACE,kBAAC,GAAD;EAAiB,SAAS;YACvB,KACC,kBAAC,EAAO,GAAR;GAEE,MAAK;GACL,WAAU;GACV,SAAS;IAAE,SAAS;IAAG,QAAQ;GAAE;GACjC,SAAS;IACP,SAAS;IACT,QAAQ;IACR,GAAG;KAAC;KAAG;KAAI;KAAG;KAAI;KAAG;IAAC;GACxB;GACA,MAAM;IAAE,SAAS;IAAG,QAAQ;GAAE;GAC9B,YAAY;IACV,UAAU;IACV,MAAM;IACN,GAAG;KAAE,UAAU;KAAK,MAAM;IAAY;GACxC;aAEC;EACO,GAjBH,CAiBG;CAEG,CAAA;AAErB;AAGA,SAAgB,GAAY,EAC1B,UACA,gBACA,eAKC;CACD,OACE,kBAAC,OAAD;EAAK,WAAU;YAAf;GACE,kBAAC,EAAO,MAAR;IACE,WAAU;IACV,SAAS;KAAE,OAAO;KAAK,SAAS;IAAE;IAClC,SAAS;KAAE,OAAO;KAAG,SAAS;IAAE;IAChC,YAAY;KAAE,UAAU;KAAK,MAAM;IAAK;cAExC,kBAAC,OAAD;KACE,eAAY;KACZ,SAAQ;KACR,WAAU;KACV,MAAK;KACL,QAAO;KACP,aAAY;KACZ,eAAc;KACd,gBAAe;eAEf,kBAAC,EAAO,MAAR;MACE,GAAE;MACF,SAAS,EAAE,YAAY,EAAE;MACzB,SAAS,EAAE,YAAY,EAAE;MACzB,YAAY;OAAE,UAAU;OAAK,OAAO;OAAM,MAAM;MAAK;KACtD,CAAA;IACE,CAAA;GACM,CAAA;GACb,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,KAAD;KAAG,WAAU;eAAe;IAAS,CAAA,GACpC,KACC,kBAAC,KAAD;KAAG,WAAU;eAAiC;IAAe,CAAA,CAE5D;;GACJ;EACE;;AAET;AAGA,SAAgB,GAAc,EAAE,WAAQ,QAA4B;CAClE,OACE,kBAAC,OAAD;EAAK,WAAU;YAAf;GACE,kBAAC,IAAD,EAAW,WAAU,SAAU,CAAA;GAC/B,kBAAC,QAAD;IAAM,WAAU;cAA2C;GAAY,CAAA;GACvE,kBAAC,IAAD,EAAW,WAAU,SAAU,CAAA;EAC5B;;AAET;AAGA,SAAgB,GAAa,GAAiB,GAAoB;CAChE,IAAM,CAAC,GAAO,KAAY,EAAM,SAAS;EAAE;EAAY;EAAS,WAAW;CAAQ,CAAC;CAmBpF,QAhBI,EAAM,eAAe,KAAc,EAAM,YAAY,MACvD,EAAS;EAAE;EAAY;EAAS,WAAW;CAAQ,CAAC,GAGtD,EAAM,gBAAgB;EACpB,IAAI,KAAW,GAAG;EAClB,IAAM,IAAW,OAAO,kBAAkB;GACxC,GAAU,MACR,EAAQ,aAAa,IACjB,IACA;IAAE,GAAG;IAAS,WAAW,EAAQ,YAAY;GAAE,CACrD;EACF,GAAG,GAAI;EACP,aAAa,OAAO,cAAc,CAAQ;CAC5C,GAAG,CAAC,GAAS,CAAU,CAAC,GAEjB,EAAM;AACf;;;ACjOA,SAAgB,GAAc,EAC5B,aAAU,SACV,SACA,WACA,gBACA,YAAS,GACT,gBAAa,IACb,mBAAgB,IAChB,aACA,aACA,aACqB;CACrB,IAAM,CAAC,GAAQ,KAAa,EAAM,SAAqB,MAAM,GACvD,CAAC,GAAO,KAAY,EAAM,SAAwB,IAAI,GACtD,CAAC,GAAM,KAAW,EAAM,SAAS,EAAE,GACnC,CAAC,GAAa,KAAkB,EAAM,SAAS,CAAC,GAChD,IAAY,GAAa,GAAe,CAAW,GAEnD,IAAc,MAAY,QAAQ,IAAiB,GACnD,IAAe,MAAY,QAAQ,UAAU,SAE7C,IAAS,EAAM,YACnB,OAAO,MAAkB;EAEvB,AADA,EAAS,IAAI,GACb,EAAU,SAAS;EACnB,IAAI;GAEF,AADA,MAAM,IAAW,CAAK,GACtB,EAAU,SAAS;EACrB,SAAS,GAAO;GAGd,AAFA,EAAU,MAAM,GAChB,EAAQ,EAAE,GACV,EAAS,aAAiB,QAAQ,EAAM,UAAU,eAAe;EACnE;CACF,GACA,CAAC,CAAQ,CACX;CAEA,SAAS,EAAa,GAAe;EAGnC,AAFA,EAAQ,CAAK,GACT,KAAO,EAAS,IAAI,GACpB,KAAc,EAAM,WAAW,KAAU,MAAW,UACtD,EAAY,CAAK;CAErB;CAEA,eAAe,IAAe;EAI5B,AAHA,GAAgB,MAAU,IAAQ,CAAC,GACnC,EAAQ,EAAE,GACV,EAAS,IAAI,GACb,MAAM,IAAW;CACnB;CAEA,OACE,kBAAC,IAAD;EACE,OAAM;EACA;EACE;EACR,aACE,kBAAC,QAAD;GAAM,WAAU;aAAhB,CACE,kBAAC,GAAD,EAAa,WAAU,oBAAqB,CAAA,GAC5C,kBAAC,QAAD,EAAA,UAAA;IAAM;IACO;IAAO;IAAqB;IACtC,IACC,kBAAA,GAAA,EAAA,UAAA,CACG,KACD,kBAAC,QAAD;KAAM,WAAU;eACb;IACG,CAAA,CACN,EAAA,CAAA,IACA;IAAK;GAEL,EAAA,CAAA,CACF;;EAER,QACE,MAAW,aACT,kBAAC,GAAD;GAAQ,SAAQ;GAAO,SAAS;aAAhC,CAAwC,oBACrB,CACX;;YAIZ,kBAAC,IAAD;GAAW,MAAM,MAAW,YAAY,YAAY;aACjD,MAAW,YACV,kBAAC,IAAD;IACE,OAAM;IACN,aAAY;GACb,CAAA,IAED,kBAAC,OAAD;IAAK,WAAU;cAAf;KACE,kBAAC,EAAO,KAAR;MAGE,SAAS,IAAQ,EAAE,GAAG;OAAC;OAAG;OAAI;OAAG;OAAI;OAAG;MAAC,EAAE,IAAI,EAAE,GAAG,EAAE;MACtD,YAAY;OAAE,UAAU;OAAK,MAAM;MAAY;gBAE/C,kBAAC,IAAD;OACU;OACR,OAAO;OACP,eAAe;OACf,UAAU,MAAW;iBAEpB,MAAM,KAAK,EAAE,UAAO,IAAI,GAAG,MAC1B,kBAAC,IAAD;QAEE,gBAAc,IAAQ,KAAO,KAAA;QAC7B,cAAY,SAAS,IAAQ,EAAE,MAAM;OACtC,GAHM,QAAQ,GAGd,CACF;MACO,CAAA;KACA,GAlBL,KAAS,QAkBJ;KACZ,kBAAC,GAAD,EAAW,SAAS,EAAQ,CAAA;KAC3B,CAAC,KACA,kBAAC,GAAD;MACE,WAAW,EAAG,UAAU,KAAA,iUAAgC;MACxD,SAAS,MAAW;MACpB,UAAU,EAAK,WAAW;MAC1B,eAAe,KAAK,EAAO,CAAI;gBAChC;KAEO,CAAA;KAEV,kBAAC,EAAO,GAAR;MACE,QAAA;MACA,YAAY;OAAE,UAAU;OAAM,MAAM;MAAK;MACzC,WAAU;gBAET,IAAY,IACX,kBAAA,GAAA,EAAA,UAAA;OAAE;OACe;OACf,kBAAC,QAAD;QAAM,WAAU;kBAAhB,CACG,GAAU,GACP;;MACN,EAAA,CAAA,IAEF,kBAAC,GAAD;OACE,SAAQ;OACR,UAAU,MAAW;OACrB,eAAe,KAAK,EAAa;iBAClC;MAEO,CAAA;KAEF,CAAA;IACP;;EAEE,CAAA;CACH,CAAA;AAEd;;;AChKA,SAAgB,GAAoB,EAClC,WAAQ,uBACR,SACA,WACA,iBAAc,sDACd,aACA,oBAC2B;CAC3B,IAAM,IAAU,EAAM,MAAM,GACtB,CAAC,GAAQ,KAAa,EAAM,SAAqB,MAAM,GACvD,CAAC,GAAO,KAAY,EAAM,SAAwB,IAAI,GACtD,CAAC,GAAO,KAAY,EAAM,SAAS,EAAE;CAE3C,eAAe,EAAa,GAAyC;EAGnE,AAFA,EAAM,eAAe,GACrB,EAAS,IAAI,GACb,EAAU,SAAS;EACnB,IAAI;GAEF,AADA,MAAM,IAAW,EAAE,SAAM,CAAC,GAC1B,EAAU,SAAS;EACrB,SAAS,GAAO;GAEd,AADA,EAAU,MAAM,GAChB,EACE,aAAiB,QAAQ,EAAM,UAAU,4BAC3C;EACF;CACF;CAEA,OACE,kBAAC,IAAD;EACS;EACM;EACP;EACE;EACR,QACE,kBAAC,GAAD;GACE,SAAQ;GACR,WAAU;GACV,SAAS;aAHX,CAKE,kBAAC,GAAD,EAAe,WAAU,WAAY,CAAA,GAAC,eAEhC;;YAGV,kBAAC,IAAD;GAAW,MAAM,MAAW,YAAY,YAAY;aACjD,MAAW,YACV,kBAAC,IAAD;IACE,OAAM;IACN,aACE,kBAAA,GAAA,EAAA,UAAA;KAAE;KACiC;KACjC,kBAAC,QAAD;MAAM,WAAU;gBAA+B;KAAY,CAAA;KAAC;IAC5D,EAAA,CAAA;cAGJ,kBAAC,GAAD;KACE,SAAQ;KACR,WAAU;KACV,eAAe,EAAU,MAAM;eAChC;IAEO,CAAA;GACG,CAAA,IAEb,kBAAC,QAAD;IAAM,WAAU;IAAsB,UAAU;cAAhD;KACE,kBAAC,GAAD;MAAO,MAAK;gBAAZ,CACE,kBAAC,GAAD;OAAY,SAAS;iBAAS;MAAiB,CAAA,GAC/C,kBAAC,IAAD;OACE,IAAI;OACJ,MAAK;OACL,MAAK;OACL,cAAa;OACb,aAAY;OACZ,UAAA;OACA,UAAU,MAAW;OACrB,OAAO;OACP,WAAW,MAAU,EAAS,EAAM,OAAO,KAAK;MACjD,CAAA,CACI;;KACP,kBAAC,GAAD,EAAW,SAAS,EAAQ,CAAA;KAC5B,kBAAC,GAAD;MACE,WAAW,EAAG,UAAU,KAAA,iUAAgC;MACxD,MAAK;MACL,SAAS,MAAW;gBACrB;KAEO,CAAA;IACJ;;EAEC,CAAA;CACH,CAAA;AAEd;;;ACxEA,IAAM,KACJ;AAQF,SAAgB,GAAoB,EAClC,WAAQ,sBACR,iBAAc,+CACd,gBAAa,CAAC,GACd,eAAY;CAAC;CAAU;CAAS;AAAQ,GACxC,aAAU,IACV,2BAAwB,IACxB,WACA,aACA,gBAC2B;CAC3B,IAAM,IAAS,EAAM,MAAM,GACrB,CAAC,GAAO,KAAY,EAAM,SAAwB,IAAI,GACtD,CAAC,GAAS,KAAc,EAAM,SAAgC,IAAI,GAClE,CAAC,GAAW,KAAgB,EAAM,SAAwB,IAAI,GAE9D,IAAY,IAAI,IAAI,EAAW,KAAK,MAAa,EAAS,QAAQ,CAAC,GACnE,IAAc,EAAU,QAAQ,MAAa,CAAC,EAAU,IAAI,CAAQ,CAAC,GACrE,IAAO,MAAY,QAAQ,MAAc,MAIzC,IAAa,CAAC,KAAyB,EAAW,UAAU;CAElE,eAAe,EAAQ,GAA0B;EAC3C,QAEJ;GADA,EAAS,IAAI,GACb,EAAW,CAAQ;GACnB,IAAI;IACF,MAAM,IAAS,CAAQ;GACzB,SAAS,GAAO;IACd,EACE,aAAiB,QAAQ,EAAM,UAAU,4BAC3C;GACF,UAAU;IACR,EAAW,IAAI;GACjB;EATmB;CAUrB;CAEA,eAAe,EAAW,GAAY;EAChC,WAAQ,IAEZ;GADA,EAAS,IAAI,GACb,EAAa,CAAE;GACf,IAAI;IACF,MAAM,IAAW,CAAE;GACrB,SAAS,GAAO;IACd,EACE,aAAiB,QAAQ,EAAM,UAAU,+BAC3C;GACF,UAAU;IACR,EAAa,IAAI;GACnB;EATe;CAUjB;CAEA,OACE,kBAAC,IAAD;EAAc,eAAc;YAC1B,kBAAC,IAAD;GAAM,WAAW,EAAG,UAAU,CAAS;GAAG,aAAU;aAApD,CACE,kBAAC,IAAD,EAAA,UAAA,CACE,kBAAC,IAAD,EAAA,UAAY,EAAiB,CAAA,GAC7B,kBAAC,IAAD,EAAA,UAAkB,EAA6B,CAAA,CACrC,EAAA,CAAA,GACZ,kBAAC,IAAD,EAAA,UACG,IACC,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,IAAD,EAAS,WAAU,SAAU,CAAA,GAAC,6BAE3B;QAEL,kBAAC,EAAO,KAAR;IACE,QAAA;IACA,YAAY;KAAE,UAAU;KAAK,MAAM;IAAK;IACxC,WAAU;cAHZ;KAKE,kBAAC,GAAD,EAAW,SAAS,EAAQ,CAAA;KAE3B,EAAW,SAAS,IACnB,kBAAC,MAAD;MACE,cAAW;MACX,WAAU;gBAEV,kBAAC,GAAD;OAAiB,SAAS;iBACvB,EAAW,KAAK,GAAU,MAAU;QACnC,IAAM,EAAE,UAAO,cAAW,sBACxB,GAAiB,EAAS;QAC5B,OACE,kBAAC,EAAO,IAAR;SAEE,QAAA;SACA,WAAU;SACV,SAAS;UAAE,SAAS;UAAG,GAAG;SAAG;SAC7B,SAAS;UAAE,SAAS;UAAG,GAAG;SAAE;SAC5B,MAAM;UAAE,SAAS;UAAG,GAAG;SAAG;SAG1B,YAAY;UACV,UAAU;UACV,MAAM;UACN,OAAO,KAAK,IAAI,GAAO,CAAC,IAAI;SAC9B;mBAbF,CAeE,kBAAC,OAAD;UAAK,WAAU;oBAAf,CACE,kBAAC,GAAD;WACE,eAAY;WACZ,WAAW,EAAG,UAAU,CAAc;UACvC,CAAA,GACD,kBAAC,OAAD;WAAK,WAAU;qBAAf,CACE,kBAAC,QAAD;YAAM,WAAU;sBACb;WACG,CAAA,GACL,EAAS,SACR,kBAAC,QAAD;YAAM,WAAU;sBACb,EAAS;WACN,CAAA,CAEL;YACF;aACL,kBAAC,GAAD;UACE,oBAAkB,IAAa,IAAS,KAAA;UACxC,cAAY,cAAc;UAC1B,MAAK;UACL,MAAK;UACL,SAAQ;UACR,UAAU,KAAQ;UAClB,SAAS,MAAc,EAAS;UAChC,eAAe,KAAK,EAAW,EAAS,EAAE;oBAC3C;SAEO,CAAA,CACC;WA1CJ,EAAS,EA0CL;OAEf,CAAC;MACc,CAAA;KACf,CAAA,IAEJ,kBAAC,KAAD;MAAG,WAAU;gBAAgC;KAE1C,CAAA;KAGJ,KAAc,EAAW,SAAS,KACjC,kBAAC,KAAD;MAAG,WAAU;MAAgC,IAAI;gBAC9C;KACA,CAAA;KAGJ,EAAY,KAAK,MAAa;MAC7B,IAAM,EAAE,UAAO,cAAW,sBACxB,GAAiB;MACnB,OACE,kBAAC,GAAD;OAEE,WAAU;OACV,MAAK;OACL,SAAQ;OACR,UAAU;OACV,SAAS,MAAY;OACrB,eAAe,KAAK,EAAQ,CAAQ;iBAPtC,CASE,kBAAC,GAAD;QAAW,eAAY;QAAO,WAAW;OAAiB,CAAA,GAC1D,kBAAC,QAAD;QAAM,WAAU;kBAAhB,CAAyB,YAAS,CAAY;SACxC;SAVD,CAUC;KAEZ,CAAC;IACS;MAEL,CAAA,CACP;;CACM,CAAA;AAElB;;;ACpLA,SAAgB,GAAW,EACzB,WAAQ,yBACR,iBAAc,0CACd,SACA,WACA,eAAY;CAAC;CAAU;CAAS;AAAQ,GACxC,oBAAiB,IACjB,wBAAqB,IACrB,aACA,qBACA,qBACA,eACkB;CAClB,IAAM,IAAU,EAAM,MAAM,GACtB,IAAa,EAAM,MAAM,GACzB,CAAC,GAAQ,KAAa,EAAM,SAAqB,MAAM,GACvD,CAAC,GAAO,KAAY,EAAM,SAAwB,IAAI,GACtD,CAAC,GAAiB,KACtB,EAAM,SAAgC,IAAI,GACtC,CAAC,GAAU,KAAe,EAAM,SAAS,EAAK,GAC9C,CAAC,GAAO,KAAY,EAAM,SAAS,EAAE,GACrC,CAAC,GAAY,KAAiB,EAAM,SAAS,EAAK,GAClD,CAAC,GAAU,KAAe,EAAM,SAAS,EAAE,GAE3C,IAAO,MAAW,aAAa,MAAoB,MASnD,KAAgB,EAAS,KAAK,CAAC,CAAC,SAAS,GACzC,IAAY,KAAc;CAEhC,eAAe,EAAa,GAAyC;EAGnE,IAFA,EAAM,eAAe,GAEjB,CAAC,GAAW;EAChB,IAAM,IAAO,IAAI,SAAS,EAAM,aAAa;EAE7C,AADA,EAAS,IAAI,GACb,EAAU,SAAS;EACnB,IAAI;GAMF,AALA,MAAM,IAAW;IACf,OAAO,OAAO,EAAK,IAAI,OAAO,KAAK,EAAE;IACrC,UAAU,OAAO,EAAK,IAAI,UAAU,KAAK,EAAE;IAC3C;GACF,CAAC,GACD,EAAU,SAAS;EACrB,SAAS,GAAO;GAEd,AADA,EAAU,MAAM,GAChB,EAAS,aAAiB,QAAQ,EAAM,UAAU,kBAAkB;EACtE;CACF;CAEA,eAAe,GAAe,GAA0B;EAEtD,AADA,EAAS,IAAI,GACb,EAAmB,CAAQ;EAC3B,IAAI;GAEF,AADA,MAAM,IAAmB,CAAQ,GACjC,EAAU,SAAS;EACrB,SAAS,GAAO;GACd,EACE,aAAiB,QAAQ,EAAM,UAAU,kBAC3C;EACF,UAAU;GACR,EAAmB,IAAI;EACzB;CACF;CAEA,OACE,kBAAC,IAAD;EACS;EACM;EACP;EACE;EACR,QACE,MAAW,aACT,kBAAA,GAAA,EAAA,UAAA;GAAE;GAC4B;GAC5B,kBAAC,GAAD;IAAQ,SAAQ;IAAO,SAAS;cAAU;GAElC,CAAA;EACR,EAAA,CAAA;YAIN,kBAAC,IAAD;GAAW,MAAM,MAAW,YAAY,YAAY;aACjD,MAAW,YACV,kBAAC,IAAD;IACE,OAAM;IACN,aAAY;GACb,CAAA,IAED,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,QAAD;KAAM,WAAU;KAAsB,UAAU;eAAhD;MACE,kBAAC,GAAD;OAAO,MAAK;iBAAZ,CACE,kBAAC,GAAD;QAAY,SAAS;kBAAS;OAAiB,CAAA,GAC/C,kBAAC,IAAD;QACE,IAAI;QACJ,cAAW;QACX,MAAK;QACL,MAAK;QACL,cAAa;QACb,aAAY;QACZ,UAAA;QACA,UAAU;QACV,OAAO;QACP,WAAW,MAAU;SAEnB,AADA,EAAS,EAAM,cAAc,KAAK,GAClC,EAAc,EAAM,cAAc,SAAS,KAAK;QAClD;OACD,CAAA,CACI;;MACP,kBAAC,GAAD;OAAQ,MAAM;iBACZ,kBAAC,GAAD;QAAO,MAAK;kBAAZ;SACE,kBAAC,GAAD;UAAY,SAAQ;oBAAW;SAAoB,CAAA;SACnD,kBAAC,IAAD;UACE,IAAG;UACH,MAAK;UACL,cAAa;UACb,UAAA;UACA,UAAU;UACV,OAAO;UACP,WAAW,MAAU,EAAY,EAAM,OAAO,KAAK;SACpD,CAAA;SACA,KAKC,kBAAC,GAAD;UACE,SAAQ;UACR,MAAK;UACL,WAAU;UACV,SAAS;oBACV;SAEO,CAAA;QAEL;;MACD,CAAA;MACP,KACC,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,IAAD;QACE,IAAI;QACJ,SAAS;QACT,kBAAkB,MAAY,EAAY,CAAO;QACjD,UAAU;OACX,CAAA,GACD,kBAAC,IAAD;QAAO,SAAS;QAAY,WAAU;kBAAc;OAE7C,CAAA,CACJ;;MAEP,kBAAC,GAAD,EAAW,SAAS,EAAQ,CAAA;MAC5B,kBAAC,GAAD;OAAQ,MAAM;iBACZ,kBAAC,GAAD;QACE,WAAW,EAAG,UAAU,KAAA,iUAAgC;QACxD,MAAK;QACL,SAAS,MAAW;QACpB,UAAU;kBACX;OAEO,CAAA;MACF,CAAA;KACJ;QACL,EAAU,SAAS,KAMlB,kBAAC,GAAD;KAAQ,MAAM,CAAC;KAAW,WAAU;eAApC,CACE,kBAAC,IAAD,EAAe,OAAM,mBAAoB,CAAA,GACzC,kBAAC,IAAD;MACa;MACX,QAAO;MACU;MACjB,UAAU,MAAW;MACrB,UAAU;KACX,CAAA,CACK;MAEP;;EAEE,CAAA;CACH,CAAA;AAEd;;;ACjNA,SAAS,GACP,GACA,GACiB;CAEjB,OADI,EAAM,SAAS,aAAmB,OAAO,KAAU,aAAY,IAC5D,OAAO,KAAU,WAAW,IAAQ;AAC7C;AAGA,SAAS,GACP,GACA,GACe;CACf,IAAM,IAAW,EAAM,aAAa;CAEpC,IAAI,EAAM,SAAS,YAEjB,OADI,KAAY,MAAU,KAAa,GAAG,EAAM,MAAM,gBAC/C;CAGT,IAAM,IAAO,OAAO,KAAU,WAAW,EAAM,KAAK,IAAI;CACxD,IAAI,KAAY,EAAK,WAAW,GAAG,OAAO,GAAG,EAAM,MAAM;CAEzD,IAAI,EAAM,SAAS,SAAS,EAAK,SAAS,GACxC,IAAI;EACF,IAAI,IAAI,CAAI;CACd,QAAQ;EACN,OAAO;CACT;CAUF,OAPI,EAAM,SAAS,YAAY,EAAK,SAAS,KAEvC,CADY,EAAM,QAAQ,KAAK,MAAW,EAAO,KAChD,CAAA,CAAQ,SAAS,CAAI,IACjB,6BAA6B,EAAM,UAIvC,EAAM,WAAW,CAAI,KAAK;AACnC;AAOA,SAAgB,GAAY,EAC1B,SACA,WACA,gBAAa,IACb,gBACA,aACA,WACA,oBACmB;CACnB,IAAM,IAAW,EAAM,MAAM,GACvB,CAAC,GAAO,KAAY,EAAM,eAE5B,OAAO,YACL,EAAK,OAAO,KAAK,MAAU,CACzB,EAAM,MACN,GAAa,GAAO,EAAO,EAAM,KAAK,CACxC,CAAC,CACH,CACJ,GACM,CAAC,GAAQ,KAAa,EAAM,SAAiC,CAAC,CAAC;CAErE,SAAS,EAAS,GAAc,GAAwB;EAKtD,AAJA,GAAU,OAAa;GAAE,GAAG;IAAU,IAAO;EAAM,EAAE,GACrD,IAAgB,GAAM,CAAK,GAG3B,GAAW,MACT,EAAQ,KAAQ;GAAE,GAAG;IAAU,IAAO;EAAG,IAAI,CAC/C;CACF;CAEA,eAAe,EAAa,GAAyC;EAEnE,IADA,EAAM,eAAe,GACjB,GAAY;EAEhB,IAAM,IAA+B,CAAC;EACtC,KAAK,IAAM,KAAS,EAAK,QAAQ;GAC/B,IAAM,IAAU,GAAc,GAAO,EAAM,EAAM,KAAK;GACtD,AAAI,MAAS,EAAK,EAAM,QAAQ;EAClC;EACA,IAAI,OAAO,KAAK,CAAI,CAAC,CAAC,SAAS,GAAG;GAChC,EAAU,CAAI;GACd;EACF;EACA,EAAU,CAAC,CAAC;EAEZ,IAAM,IAA6C,CAAC;EACpD,KAAK,IAAM,KAAS,EAAK,QAAQ;GAC/B,IAAM,IAAQ,EAAM,EAAM;GAC1B,EAAU,EAAM,QAAQ,OAAO,KAAU,WAAW,EAAM,KAAK,IAAI;EACrE;EACA,MAAM,EAAS,CAAS;CAC1B;CAEA,OACE,kBAAC,QAAD;EAAM,WAAU;EAAsB,YAAA;EAAW,UAAU;YAA3D,CACG,EAAK,OAAO,KAAK,MAAU;GAC1B,IAAM,IAAQ,EAAO,EAAM,SAAS,KAAA,GAC9B,IAAY,GAAG,EAAS,GAAG,EAAM,QACjC,IAAQ,EAAM,EAAM;GA0B1B,OAxBI,EAAM,SAAS,aAEf,kBAAC,GAAD;IAEE,MAAM,EAAM;IACZ,SAAS,EAAQ;IACjB,WAAU;cAJZ,CAME,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,IAAD;MACE,IAAI;MACJ,SAAS,MAAU;MACnB,UAAU;MACV,kBAAkB,MAAY,EAAS,EAAM,MAAM,CAAO;KAC3D,CAAA,GACD,kBAAC,IAAD;MAAO,SAAS;MAAW,WAAU;gBAClC,EAAM;KACF,CAAA,CACJ;QACJ,KAAS,kBAAC,IAAD;KAAY,OAAA;eAAO;IAAkB,CAAA,CAC1C;MAjBA,EAAM,IAiBN,IAKT,kBAAC,GAAD;IAAwB,MAAM,EAAM;IAAM,SAAS,EAAQ;cAA3D;KACE,kBAAC,GAAD;MAAY,SAAS;gBAAY,EAAM;KAAkB,CAAA;KACxD,EAAM,SAAS,aACd,kBAAC,IAAD;MACE,IAAI;MACJ,gBAAc,IAAQ,KAAO,KAAA;MAC7B,UAAU;MACV,aAAa,EAAM;MACnB,OAAO,OAAO,KAAS,EAAE;MACzB,WAAW,MAAU,EAAS,EAAM,MAAM,EAAM,OAAO,KAAK;KAC7D,CAAA,IACC,EAAM,SAAS,WAIjB,kBAAC,UAAD;MACE,IAAI;MACJ,gBAAc,IAAQ,KAAO,KAAA;MAC7B,WAAW,EACT,sXACF;MACA,UAAU;MACV,OAAO,OAAO,KAAS,EAAE;MACzB,WAAW,MAAU,EAAS,EAAM,MAAM,EAAM,OAAO,KAAK;gBAR9D,CAUE,kBAAC,UAAD;OAAQ,OAAM;iBAAI,EAAM,eAAe;MAA2B,CAAA,GACjE,EAAM,QAAQ,KAAK,MAClB,kBAAC,UAAD;OAA2B,OAAO,EAAO;iBACtC,EAAO;MACF,GAFK,EAAO,KAEZ,CACT,CACK;UAER,kBAAC,IAAD;MACE,IAAI;MACJ,gBAAc,IAAQ,KAAO,KAAA;MAC7B,UAAU;MACV,aAAa,EAAM;MACnB,MAAM,EAAM,SAAS,QAAQ,QAAQ;MACrC,OAAO,OAAO,KAAS,EAAE;MACzB,WAAW,MAAU,EAAS,EAAM,MAAM,EAAM,OAAO,KAAK;KAC7D,CAAA;KAEF,KAAS,kBAAC,IAAD;MAAY,OAAA;gBAAO;KAAkB,CAAA;IAC1C;MA5CK,EAAM,IA4CX;EAEX,CAAC,GAED,kBAAC,OAAD;GAAK,WAAU;aAAf,CACG,KACC,kBAAC,GAAD;IACE,MAAK;IACL,SAAQ;IACR,UAAU;IACV,SAAS;cACV;GAEO,CAAA,GAEV,kBAAC,GAAD;IAAQ,WAAU;IAAS,MAAK;IAAS,SAAS;cAC/C;GACK,CAAA,CACL;IACD;;AAEV;;;ACpKA,IAAa,KAAmD,CAC9D;CACE,IAAI;CACJ,OAAO;CACP,QAAQ,CACN;EAAE,MAAM;EAAQ,MAAM;EAAgB,OAAO;EAAgB,UAAU;CAAK,CAC9E;AACF,CACF;AAkCA,SAAgB,GAAgB,EAC9B,WAAQ,IACR,SACA,WACA,iBACA,eACA,wBAAqB,IACrB,gBACuB;CACvB,IAAM,IAAa,EAAM,OAA2B,IAAI,GAIlD,IAAY,EAAM,OAEtB,CAAC,CAAC,GACE,CAAC,GAAQ,KAAa,EAAM,SAEhC,CAAC,CAAC,GAEE,CAAC,GAAO,KAAY,EAAM,SAAS,CAAC,GACpC,CAAC,GAAQ,KAAa,EAAM,SAChC,CAAC,CACH,GACM,CAAC,GAAQ,KAAa,EAAM,SAAqB,MAAM,GACvD,CAAC,GAAO,KAAY,EAAM,SAAwB,IAAI,GAEtD,IAAO,MAAW,WAClB,IAAO,EAAM,IACb,IAAO,KAAS,EAAM,SAAS;CAIrC,EAAM,gBAAgB;EAChB,KACJ,EAAW,SAAS,MAAM;CAC5B,GAAG;EAAC;EAAO;EAAM;CAAK,CAAC;CAEvB,eAAe,EAAiB,GAA6C;EAC3E,IAAI,CAAC,GAAM;EACX,IAAM,IAAS;GAAE,GAAG;GAAQ,GAAG;EAAW;EAE1C,AADA,EAAS,IAAI,GACb,EAAU,SAAS;EACnB,IAAI;GAOF,AANA,MAAM,IAAe,EAAK,IAAI,CAAU,GACpC,KAAM,MAAM,IAAa,CAAM,GACnC,EAAU,CAAM,GAChB,OAAO,EAAU,QAAQ,EAAK,KAC9B,EAAU,EAAE,GAAG,EAAU,QAAQ,CAAC,GAClC,EAAU,IAAO,YAAY,MAAM,GAC9B,KAAM,GAAU,MAAY,IAAU,CAAC;EAC9C,SAAS,GAAO;GAEd,AADA,EAAU,MAAM,GAChB,EACE,aAAiB,QAAQ,EAAM,UAAU,8BAC3C;EACF;CACF;CAMA,OAJI,KAAQ,CAAC,IAA2B,OAKtC,kBAAC,IAAD;EACE,OAJY,IAAO,mBAAoB,GAAM,SAAS;EAKtD,aAAa,IAAO,KAAA,IAAY,GAAM;EAChC;EACE;EACG;YAEX,kBAAC,IAAD;GAAW,MAAM,IAAO,SAAS,QAAQ;aACtC,IACC,kBAAC,IAAD;IACE,OAAM;IACN,aAAY;GACb,CAAA,IACC,IACF,kBAAC,OAAD;IAAK,WAAU;cAAf;KACE,kBAAC,OAAD;MAAK,cAAW;gBACd,kBAAC,MAAD;OAAI,WAAU;iBACX,EAAM,KAAK,GAAM,MAChB,kBAAC,MAAD;QAEE,gBAAc,MAAc,IAAQ,SAAS,KAAA;QAC7C,WAAW,EACT,yBACA,MAAc,KAAS,6BACzB;kBANF,CAQG,EAAK,OACL,IAAY,KACX,kBAAC,QAAD;SAAM,WAAU;mBAAU;QAAkB,CAAA,CAE5C;UAXG,EAAK,EAWR,CACL;MACC,CAAA;KACD,CAAA;KAIL,kBAAC,MAAD;MAAI,KAAK;MAAY,UAAU;MAAI,WAAU;gBAC1C,EAAK;KACJ,CAAA;KAEJ,kBAAC,GAAD,EAAW,SAAS,EAAQ,CAAA;KAE5B,kBAAC,IAAD;MAEQ;MACN,QAAQ;OAAE,GAAG;OAAQ,GAAG,EAAO,EAAK;MAAI;MACxC,YAAY,MAAW;MACvB,aAAa,IAAO,WAAW;MAC/B,QACE,IAAQ,UACE;OAGJ,AAFA,EAAS,IAAI,GACb,EAAU,EAAE,GAAG,EAAU,QAAQ,CAAC,GAClC,GAAU,MAAY,IAAU,CAAC;MACnC,IACA,KAAA;MAEN,gBAAgB,GAAM,MAAU;OAC9B,EAAU,QAAQ,EAAK,MAAM;QAC3B,GAAG,EAAU,QAAQ,EAAK;SACzB,IAAO;OACV;MACF;MACA,UAAU;KACX,GArBM,EAAK,EAqBX;IACE;QACH;EACK,CAAA;CACH,CAAA;AAEd;;;AC9LA,IAAM,KAAW,KAEX,KACJ;AAEF,SAAS,GAAW,GAA+C;CACjE,IAAI,CAAC,GAAK,OAAO;CACjB,IAAM,IAAO,IAAI,KAAK,CAAG;CACzB,OAAO,OAAO,MAAM,EAAK,QAAQ,CAAC,IAAI,OAAO,EAAK,mBAAmB;AACvE;AASA,SAAgB,GAAoB,EAClC,WAAQ,YACR,iBAAc,8EACd,cAAW,CAAC,GACZ,eAAY,IACZ,aAAU,IACV,eACA,aACA,aACA,gBAC2B;CAC3B,IAAM,CAAC,GAAO,KAAY,EAAM,SAAwB,IAAI,GACtD,CAAC,GAAM,KAAW,EAAM,SAAS,EAAK,GACtC,CAAC,GAAa,KAAkB,EAAM,SAAS,EAAK,GACpD,CAAC,GAAY,KAAiB,EAAM,SAAwB,IAAI,GAChE,CAAC,GAAa,KAAkB,EAAM,SAAS,EAAE,GACjD,CAAC,GAAa,KAAkB,EAAM,SAAwB,IAAI,GAClE,CAAC,GAAc,KAAmB,EAAM,SAAwB,IAAI,GAEpE,IAAc,EAAS,WAAW;CAExC,eAAe,EAAI,GAA0C;EAC3D,IAAI,GAAM,OAAO,EAAE,IAAI,GAAM;EAE7B,AADA,EAAS,IAAI,GACb,EAAQ,EAAI;EACZ,IAAI;GAEF,OAAO;IAAE,IAAI;IAAM,QAAA,MADE,EAAO;GACF;EAC5B,SAAS,GAAO;GAEd,OADA,EAAS,aAAiB,QAAQ,EAAM,UAAU,uBAAuB,GAClE,EAAE,IAAI,GAAM;EACrB,UAAU;GACR,EAAQ,EAAK;EACf;CACF;CAEA,eAAe,IAAiB;EAG9B,AAFA,EAAe,EAAI,GACnB,MAAM,QAAU,IAAa,CAAC,GAC9B,EAAe,EAAK;CACtB;CAEA,SAAS,EAAY,GAAwB;EAI3C,AAHA,EAAgB,IAAI,GACpB,EAAc,EAAQ,EAAE,GACxB,EAAe,EAAQ,QAAQ,EAAE,GACjC,EAAe,IAAI;CACrB;CAEA,eAAe,EAAa,GAAY;EACtC,IAAM,IAAO,EAAY,KAAK;EAC9B,IAAI,EAAK,SAAS,KAAK,EAAK,SAAS,IAAU;GAC7C,EAAe,8BAA8B,GAAS,aAAa;GACnE;EACF;EAEI,CAAC,MADiB,QAAU,IAAW,GAAI,CAAI,CAAC,EAAA,CACvC,OACb,EAAc,IAAI,GAClB,EAAe,IAAI;CACrB;CAEA,eAAe,GAAc,GAAY;EACvC,IAAM,IAAU,MAAM,QAAU,IAAW,CAAE,CAAC;EAC9C,EAAgB,IAAI,GACf,EAAQ,MACT,MAAe,KAAI,EAAc,IAAI;CAC3C;CAEA,OACE,kBAAC,IAAD;EAAc,eAAc;YAC1B,kBAAC,IAAD;GAAM,WAAW,EAAG,UAAU,CAAS;GAAG,aAAU;aAApD,CACE,kBAAC,IAAD,EAAA,UAAA,CACE,kBAAC,IAAD,EAAA,UAAY,EAAiB,CAAA,GAC7B,kBAAC,IAAD,EAAA,UAAkB,EAA6B,CAAA,CACrC,EAAA,CAAA,GACZ,kBAAC,IAAD,EAAA,UACI,IAKE,IACF,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,IAAD,EAAS,WAAU,SAAU,CAAA,GAAC,mBAE3B;QAEL,kBAAC,EAAO,KAAR;IACE,QAAA;IACA,YAAY;KAAE,UAAU;KAAK,MAAM;IAAK;IACxC,WAAU;cAHZ;KAKE,kBAAC,GAAD,EAAW,SAAS,EAAQ,CAAA;KAE3B,EAAS,SAAS,IACjB,kBAAC,MAAD;MAAI,cAAW;MAAW,WAAU;gBAClC,kBAAC,GAAD;OAAiB,SAAS;iBACvB,EAAS,KAAK,GAAS,MAAU;QAChC,IAAM,IAAO,EAAQ,QAAQ,WACvB,IAAU,GAAW,EAAQ,SAAS,GACtC,IAAW,GAAW,EAAQ,UAAU;QAC9C,OACE,kBAAC,EAAO,IAAR;SAEE,QAAA;SACA,WAAU;SACV,SAAS;UAAE,SAAS;UAAG,GAAG;SAAG;SAC7B,SAAS;UAAE,SAAS;UAAG,GAAG;SAAE;SAC5B,MAAM;UAAE,SAAS;UAAG,GAAG;SAAG;SAG1B,YAAY;UACV,UAAU;UACV,MAAM;UACN,OAAO,KAAK,IAAI,GAAO,CAAC,IAAI;SAC9B;mBAbF;UAeE,kBAAC,OAAD;WAAK,WAAU;qBAAf,CACE,kBAAC,OAAD;YAAK,WAAU;sBAAf,CACE,kBAAC,QAAD;aACE,eAAY;aACZ,WAAU;uBAEV,kBAAC,GAAD,EAAc,WAAU,SAAU,CAAA;YAC9B,CAAA,GACN,kBAAC,OAAD;aAAK,WAAU;uBAAf,CACE,kBAAC,QAAD;cAAM,WAAU;wBACb;aACG,CAAA,GACN,kBAAC,QAAD;cAAM,WAAU;wBAAhB;eACG,IAAU,SAAS,MAAY;eAC/B,KAAW,IAAW,QAAQ;eAC9B,IAAW,aAAa,MAAa;cAClC;eACH;cACF;eACL,kBAAC,OAAD;YAAK,WAAU;sBAAf,CACE,kBAAC,GAAD;aACE,cAAY,UAAU;aACtB,MAAK;aACL,MAAK;aACL,SAAQ;aACR,UAAU;aACV,eAAe,EAAY,CAAO;uBACnC;YAEO,CAAA,GACR,kBAAC,GAAD;aACE,cAAY,UAAU;aACtB,MAAK;aACL,MAAK;aACL,SAAQ;aACR,UAAU;aACV,eAAe;cAEb,AADA,EAAc,IAAI,GAClB,EAAgB,EAAQ,EAAE;aAC5B;uBACD;YAEO,CAAA,CACL;aACF;;UAEL,kBAAC,GAAD;WAAQ,MAAM,MAAe,EAAQ;qBACnC,kBAAC,QAAD;YACE,WAAU;YACV,WAAW,MAAU;aAEnB,AADA,EAAM,eAAe,GACrB,EAAkB,EAAQ,EAAE;YAC9B;sBALF;aAOE,kBAAC,GAAD;cACE,WAAU;cACV,SAAS,EAAQ;wBAFnB;eAIE,kBAAC,GAAD;gBAAY,WAAU;0BAAU;eAEpB,CAAA;eACZ,kBAAC,IAAD;gBACE,cAAW;gBACX,gBAAc,IAAc,KAAO,KAAA;gBACnC,WAAA;gBACA,UAAU;gBACV,WAAW;gBACX,OAAO;gBACP,WAAW,MACT,EAAe,EAAM,OAAO,KAAK;eAEpC,CAAA;eACA,KACC,kBAAC,IAAD;gBAAY,OAAA;0BAAO;eAAwB,CAAA;cAExC;;aACP,kBAAC,GAAD;cAAQ,MAAK;cAAK,MAAK;cAAS,SAAS;wBAAM;aAEvC,CAAA;aACR,kBAAC,GAAD;cACE,MAAK;cACL,MAAK;cACL,SAAQ;cACR,UAAU;cACV,eAAe,EAAc,IAAI;wBAClC;aAEO,CAAA;YACJ;;UACA,CAAA;UAER,kBAAC,GAAD;WAAQ,MAAM,MAAiB,EAAQ;qBACrC,kBAAC,OAAD;YACE,WAAU;YACV,MAAK;YACL,cAAY,oBAAoB;sBAHlC;aAKE,kBAAC,KAAD;cAAG,WAAU;wBAAU;aAGpB,CAAA;aACF,KACC,kBAAC,KAAD;cAAG,WAAU;wBACV;aACA,CAAA;aAEL,kBAAC,OAAD;cAAK,WAAU;wBAAf,CACE,kBAAC,GAAD;eACE,MAAK;eACL,MAAK;eACL,SAAQ;eACR,SAAS;eACT,eAAe,KAAK,GAAc,EAAQ,EAAE;yBAC7C;cAEO,CAAA,GACR,kBAAC,GAAD;eACE,MAAK;eACL,MAAK;eACL,SAAQ;eACR,UAAU;eACV,eAAe,EAAgB,IAAI;yBACpC;cAEO,CAAA,CACL;;YACF;;UACC,CAAA;SACC;WA9IJ,EAAQ,EA8IJ;OAEf,CAAC;MACc,CAAA;KACf,CAAA,IAEJ,kBAAC,KAAD;MAAG,WAAU;gBAAgC;KAG1C,CAAA;KAGL,kBAAC,GAAD;MACE,WAAU;MACV,MAAK;MACL,SAAQ;MACR,UAAU;MACV,SAAS;MACT,eAAe,KAAK,EAAe;gBACpC;KAEO,CAAA;IACE;QA9LZ,kBAAC,KAAD;IAAG,WAAU;cAAgC;GAG1C,CAAA,EA6LI,CAAA,CACP;;CACM,CAAA;AAElB;;;ACnTA,SAAgB,GAAmB,EACjC,eAAY,IACZ,WAAQ,0BACR,aACA,kBAAe,wDACf,gBAC0B;CAC1B,IAAM,CAAC,GAAO,KAAY,EAAM,SAAwB,IAAI,GACtD,CAAC,GAAS,KAAc,EAAM,SAAS,EAAK;CAElD,IAAI,CAAC,GAAW,OAAO;CAEvB,eAAe,IAAc;EACvB,QAEJ;GADA,EAAS,IAAI,GACb,EAAW,EAAI;GACf,IAAI;IACF,MAAM,IAAW;GACnB,SAAS,GAAO;IACd,EACE,aAAiB,QACb,EAAM,UACN,mCACN;GACF,UAAU;IACR,EAAW,EAAK;GAClB;EAXe;CAYjB;CAEA,OACE,kBAAC,OAAD;EAAK,WAAW,EAAG,8BAA8B,CAAS;YAA1D;GACE,kBAAC,GAAD;IACE,SAAQ;IACR,WAAU;IACV,MAAK;IACI;IACT,eAAe,KAAK,EAAY;cALlC,CAOE,kBAAC,GAAD,EAAiB,eAAY,OAAQ,CAAA,GACrC,kBAAC,QAAD;KAAM,WAAU;eAAU;IAAY,CAAA,CAChC;;GACR,kBAAC,GAAD,EAAW,SAAS,EAAQ,CAAA;GAC5B,kBAAC,GAAD;IAAQ,MAAM,EAAQ,KAAU,EAAQ;cACtC,kBAAC,KAAD;KAAG,WAAU;eAAiC;IAAgB,CAAA;GACxD,CAAA;EACL;;AAET;;;ACZA,SAAgB,GAAY,EAC1B,WAAQ,uBACR,iBAAc,0CACd,SACA,WACA,eAAY;CAAC;CAAU;CAAS;AAAQ,GACxC,mBAAgB,IAChB,eAAY,IACZ,iBACA,yBAAsB,IACtB,yBACA,2BAAwB,IACxB,aACA,mBACA,qBACA,YACA,cACmB;CACnB,IAAM,IAAS,EAAM,MAAM,GACrB,IAAU,EAAM,MAAM,GACtB,IAAa,EAAM,MAAM,GACzB,IAAU,EAAM,MAAM,GACtB,CAAC,GAAQ,KAAa,EAAM,SAAqB,MAAM,GACvD,CAAC,GAAO,KAAY,EAAM,SAAwB,IAAI,GACtD,CAAC,GAAiB,KACtB,EAAM,SAAgC,IAAI,GACtC,CAAC,GAAU,KAAe,EAAM,SAAS,EAAE,GAI3C,CAAC,IAAmB,KACxB,EAAM,SAAS,CAAmB,GAC9B,IAAQ,KAAgB;CAE9B,SAAS,GAAkB,GAAkB;EAE3C,AADI,MAAiB,KAAA,KAAW,EAAqB,CAAO,GAC5D,IAAuB,CAAO;CAChC;CAIA,IAAM,CAAC,IAAY,KAAiB,EAAM,SAAS,EAAK,GAClD,CAAC,GAAW,KAAgB,EAAM,SAAS,EAAK,GAEhD,IAAO,MAAW,aAAa,MAAoB,MACnD,IACJ,CAAC,KACD,GAAoB,CAAQ,MAAM,GAAqB,QAKnD,IAAgB,EAAS,KAAK,CAAC,CAAC,SAAS,KAAK,GAC9C,KACH,CAAC,KAAiB,MAAc,MAAc;CAEjD,eAAe,GAAa,GAA2C;EAGrE,IAFA,EAAM,eAAe,GACrB,EAAS,IAAI,GACT,CAAC,GAAc;GACjB,EAAS,wCAAwC;GACjD;EACF;EACA,IAAI,KAAa,CAAC,GAAO;GACvB,EAAS,sCAAsC;GAC/C;EACF;EACA,IAAM,IAAO,IAAI,SAAS,EAAM,aAAa;EAC7C,EAAU,SAAS;EACnB,IAAI;GAMF,AALA,MAAM,IAAW;IACf,MAAM,OAAO,EAAK,IAAI,MAAM,KAAK,EAAE;IACnC,OAAO,OAAO,EAAK,IAAI,OAAO,KAAK,EAAE;IACrC;GACF,CAAC,GACD,EAAU,SAAS;EACrB,SAAS,GAAO;GAEd,AADA,EAAU,MAAM,GAChB,EACE,aAAiB,QAAQ,EAAM,UAAU,2BAC3C;EACF;CACF;CAEA,eAAe,GAAe,GAA0B;EAEtD,AADA,EAAS,IAAI,GACb,EAAmB,CAAQ;EAC3B,IAAI;GAEF,AADA,MAAM,IAAmB,CAAQ,GACjC,EAAU,SAAS;EACrB,SAAS,GAAO;GACd,EACE,aAAiB,QAAQ,EAAM,UAAU,2BAC3C;EACF,UAAU;GACR,EAAmB,IAAI;EACzB;CACF;CAEA,OACE,kBAAC,IAAD;EACS;EACM;EACP;EACE;EACR,QACE,MAAW,aACT,kBAAA,GAAA,EAAA,UAAA;GAAE;GACyB;GACzB,kBAAC,GAAD;IAAQ,SAAQ;IAAO,SAAS;cAAS;GAEjC,CAAA;EACR,EAAA,CAAA;YAIN,kBAAC,IAAD;GAAW,MAAM,MAAW,YAAY,YAAY;aACjD,MAAW,YACV,kBAAC,IAAD;IACE,OAAM;IACN,aAAY;GACb,CAAA,IAED,kBAAC,OAAD;IAAK,WAAU;cAAf,CACG,EAAU,SAAS,KAGlB,kBAAC,GAAD;KAAQ,MAAM,CAAC;KAAmB,WAAU;eAA5C,CACE,kBAAC,IAAD;MACa;MACX,QAAO;MACU;MACjB,UAAU,MAAW;MACrB,UAAU;KACX,CAAA,GACD,kBAAC,IAAD,EAAe,OAAM,gBAAiB,CAAA,CAChC;QAEV,kBAAC,QAAD;KAAM,WAAU;KAAsB,UAAU;eAAhD;MACG,KACC,kBAAC,GAAD;OAAO,MAAK;iBAAZ,CACE,kBAAC,GAAD;QAAY,SAAS;kBAAQ;OAAgB,CAAA,GAC7C,kBAAC,IAAD;QACE,cAAW;QACX,IAAI;QACJ,MAAK;QACL,cAAa;QACb,aAAY;QACZ,UAAA;QACA,UAAU;QACV,WAAW,MACT,EAAa,EAAM,cAAc,SAAS,KAAK;OAElD,CAAA,CACI;;MAET,kBAAC,GAAD;OAAO,MAAK;iBAAZ,CACE,kBAAC,GAAD;QAAY,SAAS;kBAAS;OAAiB,CAAA,GAC/C,kBAAC,IAAD;QACE,IAAI;QACJ,MAAK;QACL,MAAK;QACL,cAAW;QACX,cAAa;QACb,aAAY;QACZ,UAAA;QACA,UAAU;QACV,WAAW,MACT,EAAc,EAAM,cAAc,SAAS,KAAK;OAEnD,CAAA,CACI;;MACP,kBAAC,GAAD;OAAQ,MAAM;iBACZ,kBAAC,GAAD;QAAO,MAAK;kBAAZ,CACE,kBAAC,GAAD;SAAY,SAAS;mBAAY;QAAoB,CAAA,GACrD,kBAAC,IAAD;SACE,IAAI;SACJ,MAAK;SACL,cAAW;SACX,cAAa;SACb,aAAY;SACZ,cAAA;SACA,UAAA;SACA,UAAU;SACV,OAAO;SACP,WAAW,MAAU,EAAY,EAAM,OAAO,KAAK;QACpD,CAAA,CACI;;MACD,CAAA;MACP,KACC,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,IAAD;QACE,IAAI;QACJ,SAAS;QACT,kBAAkB,MAChB,GAAkB,MAAY,EAAI;QAEpC,UAAU;OACX,CAAA,GACD,kBAAC,IAAD;QAAO,SAAS;QAAS,WAAU;kBAAnC;SAAiD;SAChC;SACd,KACC,kBAAC,GAAD;UAAQ,SAAQ;UAAO,MAAK;UAAS,SAAS;oBAAS;SAE/C,CAAA;QAEL;SACJ;;MAEP,kBAAC,GAAD,EAAW,SAAS,EAAQ,CAAA;MAC5B,kBAAC,GAAD;OACE,WAAW,EAAG,UAAU,KAAA,iUAAgC;OACxD,MAAK;OACL,SAAS,MAAW;OACpB,UAAU;iBACX;MAEO,CAAA;KACJ;MACH;;EAEE,CAAA;CACH,CAAA;AAEd;;;ACvPA,SAAgB,GAAoB,EAClC,WAAQ,wBACR,iBAAc,0CACd,SACA,WACA,iBAAc,GACd,aACA,aAC2B;CAC3B,IAAM,IAAa,EAAM,MAAM,GACzB,IAAY,EAAM,MAAM,GACxB,CAAC,GAAQ,KAAa,EAAM,SAAqB,MAAM,GACvD,CAAC,GAAO,KAAY,EAAM,SAAwB,IAAI,GACtD,CAAC,GAAU,KAAe,EAAM,SAAS,EAAE,GAC3C,CAAC,GAAiB,KAAsB,EAAM,SAAS,EAAE,GAKzD,IAAe,GAAoB,CAAQ,KAAK,GAChD,IAAU,EAAgB,SAAS,KAAK,MAAoB,GAC5D,IAAY,KAAgB,GAK5B,IACJ,EAAgB,SAAS,KAAK,CAAC,EAAS,WAAW,CAAe;CAEpE,eAAe,EAAa,GAAyC;EACnE,MAAM,eAAe,GAEhB,GAEL;GADA,EAAS,IAAI,GACb,EAAU,SAAS;GACnB,IAAI;IAEF,AADA,MAAM,IAAW,EAAE,YAAS,CAAC,GAC7B,EAAU,SAAS;GACrB,SAAS,GAAO;IAEd,AADA,EAAU,MAAM,GAChB,EACE,aAAiB,QAAQ,EAAM,UAAU,4BAC3C;GACF;EATmB;CAUrB;CAEA,OACE,kBAAC,IAAD;EACS;EACM;EACP;EACE;YAER,kBAAC,IAAD;GAAW,MAAM,MAAW,YAAY,YAAY;aACjD,MAAW,YACV,kBAAC,IAAD;IACE,OAAM;IACN,aAAY;cAEX,KACC,kBAAC,GAAD;KAAQ,SAAQ;KAAO,SAAS;eAAQ;IAEhC,CAAA;GAEC,CAAA,IAEb,kBAAC,QAAD;IAAM,WAAU;IAAsB,UAAU;cAAhD;KACE,kBAAC,GAAD;MAAO,MAAK;gBAAZ,CACE,kBAAC,GAAD;OAAY,SAAS;iBAAY;MAAwB,CAAA,GACzD,kBAAC,IAAD;OACE,IAAI;OACJ,MAAK;OACL,cAAa;OACb,UAAA;OACA,cAAA;OACA,UAAU,MAAW;OACrB,OAAO;OACP,WAAW,MAAU,EAAY,EAAM,OAAO,KAAK;MACpD,CAAA,CACI;;KACP,kBAAC,GAAD;MAAQ,MAAM;gBACZ,kBAAC,GAAD;OAAO,MAAK;iBAAZ,CACE,kBAAC,GAAD;QAAY,SAAS;kBAAW;OAAgC,CAAA,GAChE,kBAAC,IAAD;QACE,IAAI;QACJ,MAAK;QACL,cAAa;QACb,UAAA;QACA,UAAU,MAAW;QACrB,OAAO;QACP,WAAW,MAAU,EAAmB,EAAM,OAAO,KAAK;OAC3D,CAAA,CACI;;KACD,CAAA;KACR,kBAAC,GAAD,EACE,SAAS,MAAU,IAAW,4BAA4B,MAC3D,CAAA;KACD,kBAAC,GAAD;MAAQ,MAAM;gBACZ,kBAAC,GAAD;OACE,WAAW,EAAG,UAAU,KAAA,iUAAgC;OACxD,MAAK;OACL,SAAS,MAAW;iBACrB;MAEO,CAAA;KACF,CAAA;IACJ;;EAEC,CAAA;CACH,CAAA;AAEd;;;AC5JA,IAAa,IAAW;CAAC;CAAM;CAAG;CAAK;AAAC,GAC3B,KAAc;CAAC;CAAM;CAAG;CAAO;AAAC,GAChC,KAAc;CAAC;CAAM;CAAM;CAAG;AAAC,GAG/B,KAAe,iCAGf,KAAe;CAC1B,MAAM;CACN,WAAW;CACX,SAAS;CACT,MAAM;AACR,GAGa,KAAc;CACzB,MAAM;CACN,WAAW;CACX,SAAS;CACT,MAAM;AACR,GAGa,KAAe;CAC1B,MAAM;CACN,WAAW;CACX,SAAS;CACT,MAAM;AACR,GAGa,KAAgB;CAC3B,MAAM;CACN,WAAW;CACX,SAAS;CACT,MAAM;AACR,GAGa,KAAe;CAC1B,WAAW;CACX,SAAS;CACT,MAAM;AACR,GAIa,KAAe;CAC1B,WAAW;CACX,SAAS;CACT,MAAM;AACR,GCdM,KAAqB;CACzB,SAAS;EAAE,SAAS;EAAG,QAAQ;CAAY;CAC3C,SAAS;EAAE,SAAS;EAAG,QAAQ;CAAY;CAC3C,OAAO,MACJ,IAAiD,CAAC,IAAvC;EAAE,SAAS;EAAG,QAAQ;CAAY;AAClD,GAEM,KAA4B;CAChC,SAAS,EAAE,SAAS,EAAE;CACtB,SAAS,EAAE,SAAS,EAAE;CACtB,OAAO,MAAwB,IAA4B,CAAC,IAAlB,EAAE,SAAS,EAAE;AACzD,GAEa,KAAiB,EAC5B,SACE,EACE,aACA,QAAK,OACL,cACA,iBACA,kBACA,2BACA,WAAQ,IACR,GAAG,KAEL,GACA;CACF,IAAM,CAAC,GAAU,KAAe,EAAwB,IAAI,GACtD,IAAM,GAAM,GACZ,IAAS,GAAiB,GAExB,IAAmB,GAAS,QAAQ,CAAQ,CAAC,CAChD,OAAO,CAAc,CAAC,CACtB,KAAK,GAAO,MAAU;EACrB,IAAM,IAAK,GAKL,IAAW,EAAG,MAAM,OAAO,EAAG,GAAG,IAAI,QAAQ;EACnD,OAAO,GACL,GACA;GACE,KAAK;GACL,WAAW,EAAG,YAAY,EAAG,MAAM,SAAS;GAC5C,oBAAoB;IAElB,AADA,EAAG,MAAM,eAAe,GACxB,EAAY,CAAQ;GACtB;EACF,GACA,kBAAA,GAAA,EAAA,UAAA,CACE,kBAAC,GAAD;GAAiB,QAAQ,MAAa;aACnC,MAAa,OAwBV,OAvBF,kBAAC,EAAO,KAAR;IACE,UAAU,IAAS,KAAkB;IACrC,SAAQ;IACR,SAAQ;IACR,MAAK;IACL,QAAQ,MAAa;IACrB,WAAW,EACT,0CACA,CACF;IACA,OAAO;KAAE,MAAM,CAAC;KAAO,OAAO,CAAC;IAAM;cAEpC,MAAa,IACZ,kBAAC,EAAO,KAAR;KACE,UAAU,aAAa;KACvB,YAAY,IAAS,EAAE,UAAU,EAAE,IAAI;KACvC,WAAW,EACT,mEACA,CACF;IACD,CAAA,IACC;GACM,CAAA;EAEC,CAAA,GACjB,kBAAC,OAAD;GAAK,WAAU;aAAiB,EAAG,MAAM;EAAc,CAAA,CACvD,EAAA,CAAA,CACJ;CACF,CAAC,GAEG,KAAoB,MAAmC;EAE3D,AADA,EAAY,IAAI,GAChB,IAAe,CAAK;CACtB;CAIA,OACE,EADK,MAAO,OACX,EAAO,KAUP,EAAO,KAVR;EACE,GAAK;EACL,KAAK;EACL,YAAA;EACA,cAAc;EACd,WAAW,EAAG,wBAAwB,CAAS;YAE9C;CACQ,CAUC;AAEhB,CACF,GC/GM,KAAe,sBACf,KAA4B,KAE5B,KAAmB;CACvB,UAAU;CACV,MAAM;AACR,GAKM,KAA2B;CAC/B,MAAM;CACN,WAAW;CACX,SAAS;CACT,MAAM;AACR,GAEM,KAAyB;CAC7B,UAAU;CACV,OAAO;CACP,MAAM;AACR,GAEM,KAAwB;CAC5B,UAAU;CACV,MAAM;AACR,GAEM,KAAqB;CACzB,UAAU;CACV,MAAM;AACR,GAEM,KAA6B;CACjC,QAAQ;EACN,SAAS;EACT,UAAU;EACV,YAAY;GACV,UAAU;GACV,MAAM;GACN,iBAAiB;GACjB,kBAAkB;EACpB;CACF;CACA,MAAM;EACJ,SAAS;EACT,UAAU;EACV,YAAY;GACV,UAAU;GACV,eAAe;GACf,MAAM;GACN,iBAAiB;EACnB;CACF;AACF,GAEM,KAAkC;CACtC,QAAQ;EACN,SAAS;EACT,GAAG;EACH,QAAQ;CACV;CACA,MAAM;EACJ,SAAS;EACT,GAAG;EACH,QAAQ;EACR,YAAY;CACd;AACF,GAEM,KAAqB;CACzB,UAAU;CACV,MAAM;AACR,GAEM,KAAqB;CACzB;CACA;CACA;CACA;CACA;CACA;AACF,CAAC,CAAC,KAAK,GAAG;AAEV,SAAS,GAAuB,GAAsB;CACpD,IAAM,IAAQ,OAAO,WAAW,EAAY;CAE5C,OADA,EAAM,iBAAiB,UAAU,CAAQ,SAC5B,EAAM,oBAAoB,UAAU,CAAQ;AAC3D;AAEA,SAAS,KAAoB;CAC3B,OAAO,OAAO,WAAW,EAAY,CAAC,CAAC;AACzC;AAEA,SAAS,KAA0B;CACjC,OAAO;AACT;AAEA,SAAS,KAAc;CACrB,OAAO,GACL,IACA,IACA,EACF;AACF;AAiBA,IAAM,KACJ,EAAkD,IAAI,GAQlD,KACJ,EAAuD,IAAI;AAE7D,SAAgB,KAAqB;CACnC,IAAM,IAAU,EAAW,EAAsB;CACjD,IAAI,CAAC,GACH,MAAU,MACR,iEACF;CAEF,OAAO;AACT;AAEA,SAAS,KAA0B;CACjC,IAAM,IAAU,EAAW,EAA2B;CACtD,IAAI,CAAC,GACH,MAAU,MACR,6DACF;CAEF,OAAO;AACT;AAuBA,SAAgB,GAAwB,EACtC,aACA,SACA,gBACA,iBACA,eACA,sBACA,uBACA,cACA,UACA,GAAG,KAC4B;CAC/B,IAAM,CAAC,GAAc,KAAmB,SAE/B;EACP,MAAM,GAAa,QAAQ;EAC3B,OAAO,GAAa,SAAS;CAC/B,EAAE,GACI,CAAC,GAAoB,KAAyB,SAE3C;EACP,MAAM,GAAmB,QAAQ;EACjC,OAAO,GAAmB,SAAS;CACrC,EAAE,GACI,IAAW,GAAY,GACvB,IAAS,GAAiB,KAAK,IAC/B,IAAc,GAAM,GACpB,IAAiB,EAA0B,IAAI,GAC/C,IAAkB,EAA0B,IAAI,GAIhD,IAAiB,GAAM,MACvB,IAAkB,GAAM,OACxB,IAAuB,GAAY,MACnC,IAAwB,GAAY,OAEpC,IAAY,UACT;EACL,MAAM,KAAkB,EAAa;EACrC,OAAO,KAAmB,EAAa;CACzC,IACA;EAAC;EAAgB;EAAiB;CAAY,CAChD,GACM,IAAkB,UACf;EACL,MAAM,KAAwB,EAAmB;EACjD,OAAO,KAAyB,EAAmB;CACrD,IACA;EAAC;EAAsB;EAAuB;CAAkB,CAClE,GAEM,IAAU,GACb,GAAmB,MAAsB;EAOxC,CANmB,MAAS,SAAS,IAAiB,OACnC,KAAA,KACjB,GAAiB,MACf,EAAK,OAAU,IAAW,IAAO;GAAE,GAAG;IAAO,IAAO;EAAS,CAC/D,GAEF,IAAe,GAAU,CAAI;CAC/B,GACA;EAAC;EAAgB;EAAiB;CAAY,CAChD,GAEM,IAAgB,GACnB,GAAmB,MAAsB;EAQxC,CANE,MAAS,SAAS,IAAuB,OACxB,KAAA,KACjB,GAAuB,MACrB,EAAK,OAAU,IAAW,IAAO;GAAE,GAAG;IAAO,IAAO;EAAS,CAC/D,GAEF,IAAqB,GAAU,CAAI;CACrC,GACA;EAAC;EAAsB;EAAuB;CAAkB,CAClE,GAEM,IAAgB,GACnB,MAAsB;EACrB,AAAI,IAAU,EAAc,CAAC,EAAgB,IAAO,CAAI,IACnD,EAAQ,CAAC,EAAU,IAAO,CAAI;CACrC,GACA;EAAC;EAAU;EAAiB;EAAW;EAAS;CAAa,CAC/D,GAEM,IAAc,UACX;EAAE,MAAM;EAAgB,OAAO;CAAgB,IACtD,CAAC,CACH;CAiBA,OAfA,QAAgB;EACd,IAAM,KAAkB,MAAyB;GAC/C,AACE,EAAM,IAAI,YAAY,MAAM,OAC3B,EAAM,WAAW,EAAM,aAExB,EAAM,eAAe,GACrB,EAAc,MAAM;EAExB;EAGA,OADA,OAAO,iBAAiB,WAAW,CAAc,SACpC,OAAO,oBAAoB,WAAW,CAAc;CACnE,GAAG,CAAC,CAAa,CAAC,GAGhB,kBAAC,GAAuB,UAAxB;EACE,OAAO;GACL;GACA,UAAU,GAAG,EAAY;GACzB,MAAM;GACN,YAAY;GACZ;GACA;GACA;GACA;GACA;EACF;YAEA,kBAAC,OAAD;GACE,GAAI;GACJ,aAAU;GACV,mBAAiB,EAAU,OAAO,aAAa;GAC/C,oBAAkB,EAAU,QAAQ,aAAa;GACjD,OAAO;IACL,mBAAmB;IACnB,wBAAwB;IACxB,0BAA0B;IAC1B,GAAG;GACL;GACA,WAAW,EACT,uDACA,CACF;GAEC;EACE,CAAA;CAC0B,CAAA;AAErC;AAEA,SAAS,GAAc,EACrB,cACA,aACA,cACA,WAMC;CACD,IAAM,IAAU,GAAmB,GAC7B,IAAO,EAAQ,WAAW,IAC1B,KAAW,MAAsB,EAAQ,cAAc,GAAU,CAAI,GACrE,IAAa,EAAQ,YAAY,IACjC,IAAW,EAAuB,IAAI,GACtC,CAAC,GAAS,KAAc,EAAS,EAAK;CA4C5C,OA1CA,QAAgB,EAAW,EAAI,GAAG,CAAC,CAAC,GAEpC,QAAgB;EACd,IAAI,CAAC,GAAM;EAEX,IAAM,IAAO,SAAS,MAChB,IAAU,OAAO,SACjB,IAAU,EAAW,SACrB,IAAqB;GACzB,MAAM,EAAK,MAAM;GACjB,UAAU,EAAK,MAAM;GACrB,UAAU,EAAK,MAAM;GACrB,OAAO,EAAK,MAAM;GAClB,KAAK,EAAK,MAAM;EAClB;EAMA,AAJA,EAAK,MAAM,WAAW,SACtB,EAAK,MAAM,MAAM,IAAI,EAAQ,KAC7B,EAAK,MAAM,OAAO,KAClB,EAAK,MAAM,QAAQ,KACnB,EAAK,MAAM,WAAW;EAEtB,IAAM,IAAa,4BAA4B;GAG5C,CADC,EAAS,SAAS,cAA2B,EAAkB,KAC7C,EAAS,QAAA,EAAU,MAAM,EAAE,eAAe,GAAK,CAAC;EACtE,CAAC;EAED,aAAa;GAQX,AAPA,qBAAqB,CAAU,GAC/B,EAAK,MAAM,WAAW,EAAmB,UACzC,EAAK,MAAM,MAAM,EAAmB,KACpC,EAAK,MAAM,OAAO,EAAmB,MACrC,EAAK,MAAM,QAAQ,EAAmB,OACtC,EAAK,MAAM,WAAW,EAAmB,UACzC,OAAO,SAAS,GAAG,CAAO,GAC1B,GAAS,MAAM,EAAE,eAAe,GAAK,CAAC;EACxC;CACF,GAAG,CAAC,GAAM,CAAU,CAAC,GAEhB,IAEE,GACL,kBAAC,OAAD;EACE,WAAW,EACT,oDACA,IAAO,YAAY,WACrB;YAJF,CAME,kBAAC,EAAO,QAAR;GACE,MAAK;GACL,cAAW;GACX,UAAU,IAAO,IAAI;GACrB,SAAS;GACT,SAAS,EAAE,SAAS,KAAa;GACjC,YAAY,EAAQ,SAAS,KAAqB;GAClD,eAAe,EAAQ,EAAK;GAC5B,WAAW,EACT,oBACA,IAAO,wBAAwB,qBACjC;EACD,CAAA,GAED,kBAAC,EAAO,KAAR;GACE,KAAK;GACL,MAAK;GACL,cAAW;GACX,cAAY;GACZ,eAAa,CAAC;GACd,OAAO,CAAC;GACR,UAAU;GACV,eAAY;GACZ,cAAY,IAAO,aAAa;GAChC,aAAW;GACX,SAAS;GACT,SAAS;IACP,SAAS,EAAQ,SAAU,OAAgB;IAC3C,GAAG,EAAQ,SACP,IACA,IACE,OACA,MAAS,SACP,UACA;GACV;GACA,YAAY,EAAQ,SAAS,KAAqB;GAClD,YAAY,MAAU;IACpB,IAAI,EAAM,QAAQ,UAAU;KAE1B,AADA,EAAM,eAAe,GACrB,EAAQ,EAAK;KACb;IACF;IAEA,IAAI,EAAM,QAAQ,OAAO;IACzB,IAAM,IAAY,EAAS,UACvB,MAAM,KACJ,EAAS,QAAQ,iBACf,EACF,CACF,IACA,CAAC;IAEL,IAAI,EAAU,WAAW,GAAG;KAE1B,AADA,EAAM,eAAe,GACrB,EAAS,SAAS,MAAM;KACxB;IACF;IAEA,IAAM,IAAQ,EAAU,IAClB,IAAO,EAAU,EAAU,SAAS;IAC1C,AAAI,EAAM,YAAY,SAAS,kBAAkB,KAC/C,EAAM,eAAe,GACrB,EAAK,MAAM,KACF,CAAC,EAAM,YAAY,SAAS,kBAAkB,MACvD,EAAM,eAAe,GACrB,EAAM,MAAM;GAEhB;GACA,WAAW,EACT,sHACA,yBACA,MAAS,SAAS,oBAAoB,WACtC,CAAC,KAAQ,uBACT,CACF;aAEA,kBAAC,GAA4B,UAA7B;IACE,OAAO;KAAE,WAAW;KAAO,aAAa;KAAQ;IAAK;IAEpD;GACmC,CAAA;EAC5B,CAAA,CACT;KACL,SAAS,IACX,IA9FqB;AA+FvB;AAcA,IAAa,KAAkB,EAC7B,SACE,EACE,UAAO,QACP,aAAU,WACV,iBAAc,QACd,eAAY,WACZ,aACA,cACA,mBACA,UACA,GAAG,KAEL,GACA;CACA,IAAM,IAAU,GAAmB,GAC7B,IAAW,EAAQ,KAAK,IACxB,IAAY,MAAgB,UAAU,CAAC,GACvC,IAAY,KAAa,MAAgB,aACzC,IAAQ,IACV,QACA,IACE,8BACA;CAUN,OARI,EAAQ,WAER,kBAAC,IAAD;EAA0B;EAAsB;EAAiB;EAC9D;CACY,CAAA,IAKjB,kBAAC,EAAO,OAAR;EACE,GAAI;EACJ,KAAK;EACL,SAAS;EACT,cAAY;EACZ,aAAU;EACV,cAAY,IAAY,cAAc;EACtC,oBAAkB;EAClB,gBAAc;EACd,aAAW;EACX,SAAS,EAAE,SAAM;EACjB,YAAY,EAAQ,SAAS,EAAE,UAAU,EAAE,IAAI;EACxC;EACP,WAAW,EACT,8EACA,cAKA,MAAgB,eACd,kDACF,MAAS,WAAW,cACpB,CACF;YAxBF,CA0BG,MAAS,WAAW,CAAC,KACpB,kBAAC,EAAO,KAAR,EAAY,WAAU,+KAAgL,CAAA,GAExM,kBAAC,EAAO,KAAR;GACE,SAAS;GACT,SAAS;IACP,SAAS;IACT,GAAG,IAAa,MAAS,SAAS,UAAU,SAAU;GACxD;GACA,YAAY,EAAQ,SAAS,KAAqB;GAClD,WAAW,EACT,2DACA,MAAgB,eAAe,uBAE/B,MAAY,cAAc,6BAC1B,MAAY,WAAW,6BACvB,CACF;aAEA,kBAAC,GAA4B,UAA7B;IACE,OAAO;KAAE;KAAW;KAAa;IAAK;IAErC;GACmC,CAAA;EAC5B,CAAA,CACA;;AAElB,CACF,GAMa,KAAyB,EAGpC,SACA,EAAE,cAAW,YAAS,UAAO,QAAQ,UAAO,UAAU,GAAG,KACzD,GACA;CACA,IAAM,IAAU,GAAmB,GAC7B,IAAW,EAAQ,WACrB,EAAQ,WAAW,KACnB,EAAQ,KAAK,IACX,IAAa,EAAQ,YAAY;CAEvC,OACE,kBAAC,UAAD;EACE,GAAI;EACJ,MAAM,MAAS;GAEb,AADA,EAAW,UAAU,GACjB,OAAO,KAAiB,aAAY,EAAa,CAAI,IAChD,MAAc,EAAa,UAAU;EAChD;EACM;EACN,cAAY,EAAM,iBAAiB;EACnC,iBAAe;EACf,aAAU;EACV,aAAW;EACX,cAAY,IAAW,aAAa;EACpC,UAAU,MAAU;GAClB,IAAU,CAAK,GACX,GAAM,oBACV,EAAQ,cAAc,CAAI;EAC5B;EACA,WAAW,EACT,oFACA,iHACA,CACF;CACD,CAAA;AAEL,CAAC,GAMY,KAAuB,EAGlC,SACA,EAAE,cAAW,YAAS,UAAO,QAAQ,UAAO,UAAU,GAAG,KACzD,GACA;CACA,IAAM,IAAU,GAAmB;CAEnC,OACE,kBAAC,UAAD;EACE,GAAI;EACJ,KAAK;EACC;EACN,aAAW;EACX,cAAY,EAAM,iBAAiB;EACnC,UAAU,MAAU;GAClB,IAAU,CAAK,GACX,GAAM,qBACN,EAAQ,WAAU,EAAQ,cAAc,IAAO,CAAI,IAClD,EAAQ,QAAQ,IAAO,CAAI;EAClC;EACA,WAAW,EACT,oFACA,gDACA,CACF;CACD,CAAA;AAEL,CAAC,GAIY,KAAsB,EAGjC,SACA,EAAE,cAAW,YAAS,UAAO,UAAU,GAAG,KAC1C,GACA;CACA,IAAM,IAAU,GAAmB,GAC7B,IAAQ,GAAwB;CAEtC,OACE,kBAAC,UAAD;EACE,GAAI;EACJ,KAAK;EACC;EACN,aAAW,EAAM;EACjB,cAAY,EAAM,iBAAiB;EACnC,OAAM;EACN,UAAU;EACV,UAAU,MAAU;GAClB,IAAU,CAAK,GACX,GAAM,oBACV,EAAQ,cAAc,EAAM,IAAI;EAClC;EACA,WAAW,EACT,6EACA,+HACA,0FACA,CACF;CACD,CAAA;AAEL,CAAC,GAIY,KAAuB,EAGlC,SAA8B,EAAE,cAAW,GAAG,KAAS,GAAc;CACrE,OACE,kBAAC,EAAO,MAAR;EACE,GAAI;EACJ,KAAK;EACL,aAAU;EACV,WAAW,EACT,uDACA,yLACA,CACF;CACD,CAAA;AAEL,CAAC,GAEY,KAAwB,EAGnC,SAA+B,EAAE,cAAW,GAAG,KAAS,GAAc;CACtE,OACE,kBAAC,OAAD;EACE,GAAI;EACJ,KAAK;EACL,aAAU;EACV,WAAW,EAAG,oCAAoC,CAAS;CAC5D,CAAA;AAEL,CAAC,GAEY,KAAyB,EAGpC,SAAgC,EAAE,cAAW,GAAG,KAAS,GAAc;CACvE,OACE,kBAAC,OAAD;EACE,GAAI;EACJ,KAAK;EACL,aAAU;EACV,WAAW,EACT,qGACA,CACF;CACD,CAAA;AAEL,CAAC,GAEY,KAAwB,EAGnC,SAA+B,EAAE,cAAW,GAAG,KAAS,GAAc;CACtE,OACE,kBAAC,OAAD;EACE,GAAI;EACJ,KAAK;EACL,aAAU;EACV,WAAW,EACT,yGACA,CACF;CACD,CAAA;AAEL,CAAC,GAEY,KAAuB,EAGlC,SAA8B,EAAE,cAAW,GAAG,KAAS,GAAc;CACrE,OACE,kBAAC,OAAD;EACE,GAAI;EACJ,KAAK;EACL,aAAU;EACV,WAAW,EAAG,4CAA4C,CAAS;CACpE,CAAA;AAEL,CAAC,GAEY,KAA4B,EAGvC,SACA,EAAE,aAAU,cAAW,GAAG,KAC1B,GACA;CACA,IAAM,EAAE,iBAAc,GAAwB;CAE9C,OACE,kBAAC,OAAD;EACE,GAAI;EACJ,KAAK;EACL,eAAa;EACb,aAAU;EACV,WAAW,EACT,8HACA,IAAY,cAAc,eAC1B,CACF;EAEC;CACE,CAAA;AAET,CAAC,GAEY,KAA8B,EAGzC,SAAqC,EAAE,cAAW,GAAG,KAAS,GAAc;CAC5E,OACE,kBAAC,OAAD;EACE,GAAI;EACJ,KAAK;EACL,aAAU;EACV,WAAW,EAAG,kBAAkB,CAAS;CAC1C,CAAA;AAEL,CAAC,GAEY,KAAsB,EAGjC,SACA,EAAE,aAAU,cAAW,GAAG,KAC1B,GACA;CACA,OACE,kBAAC,IAAD;EACE,GAAI;EACJ,KAAK;EACL,IAAG;EACH,OAAO;EACP,eAAc;EACd,wBAAuB;EACvB,aAAU;EACV,WAAW,EACT,kDACA,CACF;EAEC;CACa,CAAA;AAEpB,CAAC,GAEY,KAA0B,EAGrC,SAAiC,EAAE,cAAW,GAAG,KAAS,GAAc;CACxE,OACE,kBAAC,EAAO,IAAR;EACE,GAAI;EACJ,KAAK;EACL,QAAO;EACP,YAAY;EACZ,aAAU;EACV,WAAW,EAAG,YAAY,CAAS;CACpC,CAAA;AAEL,CAAC,GAUY,KAAyB,EAGpC,SACA,EAAE,SAAM,aAAU,cAAW,GAAG,KAChC,GACA;CACA,IAAM,IAAU,GAAmB,GAC7B,IAAQ,GAAwB;CAEtC,OACE,kBAAC,GAAD;EAAiB,SAAS;EAAO,MAAK;YACnC,KAAQ,CAAC,EAAM,YACd,kBAAC,EAAO,IAAR;GACE,GAAI;GACJ,KAAK;GACL,KAAI;GACJ,UAAU,EAAQ,SAAS,KAAA,IAAY;GACvC,SAAS,GAAQ,UAAiB;GAClC,SAAS,EAAQ,SAAS,EAAE,SAAS,EAAE,IAAI;GAC3C,MAAM,EAAQ,SAAS,EAAE,SAAS,EAAE,IAAI;GACxC,YAAY,EAAQ,SAAS,EAAE,UAAU,IAAK,IAAI,KAAA;GAClD,aAAU;GACV,WAAW,EACT,gFACA,CACF;EAGS,GADR,CACQ,IACT;CACW,CAAA;AAErB,CAAC,GAEY,KAA6B,EAGxC,SAAoC,EAAE,cAAW,GAAG,KAAS,GAAc;CAC3E,OACE,kBAAC,EAAO,IAAR;EACE,GAAI;EACJ,KAAK;EACL,UAAU;EACV,aAAU;EACV,WAAW,EAAG,oBAAoB,CAAS;CAC5C,CAAA;AAEL,CAAC;AAeD,SAAgB,GAA6B,EAC3C,aACA,SACA,SACA,cAAW,IACX,cAAW,IACX,mBAAgB,IAChB,WACA,QACA,aACA,gBACoC;CACpC,IAAM,IAAU,GAAmB,GAC7B,IAAQ,GAAwB,GAEhC,KACJ,MACG;EACH,IAAI,GAAU;GACZ,EAAM,eAAe;GACrB;EACF;EAEA,AADA,IAAW,GACP,EAAQ,YAAY,KACtB,EAAQ,cAAc,IAAO,EAAM,IAAI;CAE3C,GAEM,IACJ,kBAAA,GAAA,EAAA,UAAA,CACE,kBAAC,QAAD;EACE,eAAY;EACZ,WAAU;YAET,KAAQ,kBAAC,QAAD,EAAM,WAAU,iCAAkC,CAAA;CACvD,CAAA,GACN,kBAAC,QAAD;EAAM,WAAU;EAA2B;CAAe,CAAA,CAC1D,EAAA,CAAA,GAGE,IAAuB,EAC3B,iGACA,mFACA,0EACA,KAAY,+BACZ,KAAY,iCACZ,CACF;CAEA,OAAO,IACL,kBAAC,EAAO,GAAR;EACQ;EACE;EACR,KAAK,MAAQ,MAAW,WAAW,wBAAwB,KAAA;EAC3D,gBAAc,IAAW,SAAS,KAAA;EAClC,iBAAe,KAAY,KAAA;EAC3B,UAAU,IAAW,KAAK,KAAA;EAC1B,SAAS;EACT,UAAU,EAAQ,UAAU,IAAW,KAAA,IAAY,EAAE,OAAO,IAAK;EACjE,YAAY;EACZ,WAAW;YAEV;CACO,CAAA,IAEV,kBAAC,EAAO,QAAR;EACE,MAAK;EACK;EACV,gBAAc,IAAW,SAAS,KAAA;EAClC,SAAS;EACT,UAAU,EAAQ,UAAU,IAAW,KAAA,IAAY,EAAE,OAAO,IAAK;EACjE,YAAY;EACZ,WAAW;YAEV;CACY,CAAA;AAEnB;AAiBA,SAAgB,GAA0B,EACxC,aACA,SACA,UACA,SACA,cAAW,IACX,iBACA,cAAW,IACX,kBACA,WACA,QACA,aACA,gBACiC;CACjC,IAAM,IAAU,GAAmB,GAC7B,IAAQ,GAAwB,GAChC,IAAY,OAAO,KAAa,WAAW,IAAW,KAAA,GAEtD,KACJ,MACG;EACH,IAAI,GAAU;GACZ,EAAM,eAAe;GACrB;EACF;EACA,IAAW;EACX,IAAM,IAAsB,KAAiB,MAAiB,KAAA;EAC9D,AAAI,EAAQ,YAAY,KACtB,EAAQ,cAAc,IAAO,EAAM,IAAI;CAE3C,GAEM,IACJ,kBAAA,GAAA,EAAA,UAAA;EACG,IACC,kBAAC,EAAO,MAAR;GACE,UAAU,EAAQ;GAClB,YAAY,EAAQ,SAAS,EAAE,UAAU,EAAE,IAAI;GAC/C,WAAU;EACX,CAAA,IACC;EACH,IACC,kBAAC,QAAD;GACE,eAAY;GACZ,WAAU;aAET;EACG,CAAA,IACJ;EACJ,kBAAC,EAAO,MAAR;GACE,SAAS;GACT,SAAS;IACP,SAAS,IAAM;IACf,GAAG,EAAM,YAAY,KAAK;GAC5B;GACA,YACE,EAAQ,SACJ,KACA,EAAM,YACJ,KACA;GAER,eAAa,EAAM;GACnB,WAAW,EACT,yCACA,EAAM,aAAa,qBACrB;GAEC;EACU,CAAA;EACZ,KAAS,CAAC,EAAM,YACf,kBAAC,QAAD;GAAM,WAAU;aACb;EACG,CAAA,IACJ;EACH,MAAiB,KAAA,IAcd,OAbF,kBAAC,EAAO,MAAR;GACE,eAAY;GACZ,SAAS;GACT,SAAS;IACP,SAAS,IAAM;IACf,QAAQ,IAAe,KAAK;IAC5B,GAAG,EAAM,YAAY,IAAI;GAC3B;GACA,YAAY,EAAQ,SAAS,EAAE,UAAU,EAAE,IAAI;GAC/C,WAAU;aAEV,kBAAC,GAAD,EAAc,WAAU,WAAY,CAAA;EACzB,CAAA;CAEf,EAAA,CAAA,GAGE,IAAuB,EAC3B,wIACA,iEACA,0EACA,KAAY,mBACZ,KAAY,iCACZ,CACF;CAEA,OAAO,IACL,kBAAC,EAAO,GAAR;EACQ;EACE;EACR,KAAK,MAAQ,MAAW,WAAW,wBAAwB,KAAA;EAC3D,gBAAc,IAAW,SAAS,KAAA;EAClC,iBAAe;EACf,iBAAe,KAAY,KAAA;EAC3B,cAAY,EAAM,YAAY,IAAY,KAAA;EAC1C,OAAO,EAAM,YAAY,IAAY,KAAA;EACrC,UAAU,IAAW,KAAK,KAAA;EAC1B,SAAS;EACT,UAAU,EAAQ,UAAU,IAAW,KAAA,IAAY,EAAE,OAAO,IAAK;EACjE,YAAY;EACZ,WAAW;YAEV;CACO,CAAA,IAEV,kBAAC,EAAO,QAAR;EACE,MAAK;EACK;EACV,gBAAc,IAAW,SAAS,KAAA;EAClC,iBAAe;EACf,cAAY,EAAM,YAAY,IAAY,KAAA;EAC1C,OAAO,EAAM,YAAY,IAAY,KAAA;EACrC,SAAS;EACT,UAAU,EAAQ,UAAU,IAAW,KAAA,IAAY,EAAE,OAAO,IAAK;EACjE,YAAY;EACZ,WAAW;YAEV;CACY,CAAA;AAEnB;;;AC1qCA,SAAgB,GAAS,GAAY,GAA4B;CAC7D,OAAO,MAAa,KAAA,KAAa,MAAO;AAC5C;;;ACYA,SAAgB,GAAc,EAAE,SAAM,aAAU,iBAAyB;CACvE,IAAM,IAAW,EAAK,SAAS,CAAC,GAC1B,IAAc,EAAS,SAAS,GAChC,IAAc,EAAS,MAAM,MAAU,GAAS,EAAM,IAAI,CAAQ,CAAC,GAEnE,CAAC,GAAS,KAAc,EAAM,SAAyB,IAAI,GAC3D,CAAC,GAAgB,KAAqB,EAAM,SAAS,CAAW;CAKtE,AAAI,MAAgB,MAClB,EAAkB,CAAW,GACzB,KAAa,EAAW,IAAI;CAGlC,IAAM,IAAO,KAAW,EAAK,eAAe;CAE5C,SAAS,EAAO,GAA6C;EAE3D,AADA,EAAM,WAAW,GACjB,IAAa,CAAK;CACpB;CAEA,OACE,kBAAC,IAAD,EAAA,UAAA,CACE,kBAAC,IAAD;EACE,cAAc,IAAc,IAAO,KAAA;EACnC,OAAO,EAAK;EACZ,UAAU,EAAK;EACf,MAAM,IAAc,KAAA,IAAY,EAAK;EACrC,MAAM,EAAK;EACX,UAAU,GAAS,EAAK,IAAI,CAAQ;EACpC,gBAAgB;GACd,IAAI,GAAa;IACf,EAAW,CAAC,CAAI;IAChB;GACF;GACA,EAAO,CAAI;EACb;EACA,QAAQ,EAAK;YAEZ,EAAK;CACmB,CAAA,GAC1B,IACC,kBAAC,IAAD;EAA8B;YAC3B,EAAS,KAAK,MACb,kBAAC,IAAD,EAAA,UACE,kBAAC,IAAD;GACE,UAAU,EAAM;GAChB,MAAM,EAAM;GACZ,MAAM,EAAM;GACZ,UAAU,GAAS,EAAM,IAAI,CAAQ;GACrC,gBAAgB,EAAO,CAAK;GAC5B,QAAQ,EAAM;aAEb,EAAM;EACqB,CAAA,EACJ,GAXK,EAAM,EAWX,CAC7B;CACqB,CAAA,IACtB,IACmB,EAAA,CAAA;AAE7B;;;ACvCA,SAAgB,GAAa,EAC3B,aACA,aACA,eACA,WACA,WACA,iBAAc,IACd,UAAO,QACP,aAAU,WACV,iBAAc,QACd,SACA,gBACA,iBACA,eACA,sBACA,uBACA,UACA,cACA,gBACA,eAAY,QACZ,gBACyC;CACzC,OACE,kBAAC,IAAD;EAKE,WAAU;EACV,aAAa,GAAG,IAAO,KAAe,GAAK;EAC3C,mBACE,MAAsB,KAAA,IAAY,KAAA,IAAY,GAAG,IAAO,EAAkB;EAE5E,eAAe,GAAU,MAAgB;GACvC,AAAI,MAAgB,KAAM,IAAe,CAAQ;EACnD;EACA,qBAAqB,GAAU,MAAgB;GAC7C,AAAI,MAAgB,KAAM,IAAqB,CAAQ;EACzD;EACA,MAAM,MAAS,KAAA,IAAY,KAAA,IAAY,GAAG,IAAO,EAAK;EACtD,YAAY,MAAe,KAAA,IAAY,KAAA,IAAY,GAAG,IAAO,EAAW;EACxE,OAAO;GACL,GAAI,IAAQ,EAAE,mBAAmB,EAAM,IAAI;GAC3C,GAAI,IAAY,EAAE,wBAAwB,EAAU,IAAI;GACxD,GAAI,IAAc,EAAE,0BAA0B,EAAY,IAAI;EAChE;YAEA,kBAAC,IAAD;GACa;GAIX,WAAW,EAAG,UAAU,CAAS;GACpB;GACb,gBAAe;GAIf,MAAK;GACC;GACG;aAbX;IAeG,KACE,KACC,kBAAC,IAAD,EAAA,UACE,kBAAC,OAAD;KAAK,WAAU;eAAf,CACG,KAAU,kBAAC,OAAD;MAAK,WAAU;gBAAkB;KAAY,CAAA,GACvD,KACC,kBAAC,IAAD;MAAwB,WAAU;gBAChC,kBAAC,GAAD,EAAe,WAAU,WAAY,CAAA;KACf,CAAA,CAEvB;OACgB,CAAA;IAE3B,kBAAC,IAAD,EAAA,UACG,EAAS,KAAK,MACb,kBAAC,IAAD,EAAA,UAAA,CACG,EAAQ,SACP,kBAAC,IAAD,EAAA,UACG,EAAQ,MACgB,CAAA,GAE7B,kBAAC,IAAD,EAAA,UACE,kBAAC,IAAD,EAAA,UACG,EAAQ,MAAM,KAAK,MAClB,kBAAC,IAAD;KACY;KACJ;KAEM;IACb,GAFM,EAAK,EAEX,CACF,EACkB,CAAA,EACM,CAAA,CACT,EAAA,GAlBK,EAAQ,EAkBb,CACvB,EACqB,CAAA;IACvB,KAAU,kBAAC,IAAD,EAAA,UAAwB,EAA8B,CAAA;GAClD;;CACM,CAAA;AAE7B;;;AC1IA,IAAa,KAAa;CACxB,UAAU;CACV,MAAM;AACR;AAEA,SAAgB,GAAW,GAAuB;CAChD,OAAO,EAAK,SAAS,YAAY,EAAK,SAAS;AACjD;AAEA,SAAgB,GACd,GACA,GACA,IAAQ,GACR,IAA0B,MACV;CAChB,OAAO,EAAM,SAAS,MAAS;EAC7B,IAAM,IAAM;GAAE;GAAM;GAAO;EAAS;EAEpC,OADI,CAAC,EAAK,UAAU,UAAU,CAAC,EAAS,IAAI,EAAK,EAAE,IAAU,CAAC,CAAG,IAC1D,CACL,GACA,GAAG,GAAiB,EAAK,UAAU,GAAU,IAAQ,GAAG,EAAK,EAAE,CACjE;CACF,CAAC;AACH;AAEA,SAAgB,GACd,GACA,GAC6B;CAC7B,KAAK,IAAM,KAAQ,GAAO;EACxB,IAAI,EAAK,OAAO,GAAI,OAAO;EAC3B,IAAM,IAAQ,EAAK,WAAW,GAAa,EAAK,UAAU,CAAE,IAAI,KAAA;EAChE,IAAI,GAAO,OAAO;CACpB;AACF;AAGA,SAAgB,GAAiB,GAAuB,GAAqB;CAC3E,OACE,EAAK,OAAO,KACZ,EAAK,UAAU,MAAM,MAAU,GAAiB,GAAO,CAAE,CAAC,MAAM;AAEpE;AAEA,SAAgB,GACd,GACA,GACyD;CACzD,IAAI,GACE,IAA0B,CAAC;CAEjC,KAAK,IAAM,KAAQ,GAAO;EACxB,IAAI,EAAK,OAAO,GAAI;GAClB,IAAU;GACV;EACF;EAEA,IAAI,EAAK,UAAU,QAAQ;GACzB,IAAM,IAAc,GAAe,EAAK,UAAU,CAAE;GACpD,IAAI,EAAY,SAAS;IAEvB,AADA,IAAU,EAAY,SACtB,EAAK,KAAK;KAAE,GAAG;KAAM,UAAU,EAAY;IAAM,CAAC;IAClD;GACF;EACF;EAEA,EAAK,KAAK,CAAI;CAChB;CAEA,OAAO;EAAE,OAAO;EAAM;CAAQ;AAChC;AAEA,SAAgB,GACd,GACA,GACA,GACA,GACmB;CACnB,IAAI,MAAa,MAAM,OAAO,CAAC,GAAG,GAAO,CAAQ;CAEjD,IAAM,IAA0B,CAAC;CACjC,KAAK,IAAM,KAAQ,GAAO;EACxB,IAAI,EAAK,OAAO,GAAU;GACxB,AAAI,MAAa,WAAU,EAAK,KAAK,GAAU,CAAI,IAC1C,MAAa,UAAS,EAAK,KAAK,GAAM,CAAQ,IAClD,EAAK,KAAK;IAAE,GAAG;IAAM,UAAU,CAAC,GAAI,EAAK,YAAY,CAAC,GAAI,CAAQ;GAAE,CAAC;GAC1E;EACF;EAEA,AAAI,EAAK,UAAU,SACjB,EAAK,KAAK;GACR,GAAG;GACH,UAAU,GAAe,EAAK,UAAU,GAAU,GAAU,CAAQ;EACtE,CAAC,IAED,EAAK,KAAK,CAAI;CAElB;CACA,OAAO;AACT;AAEA,SAAgB,GACd,GACA,GAC0B;CAC1B,IAAM,IAAS,GAAa,GAAO,EAAK,MAAM;CAE9C,IADI,CAAC,KAAU,EAAO,YAClB,EAAK,YAAY,GAAiB,GAAQ,EAAK,QAAQ,GAAG,OAAO;CAErE,IAAM,IAAS,EAAK,WAAW,GAAa,GAAO,EAAK,QAAQ,IAAI,KAAA;CACpE,IACE,EAAK,aAAa,aACjB,CAAC,KAAU,EAAO,YAAY,CAAC,GAAW,CAAM,IAEjD,OAAO;CAET,IAAM,IAAU,GAAe,GAAO,EAAK,MAAM;CAEjD,OADK,EAAQ,UACN,GACL,EAAQ,OACR,EAAQ,SACR,EAAK,UACL,EAAK,QACP,IAN6B;AAO/B;AAEA,SAAgB,GACd,GACA,GACA,GACmB;CACnB,OAAO,EAAM,KAAK,OAAU;EAC1B,GAAG;EACH,OAAO,EAAK,OAAO,IAAK,IAAQ,EAAK;EACrC,UAAU,EAAK,WACX,GAAe,EAAK,UAAU,GAAI,CAAK,IACvC,KAAA;CACN,EAAE;AACJ;;;ACnGA,SAAgB,GAAa,EAC3B,UACA,kBAAe,CAAC,GAChB,kBACA,WACA,gBACA,aACA,aACA,qBAAkB,MAClB,mBACA,wBAAqB,CAAC,KACA;CACtB,IAAM,CAAC,GAAe,KAAoB,EAAS,KAAS,CAAY,GAClE,CAAC,GAAkB,KAAuB,EAAS,CAAe,GAClE,CAAC,GAAa,KAAkB,QAC9B,IAAI,IAAI,CAAkB,CAClC,GACM,CAAC,GAAW,KAAgB,EAChC,KAAY,CACd,GACM,CAAC,GAAY,KAAiB,EAAwB,IAAI,GAC1D,CAAC,GAAY,KAAiB,EAA4B,IAAI,GAC9D,CAAC,GAAY,KAAiB,EAAwB,IAAI,GAC1D,CAAC,GAAY,KAAiB,EAAwB,IAAI,GAC1D,CAAC,GAAW,KAAgB,EAAwB,IAAI,GACxD,IAAgB,GAAM,GACtB,CAAC,GAAc,KAAmB,EAAS,EAAE,GAC7C,KAAU,kBAAO,IAAI,IAA4B,CAAC,GAClD,IAAiB,EAAO,EAAK,GAC7B,IAAgB,GAChB,IAAa,KAAY,GAEzB,CAAC,IAAW,MAAgB,EAAS,CAAK;CAChD,AAAI,MAAU,OACZ,GAAa,CAAK,GACd,KAAO,EAAiB,CAAK;CAGnC,IAAM,IAAO,SACL,GAAiB,GAAe,CAAW,GACjD,CAAC,GAAa,CAAa,CAC7B;CAIA,IAAI,EADF,MAAc,QAAQ,EAAK,MAAM,MAAQ,EAAI,KAAK,OAAO,CAAS,IACpC;EAC9B,IAAM,IAAqB,EAAK,EAAE,EAAE,KAAK,MAAM;EAC/C,AAAI,MAAc,KAAoB,EAAa,CAAkB;CACvE;CAEA,QAAgB;EACd,IAAI,CAAC,GAAY;EACjB,IAAM,IAAQ,4BAA4B;GAIxC,MAHoB,KAClB,SAAS,iBAA8B,8BAA8B,CAEvE,CAAA,CACG,MAAM,MAAS,EAAK,QAAQ,wBAAwB,CAAU,CAAC,EAC9D,cAA2B,iBAAiB,CAAC,EAC7C,MAAM;EACZ,CAAC;EACD,aAAa,qBAAqB,CAAK;CACzC,GAAG,CAAC,CAAU,CAAC;CAEf,IAAM,IAAc,GACjB,MAA4B;EAE3B,AADA,EAAiB,CAAI,GACrB,IAAgB,CAAI;CACtB,GACA,CAAC,CAAa,CAChB,GAEM,IAAc,EAClB,OAAO,MAA8B;EACnC,IAAI,EAAe,SAAS;GAC1B,EAAgB,sCAAsC;GACtD;EACF;EACA,IAAM,IAAS,GACT,IAAO,GAAa,GAAQ,CAAI;EACtC,IAAI,CAAC,KAAQ,MAAS,GAAQ;EAK9B,AAHA,EAAe,UAAU,IACzB,EAAY,CAAI,GAChB,EAAc,IAAI,GAClB,EAAc,IAAI;EAClB,IAAM,IAAQ,GAAa,GAAQ,EAAK,MAAM,GACxC,IAAS,EAAK,WAAW,GAAa,GAAQ,EAAK,QAAQ,IAAI;EACrE,EACE,IACI,SAAS,GAAO,SAAS,OAAO,GAAG,EAAK,SAAS,GAAG,EAAO,MAAM,KACjE,SAAS,GAAO,SAAS,OAAO,mBACtC;EAEA,IAAI;GACF,MAAM,IAAS,CAAI;EACrB,SAAS,GAAO;GAGd,AAFA,EAAY,CAAM,GAClB,EAAgB,gBAAgB,GAAO,SAAS,OAAO,eAAe,GACtE,IAAc,GAAO,CAAI;EAC3B,UAAU;GACR,EAAe,UAAU;EAC3B;CACF,GACA;EAAC;EAAQ;EAAa;EAAe;CAAW,CAClD,GAEM,IAAW,GAAa,MAAe;EAE3C,AADA,EAAa,CAAE,GACf,4BAA4B,GAAQ,QAAQ,IAAI,CAAE,CAAC,EAAE,MAAM,CAAC;CAC9D,GAAG,CAAC,CAAC,GAEC,IAAS,GACZ,MAAe;EAEd,AADI,MAAa,KAAA,KAAW,EAAoB,CAAE,GAClD,IAAiB,CAAE;CACrB,GACA,CAAC,GAAU,CAAc,CAC3B,GAEM,KAAS,GAAa,MAAe;EACzC,GAAgB,MAAY;GAC1B,IAAM,IAAO,IAAI,IAAI,CAAO;GAG5B,OAFI,EAAK,IAAI,CAAE,IAAG,EAAK,OAAO,CAAE,IAC3B,EAAK,IAAI,CAAE,GACT;EACT,CAAC;CACH,GAAG,CAAC,CAAC,GAEC,KAAgB,GACnB,GAAsC,MAAsB;EAC3D,IAAM,IAAQ,EAAK,WAAW,EAAE,cAAW,EAAK,OAAO,EAAI,KAAK,EAAE,GAC5D,IAAW,EAAK,IAAQ,IACxB,IAAO,EAAK,IAAQ,IACpB,IAAe,EAAM,UAAU,EAAM;EAE3C,IAAI,EAAM,QAAQ,eAAe,CAAC,KAAgB,GAAM;GAEtD,AADA,EAAM,eAAe,GACrB,EAAS,EAAK,KAAK,EAAE;GACrB;EACF;EACA,IAAI,EAAM,QAAQ,aAAa,CAAC,KAAgB,GAAU;GAExD,AADA,EAAM,eAAe,GACrB,EAAS,EAAS,KAAK,EAAE;GACzB;EACF;EACA,IAAI,EAAM,QAAQ,UAAU,EAAK,IAAI;GAEnC,AADA,EAAM,eAAe,GACrB,EAAS,EAAK,EAAE,CAAC,KAAK,EAAE;GACxB;EACF;EACA,IAAI,EAAM,QAAQ,SAAS,EAAK,GAAG,EAAE,GAAG;GAEtC,AADA,EAAM,eAAe,GACrB,EAAS,EAAK,GAAG,EAAE,CAAC,EAAE,KAAK,MAAM,EAAI,KAAK,EAAE;GAC5C;EACF;EAEA,IAAI,EAAI,KAAK,UAAU;GACrB,AAAI,EAAM,QAAQ,eAAe,EAAI,YACnC,EAAM,eAAe,GACrB,EAAS,EAAI,QAAQ,MAErB,KACA;IAAC;IAAc;IAAS;IAAK;IAAM;GAAa,CAAC,CAAC,SAChD,EAAM,GACR,KACC,EAAM,YAAY,EAAM,QAAQ,UAEjC,EAAM,eAAe;GAEvB;EACF;EAEA,IAAI,KAAgB,EAAM,QAAQ,aAAa,GAAU;GAEvD,AADA,EAAM,eAAe,GACrB,EAAiB;IAAE,QAAQ,EAAI,KAAK;IAAI,UAAU,EAAS,KAAK;IAAI,UAAU;GAAS,CAAC;GACxF;EACF;EACA,IAAI,KAAgB,EAAM,QAAQ,eAAe,GAAM;GAErD,AADA,EAAM,eAAe,GACrB,EAAiB;IAAE,QAAQ,EAAI,KAAK;IAAI,UAAU,EAAK,KAAK;IAAI,UAAU;GAAQ,CAAC;GACnF;EACF;EACA,IAAI,KAAgB,EAAM,QAAQ,gBAAgB,KAAY,GAAW,EAAS,IAAI,GAAG;GAGvF,AAFA,EAAM,eAAe,GACrB,GAAgB,MAAY,IAAI,IAAI,CAAO,CAAC,CAAC,IAAI,EAAS,KAAK,EAAE,CAAC,GAClE,EAAiB;IAAE,QAAQ,EAAI,KAAK;IAAI,UAAU,EAAS,KAAK;IAAI,UAAU;GAAS,CAAC;GACxF;EACF;EACA,IAAI,KAAgB,EAAM,QAAQ,eAAe,EAAI,UAAU;GAE7D,AADA,EAAM,eAAe,GACrB,EAAiB;IAAE,QAAQ,EAAI,KAAK;IAAI,UAAU,EAAI;IAAU,UAAU;GAAQ,CAAC;GACnF;EACF;EAEA,AAAI,EAAM,QAAQ,gBAAgB,GAAW,EAAI,IAAI,KACnD,EAAM,eAAe,GAChB,EAAY,IAAI,EAAI,KAAK,EAAE,IACvB,GAAM,aAAa,EAAI,KAAK,MAAI,EAAS,EAAK,KAAK,EAAE,IAD3B,GAAO,EAAI,KAAK,EAAE,KAE5C,EAAM,QAAQ,eACvB,EAAM,eAAe,GACjB,EAAY,IAAI,EAAI,KAAK,EAAE,IAAG,GAAO,EAAI,KAAK,EAAE,IAC3C,EAAI,YAAU,EAAS,EAAI,QAAQ,KACnC,EAAM,QAAQ,WAAW,EAAM,QAAQ,OAChD,EAAM,eAAe,GACjB,GAAW,EAAI,IAAI,IAAG,GAAO,EAAI,KAAK,EAAE,IACvC,EAAO,EAAI,KAAK,EAAE,KACd,EAAM,QAAQ,QACvB,EAAM,eAAe,GACrB,EAAc,EAAI,KAAK,EAAE,MAChB,EAAM,QAAQ,iBAAkB,EAAM,YAAY,EAAM,QAAQ,WACzE,EAAM,eAAe,GACrB,EAAc,EAAI,KAAK,EAAE;CAE7B,GACA;EAAC;EAAa;EAAM;EAAU;EAAa;EAAQ;CAAM,CAC3D,GAEM,KAAqB,GACxB,MAAqC;EAChC,CAAC,KAAc,EAAM,WAAW,EAAM,kBAC1C,EAAM,eAAe,GACrB,EAAc;GAAE,IAAI;GAAM,UAAU;EAAQ,CAAC;CAC/C,GACA,CAAC,CAAU,CACb,GAEM,KAAa,GAChB,MAAqC;EAGpC,AAFA,EAAM,eAAe,GACrB,EAAM,gBAAgB,GAClB,KAAc,KAChB,EAAiB;GACf,QAAQ;GACR,UAAU,EAAW;GACrB,UAAU,EAAW;EACvB,CAAC;CAEL,GACA;EAAC;EAAY;EAAY;CAAW,CACtC,GAEM,KAAqB,GACxB,GAAkC,MAAe;EAGhD,AAFA,EAAc,CAAE,GAChB,EAAM,aAAa,gBAAgB,QACnC,EAAM,aAAa,QAAQ,cAAc,CAAE;CAC7C,GACA,CAAC,CACH,GAEM,KAAmB,QAAkB;EAEzC,AADA,EAAc,IAAI,GAClB,EAAc,IAAI;CACpB,GAAG,CAAC,CAAC,GAEC,KAAoB,GACvB,GAAkC,MAA4B;EAC7D,IAAI,CAAC,KAAc,MAAe,EAAU,KAAK,IAAI;EACrD,IAAM,IAAS,GAAa,GAAe,CAAU;EACrD,IAAI,KAAU,GAAiB,GAAQ,EAAU,KAAK,EAAE,GAAG;EAE3D,AADA,EAAM,eAAe,GACrB,EAAM,gBAAgB;EACtB,IAAM,IAAO,EAAM,cAAc,sBAAsB,GACjD,KAAS,EAAM,UAAU,EAAK,OAAO,EAAK,QAC1C,IACJ,CAAC,EAAU,KAAK,YAChB,GAAW,EAAU,IAAI,KACzB,KAAS,OACT,KAAS,MACL,WACA,IAAQ,KACN,WACA;EACR,EAAc;GAAE,IAAI,EAAU,KAAK;GAAI;EAAS,CAAC;CACnD,GACA,CAAC,GAAY,CAAa,CAC5B,GAEM,KAAe,GAClB,GAAmB,MAAkB;EACpC,IAAM,IAAU,EAAM,KAAK;EAE3B,IADA,EAAc,IAAI,GACd,CAAC,KAAW,MAAY,EAAI,KAAK,OAAO;EAC5C,IAAM,IAAS;EAEf,AADA,EAAY,GAAe,GAAQ,EAAI,KAAK,IAAI,CAAO,CAAC,GACxD,QAAa,QAAQ,IAAW,EAAI,MAAM,CAAO,CAAC,CAAC,CAAC,YAAY;GAE9D,AADA,EAAY,CAAM,GAClB,EAAgB,kBAAkB,EAAI,KAAK,MAAM,eAAe;EAClE,CAAC;CACH,GACA;EAAC;EAAU;EAAe;CAAW,CACvC,GAEM,KAAuB,GAC1B,GAAmB,MAAkB;EAEpC,AADA,EAAc,IAAO,EAAI,KAAK,KAAK,IAAI,GAClC,KAAM,EAAS,EAAI,KAAK,EAAE;CACjC,GACA,CAAC,CAAQ,CACX;CAeA,OAAO;EACL;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,gBAvBqB,GAAa,GAAY,MAAqB;GACnE,GAAc,MACZ,IAAU,IAAK,MAAY,IAAK,OAAO,CACzC;EACF,GAAG,CAAC,CAmBF;EACA,YAlBiB,QAAkB,EAAa,IAAI,GAAG,CAAC,CAkBxD;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,WA/BgB,GAAa,GAAY,MAAgC;GACzE,AAAI,IAAM,GAAQ,QAAQ,IAAI,GAAI,CAAI,IACjC,GAAQ,QAAQ,OAAO,CAAE;EAChC,GAAG,CAAC,CA4BF;CACF;AACF;;;AC9XA,SAAgB,GAAY,GAAuB,GAAmB;CASpE,OAAO,kBAPL,EAAK,SAAS,YAAY,EAAK,SAAS,YACpC,IACE,IACA,IACF,EAAK,SAAS,aACZ,IACA,GACD,EAAM,WAAU,SAAU,CAAA;AACnC;;;ACTA,SAAgB,GAAa,EAC3B,WACA,eAIC;CACD,IAAM,IAAS,GAAiB,KAAK,IAC/B,IAAc,EAAwB,IAAI,GAC1C,IAAW,EAAwB,IAAI,GACvC,CAAC,GAAU,KAAe,EAAS,CAAC;CAE1C,QAAgB;EACd,IAAM,UAAgB;GACpB,IAAM,IAAW,EAAY,SACvB,IAAQ,EAAS;GACnB,CAAC,KAAY,CAAC,KAClB,EACE,EAAM,cAAc,EAAS,cAAc,EAAM,cAAc,KAAK,CACtE;EACF;EACA,EAAQ;EACR,IAAM,IAAW,IAAI,eAAe,CAAO;EAG3C,OAFI,EAAY,WAAS,EAAS,QAAQ,EAAY,OAAO,GACzD,EAAS,WAAS,EAAS,QAAQ,EAAS,OAAO,SAC1C,EAAS,WAAW;CACnC,GAAG,CAAC,CAAC;CAEL,IAAM,IAAU,KAAU,IAAW,KAAK,CAAC;CAE3C,OACE,kBAAC,QAAD;EACE,KAAK;EACL,WAAU;YAEV,kBAAC,EAAO,MAAR;GACE,WAAU;GACV,SAAS,EAAE,GAAG,IAAU,CAAC,GAAG,CAAC,CAAQ,IAAI,EAAE;GAC3C,YACE,IACI;IACE,UAAU,KAAK,IAAI,KAAK,IAAW,EAAE;IACrC,MAAM;IACN,QAAQ;IACR,aAAa;GACf,IACA;aAXR,CAcE,kBAAC,QAAD;IAAM,KAAK;IAAW;GAAe,CAAA,GACpC,IAAU,kBAAC,QAAD;IAAM,eAAY;IAAQ;GAAe,CAAA,IAAI,IAC7C;;CACT,CAAA;AAEV;;;ACpCA,SAAS,GAAW,GAAwB,GAAiB;CAC3D,OACE,GAAG,QAAQ,SAAS,EAAE,QAAQ,QAC9B,EAAE,QAAQ,QAAQ,EAAE,QAAQ,OAC5B,EAAE,QAAQ,UAAU,EAAE,QAAQ,SAC9B,EAAE,QAAQ,WAAW,EAAE,QAAQ,UAC/B,EAAE,QAAQ,UAAU,EAAE,QAAQ,SAC9B,EAAE,QAAQ,WAAW,EAAE,QAAQ;AAEnC;AAGA,SAAgB,GAId,GACA,GACA,GACA;CACA,IAAM,CAAC,GAAQ,KAAa,EAA8B,IAAI,GAExD,IAAS,QAAkB;EAC/B,IAAM,IAAU,EAAW,SACrB,IAAU,EAAW;EAC3B,IAAI,CAAC,KAAW,CAAC,GAAS;EAE1B,IAAM,IAAO,EAAQ,sBAAsB,GACrC,IAAqB;GACzB,SAAS;IACP,MAAM,EAAK;IACX,KAAK,EAAK;IACV,OAAO,EAAK;IACZ,QAAQ,EAAK;GACf;GACA,SAAS;IACP,OAAO,EAAQ;IACf,QAAQ,EAAQ;GAClB;EACF;EACA,GAAW,MAAa,GAAW,GAAS,CAAI,IAAI,IAAU,CAAK;CACrE,GAAG,CAAC,GAAY,CAAU,CAAC;CAqB3B,OAnBA,SAAsB;EAEpB,IADA,EAAO,GACH,CAAC,GAAQ;EAEb,IAAM,IAAU,EAAW,SACrB,IAAU,EAAW,SACrB,IAAW,IAAI,eAAe,CAAM;EAM1C,OALI,KAAS,EAAS,QAAQ,CAAO,GACjC,KAAS,EAAS,QAAQ,CAAO,GAErC,OAAO,iBAAiB,UAAU,GAAQ,EAAI,GAC9C,OAAO,iBAAiB,UAAU,CAAM,SAC3B;GAGX,AAFA,EAAS,WAAW,GACpB,OAAO,oBAAoB,UAAU,GAAQ,EAAI,GACjD,OAAO,oBAAoB,UAAU,CAAM;EAC7C;CACF,GAAG;EAAC;EAAQ;EAAY;EAAY;CAAM,CAAC,GAEpC;AACT;;;AChDA,IAAM,KAAe,EAAwC,IAAI;AAEjE,SAAS,GAAgB,GAAmB;CAC1C,IAAM,IAAM,EAAW,EAAY;CACnC,IAAI,CAAC,GAAK,MAAU,MAAM,GAAG,EAAU,oCAAoC;CAC3E,OAAO;AACT;AAiBA,SAAgB,GAAa,EAC3B,aACA,MAAM,GACN,iBAAc,IACd,iBACA,gBACoB;CACpB,IAAM,IAAS,GAAM,GACf,IAAU,EAAuB,IAAI,GACrC,IAAa,EAA2B,IAAI,GAC5C,IAAa,EAA8B,IAAI,GAC/C,CAAC,GAAc,KAAmB,EAAS,CAAW,GACtD,IAAa,MAAmB,KAAA,GAChC,IAAO,IAAa,IAAiB,GAErC,IAAU,GACb,MAAkB;EAEjB,AADK,KAAY,EAAgB,CAAI,GACrC,IAAe,CAAI;CACrB,GACA,CAAC,GAAY,CAAY,CAC3B,GACM,IAAS,QAAkB,EAAQ,CAAC,CAAI,GAAG,CAAC,GAAS,CAAI,CAAC;CAEhE,QAAgB;EACd,IAAI,CAAC,GAAM;EACX,IAAM,KAAS,MAAqB,EAAE,QAAQ,YAAY,EAAQ,EAAK,GACjE,KAAa,MAAoB;GACrC,IAAM,IAAS,EAAE;GACjB,AACE,EAAQ,WACR,CAAC,EAAQ,QAAQ,SAAS,CAAM,KAChC,CAAC,EAAW,SAAS,SAAS,CAAM,KAEpC,EAAQ,EAAK;EACjB;EAGA,OAFA,OAAO,iBAAiB,WAAW,CAAK,GACxC,OAAO,iBAAiB,eAAe,CAAS,SACnC;GAEX,AADA,OAAO,oBAAoB,WAAW,CAAK,GAC3C,OAAO,oBAAoB,eAAe,CAAS;EACrD;CACF,GAAG,CAAC,GAAM,CAAO,CAAC;CAElB,IAAM,IAAM,UACH;EACL;EACA;EACA;EACA,WAAW,GAAG,EAAO;EACrB,WAAW,GAAG,EAAO;EACrB;EACA,gBAAgB,MAAS;GACvB,EAAW,UAAU;EACvB;EACA;CACF,IACA;EAAC;EAAM;EAAS;EAAQ;CAAM,CAChC;CAEA,OACE,kBAAC,GAAa,UAAd;EAAuB,OAAO;YAC5B,kBAAC,OAAD;GAAK,KAAK;GAAS,WAAW,EAAG,wBAAwB,CAAS;GAC/D;EACE,CAAA;CACgB,CAAA;AAE3B;AAMA,SAAS,GAAa,GAAG,GAAiC;CACxD,QAAQ,MAAmB;EACzB,KAAK,IAAM,KAAO,GAChB,AAAI,OAAO,KAAQ,aAAY,EAAI,CAAI,IAC9B,KAAO,OAAO,KAAQ,aAC7B,EAA0C,UAAU;CAE1D;AACF;AAGA,SAAgB,GAAoB,EAAE,eAAsC;CAC1E,IAAM,IAAM,GAAgB,qBAAqB;CACjD,IAAI,CAAC,EAAe,CAAQ,GAAG,OAAO;CAEtC,IAAM,IAAQ,GACR,IAAe,EAAM,MAAM,SAG3B,IAAY,EAAM,MAAqC;CAE7D,OAAO,GAAa,GAAO;EACzB,IAAI,EAAI;EACR,KAAK,GAAU,IAAW,MAA6B;GACrD,EAAI,WAAW,UAAU;EAC3B,CAAC;EACD,UAAU,MAAe;GAEvB,AADA,IAAe,CAAC,GAChB,EAAI,OAAO;EACb;EACA,iBAAiB;EACjB,iBAAiB,EAAI;EACrB,iBAAiB,EAAI,OAAO,EAAI,YAAY,KAAA;CAC9C,CAAC;AACH;AAEA,IAAM,MAAa,GAAY,MAC7B,GAAG,MAAS,WAAW,QAAQ,SAAS,GAAG,MAAU,QAAQ,UAAU;AAIzE,SAAS,GAAW,GAAY,GAAc,GAAgB;CAK5D,OAAO,SAJK,MAAS,WAAW,OAAO,MAInB,GAFN,MAAU,QAAQ,OAAO,MAEV,GAHd,MAAS,WAAW,QAAQ,KAGJ,GAD1B,MAAU,QAAQ,QAAQ,KACQ,SAAS,EAAO;AACjE;AACA,IAAM,MAAa,MAAmB,2BAA2B,EAAO,MAIlE,KAAwB;CAAE,UAAU;CAAM,MAAM;AAAS;AAa/D,SAAgB,GAAoB,EAClC,aACA,UAAO,UACP,WAAQ,OACR,gBAAa,GACb,YAAS,IACT,gBAC2B;CAC3B,IAAM,IAAM,GAAgB,qBAAqB,GAC3C,EAAE,cAAW,kBAAe,iBAAc,GAC1C,IAAS,GAAiB,KAAK,IAC/B,CAAC,GAAa,KAAkB,EAAS,EAAK,GAC9C,IAAS,GACb,EAAI,YACJ,EAAI,YACJ,KAAe,EAAI,IACrB;CAEA,QAAgB,EAAe,EAAI,GAAG,CAAC,CAAC;CACxC,IAAM,IAAO,IACT,MAAU,QACR,EAAO,QAAQ,OAAO,EAAO,QAAQ,QAAQ,EAAO,QAAQ,QAC5D,EAAO,QAAQ,OACjB,GACE,IAAM,IACR,MAAS,WACP,EAAO,QAAQ,MAAM,EAAO,QAAQ,SAAS,IAC7C,EAAO,QAAQ,MAAM,EAAO,QAAQ,SAAS,IAC/C,GAIE,IAAO,IACT,KAAA,IACA;EACE,QAAQ;GAAE,SAAS;GAAG,OAAO;GAAM,YAAY;EAAa;EAC5D,MAAM;GAAE,SAAS;GAAG,OAAO;GAAG,YAAY;EAAa;CACzD,GACE,IAAO,IACT,KAAA,IACA;EACE,QAAQ;GACN,UAAU,GAAW,GAAM,GAAO,CAAM;GACxC,YAAY;EACd;EACA,MAAM;GACJ,UAAU,GAAU,CAAM;GAC1B,YAAY;EACd;CACF;CAKJ,OAFK,IAEE,GACL,kBAAC,GAAD,EAAA,UACG,EAAI,OACH,kBAAC,EAAO,KAAR;EACE,6BAA0B;EAG1B,UAAU;EACV,SAAS,IAAS,EAAE,SAAS,EAAE,IAAI;EACnC,SAAS,IAAS,EAAE,SAAS,EAAE,IAAI;EACnC,MAAM,IAAS,EAAE,SAAS,EAAE,IAAI;EAChC,YAAY,IAAS,EAAE,UAAU,IAAK,IAAI,KAAA;EAC1C,OAAO;GACL;GACA;GACA,YAAY,IAAS,YAAY;GACjC,iBAAiB,GAAU,GAAM,CAAK;EACxC;EACA,WAAU;YAEV,kBAAC,EAAO,KAAR;GACE,KAAK;GACL,IAAI;GACJ,MAAK;GACL,mBAAiB;GACjB,UAAU;GACV,OAAO,EAAE,cAAc,EAAO;GAC9B,WAAW,EACT,sDACA,CACF;GAEC;EACS,CAAA;CACF,CAAA,IACV,KACW,CAAA,GACjB,SAAS,IACX,IAxCyB;AAyC3B;;;ACrQA,IAAM,KAAyB;CAC7B,SAAS;EAAE,SAAS;EAAG,QAAQ;CAAY;CAC3C,SAAS;EAAE,SAAS;EAAG,QAAQ;CAAY;CAC3C,OAAO,MACJ,IAAoD,CAAC,IAAvC;EAAE,SAAS;EAAG,QAAQ;CAAY;AACrD,GAEM,KAAgC;CACpC,SAAS,EAAE,SAAS,EAAE;CACtB,SAAS,EAAE,SAAS,EAAE;CACtB,OAAO,MAA2B,IAA+B,CAAC,IAAlB,EAAE,SAAS,EAAE;AAC/D;AAEA,SAAgB,GAAY,EAC1B,QACA,WACA,aACA,YACA,eACA,eACA,aACA,aACA,cACA,eACA,gBACA,WACA,YACA,cACA,qBACA,mBACA,mBACA,kBACA,aACA,aACA,iBAAc,IACd,eAAY,IACZ,kBACA,kBACA,eACA,eACA,0BACA,aACmB;CACnB,IAAM,IAAS,GAAiB,KAAK,IAC/B,CAAC,GAAS,MAAc,EAAS,EAAK,GACtC,IAAW,EAAyB,IAAI,GACxC,IAAoB,EAAO,EAAK,GAChC,IAAa,EAAO,EAAK,GACzB,CAAC,GAAO,KAAY,EAAS,EAAI,KAAK,KAAK,GAC3C,IAAkB,GAAW,EAAI,IAAI,GACrC,KAAa,MAAe,EAAI,KAAK,IACrC,KACJ,GAAY,OAAO,EAAI,KAAK,KAAK,EAAW,WAAW;CAEzD,QAAgB;EACT,MACL,EAAkB,UAAU,IAE5B,4BAA4B;GAE1B,AADA,EAAS,SAAS,MAAM,GACxB,EAAS,SAAS,OAAO;EAC3B,CAAC;CACH,GAAG,CAAC,GAAU,EAAI,KAAK,KAAK,CAAC;CAE7B,IAAM,KAAO,IAAa,EAAI,MAAM;EAClC,aAAa,EAAiB,EAAK;EACnC,cAAc;GAEZ,AADA,EAAiB,EAAK,GACtB,EAAc;EAChB;CACF,CAAC,KACC,kBAAC,UAAD;EACE,MAAK;EACL,eAAe;GAEb,AADA,EAAiB,EAAK,GACtB,EAAc;EAChB;EACA,WAAU;YANZ,CAQE,kBAAC,GAAD;GAAQ,eAAY;GAAO,WAAU;EAAY,CAAA,GAAC,QAE5C;;CAGV,OACE,kBAAC,EAAO,KAAR;EACE,KAAK;EACL,QAAO;EACP,YAAY,IAAS,EAAE,UAAU,EAAE,IAAI;EACvC,MAAK;EACL,cAAY,EAAI,QAAQ;EACxB,iBAAe,IAAkB,KAAA,IAAY;EAC7C,iBAAe,IAAkB,IAAW,KAAA;EAC5C,iBAAe,EAAI,KAAK,YAAY,KAAA;EACpC,UAAU,IAAU,IAAI;EACxB,WAAW,CAAC,EAAI,KAAK,YAAY,CAAC;EAClC,kBAAgB,KAAY,KAAA;EAC5B,aAAW,MAAgB,KAAA;EAC3B,iBAAe,MAAc,KAAA;EACpB;EACE;EACX,UAAU,MAAU;GAEhB,EAAM,oBACN,EAAW,WACX,KACA,EAAI,KAAK,aAGP,IAAiB,EAAS,IACzB,EAAS;EAChB;EACA,gBAAgB,MAAU;GACpB,KAAmB,EAAI,KAAK,aAChC,EAAM,eAAe,GACrB,EAAc;EAChB;EACA,oBAAoB;GAElB,AADA,GAAW,EAAI,GACf,IAAgB,EAAI;EACtB;EACA,oBAAoB;GAElB,AADA,GAAW,EAAK,GAChB,IAAgB,EAAK;EACvB;EACA,qBAAqB,MAAU;GAE7B,AADA,EAAW,UAAU,IACrB,EAAY,GAAO,EAAI,KAAK,EAAE;EAChC;EACA,wBAAwB;GAEtB,AADA,EAAU,GACV,4BAA4B;IAC1B,EAAW,UAAU;GACvB,CAAC;EACH;EACA,aAAa,MAAU,EAAW,GAAO,CAAG;EACpC;EACR,WAAW,EACT,yHACA,oJACA,CAAC,EAAI,KAAK,YACR,CAAC,KACD,kDAEF,MAAkB,KAAA,KAAa,kBAC/B,mGACA,wEACA,mCACA,iGACA,wPACA,6OACA,CAAC,KACC,KACA,8EACF,EAAI,KAAK,YAAY,+BACvB;EACA,OAAO,EAAE,aAAa,GAAG,KAAK,EAAI,QAAQ,GAAG,IAAI;YAvEnD;GAyEG,IACC,kBAAC,GAAD;IAAiB,QAAQ;cACtB,IACC,kBAAC,EAAO,MAAR;KACE,eAAY;KACZ,UAAU,IAAS,KAAsB;KACzC,SAAQ;KACR,SAAQ;KACR,MAAK;KACL,QAAQ;KACR,WAAU;eAET,IACC,kBAAC,EAAO,MAAR;MACE,UAAU;MACV,YAAY,IAAS,EAAE,UAAU,EAAE,IAAI;MACvC,WAAU;KACX,CAAA,IACC;IACO,CAAA,IACX;GACW,CAAA,IACf;GACJ,kBAAC,QAAD;IACE,eAAY;IACZ,WAAU;cAET,IAAa,EAAI,IAAI,KAAK,GAAY,EAAI,MAAM,CAAQ;GACrD,CAAA;GAEL,IACC,kBAAC,SAAD;IACE,KAAK;IACL,OAAO;IACP,cAAY,UAAU,EAAI,KAAK;IAC/B,WAAW,MAAU,EAAS,EAAM,OAAO,KAAK;IAChD,WAAW;IACX,UAAU,MAAU,EAAM,gBAAgB;IAC1C,gBAAgB,MAAU,EAAM,gBAAgB;IAChD,cAAc;KACZ,AAAK,EAAkB,WAAS,EAAe,CAAK;IACtD;IACA,YAAY,MAAU;KAMpB,AALA,EAAM,gBAAgB,GAClB,EAAM,QAAQ,YAChB,EAAkB,UAAU,IAC5B,EAAe,CAAK,IAElB,EAAM,QAAQ,aAChB,EAAkB,UAAU,IAC5B,EAAe;IAEnB;IACA,WAAU;GACX,CAAA,IAED,kBAAC,IAAD;IAAc,QAAQ,KAAW;cAC9B,EAAI,KAAK;GACE,CAAA;GAGf,CAAC,KAAY,CAAC,EAAI,KAAK,WACtB,kBAAC,IAAD;IAAc,MAAM;IAAU,cAAc;cAA5C,CACE,kBAAC,IAAD,EAAA,iBACU;KACN,IAAM,IAAS,KAAuB,EAAI,IAAI;KAC9C,IAAI,GAAQ;MAEV,IAAM,IACJ,EAAO,MAGP;MACF,OAAO,GAAa,GAAQ;OAC1B,WAAW;OACX,UAAU,MAAmC;QAE3C,AADA,EAAM,gBAAgB,GACtB,IAAgB,CAAK;OACvB;MACF,CAAqB;KACvB;KACA,OACE,kBAAC,GAAD;MACE,WAAW;MACX,UAAU;MACV,SAAQ;MACR,cAAY,eAAe,EAAI,KAAK;MACpC,UAAU,MAAU,EAAM,gBAAgB;MAC1C,WAAU;gBAEV,kBAAC,GAAD;OAAgB,eAAY;OAAO,WAAU;MAAU,CAAA;KACjD,CAAA;IAEZ,EAAA,CAAG,EACgB,CAAA,GACrB,kBAAC,IAAD;KACE,MAAK;KACL,OAAM;KACN,YAAY;KACZ,QAAQ;KACR,WAAU;eAEV,kBAAC,OAAD;MAAK,8BAA4B,EAAI,KAAK;gBAAK;KAAU,CAAA;IACtC,CAAA,CACT;QACZ;GAEH,EAAI,UAAU,KACf,MACC,EAAI,KAAK,UAAU,UAAU,KAAK,IACjC,kBAAC,GAAD;IACE,eAAY;IACZ,WAAW,EACT,oIACA,KAAY,WACd;GACD,CAAA,IACC;EACM;;AAEhB;;;AC5SA,SAAgB,GAAU,EACxB,eACA,eACA,yBACA,eAAY,aACZ,cACA,GAAG,KACc;CACjB,IAAM,EACJ,SACA,eACA,gBACA,cACA,iBACA,eACA,eACA,cACA,kBACA,mBACA,eACA,eACA,eACA,kBACA,iBACA,WACA,WACA,kBACA,uBACA,eACA,uBACA,qBACA,uBACA,iBACA,yBACA,iBACE,GAAa,CAA8B;CAE/C,OACE,kBAAA,GAAA,EAAA,UAAA,CACE,kBAAC,OAAD;EACE,MAAK;EACL,cAAY;EACZ,wBAAqB;EACrB,YAAY;EACZ,QAAQ;EACR,cAAc;EACd,WAAW,EACT,wGACA,KAAc,oBACd,CACF;YAXF,CAaE,kBAAC,GAAD;GAAiB,SAAS;aACvB,EAAK,KAAK,MACT,kBAAC,IAAD;IAEO;IACL,QAAQ,MAAe,EAAI,KAAK;IAChC,UAAU,EAAY,IAAI,EAAI,KAAK,EAAE;IACrC,SAAS,MAAc,EAAI,KAAK;IACpB;IACA;IACZ,UAAU,MAAe,EAAI,KAAK;IAClC,UAAU,MAAe,EAAI,KAAK;IAClC,aAAa,MAAc,QAAQ,CAAC;IACpC,WACE,MAAc,EAAI,KAAK,MAAM,CAAC,KAAc,CAAC,EAAI,KAAK;IAEzC;IACf,gBAAgB,MAAY,EAAe,EAAI,KAAK,IAAI,CAAO;IAC/D,eAAe,EAAa,EAAI,KAAK,EAAE;IACvC,gBAAgB,EAAO,EAAI,KAAK,EAAE;IAClC,gBAAgB,EAAO,EAAI,KAAK,EAAE;IAClC,YAAY,MAAU,EAAc,GAAO,CAAG;IAC9C,qBAAqB,EAAc,EAAI,KAAK,EAAE;IAC9C,sBAAsB,EAAc,IAAI;IACxC,iBAAiB,MAAU,EAAa,GAAK,CAAK;IAClD,mBAAmB,MAAS,EAAqB,GAAK,CAAI;IAC1D,aAAa;IACb,WAAW;IACX,YAAY;IACZ,QAAQ;IACI;IACA;IACU;IACtB,SAAS,MAAS,EAAU,EAAI,KAAK,IAAI,CAAI;GAC9C,GA/BM,EAAI,KAAK,EA+Bf,CACF;EACc,CAAA,GAEhB,KACC,kBAAC,OAAD;GACE,eAAY;GACZ,eAAa,GAAY,OAAO,QAAQ,KAAA;GACxC,WAAU;aACX;EAEI,CAAA,CAEJ;KACL,kBAAC,QAAD;EAAM,WAAU;EAAU,aAAU;YACjC;CACG,CAAA,CACN,EAAA,CAAA;AAEN;;;ACxGA,IAAa,KAAU;CACrB,SAAS;CACT;CACA,KAAK;CACL,MAAM;AACR,GCba,KAAmB;;;ACehC,SAAgB,GAAY,EAC1B,aACA,aAAU,WACV,WACA,cACA,gBACA,GAAG,KACoC;CAEvC,IAKM,IAAqD;EACzD,GAAI,GAAQ,QAAQ,EAClB,MAAM,EAAO,KAAK,eAAe,EAAO,KAAK,KAC/C;EACA,GAAI,GAAQ,SAAS,EACnB,OAAO,EAAO,MAAM,eAAe,EAAO,MAAM,KAClD;EACA,GAAI;CACN;CAEA,OACE,kBAAC,IAAD;EACE,GAAI;EACJ,aAAa;EACb,WAAW,EAAG,cAAc,GAAW,yIAAY,eAAe;EAClE,OAAO,EACL,YAAY,MAAY,YAAA,KAA+B,EACzD;YANF;GAQE,kBAAC,IAAD;IACE,WAAU;IACV,aAAY;IACZ,MAAK;IACL,SAAQ;cAEP,GAAQ,MAAM;GACA,CAAA;GAEjB,kBAAC,IAAD;IACE,WAAW,EACT,2KACA,OACF;cAJF,CAME,kBAAC,UAAD;KAAQ,WAAU;eAAlB,CACE,kBAAC,OAAD;MAAK,WAAU;gBACb,kBAAC,IAAD,EAAA,UACG,GAAQ,MAAM,WACb,kBAAC,IAAD;OAAY,MAAK;OAAY,MAAM;OAAI,WAAU;MAAS,CAAA,EAEtC,CAAA;KACrB,CAAA,GACL,kBAAC,OAAD;MAAK,WAAU;gBACb,kBAAC,IAAD;OAAwB,cAAW;OAAe,MAAK;iBACpD,GAAQ,OAAO,WACd,kBAAC,IAAD;QAAY,MAAK;QAAa,MAAM;QAAI,WAAU;OAAS,CAAA;MAEvC,CAAA;KACrB,CAAA,CACC;QACR,kBAAC,OAAD;KAAK,WAAU;eACZ,KAAY,kBAAC,IAAD,CAAyB,CAAA;IACnC,CAAA,CACe;;GAEtB,kBAAC,IAAD;IACE,WAAW,GAAQ,OAAO,QAAQ;IAGlC,WAAW,EAAG,8GAA8G;IAC5H,aAAY;IACZ,gBAAgB,EAId,qEACA,gGACA,4DACF;IACA,MAAK;IACL,MAAK;IACL,SAAQ;cAEP,GAAQ,OAAO;GACD,CAAA;EACM;;AAE7B;AAEA,SAAS,KAAyB;CAChC,OACE,kBAAC,OAAD;EAAK,WAAU;YAAf,CACE,kBAAC,OAAD;GAAK,WAAU;aACZ,MAAM,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,MACjC,kBAAC,OAAD,EACE,WAAU,6CAEX,GADM,CACN,CACF;EACE,CAAA,GACL,kBAAC,OAAD,EAAK,WAAU,6CAA8C,CAAA,CAC1D;;AAET;;;ACzGA,SAAgB,GAAe,EAC7B,gBACA,sBACA,qBACyB,CAAC,GAAuB;CACjD,IAAM,CAAC,GAAM,KAAgB,SAA8C;EACzE,MAAM,GAAa,QAAQ;EAC3B,OAAO,GAAa,SAAS;CAC/B,EAAE,GACI,CAAC,GAAY,KAAsB,SAEhC;EACP,MAAM,GAAmB,QAAQ;EACjC,OAAO,GAAmB,SAAS;CACrC,EAAE,GAEI,IAAU,GACb,GAAmB,MAAsB;EAIxC,AAHA,GAAc,MACZ,EAAK,OAAU,IAAW,IAAO;GAAE,GAAG;IAAO,IAAO;EAAS,CAC/D,GACA,IAAgB,GAAU,CAAI;CAChC,GACA,CAAC,CAAa,CAChB,GAEM,IAAgB,GACnB,GAAmB,MAAsB;EAIxC,AAHA,GAAoB,MAClB,EAAK,OAAU,IAAW,IAAO;GAAE,GAAG;IAAO,IAAO;EAAS,CAC/D,GACA,IAAgB,GAAU,CAAI;CAChC,GACA,CAAC,CAAa,CAChB;CAiBA,OAAO;EACL;EACA;EACA;EACA;EACA,QApBa,GACZ,MAAsB,EAAQ,CAAC,EAAK,IAAO,CAAI,GAChD,CAAC,GAAM,CAAO,CAkBd;EACA,eAhBoB,UACb;GACL;GACA,cAAc;GACd;GACA,oBAAoB;EACtB,IACA;GAAC;GAAM;GAAY;GAAS;EAAa,CASzC;CACF;AACF;;;AC3EA,IAAM,KAAS,EACb,MAAM,GACR,GCuEa,KAA6C;CACxD;EAAE,MAAM;EAAS,OAAO;CAAa;CACrC;EAAE,IAAI;EAAW,OAAO;EAAW,MAAM,kBAAC,GAAD,EAAU,eAAY,OAAQ,CAAA;CAAE;CACzE;EACE,IAAI;EACJ,OAAO;EACP,MAAM,kBAAC,GAAD,EAAc,eAAY,OAAQ,CAAA;CAC1C;CACA,EAAE,MAAM,YAAY;CACpB;EAAE,IAAI;EAAS,OAAO;EAAS,MAAM,kBAAC,GAAD,EAAW,eAAY,OAAQ,CAAA;CAAE;CACtE;EAAE,IAAI;EAAU,OAAO;EAAU,MAAM,kBAAC,IAAD,EAAc,eAAY,OAAQ,CAAA;CAAE;CAC3E,EAAE,MAAM,YAAY;CACpB;EACE,IAAI;EACJ,OAAO;EACP,MAAM,kBAAC,GAAD,EAAY,eAAY,OAAQ,CAAA;EACtC,SAAS;CACX;AACF;AAkCA,SAAS,GACP,GACoD;CACpD,IAAM,IAA6D,CAAC,GAChE,IAA4D,EAC9D,SAAS,CAAC,EACZ;CAEA,KAAK,IAAM,KAAQ,GACjB,AAAI,EAAK,SAAS,eAChB,EAAO,KAAK,CAAO,GACnB,IAAU,EAAE,SAAS,CAAC,EAAE,KACf,EAAK,SAAS,UACvB,EAAQ,QAAQ,EAAK,QAErB,EAAQ,QAAQ,KAAK,CAAI;CAK7B,OAFA,EAAO,KAAK,CAAO,GAEZ,EAAO,QACX,MAAU,EAAM,QAAQ,SAAS,KAAK,EAAM,UAAU,KAAA,CACzD;AACF;AASA,SAAgB,GAAiB,EAC/B,SACA,WAAQ,IACR,WAAQ,UACR,UAAO,UACP,gBAAa,GACb,eAAY,WACZ,SACA,gBACA,iBACA,WAAQ,IACR,YACA,gBAC4C;CAC5C,IAAM,CAAC,GAAS,KAAc,EAAM,SAAwB,IAAI,GAE1D,IAAU,EAAM,OAAO,EAAI;CACjC,EAAM,iBACJ,EAAQ,UAAU,UACL;EACX,EAAQ,UAAU;CACpB,IACC,CAAC,CAAC;CAEL,IAAM,IAAS,EAAM,cAAc,GAAS,CAAK,GAAG,CAAC,CAAK,CAAC;CAE3D,SAAS,EAAO,GAA2B;EACzC,IAAM,IAAS,EAAO,WAAW;EAC3B,aAAkB,YACxB,EAAW,EAAO,EAAE,GACpB,EACG,OAAO,MAAmB,IAAU,CAAK,CAAC,CAAC,CAC3C,cAAc;GACb,AAAI,EAAQ,WAAS,EAAW,IAAI;EACtC,CAAC;CACL;CAEA,IAAM,IAAO,MAAY;CAUzB,OACE,kBAAC,IAAD;EACe;EACb,eAVF,GACA,MACG;GAEH,AADI,KAAO,GAAQ,IAAW,UAAU,SAAS,GACjD,IAAe,GAAU,CAAO;EAClC;EAMU;YAHR,CAKE,kBAAC,IAAD;GACE,UAAU;GACV,QACE,kBAAC,GAAD;IAGE,cAAY,GAAG,EAAK,OAAO,EAAK,WAAW,IAAI,EAAK,aAAa,GAAG;IACpE,WAAW,EAGT,mFACA,CACF;IACA,aAAU;IACV,SAAS;IACF;IACP,SAAQ;cAbV,CAeE,kBAAC,QAAD;KAAM,WAAU;eAAhB,CACE,kBAAC,IAAD;MAEE,KAAI;MACJ,UAAU,EAAK;MACf,MAAM,EAAK;MACX,KAAK,EAAK;KACX,CAAA,GACD,kBAAC,QAAD;MAAM,WAAU;gBAAhB,CACE,kBAAC,QAAD;OAAM,WAAU;iBAAwB,EAAK;MAAW,CAAA,GACvD,EAAK,WACJ,kBAAC,QAAD;OAAM,WAAU;iBACb,EAAK;MACF,CAAA,IACJ,IACA;OACF;QACN,kBAAC,GAAD;KAAoB,eAAY;KAAO,WAAU;IAAY,CAAA,CACvD;;EAEX,CAAA,GACD,kBAAC,IAAD;GACS;GAKP,WAAW,EACT,MAAc,SAAS,uBAAuB,aAC9C,0dACF;GACM;GACM;aAEX,EAAO,KAAK,GAAO,MAClB,kBAAC,EAAM,UAAP,EAAA,UAAA,CACG,IAAQ,IAAI,kBAAC,IAAD,CAAwB,CAAA,IAAI,MACzC,kBAAC,IAAD,EAAA,UAAA,CACG,EAAM,QACL,kBAAC,IAAD,EAAA,UAAoB,EAAM,MAAyB,CAAA,IACjD,MACH,EAAM,QAAQ,KAAK,MAClB,kBAAC,IAAD;IACE,UAAU,EAAK;IAEf,eAAe,EAAO,CAAI;IAC1B,SAAS,EAAK;cAJhB;KAMG,EAAK;KACN,kBAAC,QAAD,EAAA,UAAO,EAAK,MAAY,CAAA;KACvB,EAAK,WACJ,kBAAC,IAAD,EAAA,UAAuB,EAAK,SAA+B,CAAA,IACzD;IACY;MATX,EAAK,EASM,CACnB,CACgB,EAAA,CAAA,CACL,EAAA,GArBK,EAAM,SAAS,SAAS,EAAM,QAAQ,EAAE,EAAE,IAqB/C,CACjB;EACkB,CAAA,CACT;;AAElB"}
|
|
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/blocks/shell/utils.ts","../src/components/blocks/shell/animated-panel.tsx","../src/components/blocks/shell/animated-panel-provider.tsx","../src/components/blocks/shell/animated-panel-trigger.tsx","../src/components/blocks/shell/animated-panel-inset.tsx","../src/components/blocks/shell/shell-layout.tsx","../src/components/blocks/shell/use-shell-panels.ts","../src/components/blocks/shell/animated-sidebar-header.tsx","../src/components/blocks/shell/animated-sidebar-content.tsx","../src/components/blocks/shell/animated-sidebar-footer.tsx","../src/components/blocks/shell/animated-sidebar-group.tsx","../src/components/blocks/shell/animated-sidebar-group-label.tsx","../src/components/blocks/shell/animated-sidebar-group-content.tsx","../src/components/motion/shared-layout-bg.tsx","../src/components/blocks/shell/animated-sidebar-menu.tsx","../src/components/blocks/shell/animated-sidebar-menu-item.tsx","../src/components/blocks/shell/animated-sidebar-menu-sub.tsx","../src/components/blocks/shell/animated-sidebar-menu-sub-item.tsx","../src/components/blocks/shell/animated-sidebar-menu-sub-button.tsx","../src/components/blocks/shell/animated-sidebar-menu-button.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/scaffold/utils.ts","../src/components/blocks/scaffold/panel-close-button.tsx","../src/components/ui/button-group.tsx","../src/components/ui/glasscn/glass-button-group.tsx","../src/lib/hooks/use-hover-capable.ts","../src/components/blocks/scaffold/constants.ts","../src/components/blocks/scaffold/panel-menu-button.tsx","../src/components/blocks/scaffold/scaffold-context.ts","../src/components/ui/group.tsx","../src/components/blocks/scaffold/scaffold-actions.tsx","../src/components/blocks/scaffold/scaffold-canvas.tsx","../src/components/ui/glasscn/glass-container.tsx","../src/components/blocks/scaffold/scaffold-inspector.tsx","../src/components/blocks/scaffold/scaffold-main.tsx","../src/components/blocks/scaffold/scaffold-sub-panel.tsx","../src/components/blocks/scaffold/scaffold-panel.tsx","../src/components/blocks/scaffold/scaffold-root.tsx","../src/components/blocks/scaffold/scaffold-sidebar.tsx","../src/components/blocks/scaffold/use-scaffold.ts","../src/components/blocks/scaffold/index.ts","../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 forwardRef,\n type HTMLAttributes,\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>(\n 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(\n () => `liquid-glass-${rawId.replace(/:/g, \"\")}`,\n [rawId]\n )\n\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(\n getComputedStyle(el).borderTopLeftRadius\n )\n const radius = Math.min(\n Number.isFinite(parsed) ? parsed : Math.min(width, height) / 2,\n width / 2,\n height / 2\n )\n setGeometry((prev) =>\n prev &&\n prev.width === width &&\n prev.height === height &&\n prev.radius === radius &&\n 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(\n () => (geometry ? createDisplacementMap(geometry) : \"\"),\n [geometry]\n )\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={\n {\n ...style,\n backdropFilter,\n WebkitBackdropFilter: backdropFilter,\n } as CSSProperties\n }\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:\n \"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\n id={filterId}\n x=\"0\"\n y=\"0\"\n width=\"100%\"\n height=\"100%\"\n colorInterpolationFilters=\"sRGB\"\n >\n <feImage\n href={mapUrl}\n x=\"0\"\n y=\"0\"\n width=\"100%\"\n height=\"100%\"\n preserveAspectRatio=\"none\"\n result=\"map\"\n />\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)\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-8 sm:size-8\",\n \"icon-sm\": \"size-7 sm:size-6\",\n \"icon-xl\":\n \"size-10 sm:size-9 [&_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\"\n\nimport { cn } from \"@/lib/utils\"\n\nfunction Separator({\n className,\n orientation = \"horizontal\",\n ...props\n}: SeparatorPrimitive.Props) {\n return (\n <SeparatorPrimitive\n data-slot=\"separator\"\n orientation={orientation}\n className={cn(\n \"shrink-0 bg-border data-horizontal:h-px data-horizontal:w-full data-vertical:w-px data-vertical:self-stretch\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Separator }\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'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'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","import type { Transition, Variants } from \"motion/react\"\n\nexport 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\n\n// This needs a softer layout spring than the app defaults, so the overflow group\n// stays visually attached to the toggle while entering and leaving.\nexport const SHELL_TRANSITION: Transition = {\n type: \"spring\",\n stiffness: 220,\n damping: 17,\n mass: 0.85,\n};\n\nexport const ICON_VARIANTS: Variants = {\n hidden: { opacity: 0, filter: \"blur(3px)\" },\n visible: {\n opacity: 1,\n filter: \"blur(0px)\",\n transition: { duration: 0.18, ease: EASE_OUT },\n },\n exit: {\n opacity: 0,\n filter: \"blur(3px)\",\n transition: { duration: 0.18, ease: EASE_OUT },\n },\n};\n","export const TITLE_BAR_HEIGHT = 48\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.\nimport { EASE_OUT, EASE_DRAWER } from \"@/lib/ease.ts\"\nimport type { Variants } from \"motion/react\"\nimport { createContext, useContext, useSyncExternalStore } from \"react\"\nimport type {\n AnimatedSidebarContextValue,\n AnimatedSidebarPanelContextValue,\n} from \"./type\"\n\nexport const SIDEBAR_MORPH_TRANSITION = {\n type: \"spring\",\n stiffness: 380,\n damping: 35,\n mass: 0.75,\n} as const\n\nexport const LABEL_ENTER_TRANSITION = {\n duration: 0.2,\n delay: 0.08,\n ease: EASE_OUT,\n} as const\n\nexport const LABEL_EXIT_TRANSITION = {\n duration: 0.12,\n ease: EASE_OUT,\n} as const\n\nexport const PANEL_TRANSITION = {\n duration: 0.36,\n ease: EASE_DRAWER,\n} as const\n\nexport const REDUCED_TRANSITION = {\n duration: 0.16,\n ease: EASE_OUT,\n} as const\n\nconst SUBMENU_TRANSITION = {\n duration: 0.18,\n ease: EASE_OUT,\n} as const\n\nexport const 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\nexport const 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\nexport const 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\nexport const MOBILE_QUERY = \"(max-width: 767px)\"\nexport const SIDEBAR_KEYBOARD_SHORTCUT = \"b\"\n\n\nexport const AnimatedSidebarContext =\n createContext<AnimatedSidebarContextValue | null>(null)\n\nexport const 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 AnimatedPanelProvider.\"\n )\n }\n return context\n}\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\nexport function getMobileSnapshot() {\n return window.matchMedia(MOBILE_QUERY).matches\n}\n\nexport function getServerMobileSnapshot() {\n return false\n}\n\nexport function useIsMobile() {\n return useSyncExternalStore(\n subscribeToMobileQuery,\n getMobileSnapshot,\n getServerMobileSnapshot\n )\n}\n\n\nexport function useAnimatedSidebarPanel() {\n const context = useContext(AnimatedSidebarPanelContext)\n if (!context) {\n throw new Error(\n \"Animated Sidebar parts must be used inside AnimatedPanel.\"\n )\n }\n return context\n}\n","\"use client\"\n// beui.dev/components/motion/animated-sidebar\n\nimport { motion } from \"motion/react\"\nimport { EASE_OUT } from \"@/lib/ease.ts\"\nimport { cn } from \"@/lib/utils\"\nimport type { AnimatedSidebarProps } from \"./type\"\nimport {\n AnimatedSidebarPanelContext,\n SIDEBAR_MORPH_TRANSITION,\n PANEL_TRANSITION,\n REDUCED_TRANSITION,\n useAnimatedSidebar\n} from \"./utils\"\n\nexport function AnimatedPanel({\n side = \"left\",\n variant = \"sidebar\",\n collapsible = \"icon\",\n ariaLabel = \"Sidebar\",\n children,\n className,\n panelClassName,\n style,\n ref,\n ...props\n}: AnimatedSidebarProps) {\n const context = useAnimatedSidebar()\n const sideOpen = context.open[side]\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) return <div>TODO: Create Mobile nav experience</div>\n\n return (\n <motion.aside\n {...props}\n ref={ref}\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={{\n width,\n // Swallow the shell's gap-x-2 column gap while off canvas so the\n // shell edge keeps a constant spacing-2 inset whether the panel is\n // open (gap + panel + margin) or collapsed (gap + this).\n ...(side === \"right\"\n ? { marginLeft: offcanvas ? \"-0.5rem\" : \"0rem\" }\n : { marginRight: offcanvas ? \"-0.5rem\" : \"0rem\" }),\n }}\n transition={context.reduce ? { duration: 0 } : SIDEBAR_MORPH_TRANSITION}\n style={style}\n className={cn(\n \"group/sidebar relative hidden h-full shrink-0 will-change-[width] md:block\",\n \"peer flex!\",\n side === \"right\" && \"order-last\",\n className\n )}\n >\n {side === \"right\" && !collapsed && (\n // The handle occupies the shell's gap-x-2 column gap. It must stay\n // outside the clipping mask below or the gap would never receive\n // hover — clipping cuts hit-testing, not just painting.\n <motion.div\n className=\"absolute inset-y-0 -left-2 z-10 w-2 cursor-col-resize\"\n initial=\"idle\"\n whileHover=\"hover\"\n >\n <motion.div\n variants={{ idle: { scaleY: 0 }, hover: { scaleY: 1 } }}\n transition={\n context.reduce\n ? { duration: 0 }\n : { duration: 0.2, ease: EASE_OUT }\n }\n className=\"h-full w-full bg-radial/decreasing from-amber-300/70 to-amber-500/0 to-40%\"\n />\n </motion.div>\n )}\n {/* The off canvas panel keeps its full width and slides out of the\n zero-width rail, so mask it to the aside's box here instead of\n clipping the aside itself — the aside must stay unclipped for the\n gap handle above to be hoverable. */}\n <div\n className={\n collapsible === \"offcanvas\"\n ? \"absolute inset-0 overflow-hidden rounded-[inherit]\"\n : \"contents\"\n }\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 flex-col overflow-hidden\",\n // collapsible === \"offcanvas\" && \"w-(--sidebar-width)\",\n // Pin the right panel to the aside's trailing edge so the width\n // animation expands the panel out of it instead of revealing a\n // detached strip.\n side === \"right\" && \"ml-auto\",\n\n // Panels fill the shell's container, not the viewport — the shell\n // owns its own scrolling, so a bounded host (docs demo, split\n // view) must bound the panels too. Full-page apps size the shell\n // itself (e.g., h-svh). The bottom gap comes from the shell\n // container's padding, so panels only carry their top offset.\n variant === \"floating\" && \"mx-2 mt-2 h-[calc(100%-0.5rem)]\",\n variant === \"inset\" && \"mt-2 h-[calc(100%-0.5rem)]\",\n\n panelClassName\n )}\n >\n <AnimatedSidebarPanelContext.Provider\n value={{ collapsed, collapsible, side }}\n >\n {children}\n </AnimatedSidebarPanelContext.Provider>\n </motion.div>\n </div>\n </motion.aside>\n )\n}\n","import { useCallback, useEffect, useId, useMemo, useRef, useState } from \"react\"\nimport { useReducedMotion } from \"motion/react\"\nimport { cn } from \"@/lib/utils.ts\"\nimport type {\n AnimatedSidebarProviderProps,\n SidebarSide,\n} from \"./type\"\nimport {\n AnimatedSidebarContext,\n SIDEBAR_KEYBOARD_SHORTCUT,\n useIsMobile,\n} from \"./utils\"\n\nexport function AnimatedPanelProvider({\n children,\n open,\n defaultOpen,\n onOpenChange,\n openMobile,\n defaultOpenMobile,\n onOpenMobileChange,\n className,\n style,\n ...props\n}: AnimatedSidebarProviderProps) {\n const [internalOpen, setInternalOpen] = useState<\n Record<SidebarSide, boolean>\n >(() => ({\n left: defaultOpen?.left ?? true,\n right: defaultOpen?.right ?? false,\n }))\n const [internalOpenMobile, setInternalOpenMobile] = useState<\n Record<SidebarSide, boolean>\n >(() => ({\n left: defaultOpenMobile?.left ?? false,\n right: defaultOpenMobile?.right ?? false,\n }))\n const isMobile = useIsMobile()\n const reduce = useReducedMotion() ?? false\n const generatedId = useId()\n const leftTriggerRef = useRef<HTMLButtonElement>(null)\n const rightTriggerRef = useRef<HTMLButtonElement>(null)\n\n // Per-side controlled/uncontrolled merge — a side is controlled exactly\n // when its key is present on the controlled record.\n const controlledLeft = open?.left\n const controlledRight = open?.right\n const controlledMobileLeft = openMobile?.left\n const controlledMobileRight = openMobile?.right\n\n const openState = useMemo<Record<SidebarSide, boolean>>(\n () => ({\n left: controlledLeft ?? internalOpen.left,\n right: controlledRight ?? internalOpen.right,\n }),\n [controlledLeft, controlledRight, internalOpen]\n )\n const openMobileState = useMemo<Record<SidebarSide, boolean>>(\n () => ({\n left: controlledMobileLeft ?? internalOpenMobile.left,\n right: controlledMobileRight ?? internalOpenMobile.right,\n }),\n [controlledMobileLeft, controlledMobileRight, internalOpenMobile]\n )\n\n const setOpen = useCallback(\n (nextOpen: boolean, side: SidebarSide) => {\n const controlled = side === \"left\" ? controlledLeft : controlledRight\n if (controlled === undefined) {\n setInternalOpen((prev) =>\n prev[side] === nextOpen ? prev : { ...prev, [side]: nextOpen }\n )\n }\n onOpenChange?.(nextOpen, side)\n },\n [controlledLeft, controlledRight, onOpenChange]\n )\n\n const setOpenMobile = useCallback(\n (nextOpen: boolean, side: SidebarSide) => {\n const controlled =\n side === \"left\" ? controlledMobileLeft : controlledMobileRight\n if (controlled === undefined) {\n setInternalOpenMobile((prev) =>\n prev[side] === nextOpen ? prev : { ...prev, [side]: nextOpen }\n )\n }\n onOpenMobileChange?.(nextOpen, side)\n },\n [controlledMobileLeft, controlledMobileRight, onOpenMobileChange]\n )\n\n const toggleSidebar = useCallback(\n (side: SidebarSide) => {\n if (isMobile) setOpenMobile(!openMobileState[side], side)\n else setOpen(!openState[side], side)\n },\n [isMobile, openMobileState, openState, setOpen, setOpenMobile]\n )\n\n const triggerRefs = useMemo(\n () => ({ left: leftTriggerRef, right: rightTriggerRef }),\n []\n )\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(\"left\")\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: openState,\n openMobile: openMobileState,\n reduce,\n setOpen,\n setOpenMobile,\n toggleSidebar,\n triggerRefs,\n }}\n >\n <div\n {...props}\n data-slot=\"sidebar-wrapper\"\n data-state-left={openState.left ? \"expanded\" : \"collapsed\"}\n data-state-right={openState.right ? \"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 w-full min-w-0 gap-x-2\",\n className\n )}\n >\n {children}\n </div>\n </AnimatedSidebarContext.Provider>\n )\n}\n","import { forwardRef } from \"react\"\nimport { Button } from \"@/components/ui/button\"\nimport { useAnimatedSidebar } from \"./utils\"\nimport type { AnimatedSidebarTriggerProps } from \"./type\"\n\nexport const AnimatedPanelTrigger = forwardRef<\n HTMLButtonElement,\n AnimatedSidebarTriggerProps\n>(function AnimatedSidebarTrigger(\n { onClick, side = \"left\", type = \"button\", ...props },\n forwardedRef\n) {\n const context = useAnimatedSidebar()\n const expanded = context.isMobile\n ? context.openMobile[side]\n : context.open[side]\n const triggerRef = context.triggerRefs[side]\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 variant=\"ghost\"\n size=\"icon-xl\"\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 context.toggleSidebar(side)\n }}\n />\n )\n})\n","import { forwardRef } from \"react\"\nimport { motion } from \"motion/react\"\nimport { cn } from \"@/lib/utils.ts\"\nimport type { AnimatedSidebarInsetProps } from \"./type\"\n\nexport const AnimatedPanelInset = 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-neutral-50 dark:bg-neutral-900\",\n \"outline-offset-0.5 overflow-hidden border-t-3 border-white outline-neutral-100 dark:border-neutral-800 dark:inset-ring-black\",\n \"rounded-lg shadow-md shadow-neutral-200 dark:shadow-neutral-950\",\n className\n )}\n />\n )\n})\n","\"use client\"\n\nimport { MotionIcon } from \"motion-icons-react\"\nimport * as React from \"react\"\n\nimport {\n AnimatedPanel\n} from \"./animated-panel.tsx\"\nimport { cn } from \"@/lib/utils\"\nimport type { ShellLayoutProps, ShellPanelControlProps } from \"./type\"\nimport { TITLE_BAR_HEIGHT } from \"./utils\"\nimport type { ClassNameValue } from \"tailwind-merge\"\nimport { AnimatedPanelProvider } from \"./animated-panel-provider.tsx\"\nimport { AnimatedPanelTrigger } from \"./animated-panel-trigger.tsx\"\nimport { AnimatedPanelInset } from \"./animated-panel-inset.tsx\"\n\nexport function ShellLayout({\n children,\n variant = \"desktop\",\n panels,\n className,\n header,\n defaultOpen,\n ...panelControlProps\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\n // Each panel seeds its own side's initial state (`defaultOpen ?? open`);\n // an explicit `defaultOpen` record — usually from useShellPanels — wins\n // per side.\n const initialOpen: ShellPanelControlProps[\"defaultOpen\"] = {\n ...(panels?.left && {\n left: panels.left.defaultOpen ?? true,\n }),\n ...(panels?.right && {\n right: panels.right.defaultOpen ?? false,\n }),\n ...defaultOpen,\n }\n\n\n return (\n <AnimatedPanelProvider\n {...panelControlProps}\n defaultOpen={initialOpen}\n className={cn(\"relative h-full min-h-0 pb-2\", className, background)}\n style={{\n paddingTop: variant === \"desktop\" ? TITLE_BAR_HEIGHT : 0,\n }}\n >\n <AnimatedPanel\n ariaLabel=\"Primary navigation\"\n collapsible=\"icon\"\n role=\"navigation\"\n variant=\"inset\"\n >\n {panels?.left?.component}\n </AnimatedPanel>\n\n <AnimatedPanelInset className=\"min-w-24\">\n <header className=\"flex h-12 items-center justify-between gap-2 border-b px-2\">\n <div className=\"flex min-w-0 items-center gap-2\">\n <AnimatedPanelTrigger>\n {panels?.left?.trigger ?? (\n <MotionIcon name=\"PanelLeft\" size={24} animation=\"press\" />\n )}\n </AnimatedPanelTrigger>\n </div>\n {header && <div className=\"flex flex-1 items-center\">{header}</div>}\n <div className=\"flex shrink-0 items-center gap-2\">\n <AnimatedPanelTrigger aria-label=\"Toggle panel\" side=\"right\">\n {panels?.right?.trigger ?? (\n <MotionIcon\n className=\"opacity-70\"\n name=\"PanelRight\"\n size={24}\n />\n )}\n </AnimatedPanelTrigger>\n </div>\n </header>\n <div className=\"min-h-24 flex-1 overflow-auto\">{children}</div>\n </AnimatedPanelInset>\n\n <AnimatedPanel\n ariaLabel={panels?.right?.name ?? \"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(\n \"mr-2 bg-neutral-50 dark:border-neutral-800 dark:bg-neutral-900\",\n \"outline-offset-0.5 border-t-3 border-white outline-neutral-100 dark:inset-ring-black\",\n \"rounded-lg shadow-md shadow-neutral-200 dark:shadow-neutral-950\"\n )}\n collapsible=\"offcanvas\"\n role=\"complementary\"\n side=\"right\"\n variant=\"inset\"\n >\n {panels?.right?.component}\n </AnimatedPanel>\n </AnimatedPanelProvider>\n )\n}\n","\"use client\"\n\nimport { useCallback, useMemo, useState } from \"react\"\n\nimport type {\n ShellPanelControlProps,\n ShellPanelControls,\n SidebarSide,\n UseShellPanelsOptions,\n} from \"./type\"\n\n/**\n * Owns the open/close state of the shell's panels, keyed by side, and\n * reports every change through a single `onPanelChange(open, side)`\n * callback. Spread the returned `providerProps` onto ShellLayout; the\n * setters and `toggle` are for UI that lives outside the shell (title-bar\n * buttons, command palette, shortcuts).\n */\nexport function useShellPanels({\n defaultOpen,\n defaultOpenMobile,\n onPanelChange,\n}: UseShellPanelsOptions = {}): ShellPanelControls {\n const [open, setOpenState] = useState<Record<SidebarSide, boolean>>(() => ({\n left: defaultOpen?.left ?? true,\n right: defaultOpen?.right ?? false,\n }))\n const [openMobile, setOpenMobileState] = useState<\n Record<SidebarSide, boolean>\n >(() => ({\n left: defaultOpenMobile?.left ?? false,\n right: defaultOpenMobile?.right ?? false,\n }))\n\n const setOpen = useCallback(\n (nextOpen: boolean, side: SidebarSide) => {\n setOpenState((prev) =>\n prev[side] === nextOpen ? prev : { ...prev, [side]: nextOpen }\n )\n onPanelChange?.(nextOpen, side)\n },\n [onPanelChange]\n )\n\n const setOpenMobile = useCallback(\n (nextOpen: boolean, side: SidebarSide) => {\n setOpenMobileState((prev) =>\n prev[side] === nextOpen ? prev : { ...prev, [side]: nextOpen }\n )\n onPanelChange?.(nextOpen, side)\n },\n [onPanelChange]\n )\n\n const toggle = useCallback(\n (side: SidebarSide) => setOpen(!open[side], side),\n [open, setOpen]\n )\n\n const providerProps = useMemo<ShellPanelControlProps>(\n () => ({\n open,\n onOpenChange: setOpen,\n openMobile,\n onOpenMobileChange: setOpenMobile,\n }),\n [open, openMobile, setOpen, setOpenMobile]\n )\n\n return {\n open,\n openMobile,\n setOpen,\n setOpenMobile,\n toggle,\n providerProps,\n }\n}\n","import { forwardRef, type HTMLAttributes } from \"react\"\nimport { cn } from \"@/lib/utils\"\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","import { forwardRef, type HTMLAttributes } from \"react\"\nimport { cn } from \"@/lib/utils\"\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","import { forwardRef, type HTMLAttributes } from \"react\"\nimport { cn } from \"@/lib/utils\"\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","import { forwardRef, type HTMLAttributes } from \"react\"\nimport { cn } from \"@/lib/utils\"\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","import { forwardRef, type HTMLAttributes } from \"react\"\nimport { cn } from \"@/lib/utils\"\nimport { useAnimatedSidebarPanel } from \"./utils\"\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","import { forwardRef, type HTMLAttributes } from \"react\"\nimport { cn } from \"@/lib/utils\"\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","\"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","import { forwardRef, type HTMLAttributes, type Ref } from \"react\"\nimport { SharedLayoutBg } from \"@/components/motion/shared-layout-bg\"\nimport { cn } from \"@/lib/utils\"\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 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(\"flex w-full min-w-0 list-none flex-col gap-0.5\", className)}\n >\n {children}\n </SharedLayoutBg>\n )\n})\n","import { forwardRef } from \"react\"\nimport { motion, type HTMLMotionProps } from \"motion/react\"\nimport { SPRING_LAYOUT } from \"@/lib/ease\"\nimport { cn } from \"@/lib/utils\"\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","import { forwardRef } from \"react\"\nimport { AnimatePresence, motion } from \"motion/react\"\nimport { cn } from \"@/lib/utils\"\nimport type { AnimatedSidebarMenuSubProps } from \"./type\"\nimport {\n SUBMENU_VARIANTS,\n useAnimatedSidebar,\n useAnimatedSidebarPanel,\n} from \"./utils\"\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","import { forwardRef } from \"react\"\nimport { motion, type HTMLMotionProps } from \"motion/react\"\nimport { cn } from \"@/lib/utils\"\nimport { SUBMENU_ITEM_VARIANTS } from \"./utils\"\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","import type * as React from \"react\"\nimport { motion } from \"motion/react\"\nimport { SPRING_PRESS } from \"@/lib/ease\"\nimport { cn } from \"@/lib/utils\"\nimport type { AnimatedSidebarMenuSubButtonProps } from \"./type\"\nimport { useAnimatedSidebar, useAnimatedSidebarPanel } from \"./utils\"\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 const panel = useAnimatedSidebarPanel()\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) {\n context.setOpenMobile(false, panel.side)\n }\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","import type * as React from \"react\"\nimport { ChevronRight } from \"lucide-react\"\nimport { motion } from \"motion/react\"\nimport { SPRING_LAYOUT, SPRING_PRESS } from \"@/lib/ease\"\nimport { cn } from \"@/lib/utils\"\nimport type { AnimatedSidebarMenuButtonProps } from \"./type\"\nimport {\n LABEL_ENTER_TRANSITION,\n LABEL_EXIT_TRANSITION,\n REDUCED_TRANSITION,\n useAnimatedSidebar,\n useAnimatedSidebarPanel,\n} from \"./utils\"\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, panel.side)\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 type { IRowProps, ISidebarNavItem, ISidebarNavSubItem } from \"@/components/blocks/nav/types\"\nimport { isActive } from \"@/components/blocks/nav/utils\"\nimport {\n AnimatedSidebarMenuButton,\n AnimatedSidebarMenuItem,\n AnimatedSidebarMenuSub,\n AnimatedSidebarMenuSubButton,\n AnimatedSidebarMenuSubItem,\n} from \"@/components/blocks/shell\"\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}\n","\"use client\"\n\nimport { PanelLeftIcon } from \"lucide-react\"\nimport * as React from \"react\"\n\nimport {\n AnimatedPanel as AnimatedSidebar,\n AnimatedPanelProvider as AnimatedSidebarProvider,\n AnimatedPanelTrigger as AnimatedSidebarTrigger,\n AnimatedSidebarContent,\n AnimatedSidebarFooter,\n AnimatedSidebarGroup,\n AnimatedSidebarGroupContent,\n AnimatedSidebarGroupLabel,\n AnimatedSidebarHeader,\n AnimatedSidebarMenu,\n} from \"@/components/blocks/shell\"\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 `AnimatedPanel*` 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. The\n // block is a single panel, so its scalar open props map onto the\n // provider's side-keyed records under the block's own `side`.\n className=\"h-full min-h-0 w-auto\"\n defaultOpen={{ [side]: defaultOpen ?? true }}\n defaultOpenMobile={\n defaultOpenMobile === undefined ? undefined : { [side]: defaultOpenMobile }\n }\n onOpenChange={(nextOpen, changedSide) => {\n if (changedSide === side) onOpenChange?.(nextOpen)\n }}\n onOpenMobileChange={(nextOpen, changedSide) => {\n if (changedSide === side) onOpenMobileChange?.(nextOpen)\n }}\n open={open === undefined ? undefined : { [side]: open }}\n openMobile={openMobile === undefined ? undefined : { [side]: 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","import type { ClassNameValue } from \"tailwind-merge\"\nimport type { TSubPanelVariant } from \"@/components/blocks/scaffold/type.ts\"\n\n/** Desktop backdrop the whole scaffold sits on — a soft warm-gray wash. */\nexport const scaffoldBackgroundClass: ClassNameValue =\n \"bg-linear-to-tr/increasing from-neutral-400 via-stone-200 to-neutral-300 dark:from-neutral-900 dark:via-neutral-950 dark:to-stone-950\"\n\n/** Card surface shared by a panel's primary area and secondary strip. */\nexport const panelSurfaceClass: ClassNameValue =\n \"rounded-2xl bg-slate-100 inset-ring-1 inset-ring-white/60 dark:bg-neutral-900 dark:inset-ring-white/5\"\n\n/** Floating icon button hovering over a panel (close, swap). */\nexport const floatingButtonClass: ClassNameValue =\n \"transition-[opacity,scale,box-shadow] duration-200 ease-smooth-out hover:text-neutral-900 hover:shadow-md active:scale-97 dark:bg-neutral-800/95 dark:text-neutral-300 dark:inset-ring-white/10 dark:hover:text-white motion-reduce:transition-none motion-reduce:active:scale-100 z-20\"\n\n/** Hidden until the pointer rests on the panel (always shown for touch and\n * while focused) — the affordances stay quiet until the panel is engaged. */\nexport const revealOnPanelHoverClass: ClassNameValue =\n \"opacity-0 scale-95 group-hover/panel:opacity-100 group-hover/panel:scale-100 focus-visible:opacity-100 focus-visible:scale-100 pointer-coarse:opacity-100 pointer-coarse:scale-100\"\n\n/** Pill segment inside the actions cluster (Add, browse). */\nexport const actionSegmentClass: ClassNameValue =\n \"flex h-[30px] items-center rounded-full text-neutral-700 transition-[background-color,color,scale,box-shadow] duration-150 ease-smooth-out hover:bg-white hover:text-neutral-900 hover:shadow-xs active:scale-97 dark:text-neutral-300 dark:hover:bg-neutral-700 dark:hover:text-white motion-reduce:transition-none motion-reduce:active:scale-100\"\n\n/** Map of sub-panel variants to their corresponding side. */\nexport const subPanelVariant: Record<TSubPanelVariant, ClassNameValue> = {\n card: \"bg-neutral-50 dark:bg-neutral-900 rounded-md border-t border-b border-t-white dark:border-t-neutral-700/50 border-b-neutral-900/10 dark:border-b-black/70 shadow-sm shadow-neutral-900/10 dark:shadow-black/50 inset-shadow-sm inset-shadow-white dark:inset-shadow-neutral-800\",\n subtle: \"bg-neutral-100 dark:bg-neutral-800\",\n inset: \"bg-neutral-200 dark:bg-neutral-700\",\n} as const\n","\"use client\"\n\nimport { RiCloseLine } from \"@remixicon/react\"\nimport * as React from \"react\"\n\nimport { cn } from \"@/lib/utils\"\nimport type { PanelFloatingButtonProps } from \"./type\"\nimport { floatingButtonClass, revealOnPanelHoverClass } from \"./utils\"\n\n/** Floating close affordance in a panel's top-right corner. */\nexport function PanelCloseButton({\n onClick,\n label,\n sound = true,\n className,\n}: PanelFloatingButtonProps): React.ReactElement {\n return (\n <button\n id=\"scaffold-panel-close-button\"\n aria-label={label}\n className={cn(\n floatingButtonClass,\n revealOnPanelHoverClass,\n \"absolute top-4 right-3.5 z-10\",\n className\n )}\n data-cuelume-press={sound ? \"\" : undefined}\n data-cuelume-release={sound ? \"\" : undefined}\n data-slot=\"scaffold-panel-close\"\n onClick={onClick}\n type=\"button\"\n >\n <RiCloseLine aria-hidden className=\"size-4\" />\n </button>\n )\n}\n","import { mergeProps } from \"@base-ui/react/merge-props\"\nimport { useRender } from \"@base-ui/react/use-render\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { motion, type HTMLMotionProps } from \"framer-motion\"\n\nimport { cn } from \"@/lib/utils\"\nimport { Separator } from \"@/components/ui/separator\"\n\nconst buttonGroupVariants = cva(\n \"flex w-fit items-stretch *:focus-visible:relative *:focus-visible:z-10 has-[>[data-slot=button-group]]:gap-2 has-[select[aria-hidden=true]:last-child]:[&>[data-slot=select-trigger]:last-of-type]:rounded-r-lg [&>[data-slot=select-trigger]:not([class*='w-'])]:w-fit [&>input]:flex-1\",\n {\n variants: {\n orientation: {\n horizontal:\n \"*:data-slot:rounded-r-none [&>[data-slot]:not(:has(~[data-slot]))]:rounded-r-lg! [&>[data-slot]~[data-slot]]:rounded-l-none [&>[data-slot]~[data-slot]]:border-l-0\",\n vertical:\n \"flex-col *:data-slot:rounded-b-none [&>[data-slot]:not(:has(~[data-slot]))]:rounded-b-lg! [&>[data-slot]~[data-slot]]:rounded-t-none [&>[data-slot]~[data-slot]]:border-t-0\",\n },\n },\n defaultVariants: {\n orientation: \"horizontal\",\n },\n }\n)\n\nfunction ButtonGroup({\n className,\n orientation,\n ...props\n}: HTMLMotionProps<\"div\"> & VariantProps<typeof buttonGroupVariants>) {\n return (\n <motion.div\n role=\"group\"\n data-slot=\"button-group\"\n data-orientation={orientation}\n className={cn(buttonGroupVariants({ orientation }), className)}\n {...props}\n />\n )\n}\n\nfunction ButtonGroupText({\n className,\n render,\n ...props\n}: useRender.ComponentProps<\"div\">) {\n return useRender({\n defaultTagName: \"div\",\n props: mergeProps<\"div\">(\n {\n className: cn(\n \"flex items-center gap-2 rounded-lg border bg-muted px-2.5 text-sm font-medium [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4\",\n className\n ),\n },\n props\n ),\n render,\n state: {\n slot: \"button-group-text\",\n },\n })\n}\n\nfunction ButtonGroupSeparator({\n className,\n orientation = \"vertical\",\n ...props\n}: React.ComponentProps<typeof Separator>) {\n return (\n <Separator\n data-slot=\"button-group-separator\"\n orientation={orientation}\n className={cn(\n \"relative self-stretch bg-input data-horizontal:mx-px data-horizontal:w-auto data-vertical:my-px data-vertical:h-auto\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport {\n ButtonGroup,\n ButtonGroupSeparator,\n ButtonGroupText,\n buttonGroupVariants,\n}\n","\"use client\"\n\nimport {\n type FrostGlassVariantProp,\n glassVariantStyles,\n} from \"@/lib/glass-variants\"\nimport { cn } from \"@/lib/utils\"\n\nimport { ButtonGroup } from \"../button-group\"\nimport { LiquidGlass } from \"./liquid-glass\"\n\ntype GlassButtonGroupProps = React.ComponentProps<typeof ButtonGroup> &\n FrostGlassVariantProp\n\nfunction GlassButtonGroup({\n className,\n glassVariant = \"liquid-refract\",\n children,\n ...props\n}: GlassButtonGroupProps) {\n if (glassVariant === \"liquid-refract\") {\n return (\n <LiquidGlass className={cn(\"\", className)}>\n <ButtonGroup\n data-slot=\"glass-button-group\"\n data-glass-variant={glassVariant}\n className={cn(\"bg-transparent\", className)}\n {...props}\n >\n {children}\n </ButtonGroup>\n </LiquidGlass>\n )\n }\n\n return (\n <ButtonGroup\n data-slot=\"glass-button-group\"\n data-glass-variant={glassVariant}\n className={cn(\"rounded-lg\", glassVariantStyles[glassVariant], className)}\n {...props}\n >\n {children}\n </ButtonGroup>\n )\n}\n\nexport { GlassButtonGroup }\n","\"use client\";\n\nimport { useEffect, useState } from \"react\";\n\n/**\n * Returns true only on devices that have a true hover (mouse / trackpad).\n * Touch devices fire phantom `:hover` on tap that sticks until tap-elsewhere\n * — gate hover-only effects (scale lifts, magnetic pulls) behind this.\n */\nexport function useHoverCapable() {\n const [canHover, setCanHover] = useState(false);\n\n useEffect(() => {\n if (typeof window === \"undefined\" || !window.matchMedia) return;\n const mq = window.matchMedia(\"(hover: hover) and (pointer: fine)\");\n const update = () => setCanHover(mq.matches);\n update();\n mq.addEventListener?.(\"change\", update);\n return () => mq.removeEventListener?.(\"change\", update);\n }, []);\n\n return canHover;\n}\n","/** Icon-rail width in px (the rail sits directly on the desktop backdrop). */\nexport const SCAFFOLD_SIDEBAR_WIDTH = 64\n\n/** Inspector drawer width in px. */\nexport const SCAFFOLD_INSPECTOR_WIDTH = 272\n\n/** Gap in px between the drawer/actions and the viewport edges. */\nexport const SCAFFOLD_EDGE_GUTTER = 10\n\n/** Vertical room in px reserved above the canvas for the actions cluster. */\nexport const SCAFFOLD_HEADER_HEIGHT = 52\n\n/** Height in px of a panel's secondary strip. */\nexport const SCAFFOLD_SECONDARY_HEIGHT = 52\n\n/** Gap in px between a panel's primary surface and its secondary strip. */\nexport const SCAFFOLD_PANEL_GAP = 10\n\n/** How long the seam menu lingers expanded after the pointer leaves it (ms)\n * before it collapses back to the compact toggle. The timer keeps counting\n * even when the pointer leaves the window entirely. */\nexport const SCAFFOLD_MENU_COLLAPSE_DELAY = 4000\n\n/** Morph duration in seconds for drawer slides and panel layout shifts. */\nexport const SCAFFOLD_MORPH_DURATION = 0.3\n\n/** `--ease-smooth-out` as a motion/react easing tuple. */\nexport const SCAFFOLD_EASE = [0.22, 1, 0.36, 1] as const\n","\"use client\"\n\nimport * as React from \"react\"\n\nimport {\n AnimatePresence,\n motion,\n useReducedMotion,\n type Variants,\n} from \"motion/react\"\nimport { More } from \"iconsax-reactjs\"\nimport { LucideArrowUpDown, LucideChevronDown } from \"lucide-react\"\n\nimport { cn } from \"@/lib/utils\"\nimport type { PanelMenuButtonProps } from \"./type\"\nimport { floatingButtonClass, revealOnPanelHoverClass } from \"./utils\"\nimport { Button } from \"@/components/ui/button\";\nimport { GlassButtonGroup } from \"@/components/ui/glasscn/glass-button-group.tsx\"\nimport { EASE_OUT, SPRING_LAYOUT } from \"@/lib/ease.ts\"\nimport { useHoverCapable } from \"@/lib/hooks/use-hover-capable\"\nimport { SCAFFOLD_MENU_COLLAPSE_DELAY } from \"./constants\"\n\n/** Menu segments blur/fade in place while the track morphs around them. The\n * exit is a fast tween, not the layout spring — the track stays\n * overflow-visible, so the popped-out buttons must be gone before the\n * collapsing pill leaves them behind as a ghost. */\nconst MENU_SEGMENT_VARIANTS: Variants = {\n hidden: { opacity: 0, filter: \"blur(4px)\" },\n visible: { opacity: 1, filter: \"blur(0px)\" },\n exit: {\n opacity: 0,\n filter: \"blur(4px)\",\n transition: { duration: 0.18, ease: EASE_OUT },\n },\n}\n\n/**\n * Floating swap affordance centered on the seam between a panel's primary\n * surface and its secondary strip.\n */\nexport function PanelMenuButton({\n onClick,\n onExpand,\n secondaryExpanded = false,\n label,\n sound = true,\n className,\n}: PanelMenuButtonProps): React.ReactElement {\n\n const reduce = useReducedMotion()\n const canHover = useHoverCapable()\n const actionsId = React.useId()\n const groupRef = React.useRef<HTMLDivElement>(null)\n const actionsRef = React.useRef<HTMLDivElement>(null)\n const actionsLeftRef = React.useRef(0)\n const [expanded, setExpanded] = React.useState(false);\n\n const transition = reduce ? { duration: 0 } : SPRING_LAYOUT\n\n const collapseTimerRef = React.useRef<ReturnType<typeof setTimeout>>(undefined)\n const suppressHoverOpenUntilRef = React.useRef(0)\n const focusActionsOnOpenRef = React.useRef(false)\n\n React.useEffect(() => () => clearTimeout(collapseTimerRef.current), [])\n\n const cancelCollapse = React.useCallback(() => {\n clearTimeout(collapseTimerRef.current)\n }, [])\n\n // Arms when the pointer stops hovering the group: the menu lingers for the\n // grace period, then collapses — unless the pointer (or focus) came back.\n const armCollapse = React.useCallback(() => {\n if (!canHover) return\n clearTimeout(collapseTimerRef.current)\n collapseTimerRef.current = setTimeout(() => {\n // Focus keeps the menu open — don't collapse under the keyboard.\n if (groupRef.current?.contains(document.activeElement)) return\n setExpanded(false)\n }, SCAFFOLD_MENU_COLLAPSE_DELAY)\n }, [canHover])\n\n // The grace period must keep counting when the pointer leaves the whole\n // app — leaving the window can skip the group's own pointerleave, so arm\n // on viewport exit and window blur as well.\n React.useEffect(() => {\n if (!expanded || !canHover) return\n const root = document.documentElement\n root.addEventListener(\"pointerleave\", armCollapse)\n window.addEventListener(\"blur\", armCollapse)\n return () => {\n root.removeEventListener(\"pointerleave\", armCollapse)\n window.removeEventListener(\"blur\", armCollapse)\n }\n }, [expanded, canHover, armCollapse])\n\n // Click-opens replace the toggle with the actions — hand focus over so\n // keyboard users aren't dropped onto <body>.\n React.useEffect(() => {\n if (!expanded || !focusActionsOnOpenRef.current) return\n focusActionsOnOpenRef.current = false\n actionsRef.current?.querySelector<HTMLButtonElement>(\"button\")?.focus()\n }, [expanded])\n\n const collapse = () => {\n // The shrinking toggle can glide under a resting cursor and hover-reopen\n // the menu it just closed — ignore hover-opens until it has settled.\n suppressHoverOpenUntilRef.current = Date.now() + 600\n setExpanded(false)\n }\n\n // Acting collapses the menu — the pill returns to the compact toggle.\n const handleAction = (action?: () => void) => {\n action?.()\n collapse()\n }\n\n // Click open — the touch and keyboard path.\n const handleOnExpand = () => {\n if (groupRef.current?.contains(document.activeElement)) {\n focusActionsOnOpenRef.current = true\n }\n setExpanded(true)\n }\n\n // Hover on the toggle opens the menu (hover-capable devices only — touch\n // and keyboard go through the click toggle).\n const handleToggleHover = () => {\n if (!canHover || Date.now() < suppressHoverOpenUntilRef.current) return\n cancelCollapse()\n setExpanded(true)\n }\n\n // popLayout pops the exiting actions group out of the flow — pin it back to\n // where it sat so it stays visually attached to the toggle while leaving.\n React.useLayoutEffect(() => {\n const actionsNode = actionsRef.current\n if (!actionsNode) return\n\n if (!expanded) {\n actionsNode.style.left = `${\n actionsLeftRef.current - actionsNode.getBoundingClientRect().left\n }px`\n return\n }\n\n actionsNode.style.left = \"\"\n actionsLeftRef.current = actionsNode.getBoundingClientRect().left\n }, [expanded])\n\n return (\n <GlassButtonGroup\n ref={groupRef}\n layout\n transition={transition}\n onPointerEnter={cancelCollapse}\n onPointerLeave={armCollapse}\n glassVariant=\"subtle\"\n className={cn(\n floatingButtonClass,\n revealOnPanelHoverClass,\n // Centered on the seam: secondary height (52px) + half the 10px gap.\n \"absolute top-1/2 z-10 -translate-y-1/2 overflow-visible!\",\n className\n )}\n >\n <AnimatePresence mode=\"popLayout\" initial={false}>\n {expanded ? (\n <motion.div\n key=\"menu-actions\"\n ref={actionsRef}\n id={actionsId}\n layout\n variants={MENU_SEGMENT_VARIANTS}\n initial={reduce ? { opacity: 0 } : \"hidden\"}\n animate={reduce ? { opacity: 1 } : \"visible\"}\n exit={reduce ? { opacity: 0 } : \"exit\"}\n transition={transition}\n className=\"relative flex w-max items-stretch\"\n >\n <Button\n id=\"scaffold-panel-menu-expand\"\n size=\"sm\"\n variant=\"ghost\"\n sound={sound}\n data-slot=\"scaffold-panel-menu-swap\"\n // The motion wrapper hides these from the group's corner\n // selectors — restore what ButtonGroup would have applied.\n className=\"rounded-r-none\"\n onClick={() => handleAction(onExpand)}\n >\n {/* Button's [&_svg]:transition-transform eases the flip. */}\n <LucideChevronDown\n size={16}\n className={cn(secondaryExpanded && \"rotate-180\")}\n />\n Expand\n </Button>\n <Button\n id=\"scaffold-panel-menu-swap\"\n size=\"sm\"\n variant=\"ghost\"\n sound={sound}\n data-slot=\"scaffold-panel-menu-swap\"\n className=\"rounded-l-none border-l-0\"\n onClick={() => handleAction(onClick)}\n >\n <LucideArrowUpDown size={16} />\n Swap\n </Button>\n </motion.div>\n ) : (\n <motion.div\n key=\"menu-toggle\"\n layout\n variants={MENU_SEGMENT_VARIANTS}\n initial={reduce ? { opacity: 0 } : \"hidden\"}\n animate={reduce ? { opacity: 1 } : \"visible\"}\n exit={reduce ? { opacity: 0 } : \"exit\"}\n transition={transition}\n className=\"flex shrink-0\"\n >\n <Button\n id=\"scaffold-panel-menu-toggle-button\"\n aria-label={label}\n aria-expanded={expanded}\n size=\"icon-sm\"\n variant=\"ghost\"\n sound={sound}\n data-slot=\"scaffold-panel-menu-toggle\"\n onClick={handleOnExpand}\n onPointerEnter={handleToggleHover}\n >\n <More size={16} />\n </Button>\n </motion.div>\n )}\n </AnimatePresence>\n </GlassButtonGroup>\n )\n}\n","\"use client\"\n\nimport * as React from \"react\"\n\nimport type { ScaffoldContextValue } from \"./type\"\n\nexport const ScaffoldContext = React.createContext<ScaffoldContextValue | null>(\n null\n)\n\n/** Read the scaffold's shared state; must run under `Scaffold.Root`. */\nexport function useScaffoldContext(): ScaffoldContextValue {\n const context = React.useContext(ScaffoldContext)\n if (!context) {\n throw new Error(\"useScaffoldContext must be used within <Scaffold.Root>\")\n }\n return context\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 { Separator } from \"@/components/ui/separator\"\nimport { cn } from \"@/lib/utils\"\n\nexport const groupVariants = cva(\n \"flex w-fit *:focus-visible:z-1 *:has-focus-visible:z-1 has-[>[data-slot=group]]:gap-2 dark:*:[[data-slot=separator]:has(~button:hover):not(:has(~[data-slot=separator]~[data-slot]:hover)),[data-slot=separator]:has(~[data-slot][data-pressed]):not(:has(~[data-slot=separator]~[data-slot][data-pressed]))]:before:bg-input/64 dark:*:[button:hover~[data-slot=separator]:not([data-slot]:hover~[data-slot=separator]~[data-slot=separator]),[data-slot][data-pressed]~[data-slot=separator]:not([data-slot][data-pressed]~[data-slot=separator]~[data-slot=separator])]:before:bg-input/64\",\n {\n defaultVariants: {\n orientation: \"horizontal\",\n },\n variants: {\n orientation: {\n horizontal:\n \"*:data-slot:has-[~[data-slot]]:rounded-e-none *:data-slot:has-[~[data-slot]]:border-e-0 *:data-slot:has-[~[data-slot]]:before:rounded-e-none *:data-slot:not-data-[slot=separator]:has-[~[data-slot]]:before:-end-[0.5px] *:pointer-coarse:after:min-w-auto *:[[data-slot]~[data-slot]]:rounded-s-none *:[[data-slot]~[data-slot]]:border-s-0 *:[[data-slot]~[data-slot]]:before:rounded-s-none *:[[data-slot]~[data-slot]:not([data-slot=separator])]:before:-start-[0.5px]\",\n vertical:\n \"flex-col *:data-slot:has-[~[data-slot]]:rounded-b-none *:data-slot:has-[~[data-slot]]:border-b-0 *:data-slot:has-[~[data-slot]]:before:rounded-b-none *:data-slot:not-data-[slot=separator]:has-[~[data-slot]]:before:-bottom-[0.5px] *:data-slot:not-data-[slot=separator]:has-[~[data-slot]]:before:hidden dark:*:first:before:block dark:*:last:before:hidden *:pointer-coarse:after:min-h-auto *:[[data-slot]~[data-slot]]:rounded-t-none *:[[data-slot]~[data-slot]]:border-t-0 *:[[data-slot]~[data-slot]]:before:rounded-t-none *:[[data-slot]~[data-slot]:not([data-slot=separator])]:before:-top-[0.5px]\",\n },\n },\n }\n)\n\nexport function Group({\n className,\n orientation,\n children,\n ...props\n}: {\n className?: string\n orientation?: VariantProps<typeof groupVariants>[\"orientation\"]\n children: React.ReactNode\n} & React.ComponentProps<\"div\">): React.ReactElement {\n return (\n <div\n className={cn(groupVariants({ orientation }), className)}\n data-orientation={orientation}\n data-slot=\"group\"\n role=\"group\"\n {...props}\n >\n {children}\n </div>\n )\n}\n\nexport function GroupText({\n className,\n render,\n ...props\n}: useRender.ComponentProps<\"div\">): React.ReactElement {\n const defaultProps = {\n className: cn(\n \"relative inline-flex items-center gap-2 rounded-lg border border-input bg-muted px-[calc(--spacing(3)-1px)] text-base whitespace-nowrap text-muted-foreground shadow-xs/5 transition-shadow outline-none not-dark:bg-clip-padding before:pointer-events-none before:absolute before:inset-0 before:rounded-[calc(var(--radius-lg)-1px)] before:shadow-[0_1px_--theme(--color-black/6%)] sm:text-sm dark:bg-input/64 dark:before:shadow-[0_-1px_--theme(--color-white/6%)] [&_svg]:-mx-0.5 [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4.5 sm:[&_svg:not([class*='size-'])]:size-4\",\n className\n ),\n \"data-slot\": \"group-text\",\n }\n return useRender({\n defaultTagName: \"div\",\n props: mergeProps(defaultProps, props),\n render,\n })\n}\n\nexport function GroupSeparator({\n className,\n orientation = \"vertical\",\n ...props\n}: {\n className?: string\n} & React.ComponentProps<typeof Separator>): React.ReactElement {\n return (\n <Separator\n className={cn(\n \"pointer-events-none relative z-2 bg-input before:absolute before:inset-0 has-[+[data-slot=input-control]:focus-within,+[data-slot=input-group]:focus-within,+[data-slot=select-trigger]:focus-visible+*,+[data-slot=number-field]:focus-within]:translate-x-px has-[+[data-slot=input-control]:focus-within,+[data-slot=input-group]:focus-within,+[data-slot=select-trigger]:focus-visible+*,+[data-slot=number-field]:focus-within]:bg-ring dark:before:bg-input/32 [[data-slot=input-control]:focus-within+&,[data-slot=input-group]:focus-within+&,[data-slot=select-trigger]:focus-visible+*+&,[data-slot=number-field]:focus-within+&,[data-slot=number-field]:focus-within+input+&]:bg-ring [[data-slot=input-control]:focus-within+&,[data-slot=input-group]:focus-within+&,[data-slot=select-trigger]:focus-visible+*+&,[data-slot=number-field]:focus-within+input+&]:-translate-x-px\",\n className\n )}\n orientation={orientation}\n {...props}\n />\n )\n}\n\nexport {\n Group as ButtonGroup,\n GroupText as ButtonGroupText,\n GroupSeparator as ButtonGroupSeparator,\n}\n","\"use client\"\n\nimport { motion, useReducedMotion } from \"motion/react\"\nimport * as React from \"react\"\n\nimport { cn } from \"@/lib/utils\"\nimport { SCAFFOLD_EASE, SCAFFOLD_EDGE_GUTTER, SCAFFOLD_MORPH_DURATION } from \"./constants\"\nimport { useScaffoldContext } from \"./scaffold-context\"\nimport type { ScaffoldActionsProps } from \"./type\"\nimport { actionSegmentClass } from \"./utils\"\nimport { GroupSeparator } from \"@/components/ui/group\"\nimport { GlassButtonGroup } from \"@/components/ui/glasscn/glass-button-group\"\nimport { Button } from \"@/components/ui/button\";\nimport { LucidePlus } from \"lucide-react\"\n\n/**\n * The floating pill cluster in the main region's top-right corner — the\n * design's \"Panel Context Menu\": an Add segment plus an overflow segment\n * whose badge counts the non-visible panels. Slides left in step with the\n * inspector opening.\n */\nexport function ScaffoldActions({\n onAdd,\n addLabel = \"Panel\",\n addIcon,\n overflowCount,\n onBrowse,\n browseLabel = \"Browse panels\",\n sound = true,\n className,\n children,\n ...rest\n}: ScaffoldActionsProps): React.ReactElement {\n const { inspectorOpen, inspectorWidth } = useScaffoldContext()\n const reducedMotion = useReducedMotion()\n\n const soundProps = {\n \"data-cuelume-press\": sound ? \"\" : undefined,\n \"data-cuelume-release\": sound ? \"\" : undefined,\n }\n const showBrowse = overflowCount !== undefined || onBrowse !== undefined\n\n return (\n <motion.div\n id=\"scaffold-actions\"\n animate={{\n x: inspectorOpen ? -(inspectorWidth + SCAFFOLD_EDGE_GUTTER) : 0,\n }}\n className={cn(\n \"sticky inline-flex items-center gap-0.5 h-12\",\n \"justify-end\",\n className\n )}\n data-slot=\"scaffold-actions\"\n initial={false}\n transition={{\n duration: reducedMotion ? 0 : SCAFFOLD_MORPH_DURATION,\n ease: SCAFFOLD_EASE,\n }}\n {...rest}\n >\n {children}\n <GlassButtonGroup glassVariant=\"liquid-refract\" className=\"rounded-md\">\n <Button\n onClick={onAdd}\n size=\"sm\"\n variant=\"ghost\"\n >\n {addIcon ?? <LucidePlus className=\"stroke-3\" />}\n {addLabel}\n </Button>\n {!showBrowse && <GroupSeparator />}\n {showBrowse && (\n <button\n aria-label={browseLabel}\n className={cn(actionSegmentClass, \"gap-0.5 px-2\")}\n onClick={onBrowse}\n type=\"button\"\n {...soundProps}\n >\n <span className=\"relative\">\n\n {overflowCount !== undefined && overflowCount > 0 && (\n <span className=\"absolute -top-1.5 -right-1.5 flex size-3.5 items-center justify-center rounded-full bg-neutral-700 text-[9px] font-semibold text-white dark:bg-neutral-200 dark:text-neutral-900\">\n {overflowCount}\n </span>\n )}\n </span>\n\n </button>\n )}\n\n {children}\n </GlassButtonGroup>\n </motion.div>\n )\n}\n","\"use client\"\n\nimport { AnimatePresence } from \"motion/react\"\nimport * as React from \"react\"\n\nimport { cn } from \"@/lib/utils\"\nimport type { ScaffoldCanvasProps } from \"./type\"\n\n/**\n * The panel row below the action cluster: 8px gutters, 8px gaps, panels\n * side by side. Key each `Scaffold.Panel` child so closes animate out.\n */\nexport function ScaffoldCanvas({\n className,\n children,\n ...rest\n}: ScaffoldCanvasProps): React.ReactElement {\n return (\n <div\n className={cn(\"relative flex w-full flex-1 gap-2\", className)}\n data-slot=\"scaffold-canvas\"\n {...rest}\n >\n <AnimatePresence initial={false} mode=\"popLayout\">\n {children}\n </AnimatePresence>\n </div>\n )\n}\n","\"use client\"\n\nimport * as React from \"react\"\n\nimport {\n type FrostGlassVariant,\n type FrostGlassVariantProp,\n glassVariantStyles,\n} from \"@/lib/glass-variants\"\nimport { cn } from \"@/lib/utils\"\nimport { LiquidGlass } from \"./liquid-glass\"\n\nconst glassSidebarVariableStyles: Record<FrostGlassVariant, string> = {\n clear: [\n \"[--sidebar:rgba(255,255,255,0.18)]\",\n \"[--sidebar-foreground:oklch(0.145_0_0)]\",\n \"[--sidebar-accent:rgba(255,255,255,0.48)]\",\n \"[--sidebar-accent-foreground:oklch(0.145_0_0)]\",\n \"[--sidebar-border:rgba(255,255,255,0.34)]\",\n \"[--sidebar-ring:rgba(255,255,255,0.38)]\",\n \"dark:[--sidebar:rgba(0,0,0,0.28)]\",\n \"dark:[--sidebar-foreground:oklch(0.985_0_0)]\",\n \"dark:[--sidebar-accent:rgba(255,255,255,0.1)]\",\n \"dark:[--sidebar-accent-foreground:oklch(0.985_0_0)]\",\n \"dark:[--sidebar-border:rgba(255,255,255,0.12)]\",\n \"dark:[--sidebar-ring:rgba(255,255,255,0.16)]\",\n ].join(\" \"),\n frosted: [\n \"[--sidebar:rgba(255,255,255,0.4)]\",\n \"[--sidebar-foreground:oklch(0.145_0_0)]\",\n \"[--sidebar-accent:rgba(255,255,255,0.62)]\",\n \"[--sidebar-accent-foreground:oklch(0.145_0_0)]\",\n \"[--sidebar-border:rgba(255,255,255,0.3)]\",\n \"[--sidebar-ring:rgba(255,255,255,0.32)]\",\n \"dark:[--sidebar:rgba(0,0,0,0.38)]\",\n \"dark:[--sidebar-foreground:oklch(0.985_0_0)]\",\n \"dark:[--sidebar-accent:rgba(255,255,255,0.14)]\",\n \"dark:[--sidebar-accent-foreground:oklch(0.985_0_0)]\",\n \"dark:[--sidebar-border:rgba(255,255,255,0.1)]\",\n \"dark:[--sidebar-ring:rgba(255,255,255,0.14)]\",\n ].join(\" \"),\n subtle: [\n \"[--sidebar:rgba(255,255,255,0.14)]\",\n \"[--sidebar-foreground:oklch(0.145_0_0)]\",\n \"[--sidebar-accent:rgba(255,255,255,0.28)]\",\n \"[--sidebar-accent-foreground:oklch(0.145_0_0)]\",\n \"[--sidebar-border:rgba(0,0,0,0.05)]\",\n \"[--sidebar-ring:rgba(255,255,255,0.28)]\",\n \"dark:[--sidebar:rgba(255,255,255,0.05)]\",\n \"dark:[--sidebar-foreground:oklch(0.985_0_0)]\",\n \"dark:[--sidebar-accent:rgba(255,255,255,0.08)]\",\n \"dark:[--sidebar-accent-foreground:oklch(0.985_0_0)]\",\n \"dark:[--sidebar-border:rgba(255,255,255,0.08)]\",\n \"dark:[--sidebar-ring:rgba(255,255,255,0.12)]\",\n ].join(\" \"),\n liquid: [\n \"[--sidebar:rgba(255,255,255,0.22)]\",\n \"[--sidebar-foreground:oklch(0.145_0_0)]\",\n \"[--sidebar-accent:rgba(255,255,255,0.55)]\",\n \"[--sidebar-accent-foreground:oklch(0.145_0_0)]\",\n \"[--sidebar-border:rgba(255,255,255,0.42)]\",\n \"[--sidebar-ring:rgba(255,255,255,0.45)]\",\n \"dark:[--sidebar:rgba(255,255,255,0.06)]\",\n \"dark:[--sidebar-foreground:oklch(0.985_0_0)]\",\n \"dark:[--sidebar-accent:rgba(255,255,255,0.12)]\",\n \"dark:[--sidebar-accent-foreground:oklch(0.985_0_0)]\",\n \"dark:[--sidebar-border:rgba(255,255,255,0.16)]\",\n \"dark:[--sidebar-ring:rgba(255,255,255,0.20)]\",\n ].join(\" \"),\n \"liquid-refract\": [\n \"[--sidebar:rgba(255,255,255,0.18)]\",\n \"[--sidebar-foreground:oklch(0.145_0_0)]\",\n \"[--sidebar-accent:rgba(255,255,255,0.48)]\",\n \"[--sidebar-accent-foreground:oklch(0.145_0_0)]\",\n \"[--sidebar-border:rgba(255,255,255,0.34)]\",\n \"[--sidebar-ring:rgba(255,255,255,0.38)]\",\n \"dark:[--sidebar-foreground:oklch(0.985_0_0)]\",\n \"dark:[--sidebar-accent:rgba(255,255,255,0.12)]\",\n \"dark:[--sidebar-accent-foreground:oklch(0.985_0_0)]\",\n \"dark:[--sidebar-border:rgba(255,255,255,0.15)]\",\n \"dark:[--sidebar-ring:rgba(255,255,255,0.18)]\",\n ].join(\" \"),\n}\n\ntype GlassSidebarProps = React.HTMLAttributes<HTMLDivElement> &\n FrostGlassVariantProp\n\nfunction getGlassSidebarStandaloneClasses(glassVariant: FrostGlassVariant) {\n return cn(\n glassVariantStyles[glassVariant],\n glassSidebarVariableStyles[glassVariant],\n \"overflow-hidden\",\n \"shadow-[0_24px_80px_rgba(15,23,42,0.08)] dark:shadow-[0_24px_80px_rgba(0,0,0,0.28)]\"\n )\n}\n\nfunction GlassContainer({\n glassVariant = \"liquid-refract\",\n className,\n children,\n ...props\n}: GlassSidebarProps) {\n return (\n <LiquidGlass\n className={cn(\"rounded-[1.75rem]\", className)}\n blur={5}\n refraction={50}\n >\n <div\n className={cn(\n getGlassSidebarStandaloneClasses(glassVariant),\n glassVariant === \"liquid-refract\" &&\n \"border-0 bg-transparent shadow-none\",\n className\n )}\n {...props}\n >\n {children}\n </div>\n </LiquidGlass>\n )\n}\n\nexport { GlassContainer, glassSidebarVariableStyles }\nexport type { FrostGlassVariant } from \"@/lib/glass-variants\"\n","\"use client\"\n\nimport { motion, useReducedMotion } from \"motion/react\"\nimport * as React from \"react\"\n\nimport { cn } from \"@/lib/utils\"\nimport { SCAFFOLD_EASE, SCAFFOLD_EDGE_GUTTER, SCAFFOLD_MORPH_DURATION } from \"./constants\"\nimport { useScaffoldContext } from \"./scaffold-context\"\nimport type { ScaffoldInspectorProps } from \"./type\"\nimport { GlassContainer } from \"@/components/ui/glasscn/glass-container.tsx\"\n\n/**\n * The right-hand drawer: a brighter card that slides in over the canvas,\n * inset from the viewport edges. Open state lives on `Scaffold.Root` (or\n * `useScaffold().providerProps`); the drawer stays mounted so it can slide\n * back out.\n */\nexport function ScaffoldInspector({\n children,\n name = \"Inspector\",\n className,\n ...rest\n}: ScaffoldInspectorProps): React.ReactElement {\n const { inspectorOpen, inspectorWidth } = useScaffoldContext()\n const reducedMotion = useReducedMotion()\n\n // Slide fully past the edge gutter and the drop shadow's blur radius.\n const offcanvasX = inspectorWidth + SCAFFOLD_EDGE_GUTTER + 12\n\n return (\n <motion.aside\n id=\"scaffold-inspector\"\n animate={{ x: inspectorOpen ? 0 : offcanvasX }}\n aria-hidden={inspectorOpen ? undefined : true}\n aria-label={name}\n className={cn(\n \"absolute right-0 w-80 z-20 my-2 flex h-full max-h-[calc(100%-1rem)] flex-col\",\n !inspectorOpen && \"pointer-events-none\",\n className\n )}\n data-slot=\"scaffold-inspector\"\n inert={inspectorOpen ? undefined : true}\n initial={false}\n role=\"complementary\"\n style={{ width: inspectorWidth }}\n transition={{\n duration: reducedMotion ? 0 : SCAFFOLD_MORPH_DURATION,\n ease: SCAFFOLD_EASE,\n }}\n {...rest}\n >\n <GlassContainer className=\"flex flex-col shadow-inner shadow-md rounded-md flex-1 border-t border-white dark:border-neutral-900 bg-neutral-50/10 dark:bg-black/10\" glassVariant=\"subtle\">\n {children}\n </GlassContainer>\n </motion.aside>\n )\n}\n","\"use client\"\n\nimport * as React from \"react\"\n\nimport { cn } from \"@/lib/utils\"\nimport type { ScaffoldMainProps } from \"./type\"\n\n/**\n * The region right of the rail. Hosts `Scaffold.Actions` (top-right),\n * `Scaffold.Canvas` and the `Scaffold.Inspector` overlay — all positioned\n * against this box.\n */\nexport function ScaffoldMain({\n className,\n children,\n ...rest\n}: ScaffoldMainProps): React.ReactElement {\n return (\n <div\n id=\"scaffold-main\"\n className={cn(\"relative flex h-full min-w-0 flex-1 flex-col\", className)}\n data-slot=\"scaffold-main\"\n {...rest}\n >\n {children}\n </div>\n )\n}\n","\nimport * as React from \"react\"\nimport { motion, useReducedMotion } from \"framer-motion\"\nimport { cn } from \"@/lib/utils\"\nimport type { ScaffoldSubPanelProps } from \"./type\"\nimport { subPanelVariant } from \"@/components/blocks/scaffold/utils.ts\"\nimport { SCAFFOLD_EASE, SCAFFOLD_MORPH_DURATION } from \"./constants\"\n\nexport function ScaffoldSubPanel({\n className,\n children,\n variant = 'card',\n primary = false,\n expanded,\n ...rest\n }: ScaffoldSubPanelProps): React.ReactElement {\n const reduce = useReducedMotion()\n // The primary card holds the flexible slot unless the panel says otherwise.\n const isExpanded = expanded ?? primary\n\n return (\n <motion.div\n layout={\"size\"}\n id={`scaffold-sub-panel-${variant}`}\n // Grow is animated as a style, not a class flip — a class flip rides the\n // layout FLIP, which scales both cards into a swap-like morph. Animating\n // flex-grow slides only the shared boundary: the collapsed card grows up\n // (or down) while the other is squeezed and cropped in place.\n initial={false}\n animate={{ flexGrow: isExpanded ? 1 : 0 }}\n transition={\n reduce\n ? { duration: 0 }\n : { duration: SCAFFOLD_MORPH_DURATION, ease: SCAFFOLD_EASE }\n }\n className={cn(\n \"flex w-full flex-col\",\n subPanelVariant[variant],\n // basis-14 + clip let the primary squeeze down to the strip height;\n // the strip keeps its natural (basis-auto) height when collapsed.\n primary ? \"basis-14 min-h-14 overflow-clip\" : \"basis-auto min-h-14\",\n className\n )}\n data-slot={`scaffold-sub-panel-${variant}`}\n data-expanded={isExpanded ? \"\" : undefined}\n {...rest}\n >\n {children}\n </motion.div>\n )\n}\n","\"use client\"\n\nimport { motion, useReducedMotion } from \"motion/react\"\nimport * as React from \"react\"\n\nimport { cn } from \"@/lib/utils\"\nimport { SCAFFOLD_EASE, SCAFFOLD_MORPH_DURATION } from \"./constants\"\nimport { PanelCloseButton } from \"./panel-close-button\"\nimport { PanelMenuButton } from \"./panel-menu-button.tsx\"\nimport type { ScaffoldPanelProps, TSubPanelPosition } from \"./type\"\nimport { ScaffoldSubPanel } from \"@/components/blocks/scaffold/scaffold-sub-panel.tsx\"\nimport { useState } from \"react\"\n\n/**\n * A canvas panel: a primary card plus an optional secondary strip below it,\n * separated by a slice of the desktop backdrop. Floating close and swap\n * buttons reveal on hover when their callbacks are provided. Swapping trades\n * the two cards with a layout morph — the strip glides up and grows into the\n * primary slot while the primary card shrinks down into the strip.\n */\nexport function ScaffoldPanel({\n children,\n SecondaryPanel,\n onClose,\n onSwap,\n name,\n closeLabel = \"Close panel\",\n swapLabel = \"Swap panel content\",\n sound = true,\n className,\n}: ScaffoldPanelProps): React.ReactElement {\n\n const reducedMotion = useReducedMotion()\n\n const transition = {\n duration: reducedMotion ? 0 : SCAFFOLD_MORPH_DURATION,\n ease: SCAFFOLD_EASE,\n }\n\n const [subPanelPosition, setSubPanelPosition] = useState<TSubPanelPosition>(\"top\")\n const [isSwapped, setIsSwapped] = useState<boolean>(false)\n const handleSwap = () => {\n setIsSwapped((prev) => !prev);\n onSwap?.();\n };\n\n // Trades which sub-panel holds the flexible slot — the collapsed card grows\n // into `flex-1` while the expanded one shrinks to the `min-h-14` strip.\n const handleExpand = () => {\n setSubPanelPosition((prev) => (prev === \"top\" ? \"bottom\" : \"top\"));\n };\n\n return (\n <motion.section\n id=\"scaffold-panel\"\n animate={{ flexDirection: isSwapped ? \"column-reverse\" : \"column\" }}\n aria-label={name}\n className={cn(\n \"group/panel relative flex min-w-80 flex-1 flex-col\",\n className\n )}\n layout\n data-slot=\"scaffold-panel\"\n data-swapped={isSwapped ? \"\" : undefined}\n transition={transition}\n >\n <ScaffoldSubPanel\n id=\"top\"\n expanded={subPanelPosition === \"top\"}\n primary\n >\n {children}\n </ScaffoldSubPanel>\n {onSwap && SecondaryPanel && (\n <div className=\"relative flex items-center justify-center h-2\">\n <PanelMenuButton\n label={swapLabel}\n onClick={handleSwap}\n onExpand={handleExpand}\n secondaryExpanded={subPanelPosition === \"bottom\"}\n sound={sound}\n />\n </div>\n )}\n {SecondaryPanel && (\n <ScaffoldSubPanel\n id=\"bottom\"\n expanded={subPanelPosition === \"bottom\"}\n >\n {SecondaryPanel}\n </ScaffoldSubPanel>\n )}\n {onClose && (\n <PanelCloseButton label={closeLabel} onClick={onClose} sound={sound} />\n )}\n </motion.section>\n )\n}\n","\"use client\"\n\nimport * as React from \"react\"\n\nimport { cn } from \"@/lib/utils\"\nimport { SCAFFOLD_INSPECTOR_WIDTH } from \"./constants\"\nimport { ScaffoldContext } from \"./scaffold-context\"\nimport type { ScaffoldContextValue, ScaffoldRootProps } from \"./type\"\nimport type { ClassNameValue } from \"tailwind-merge\"\n\n/**\n * The scaffold's viewport: desktop backdrop + horizontal row of rail and\n * main region, and the provider for the shared inspector state. Fills its\n * container — size it from the outside (e.g. `h-svh` for a full page).\n */\nexport function ScaffoldRoot({\n inspectorOpen: inspectorOpenProp,\n defaultInspectorOpen,\n onInspectorOpenChange,\n inspectorWidth = SCAFFOLD_INSPECTOR_WIDTH,\n className,\n children,\n ...rest\n}: ScaffoldRootProps): React.ReactElement {\n const [uncontrolledOpen, setUncontrolledOpen] = React.useState(\n defaultInspectorOpen ?? false\n )\n const inspectorOpen = inspectorOpenProp ?? uncontrolledOpen\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\n const setInspectorOpen = React.useCallback(\n (open: boolean) => {\n if (inspectorOpenProp === undefined) setUncontrolledOpen(open)\n onInspectorOpenChange?.(open)\n },\n [inspectorOpenProp, onInspectorOpenChange]\n )\n\n const toggleInspector = React.useCallback(\n () => setInspectorOpen(!inspectorOpen),\n [inspectorOpen, setInspectorOpen]\n )\n\n const value = React.useMemo<ScaffoldContextValue>(\n () => ({ inspectorOpen, inspectorWidth, setInspectorOpen, toggleInspector }),\n [inspectorOpen, inspectorWidth, setInspectorOpen, toggleInspector]\n )\n\n return (\n <ScaffoldContext.Provider value={value}>\n <div\n id={\"scaffold-root\"}\n className={cn(\n // `clip`, not `hidden`: the off canvas inspector extends the\n // scrollable overflow, and focus/scrollIntoView would scroll a\n // hidden-overflow root sideways to reveal it.\n \"relative isolate flex h-full w-full flex-1 overflow-clip pr-2 pb-2\",\n background,\n className\n )}\n data-slot=\"scaffold\"\n {...rest}\n >\n {children}\n </div>\n </ScaffoldContext.Provider>\n )\n}\n","\"use client\"\n\nimport * as React from \"react\"\n\nimport { cn } from \"@/lib/utils\"\nimport type { ScaffoldSidebarProps } from \"./type\"\n\n/**\n * The 64px icon rail on the left edge. Transparent — it sits directly on\n * the desktop backdrop; fill it with icon buttons.\n */\nexport function ScaffoldSidebar({\n className,\n children,\n ...rest\n}: ScaffoldSidebarProps): React.ReactElement {\n return (\n <nav\n id=\"scaffold-sidebar\"\n aria-label=\"Primary\"\n className={cn(\n \"flex min-w-20 shrink-0 flex-col items-center gap-1 pt-8 pb-2\",\n className\n )}\n data-slot=\"scaffold-sidebar\"\n {...rest}\n >\n {children}\n </nav>\n )\n}\n","\"use client\"\n\nimport { useCallback, useMemo, useState } from \"react\"\n\nimport type { ScaffoldControls, UseScaffoldOptions } from \"./type\"\n\n/**\n * Owns the scaffold's inspector state for UI living outside the scaffold\n * (title-bar buttons, command palette, shortcuts). Spread the returned\n * `providerProps` onto `Scaffold.Root`; without this hook the root manages\n * the same state internally via `defaultInspectorOpen`.\n */\nexport function useScaffold({\n defaultInspectorOpen,\n onInspectorChange,\n}: UseScaffoldOptions = {}): ScaffoldControls {\n const [inspectorOpen, setOpenState] = useState(defaultInspectorOpen ?? false)\n\n const setInspectorOpen = useCallback(\n (open: boolean) => {\n setOpenState((prev) => {\n if (prev !== open) onInspectorChange?.(open)\n return open\n })\n },\n [onInspectorChange]\n )\n\n const toggleInspector = useCallback(\n () => setInspectorOpen(!inspectorOpen),\n [inspectorOpen, setInspectorOpen]\n )\n\n const providerProps = useMemo(\n () => ({\n inspectorOpen,\n onInspectorOpenChange: setInspectorOpen,\n }),\n [inspectorOpen, setInspectorOpen]\n )\n\n return {\n inspectorOpen,\n setInspectorOpen,\n toggleInspector,\n providerProps,\n }\n}\n","import { PanelCloseButton } from \"./panel-close-button\"\nimport { PanelMenuButton } from \"./panel-menu-button.tsx\"\nimport { ScaffoldActions } from \"./scaffold-actions\"\nimport { ScaffoldCanvas } from \"./scaffold-canvas\"\nimport { ScaffoldInspector } from \"./scaffold-inspector\"\nimport { ScaffoldMain } from \"./scaffold-main\"\nimport { ScaffoldPanel } from \"./scaffold-panel\"\nimport { ScaffoldRoot } from \"./scaffold-root\"\nimport { ScaffoldSidebar } from \"./scaffold-sidebar\"\nimport { ScaffoldSubPanel } from \"@/components/blocks/scaffold/scaffold-sub-panel.tsx\"\n\nexport { useScaffoldContext } from \"./scaffold-context\"\nexport { useScaffold } from \"./use-scaffold\"\nexport type * from \"./type\"\nexport * from \"./constants\"\n\nexport {\n PanelCloseButton,\n PanelMenuButton,\n ScaffoldActions,\n ScaffoldCanvas,\n ScaffoldInspector,\n ScaffoldMain,\n ScaffoldPanel,\n ScaffoldRoot,\n ScaffoldSidebar,\n}\n\nexport const Scaffold = {\n Root: ScaffoldRoot,\n Sidebar: ScaffoldSidebar,\n Main: ScaffoldMain,\n Actions: ScaffoldActions,\n Canvas: ScaffoldCanvas,\n Panel: ScaffoldPanel,\n Inspector: ScaffoldInspector,\n SubPanel: ScaffoldSubPanel\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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"}
|