@nebutra/ui 0.2.2 → 2.0.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/animate-in-BlvjVh2S.d.ts +250 -0
- package/dist/{canonical-CrO71UPO.d.ts → canonical-Bf4czR2u.d.ts} +225 -211
- package/dist/chat/index.d.ts +1 -0
- package/dist/chat/index.js +3 -0
- package/dist/chat/index.js.map +1 -0
- package/dist/components/index.d.ts +58 -123
- package/dist/components/index.js +504 -203
- package/dist/components/index.js.map +1 -1
- package/dist/editorial/index.d.ts +404 -0
- package/dist/editorial/index.js +868 -0
- package/dist/editorial/index.js.map +1 -0
- package/dist/icons/index.d.ts +1 -0
- package/dist/layout/index.d.ts +2 -2
- package/dist/layout/index.js +116 -26
- package/dist/layout/index.js.map +1 -1
- package/dist/layouts/index.d.ts +80 -2
- package/dist/layouts/index.js +13 -11
- package/dist/layouts/index.js.map +1 -1
- package/dist/patterns/index.d.ts +4 -5
- package/dist/patterns/index.js +221 -106
- package/dist/patterns/index.js.map +1 -1
- package/dist/primitives/canonical.d.ts +4 -3
- package/dist/primitives/canonical.js +609 -197
- package/dist/primitives/canonical.js.map +1 -1
- package/dist/primitives/index.d.ts +213 -21
- package/dist/primitives/index.js +2209 -1317
- package/dist/primitives/index.js.map +1 -1
- package/dist/tailwind.preset.d.ts +2 -2
- package/dist/tailwind.preset.js +1 -1
- package/dist/tailwind.preset.js.map +1 -1
- package/dist/typography/fonts.css +21 -26
- package/dist/typography/index.d.ts +4 -4
- package/dist/typography/index.js +1 -1
- package/dist/typography/index.js.map +1 -1
- package/dist/utils/auth-surfaces.d.ts +33 -0
- package/dist/utils/auth-surfaces.js +9 -0
- package/dist/utils/auth-surfaces.js.map +1 -0
- package/dist/utils/index.d.ts +33 -5
- package/dist/utils/index.js +15 -3
- package/dist/utils/index.js.map +1 -1
- package/package.json +43 -9
- package/src/styles/sources.css +10 -0
- package/src/typography/fonts.css +21 -26
package/dist/layout/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/tokens/primitive.ts","../../src/tokens/components/overlay.ts","../../src/tokens/components/sheet.ts","../../src/utils/cn.ts","../../src/primitives/sheet.tsx","../../src/layout/app-shell.tsx","../../src/layout/Card.tsx","../../src/layout/Container.tsx","../../src/layout/DesignSystemProvider.tsx","../../src/primitives/brand-mark.tsx","../../src/tokens/components/empty-state.ts","../../src/primitives/empty-state.tsx","../../src/layout/EmptyState.tsx","../../src/utils/slot.tsx","../../src/primitives/button-variants.ts","../../src/primitives/button.tsx","../../src/primitives/error-message.tsx","../../src/layout/ErrorState.tsx","../../src/layout/FullPageStatus.tsx","../../src/layout/LoadingState.tsx","../../src/layout/PageHeader.tsx","../../src/layout/Section.tsx"],"names":["BaseDialog","React","XIcon","React2","jsxs","jsx","useState","React3","EmptyState","cva","Fragment","AlertCircle"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Primitive Design Tokens — Layer 1\n *\n * Raw values only. No CSS variable references, no semantic meaning.\n * These are the \"atoms\" of the design system.\n *\n * Color source: @nebutra/brand `colors` → @nebutra/design-tokens `tokens/core.json` (SSOT).\n * Typography: Geist + Geist Mono (Vercel) with Noto Sans SC + PingFang SC + Microsoft YaHei CJK fallbacks.\n * Aligned with @nebutra/design-tokens SSOT.\n */\n\nimport { colors } from \"@nebutra/brand\";\n\n// ─── Color Palette ────────────────────────────────────────────────────────────\n\nexport const primitiveColors = {\n // Nebutra Blue (云毓蓝) — technology & trust — VI: #0033FE\n blue50: colors.primary[50],\n blue100: colors.primary[100],\n blue200: colors.primary[200],\n blue300: colors.primary[300],\n blue400: colors.primary[400],\n blue500: colors.primary[500], // brand primary\n blue600: colors.primary[600],\n blue700: colors.primary[700],\n blue800: colors.primary[800],\n blue900: colors.primary[900],\n blue950: colors.primary[950],\n\n // Nebutra Cyan (云毓青) — data flow & intelligence — VI: #0BF1C3\n cyan50: colors.accent[50],\n cyan100: colors.accent[100],\n cyan200: colors.accent[200],\n cyan300: colors.accent[300],\n cyan400: colors.accent[400],\n cyan500: colors.accent[500], // brand secondary\n cyan600: colors.accent[600],\n cyan700: colors.accent[700],\n cyan800: colors.accent[800],\n cyan900: colors.accent[900],\n cyan950: colors.accent[950],\n\n // Neutral (blue-undertone gray scale)\n neutral50: colors.neutral[50],\n neutral100: colors.neutral[100],\n neutral200: colors.neutral[200],\n neutral300: colors.neutral[300],\n neutral400: colors.neutral[400],\n neutral500: colors.neutral[500],\n neutral600: colors.neutral[600],\n neutral700: colors.neutral[700],\n neutral800: colors.neutral[800],\n neutral900: colors.neutral[900],\n neutral950: colors.neutral[950], // deepest — used as dark background\n\n // Semantic raw colors — VI §Color Specifications\n // NOTE: info = brand blue (#0033FE), not sky/teal\n red500: \"#ef4444\",\n red600: \"#dc2626\",\n green500: \"#22c55e\", // VI manual specifies this exact value for success\n green600: \"#16a34a\",\n amber500: \"#f59e0b\",\n amber600: \"#d97706\",\n\n white: colors.white,\n black: colors.black,\n} as const;\n\nexport type PrimitiveColor = keyof typeof primitiveColors;\n\n// ─── Brand Gradients — VI §Brand Gradients (first-class design assets) ────────\n\nexport const primitiveGradients = {\n /** Hero sections, primary CTA buttons, logo fills — VI signature gradient */\n primary: colors.gradient.primary,\n /** Hover states, secondary gradient elements */\n reverse: colors.gradient.primaryReverse,\n /** Vertical layout dividers, page section separators */\n vertical: colors.gradient.primaryVertical,\n /** Background halos, focus glow effects, radial emphasis */\n radial: colors.gradient.primaryRadial,\n /** Dark mode card surfaces — deep brand-blue tinted */\n darkCard: \"linear-gradient(135deg, #020617 0%, #0a1628 100%)\",\n} as const;\n\nexport type PrimitiveGradient = keyof typeof primitiveGradients;\n\n// ─── Spacing Scale (px values) ────────────────────────────────────────────────\n\nexport const primitiveSpacing = {\n 0: 0,\n 1: 4,\n 2: 8,\n 3: 12,\n 4: 16,\n 5: 20,\n 6: 24,\n 8: 32,\n 10: 40,\n 12: 48,\n 14: 56,\n 16: 64,\n 20: 80,\n 24: 96,\n} as const;\n\nexport type PrimitiveSpacing = keyof typeof primitiveSpacing;\n\n// ─── Layout Containers (px) — max-width standards ────────────────────────────\n// Use `text` for text-heavy sections (hero copy, CTA), `content` for general\n// sections, and `wide` for full-bleed feature bento grids.\n\nexport const primitiveContainer = {\n /** Text-focused: hero headlines, CTA copy, FAQ — optimized for reading */\n text: 896, // ~56rem / max-w-4xl\n /** Standard content sections: pricing, architecture, blog */\n content: 1152, // ~72rem / max-w-6xl\n /** Wide sections: feature bento, testimonials, product demos */\n wide: 1400, // ~87.5rem — Vercel/Supabase standard\n} as const;\n\nexport type PrimitiveContainer = keyof typeof primitiveContainer;\n\n// ─── Sizing Scale — component heights (px) ────────────────────────────────────\n\nexport const primitiveSizing = {\n xs: 20,\n /** Geist button-specific size (24px). Larger than xs by design. */\n tiny: 24,\n sm: 32,\n md: 40,\n lg: 48,\n xl: 56,\n \"2xl\": 80,\n} as const;\n\nexport type PrimitiveSizing = keyof typeof primitiveSizing;\n\n// ─── Border Radius (px) ───────────────────────────────────────────────────────\n\nexport const primitiveRadius = {\n none: 0,\n sm: 4,\n md: 6, // Geist default — slightly more rounded than 4px\n lg: 8,\n xl: 12,\n \"2xl\": 16,\n full: 9999,\n} as const;\n\nexport type PrimitiveRadius = keyof typeof primitiveRadius;\n\n// ─── Font Sizes (px) ──────────────────────────────────────────────────────────\n\nexport const primitiveFontSize = {\n xs: 12,\n sm: 14,\n base: 16,\n lg: 18,\n xl: 20,\n \"2xl\": 24,\n \"3xl\": 30,\n \"4xl\": 36,\n} as const;\n\nexport type PrimitiveFontSize = keyof typeof primitiveFontSize;\n\n// ─── Font Weights ─────────────────────────────────────────────────────────────\n\nexport const primitiveFontWeight = {\n light: 300,\n normal: 400,\n medium: 500,\n semibold: 600,\n bold: 700,\n} as const;\n\nexport type PrimitiveFontWeight = keyof typeof primitiveFontWeight;\n\n// ─── Font Families — VI §Typography ──────────────────────────────────────────\n// Aligned with @nebutra/design-tokens SSOT (tokens/core.json fontFamily.*).\n// EN primary: Geist (Vercel variable, 100–900)\n// EN mono: Geist Mono\n// CN primary: Noto Sans SC → PingFang SC → Microsoft YaHei → vivo Sans (print)\n\nexport const primitiveFontFamily = {\n /** Default body/UI stack — Geist with CJK auto-fallbacks */\n sans: '\"Geist\", \"Noto Sans SC\", \"PingFang SC\", \"Microsoft YaHei\", -apple-system, BlinkMacSystemFont, system-ui, sans-serif',\n /** Chinese body/UI stack */\n cnSans: '\"Noto Sans SC\", \"PingFang SC\", \"Microsoft YaHei\", \"vivo Sans\", sans-serif',\n /** Display / hero headlines */\n display: '\"Geist\", \"Noto Sans SC\", sans-serif',\n /** Heading (alias of display) */\n heading: '\"Geist\", \"Noto Sans SC\", sans-serif',\n /** Code / monospace — Geist Mono pairs with Geist for full family coverage */\n mono: '\"Geist Mono\", ui-monospace, SFMono-Regular, \"SF Mono\", Menlo, monospace',\n} as const;\n\nexport type PrimitiveFontFamily = keyof typeof primitiveFontFamily;\n\n// ─── Shadows ──────────────────────────────────────────────────────────────────\n\nexport const primitiveShadow = {\n none: \"none\",\n sm: \"0 1px 2px 0 rgb(0 0 0 / 0.05)\",\n md: \"0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1)\",\n lg: \"0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1)\",\n xl: \"0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1)\",\n /** Brand glow — blue tone for focus/highlight states */\n brandGlow: \"0 0 0 3px rgb(0 51 254 / 0.15)\",\n} as const;\n\nexport type PrimitiveShadow = keyof typeof primitiveShadow;\n\n// ─── Transition ───────────────────────────────────────────────────────────────\n\n/**\n * Primitive transition tokens — aligned with the four-rail motion scale\n * (SSOT: @nebutra/design-tokens core.json → duration.*).\n * Keys mirror semantic.json motion.duration.*; values are in ms.\n */\nexport const primitiveTransition = {\n duration: {\n micro: 100, // hover, focus, small state changes\n flow: 200, // standard state transitions (default)\n reveal: 300, // larger motion (accordion, modal, drawer)\n cinematic: 500, // hero entrance, big delight moments\n },\n easing: {\n default: \"ease-out\",\n spring: \"cubic-bezier(0.34, 1.56, 0.64, 1)\",\n inOut: \"cubic-bezier(0.4, 0, 0.2, 1)\",\n },\n} as const;\n\n// ─── Focus Ring ───────────────────────────────────────────────────────────────\n\nexport const primitiveFocusRing = {\n width: 2, // px\n offset: 2, // px — gap between element and ring\n} as const;\n","/**\n * Overlay Component Tokens — Layer 3\n *\n * Dialog, Menu, Popover, Tooltip, and Command surfaces share one depth,\n * elevation, radius, and motion contract. Components should consume these\n * semantic class tokens instead of inlining z-index, shadow, radius, or\n * duration decisions.\n */\n\nimport { primitiveRadius, primitiveTransition } from \"../primitive\";\nimport { shadowClasses } from \"../shadows\";\n\nconst overlayFocusRingClassName =\n \"outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2\";\n\nexport const overlayZIndex = {\n backdrop: 1040,\n modal: 1050,\n popover: 1060,\n tooltip: 1070,\n} as const;\n\nexport const overlayTokens = {\n radius: {\n menu: primitiveRadius.lg,\n modal: primitiveRadius.xl,\n popover: primitiveRadius.lg,\n tooltip: primitiveRadius.md,\n },\n motion: {\n duration: primitiveTransition.duration.flow,\n easing: primitiveTransition.easing.default,\n hoverOpenDelay: primitiveTransition.duration.flow,\n hoverCloseDelay: primitiveTransition.duration.micro,\n },\n zIndex: overlayZIndex,\n} as const;\n\nexport const overlayClassNames = {\n focusRing: overlayFocusRingClassName,\n backdrop:\n \"fixed inset-0 bg-black/40 backdrop-blur-sm transition-[opacity,display] duration-[var(--motion-duration-flow)] ease-[var(--ease-out)] data-ending-style:opacity-0 data-starting-style:opacity-0 motion-reduce:transition-none\",\n modalSurface: [\n \"fixed left-1/2 top-1/2 grid w-full max-w-lg -translate-x-1/2 -translate-y-1/2 gap-4\",\n \"border border-border/60 bg-background/95 p-6 text-foreground backdrop-blur-xl\",\n \"rounded-[var(--radius-xl)]\",\n shadowClasses[\"2xl\"],\n \"outline-none\",\n \"transition-[opacity,transform,display] duration-[var(--motion-duration-flow)] ease-[var(--ease-out)]\",\n \"data-starting-style:scale-95 data-starting-style:opacity-0 data-ending-style:scale-95 data-ending-style:opacity-0\",\n \"motion-reduce:transition-none motion-reduce:data-starting-style:transform-none motion-reduce:data-ending-style:transform-none\",\n ].join(\" \"),\n commandSurface: [\n \"fixed left-1/2 top-[18vh] w-[calc(100vw-2rem)] max-w-xl -translate-x-1/2 overflow-hidden\",\n \"rounded-[var(--radius-lg)] border border-border/70 bg-popover text-popover-foreground\",\n shadowClasses[\"2xl\"],\n \"transition-[opacity,transform,display] duration-[var(--motion-duration-flow)] ease-[var(--ease-out)]\",\n \"data-starting-style:translate-y-[-0.5rem] data-starting-style:scale-95 data-starting-style:opacity-0\",\n \"data-ending-style:translate-y-[-0.5rem] data-ending-style:scale-95 data-ending-style:opacity-0\",\n \"motion-reduce:transition-none motion-reduce:data-starting-style:transform-none motion-reduce:data-ending-style:transform-none\",\n ].join(\" \"),\n menuSurface: [\n \"min-w-32 overflow-hidden rounded-[var(--radius-lg)] border border-border/70 bg-popover/95 p-1 text-popover-foreground backdrop-blur-md\",\n shadowClasses.xl,\n \"outline-none transition-[opacity,transform,display] duration-[var(--motion-duration-flow)] ease-[var(--ease-out)]\",\n \"data-[starting-style]:scale-95 data-[starting-style]:opacity-0 data-[ending-style]:scale-95 data-[ending-style]:opacity-0\",\n \"motion-reduce:transition-none motion-reduce:data-[starting-style]:transform-none motion-reduce:data-[ending-style]:transform-none\",\n ].join(\" \"),\n selectSurface: [\n \"max-h-[var(--select-content-max-height)] min-w-[var(--select-content-min-width)] overflow-hidden\",\n \"rounded-[var(--select-content-radius)] border border-border/70 bg-popover/95 text-popover-foreground backdrop-blur-md\",\n \"shadow-[var(--select-content-shadow)] outline-none\",\n \"transition-[opacity,transform,display] duration-[var(--select-duration)] ease-[var(--select-easing)]\",\n \"data-starting-style:scale-95 data-starting-style:opacity-0 data-ending-style:scale-95 data-ending-style:opacity-0\",\n \"motion-reduce:transition-none motion-reduce:data-starting-style:transform-none motion-reduce:data-ending-style:transform-none\",\n ].join(\" \"),\n navigationMenuSurface: [\n \"min-w-32 overflow-hidden rounded-[var(--radius-xl)] border border-border/70 bg-popover/95 text-popover-foreground backdrop-blur-md\",\n shadowClasses.xl,\n \"outline-none transition-[opacity,transform,display] duration-[var(--motion-duration-flow)] ease-[var(--ease-out)]\",\n \"data-[starting-style]:scale-95 data-[starting-style]:opacity-0 data-[ending-style]:scale-95 data-[ending-style]:opacity-0\",\n \"motion-reduce:transition-none motion-reduce:data-[starting-style]:transform-none motion-reduce:data-[ending-style]:transform-none\",\n ].join(\" \"),\n popoverSurface: [\n \"w-72 rounded-[var(--radius-lg)] border border-border/70 bg-popover/95 p-4 text-popover-foreground backdrop-blur-md\",\n shadowClasses.xl,\n \"outline-none transition-[opacity,transform,display] duration-[var(--motion-duration-flow)] ease-[var(--ease-out)]\",\n \"data-[open]:opacity-100 data-[closed]:opacity-0 data-[closed]:scale-95 data-[open]:scale-100\",\n \"motion-reduce:transition-none motion-reduce:data-[closed]:transform-none motion-reduce:data-[open]:transform-none\",\n ].join(\" \"),\n tooltipSurface: [\n \"overflow-hidden rounded-[var(--radius-md)] border border-border/70 bg-popover/95 px-3 py-1.5 text-sm text-popover-foreground backdrop-blur-md\",\n shadowClasses.md,\n \"transition-[opacity,transform,display] duration-[var(--motion-duration-flow)] ease-[var(--ease-out)]\",\n \"data-starting-style:scale-95 data-starting-style:opacity-0 data-ending-style:scale-95 data-ending-style:opacity-0\",\n \"motion-reduce:transition-none motion-reduce:data-starting-style:transform-none motion-reduce:data-ending-style:transform-none\",\n ].join(\" \"),\n sheetBackdrop: [\n \"fixed inset-0 bg-[var(--sheet-overlay-background)] backdrop-blur-[var(--sheet-overlay-blur)]\",\n \"transition-[opacity,backdrop-filter,display] duration-[var(--motion-duration-flow)] ease-[var(--ease-out)]\",\n \"data-ending-style:opacity-0 data-starting-style:opacity-0 motion-reduce:transition-none\",\n ].join(\" \"),\n sheetSurface: [\n \"fixed flex flex-col overflow-hidden border border-border bg-[var(--sheet-background)] text-foreground shadow-[var(--sheet-shadow)]\",\n \"outline-none transition-[opacity,transform,display] duration-[var(--motion-duration-flow)] ease-[var(--ease-out)]\",\n \"data-ending-style:opacity-0 data-starting-style:opacity-0 motion-reduce:transition-none\",\n ].join(\" \"),\n closeButton: `absolute right-4 top-4 rounded-[var(--radius-sm)] opacity-70 ring-offset-background ${overlayFocusRingClassName} transition-opacity duration-[var(--motion-duration-micro)] ease-[var(--ease-out)] hover:opacity-100 disabled:pointer-events-none data-[open]:bg-accent data-[open]:text-muted-foreground motion-reduce:transition-none`,\n} as const;\n","/**\n * Sheet Component Tokens — Layer 3\n *\n * Contextual edge panel for read-mostly detail views and short forms.\n * Drawer owns mobile bottom-sheet gestures; Dialog owns blocking decisions.\n */\n\nimport {\n primitiveFontSize,\n primitiveRadius,\n primitiveSizing,\n primitiveSpacing,\n primitiveTransition,\n} from \"../primitive\";\n\nexport type SheetSide = \"top\" | \"right\" | \"bottom\" | \"left\";\n\nexport const sheetSides = [\n \"top\",\n \"right\",\n \"bottom\",\n \"left\",\n] as const satisfies readonly SheetSide[];\n\nexport const sheetTokens = {\n inset: primitiveSpacing[3],\n sideWidth: primitiveSizing[\"2xl\"] * 6 + primitiveSpacing[8], // 512px\n edgeHeight: primitiveSizing[\"2xl\"] * 4, // 320px\n paddingX: primitiveSpacing[6],\n paddingY: primitiveSpacing[5],\n bodyPaddingY: primitiveSpacing[4],\n gap: primitiveSpacing[4],\n headerGap: primitiveSpacing[1] + 2,\n footerGap: primitiveSpacing[2],\n radius: primitiveRadius[\"2xl\"],\n close: {\n size: primitiveSizing.sm,\n iconSize: primitiveFontSize.base,\n offset: primitiveSpacing[4],\n radius: primitiveRadius.md,\n },\n overlay: {\n background: \"hsl(var(--background) / 0.68)\",\n blur: \"blur(6px)\",\n },\n surface: {\n background: \"hsl(var(--popover))\",\n shadow: \"var(--elevation-xl)\",\n },\n motion: {\n duration: primitiveTransition.duration.reveal,\n easing: primitiveTransition.easing.inOut,\n },\n} as const;\n","import { type ClassValue, clsx } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","\"use client\";\n\nimport { Dialog as BaseDialog } from \"@base-ui/react/dialog\";\nimport { Cross as XIcon } from \"@nebutra/icons\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport * as React from \"react\";\n\nimport { overlayClassNames, overlayTokens, overlayZIndex } from \"../tokens/components/overlay\";\nimport { sheetTokens } from \"../tokens/components/sheet\";\nimport { cn } from \"../utils/cn\";\n\ntype SheetCssVar =\n | \"--sheet-inset\"\n | \"--sheet-side-width\"\n | \"--sheet-edge-height\"\n | \"--sheet-padding-x\"\n | \"--sheet-padding-y\"\n | \"--sheet-body-padding-y\"\n | \"--sheet-gap\"\n | \"--sheet-header-gap\"\n | \"--sheet-footer-gap\"\n | \"--sheet-radius\"\n | \"--sheet-close-size\"\n | \"--sheet-close-icon-size\"\n | \"--sheet-close-offset\"\n | \"--sheet-close-radius\"\n | \"--sheet-overlay-background\"\n | \"--sheet-overlay-blur\"\n | \"--sheet-background\"\n | \"--sheet-shadow\"\n | \"--sheet-duration\"\n | \"--sheet-easing\";\n\ntype SheetCssVars = React.CSSProperties & Record<SheetCssVar, string>;\n\nfunction getSheetStyle(style: React.CSSProperties | undefined): SheetCssVars {\n return {\n \"--sheet-inset\": `${sheetTokens.inset}px`,\n \"--sheet-side-width\": `${sheetTokens.sideWidth}px`,\n \"--sheet-edge-height\": `${sheetTokens.edgeHeight}px`,\n \"--sheet-padding-x\": `${sheetTokens.paddingX}px`,\n \"--sheet-padding-y\": `${sheetTokens.paddingY}px`,\n \"--sheet-body-padding-y\": `${sheetTokens.bodyPaddingY}px`,\n \"--sheet-gap\": `${sheetTokens.gap}px`,\n \"--sheet-header-gap\": `${sheetTokens.headerGap}px`,\n \"--sheet-footer-gap\": `${sheetTokens.footerGap}px`,\n \"--sheet-radius\": `${sheetTokens.radius}px`,\n \"--sheet-close-size\": `${sheetTokens.close.size}px`,\n \"--sheet-close-icon-size\": `${sheetTokens.close.iconSize}px`,\n \"--sheet-close-offset\": `${sheetTokens.close.offset}px`,\n \"--sheet-close-radius\": `${sheetTokens.close.radius}px`,\n \"--sheet-overlay-background\": sheetTokens.overlay.background,\n \"--sheet-overlay-blur\": sheetTokens.overlay.blur,\n \"--sheet-background\": sheetTokens.surface.background,\n \"--sheet-shadow\": sheetTokens.surface.shadow,\n \"--sheet-duration\": `${overlayTokens.motion.duration}ms`,\n \"--sheet-easing\": overlayTokens.motion.easing,\n ...style,\n };\n}\n\nexport type SheetProps = React.ComponentPropsWithoutRef<typeof BaseDialog.Root>;\n\nfunction Sheet({ modal = \"trap-focus\", disablePointerDismissal = true, ...props }: SheetProps) {\n return (\n <BaseDialog.Root\n data-slot=\"sheet\"\n modal={modal}\n disablePointerDismissal={disablePointerDismissal}\n {...props}\n />\n );\n}\nSheet.displayName = \"Sheet\";\n\nexport type SheetTriggerProps = React.ComponentPropsWithoutRef<typeof BaseDialog.Trigger> & {\n asChild?: boolean;\n};\n\nconst SheetTrigger = ({\n asChild,\n children,\n ref,\n ...props\n}: SheetTriggerProps & { ref?: React.Ref<HTMLButtonElement> | undefined }) => {\n if (asChild && React.isValidElement(children)) {\n return (\n <BaseDialog.Trigger\n ref={ref}\n data-slot=\"sheet-trigger\"\n {...props}\n render={children as React.ReactElement<Record<string, unknown>>}\n />\n );\n }\n return (\n <BaseDialog.Trigger ref={ref} data-slot=\"sheet-trigger\" {...props}>\n {children}\n </BaseDialog.Trigger>\n );\n};\nSheetTrigger.displayName = \"SheetTrigger\";\n\nexport type SheetCloseProps = React.ComponentPropsWithoutRef<typeof BaseDialog.Close> & {\n asChild?: boolean;\n};\n\nconst SheetClose = ({\n asChild,\n children,\n ref,\n ...props\n}: SheetCloseProps & { ref?: React.Ref<HTMLButtonElement> | undefined }) => {\n if (asChild && React.isValidElement(children)) {\n return (\n <BaseDialog.Close\n ref={ref}\n data-slot=\"sheet-close\"\n {...props}\n render={children as React.ReactElement<Record<string, unknown>>}\n />\n );\n }\n return (\n <BaseDialog.Close ref={ref} data-slot=\"sheet-close\" {...props}>\n {children}\n </BaseDialog.Close>\n );\n};\nSheetClose.displayName = \"SheetClose\";\n\nexport type SheetPortalProps = React.ComponentPropsWithoutRef<typeof BaseDialog.Portal>;\n\nfunction SheetPortal(props: SheetPortalProps) {\n return <BaseDialog.Portal data-slot=\"sheet-portal\" {...props} />;\n}\nSheetPortal.displayName = \"SheetPortal\";\n\nexport type SheetOverlayProps = React.ComponentPropsWithoutRef<typeof BaseDialog.Backdrop>;\n\nconst SheetOverlay = ({\n className,\n style,\n ref,\n ...props\n}: SheetOverlayProps & { ref?: React.Ref<HTMLDivElement> | undefined }) => (\n <BaseDialog.Backdrop\n ref={ref}\n data-slot=\"sheet-overlay\"\n className={cn(overlayClassNames.sheetBackdrop, className)}\n style={{ zIndex: overlayZIndex.backdrop, ...getSheetStyle(style) }}\n {...props}\n />\n);\nSheetOverlay.displayName = \"SheetOverlay\";\n\nconst sheetVariants = cva(overlayClassNames.sheetSurface, {\n variants: {\n side: {\n top: \"inset-x-[var(--sheet-inset)] top-[var(--sheet-inset)] max-h-[min(var(--sheet-edge-height),calc(100dvh_-_var(--sheet-inset)_-_var(--sheet-inset)))] rounded-[var(--sheet-radius)] data-ending-style:-translate-y-full data-starting-style:-translate-y-full\",\n bottom:\n \"inset-x-[var(--sheet-inset)] bottom-[var(--sheet-inset)] max-h-[min(var(--sheet-edge-height),calc(100dvh_-_var(--sheet-inset)_-_var(--sheet-inset)))] rounded-[var(--sheet-radius)] data-ending-style:translate-y-full data-starting-style:translate-y-full\",\n left: \"inset-y-[var(--sheet-inset)] left-[var(--sheet-inset)] h-[calc(100dvh_-_var(--sheet-inset)_-_var(--sheet-inset))] w-[min(var(--sheet-side-width),calc(100vw_-_var(--sheet-inset)_-_var(--sheet-inset)))] rounded-[var(--sheet-radius)] data-ending-style:-translate-x-full data-starting-style:-translate-x-full\",\n right:\n \"inset-y-[var(--sheet-inset)] right-[var(--sheet-inset)] h-[calc(100dvh_-_var(--sheet-inset)_-_var(--sheet-inset))] w-[min(var(--sheet-side-width),calc(100vw_-_var(--sheet-inset)_-_var(--sheet-inset)))] rounded-[var(--sheet-radius)] data-ending-style:translate-x-full data-starting-style:translate-x-full\",\n },\n },\n defaultVariants: {\n side: \"right\",\n },\n});\n\nexport interface SheetContentProps\n extends React.ComponentPropsWithoutRef<typeof BaseDialog.Popup>,\n VariantProps<typeof sheetVariants> {\n /**\n * Render the backdrop. Prefer `noOverlay` in docs because it names the visual\n * removal directly; `overlay` remains available for boolean composition.\n */\n overlay?: boolean;\n /** Hide the backdrop while keeping the sheet surface and focus behavior. */\n noOverlay?: boolean;\n /** Render the built-in close icon button. */\n showClose?: boolean;\n /** Alias for `showClose`, matching newer generated examples. */\n close?: boolean;\n}\n\nconst SheetContent = ({\n side = \"right\",\n className,\n children,\n overlay = true,\n noOverlay = false,\n showClose,\n close,\n style,\n ref,\n ...props\n}: SheetContentProps & { ref?: React.Ref<HTMLDivElement> | undefined }) => {\n const shouldRenderClose = close ?? showClose ?? true;\n const shouldRenderOverlay = overlay && !noOverlay;\n\n return (\n <SheetPortal>\n {shouldRenderOverlay ? <SheetOverlay /> : null}\n <BaseDialog.Popup\n ref={ref}\n data-slot=\"sheet-content\"\n className={cn(sheetVariants({ side }), className)}\n style={{ zIndex: overlayZIndex.modal, ...getSheetStyle(style) }}\n {...props}\n >\n {children}\n {shouldRenderClose ? (\n <SheetClose\n aria-label=\"Close\"\n className={cn(\n \"absolute right-[var(--sheet-close-offset)] top-[var(--sheet-close-offset)] inline-flex size-[var(--sheet-close-size)] items-center justify-center rounded-[var(--sheet-close-radius)] text-muted-foreground\",\n \"transition-[background-color,color,box-shadow] duration-[var(--motion-duration-micro)] ease-[var(--ease-out)] hover:bg-muted hover:text-foreground\",\n overlayClassNames.focusRing,\n \"disabled:pointer-events-none motion-reduce:transition-none\",\n )}\n >\n <XIcon aria-hidden=\"true\" className=\"size-[var(--sheet-close-icon-size)]\" />\n <span className=\"sr-only\">Close</span>\n </SheetClose>\n ) : null}\n </BaseDialog.Popup>\n </SheetPortal>\n );\n};\nSheetContent.displayName = \"SheetContent\";\n\nexport type SheetHeaderProps = React.ComponentPropsWithoutRef<\"div\">;\n\nconst SheetHeader = ({\n className,\n ref,\n ...props\n}: SheetHeaderProps & { ref?: React.Ref<HTMLDivElement> | undefined }) => (\n <div\n ref={ref}\n data-slot=\"sheet-header\"\n className={cn(\n \"grid gap-[var(--sheet-header-gap)] border-b border-border px-[var(--sheet-padding-x)] py-[var(--sheet-padding-y)] pr-[calc(var(--sheet-padding-x)_+_var(--sheet-close-size))] text-left\",\n className,\n )}\n {...props}\n />\n);\nSheetHeader.displayName = \"SheetHeader\";\n\nexport type SheetBodyProps = React.ComponentPropsWithoutRef<\"div\">;\n\nconst SheetBody = ({\n className,\n ref,\n ...props\n}: SheetBodyProps & { ref?: React.Ref<HTMLDivElement> | undefined }) => (\n <div\n ref={ref}\n data-slot=\"sheet-body\"\n className={cn(\n \"min-h-0 flex-1 overflow-y-auto overscroll-contain px-[var(--sheet-padding-x)] py-[var(--sheet-body-padding-y)]\",\n className,\n )}\n {...props}\n />\n);\nSheetBody.displayName = \"SheetBody\";\n\nexport type SheetFooterProps = React.ComponentPropsWithoutRef<\"div\">;\n\nconst SheetFooter = ({\n className,\n ref,\n ...props\n}: SheetFooterProps & { ref?: React.Ref<HTMLDivElement> | undefined }) => (\n <div\n ref={ref}\n data-slot=\"sheet-footer\"\n className={cn(\n \"mt-auto flex flex-col-reverse gap-[var(--sheet-footer-gap)] border-t border-border px-[var(--sheet-padding-x)] py-[var(--sheet-padding-y)] sm:flex-row sm:justify-end\",\n className,\n )}\n {...props}\n />\n);\nSheetFooter.displayName = \"SheetFooter\";\n\nexport type SheetTitleProps = React.ComponentPropsWithoutRef<typeof BaseDialog.Title>;\n\nconst SheetTitle = ({\n className,\n ref,\n ...props\n}: SheetTitleProps & { ref?: React.Ref<HTMLHeadingElement> | undefined }) => (\n <BaseDialog.Title\n ref={ref}\n data-slot=\"sheet-title\"\n className={cn(\"font-semibold text-base leading-6 text-foreground\", className)}\n {...props}\n />\n);\nSheetTitle.displayName = \"SheetTitle\";\n\nexport type SheetDescriptionProps = React.ComponentPropsWithoutRef<typeof BaseDialog.Description>;\n\nconst SheetDescription = ({\n className,\n ref,\n ...props\n}: SheetDescriptionProps & { ref?: React.Ref<HTMLParagraphElement> | undefined }) => (\n <BaseDialog.Description\n ref={ref}\n data-slot=\"sheet-description\"\n className={cn(\"text-muted-foreground text-sm leading-5\", className)}\n {...props}\n />\n);\nSheetDescription.displayName = \"SheetDescription\";\n\nexport {\n Sheet,\n SheetBody,\n SheetClose,\n SheetContent,\n SheetDescription,\n SheetFooter,\n SheetHeader,\n SheetOverlay,\n SheetPortal,\n SheetTitle,\n SheetTrigger,\n};\n","\"use client\";\n\nimport { Menu } from \"@nebutra/icons\";\nimport * as React from \"react\";\n\nimport { Sheet, SheetContent } from \"../primitives/sheet\";\nimport { cn } from \"../utils/cn\";\n\nexport interface AppShellProps {\n /** Sidebar slot — typically a `SidebarNav` or equivalent navigation tree. */\n sidebar: React.ReactNode;\n /** Optional sticky top header (breadcrumbs, search, user menu). */\n header?: React.ReactNode;\n /** Main content rendered inside `<main>`. */\n children: React.ReactNode;\n /** Sidebar width in pixels when expanded. */\n sidebarWidth?: number;\n /** Sidebar width in pixels when collapsed (icon-only rail). */\n sidebarCollapsedWidth?: number;\n /** Controlled collapsed state. When provided, the component is fully controlled. */\n collapsed?: boolean;\n /** Default collapsed state for uncontrolled usage. */\n defaultCollapsed?: boolean;\n /** Fires whenever the collapsed state changes (both controlled + uncontrolled). */\n onCollapsedChange?: (collapsed: boolean) => void;\n /** Render the desktop sidebar as a floating overlay (absolute, z-40) instead of\n * an in-flow rail that compresses main — for full-bleed builder routes that\n * drive their own toggle. When collapsed to 0 width it's simply invisible. */\n overlay?: boolean;\n /** Height in pixels of the sticky header row. Defaults to 48. */\n headerHeight?: number;\n /** Override the default container styles applied to `<main>`. */\n contentClassName?: string;\n /** Extra classes for the outer wrapper. */\n className?: string;\n}\n\nconst DEFAULT_SIDEBAR_WIDTH = 224;\nconst DEFAULT_COLLAPSED_WIDTH = 52;\nconst DEFAULT_HEADER_HEIGHT = 48;\n\n/**\n * AppShell — top-level dashboard chrome: sidebar + sticky header + scrollable main.\n *\n * Modeled after Vercel / Linear / MiniMax application shells. The sidebar is a\n * fixed-width rail on `md+` viewports and collapses into a `Sheet` overlay on\n * mobile (triggered by the hamburger button shown in the header).\n *\n * The sidebar width animates smoothly (200ms ease-out) when toggling between\n * the expanded and collapsed states so it can host an icon-only rail.\n *\n * @status stable\n *\n * @example\n * ```tsx\n * <AppShell\n * sidebar={<SidebarNav items={navItems} />}\n * header={<DashboardHeader />}\n * >\n * <PageHeader title=\"Overview\" />\n * {children}\n * </AppShell>\n * ```\n */\nexport function AppShell({\n sidebar,\n header,\n children,\n sidebarWidth = DEFAULT_SIDEBAR_WIDTH,\n sidebarCollapsedWidth = DEFAULT_COLLAPSED_WIDTH,\n collapsed,\n defaultCollapsed = false,\n onCollapsedChange,\n headerHeight = DEFAULT_HEADER_HEIGHT,\n contentClassName,\n className,\n overlay = false,\n}: AppShellProps) {\n const isControlled = collapsed !== undefined;\n const [internalCollapsed] = React.useState(defaultCollapsed);\n const isCollapsed = isControlled ? collapsed : internalCollapsed;\n\n const [mobileOpen, setMobileOpen] = React.useState(false);\n\n const railWidth = isCollapsed ? sidebarCollapsedWidth : sidebarWidth;\n\n return (\n <div\n data-ui=\"nebutra-app-shell\"\n className={cn(\n \"relative flex h-screen w-full overflow-hidden bg-background text-foreground\",\n className,\n )}\n >\n {/* Desktop sidebar — fixed rail, hidden on small screens. When the rail\n width collapses to 0 (e.g. a full-bleed route that drives its own\n navigation toggle), drop the border so no seam line remains. */}\n <aside\n aria-label=\"Primary\"\n className={cn(\n \"hidden h-screen overflow-hidden bg-sidebar text-sidebar-foreground md:block\",\n \"transition-[width] duration-200 ease-out\",\n overlay ? \"absolute inset-y-0 left-0 z-40\" : \"shrink-0\",\n railWidth > 0 && \"border-r border-sidebar-border\",\n overlay && railWidth > 0 && \"shadow-2xl\",\n )}\n style={{ width: railWidth }}\n >\n <div\n className=\"h-full overflow-y-auto\"\n style={{ width: isCollapsed ? sidebarCollapsedWidth : sidebarWidth }}\n >\n {sidebar}\n </div>\n </aside>\n\n {/* Overlay backdrop — when the sidebar floats over the content (overlay mode)\n and is expanded, a click on the dimmed content collapses it. */}\n {overlay && !isCollapsed ? (\n <button\n type=\"button\"\n aria-label=\"Collapse navigation\"\n onClick={() => onCollapsedChange?.(true)}\n className=\"absolute inset-0 z-30 hidden cursor-default bg-foreground/20 backdrop-blur-[1px] md:block\"\n />\n ) : null}\n\n {/* Mobile sidebar — Sheet overlay */}\n <Sheet open={mobileOpen} onOpenChange={setMobileOpen}>\n <SheetContent side=\"left\" className=\"w-72 border-r border-sidebar-border bg-sidebar p-0\">\n <div className=\"h-full overflow-y-auto\">{sidebar}</div>\n </SheetContent>\n </Sheet>\n\n {/* Right column — header + main */}\n <div className=\"flex min-h-0 min-w-0 flex-1 flex-col\">\n {header !== undefined && (\n <header\n className={cn(\n \"sticky top-0 z-30 flex shrink-0 items-center gap-2 border-b border-border\",\n \"bg-background/90 px-3 backdrop-blur-xl supports-[backdrop-filter]:bg-background/80 sm:px-4\",\n )}\n style={{ height: headerHeight }}\n >\n <button\n type=\"button\"\n aria-label=\"Open navigation menu\"\n onClick={() => setMobileOpen(true)}\n className={cn(\n \"relative inline-flex size-8 items-center justify-center rounded-[var(--radius-md)] text-foreground/80 after:absolute after:-inset-1.5 after:content-['']\",\n \"hover:bg-muted hover:text-foreground md:hidden\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-1\",\n )}\n >\n <Menu className=\"size-4\" aria-hidden=\"true\" />\n </button>\n <div className=\"flex min-w-0 flex-1 items-center gap-2\">{header}</div>\n </header>\n )}\n\n {/* Header is optional — still show a mobile-only hamburger row when header is omitted */}\n {header === undefined && (\n <div className=\"flex shrink-0 items-center border-b border-border bg-background px-4 py-2 md:hidden\">\n <button\n type=\"button\"\n aria-label=\"Open navigation menu\"\n onClick={() => setMobileOpen(true)}\n className={cn(\n \"relative inline-flex size-8 items-center justify-center rounded-[var(--radius-md)] text-foreground/80 after:absolute after:-inset-1.5 after:content-['']\",\n \"hover:bg-muted hover:text-foreground\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-1\",\n )}\n >\n <Menu className=\"size-4\" aria-hidden=\"true\" />\n </button>\n </div>\n )}\n\n <main\n className={cn(\n \"min-h-0 flex-1 overflow-y-auto w-full max-w-none px-3 py-4 sm:px-4 md:px-5 2xl:px-6\",\n contentClassName,\n )}\n >\n {children}\n </main>\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport type React from \"react\";\nimport { cn } from \"../utils\";\n\nexport interface CardProps {\n children: React.ReactNode;\n className?: string;\n /** Whether the card has a hover/press effect */\n isInteractive?: boolean;\n}\n\n/**\n * Card — surface container with border, background, and shadow.\n *\n * @status stable\n * @planned apps/web dashboard — settings panels, billing summary, team member tiles.\n * See governance/registry.ts for full allocation record.\n *\n * @example\n * ```tsx\n * <Card>\n * <p>Card content</p>\n * </Card>\n * ```\n */\nexport function Card({ children, isInteractive = false, className }: CardProps) {\n return (\n <div\n className={cn(\n \"rounded-[var(--radius-lg)] border border-border bg-background p-4 text-foreground shadow-sm dark:bg-black/40\",\n isInteractive && \"cursor-pointer transition-shadow hover:shadow-md\",\n className,\n )}\n >\n {children}\n </div>\n );\n}\n","\"use client\";\n\nimport type React from \"react\";\nimport { cn } from \"../utils\";\n\nexport type ContainerSize = \"sm\" | \"md\" | \"lg\" | \"xl\" | \"full\";\n\nconst sizeClasses: Record<ContainerSize, string> = {\n sm: \"max-w-screen-sm\",\n md: \"max-w-screen-md\",\n lg: \"max-w-screen-lg\",\n xl: \"max-w-screen-xl\",\n full: \"max-w-full\",\n};\n\nexport interface ContainerProps {\n children: React.ReactNode;\n /** Max-width breakpoint */\n size?: ContainerSize;\n className?: string;\n}\n\n/**\n * Container — centred max-width layout wrapper.\n *\n * @status stable\n * @planned apps/web dashboard — canonical max-width wrapper for all page layouts.\n *\n * @example\n * ```tsx\n * <Container size=\"lg\">\n * <p>Page content</p>\n * </Container>\n * ```\n */\nexport function Container({ children, size = \"lg\", className }: ContainerProps) {\n return <div className={cn(\"mx-auto w-full px-4\", sizeClasses[size], className)}>{children}</div>;\n}\n","\"use client\";\n\nimport type React from \"react\";\nimport { createContext, useCallback, useContext, useEffect, useMemo, useState } from \"react\";\nimport type { ThemeMode } from \"../theme\";\n\n// ============================================\n// Context\n// ============================================\n\ninterface DesignSystemContextValue {\n mode: ThemeMode;\n setMode: (mode: ThemeMode) => void;\n toggleMode: () => void;\n resolvedMode: \"light\" | \"dark\";\n}\n\nconst DesignSystemContext = createContext<DesignSystemContextValue | null>(null);\n\n// ============================================\n// Hook\n// ============================================\n\nexport function useDesignSystem() {\n const context = useContext(DesignSystemContext);\n if (!context) {\n throw new Error(\"useDesignSystem must be used within DesignSystemProvider\");\n }\n return context;\n}\n\n// ============================================\n// Provider Props\n// ============================================\n\nexport interface DesignSystemProviderProps {\n children: React.ReactNode;\n defaultMode?: ThemeMode;\n storageKey?: string;\n enableSystemPreference?: boolean;\n}\n\n// ============================================\n// Provider Component\n// ============================================\n\nexport function DesignSystemProvider({\n children,\n defaultMode = \"system\",\n storageKey = \"nebutra-theme-mode\",\n enableSystemPreference = true,\n}: DesignSystemProviderProps) {\n const [mode, setModeState] = useState<ThemeMode>(defaultMode);\n const [systemPreference, setSystemPreference] = useState<\"light\" | \"dark\">(\"light\");\n\n // Detect system preference\n useEffect(() => {\n if (typeof window === \"undefined\" || !enableSystemPreference) return;\n\n const mediaQuery = window.matchMedia(\"(prefers-color-scheme: dark)\");\n setSystemPreference(mediaQuery.matches ? \"dark\" : \"light\");\n\n const handler = (e: MediaQueryListEvent) => {\n setSystemPreference(e.matches ? \"dark\" : \"light\");\n };\n\n mediaQuery.addEventListener(\"change\", handler);\n return () => mediaQuery.removeEventListener(\"change\", handler);\n }, [enableSystemPreference]);\n\n // Load from storage\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n\n const stored = localStorage.getItem(storageKey);\n if (stored && [\"light\", \"dark\", \"system\"].includes(stored)) {\n setModeState(stored as ThemeMode);\n }\n }, [storageKey]);\n\n // Resolve actual mode\n const resolvedMode = useMemo((): \"light\" | \"dark\" => {\n if (mode === \"system\") {\n return systemPreference;\n }\n return mode;\n }, [mode, systemPreference]);\n\n // Set mode with persistence\n const setMode = useCallback(\n (newMode: ThemeMode) => {\n setModeState(newMode);\n if (typeof window !== \"undefined\") {\n localStorage.setItem(storageKey, newMode);\n }\n },\n [storageKey],\n );\n\n // Toggle between light and dark\n const toggleMode = useCallback(() => {\n setMode(resolvedMode === \"light\" ? \"dark\" : \"light\");\n }, [resolvedMode, setMode]);\n\n // Context value\n const contextValue = useMemo(\n () => ({\n mode,\n setMode,\n toggleMode,\n resolvedMode,\n }),\n [mode, resolvedMode, setMode, toggleMode],\n );\n\n return (\n <DesignSystemContext.Provider value={contextValue}>{children}</DesignSystemContext.Provider>\n );\n}\n","\"use client\";\n\nimport type { ReactNode } from \"react\";\nimport { cn } from \"../utils/cn\";\n\ntype Size = \"sm\" | \"md\" | \"lg\" | \"xl\";\ntype Variant = \"gradient\" | \"soft\" | \"outline\";\n\nexport interface BrandMarkProps {\n /** Optional icon or glyph rendered inside the mark. Defaults to an abstract dot. */\n children?: ReactNode;\n /** Visual variant — solid gradient, soft tinted, or outline. */\n variant?: Variant;\n /** Diameter preset. */\n size?: Size;\n /** Extra classes for the outer element. */\n className?: string;\n /** Whether to render a soft halo behind the mark. */\n halo?: boolean;\n /** Make the mark non-interactive for screen readers. */\n ariaHidden?: boolean;\n}\n\nconst SIZE_MAP: Record<Size, { box: string; halo: string; glyph: string }> = {\n sm: { box: \"h-8 w-8\", halo: \"h-16 w-16 -inset-4\", glyph: \"h-3.5 w-3.5\" },\n md: { box: \"h-10 w-10\", halo: \"h-20 w-20 -inset-5\", glyph: \"h-4 w-4\" },\n lg: { box: \"h-14 w-14\", halo: \"h-28 w-28 -inset-7\", glyph: \"h-5 w-5\" },\n xl: { box: \"h-20 w-20\", halo: \"h-40 w-40 -inset-10\", glyph: \"h-7 w-7\" },\n};\n\n/**\n * BrandMark — small branded visual primitive (AI badge / empty-state anchor).\n *\n * Binds **roles.brand** via `--brand-mark` / `--brand-mark-foreground`, never\n * product CTA (`--primary` / roles.action). Skins and Brand Package override\n * `--brand-mark` independently of buttons.\n *\n * Full VI lockups use `@nebutra/brand` Logo / LogomarkSVG (currentColor →\n * `text-brand-mark` or VI assets).\n *\n * @example\n * ```tsx\n * <BrandMark size=\"lg\" halo>\n * <Sparkles className=\"h-5 w-5\" />\n * </BrandMark>\n * ```\n */\nexport function BrandMark({\n children,\n variant = \"gradient\",\n size = \"md\",\n className,\n halo = false,\n ariaHidden = true,\n}: BrandMarkProps) {\n const sizes = SIZE_MAP[size];\n\n return (\n <span\n aria-hidden={ariaHidden}\n className={cn(\"relative inline-flex shrink-0 items-center justify-center\", className)}\n >\n {halo && (\n <span\n aria-hidden=\"true\"\n className={cn(\n \"pointer-events-none absolute rounded-full bg-brand-mark opacity-30 blur-2xl\",\n sizes.halo,\n )}\n />\n )}\n\n <span\n className={cn(\n \"relative inline-flex items-center justify-center rounded-[var(--radius-2xl)]\",\n sizes.box,\n variant === \"gradient\" && \"bg-brand-mark text-brand-mark-foreground shadow-sm\",\n variant === \"soft\" && \"bg-brand-mark/10 text-brand-mark dark:bg-brand-mark/20\",\n variant === \"outline\" && \"border border-border bg-background text-foreground\",\n )}\n >\n {children ?? <DefaultGlyph className={sizes.glyph} />}\n </span>\n </span>\n );\n}\n\nfunction DefaultGlyph({ className }: { className?: string }) {\n return (\n <svg\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n aria-hidden=\"true\"\n className={className}\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <circle cx=\"8\" cy=\"8\" r=\"3\" fill=\"currentColor\" />\n <circle cx=\"8\" cy=\"8\" r=\"6.5\" stroke=\"currentColor\" strokeOpacity=\"0.35\" />\n </svg>\n );\n}\n","/**\n * Empty State Component Tokens — Layer 3\n *\n * Zero-content surfaces need stable geometry across product screens. Components\n * consume these through local CSS variables instead of raw spacing/font values.\n */\n\nimport {\n primitiveFontSize,\n primitiveFontWeight,\n primitiveRadius,\n primitiveSizing,\n primitiveSpacing,\n} from \"../primitive\";\n\nexport const emptyStateTokens = {\n root: {\n minHeight: {\n sm: primitiveSpacing[16] * 2,\n md: primitiveSpacing[24] * 2,\n lg: primitiveSpacing[16] * 4,\n },\n paddingX: {\n sm: primitiveSpacing[4],\n md: primitiveSpacing[6],\n lg: primitiveSpacing[8],\n },\n paddingY: {\n sm: primitiveSpacing[8],\n md: primitiveSpacing[10],\n lg: primitiveSpacing[14],\n },\n radius: primitiveRadius.lg,\n },\n content: {\n maxWidth: primitiveSpacing[14] * 8,\n descriptionMaxWidth: primitiveSpacing[12] * 8,\n stackGap: primitiveSpacing[4],\n copyGap: primitiveSpacing[2],\n actionsGap: primitiveSpacing[2],\n },\n icon: {\n size: primitiveSizing.lg,\n radius: primitiveRadius.lg,\n },\n typography: {\n title: {\n sm: primitiveFontSize.sm,\n md: primitiveFontSize.base,\n lg: primitiveFontSize.lg,\n },\n description: {\n sm: primitiveFontSize.xs,\n md: primitiveFontSize.sm,\n lg: primitiveFontSize.sm,\n },\n titleWeight: primitiveFontWeight.semibold,\n titleLineHeight: primitiveSpacing[6],\n descriptionLineHeight: primitiveSpacing[6],\n },\n} as const;\n","\"use client\";\n\nimport * as React from \"react\";\nimport { emptyStateTokens } from \"../tokens/components/empty-state\";\nimport { cn } from \"../utils/cn\";\n\nexport type EmptyStateVariant =\n | \"blank-slate\"\n | \"informational\"\n | \"educational\"\n | \"guide\"\n | \"no-results\"\n | \"cleared\"\n | \"permission\"\n | \"error\";\n\nexport type EmptyStateSize = \"sm\" | \"md\" | \"lg\";\nexport type EmptyStateAlign = \"center\" | \"start\";\n\nexport interface EmptyStateRootProps\n extends Omit<React.HTMLAttributes<HTMLElement>, \"title\" | \"children\"> {\n title: React.ReactNode;\n description?: React.ReactNode;\n icon?: React.ReactNode;\n /** Preferred CTA slot. Use real Button/Link elements. */\n children?: React.ReactNode;\n /** Compatibility alias for the primary CTA. Prefer children for new code. */\n action?: React.ReactNode;\n /** Compatibility alias for the secondary CTA. Prefer children for new code. */\n link?: React.ReactNode;\n variant?: EmptyStateVariant;\n size?: EmptyStateSize;\n align?: EmptyStateAlign;\n /** Use for empty states that appear after async filtering changes. */\n live?: boolean;\n}\n\nexport interface EmptyStateIconProps extends React.HTMLAttributes<HTMLDivElement> {\n icon: React.ReactNode;\n}\n\nconst variantClassName: Record<EmptyStateVariant, string> = {\n \"blank-slate\": \"border border-dashed border-border bg-background\",\n informational: \"border border-border bg-card\",\n educational: \"border border-border bg-card\",\n guide: \"border border-border bg-muted/30\",\n \"no-results\": \"border border-dashed border-border bg-background\",\n cleared: \"border border-dashed border-border bg-muted/20\",\n permission: \"border border-border bg-card\",\n error: \"border border-destructive/25 bg-destructive/5\",\n};\n\nconst iconToneClassName: Record<EmptyStateVariant, string> = {\n \"blank-slate\": \"text-muted-foreground\",\n informational: \"text-primary\",\n educational: \"text-primary\",\n guide: \"text-primary\",\n \"no-results\": \"text-muted-foreground\",\n cleared: \"text-muted-foreground\",\n permission: \"text-muted-foreground\",\n error: \"text-destructive\",\n};\n\ntype EmptyStateCssVar =\n | \"--empty-state-min-height\"\n | \"--empty-state-padding-x\"\n | \"--empty-state-padding-y\"\n | \"--empty-state-radius\"\n | \"--empty-state-content-max-width\"\n | \"--empty-state-description-max-width\"\n | \"--empty-state-stack-gap\"\n | \"--empty-state-copy-gap\"\n | \"--empty-state-actions-gap\"\n | \"--empty-state-icon-size\"\n | \"--empty-state-icon-radius\"\n | \"--empty-state-title-size\"\n | \"--empty-state-description-size\"\n | \"--empty-state-title-weight\"\n | \"--empty-state-title-line-height\"\n | \"--empty-state-description-line-height\";\n\nconst emptyStateCssVars = (size: EmptyStateSize) =>\n ({\n \"--empty-state-min-height\": `${emptyStateTokens.root.minHeight[size]}px`,\n \"--empty-state-padding-x\": `${emptyStateTokens.root.paddingX[size]}px`,\n \"--empty-state-padding-y\": `${emptyStateTokens.root.paddingY[size]}px`,\n \"--empty-state-radius\": `${emptyStateTokens.root.radius}px`,\n \"--empty-state-content-max-width\": `${emptyStateTokens.content.maxWidth}px`,\n \"--empty-state-description-max-width\": `${emptyStateTokens.content.descriptionMaxWidth}px`,\n \"--empty-state-stack-gap\": `${emptyStateTokens.content.stackGap}px`,\n \"--empty-state-copy-gap\": `${emptyStateTokens.content.copyGap}px`,\n \"--empty-state-actions-gap\": `${emptyStateTokens.content.actionsGap}px`,\n \"--empty-state-icon-size\": `${emptyStateTokens.icon.size}px`,\n \"--empty-state-icon-radius\": `${emptyStateTokens.icon.radius}px`,\n \"--empty-state-title-size\": `${emptyStateTokens.typography.title[size]}px`,\n \"--empty-state-description-size\": `${emptyStateTokens.typography.description[size]}px`,\n \"--empty-state-title-weight\": `${emptyStateTokens.typography.titleWeight}`,\n \"--empty-state-title-line-height\": `${emptyStateTokens.typography.titleLineHeight}px`,\n \"--empty-state-description-line-height\": `${emptyStateTokens.typography.descriptionLineHeight}px`,\n }) satisfies React.CSSProperties & Record<EmptyStateCssVar, string>;\n\nconst EmptyStateIcon = ({\n className,\n icon,\n ref,\n ...props\n}: EmptyStateIconProps & { ref?: React.Ref<HTMLDivElement> | undefined }) => (\n <div\n ref={ref}\n aria-hidden=\"true\"\n className={cn(\n \"flex size-[var(--empty-state-icon-size)] shrink-0 items-center justify-center rounded-[var(--empty-state-icon-radius)] bg-muted\",\n className,\n )}\n {...props}\n >\n {icon}\n </div>\n);\nEmptyStateIcon.displayName = \"EmptyState.Icon\";\n\nconst EmptyStateRoot = ({\n className,\n title,\n description,\n icon,\n children,\n action,\n link,\n style,\n variant = \"blank-slate\",\n size = \"md\",\n align = \"center\",\n live = false,\n ref,\n ...props\n}: EmptyStateRootProps & { ref?: React.Ref<HTMLElement> | undefined }) => {\n const actions = children ?? [action, link].filter(Boolean);\n const hasActions = React.Children.toArray(actions).length > 0;\n\n return (\n <section\n ref={ref}\n aria-live={live ? \"polite\" : undefined}\n className={cn(\n \"flex min-h-[var(--empty-state-min-height)] w-full flex-col justify-center rounded-[var(--empty-state-radius)] px-[var(--empty-state-padding-x)] py-[var(--empty-state-padding-y)]\",\n variantClassName[variant],\n align === \"center\" ? \"items-center text-center\" : \"items-start text-left\",\n className,\n )}\n style={{ ...emptyStateCssVars(size), ...style }}\n {...props}\n >\n <div\n className={cn(\n \"flex max-w-[var(--empty-state-content-max-width)] flex-col gap-[var(--empty-state-stack-gap)]\",\n align === \"center\" ? \"items-center\" : \"items-start\",\n )}\n >\n {icon ? (\n <div className={cn(\"[&>div]:bg-muted\", iconToneClassName[variant])}>{icon}</div>\n ) : null}\n\n <div className=\"space-y-[var(--empty-state-copy-gap)]\">\n <h3 className=\"font-[var(--empty-state-title-weight)] text-[length:var(--empty-state-title-size)] leading-[var(--empty-state-title-line-height)] text-foreground\">\n {title}\n </h3>\n {description ? (\n <p className=\"max-w-[var(--empty-state-description-max-width)] text-[length:var(--empty-state-description-size)] leading-[var(--empty-state-description-line-height)] text-muted-foreground\">\n {description}\n </p>\n ) : null}\n </div>\n\n {hasActions ? (\n <div\n className={cn(\n \"flex flex-wrap gap-[var(--empty-state-actions-gap)]\",\n align === \"center\" ? \"justify-center\" : \"justify-start\",\n )}\n >\n {actions}\n </div>\n ) : null}\n </div>\n </section>\n );\n};\nEmptyStateRoot.displayName = \"EmptyState.Root\";\n\nexport const EmptyState = {\n Root: EmptyStateRoot,\n Icon: EmptyStateIcon,\n} as const;\n\nexport { EmptyStateIcon, EmptyStateRoot };\n","\"use client\";\n\nimport type { ReactNode } from \"react\";\nimport { BrandMark } from \"../primitives/brand-mark\";\nimport { EmptyState as EmptyStatePrimitive } from \"../primitives/empty-state\";\nimport { cn } from \"../utils/cn\";\n\ntype Tone = \"default\" | \"branded\" | \"subtle\";\ntype Size = \"sm\" | \"md\" | \"lg\";\n\nexport interface EmptyStateProps {\n /** Primary message. */\n title: string;\n /** Supporting description. */\n description?: string;\n /** Visual anchor. When omitted and `tone=\"branded\"`, a default `<BrandMark>` is rendered. */\n mascot?: ReactNode;\n /** Inline icon shown above the title. Ignored when `mascot` is provided. */\n icon?: ReactNode;\n /** Primary call-to-action node. */\n action?: ReactNode;\n /** Secondary call-to-action node. */\n secondaryAction?: ReactNode;\n /**\n * Visual tone.\n * - `default`: neutral bordered state\n * - `branded`: BrandMark anchor for first-touch panels\n * - `subtle`: quieter inline state\n */\n tone?: Tone;\n /** Size variant. */\n size?: Size;\n /** Extra classes for the root element. */\n className?: string;\n}\n\nconst toneVariant: Record<Tone, \"blank-slate\" | \"informational\" | \"guide\"> = {\n default: \"blank-slate\",\n branded: \"informational\",\n subtle: \"guide\",\n};\n\n/**\n * EmptyState — layout-compatible wrapper around the canonical compound\n * primitive. New composition work should prefer `EmptyState.Root` from\n * `@nebutra/ui/primitives`; product layout code can keep this simpler API.\n */\nexport function EmptyState({\n title,\n description,\n mascot,\n icon,\n action,\n secondaryAction,\n tone = \"default\",\n size = \"md\",\n className,\n}: EmptyStateProps) {\n const visual =\n mascot ??\n icon ??\n (tone === \"branded\" ? <BrandMark size={size === \"lg\" ? \"lg\" : \"md\"} /> : null);\n\n return (\n <EmptyStatePrimitive.Root\n action={action}\n className={cn(tone === \"subtle\" && \"border-0 bg-transparent\", className)}\n description={description}\n icon={visual ? <EmptyStatePrimitive.Icon icon={visual} /> : undefined}\n link={secondaryAction}\n size={size}\n title={title}\n variant={toneVariant[tone]}\n />\n );\n}\n","\"use client\";\n\nimport * as React from \"react\";\n\nexport interface SlotProps extends React.HTMLAttributes<HTMLElement> {\n children?: React.ReactNode;\n}\n\n/**\n * Custom Slot implementation to remove @radix-ui/react-slot dependency.\n * Merges props from the Slottable parent onto the immediate child element.\n */\nexport const Slot = React.forwardRef<HTMLElement, SlotProps>(\n ({ children, className, style, ...props }, ref) => {\n // Resolve the single child without using React.Children.only — which throws\n // when children is a single-element array, fragment, or a string. Prerender\n // pipelines sometimes wrap JSX children in arrays of length 1, which passes\n // React.Children.count(=== 1) but trips React.Children.only.\n const childArray = React.Children.toArray(children);\n const child = childArray.length === 1 ? childArray[0] : null;\n\n if (child == null || !React.isValidElement(child)) {\n // 0 / 2+ / non-element child — graceful span wrapper instead of throwing.\n return (\n <span ref={ref} className={className} style={style} {...props}>\n {children}\n </span>\n );\n }\n\n const childProps = child.props as React.HTMLAttributes<HTMLElement>;\n const mergedRef = (node: HTMLElement | null) => {\n if (typeof ref === \"function\") ref(node);\n else if (ref) ref.current = node;\n\n // React 19 removed `element.ref` — the ref is now a regular prop, so read\n // it from the child's props (reading `child.ref` triggers the removal warning).\n const childRef = (\n childProps as React.HTMLAttributes<HTMLElement> & { ref?: React.Ref<HTMLElement> }\n ).ref;\n if (typeof childRef === \"function\") childRef(node);\n else if (childRef && \"current\" in childRef) {\n (childRef as React.MutableRefObject<HTMLElement | null>).current = node;\n }\n };\n // Order matters: slot's props seed → child's existing props override →\n // explicit className/style/ref take precedence over both (so the slot's\n // className/style merge with the child's, not the child's alone).\n const mergedClass = [className, childProps.className].filter(Boolean).join(\" \");\n const merged: Record<string, unknown> = {\n ...childProps,\n ...props,\n ref: mergedRef,\n className: mergedClass,\n style: { ...childProps.style, ...style },\n };\n return React.cloneElement(\n child,\n merged as React.HTMLAttributes<HTMLElement> & React.RefAttributes<HTMLElement>,\n );\n },\n);\n\nSlot.displayName = \"Slot\";\n\n/**\n * Slottable acts as a marker. In this simple implementation,\n * we just resolve it as a fragment wrapper. For deeper `asChild` composition,\n * complex logic is usually required, but most primitives just need `Slot`.\n */\nexport const Slottable: React.FC<{ children: React.ReactNode }> = ({ children }) => {\n return <>{children}</>;\n};\n","import { cva } from \"class-variance-authority\";\n\n// Heights / weights from recipe.css (--control-height-*, --font-weight-medium).\n// Focus ring uses shared ring token.\nexport const buttonVariants = cva(\n [\n \"inline-flex items-center justify-center gap-2 whitespace-nowrap\",\n \"rounded-[var(--btn-default-radius,var(--radius-md))]\",\n \"text-[length:var(--control-font-size-md,0.875rem)] font-[number:var(--font-weight-medium,500)]\",\n \"transition-colors duration-micro ease-out\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2\",\n \"disabled:pointer-events-none disabled:opacity-50\",\n \"aria-busy:cursor-wait\",\n ].join(\" \"),\n {\n variants: {\n variant: {\n // Recipe-driven via packages/design/tokens/recipe.css (.btn-brand-default)\n default: \"btn-brand-default\",\n ink: \"bg-[var(--neutral-12)] text-[var(--neutral-1)] ring-1 ring-inset ring-[color:var(--neutral-1)]/5 hover:bg-[var(--neutral-11)] hover:-translate-y-px active:translate-y-0 transition-[transform,background-color] duration-micro\",\n destructive: \"bg-destructive text-destructive-foreground hover:bg-destructive/90\",\n outline: \"border border-input bg-background hover:bg-accent hover:text-accent-foreground\",\n secondary: \"bg-secondary text-secondary-foreground hover:bg-secondary/80\",\n ghost: \"hover:bg-accent hover:text-accent-foreground\",\n link: \"text-primary underline-offset-4 hover:underline\",\n tertiary:\n \"border border-transparent bg-transparent text-muted-foreground hover:bg-accent hover:text-accent-foreground hover:border-input\",\n warning: \"bg-warning text-warning-foreground hover:bg-warning/90\",\n },\n size: {\n tiny: \"h-[var(--control-height-tiny,1.5rem)] rounded-[var(--radius-sm)] px-2 text-[length:var(--control-font-size-tiny,0.6875rem)]\",\n sm: \"h-[var(--control-height-sm,2rem)] rounded-[var(--radius-sm)] px-3 text-[length:var(--control-font-size-sm,0.75rem)]\",\n default:\n \"h-[var(--control-height-md,2.5rem)] px-[var(--btn-default-padding-x,1rem)] py-[var(--btn-default-padding-y,0.5rem)]\",\n lg: \"h-[var(--control-height-lg,3rem)] rounded-[var(--radius-lg)] px-5 text-[length:var(--control-font-size-lg,1rem)]\",\n icon: \"h-[var(--control-height-md,2.5rem)] w-[var(--control-height-md,2.5rem)]\",\n },\n shape: {\n default: \"\",\n square: \"\",\n circle: \"\",\n },\n },\n compoundVariants: [\n { shape: \"square\", size: \"tiny\", className: \"w-[var(--control-height-tiny,1.5rem)] px-0\" },\n { shape: \"square\", size: \"sm\", className: \"w-[var(--control-height-sm,2rem)] px-0\" },\n { shape: \"square\", size: \"default\", className: \"w-[var(--control-height-md,2.5rem)] px-0\" },\n { shape: \"square\", size: \"lg\", className: \"w-[var(--control-height-lg,3rem)] px-0\" },\n {\n shape: \"circle\",\n size: \"tiny\",\n className: \"w-[var(--control-height-tiny,1.5rem)] px-0 rounded-full\",\n },\n {\n shape: \"circle\",\n size: \"sm\",\n className: \"w-[var(--control-height-sm,2rem)] px-0 rounded-full\",\n },\n {\n shape: \"circle\",\n size: \"default\",\n className: \"w-[var(--control-height-md,2.5rem)] px-0 rounded-full\",\n },\n {\n shape: \"circle\",\n size: \"lg\",\n className: \"w-[var(--control-height-lg,3rem)] px-0 rounded-full\",\n },\n ],\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n shape: \"default\",\n },\n },\n);\n","\"use client\";\n\nimport type { VariantProps } from \"class-variance-authority\";\nimport type * as React from \"react\";\nimport { cn } from \"../utils/cn\";\nimport { Slot } from \"../utils/slot\";\nimport { buttonVariants } from \"./button-variants\";\n\n// ─── Spinner ──────────────────────────────────────────────────────────────────\n// Uses @keyframes spinner from globals.css\n\nfunction Spinner({ className }: { className?: string }) {\n return (\n <span\n aria-hidden=\"true\"\n className={cn(\n \"block rounded-full border-2 border-current border-t-transparent animate-[spinner_0.6s_linear_infinite]\",\n className,\n )}\n />\n );\n}\n\n// ─── Icon size class mapping ──────────────────────────────────────────────────\n\nfunction getIconSizeClass(size: string | null | undefined): string {\n switch (size) {\n case \"tiny\":\n return \"[&>svg]:size-3\"; // 12px\n case \"sm\":\n return \"[&>svg]:size-3.5\"; // 14px\n case \"lg\":\n return \"[&>svg]:size-4.5\"; // 18px\n default:\n return \"[&>svg]:size-4\"; // 16px\n }\n}\n\nfunction getSpinnerSizeClass(size: string | null | undefined): string {\n switch (size) {\n case \"tiny\":\n return \"size-3\"; // 12px\n case \"sm\":\n return \"size-3.5\"; // 14px\n case \"lg\":\n return \"size-4.5\"; // 18px\n default:\n return \"size-4\"; // 16px\n }\n}\n\n// ─── Shadow class mapping ─────────────────────────────────────────────────────\n\nconst SHADOW_CLASSES: Record<string, string> = {\n sm: \"shadow-sm\",\n md: \"shadow-md\",\n lg: \"shadow-md\",\n};\n\nfunction resolveShadowClass(shadow: boolean | \"sm\" | \"md\" | \"lg\" | undefined): string | undefined {\n if (!shadow) return undefined;\n const level = shadow === true ? \"md\" : shadow;\n return SHADOW_CLASSES[level];\n}\n\n// ─── ButtonContent (shared between Button & ButtonLink) ───────────────────────\n\ninterface ButtonContentProps {\n loading: boolean;\n prefix?: React.ReactNode | undefined;\n suffix?: React.ReactNode | undefined;\n size?: string | null | undefined;\n children?: React.ReactNode | undefined;\n}\n\nfunction ButtonContent({ loading, prefix, suffix, size, children }: ButtonContentProps) {\n const iconSizeClass = getIconSizeClass(size);\n\n return (\n <>\n {loading && <Spinner className={getSpinnerSizeClass(size)} />}\n {prefix != null && (\n <span aria-hidden=\"true\" className={cn(\"shrink-0\", iconSizeClass)}>\n {prefix}\n </span>\n )}\n {children}\n {suffix != null && (\n <span aria-hidden=\"true\" className={cn(\"shrink-0\", iconSizeClass)}>\n {suffix}\n </span>\n )}\n </>\n );\n}\n\n// ─── Button ───────────────────────────────────────────────────────────────────\n\nexport interface ButtonProps\n extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, \"prefix\">,\n VariantProps<typeof buttonVariants> {\n /** Render as a child element (Radix Slot — polymorphic) */\n asChild?: boolean;\n /** Show loading spinner and disable interaction */\n loading?: boolean;\n /** Icon or element rendered before children */\n prefix?: React.ReactNode;\n /** Icon or element rendered after children */\n suffix?: React.ReactNode;\n /** Elevation shadow level. `true` resolves to `\"md\"` */\n shadow?: boolean | \"sm\" | \"md\" | \"lg\";\n}\n\nconst Button = ({\n className,\n variant,\n size,\n shape,\n asChild = false,\n loading = false,\n disabled,\n prefix,\n suffix,\n shadow,\n children,\n ref,\n ...props\n}: ButtonProps & { ref?: React.Ref<HTMLButtonElement> | undefined }) => {\n const Comp = asChild ? Slot : \"button\";\n const isDisabled = Boolean(disabled || loading);\n const shadowClass = resolveShadowClass(shadow);\n\n return (\n <Comp\n ref={ref}\n className={cn(buttonVariants({ variant, size, shape }), shadowClass, className)}\n disabled={isDisabled}\n aria-busy={loading || undefined}\n {...props}\n >\n {asChild ? (\n children\n ) : (\n <ButtonContent loading={loading} prefix={prefix} suffix={suffix} size={size}>\n {children}\n </ButtonContent>\n )}\n </Comp>\n );\n};\nButton.displayName = \"Button\";\n\n// ─── ButtonLink ───────────────────────────────────────────────────────────────\n\nexport interface ButtonLinkProps\n extends Omit<React.AnchorHTMLAttributes<HTMLAnchorElement>, \"prefix\">,\n VariantProps<typeof buttonVariants> {\n /** Icon or element rendered before children */\n prefix?: React.ReactNode;\n /** Icon or element rendered after children */\n suffix?: React.ReactNode;\n /** Elevation shadow level. `true` resolves to `\"md\"` */\n shadow?: boolean | \"sm\" | \"md\" | \"lg\";\n /** Show loading spinner */\n loading?: boolean;\n}\n\nconst ButtonLink = ({\n className,\n variant,\n size,\n shape,\n prefix,\n suffix,\n shadow,\n loading = false,\n children,\n ref,\n ...props\n}: ButtonLinkProps & { ref?: React.Ref<HTMLAnchorElement> | undefined }) => {\n const shadowClass = resolveShadowClass(shadow);\n\n const loadingProps = loading\n ? {\n \"aria-busy\": \"true\" as const,\n \"aria-disabled\": \"true\" as const,\n tabIndex: -1,\n }\n : {};\n\n return (\n <a\n ref={ref}\n className={cn(\n buttonVariants({ variant, size, shape }),\n shadowClass,\n loading && \"pointer-events-none opacity-50\",\n className,\n )}\n {...loadingProps}\n {...props}\n >\n <ButtonContent loading={loading} prefix={prefix} suffix={suffix} size={size}>\n {children}\n </ButtonContent>\n </a>\n );\n};\nButtonLink.displayName = \"ButtonLink\";\n\nexport { Button, ButtonLink };\n","\"use client\";\n\nimport { Warning as AlertCircle, External as ExternalLink } from \"@nebutra/icons\";\nimport type * as React from \"react\";\nimport { cn } from \"../utils/cn\";\nimport { Button, ButtonLink } from \"./button\";\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface ErrorObject {\n /** Error description */\n message: string;\n /** Optional title for block error surfaces */\n title?: string;\n /** Label for the action link */\n action?: string;\n /** href for the action link */\n link?: string;\n /** Stable request, trace, deployment, or run identifier */\n id?: string;\n /** Short machine-readable code */\n code?: string;\n}\n\nexport interface ErrorMessageProps {\n /** Inline error text (alternative to `error` prop) */\n children?: React.ReactNode;\n /** Optional label prefix shown before the message (e.g. \"Email Error\") */\n label?: string;\n /** Font size variant */\n size?: \"small\" | \"medium\" | \"large\";\n /** Structured error object — `message` + optional `action`/`link` */\n error?: ErrorObject;\n /** Additional CSS classes */\n className?: string;\n}\n\nexport type ErrorSize = \"small\" | \"medium\" | \"large\";\n\ntype LinkRecoveryAction = {\n action: string;\n link: string;\n onAction?: never;\n actionLoading?: never;\n};\n\ntype ButtonRecoveryAction = {\n action: string;\n onAction: () => void;\n link?: never;\n actionLoading?: boolean;\n};\n\ntype NoRecoveryAction = {\n action?: undefined;\n link?: undefined;\n onAction?: undefined;\n actionLoading?: never;\n};\n\nexport type ErrorRecoveryAction = LinkRecoveryAction | ButtonRecoveryAction | NoRecoveryAction;\n\nexport type ErrorProps = Omit<React.HTMLAttributes<HTMLDivElement>, \"title\"> &\n ErrorRecoveryAction & {\n /** Error title. Name the resource that failed. */\n title?: string;\n /** Optional compact label above the message, e.g. \"Request Error\". */\n label?: string;\n /** Hide the label while preserving the message and title. */\n showLabel?: boolean;\n /** Message content. Alternative to `error.message`. */\n children?: React.ReactNode;\n /** Visual density. */\n size?: ErrorSize;\n /** Structured error data. */\n error?: ErrorObject;\n /** Stable request, trace, deployment, or run identifier. */\n errorId?: string;\n /** Label used before the stable identifier. */\n errorIdLabel?: string;\n /** Async announcement mode. Use assertive only for blocking failures. */\n live?: \"polite\" | \"assertive\" | \"off\";\n };\n\n// =============================================================================\n// Size maps\n// =============================================================================\n\nconst textSize: Record<NonNullable<ErrorMessageProps[\"size\"]>, string> = {\n small: \"text-xs\",\n medium: \"text-sm\",\n large: \"text-base\",\n};\n\nconst iconSize: Record<NonNullable<ErrorMessageProps[\"size\"]>, number> = {\n small: 12,\n medium: 14,\n large: 16,\n};\n\nconst surfaceSize: Record<ErrorSize, string> = {\n small: \"gap-2 rounded-[var(--radius-md)] p-3 text-sm\",\n medium: \"gap-3 rounded-[var(--radius-lg)] p-4 text-sm\",\n large: \"gap-3 rounded-[var(--radius-lg)] p-5 text-base\",\n};\n\nconst surfaceIconSize: Record<ErrorSize, number> = {\n small: 14,\n medium: 16,\n large: 18,\n};\n\nfunction getActionTarget(link: string | undefined): React.AnchorHTMLAttributes<HTMLAnchorElement> {\n if (link?.startsWith(\"http\")) {\n return { target: \"_blank\", rel: \"noopener noreferrer\" };\n }\n\n return {};\n}\n\n// =============================================================================\n// ErrorMessage\n// =============================================================================\n\n/**\n * ErrorMessage — inline error indicator with icon, optional label, and action link.\n *\n * @example\n * // Simple inline error\n * <ErrorMessage>This email is already in use.</ErrorMessage>\n *\n * @example\n * // With label prefix\n * <ErrorMessage label=\"Email Error\">This email is already in use.</ErrorMessage>\n *\n * @example\n * // Structured with action link\n * <ErrorMessage error={{ message: \"The request failed.\", action: \"Contact Us\", link: \"/contact\" }} />\n */\nexport const ErrorMessage = ({\n ref,\n children,\n label,\n size = \"medium\",\n error,\n className,\n}: ErrorMessageProps & { ref?: React.Ref<HTMLSpanElement> | undefined }) => {\n const sz = size;\n\n // Resolve content from either `error` prop or `children`\n const message = error?.message ?? children;\n\n return (\n <span\n ref={ref}\n role=\"alert\"\n className={cn(\"inline-flex items-center gap-1.5 text-destructive\", textSize[sz], className)}\n >\n <AlertCircle size={iconSize[sz]} aria-hidden=\"true\" className=\"shrink-0\" />\n\n <span>\n {label && <span className=\"font-medium\">{label}: </span>}\n {message}\n {error?.action && error.link && (\n <>\n {\" \"}\n <a\n href={error.link}\n className=\"underline underline-offset-2 hover:no-underline\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n {error.action}\n <ExternalLink size={10} aria-hidden=\"true\" className=\"ml-0.5 inline\" />\n </a>\n </>\n )}\n </span>\n </span>\n );\n};\nErrorMessage.displayName = \"ErrorMessage\";\n\n/**\n * Error — block-level error surface for failed sections, panels, and route boundaries.\n *\n * Use `ErrorMessage` only for legacy inline text. Field validation should prefer\n * the owning form/input primitive.\n */\nconst ErrorSurface = ({\n children,\n label,\n showLabel = true,\n title,\n size = \"medium\",\n error,\n errorId,\n errorIdLabel = \"Request ID\",\n live = \"polite\",\n action,\n link,\n onAction,\n actionLoading = false,\n className,\n role,\n ref,\n ...props\n}: ErrorProps & { ref?: React.Ref<HTMLDivElement> | undefined }) => {\n const message = error?.message ?? children;\n const resolvedTitle = title ?? error?.title;\n const resolvedAction = action ?? error?.action;\n const resolvedLink = link ?? error?.link;\n const resolvedErrorId = errorId ?? error?.id;\n const resolvedRole = role ?? (live === \"assertive\" ? \"alert\" : \"status\");\n const ariaLive = live === \"off\" ? undefined : live;\n\n return (\n <div\n ref={ref}\n role={resolvedRole}\n aria-live={ariaLive}\n className={cn(\n \"flex w-full border border-destructive/25 bg-destructive/5 text-foreground\",\n surfaceSize[size],\n className,\n )}\n {...props}\n >\n <span\n aria-hidden=\"true\"\n className=\"mt-0.5 flex size-7 shrink-0 items-center justify-center rounded-[var(--radius-sm)] border border-destructive/20 bg-background text-destructive\"\n >\n <AlertCircle size={surfaceIconSize[size]} />\n </span>\n\n <div className=\"min-w-0 flex-1\">\n {label && showLabel ? (\n <p className=\"mb-1 text-xs font-medium uppercase tracking-normal text-destructive\">\n {label}\n </p>\n ) : null}\n\n {resolvedTitle ? (\n <p className=\"font-semibold leading-6 text-foreground\">{resolvedTitle}</p>\n ) : null}\n\n {message ? (\n <p className={cn(\"leading-5 text-muted-foreground\", resolvedTitle && \"mt-1\")}>\n {message}\n </p>\n ) : null}\n\n {resolvedErrorId ? (\n <details className=\"mt-3 text-xs text-muted-foreground\">\n <summary className=\"cursor-pointer select-none text-foreground\">\n Diagnostic details\n </summary>\n <code className=\"mt-2 block overflow-x-auto rounded-[var(--radius-sm)] border bg-background px-2 py-1 font-mono text-xs text-muted-foreground\">\n {errorIdLabel}: {resolvedErrorId}\n {error?.code ? ` (${error.code})` : \"\"}\n </code>\n </details>\n ) : null}\n\n {resolvedAction ? (\n <div className=\"mt-4 flex flex-wrap gap-2\">\n {resolvedLink ? (\n <ButtonLink\n href={resolvedLink}\n size=\"sm\"\n variant=\"outline\"\n {...getActionTarget(resolvedLink)}\n >\n {resolvedAction}\n </ButtonLink>\n ) : (\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"outline\"\n loading={actionLoading}\n onClick={onAction}\n >\n {resolvedAction}\n </Button>\n )}\n </div>\n ) : null}\n </div>\n </div>\n );\n};\nErrorSurface.displayName = \"Error\";\n\nexport { ErrorSurface as Error };\n","\"use client\";\n\nimport { Error as ErrorSurface } from \"../primitives/error-message\";\n\nexport interface ErrorStateProps {\n /** Error title */\n title?: string;\n /** Error detail or message */\n message?: string;\n /** Optional retry callback */\n onRetry?: () => void;\n /** Stable request, trace, deployment, or run identifier */\n errorId?: string;\n}\n\n/**\n * ErrorState — inline error display with optional retry action.\n *\n * @status stable\n * @planned apps/web dashboard — React Error Boundary fallback, failed fetch/mutation states.\n *\n * @example\n * ```tsx\n * <ErrorState\n * title=\"Failed to load projects\"\n * message={error.message}\n * onRetry={refetch}\n * />\n * ```\n */\nexport function ErrorState({\n title = \"Couldn’t Load Resource\",\n message,\n onRetry,\n errorId,\n}: ErrorStateProps) {\n const stableIdProps = errorId === undefined ? {} : { errorId };\n\n return (\n <div className=\"px-4 py-6\">\n {onRetry ? (\n <ErrorSurface title={title} action=\"Try Again\" onAction={onRetry} {...stableIdProps}>\n {message}\n </ErrorSurface>\n ) : (\n <ErrorSurface title={title} {...stableIdProps}>\n {message}\n </ErrorSurface>\n )}\n </div>\n );\n}\n","\"use client\";\n\nimport Link from \"next/link\";\nimport type { ReactNode } from \"react\";\nimport { Button } from \"../primitives/button\";\n\nexport interface FullPageStatusAction {\n label: string;\n /** Either href (renders <Link>) or onClick (renders <button>). */\n href?: string;\n onClick?: () => void;\n}\n\nexport interface FullPageStatusMeta {\n /** e.g. \"Error ID: abc123\" — rendered monospace, muted. */\n errorId?: string;\n /** e.g. \"status.nebutra.com\" — rendered as link if `statusUrl` provided. */\n statusUrl?: string;\n}\n\nexport interface FullPageStatusProps {\n /** Eyebrow label, e.g. \"Error 404\" / \"Error 500\". Rendered monospace, uppercase. */\n code: string;\n /** Headline. Keep it direct; use Accent only for subtle neutral emphasis. */\n title: ReactNode;\n /** Single-sentence subcopy. */\n description: string;\n /** Primary CTA (filled neutral ink). */\n primaryAction: FullPageStatusAction;\n /** Secondary CTA (outlined). Optional. */\n secondaryAction?: FullPageStatusAction;\n /** Optional footer metadata: error ID + status page link. */\n meta?: FullPageStatusMeta;\n /**\n * Layout variant.\n * - `\"viewport\"` (default): full-viewport takeover with bg — for not-found.tsx / global-error.\n * - `\"section\"`: in-segment, no bg, ~60vh min height — for segment `error.tsx` inside a layout.\n */\n variant?: \"viewport\" | \"section\";\n}\n\n/**\n * FullPageStatus — restrained full-page status template for 404, 500, and other\n * authenticated error/not-found states that live inside the root layout.\n *\n * Pattern: monospace eyebrow → headline → subcopy → primary + optional secondary CTA →\n * optional monospace error ID + status link footer. Linear/Vercel/Stripe convention.\n *\n * NOT for `global-error.tsx` — that renders outside root layout and cannot consume\n * CSS variables or Tailwind. Keep that file standalone with inline styles.\n *\n * @example\n * ```tsx\n * <FullPageStatus\n * code=\"Error 404\"\n * title={<>We couldn't find that page.</>}\n * description=\"The page you're looking for doesn't exist or has been moved.\"\n * primaryAction={{ label: \"Go to dashboard\", href: \"/\" }}\n * secondaryAction={{ label: \"Open docs\", href: \"/docs\" }}\n * />\n * ```\n */\nexport function FullPageStatus({\n code,\n title,\n description,\n primaryAction,\n secondaryAction,\n meta,\n variant = \"viewport\",\n}: FullPageStatusProps) {\n const isSection = variant === \"section\";\n const Wrapper = isSection ? \"section\" : \"main\";\n const wrapperClass = isSection\n ? \"flex min-h-[60vh] items-center justify-center px-6 py-12 text-neutral-12\"\n : \"flex min-h-[100dvh] items-center justify-center bg-neutral-1 px-6 text-neutral-12\";\n\n return (\n <Wrapper role={isSection ? \"alert\" : \"main\"} className={wrapperClass}>\n <div className=\"w-full max-w-[480px]\">\n <div className=\"mb-4 font-mono text-xs font-medium uppercase tracking-[0.08em] text-neutral-9\">\n {code}\n </div>\n\n <h1 className=\"mb-3 text-[clamp(28px,5vw,36px)] font-semibold leading-[1.15] tracking-[-0.02em]\">\n {title}\n </h1>\n\n <p className=\"mb-8 max-w-[52ch] text-base leading-[1.6] text-neutral-11\">{description}</p>\n\n <div className=\"flex flex-wrap gap-3\">\n <ActionButton action={primaryAction} variant=\"primary\" />\n {secondaryAction && <ActionButton action={secondaryAction} variant=\"secondary\" />}\n </div>\n\n {meta && (meta.errorId || meta.statusUrl) && (\n <div className=\"mt-10 flex flex-wrap justify-between gap-4 border-t border-neutral-6 pt-5 font-mono text-xs text-neutral-10\">\n {meta.errorId && <span>Error ID: {meta.errorId}</span>}\n {meta.statusUrl && (\n <a\n href={`https://${meta.statusUrl}`}\n className=\"text-neutral-10 hover:text-neutral-12\"\n rel=\"noreferrer\"\n >\n {meta.statusUrl} →\n </a>\n )}\n </div>\n )}\n </div>\n </Wrapper>\n );\n}\n\nfunction ActionButton({\n action,\n variant,\n}: {\n action: FullPageStatusAction;\n variant: \"primary\" | \"secondary\";\n}) {\n const buttonVariant = variant === \"primary\" ? \"ink\" : \"outline\";\n\n if (action.href) {\n return (\n <Button asChild variant={buttonVariant}>\n <Link href={action.href}>{action.label}</Link>\n </Button>\n );\n }\n return (\n <Button type=\"button\" onClick={action.onClick} variant={buttonVariant}>\n {action.label}\n </Button>\n );\n}\n\n/** Subtle neutral emphasis for use inside a `title` prop. */\nFullPageStatus.Accent = function Accent({ children }: { children: ReactNode }) {\n return <span className=\"text-neutral-12\">{children}</span>;\n};\n","\"use client\";\n\nimport { cn } from \"../utils\";\n\nexport interface LoadingStateProps {\n /** Optional message shown below the spinner */\n message?: string;\n /** Size of the spinner */\n size?: \"small\" | \"medium\" | \"large\";\n}\n\nconst spinnerSize = {\n small: \"h-4 w-4 border-2\",\n medium: \"h-6 w-6 border-2\",\n large: \"h-8 w-8 border-4\",\n} as const;\n\n/**\n * LoadingState — centred spinner for async content loading.\n *\n * @status stable\n * @planned apps/web dashboard — React Suspense fallback boundaries for async data routes.\n *\n * @example\n * ```tsx\n * <LoadingState message=\"Fetching projects…\" />\n * ```\n */\nexport function LoadingState({ message, size = \"large\" }: LoadingStateProps) {\n return (\n <div className=\"flex flex-col items-center justify-center py-10\">\n <span\n className={cn(\n \"inline-block animate-spin rounded-full border-solid border-primary border-r-transparent align-[-0.125em]\",\n spinnerSize[size],\n )}\n role=\"status\"\n aria-label={message ?? \"Loading\"}\n />\n {message && <p className=\"mt-3 text-sm text-muted-foreground\">{message}</p>}\n </div>\n );\n}\n","\"use client\";\n\nimport type React from \"react\";\nimport { cn } from \"../utils\";\n\nexport interface PageHeaderProps {\n /** Page title */\n title: string;\n /** Optional subtitle or description */\n description?: string;\n /** Optional action slot (e.g. a Button) */\n actions?: React.ReactNode;\n className?: string;\n}\n\n/**\n * PageHeader — standardised top-of-page title + description + actions row.\n *\n * @status stable\n * @planned apps/web dashboard — every dashboard page top area (Settings, Billing, Team, Logs, etc.).\n *\n * @example\n * ```tsx\n * <PageHeader\n * title=\"Team Settings\"\n * description=\"Manage your team members and permissions.\"\n * actions={<button>Invite member</button>}\n * />\n * ```\n */\nexport function PageHeader({ title, description, actions, className }: PageHeaderProps) {\n return (\n <div\n className={cn(\n \"flex flex-col gap-1 pb-6 sm:flex-row sm:items-start sm:justify-between\",\n className,\n )}\n >\n <div className=\"flex-1\">\n <h1 className=\"text-2xl font-semibold tracking-tight text-foreground\">{title}</h1>\n {description && <p className=\"mt-1 text-sm text-muted-foreground\">{description}</p>}\n </div>\n {actions && <div className=\"mt-2 flex shrink-0 gap-2 sm:mt-0\">{actions}</div>}\n </div>\n );\n}\n","\"use client\";\n\nimport type React from \"react\";\nimport { cn } from \"../utils\";\n\nexport interface SectionProps {\n children: React.ReactNode;\n /** Optional semantic section label (aria-label) */\n label?: string;\n className?: string;\n}\n\n/**\n * Section — semantic page section with vertical spacing.\n *\n * @status stable\n * @planned apps/web dashboard — semantic grouping of dashboard page content with aria-label.\n *\n * @example\n * ```tsx\n * <Section label=\"Features\">\n * <FeatureGrid />\n * </Section>\n * ```\n */\nexport function Section({ children, label, className }: SectionProps) {\n return (\n <section aria-label={label} className={cn(\"py-8\", className)}>\n {children}\n </section>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/tokens/primitive.ts","../../src/tokens/components/overlay.ts","../../src/tokens/components/sheet.ts","../../src/utils/cn.ts","../../src/utils/primitive-props.ts","../../src/primitives/sheet.tsx","../../src/layout/app-shell.tsx","../../src/layout/Card.tsx","../../src/layout/Container.tsx","../../src/layout/DesignSystemProvider.tsx","../../src/primitives/brand-mark.tsx","../../src/tokens/components/empty-state.ts","../../src/primitives/empty-state.tsx","../../src/layout/EmptyState.tsx","../../src/utils/slot.tsx","../../src/primitives/button-variants.ts","../../src/primitives/button.tsx","../../src/primitives/error-message.tsx","../../src/layout/ErrorState.tsx","../../src/layout/FullPageStatus.tsx","../../src/layout/LoadingState.tsx","../../src/layout/PageHeader.tsx","../../src/layout/Section.tsx"],"names":["BaseDialog","React","XIcon","React2","jsxs","jsx","useState","React3","EmptyState","cva","iconSize","Fragment","AlertCircle"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Primitive Design Tokens — Layer 1\n *\n * Raw values only. No CSS variable references, no semantic meaning.\n * These are the \"atoms\" of the design system.\n *\n * Color source: @nebutra/brand `colors` → @nebutra/design-tokens `tokens/core.json` (SSOT).\n * Typography: Geist + Geist Mono (Vercel) with Noto Sans SC + PingFang SC + Microsoft YaHei CJK fallbacks.\n * Aligned with @nebutra/design-tokens SSOT.\n */\n\nimport { colors } from \"@nebutra/brand\";\n\n// ─── Color Palette ────────────────────────────────────────────────────────────\n\nexport const primitiveColors = {\n // Nebutra Blue (云毓蓝) — technology & trust — VI: #0033FE\n blue50: colors.primary[50],\n blue100: colors.primary[100],\n blue200: colors.primary[200],\n blue300: colors.primary[300],\n blue400: colors.primary[400],\n blue500: colors.primary[500], // brand primary\n blue600: colors.primary[600],\n blue700: colors.primary[700],\n blue800: colors.primary[800],\n blue900: colors.primary[900],\n blue950: colors.primary[950],\n\n // Nebutra Cyan (云毓青) — data flow & intelligence — VI: #0BF1C3\n cyan50: colors.accent[50],\n cyan100: colors.accent[100],\n cyan200: colors.accent[200],\n cyan300: colors.accent[300],\n cyan400: colors.accent[400],\n cyan500: colors.accent[500], // brand secondary\n cyan600: colors.accent[600],\n cyan700: colors.accent[700],\n cyan800: colors.accent[800],\n cyan900: colors.accent[900],\n cyan950: colors.accent[950],\n\n // Neutral (blue-undertone gray scale)\n neutral50: colors.neutral[50],\n neutral100: colors.neutral[100],\n neutral200: colors.neutral[200],\n neutral300: colors.neutral[300],\n neutral400: colors.neutral[400],\n neutral500: colors.neutral[500],\n neutral600: colors.neutral[600],\n neutral700: colors.neutral[700],\n neutral800: colors.neutral[800],\n neutral900: colors.neutral[900],\n neutral950: colors.neutral[950], // deepest — used as dark background\n\n // Semantic raw colors — VI §Color Specifications\n // NOTE: info = brand blue (#0033FE), not sky/teal\n red500: \"#ef4444\",\n red600: \"#dc2626\",\n green500: \"#22c55e\", // VI manual specifies this exact value for success\n green600: \"#16a34a\",\n amber500: \"#f59e0b\",\n amber600: \"#d97706\",\n\n white: colors.white,\n black: colors.black,\n} as const;\n\nexport type PrimitiveColor = keyof typeof primitiveColors;\n\n// ─── Brand Gradients — VI §Brand Gradients (first-class design assets) ────────\n\nexport const primitiveGradients = {\n /** Hero sections, primary CTA buttons, logo fills — VI signature gradient */\n primary: colors.gradient.primary,\n /** Hover states, secondary gradient elements */\n reverse: colors.gradient.primaryReverse,\n /** Vertical layout dividers, page section separators */\n vertical: colors.gradient.primaryVertical,\n /** Background halos, focus glow effects, radial emphasis */\n radial: colors.gradient.primaryRadial,\n /** Dark mode card surfaces — deep brand-blue tinted */\n darkCard: \"linear-gradient(135deg, #020617 0%, #0a1628 100%)\",\n} as const;\n\nexport type PrimitiveGradient = keyof typeof primitiveGradients;\n\n// ─── Spacing Scale (px values) ────────────────────────────────────────────────\n\nexport const primitiveSpacing = {\n 0: 0,\n 1: 4,\n 2: 8,\n 3: 12,\n 4: 16,\n 5: 20,\n 6: 24,\n 8: 32,\n 10: 40,\n 12: 48,\n 14: 56,\n 16: 64,\n 20: 80,\n 24: 96,\n} as const;\n\nexport type PrimitiveSpacing = keyof typeof primitiveSpacing;\n\n// ─── Layout Containers (px) — max-width standards ────────────────────────────\n// Use `text` for text-heavy sections (hero copy, CTA), `content` for general\n// sections, and `wide` for full-bleed feature bento grids.\n\nexport const primitiveContainer = {\n /** Text-focused: hero headlines, CTA copy, FAQ — optimized for reading */\n text: 896, // ~56rem / max-w-4xl\n /** Standard content sections: pricing, architecture, blog */\n content: 1152, // ~72rem / max-w-6xl\n /** Wide sections: feature bento, testimonials, product demos */\n wide: 1400, // ~87.5rem — Vercel/Supabase standard\n} as const;\n\nexport type PrimitiveContainer = keyof typeof primitiveContainer;\n\n// ─── Sizing Scale — component heights (px) ────────────────────────────────────\n\nexport const primitiveSizing = {\n xs: 20,\n /** Geist button-specific size (24px). Larger than xs by design. */\n tiny: 24,\n sm: 32,\n md: 40,\n lg: 48,\n xl: 56,\n \"2xl\": 80,\n} as const;\n\nexport type PrimitiveSizing = keyof typeof primitiveSizing;\n\n// ─── Border Radius (px) ───────────────────────────────────────────────────────\n\nexport const primitiveRadius = {\n none: 0,\n sm: 4,\n md: 6, // Geist default — slightly more rounded than 4px\n lg: 8,\n xl: 12,\n \"2xl\": 16,\n full: 9999,\n} as const;\n\nexport type PrimitiveRadius = keyof typeof primitiveRadius;\n\n// ─── Font Sizes (px) ──────────────────────────────────────────────────────────\n\nexport const primitiveFontSize = {\n xs: 12,\n sm: 14,\n base: 16,\n lg: 18,\n xl: 20,\n \"2xl\": 24,\n \"3xl\": 30,\n \"4xl\": 36,\n} as const;\n\nexport type PrimitiveFontSize = keyof typeof primitiveFontSize;\n\n// ─── Font Weights ─────────────────────────────────────────────────────────────\n\nexport const primitiveFontWeight = {\n light: 300,\n normal: 400,\n medium: 500,\n semibold: 600,\n bold: 700,\n} as const;\n\nexport type PrimitiveFontWeight = keyof typeof primitiveFontWeight;\n\n// ─── Font Families — VI §Typography ──────────────────────────────────────────\n// Aligned with @nebutra/design-tokens SSOT (tokens/core.json fontFamily.*).\n// EN primary: Geist (Vercel variable, 100–900)\n// EN mono: Geist Mono\n// CN primary: Noto Sans SC → PingFang SC → Microsoft YaHei\n\nexport const primitiveFontFamily = {\n /** Default body/UI stack — Geist with CJK auto-fallbacks */\n sans: '\"Geist\", \"Noto Sans SC\", \"PingFang SC\", \"Microsoft YaHei\", -apple-system, BlinkMacSystemFont, system-ui, sans-serif',\n /** Chinese body/UI stack */\n cnSans: '\"Noto Sans SC\", \"PingFang SC\", \"Microsoft YaHei\", sans-serif',\n /** Display / hero headlines */\n display: '\"Geist\", \"Noto Sans SC\", sans-serif',\n /** Heading (alias of display) */\n heading: '\"Geist\", \"Noto Sans SC\", sans-serif',\n /** Code / monospace — Geist Mono pairs with Geist for full family coverage */\n mono: '\"Geist Mono\", ui-monospace, SFMono-Regular, \"SF Mono\", Menlo, monospace',\n} as const;\n\nexport type PrimitiveFontFamily = keyof typeof primitiveFontFamily;\n\n// ─── Shadows ──────────────────────────────────────────────────────────────────\n\nexport const primitiveShadow = {\n none: \"none\",\n sm: \"0 1px 2px 0 rgb(0 0 0 / 0.05)\",\n md: \"0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1)\",\n lg: \"0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1)\",\n xl: \"0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1)\",\n /** Brand glow — blue tone for focus/highlight states */\n brandGlow: \"0 0 0 3px rgb(0 51 254 / 0.15)\",\n} as const;\n\nexport type PrimitiveShadow = keyof typeof primitiveShadow;\n\n// ─── Transition ───────────────────────────────────────────────────────────────\n\n/**\n * Primitive transition tokens — aligned with the four-rail motion scale\n * (SSOT: @nebutra/design-tokens core.json → duration.*).\n * Keys mirror semantic.json motion.duration.*; values are in ms.\n */\nexport const primitiveTransition = {\n duration: {\n micro: 100, // hover, focus, small state changes\n flow: 200, // standard state transitions (default)\n reveal: 300, // larger motion (accordion, modal, drawer)\n cinematic: 500, // hero entrance, big delight moments\n },\n easing: {\n default: \"var(--ease-brand)\",\n spring: \"cubic-bezier(0.34, 1.56, 0.64, 1)\",\n inOut: \"cubic-bezier(0.4, 0, 0.2, 1)\",\n },\n} as const;\n\n// ─── Focus Ring ───────────────────────────────────────────────────────────────\n\nexport const primitiveFocusRing = {\n width: 2, // px\n offset: 2, // px — gap between element and ring\n} as const;\n","/**\n * Overlay Component Tokens — Layer 3\n *\n * Dialog, Menu, Popover, Tooltip, and Command surfaces share one depth,\n * elevation, radius, and motion contract. Components should consume these\n * semantic class tokens instead of inlining z-index, shadow, radius, or\n * duration decisions.\n */\n\nimport { primitiveRadius, primitiveTransition } from \"../primitive\";\nimport { shadowClasses } from \"../shadows\";\n\nconst overlayFocusRingClassName = \"outline-none\";\n\nexport const overlayZIndex = {\n backdrop: 1040,\n modal: 1050,\n popover: 1060,\n tooltip: 1070,\n} as const;\n\nexport const overlayTokens = {\n radius: {\n menu: primitiveRadius.lg,\n modal: primitiveRadius.xl,\n popover: primitiveRadius.lg,\n tooltip: primitiveRadius.md,\n },\n motion: {\n duration: primitiveTransition.duration.flow,\n easing: primitiveTransition.easing.default,\n hoverOpenDelay: primitiveTransition.duration.flow,\n hoverCloseDelay: primitiveTransition.duration.micro,\n },\n zIndex: overlayZIndex,\n} as const;\n\nexport const overlayClassNames = {\n focusRing: overlayFocusRingClassName,\n backdrop:\n \"fixed inset-0 bg-black/40 backdrop-blur-sm transition-[opacity,display] duration-[var(--motion-duration-flow)] ease-[var(--ease-brand)] data-ending-style:opacity-0 data-starting-style:opacity-0 motion-reduce:transition-none\",\n modalSurface: [\n \"fixed left-1/2 top-1/2 grid w-full max-w-lg -translate-x-1/2 -translate-y-1/2 gap-4\",\n \"border border-border/60 bg-background/95 p-6 text-foreground backdrop-blur-xl\",\n \"rounded-[var(--radius-xl)]\",\n shadowClasses[\"2xl\"],\n \"outline-none\",\n \"transition-[opacity,transform,display] duration-[var(--motion-duration-flow)] ease-[var(--ease-brand)]\",\n \"data-starting-style:scale-95 data-starting-style:opacity-0 data-ending-style:scale-95 data-ending-style:opacity-0\",\n \"motion-reduce:transition-none motion-reduce:data-starting-style:transform-none motion-reduce:data-ending-style:transform-none\",\n ].join(\" \"),\n commandSurface: [\n \"fixed left-1/2 top-[18vh] w-[calc(100vw-2rem)] max-w-xl -translate-x-1/2 overflow-hidden\",\n \"rounded-[var(--radius-lg)] border border-border/70 bg-popover text-popover-foreground\",\n shadowClasses[\"2xl\"],\n ].join(\" \"),\n menuSurface: [\n \"min-w-32 origin-[var(--transform-origin)] overflow-hidden rounded-[var(--radius-lg)] border border-border/70 bg-popover/95 p-1 text-popover-foreground backdrop-blur-md\",\n shadowClasses.xl,\n \"outline-none transition-[opacity,transform,display] duration-[var(--motion-duration-flow)] ease-[var(--ease-brand)]\",\n \"data-[starting-style]:scale-[0.97] data-[starting-style]:opacity-0 data-[ending-style]:scale-[0.97] data-[ending-style]:opacity-0\",\n \"motion-reduce:transition-none motion-reduce:data-[starting-style]:transform-none motion-reduce:data-[ending-style]:transform-none\",\n ].join(\" \"),\n selectSurface: [\n \"max-h-[var(--select-content-max-height)] min-w-[var(--select-content-min-width)] origin-[var(--transform-origin)] overflow-hidden\",\n \"rounded-[var(--select-content-radius)] border border-border/70 bg-popover/95 text-popover-foreground backdrop-blur-md\",\n \"shadow-[var(--select-content-shadow)] outline-none\",\n \"transition-[opacity,transform,display] duration-[var(--select-duration)] ease-[var(--ease-brand)]\",\n \"data-starting-style:scale-[0.97] data-starting-style:opacity-0 data-ending-style:scale-[0.97] data-ending-style:opacity-0\",\n \"motion-reduce:transition-none motion-reduce:data-starting-style:transform-none motion-reduce:data-ending-style:transform-none\",\n ].join(\" \"),\n navigationMenuSurface: [\n \"min-w-32 origin-[var(--transform-origin)] overflow-hidden rounded-[var(--radius-xl)] border border-border/70 bg-popover/95 text-popover-foreground backdrop-blur-md\",\n shadowClasses.xl,\n \"outline-none transition-[opacity,transform,display] duration-[var(--motion-duration-flow)] ease-[var(--ease-brand)]\",\n \"data-[starting-style]:scale-[0.97] data-[starting-style]:opacity-0 data-[ending-style]:scale-[0.97] data-[ending-style]:opacity-0\",\n \"motion-reduce:transition-none motion-reduce:data-[starting-style]:transform-none motion-reduce:data-[ending-style]:transform-none\",\n ].join(\" \"),\n popoverSurface: [\n \"w-72 origin-[var(--transform-origin)] rounded-[var(--radius-lg)] border border-border/70 bg-popover/95 p-4 text-popover-foreground backdrop-blur-md\",\n shadowClasses.xl,\n \"outline-none transition-[opacity,transform,display] duration-[var(--motion-duration-flow)] ease-[var(--ease-brand)]\",\n \"data-[open]:opacity-100 data-[closed]:opacity-0 data-[closed]:scale-[0.97] data-[open]:scale-100\",\n \"motion-reduce:transition-none motion-reduce:data-[closed]:transform-none motion-reduce:data-[open]:transform-none\",\n ].join(\" \"),\n tooltipSurface: [\n \"origin-[var(--transform-origin)] overflow-hidden rounded-[var(--radius-md)] border border-border/70 bg-popover/95 px-3 py-1.5 text-sm text-popover-foreground backdrop-blur-md\",\n shadowClasses.md,\n \"transition-[opacity,transform,display] duration-[var(--motion-duration-flow)] ease-[var(--ease-brand)]\",\n \"data-starting-style:scale-[0.97] data-starting-style:opacity-0 data-ending-style:scale-[0.97] data-ending-style:opacity-0\",\n \"data-[instant]:duration-0\",\n \"motion-reduce:transition-none motion-reduce:data-starting-style:transform-none motion-reduce:data-ending-style:transform-none\",\n ].join(\" \"),\n sheetBackdrop: [\n \"fixed inset-0 bg-[var(--sheet-overlay-background)] backdrop-blur-[var(--sheet-overlay-blur)]\",\n \"transition-[opacity,backdrop-filter,display] duration-[var(--motion-duration-flow)] ease-[var(--ease-brand)]\",\n \"data-ending-style:opacity-0 data-starting-style:opacity-0 motion-reduce:transition-none\",\n ].join(\" \"),\n sheetSurface: [\n \"fixed flex flex-col overflow-hidden border border-border bg-[var(--sheet-background)] text-foreground shadow-[var(--sheet-shadow)]\",\n \"outline-none transition-[opacity,transform,display] duration-[var(--motion-duration-flow)] ease-[var(--ease-brand)]\",\n \"data-ending-style:opacity-0 data-starting-style:opacity-0 motion-reduce:transition-none\",\n ].join(\" \"),\n closeButton: `absolute right-4 top-4 rounded-[var(--radius-sm)] opacity-70 ring-offset-background ${overlayFocusRingClassName} transition-opacity duration-[var(--motion-duration-micro)] ease-[var(--ease-brand)] hover:opacity-100 disabled:pointer-events-none data-[open]:bg-accent data-[open]:text-muted-foreground motion-reduce:transition-none`,\n} as const;\n","/**\n * Sheet Component Tokens — Layer 3\n *\n * Contextual edge panel for read-mostly detail views and short forms.\n * Drawer owns mobile bottom-sheet gestures; Dialog owns blocking decisions.\n */\n\nimport {\n primitiveFontSize,\n primitiveRadius,\n primitiveSizing,\n primitiveSpacing,\n primitiveTransition,\n} from \"../primitive\";\n\nexport type SheetSide = \"top\" | \"right\" | \"bottom\" | \"left\";\n\nexport const sheetSides = [\n \"top\",\n \"right\",\n \"bottom\",\n \"left\",\n] as const satisfies readonly SheetSide[];\n\nexport const sheetTokens = {\n inset: primitiveSpacing[3],\n sideWidth: primitiveSizing[\"2xl\"] * 6 + primitiveSpacing[8], // 512px\n edgeHeight: primitiveSizing[\"2xl\"] * 4, // 320px\n paddingX: primitiveSpacing[6],\n paddingY: primitiveSpacing[5],\n bodyPaddingY: primitiveSpacing[4],\n gap: primitiveSpacing[4],\n headerGap: primitiveSpacing[1] + 2,\n footerGap: primitiveSpacing[2],\n radius: primitiveRadius[\"2xl\"],\n close: {\n size: primitiveSizing.sm,\n iconSize: primitiveFontSize.base,\n offset: primitiveSpacing[4],\n radius: primitiveRadius.md,\n },\n overlay: {\n background: \"hsl(var(--background) / 0.68)\",\n blur: \"blur(6px)\",\n },\n surface: {\n background: \"hsl(var(--popover))\",\n shadow: \"var(--elevation-xl)\",\n },\n motion: {\n duration: primitiveTransition.duration.reveal,\n easing: primitiveTransition.easing.inOut,\n },\n} as const;\n","import { type ClassValue, clsx } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","import type * as React from \"react\";\n\n/**\n * Base UI (and some Radix peers) type `style` as CSSProperties | state-function.\n * Token merge helpers only need the plain object branch — drop functions so DTS\n * builds stay green across monorepo and standalone package mirrors.\n * Returns `{}` (never undefined) so spreads stay exactOptionalPropertyTypes-safe.\n */\nexport function asPlainStyle(style: unknown): React.CSSProperties {\n if (style == null || typeof style === \"function\") return {};\n return style as React.CSSProperties;\n}\n\nexport type PrimitiveProps<T> = React.PropsWithChildren<T & { className?: string | undefined }>;\n\nexport type PrimitiveComponent<TElement, TProps> = React.ForwardRefExoticComponent<\n PrimitiveProps<TProps> & React.RefAttributes<TElement>\n>;\n\n/**\n * Resolve the HTMLElement type for a given intrinsic element tag.\n */\ntype ElementForTag<E extends keyof React.JSX.IntrinsicElements> = E extends \"button\"\n ? HTMLButtonElement\n : E extends \"span\"\n ? HTMLSpanElement\n : E extends \"img\"\n ? HTMLImageElement\n : E extends \"label\"\n ? HTMLLabelElement\n : E extends \"input\"\n ? HTMLInputElement\n : E extends \"a\"\n ? HTMLAnchorElement\n : E extends \"p\"\n ? HTMLParagraphElement\n : E extends \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\"\n ? HTMLHeadingElement\n : HTMLElement;\n\n/**\n * Workaround for Radix UI types not resolving HTML element props (className,\n * children, etc.) with React 19 + exactOptionalPropertyTypes.\n *\n * The optional second type parameter `Extra` allows preserving Radix-specific\n * props (e.g. `asChild`, `align`, `sideOffset`) that are not standard HTML attrs.\n *\n * Usage:\n * const Header = withHtmlProps<\"h3\">(AccordionPrimitive.Header);\n * const Trigger = withHtmlProps<\"button\", { asChild?: boolean }>(DialogPrimitive.Trigger);\n * const Content = withHtmlProps<\"div\", { align?: string; sideOffset?: number }>(PopoverPrimitive.Content);\n */\n\nexport function withHtmlProps<E extends keyof React.JSX.IntrinsicElements, Extra = object>(\n // biome-ignore lint/suspicious/noExplicitAny: polymorphic render — the element type is only known at the call site, and naming it here makes the emitted declaration a union of every intrinsic tag\n Component: any,\n): React.ForwardRefExoticComponent<\n React.ComponentPropsWithoutRef<E> & Extra & React.RefAttributes<ElementForTag<E>>\n> {\n return Component;\n}\n","\"use client\";\n\nimport { Dialog as BaseDialog } from \"@base-ui/react/dialog\";\nimport { Cross as XIcon } from \"@nebutra/icons\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport * as React from \"react\";\n\nimport { overlayClassNames, overlayTokens, overlayZIndex } from \"../tokens/components/overlay\";\nimport { sheetTokens } from \"../tokens/components/sheet\";\nimport { cn } from \"../utils/cn\";\nimport { asPlainStyle } from \"../utils/primitive-props\";\n\ntype SheetCssVar =\n | \"--sheet-inset\"\n | \"--sheet-side-width\"\n | \"--sheet-edge-height\"\n | \"--sheet-padding-x\"\n | \"--sheet-padding-y\"\n | \"--sheet-body-padding-y\"\n | \"--sheet-gap\"\n | \"--sheet-header-gap\"\n | \"--sheet-footer-gap\"\n | \"--sheet-radius\"\n | \"--sheet-close-size\"\n | \"--sheet-close-icon-size\"\n | \"--sheet-close-offset\"\n | \"--sheet-close-radius\"\n | \"--sheet-overlay-background\"\n | \"--sheet-overlay-blur\"\n | \"--sheet-background\"\n | \"--sheet-shadow\"\n | \"--sheet-duration\"\n | \"--sheet-easing\";\n\ntype SheetCssVars = React.CSSProperties & Record<SheetCssVar, string>;\n\nfunction getSheetStyle(style: unknown): SheetCssVars {\n return {\n \"--sheet-inset\": `${sheetTokens.inset}px`,\n \"--sheet-side-width\": `${sheetTokens.sideWidth}px`,\n \"--sheet-edge-height\": `${sheetTokens.edgeHeight}px`,\n \"--sheet-padding-x\": `${sheetTokens.paddingX}px`,\n \"--sheet-padding-y\": `${sheetTokens.paddingY}px`,\n \"--sheet-body-padding-y\": `${sheetTokens.bodyPaddingY}px`,\n \"--sheet-gap\": `${sheetTokens.gap}px`,\n \"--sheet-header-gap\": `${sheetTokens.headerGap}px`,\n \"--sheet-footer-gap\": `${sheetTokens.footerGap}px`,\n \"--sheet-radius\": `${sheetTokens.radius}px`,\n \"--sheet-close-size\": `${sheetTokens.close.size}px`,\n \"--sheet-close-icon-size\": `${sheetTokens.close.iconSize}px`,\n \"--sheet-close-offset\": `${sheetTokens.close.offset}px`,\n \"--sheet-close-radius\": `${sheetTokens.close.radius}px`,\n \"--sheet-overlay-background\": sheetTokens.overlay.background,\n \"--sheet-overlay-blur\": sheetTokens.overlay.blur,\n \"--sheet-background\": sheetTokens.surface.background,\n \"--sheet-shadow\": sheetTokens.surface.shadow,\n \"--sheet-duration\": `${overlayTokens.motion.duration}ms`,\n \"--sheet-easing\": overlayTokens.motion.easing,\n ...asPlainStyle(style),\n };\n}\n\nexport type SheetProps = React.ComponentPropsWithoutRef<typeof BaseDialog.Root>;\n\nfunction Sheet({ modal = \"trap-focus\", disablePointerDismissal = true, ...props }: SheetProps) {\n return (\n <BaseDialog.Root\n data-slot=\"sheet\"\n modal={modal}\n disablePointerDismissal={disablePointerDismissal}\n {...props}\n />\n );\n}\nSheet.displayName = \"Sheet\";\n\nexport type SheetTriggerProps = React.ComponentPropsWithoutRef<typeof BaseDialog.Trigger> & {\n asChild?: boolean;\n};\n\nconst SheetTrigger = ({\n asChild,\n children,\n ref,\n ...props\n}: SheetTriggerProps & { ref?: React.Ref<HTMLButtonElement> | undefined }) => {\n if (asChild && React.isValidElement(children)) {\n return (\n <BaseDialog.Trigger\n ref={ref}\n data-slot=\"sheet-trigger\"\n {...props}\n render={children as React.ReactElement<Record<string, unknown>>}\n />\n );\n }\n return (\n <BaseDialog.Trigger ref={ref} data-slot=\"sheet-trigger\" {...props}>\n {children}\n </BaseDialog.Trigger>\n );\n};\nSheetTrigger.displayName = \"SheetTrigger\";\n\nexport type SheetCloseProps = React.ComponentPropsWithoutRef<typeof BaseDialog.Close> & {\n asChild?: boolean;\n};\n\nconst SheetClose = ({\n asChild,\n children,\n ref,\n ...props\n}: SheetCloseProps & { ref?: React.Ref<HTMLButtonElement> | undefined }) => {\n if (asChild && React.isValidElement(children)) {\n return (\n <BaseDialog.Close\n ref={ref}\n data-slot=\"sheet-close\"\n {...props}\n render={children as React.ReactElement<Record<string, unknown>>}\n />\n );\n }\n return (\n <BaseDialog.Close ref={ref} data-slot=\"sheet-close\" {...props}>\n {children}\n </BaseDialog.Close>\n );\n};\nSheetClose.displayName = \"SheetClose\";\n\nexport type SheetPortalProps = React.ComponentPropsWithoutRef<typeof BaseDialog.Portal>;\n\nfunction SheetPortal(props: SheetPortalProps) {\n return <BaseDialog.Portal data-slot=\"sheet-portal\" {...props} />;\n}\nSheetPortal.displayName = \"SheetPortal\";\n\nexport type SheetOverlayProps = React.ComponentPropsWithoutRef<typeof BaseDialog.Backdrop>;\n\nconst SheetOverlay = ({\n className,\n style,\n ref,\n ...props\n}: SheetOverlayProps & { ref?: React.Ref<HTMLDivElement> | undefined }) => (\n <BaseDialog.Backdrop\n ref={ref}\n data-slot=\"sheet-overlay\"\n className={cn(overlayClassNames.sheetBackdrop, className)}\n style={{ zIndex: overlayZIndex.backdrop, ...getSheetStyle(style) }}\n {...props}\n />\n);\nSheetOverlay.displayName = \"SheetOverlay\";\n\nconst sheetVariants = cva(overlayClassNames.sheetSurface, {\n variants: {\n side: {\n top: \"inset-x-[var(--sheet-inset)] top-[var(--sheet-inset)] max-h-[min(var(--sheet-edge-height),calc(100dvh_-_var(--sheet-inset)_-_var(--sheet-inset)))] rounded-[var(--sheet-radius)] data-ending-style:-translate-y-full data-starting-style:-translate-y-full\",\n bottom:\n \"inset-x-[var(--sheet-inset)] bottom-[var(--sheet-inset)] max-h-[min(var(--sheet-edge-height),calc(100dvh_-_var(--sheet-inset)_-_var(--sheet-inset)))] rounded-[var(--sheet-radius)] data-ending-style:translate-y-full data-starting-style:translate-y-full\",\n left: \"inset-y-[var(--sheet-inset)] left-[var(--sheet-inset)] h-[calc(100dvh_-_var(--sheet-inset)_-_var(--sheet-inset))] w-[min(var(--sheet-side-width),calc(100vw_-_var(--sheet-inset)_-_var(--sheet-inset)))] rounded-[var(--sheet-radius)] data-ending-style:-translate-x-full data-starting-style:-translate-x-full\",\n right:\n \"inset-y-[var(--sheet-inset)] right-[var(--sheet-inset)] h-[calc(100dvh_-_var(--sheet-inset)_-_var(--sheet-inset))] w-[min(var(--sheet-side-width),calc(100vw_-_var(--sheet-inset)_-_var(--sheet-inset)))] rounded-[var(--sheet-radius)] data-ending-style:translate-x-full data-starting-style:translate-x-full\",\n },\n },\n defaultVariants: {\n side: \"right\",\n },\n});\n\nexport interface SheetContentProps\n extends React.ComponentPropsWithoutRef<typeof BaseDialog.Popup>,\n VariantProps<typeof sheetVariants> {\n /**\n * Render the backdrop. Prefer `noOverlay` in docs because it names the visual\n * removal directly; `overlay` remains available for boolean composition.\n */\n overlay?: boolean;\n /** Hide the backdrop while keeping the sheet surface and focus behavior. */\n noOverlay?: boolean;\n /** Render the built-in close icon button. */\n showClose?: boolean;\n /** Alias for `showClose`, matching newer generated examples. */\n close?: boolean;\n}\n\nconst SheetContent = ({\n side = \"right\",\n className,\n children,\n overlay = true,\n noOverlay = false,\n showClose,\n close,\n style,\n ref,\n ...props\n}: SheetContentProps & { ref?: React.Ref<HTMLDivElement> | undefined }) => {\n const shouldRenderClose = close ?? showClose ?? true;\n const shouldRenderOverlay = overlay && !noOverlay;\n\n return (\n <SheetPortal>\n {shouldRenderOverlay ? <SheetOverlay /> : null}\n <BaseDialog.Popup\n ref={ref}\n data-slot=\"sheet-content\"\n className={cn(sheetVariants({ side }), className)}\n style={{ zIndex: overlayZIndex.modal, ...getSheetStyle(style) }}\n {...props}\n >\n {children}\n {shouldRenderClose ? (\n <SheetClose\n aria-label=\"Close\"\n className={cn(\n \"absolute right-[var(--sheet-close-offset)] top-[var(--sheet-close-offset)] inline-flex size-[var(--sheet-close-size)] items-center justify-center rounded-[var(--sheet-close-radius)] text-muted-foreground\",\n \"transition-[background-color,color,box-shadow] duration-[var(--motion-duration-micro)] ease-[var(--ease-out)] hover:bg-muted hover:text-foreground\",\n overlayClassNames.focusRing,\n \"disabled:pointer-events-none motion-reduce:transition-none\",\n )}\n >\n <XIcon aria-hidden=\"true\" className=\"size-[var(--sheet-close-icon-size)]\" />\n <span className=\"sr-only\">Close</span>\n </SheetClose>\n ) : null}\n </BaseDialog.Popup>\n </SheetPortal>\n );\n};\nSheetContent.displayName = \"SheetContent\";\n\nexport type SheetHeaderProps = React.ComponentPropsWithoutRef<\"div\">;\n\nconst SheetHeader = ({\n className,\n ref,\n ...props\n}: SheetHeaderProps & { ref?: React.Ref<HTMLDivElement> | undefined }) => (\n <div\n ref={ref}\n data-slot=\"sheet-header\"\n className={cn(\n \"grid gap-[var(--sheet-header-gap)] border-b border-border px-[var(--sheet-padding-x)] py-[var(--sheet-padding-y)] pr-[calc(var(--sheet-padding-x)_+_var(--sheet-close-size))] text-left\",\n className,\n )}\n {...props}\n />\n);\nSheetHeader.displayName = \"SheetHeader\";\n\nexport type SheetBodyProps = React.ComponentPropsWithoutRef<\"div\">;\n\nconst SheetBody = ({\n className,\n ref,\n ...props\n}: SheetBodyProps & { ref?: React.Ref<HTMLDivElement> | undefined }) => (\n <div\n ref={ref}\n data-slot=\"sheet-body\"\n className={cn(\n \"min-h-0 flex-1 overflow-y-auto overscroll-contain px-[var(--sheet-padding-x)] py-[var(--sheet-body-padding-y)]\",\n className,\n )}\n {...props}\n />\n);\nSheetBody.displayName = \"SheetBody\";\n\nexport type SheetFooterProps = React.ComponentPropsWithoutRef<\"div\">;\n\nconst SheetFooter = ({\n className,\n ref,\n ...props\n}: SheetFooterProps & { ref?: React.Ref<HTMLDivElement> | undefined }) => (\n <div\n ref={ref}\n data-slot=\"sheet-footer\"\n className={cn(\n \"mt-auto flex flex-col-reverse gap-[var(--sheet-footer-gap)] border-t border-border px-[var(--sheet-padding-x)] py-[var(--sheet-padding-y)] sm:flex-row sm:justify-end\",\n className,\n )}\n {...props}\n />\n);\nSheetFooter.displayName = \"SheetFooter\";\n\nexport type SheetTitleProps = React.ComponentPropsWithoutRef<typeof BaseDialog.Title>;\n\nconst SheetTitle = ({\n className,\n ref,\n ...props\n}: SheetTitleProps & { ref?: React.Ref<HTMLHeadingElement> | undefined }) => (\n <BaseDialog.Title\n ref={ref}\n data-slot=\"sheet-title\"\n className={cn(\"font-semibold text-base leading-6 text-foreground\", className)}\n {...props}\n />\n);\nSheetTitle.displayName = \"SheetTitle\";\n\nexport type SheetDescriptionProps = React.ComponentPropsWithoutRef<typeof BaseDialog.Description>;\n\nconst SheetDescription = ({\n className,\n ref,\n ...props\n}: SheetDescriptionProps & { ref?: React.Ref<HTMLParagraphElement> | undefined }) => (\n <BaseDialog.Description\n ref={ref}\n data-slot=\"sheet-description\"\n className={cn(\"text-muted-foreground text-sm leading-5\", className)}\n {...props}\n />\n);\nSheetDescription.displayName = \"SheetDescription\";\n\nexport {\n Sheet,\n SheetBody,\n SheetClose,\n SheetContent,\n SheetDescription,\n SheetFooter,\n SheetHeader,\n SheetOverlay,\n SheetPortal,\n SheetTitle,\n SheetTrigger,\n};\n","\"use client\";\n\nimport { Menu } from \"@nebutra/icons\";\nimport * as React from \"react\";\n\nimport { Sheet, SheetContent } from \"../primitives/sheet\";\nimport { cn } from \"../utils/cn\";\n\nexport interface AppShellProps {\n /** Sidebar slot — typically a `SidebarNav` or equivalent navigation tree. */\n sidebar: React.ReactNode;\n /** Optional sticky top header (breadcrumbs, search, user menu). */\n header?: React.ReactNode;\n /** Main content rendered inside `<main>`. */\n children: React.ReactNode;\n /** Sidebar width in pixels when expanded. */\n sidebarWidth?: number;\n /** Sidebar width in pixels when collapsed (icon-only rail). */\n sidebarCollapsedWidth?: number;\n /** Controlled collapsed state. When provided, the component is fully controlled. */\n collapsed?: boolean;\n /** Default collapsed state for uncontrolled usage. */\n defaultCollapsed?: boolean;\n /** Fires whenever the collapsed state changes (both controlled + uncontrolled). */\n onCollapsedChange?: (collapsed: boolean) => void;\n /** Render the desktop sidebar as a floating overlay (absolute, z-40) instead of\n * an in-flow rail that compresses main — for full-bleed builder routes that\n * drive their own toggle. When collapsed to 0 width it's simply invisible. */\n overlay?: boolean;\n /** Height in pixels of the sticky header row. Defaults to 48. */\n headerHeight?: number;\n /** Override the default container styles applied to `<main>`. */\n contentClassName?: string;\n /** Extra classes for the outer wrapper. */\n className?: string;\n}\n\nconst DEFAULT_SIDEBAR_WIDTH = 224;\nconst DEFAULT_COLLAPSED_WIDTH = 52;\nconst DEFAULT_HEADER_HEIGHT = 48;\n\n/**\n * AppShell — top-level dashboard chrome: sidebar + sticky header + scrollable main.\n *\n * Modeled after Vercel / Linear / MiniMax application shells. The sidebar is a\n * fixed-width rail on `md+` viewports and collapses into a `Sheet` overlay on\n * mobile (triggered by the hamburger button shown in the header).\n *\n * The sidebar width animates smoothly (duration-flow, ease-out) when toggling\n * between the expanded and collapsed states so it can host an icon-only rail.\n *\n * @status stable\n *\n * @example\n * ```tsx\n * <AppShell\n * sidebar={<SidebarNav items={navItems} />}\n * header={<DashboardHeader />}\n * >\n * <PageHeader title=\"Overview\" />\n * {children}\n * </AppShell>\n * ```\n */\nexport function AppShell({\n sidebar,\n header,\n children,\n sidebarWidth = DEFAULT_SIDEBAR_WIDTH,\n sidebarCollapsedWidth = DEFAULT_COLLAPSED_WIDTH,\n collapsed,\n defaultCollapsed = false,\n onCollapsedChange,\n headerHeight = DEFAULT_HEADER_HEIGHT,\n contentClassName,\n className,\n overlay = false,\n}: AppShellProps) {\n const isControlled = collapsed !== undefined;\n const [internalCollapsed] = React.useState(defaultCollapsed);\n const isCollapsed = isControlled ? collapsed : internalCollapsed;\n\n const [mobileOpen, setMobileOpen] = React.useState(false);\n\n const railWidth = isCollapsed ? sidebarCollapsedWidth : sidebarWidth;\n\n return (\n <div\n data-ui=\"nebutra-app-shell\"\n className={cn(\n \"relative flex h-screen w-full overflow-hidden bg-background text-foreground\",\n className,\n )}\n >\n {/* Desktop sidebar — fixed rail, hidden on small screens. When the rail\n width collapses to 0 (e.g. a full-bleed route that drives its own\n navigation toggle), drop the border so no seam line remains. */}\n <aside\n aria-label=\"Primary\"\n className={cn(\n \"hidden h-screen overflow-hidden bg-sidebar text-sidebar-foreground md:block\",\n \"transition-[width] duration-flow ease-out\",\n overlay ? \"absolute inset-y-0 left-0 z-40\" : \"shrink-0\",\n railWidth > 0 && \"border-r border-sidebar-border\",\n overlay && railWidth > 0 && \"shadow-2xl\",\n )}\n style={{ width: railWidth }}\n >\n <div\n className=\"h-full overflow-y-auto\"\n style={{ width: isCollapsed ? sidebarCollapsedWidth : sidebarWidth }}\n >\n {sidebar}\n </div>\n </aside>\n\n {/* Overlay backdrop — when the sidebar floats over the content (overlay mode)\n and is expanded, a click on the dimmed content collapses it. */}\n {overlay && !isCollapsed ? (\n <button\n type=\"button\"\n aria-label=\"Collapse navigation\"\n onClick={() => onCollapsedChange?.(true)}\n className=\"absolute inset-0 z-30 hidden cursor-default bg-foreground/20 backdrop-blur-[1px] md:block\"\n />\n ) : null}\n\n {/* Mobile sidebar — Sheet overlay */}\n <Sheet open={mobileOpen} onOpenChange={setMobileOpen}>\n <SheetContent side=\"left\" className=\"w-72 border-r border-sidebar-border bg-sidebar p-0\">\n <div className=\"h-full overflow-y-auto\">{sidebar}</div>\n </SheetContent>\n </Sheet>\n\n {/* Right column — header + main */}\n <div className=\"flex min-h-0 min-w-0 flex-1 flex-col\">\n {header !== undefined && (\n <header\n className={cn(\n \"sticky top-0 z-30 flex shrink-0 items-center gap-2 border-b border-border\",\n \"bg-background/90 px-3 backdrop-blur-xl supports-[backdrop-filter]:bg-background/80 sm:px-4\",\n )}\n style={{ height: headerHeight }}\n >\n <button\n type=\"button\"\n aria-label=\"Open navigation menu\"\n onClick={() => setMobileOpen(true)}\n className={cn(\n \"relative inline-flex size-8 items-center justify-center rounded-[var(--radius-md)] text-foreground/80 after:absolute after:-inset-1.5 after:content-['']\",\n \"hover:bg-muted hover:text-foreground md:hidden\",\n \"focus-visible:outline-none\",\n )}\n >\n <Menu className=\"size-4\" aria-hidden=\"true\" />\n </button>\n <div className=\"flex min-w-0 flex-1 items-center gap-2\">{header}</div>\n </header>\n )}\n\n {/* Header is optional — still show a mobile-only hamburger row when header is omitted */}\n {header === undefined && (\n <div className=\"flex shrink-0 items-center border-b border-border bg-background px-4 py-2 md:hidden\">\n <button\n type=\"button\"\n aria-label=\"Open navigation menu\"\n onClick={() => setMobileOpen(true)}\n className={cn(\n \"relative inline-flex size-8 items-center justify-center rounded-[var(--radius-md)] text-foreground/80 after:absolute after:-inset-1.5 after:content-['']\",\n \"hover:bg-muted hover:text-foreground\",\n \"focus-visible:outline-none\",\n )}\n >\n <Menu className=\"size-4\" aria-hidden=\"true\" />\n </button>\n </div>\n )}\n\n <main\n className={cn(\n \"min-h-0 flex-1 overflow-y-auto w-full max-w-none px-3 py-4 sm:px-4 md:px-5 2xl:px-6\",\n contentClassName,\n )}\n >\n {children}\n </main>\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport type React from \"react\";\nimport { cn } from \"../utils\";\n\nexport interface CardProps {\n children: React.ReactNode;\n className?: string;\n /** Whether the card has a hover/press effect */\n isInteractive?: boolean;\n}\n\n/**\n * Card — surface container with border, background, and shadow.\n *\n * @status stable\n * @planned apps/web dashboard — settings panels, billing summary, team member tiles.\n * See governance/registry.ts for full allocation record.\n *\n * @example\n * ```tsx\n * <Card>\n * <p>Card content</p>\n * </Card>\n * ```\n */\nexport function Card({ children, isInteractive = false, className }: CardProps) {\n return (\n <div\n className={cn(\n \"rounded-[var(--radius-lg)] border border-border bg-background p-4 text-foreground shadow-sm dark:bg-black/40\",\n isInteractive && \"cursor-pointer transition-shadow hover:shadow-md\",\n className,\n )}\n >\n {children}\n </div>\n );\n}\n","\"use client\";\n\nimport type React from \"react\";\nimport { cn } from \"../utils\";\n\nexport type ContainerSize = \"sm\" | \"md\" | \"lg\" | \"xl\" | \"full\";\n\nconst sizeClasses: Record<ContainerSize, string> = {\n sm: \"max-w-screen-sm\",\n md: \"max-w-screen-md\",\n lg: \"max-w-screen-lg\",\n xl: \"max-w-screen-xl\",\n full: \"max-w-full\",\n};\n\nexport interface ContainerProps {\n children: React.ReactNode;\n /** Max-width breakpoint */\n size?: ContainerSize;\n className?: string;\n}\n\n/**\n * Container — centred max-width layout wrapper.\n *\n * @status stable\n * @planned apps/web dashboard — canonical max-width wrapper for all page layouts.\n *\n * @example\n * ```tsx\n * <Container size=\"lg\">\n * <p>Page content</p>\n * </Container>\n * ```\n */\nexport function Container({ children, size = \"lg\", className }: ContainerProps) {\n return <div className={cn(\"mx-auto w-full px-4\", sizeClasses[size], className)}>{children}</div>;\n}\n","\"use client\";\n\nimport type React from \"react\";\nimport { createContext, useCallback, useContext, useEffect, useMemo, useState } from \"react\";\nimport type { ThemeMode } from \"../theme\";\n\n// ============================================\n// Context\n// ============================================\n\ninterface DesignSystemContextValue {\n mode: ThemeMode;\n setMode: (mode: ThemeMode) => void;\n toggleMode: () => void;\n resolvedMode: \"light\" | \"dark\";\n}\n\nconst DesignSystemContext = createContext<DesignSystemContextValue | null>(null);\n\n// ============================================\n// Hook\n// ============================================\n\nexport function useDesignSystem() {\n const context = useContext(DesignSystemContext);\n if (!context) {\n throw new Error(\"useDesignSystem must be used within DesignSystemProvider\");\n }\n return context;\n}\n\n// ============================================\n// Provider Props\n// ============================================\n\nexport interface DesignSystemProviderProps {\n children: React.ReactNode;\n defaultMode?: ThemeMode;\n storageKey?: string;\n enableSystemPreference?: boolean;\n}\n\n// ============================================\n// Provider Component\n// ============================================\n\nexport function DesignSystemProvider({\n children,\n defaultMode = \"system\",\n storageKey = \"nebutra-theme-mode\",\n enableSystemPreference = true,\n}: DesignSystemProviderProps) {\n const [mode, setModeState] = useState<ThemeMode>(defaultMode);\n const [systemPreference, setSystemPreference] = useState<\"light\" | \"dark\">(\"light\");\n\n // Detect system preference\n useEffect(() => {\n if (typeof window === \"undefined\" || !enableSystemPreference) return;\n\n const mediaQuery = window.matchMedia(\"(prefers-color-scheme: dark)\");\n setSystemPreference(mediaQuery.matches ? \"dark\" : \"light\");\n\n const handler = (e: MediaQueryListEvent) => {\n setSystemPreference(e.matches ? \"dark\" : \"light\");\n };\n\n mediaQuery.addEventListener(\"change\", handler);\n return () => mediaQuery.removeEventListener(\"change\", handler);\n }, [enableSystemPreference]);\n\n // Load from storage\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n\n const stored = localStorage.getItem(storageKey);\n if (stored && [\"light\", \"dark\", \"system\"].includes(stored)) {\n setModeState(stored as ThemeMode);\n }\n }, [storageKey]);\n\n // Resolve actual mode\n const resolvedMode = useMemo((): \"light\" | \"dark\" => {\n if (mode === \"system\") {\n return systemPreference;\n }\n return mode;\n }, [mode, systemPreference]);\n\n // Set mode with persistence\n const setMode = useCallback(\n (newMode: ThemeMode) => {\n setModeState(newMode);\n if (typeof window !== \"undefined\") {\n localStorage.setItem(storageKey, newMode);\n }\n },\n [storageKey],\n );\n\n // Toggle between light and dark\n const toggleMode = useCallback(() => {\n setMode(resolvedMode === \"light\" ? \"dark\" : \"light\");\n }, [resolvedMode, setMode]);\n\n // Context value\n const contextValue = useMemo(\n () => ({\n mode,\n setMode,\n toggleMode,\n resolvedMode,\n }),\n [mode, resolvedMode, setMode, toggleMode],\n );\n\n return (\n <DesignSystemContext.Provider value={contextValue}>{children}</DesignSystemContext.Provider>\n );\n}\n","\"use client\";\n\nimport type { ReactNode } from \"react\";\nimport { cn } from \"../utils/cn\";\n\ntype Size = \"sm\" | \"md\" | \"lg\" | \"xl\";\ntype Variant = \"gradient\" | \"soft\" | \"outline\";\n\nexport interface BrandMarkProps {\n /** Optional icon or glyph rendered inside the mark. Defaults to an abstract dot. */\n children?: ReactNode;\n /** Visual variant — solid gradient, soft tinted, or outline. */\n variant?: Variant;\n /** Diameter preset. */\n size?: Size;\n /** Extra classes for the outer element. */\n className?: string;\n /** Whether to render a soft halo behind the mark. */\n halo?: boolean;\n /** Make the mark non-interactive for screen readers. */\n ariaHidden?: boolean;\n}\n\nconst SIZE_MAP: Record<Size, { box: string; halo: string; glyph: string }> = {\n sm: { box: \"h-8 w-8\", halo: \"h-16 w-16 -inset-4\", glyph: \"h-3.5 w-3.5\" },\n md: { box: \"h-10 w-10\", halo: \"h-20 w-20 -inset-5\", glyph: \"h-4 w-4\" },\n lg: { box: \"h-14 w-14\", halo: \"h-28 w-28 -inset-7\", glyph: \"h-5 w-5\" },\n xl: { box: \"h-20 w-20\", halo: \"h-40 w-40 -inset-10\", glyph: \"h-7 w-7\" },\n};\n\n/**\n * BrandMark — small branded visual primitive (AI badge / empty-state anchor).\n *\n * Binds **roles.brand** via `--brand-mark` / `--brand-mark-foreground`, never\n * product CTA (`--primary` / roles.action). Skins and Brand Package override\n * `--brand-mark` independently of buttons.\n *\n * Full VI lockups use `@nebutra/brand` Logo / LogomarkSVG (currentColor →\n * `text-brand-mark` or VI assets).\n *\n * @example\n * ```tsx\n * <BrandMark size=\"lg\" halo>\n * <Sparkles className=\"h-5 w-5\" />\n * </BrandMark>\n * ```\n */\nexport function BrandMark({\n children,\n variant = \"gradient\",\n size = \"md\",\n className,\n halo = false,\n ariaHidden = true,\n}: BrandMarkProps) {\n const sizes = SIZE_MAP[size];\n\n return (\n <span\n aria-hidden={ariaHidden}\n className={cn(\"relative inline-flex shrink-0 items-center justify-center\", className)}\n >\n {halo && (\n <span\n aria-hidden=\"true\"\n className={cn(\n \"pointer-events-none absolute rounded-full bg-brand-mark opacity-30 blur-2xl\",\n sizes.halo,\n )}\n />\n )}\n\n <span\n className={cn(\n \"relative inline-flex items-center justify-center rounded-[var(--radius-2xl)]\",\n sizes.box,\n variant === \"gradient\" && \"bg-brand-mark text-brand-mark-foreground shadow-sm\",\n variant === \"soft\" && \"bg-brand-mark/10 text-brand-mark dark:bg-brand-mark/20\",\n variant === \"outline\" && \"border border-border bg-background text-foreground\",\n )}\n >\n {children ?? <DefaultGlyph className={sizes.glyph} />}\n </span>\n </span>\n );\n}\n\nfunction DefaultGlyph({ className }: { className?: string }) {\n return (\n <svg\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n aria-hidden=\"true\"\n className={className}\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <circle cx=\"8\" cy=\"8\" r=\"3\" fill=\"currentColor\" />\n <circle cx=\"8\" cy=\"8\" r=\"6.5\" stroke=\"currentColor\" strokeOpacity=\"0.35\" />\n </svg>\n );\n}\n","/**\n * Empty State Component Tokens — Layer 3\n *\n * Zero-content surfaces need stable geometry across product screens. Components\n * consume these through local CSS variables instead of raw spacing/font values.\n */\n\nimport {\n primitiveFontSize,\n primitiveFontWeight,\n primitiveRadius,\n primitiveSizing,\n primitiveSpacing,\n} from \"../primitive\";\n\nexport const emptyStateTokens = {\n root: {\n minHeight: {\n sm: primitiveSpacing[16] * 2,\n md: primitiveSpacing[24] * 2,\n lg: primitiveSpacing[16] * 4,\n },\n paddingX: {\n sm: primitiveSpacing[4],\n md: primitiveSpacing[6],\n lg: primitiveSpacing[8],\n },\n paddingY: {\n sm: primitiveSpacing[8],\n md: primitiveSpacing[10],\n lg: primitiveSpacing[14],\n },\n radius: primitiveRadius.lg,\n },\n content: {\n maxWidth: primitiveSpacing[14] * 8,\n descriptionMaxWidth: primitiveSpacing[12] * 8,\n stackGap: primitiveSpacing[4],\n copyGap: primitiveSpacing[2],\n actionsGap: primitiveSpacing[2],\n },\n icon: {\n size: primitiveSizing.lg,\n radius: primitiveRadius.lg,\n },\n typography: {\n title: {\n sm: primitiveFontSize.sm,\n md: primitiveFontSize.base,\n lg: primitiveFontSize.lg,\n },\n description: {\n sm: primitiveFontSize.xs,\n md: primitiveFontSize.sm,\n lg: primitiveFontSize.sm,\n },\n titleWeight: primitiveFontWeight.semibold,\n titleLineHeight: primitiveSpacing[6],\n descriptionLineHeight: primitiveSpacing[6],\n },\n} as const;\n","\"use client\";\n\nimport * as React from \"react\";\nimport { emptyStateTokens } from \"../tokens/components/empty-state\";\nimport { cn } from \"../utils/cn\";\n\nexport type EmptyStateVariant =\n | \"blank-slate\"\n | \"informational\"\n | \"educational\"\n | \"guide\"\n | \"no-results\"\n | \"cleared\"\n | \"permission\"\n | \"error\";\n\nexport type EmptyStateSize = \"sm\" | \"md\" | \"lg\";\nexport type EmptyStateAlign = \"center\" | \"start\";\n\nexport interface EmptyStateRootProps\n extends Omit<React.HTMLAttributes<HTMLElement>, \"title\" | \"children\"> {\n title: React.ReactNode;\n description?: React.ReactNode;\n icon?: React.ReactNode;\n /** Preferred CTA slot. Use real Button/Link elements. */\n children?: React.ReactNode;\n /** Compatibility alias for the primary CTA. Prefer children for new code. */\n action?: React.ReactNode;\n /** Compatibility alias for the secondary CTA. Prefer children for new code. */\n link?: React.ReactNode;\n variant?: EmptyStateVariant;\n size?: EmptyStateSize;\n align?: EmptyStateAlign;\n /** Use for empty states that appear after async filtering changes. */\n live?: boolean;\n}\n\nexport interface EmptyStateIconProps extends React.HTMLAttributes<HTMLDivElement> {\n icon: React.ReactNode;\n}\n\nconst variantClassName: Record<EmptyStateVariant, string> = {\n \"blank-slate\": \"border border-dashed border-border bg-background\",\n informational: \"border border-border bg-card\",\n educational: \"border border-border bg-card\",\n guide: \"border border-border bg-muted/30\",\n \"no-results\": \"border border-dashed border-border bg-background\",\n cleared: \"border border-dashed border-border bg-muted/20\",\n permission: \"border border-border bg-card\",\n error: \"border border-destructive/25 bg-destructive/5\",\n};\n\nconst iconToneClassName: Record<EmptyStateVariant, string> = {\n \"blank-slate\": \"text-muted-foreground\",\n informational: \"text-primary\",\n educational: \"text-primary\",\n guide: \"text-primary\",\n \"no-results\": \"text-muted-foreground\",\n cleared: \"text-muted-foreground\",\n permission: \"text-muted-foreground\",\n error: \"text-destructive\",\n};\n\ntype EmptyStateCssVar =\n | \"--empty-state-min-height\"\n | \"--empty-state-padding-x\"\n | \"--empty-state-padding-y\"\n | \"--empty-state-radius\"\n | \"--empty-state-content-max-width\"\n | \"--empty-state-description-max-width\"\n | \"--empty-state-stack-gap\"\n | \"--empty-state-copy-gap\"\n | \"--empty-state-actions-gap\"\n | \"--empty-state-icon-size\"\n | \"--empty-state-icon-radius\"\n | \"--empty-state-title-size\"\n | \"--empty-state-description-size\"\n | \"--empty-state-title-weight\"\n | \"--empty-state-title-line-height\"\n | \"--empty-state-description-line-height\";\n\nconst emptyStateCssVars = (size: EmptyStateSize) =>\n ({\n \"--empty-state-min-height\": `${emptyStateTokens.root.minHeight[size]}px`,\n \"--empty-state-padding-x\": `${emptyStateTokens.root.paddingX[size]}px`,\n \"--empty-state-padding-y\": `${emptyStateTokens.root.paddingY[size]}px`,\n \"--empty-state-radius\": `${emptyStateTokens.root.radius}px`,\n \"--empty-state-content-max-width\": `${emptyStateTokens.content.maxWidth}px`,\n \"--empty-state-description-max-width\": `${emptyStateTokens.content.descriptionMaxWidth}px`,\n \"--empty-state-stack-gap\": `${emptyStateTokens.content.stackGap}px`,\n \"--empty-state-copy-gap\": `${emptyStateTokens.content.copyGap}px`,\n \"--empty-state-actions-gap\": `${emptyStateTokens.content.actionsGap}px`,\n \"--empty-state-icon-size\": `${emptyStateTokens.icon.size}px`,\n \"--empty-state-icon-radius\": `${emptyStateTokens.icon.radius}px`,\n \"--empty-state-title-size\": `${emptyStateTokens.typography.title[size]}px`,\n \"--empty-state-description-size\": `${emptyStateTokens.typography.description[size]}px`,\n \"--empty-state-title-weight\": `${emptyStateTokens.typography.titleWeight}`,\n \"--empty-state-title-line-height\": `${emptyStateTokens.typography.titleLineHeight}px`,\n \"--empty-state-description-line-height\": `${emptyStateTokens.typography.descriptionLineHeight}px`,\n }) satisfies React.CSSProperties & Record<EmptyStateCssVar, string>;\n\nconst EmptyStateIcon = ({\n className,\n icon,\n ref,\n ...props\n}: EmptyStateIconProps & { ref?: React.Ref<HTMLDivElement> | undefined }) => (\n <div\n ref={ref}\n aria-hidden=\"true\"\n className={cn(\n \"flex size-[var(--empty-state-icon-size)] shrink-0 items-center justify-center rounded-[var(--empty-state-icon-radius)] bg-muted\",\n className,\n )}\n {...props}\n >\n {icon}\n </div>\n);\nEmptyStateIcon.displayName = \"EmptyState.Icon\";\n\nconst EmptyStateRoot = ({\n className,\n title,\n description,\n icon,\n children,\n action,\n link,\n style,\n variant = \"blank-slate\",\n size = \"md\",\n align = \"center\",\n live = false,\n ref,\n ...props\n}: EmptyStateRootProps & { ref?: React.Ref<HTMLElement> | undefined }) => {\n const actions = children ?? [action, link].filter(Boolean);\n const hasActions = React.Children.toArray(actions).length > 0;\n\n return (\n <section\n ref={ref}\n aria-live={live ? \"polite\" : undefined}\n className={cn(\n \"flex min-h-[var(--empty-state-min-height)] w-full flex-col justify-center rounded-[var(--empty-state-radius)] px-[var(--empty-state-padding-x)] py-[var(--empty-state-padding-y)]\",\n variantClassName[variant],\n align === \"center\" ? \"items-center text-center\" : \"items-start text-left\",\n className,\n )}\n style={{ ...emptyStateCssVars(size), ...style }}\n {...props}\n >\n <div\n className={cn(\n \"flex max-w-[var(--empty-state-content-max-width)] flex-col gap-[var(--empty-state-stack-gap)]\",\n align === \"center\" ? \"items-center\" : \"items-start\",\n )}\n >\n {icon ? (\n <div className={cn(\"[&>div]:bg-muted\", iconToneClassName[variant])}>{icon}</div>\n ) : null}\n\n <div className=\"space-y-[var(--empty-state-copy-gap)]\">\n <h3 className=\"font-[var(--empty-state-title-weight)] text-[length:var(--empty-state-title-size)] leading-[var(--empty-state-title-line-height)] text-foreground\">\n {title}\n </h3>\n {description ? (\n <p className=\"max-w-[var(--empty-state-description-max-width)] text-[length:var(--empty-state-description-size)] leading-[var(--empty-state-description-line-height)] text-muted-foreground\">\n {description}\n </p>\n ) : null}\n </div>\n\n {hasActions ? (\n <div\n className={cn(\n \"flex flex-wrap gap-[var(--empty-state-actions-gap)]\",\n align === \"center\" ? \"justify-center\" : \"justify-start\",\n )}\n >\n {actions}\n </div>\n ) : null}\n </div>\n </section>\n );\n};\nEmptyStateRoot.displayName = \"EmptyState.Root\";\n\nexport const EmptyState = {\n Root: EmptyStateRoot,\n Icon: EmptyStateIcon,\n} as const;\n\nexport { EmptyStateIcon, EmptyStateRoot };\n","\"use client\";\n\nimport type { ReactNode } from \"react\";\nimport { BrandMark } from \"../primitives/brand-mark\";\nimport { EmptyState as EmptyStatePrimitive } from \"../primitives/empty-state\";\nimport { cn } from \"../utils/cn\";\n\ntype Tone = \"default\" | \"branded\" | \"subtle\";\ntype Size = \"sm\" | \"md\" | \"lg\";\n\nexport interface EmptyStateProps {\n /** Primary message. */\n title: string;\n /** Supporting description. */\n description?: string;\n /** Visual anchor. When omitted and `tone=\"branded\"`, a default `<BrandMark>` is rendered. */\n mascot?: ReactNode;\n /** Inline icon shown above the title. Ignored when `mascot` is provided. */\n icon?: ReactNode;\n /** Primary call-to-action node. */\n action?: ReactNode;\n /** Secondary call-to-action node. */\n secondaryAction?: ReactNode;\n /**\n * Visual tone.\n * - `default`: neutral bordered state\n * - `branded`: BrandMark anchor for first-touch panels\n * - `subtle`: quieter inline state\n */\n tone?: Tone;\n /** Size variant. */\n size?: Size;\n /** Extra classes for the root element. */\n className?: string;\n}\n\nconst toneVariant: Record<Tone, \"blank-slate\" | \"informational\" | \"guide\"> = {\n default: \"blank-slate\",\n branded: \"informational\",\n subtle: \"guide\",\n};\n\n/**\n * EmptyState — layout-compatible wrapper around the canonical compound\n * primitive. New composition work should prefer `EmptyState.Root` from\n * `@nebutra/ui/primitives`; product layout code can keep this simpler API.\n */\nexport function EmptyState({\n title,\n description,\n mascot,\n icon,\n action,\n secondaryAction,\n tone = \"default\",\n size = \"md\",\n className,\n}: EmptyStateProps) {\n const visual =\n mascot ??\n icon ??\n (tone === \"branded\" ? <BrandMark size={size === \"lg\" ? \"lg\" : \"md\"} /> : null);\n\n return (\n <EmptyStatePrimitive.Root\n action={action}\n className={cn(tone === \"subtle\" && \"border-0 bg-transparent\", className)}\n description={description}\n icon={visual ? <EmptyStatePrimitive.Icon icon={visual} /> : undefined}\n link={secondaryAction}\n size={size}\n title={title}\n variant={toneVariant[tone]}\n />\n );\n}\n","\"use client\";\n\nimport * as React from \"react\";\n\nexport interface SlotProps extends React.HTMLAttributes<HTMLElement> {\n children?: React.ReactNode;\n}\n\n/**\n * Custom Slot implementation to remove @radix-ui/react-slot dependency.\n * Merges props from the Slottable parent onto the immediate child element.\n */\nexport const Slot = React.forwardRef<HTMLElement, SlotProps>(\n ({ children, className, style, ...props }, ref) => {\n // Resolve the single child without using React.Children.only — which throws\n // when children is a single-element array, fragment, or a string. Prerender\n // pipelines sometimes wrap JSX children in arrays of length 1, which passes\n // React.Children.count(=== 1) but trips React.Children.only.\n const childArray = React.Children.toArray(children);\n const child = childArray.length === 1 ? childArray[0] : null;\n\n if (child == null || !React.isValidElement(child)) {\n // 0 / 2+ / non-element child — graceful span wrapper instead of throwing.\n return (\n <span ref={ref} className={className} style={style} {...props}>\n {children}\n </span>\n );\n }\n\n const childProps = child.props as React.HTMLAttributes<HTMLElement>;\n const mergedRef = (node: HTMLElement | null) => {\n if (typeof ref === \"function\") ref(node);\n else if (ref) ref.current = node;\n\n // React 19 removed `element.ref` — the ref is now a regular prop, so read\n // it from the child's props (reading `child.ref` triggers the removal warning).\n const childRef = (\n childProps as React.HTMLAttributes<HTMLElement> & { ref?: React.Ref<HTMLElement> }\n ).ref;\n if (typeof childRef === \"function\") childRef(node);\n else if (childRef && \"current\" in childRef) {\n (childRef as React.MutableRefObject<HTMLElement | null>).current = node;\n }\n };\n // Order matters: slot's props seed → child's existing props override →\n // explicit className/style/ref take precedence over both (so the slot's\n // className/style merge with the child's, not the child's alone).\n const mergedClass = [className, childProps.className].filter(Boolean).join(\" \");\n const merged: Record<string, unknown> = {\n ...childProps,\n ...props,\n ref: mergedRef,\n className: mergedClass,\n style: { ...childProps.style, ...style },\n };\n return React.cloneElement(\n child,\n merged as React.HTMLAttributes<HTMLElement> & React.RefAttributes<HTMLElement>,\n );\n },\n);\n\nSlot.displayName = \"Slot\";\n\n/**\n * Slottable acts as a marker. In this simple implementation,\n * we just resolve it as a fragment wrapper. For deeper `asChild` composition,\n * complex logic is usually required, but most primitives just need `Slot`.\n */\nexport const Slottable: React.FC<{ children: React.ReactNode }> = ({ children }) => {\n return <>{children}</>;\n};\n","import { cva } from \"class-variance-authority\";\n\n// Heights / weights from recipe.css (--control-height-*, --font-weight-medium).\n// Focus ring uses shared ring token.\nexport const buttonVariants = cva(\n [\n \"inline-flex items-center justify-center gap-2 whitespace-nowrap\",\n \"rounded-[var(--btn-default-radius,var(--radius-md))]\",\n \"text-[length:var(--control-font-size-md,0.875rem)] font-[number:var(--font-weight-medium,500)]\",\n \"transition-[color,background-color,border-color,transform] duration-flow ease-[var(--ease-brand)]\",\n \"active:scale-[0.97] motion-reduce:active:scale-100 motion-reduce:transition-none\",\n \"disabled:pointer-events-none disabled:opacity-50\",\n \"aria-busy:cursor-wait\",\n ].join(\" \"),\n {\n variants: {\n variant: {\n // Recipe-driven via packages/design/tokens/recipe.css (.btn-brand-default)\n default: \"btn-brand-default\",\n ink: \"bg-[var(--neutral-12)] text-[var(--neutral-1)] ring-1 ring-inset ring-[color:var(--neutral-1)]/5 hover:bg-[var(--neutral-11)] hover:-translate-y-px active:translate-y-0 transition-[transform,background-color] duration-micro\",\n destructive: \"bg-destructive text-destructive-foreground hover:bg-destructive/90\",\n outline: \"border border-input bg-background hover:bg-accent hover:text-accent-foreground\",\n secondary: \"bg-secondary text-secondary-foreground hover:bg-secondary/80\",\n ghost: \"hover:bg-accent hover:text-accent-foreground\",\n link: \"text-primary underline-offset-4 hover:underline\",\n tertiary:\n \"border border-transparent bg-transparent text-muted-foreground hover:bg-accent hover:text-accent-foreground hover:border-input\",\n warning: \"bg-warning text-warning-foreground hover:bg-warning/90\",\n },\n size: {\n tiny: \"h-[var(--control-height-tiny,1.5rem)] rounded-[var(--radius-sm)] px-2 text-[length:var(--control-font-size-tiny,0.6875rem)]\",\n sm: \"h-[var(--control-height-sm,2rem)] rounded-[var(--radius-sm)] px-3 text-[length:var(--control-font-size-sm,0.75rem)]\",\n default:\n \"h-[var(--control-height-md,2.5rem)] px-[var(--btn-default-padding-x,1rem)] py-[var(--btn-default-padding-y,0.5rem)]\",\n lg: \"h-[var(--control-height-lg,3rem)] rounded-[var(--radius-lg)] px-5 text-[length:var(--control-font-size-lg,1rem)]\",\n icon: \"h-[var(--control-height-md,2.5rem)] w-[var(--control-height-md,2.5rem)]\",\n },\n shape: {\n default: \"\",\n // Radius from --btn-default-radius / --radius-md — brand-switchable.\n // Do not hardcode rounded-md here; a language must be able to retarget\n // the corner treatment of every icon trigger at once.\n square: \"rounded-[var(--btn-default-radius,var(--radius-md))]\",\n // Pill radius token, not Tailwind rounded-full — same 9999px default,\n // but a brand that ships a softer \"circle\" can override --radius-pill.\n circle: \"rounded-[var(--radius-pill,9999px)]\",\n pill: \"rounded-[var(--radius-pill,9999px)]\",\n },\n // Icon-only box size — orthogonal to `size` (which tunes text-button\n // height/padding/font together) and to `shape` (which picks the\n // corner treatment). Only takes effect combined with shape=\"square\"\n // or shape=\"circle\" (see compoundVariants below); every other\n // combination ignores it. 28/32/36 cover the icon-trigger sizes that\n // actually occur in the app — 24/40/48 are already reachable via\n // shape + size (tiny/default/lg). Heights read --control-height-icon-*\n // so density-aware Brand Packages can scale them with the ladder.\n iconSize: {\n sm: \"\", // 28px default\n md: \"\", // 32px default\n lg: \"\", // 36px default\n },\n },\n compoundVariants: [\n { shape: \"square\", size: \"tiny\", className: \"w-[var(--control-height-tiny,1.5rem)] px-0\" },\n { shape: \"square\", size: \"sm\", className: \"w-[var(--control-height-sm,2rem)] px-0\" },\n { shape: \"square\", size: \"default\", className: \"w-[var(--control-height-md,2.5rem)] px-0\" },\n { shape: \"square\", size: \"lg\", className: \"w-[var(--control-height-lg,3rem)] px-0\" },\n {\n shape: \"circle\",\n size: \"tiny\",\n className: \"w-[var(--control-height-tiny,1.5rem)] px-0\",\n },\n {\n shape: \"circle\",\n size: \"sm\",\n className: \"w-[var(--control-height-sm,2rem)] px-0\",\n },\n {\n shape: \"circle\",\n size: \"default\",\n className: \"w-[var(--control-height-md,2.5rem)] px-0\",\n },\n {\n shape: \"circle\",\n size: \"lg\",\n className: \"w-[var(--control-height-lg,3rem)] px-0\",\n },\n // iconSize wins over the size-driven box above — matched on shape +\n // iconSize only, so it applies regardless of whatever `size` was\n // passed (or left at its \"default\" fallback). Corner treatment stays\n // on the shape variant (token-backed); only the box is set here.\n {\n shape: \"square\",\n iconSize: \"sm\",\n className:\n \"h-[var(--control-height-icon-sm,1.75rem)] w-[var(--control-height-icon-sm,1.75rem)] px-0\",\n },\n {\n shape: \"square\",\n iconSize: \"md\",\n className:\n \"h-[var(--control-height-icon-md,2rem)] w-[var(--control-height-icon-md,2rem)] px-0\",\n },\n {\n shape: \"square\",\n iconSize: \"lg\",\n className:\n \"h-[var(--control-height-icon-lg,2.25rem)] w-[var(--control-height-icon-lg,2.25rem)] px-0\",\n },\n {\n shape: \"circle\",\n iconSize: \"sm\",\n className:\n \"h-[var(--control-height-icon-sm,1.75rem)] w-[var(--control-height-icon-sm,1.75rem)] px-0\",\n },\n {\n shape: \"circle\",\n iconSize: \"md\",\n className:\n \"h-[var(--control-height-icon-md,2rem)] w-[var(--control-height-icon-md,2rem)] px-0\",\n },\n {\n shape: \"circle\",\n iconSize: \"lg\",\n className:\n \"h-[var(--control-height-icon-lg,2.25rem)] w-[var(--control-height-icon-lg,2.25rem)] px-0\",\n },\n ],\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n shape: \"default\",\n },\n },\n);\n","\"use client\";\n\nimport type { VariantProps } from \"class-variance-authority\";\nimport type * as React from \"react\";\nimport { cn } from \"../utils/cn\";\nimport { Slot } from \"../utils/slot\";\nimport { buttonVariants } from \"./button-variants\";\n\n// ─── Spinner ──────────────────────────────────────────────────────────────────\n// Uses @keyframes spinner from globals.css\n\nfunction Spinner({ className }: { className?: string }) {\n return (\n <span\n aria-hidden=\"true\"\n className={cn(\n \"block rounded-full border-2 border-current border-t-transparent animate-[spinner_0.6s_linear_infinite]\",\n className,\n )}\n />\n );\n}\n\n// ─── Icon size class mapping ──────────────────────────────────────────────────\n\n// iconSize (28/32/36px box) takes precedence over size (text-button scale)\n// when both are present — an icon-only button sets iconSize, not size.\nfunction getIconSizeClass(\n size: string | null | undefined,\n iconSize?: \"sm\" | \"md\" | \"lg\" | undefined,\n): string {\n if (iconSize === \"sm\") return \"[&>svg]:size-3.5\"; // 14px, 28px box\n if (iconSize === \"md\") return \"[&>svg]:size-3.5\"; // 14px, 32px box\n if (iconSize === \"lg\") return \"[&>svg]:size-4\"; // 16px, 36px box\n switch (size) {\n case \"tiny\":\n return \"[&>svg]:size-3\"; // 12px\n case \"sm\":\n return \"[&>svg]:size-3.5\"; // 14px\n case \"lg\":\n return \"[&>svg]:size-4.5\"; // 18px\n default:\n return \"[&>svg]:size-4\"; // 16px\n }\n}\n\nfunction getSpinnerSizeClass(\n size: string | null | undefined,\n iconSize?: \"sm\" | \"md\" | \"lg\" | undefined,\n): string {\n if (iconSize === \"sm\") return \"size-3.5\"; // 14px, 28px box\n if (iconSize === \"md\") return \"size-3.5\"; // 14px, 32px box\n if (iconSize === \"lg\") return \"size-4\"; // 16px, 36px box\n switch (size) {\n case \"tiny\":\n return \"size-3\"; // 12px\n case \"sm\":\n return \"size-3.5\"; // 14px\n case \"lg\":\n return \"size-4.5\"; // 18px\n default:\n return \"size-4\"; // 16px\n }\n}\n\n// ─── Shadow class mapping ─────────────────────────────────────────────────────\n\nconst SHADOW_CLASSES: Record<string, string> = {\n sm: \"shadow-sm\",\n md: \"shadow-md\",\n lg: \"shadow-md\",\n};\n\nfunction resolveShadowClass(shadow: boolean | \"sm\" | \"md\" | \"lg\" | undefined): string | undefined {\n if (!shadow) return undefined;\n const level = shadow === true ? \"md\" : shadow;\n return SHADOW_CLASSES[level];\n}\n\n// ─── ButtonContent (shared between Button & ButtonLink) ───────────────────────\n\ninterface ButtonContentProps {\n loading: boolean;\n prefix?: React.ReactNode | undefined;\n suffix?: React.ReactNode | undefined;\n size?: string | null | undefined;\n iconSize?: \"sm\" | \"md\" | \"lg\" | undefined;\n children?: React.ReactNode | undefined;\n}\n\nfunction ButtonContent({ loading, prefix, suffix, size, iconSize, children }: ButtonContentProps) {\n const iconSizeClass = getIconSizeClass(size, iconSize);\n\n return (\n <>\n {loading && <Spinner className={getSpinnerSizeClass(size, iconSize)} />}\n {prefix != null && (\n <span aria-hidden=\"true\" className={cn(\"shrink-0\", iconSizeClass)}>\n {prefix}\n </span>\n )}\n {children}\n {suffix != null && (\n <span aria-hidden=\"true\" className={cn(\"shrink-0\", iconSizeClass)}>\n {suffix}\n </span>\n )}\n </>\n );\n}\n\n// ─── Button ───────────────────────────────────────────────────────────────────\n\nexport interface ButtonProps\n extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, \"prefix\">,\n VariantProps<typeof buttonVariants> {\n /** Render as a child element (Radix Slot — polymorphic) */\n asChild?: boolean;\n /** Show loading spinner and disable interaction */\n loading?: boolean;\n /** Icon or element rendered before children */\n prefix?: React.ReactNode;\n /** Icon or element rendered after children */\n suffix?: React.ReactNode;\n /** Elevation shadow level. `true` resolves to `\"md\"` */\n shadow?: boolean | \"sm\" | \"md\" | \"lg\";\n /**\n * Icon-only box size (28 / 32 / 36px) — only takes effect with\n * `shape=\"square\"` or `shape=\"circle\"`. Independent of `size`: use this\n * instead of `size` when the button carries only an icon, so its\n * dimensions don't inherit the text-button height/padding/font scale.\n */\n iconSize?: \"sm\" | \"md\" | \"lg\";\n}\n\nconst Button = ({\n className,\n variant,\n size,\n shape,\n iconSize,\n asChild = false,\n loading = false,\n disabled,\n prefix,\n suffix,\n shadow,\n children,\n ref,\n ...props\n}: ButtonProps & { ref?: React.Ref<HTMLButtonElement> | undefined }) => {\n const Comp = asChild ? Slot : \"button\";\n const isDisabled = Boolean(disabled || loading);\n const shadowClass = resolveShadowClass(shadow);\n\n return (\n <Comp\n ref={ref}\n className={cn(buttonVariants({ variant, size, shape, iconSize }), shadowClass, className)}\n disabled={isDisabled}\n aria-busy={loading || undefined}\n {...props}\n >\n {asChild ? (\n children\n ) : (\n <ButtonContent\n loading={loading}\n prefix={prefix}\n suffix={suffix}\n size={size}\n iconSize={iconSize}\n >\n {children}\n </ButtonContent>\n )}\n </Comp>\n );\n};\nButton.displayName = \"Button\";\n\n// ─── ButtonLink ───────────────────────────────────────────────────────────────\n\nexport interface ButtonLinkProps\n extends Omit<React.AnchorHTMLAttributes<HTMLAnchorElement>, \"prefix\">,\n VariantProps<typeof buttonVariants> {\n /** Icon or element rendered before children */\n prefix?: React.ReactNode;\n /** Icon or element rendered after children */\n suffix?: React.ReactNode;\n /** Elevation shadow level. `true` resolves to `\"md\"` */\n shadow?: boolean | \"sm\" | \"md\" | \"lg\";\n /** Show loading spinner */\n loading?: boolean;\n /**\n * Icon-only box size (28 / 32 / 36px) — only takes effect with\n * `shape=\"square\"` or `shape=\"circle\"`. Independent of `size`: use this\n * instead of `size` when the link carries only an icon, so its\n * dimensions don't inherit the text-button height/padding/font scale.\n */\n iconSize?: \"sm\" | \"md\" | \"lg\";\n}\n\nconst ButtonLink = ({\n className,\n variant,\n size,\n shape,\n iconSize,\n prefix,\n suffix,\n shadow,\n loading = false,\n children,\n ref,\n ...props\n}: ButtonLinkProps & { ref?: React.Ref<HTMLAnchorElement> | undefined }) => {\n const shadowClass = resolveShadowClass(shadow);\n\n const loadingProps = loading\n ? {\n \"aria-busy\": \"true\" as const,\n \"aria-disabled\": \"true\" as const,\n tabIndex: -1,\n }\n : {};\n\n return (\n <a\n ref={ref}\n className={cn(\n buttonVariants({ variant, size, shape, iconSize }),\n shadowClass,\n loading && \"pointer-events-none opacity-50\",\n className,\n )}\n {...loadingProps}\n {...props}\n >\n <ButtonContent\n loading={loading}\n prefix={prefix}\n suffix={suffix}\n size={size}\n iconSize={iconSize}\n >\n {children}\n </ButtonContent>\n </a>\n );\n};\nButtonLink.displayName = \"ButtonLink\";\n\nexport { Button, ButtonLink };\n","\"use client\";\n\nimport { Warning as AlertCircle, External as ExternalLink } from \"@nebutra/icons\";\nimport type * as React from \"react\";\nimport { cn } from \"../utils/cn\";\nimport { Button, ButtonLink } from \"./button\";\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface ErrorObject {\n /** Error description */\n message: string;\n /** Optional title for block error surfaces */\n title?: string;\n /** Label for the action link */\n action?: string;\n /** href for the action link */\n link?: string;\n /** Stable request, trace, deployment, or run identifier */\n id?: string;\n /** Short machine-readable code */\n code?: string;\n}\n\nexport interface ErrorMessageProps {\n /** Inline error text (alternative to `error` prop) */\n children?: React.ReactNode;\n /** Optional label prefix shown before the message (e.g. \"Email Error\") */\n label?: string;\n /** Font size variant */\n size?: \"small\" | \"medium\" | \"large\";\n /** Structured error object — `message` + optional `action`/`link` */\n error?: ErrorObject;\n /** Additional CSS classes */\n className?: string;\n}\n\nexport type ErrorSize = \"small\" | \"medium\" | \"large\";\n\ntype LinkRecoveryAction = {\n action: string;\n link: string;\n onAction?: never;\n actionLoading?: never;\n};\n\ntype ButtonRecoveryAction = {\n action: string;\n onAction: () => void;\n link?: never;\n actionLoading?: boolean;\n};\n\ntype NoRecoveryAction = {\n action?: undefined;\n link?: undefined;\n onAction?: undefined;\n actionLoading?: never;\n};\n\nexport type ErrorRecoveryAction = LinkRecoveryAction | ButtonRecoveryAction | NoRecoveryAction;\n\nexport type ErrorProps = Omit<React.HTMLAttributes<HTMLDivElement>, \"title\"> &\n ErrorRecoveryAction & {\n /** Error title. Name the resource that failed. */\n title?: string;\n /** Optional compact label above the message, e.g. \"Request Error\". */\n label?: string;\n /** Hide the label while preserving the message and title. */\n showLabel?: boolean;\n /** Message content. Alternative to `error.message`. */\n children?: React.ReactNode;\n /** Visual density. */\n size?: ErrorSize;\n /** Structured error data. */\n error?: ErrorObject;\n /** Stable request, trace, deployment, or run identifier. */\n errorId?: string;\n /** Label used before the stable identifier. */\n errorIdLabel?: string;\n /** Async announcement mode. Use assertive only for blocking failures. */\n live?: \"polite\" | \"assertive\" | \"off\";\n };\n\n// =============================================================================\n// Size maps\n// =============================================================================\n\nconst textSize: Record<NonNullable<ErrorMessageProps[\"size\"]>, string> = {\n small: \"text-xs\",\n medium: \"text-sm\",\n large: \"text-base\",\n};\n\nconst iconSize: Record<NonNullable<ErrorMessageProps[\"size\"]>, number> = {\n small: 12,\n medium: 14,\n large: 16,\n};\n\nconst surfaceSize: Record<ErrorSize, string> = {\n small: \"gap-2 rounded-[var(--radius-md)] p-3 text-sm\",\n medium: \"gap-3 rounded-[var(--radius-lg)] p-4 text-sm\",\n large: \"gap-3 rounded-[var(--radius-lg)] p-5 text-base\",\n};\n\nconst surfaceIconSize: Record<ErrorSize, number> = {\n small: 14,\n medium: 16,\n large: 18,\n};\n\nfunction getActionTarget(link: string | undefined): React.AnchorHTMLAttributes<HTMLAnchorElement> {\n if (link?.startsWith(\"http\")) {\n return { target: \"_blank\", rel: \"noopener noreferrer\" };\n }\n\n return {};\n}\n\n// =============================================================================\n// ErrorMessage\n// =============================================================================\n\n/**\n * ErrorMessage — inline error indicator with icon, optional label, and action link.\n *\n * @example\n * // Simple inline error\n * <ErrorMessage>This email is already in use.</ErrorMessage>\n *\n * @example\n * // With label prefix\n * <ErrorMessage label=\"Email Error\">This email is already in use.</ErrorMessage>\n *\n * @example\n * // Structured with action link\n * <ErrorMessage error={{ message: \"The request failed.\", action: \"Contact Us\", link: \"/contact\" }} />\n */\nexport const ErrorMessage = ({\n ref,\n children,\n label,\n size = \"medium\",\n error,\n className,\n}: ErrorMessageProps & { ref?: React.Ref<HTMLSpanElement> | undefined }) => {\n const sz = size;\n\n // Resolve content from either `error` prop or `children`\n const message = error?.message ?? children;\n\n return (\n <span\n ref={ref}\n role=\"alert\"\n className={cn(\"inline-flex items-center gap-1.5 text-destructive\", textSize[sz], className)}\n >\n <AlertCircle size={iconSize[sz]} aria-hidden=\"true\" className=\"shrink-0\" />\n\n <span>\n {label && <span className=\"font-medium\">{label}: </span>}\n {message}\n {error?.action && error.link && (\n <>\n {\" \"}\n <a\n href={error.link}\n className=\"underline underline-offset-2 hover:no-underline\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n {error.action}\n <ExternalLink size={10} aria-hidden=\"true\" className=\"ml-0.5 inline\" />\n </a>\n </>\n )}\n </span>\n </span>\n );\n};\nErrorMessage.displayName = \"ErrorMessage\";\n\n/**\n * Error — block-level error surface for failed sections, panels, and route boundaries.\n *\n * Use `ErrorMessage` only for legacy inline text. Field validation should prefer\n * the owning form/input primitive.\n */\nconst ErrorSurface = ({\n children,\n label,\n showLabel = true,\n title,\n size = \"medium\",\n error,\n errorId,\n errorIdLabel = \"Request ID\",\n live = \"polite\",\n action,\n link,\n onAction,\n actionLoading = false,\n className,\n role,\n ref,\n ...props\n}: ErrorProps & { ref?: React.Ref<HTMLDivElement> | undefined }) => {\n const message = error?.message ?? children;\n const resolvedTitle = title ?? error?.title;\n const resolvedAction = action ?? error?.action;\n const resolvedLink = link ?? error?.link;\n const resolvedErrorId = errorId ?? error?.id;\n const resolvedRole = role ?? (live === \"assertive\" ? \"alert\" : \"status\");\n const ariaLive = live === \"off\" ? undefined : live;\n\n return (\n <div\n ref={ref}\n role={resolvedRole}\n aria-live={ariaLive}\n className={cn(\n \"flex w-full border border-destructive/25 bg-destructive/5 text-foreground\",\n surfaceSize[size],\n className,\n )}\n {...props}\n >\n <span\n aria-hidden=\"true\"\n className=\"mt-0.5 flex size-7 shrink-0 items-center justify-center rounded-[var(--radius-sm)] border border-destructive/20 bg-background text-destructive\"\n >\n <AlertCircle size={surfaceIconSize[size]} />\n </span>\n\n <div className=\"min-w-0 flex-1\">\n {label && showLabel ? (\n <p className=\"mb-1 text-xs font-medium uppercase tracking-normal text-destructive\">\n {label}\n </p>\n ) : null}\n\n {resolvedTitle ? (\n <p className=\"font-semibold leading-6 text-foreground\">{resolvedTitle}</p>\n ) : null}\n\n {message ? (\n <p className={cn(\"leading-5 text-muted-foreground\", resolvedTitle && \"mt-1\")}>\n {message}\n </p>\n ) : null}\n\n {resolvedErrorId ? (\n <details className=\"mt-3 text-xs text-muted-foreground\">\n <summary className=\"cursor-pointer select-none text-foreground\">\n Diagnostic details\n </summary>\n <code className=\"mt-2 block overflow-x-auto rounded-[var(--radius-sm)] border bg-background px-2 py-1 font-mono text-xs text-muted-foreground\">\n {errorIdLabel}: {resolvedErrorId}\n {error?.code ? ` (${error.code})` : \"\"}\n </code>\n </details>\n ) : null}\n\n {resolvedAction ? (\n <div className=\"mt-4 flex flex-wrap gap-2\">\n {resolvedLink ? (\n <ButtonLink\n href={resolvedLink}\n size=\"sm\"\n variant=\"outline\"\n {...getActionTarget(resolvedLink)}\n >\n {resolvedAction}\n </ButtonLink>\n ) : (\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"outline\"\n loading={actionLoading}\n onClick={onAction}\n >\n {resolvedAction}\n </Button>\n )}\n </div>\n ) : null}\n </div>\n </div>\n );\n};\nErrorSurface.displayName = \"Error\";\n\nexport { ErrorSurface as Error };\n","\"use client\";\n\nimport { Error as ErrorSurface } from \"../primitives/error-message\";\n\nexport interface ErrorStateProps {\n /** Error title */\n title?: string;\n /** Error detail or message */\n message?: string;\n /** Optional retry callback */\n onRetry?: () => void;\n /** Stable request, trace, deployment, or run identifier */\n errorId?: string;\n}\n\n/**\n * ErrorState — inline error display with optional retry action.\n *\n * @status stable\n * @planned apps/web dashboard — React Error Boundary fallback, failed fetch/mutation states.\n *\n * @example\n * ```tsx\n * <ErrorState\n * title=\"Failed to load projects\"\n * message={error.message}\n * onRetry={refetch}\n * />\n * ```\n */\nexport function ErrorState({\n title = \"Couldn’t Load Resource\",\n message,\n onRetry,\n errorId,\n}: ErrorStateProps) {\n const stableIdProps = errorId === undefined ? {} : { errorId };\n\n return (\n <div className=\"px-4 py-6\">\n {onRetry ? (\n <ErrorSurface title={title} action=\"Try Again\" onAction={onRetry} {...stableIdProps}>\n {message}\n </ErrorSurface>\n ) : (\n <ErrorSurface title={title} {...stableIdProps}>\n {message}\n </ErrorSurface>\n )}\n </div>\n );\n}\n","\"use client\";\n\nimport Link from \"next/link\";\nimport type { ReactNode } from \"react\";\nimport { Button } from \"../primitives/button\";\n\nexport interface FullPageStatusAction {\n label: string;\n /** Either href (renders <Link>) or onClick (renders <button>). */\n href?: string;\n onClick?: () => void;\n}\n\nexport interface FullPageStatusMeta {\n /** e.g. \"Error ID: abc123\" — rendered monospace, muted. */\n errorId?: string;\n /** e.g. \"status.nebutra.com\" — rendered as link if `statusUrl` provided. */\n statusUrl?: string;\n}\n\nexport interface FullPageStatusProps {\n /** Eyebrow label, e.g. \"Error 404\" / \"Error 500\". Rendered monospace, uppercase. */\n code: string;\n /** Headline. Keep it direct; use Accent only for subtle neutral emphasis. */\n title: ReactNode;\n /** Single-sentence subcopy. */\n description: string;\n /** Primary CTA (filled neutral ink). */\n primaryAction: FullPageStatusAction;\n /** Secondary CTA (outlined). Optional. */\n secondaryAction?: FullPageStatusAction;\n /** Optional footer metadata: error ID + status page link. */\n meta?: FullPageStatusMeta;\n /**\n * Layout variant.\n * - `\"viewport\"` (default): full-viewport takeover with bg — for not-found.tsx / global-error.\n * - `\"section\"`: in-segment, no bg, ~60vh min height — for segment `error.tsx` inside a layout.\n */\n variant?: \"viewport\" | \"section\";\n}\n\n/**\n * FullPageStatus — restrained full-page status template for 404, 500, and other\n * authenticated error/not-found states that live inside the root layout.\n *\n * Pattern: monospace eyebrow → headline → subcopy → primary + optional secondary CTA →\n * optional monospace error ID + status link footer. Linear/Vercel/Stripe convention.\n *\n * NOT for `global-error.tsx` — that renders outside root layout and cannot consume\n * CSS variables or Tailwind. Keep that file standalone with inline styles.\n *\n * @example\n * ```tsx\n * <FullPageStatus\n * code=\"Error 404\"\n * title={<>We couldn't find that page.</>}\n * description=\"The page you're looking for doesn't exist or has been moved.\"\n * primaryAction={{ label: \"Go to dashboard\", href: \"/\" }}\n * secondaryAction={{ label: \"Open docs\", href: \"/docs\" }}\n * />\n * ```\n */\nexport function FullPageStatus({\n code,\n title,\n description,\n primaryAction,\n secondaryAction,\n meta,\n variant = \"viewport\",\n}: FullPageStatusProps) {\n const isSection = variant === \"section\";\n const Wrapper = isSection ? \"section\" : \"main\";\n const wrapperClass = isSection\n ? \"flex min-h-[60vh] items-center justify-center px-6 py-12 text-neutral-12\"\n : \"flex min-h-[100dvh] items-center justify-center bg-neutral-1 px-6 text-neutral-12\";\n\n return (\n <Wrapper role={isSection ? \"alert\" : \"main\"} className={wrapperClass}>\n <div className=\"w-full max-w-[480px]\">\n <div className=\"mb-4 font-mono text-xs font-medium uppercase tracking-[0.08em] text-neutral-9\">\n {code}\n </div>\n\n <h1 className=\"mb-3 text-[clamp(28px,5vw,36px)] font-semibold leading-[1.15] tracking-[-0.02em]\">\n {title}\n </h1>\n\n <p className=\"mb-8 max-w-[52ch] text-base leading-[1.6] text-neutral-11\">{description}</p>\n\n <div className=\"flex flex-wrap gap-3\">\n <ActionButton action={primaryAction} variant=\"primary\" />\n {secondaryAction && <ActionButton action={secondaryAction} variant=\"secondary\" />}\n </div>\n\n {meta && (meta.errorId || meta.statusUrl) && (\n <div className=\"mt-10 flex flex-wrap justify-between gap-4 border-t border-neutral-6 pt-5 font-mono text-xs text-neutral-10\">\n {meta.errorId && <span>Error ID: {meta.errorId}</span>}\n {meta.statusUrl && (\n <a\n href={`https://${meta.statusUrl}`}\n className=\"text-neutral-10 hover:text-neutral-12\"\n rel=\"noreferrer\"\n >\n {meta.statusUrl} →\n </a>\n )}\n </div>\n )}\n </div>\n </Wrapper>\n );\n}\n\nfunction ActionButton({\n action,\n variant,\n}: {\n action: FullPageStatusAction;\n variant: \"primary\" | \"secondary\";\n}) {\n const buttonVariant = variant === \"primary\" ? \"ink\" : \"outline\";\n\n if (action.href) {\n return (\n <Button asChild variant={buttonVariant}>\n <Link href={action.href}>{action.label}</Link>\n </Button>\n );\n }\n return (\n <Button type=\"button\" onClick={action.onClick} variant={buttonVariant}>\n {action.label}\n </Button>\n );\n}\n\n/** Subtle neutral emphasis for use inside a `title` prop. */\nFullPageStatus.Accent = function Accent({ children }: { children: ReactNode }) {\n return <span className=\"text-neutral-12\">{children}</span>;\n};\n","\"use client\";\n\nimport { cn } from \"../utils\";\n\nexport interface LoadingStateProps {\n /** Optional message shown below the spinner */\n message?: string;\n /** Size of the spinner */\n size?: \"small\" | \"medium\" | \"large\";\n}\n\nconst spinnerSize = {\n small: \"h-4 w-4 border-2\",\n medium: \"h-6 w-6 border-2\",\n large: \"h-8 w-8 border-4\",\n} as const;\n\n/**\n * LoadingState — centred spinner for async content loading.\n *\n * @status stable\n * @planned apps/web dashboard — React Suspense fallback boundaries for async data routes.\n *\n * @example\n * ```tsx\n * <LoadingState message=\"Fetching projects…\" />\n * ```\n */\nexport function LoadingState({ message, size = \"large\" }: LoadingStateProps) {\n return (\n <div className=\"flex w-full flex-col items-center justify-center py-10\">\n <span\n className={cn(\n \"inline-block animate-spin rounded-full border-solid border-primary border-r-transparent align-[-0.125em]\",\n spinnerSize[size],\n )}\n role=\"status\"\n aria-label={message ?? \"Loading\"}\n />\n {message && <p className=\"mt-3 text-sm text-muted-foreground\">{message}</p>}\n </div>\n );\n}\n","\"use client\";\n\nimport type React from \"react\";\nimport { cn } from \"../utils\";\n\nexport interface PageHeaderProps {\n /** Page title */\n title: string;\n /** Optional subtitle or description */\n description?: string;\n /** Optional action slot (e.g. a Button) */\n actions?: React.ReactNode;\n className?: string;\n}\n\n/**\n * PageHeader — standardised top-of-page title + description + actions row.\n *\n * @status stable\n * @planned apps/web dashboard — every dashboard page top area (Settings, Billing, Team, Logs, etc.).\n *\n * @example\n * ```tsx\n * <PageHeader\n * title=\"Team Settings\"\n * description=\"Manage your team members and permissions.\"\n * actions={<button>Invite member</button>}\n * />\n * ```\n */\nexport function PageHeader({ title, description, actions, className }: PageHeaderProps) {\n return (\n <div\n className={cn(\n \"flex flex-col gap-1 pb-6 sm:flex-row sm:items-start sm:justify-between\",\n className,\n )}\n >\n <div className=\"flex-1\">\n <h1 className=\"text-2xl font-semibold tracking-tight text-foreground\">{title}</h1>\n {description && <p className=\"mt-1 text-sm text-muted-foreground\">{description}</p>}\n </div>\n {actions && <div className=\"mt-2 flex shrink-0 gap-2 sm:mt-0\">{actions}</div>}\n </div>\n );\n}\n","\"use client\";\n\nimport type React from \"react\";\nimport { cn } from \"../utils\";\n\nexport interface SectionProps {\n children: React.ReactNode;\n /** Optional semantic section label (aria-label) */\n label?: string;\n className?: string;\n}\n\n/**\n * Section — semantic page section with vertical spacing.\n *\n * @status stable\n * @planned apps/web dashboard — semantic grouping of dashboard page content with aria-label.\n *\n * @example\n * ```tsx\n * <Section label=\"Features\">\n * <FeatureGrid />\n * </Section>\n * ```\n */\nexport function Section({ children, label, className }: SectionProps) {\n return (\n <section aria-label={label} className={cn(\"py-8\", className)}>\n {children}\n </section>\n );\n}\n"]}
|