@nebutra/ui 0.2.3 → 3.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.
Files changed (51) hide show
  1. package/dist/animate-in-BlvjVh2S.d.ts +250 -0
  2. package/dist/{canonical-Drca5UMj.d.ts → canonical-DEhT4VfS.d.ts} +83 -369
  3. package/dist/card-DunB1gKE.d.ts +105 -0
  4. package/dist/chat/index.d.ts +1 -0
  5. package/dist/chat/index.js +3 -0
  6. package/dist/chat/index.js.map +1 -0
  7. package/dist/components/index.d.ts +90 -126
  8. package/dist/components/index.js +433 -182
  9. package/dist/components/index.js.map +1 -1
  10. package/dist/editorial/index.d.ts +404 -0
  11. package/dist/editorial/index.js +942 -0
  12. package/dist/editorial/index.js.map +1 -0
  13. package/dist/empty-state-bmfHCOuN.d.ts +86 -0
  14. package/dist/hooks/index.d.ts +18 -1
  15. package/dist/hooks/index.js +120 -5
  16. package/dist/hooks/index.js.map +1 -1
  17. package/dist/icons/index.d.ts +1 -0
  18. package/dist/index.d.ts +1 -1
  19. package/dist/layout/index.d.ts +17 -58
  20. package/dist/layout/index.js +368 -127
  21. package/dist/layout/index.js.map +1 -1
  22. package/dist/layouts/index.d.ts +1 -1
  23. package/dist/layouts/index.js +93 -28
  24. package/dist/layouts/index.js.map +1 -1
  25. package/dist/patterns/index.d.ts +39 -46
  26. package/dist/patterns/index.js +534 -323
  27. package/dist/patterns/index.js.map +1 -1
  28. package/dist/primitives/canonical.d.ts +5 -2
  29. package/dist/primitives/canonical.js +598 -288
  30. package/dist/primitives/canonical.js.map +1 -1
  31. package/dist/primitives/index.d.ts +165 -63
  32. package/dist/primitives/index.js +1251 -983
  33. package/dist/primitives/index.js.map +1 -1
  34. package/dist/tailwind.preset.d.ts +32 -32
  35. package/dist/tailwind.preset.js +24 -20
  36. package/dist/tailwind.preset.js.map +1 -1
  37. package/dist/theme/index.d.ts +1 -110
  38. package/dist/typography/fonts.css +8 -16
  39. package/dist/typography/index.d.ts +29 -45
  40. package/dist/typography/index.js +26 -14
  41. package/dist/typography/index.js.map +1 -1
  42. package/dist/utils/auth-surfaces.d.ts +33 -0
  43. package/dist/utils/auth-surfaces.js +9 -0
  44. package/dist/utils/auth-surfaces.js.map +1 -0
  45. package/dist/utils/index.d.ts +20 -16
  46. package/dist/utils/index.js +99 -20
  47. package/dist/utils/index.js.map +1 -1
  48. package/package.json +25 -11
  49. package/src/typography/fonts.css +8 -16
  50. package/dist/styles/brand-override.css +0 -61
  51. package/src/styles/brand-override.css +0 -61
@@ -1,8 +1,86 @@
1
- "use client";
2
1
  import { clsx } from 'clsx';
3
- import { twMerge } from 'tailwind-merge';
2
+ import { extendTailwindMerge } from 'tailwind-merge';
3
+ import { tokenColor, tokenValue } from '@nebutra/tokens/values';
4
+
5
+ // src/utils/auth-surfaces.ts
6
+ var AUTH_FORM_COLUMN_CLASS = "relative mx-auto min-w-0 w-[min(100%,360px)] shrink-0";
7
+ var AUTH_PRIMARY_CTA_CLASS = "h-11 w-full";
8
+ var AUTH_OAUTH_GRID_CLASS = "grid grid-cols-2 gap-2";
9
+ var AUTH_OAUTH_BUTTON_CLASS = "h-9 w-full justify-center gap-2 border-border bg-background px-2.5 text-sm font-medium text-foreground shadow-none hover:bg-muted";
10
+
11
+ // src/utils/tw-merge-theme.generated.ts
12
+ var TW_MERGE_THEME = {
13
+ breakpoint: ["3xl", "shell", "tight", "xs"],
14
+ container: ["content", "text", "wide"],
15
+ ease: ["brand", "in", "in-out", "out", "spring"],
16
+ font: ["cn", "display", "heading", "mono", "sans"],
17
+ leading: ["display", "heading"],
18
+ radius: ["2xl", "3xl", "button", "card", "full", "lg", "md", "none", "panel", "sm", "xl", "xs"],
19
+ shadow: [
20
+ "2xl",
21
+ "ambient-glow",
22
+ "ambient-lg",
23
+ "ambient-md",
24
+ "ambient-sm",
25
+ "brand",
26
+ "brand-lg",
27
+ "glass-lg",
28
+ "glass-md",
29
+ "glass-sm",
30
+ "glow-accent",
31
+ "glow-accent-lg",
32
+ "glow-accent-sm",
33
+ "glow-primary",
34
+ "lg",
35
+ "md",
36
+ "sheen",
37
+ "sm",
38
+ "xl",
39
+ "xs"
40
+ ],
41
+ text: [
42
+ "2xl",
43
+ "2xs",
44
+ "3xl",
45
+ "4xl",
46
+ "5xl",
47
+ "6xl",
48
+ "7xl",
49
+ "8xl",
50
+ "9xl",
51
+ "base",
52
+ "body",
53
+ "display",
54
+ "label",
55
+ "lg",
56
+ "meta",
57
+ "sm",
58
+ "ui",
59
+ "xl",
60
+ "xs"
61
+ ],
62
+ tracking: ["display", "heading", "label", "tight"]
63
+ };
64
+ var TW_MERGE_CLASS_GROUPS = {
65
+ duration: [{ duration: ["cinematic", "flow", "micro", "reveal"] }]
66
+ };
4
67
 
5
68
  // src/utils/cn.ts
69
+ var twMerge = extendTailwindMerge({
70
+ extend: {
71
+ theme: Object.fromEntries(
72
+ Object.entries(TW_MERGE_THEME).map(([key, values]) => [key, [...values]])
73
+ ),
74
+ classGroups: Object.fromEntries(
75
+ Object.entries(TW_MERGE_CLASS_GROUPS).map(([key, groups]) => [
76
+ key,
77
+ groups.map(
78
+ (group) => Object.fromEntries(Object.entries(group).map(([k, v]) => [k, [...v]]))
79
+ )
80
+ ])
81
+ )
82
+ }
83
+ });
6
84
  function cn(...inputs) {
7
85
  return twMerge(clsx(inputs));
8
86
  }
@@ -15,23 +93,21 @@ function asPlainStyle(style) {
15
93
  function withHtmlProps(Component) {
16
94
  return Component;
17
95
  }
18
-
19
- // src/utils/brand-colors.ts
20
96
  var BRAND_FALLBACK = {
21
97
  /** VI 云毓蓝 — identity only */
22
- primary: "#0033FE",
23
- accent: "#0BF1C3",
24
- tertiary: "#5c7cfa",
25
- primaryDark: "#002ad4",
26
- backDark: "#000830",
27
- /** Soft product action (matches themes/light --primary ≈ #254bfa) */
28
- productPrimary: "#254bfa",
98
+ primary: tokenColor("--brand-primary"),
99
+ accent: tokenColor("--brand-accent"),
100
+ tertiary: tokenColor("--brand-tertiary"),
101
+ primaryDark: tokenColor("--nebutra-blue-600"),
102
+ backDark: tokenColor("--nebutra-blue-950"),
103
+ /** Product action — semantic --primary */
104
+ productPrimary: tokenColor("--primary"),
29
105
  /**
30
- * Brand mark fallback (= product action when factory brand has action≡brand).
31
- * Skins may diverge (e.g. Linear purple action + indigo mark).
106
+ * Brand mark fallback (= product action: the factory recipe sets
107
+ * --brand-mark: var(--primary)). Skins may diverge.
32
108
  */
33
- brandMark: "#254bfa",
34
- brandMarkForeground: "#ffffff"
109
+ brandMark: tokenColor("--primary"),
110
+ brandMarkForeground: tokenColor("--primary-foreground")
35
111
  };
36
112
  function readCssVar(name, fallback) {
37
113
  if (typeof window === "undefined" || typeof document === "undefined") {
@@ -48,23 +124,26 @@ function asCssColor(value, fallback) {
48
124
  return `hsl(${v})`;
49
125
  }
50
126
  function getProductPrimary() {
51
- return asCssColor(readCssVar("--primary", "228 85% 56%"), BRAND_FALLBACK.productPrimary);
127
+ return asCssColor(
128
+ readCssVar("--primary", tokenValue("--primary")),
129
+ BRAND_FALLBACK.productPrimary
130
+ );
52
131
  }
53
132
  function getBrandPrimary() {
54
133
  return asCssVarColor("--brand-primary", BRAND_FALLBACK.primary);
55
134
  }
56
135
  function getBrandMark() {
57
- const raw = readCssVar("--brand-mark", "228 85% 56%");
136
+ const raw = readCssVar("--brand-mark", tokenValue("--primary"));
58
137
  if (/var\(\s*--primary\s*\)/u.test(raw)) {
59
138
  return getProductPrimary();
60
139
  }
61
140
  return asCssColor(raw, BRAND_FALLBACK.brandMark);
62
141
  }
63
142
  function getBrandMarkForeground() {
64
- const raw = readCssVar("--brand-mark-foreground", "0 0% 100%");
143
+ const raw = readCssVar("--brand-mark-foreground", tokenValue("--primary-foreground"));
65
144
  if (/var\(\s*--primary-foreground\s*\)/u.test(raw)) {
66
145
  return asCssColor(
67
- readCssVar("--primary-foreground", "0 0% 100%"),
146
+ readCssVar("--primary-foreground", tokenValue("--primary-foreground")),
68
147
  BRAND_FALLBACK.brandMarkForeground
69
148
  );
70
149
  }
@@ -93,6 +172,6 @@ function isBreakpointUp(breakpoint) {
93
172
  return window.innerWidth >= BREAKPOINTS[breakpoint];
94
173
  }
95
174
 
96
- export { BRAND_FALLBACK, BREAKPOINTS, asPlainStyle, cn, getBrandAccent, getBrandMark, getBrandMarkForeground, getBrandPrimary, getBrandTertiary, getProductPrimary, isBreakpointUp, readCssVar, withHtmlProps };
175
+ export { AUTH_FORM_COLUMN_CLASS, AUTH_OAUTH_BUTTON_CLASS, AUTH_OAUTH_GRID_CLASS, AUTH_PRIMARY_CTA_CLASS, BRAND_FALLBACK, BREAKPOINTS, asPlainStyle, cn, getBrandAccent, getBrandMark, getBrandMarkForeground, getBrandPrimary, getBrandTertiary, getProductPrimary, isBreakpointUp, readCssVar, withHtmlProps };
97
176
  //# sourceMappingURL=index.js.map
98
177
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utils/cn.ts","../../src/utils/primitive-props.ts","../../src/utils/brand-colors.ts","../../src/utils/index.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["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 // eslint-disable-next-line @typescript-eslint/no-explicit-any\n Component: any,\n): React.ForwardRefExoticComponent<\n React.ComponentPropsWithoutRef<E> & Extra & React.RefAttributes<ElementForTag<E>>\n> {\n return Component;\n}\n","/**\n * Runtime color resolution for APIs that cannot consume CSS variables\n * (Canvas, WebGL, some animation libs).\n *\n * Layers (do not mix):\n * - Product action / CTA: getProductPrimary() → semantic `--primary` (roles.action)\n * - Brand mark / AI badge / logo tint: getBrandMark() → `--brand-mark` (roles.brand)\n * - VI lock (print / legal assets): getBrandPrimary() → `--brand-primary` hex\n *\n * Prefer CSS / Tailwind in components:\n * - `bg-primary` for CTAs\n * - `bg-brand-mark` / `text-brand-mark` for Logo/AI badge (see recipe.css)\n *\n * @see packages/design/ARCHITECTURE.md\n * @see packages/design/tokens/recipe.css\n */\n\n/** SSR fallbacks when document is unavailable */\nexport const BRAND_FALLBACK = {\n /** VI 云毓蓝 — identity only */\n primary: \"#0033FE\",\n accent: \"#0BF1C3\",\n tertiary: \"#5c7cfa\",\n primaryDark: \"#002ad4\",\n backDark: \"#000830\",\n /** Soft product action (matches themes/light --primary ≈ #254bfa) */\n productPrimary: \"#254bfa\",\n /**\n * Brand mark fallback (= product action when factory brand has action≡brand).\n * Skins may diverge (e.g. Linear purple action + indigo mark).\n */\n brandMark: \"#254bfa\",\n brandMarkForeground: \"#ffffff\",\n} as const;\n\n/**\n * Read a CSS variable from :root and return its trimmed value.\n */\nexport function readCssVar(name: string, fallback: string): string {\n if (typeof window === \"undefined\" || typeof document === \"undefined\") {\n return fallback;\n }\n const value = getComputedStyle(document.documentElement).getPropertyValue(name).trim();\n return value || fallback;\n}\n\n/** Turn HSL channel triple or full color into a CSS color string. */\nfunction asCssColor(value: string, fallback: string): string {\n const v = value.trim() || fallback;\n if (\n v.startsWith(\"#\") ||\n v.startsWith(\"rgb\") ||\n v.startsWith(\"hsl\") ||\n v.startsWith(\"oklch\") ||\n v.startsWith(\"color(\")\n ) {\n return v;\n }\n // shadcn-style \"228 85% 56%\"\n return `hsl(${v})`;\n}\n\n/**\n * Product action color — follows the active skin (`--primary`).\n * Use for shaders/canvas that must match buttons/CTAs.\n */\nexport function getProductPrimary(): string {\n return asCssColor(readCssVar(\"--primary\", \"228 85% 56%\"), BRAND_FALLBACK.productPrimary);\n}\n\n/** VI lock color — legal / print lockups only (not product chrome). */\nexport function getBrandPrimary(): string {\n return asCssVarColor(\"--brand-primary\", BRAND_FALLBACK.primary);\n}\n\n/**\n * Product brand-mark (roles.brand) — Logo tile, AI badge, identity chips.\n * Never use for default CTA (that is getProductPrimary / --primary).\n */\nexport function getBrandMark(): string {\n const raw = readCssVar(\"--brand-mark\", \"228 85% 56%\");\n // Factory recipe defaults `--brand-mark: var(--primary)` — resolve to action color.\n if (/var\\(\\s*--primary\\s*\\)/u.test(raw)) {\n return getProductPrimary();\n }\n return asCssColor(raw, BRAND_FALLBACK.brandMark);\n}\n\n/** Foreground on brand-mark surfaces. */\nexport function getBrandMarkForeground(): string {\n const raw = readCssVar(\"--brand-mark-foreground\", \"0 0% 100%\");\n if (/var\\(\\s*--primary-foreground\\s*\\)/u.test(raw)) {\n return asCssColor(\n readCssVar(\"--primary-foreground\", \"0 0% 100%\"),\n BRAND_FALLBACK.brandMarkForeground,\n );\n }\n return asCssColor(raw, BRAND_FALLBACK.brandMarkForeground);\n}\n\nfunction asCssVarColor(name: string, fallback: string): string {\n return asCssColor(readCssVar(name, fallback), fallback);\n}\n\nexport function getBrandAccent(): string {\n return asCssVarColor(\"--brand-accent\", BRAND_FALLBACK.accent);\n}\n\nexport function getBrandTertiary(): string {\n return asCssVarColor(\"--brand-tertiary\", BRAND_FALLBACK.tertiary);\n}\n","/**\n * Utility Functions\n */\n\n/**\n * Merge class names — canonical implementation from ./cn.ts\n * Uses twMerge(clsx(...)) to correctly resolve Tailwind class conflicts.\n */\nexport { cn } from \"./cn\";\nexport { asPlainStyle, withHtmlProps, type PrimitiveProps, type PrimitiveComponent } from \"./primitive-props\";\n\n/**\n * Breakpoint values (matches Primer)\n */\nexport const BREAKPOINTS = {\n xs: 0,\n sm: 544,\n md: 768,\n lg: 1012,\n xl: 1280,\n} as const;\n\nexport type Breakpoint = keyof typeof BREAKPOINTS;\n\n/**\n * Check if viewport is at or above breakpoint\n */\nexport function isBreakpointUp(breakpoint: Breakpoint): boolean {\n if (typeof window === \"undefined\") return true;\n return window.innerWidth >= BREAKPOINTS[breakpoint];\n}\n\nexport {\n BRAND_FALLBACK,\n getBrandAccent,\n getBrandMark,\n getBrandMarkForeground,\n getBrandPrimary,\n getBrandTertiary,\n getProductPrimary,\n readCssVar,\n} from \"./brand-colors\";\n"]}
1
+ {"version":3,"sources":["../../src/utils/auth-surfaces.ts","../../src/utils/tw-merge-theme.generated.ts","../../src/utils/cn.ts","../../src/utils/primitive-props.ts","../../src/utils/brand-colors.ts","../../src/utils/index.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Auth surface layout contracts — **server-safe pure strings**.\n *\n * Consumed by RSC AuthSplitLayout. Built as `utils/auth-surfaces` without a\n * `\"use client\"` stamp (see packages/design/ui/tsup.config.ts SERVER_ONLY).\n * Prefer `import { … } from \"@nebutra/ui/utils/auth-surfaces\"` in server\n * layouts so a future utils barrel regression cannot client-proxy these again.\n *\n * ## Width (root cause)\n * Do NOT use `w-full max-w-sm|xs` alone inside a flex/grid shell. Percentage\n * width resolves against the full right pane (~64vw); if max-width is ever\n * soft-failed (token miss, cascade, min-width:auto content), the column\n * expands to the pane. Force the used width with min() + min-w-0 + shrink-0.\n *\n * 360px matches the Neon / Clerk login-card band (not page-form 24rem).\n *\n * ## No card chrome on split shell\n * Do NOT wrap the credentials column in border / rounded-2xl / shadow card.\n * Split already has a marketing panel + white form pane; a nested card is\n * double framing. Fields sit on the pane like Neon console login.\n *\n * ## OAuth\n * Always a 2-column compact grid — never full-width stacked bars, never\n * \"stack when only two providers\". Buttons fill the *cell*, not the pane.\n */\nexport const AUTH_FORM_COLUMN_CLASS = \"relative mx-auto min-w-0 w-[min(100%,360px)] shrink-0\";\n\nexport const AUTH_PRIMARY_CTA_CLASS = \"h-11 w-full\";\n\n/** Compact OAuth: always 2 columns, tight gap. */\nexport const AUTH_OAUTH_GRID_CLASS = \"grid grid-cols-2 gap-2\";\n\n/** Compact OAuth chip — fills grid cell only. */\nexport const AUTH_OAUTH_BUTTON_CLASS =\n \"h-9 w-full justify-center gap-2 border-border bg-background px-2.5 text-sm font-medium text-foreground shadow-none hover:bg-muted\";\n","// GENERATED by packages/design/ui/scripts/gen-tw-merge-theme.mjs — do not edit.\n// Source: the @theme blocks in packages/design/tokens/{styles,recipe}.css.\n\nexport const TW_MERGE_THEME = {\n breakpoint: [\"3xl\", \"shell\", \"tight\", \"xs\"],\n container: [\"content\", \"text\", \"wide\"],\n ease: [\"brand\", \"in\", \"in-out\", \"out\", \"spring\"],\n font: [\"cn\", \"display\", \"heading\", \"mono\", \"sans\"],\n leading: [\"display\", \"heading\"],\n radius: [\"2xl\", \"3xl\", \"button\", \"card\", \"full\", \"lg\", \"md\", \"none\", \"panel\", \"sm\", \"xl\", \"xs\"],\n shadow: [\n \"2xl\",\n \"ambient-glow\",\n \"ambient-lg\",\n \"ambient-md\",\n \"ambient-sm\",\n \"brand\",\n \"brand-lg\",\n \"glass-lg\",\n \"glass-md\",\n \"glass-sm\",\n \"glow-accent\",\n \"glow-accent-lg\",\n \"glow-accent-sm\",\n \"glow-primary\",\n \"lg\",\n \"md\",\n \"sheen\",\n \"sm\",\n \"xl\",\n \"xs\",\n ],\n text: [\n \"2xl\",\n \"2xs\",\n \"3xl\",\n \"4xl\",\n \"5xl\",\n \"6xl\",\n \"7xl\",\n \"8xl\",\n \"9xl\",\n \"base\",\n \"body\",\n \"display\",\n \"label\",\n \"lg\",\n \"meta\",\n \"sm\",\n \"ui\",\n \"xl\",\n \"xs\",\n ],\n tracking: [\"display\", \"heading\", \"label\", \"tight\"],\n} as const;\n\nexport const TW_MERGE_CLASS_GROUPS = {\n duration: [{ duration: [\"cinematic\", \"flow\", \"micro\", \"reveal\"] }],\n} as const;\n","import { type ClassValue, clsx } from \"clsx\";\nimport { extendTailwindMerge } from \"tailwind-merge\";\nimport { TW_MERGE_CLASS_GROUPS, TW_MERGE_THEME } from \"./tw-merge-theme.generated\";\n\n/**\n * tailwind-merge only knows Tailwind's default scale. Every utility the design\n * tokens add (text-label, shadow-ambient-md, rounded-card, ease-brand,\n * max-w-wide, …) was otherwise an unknown class: `cn(\"text-label\n * text-destructive-strong\")` returned \"text-destructive-strong\" and the size fell away, and\n * `cn(\"rounded-card\", \"rounded-lg\")` kept both so the winner depended on\n * stylesheet order. The theme below is generated from the tokens' @theme blocks\n * (scripts/gen-tw-merge-theme.mjs), so a new token utility is known here the\n * moment it exists; a test fails if the generated file goes stale.\n */\nconst twMerge = extendTailwindMerge({\n extend: {\n theme: Object.fromEntries(\n Object.entries(TW_MERGE_THEME).map(([key, values]) => [key, [...values]]),\n ),\n classGroups: Object.fromEntries(\n Object.entries(TW_MERGE_CLASS_GROUPS).map(([key, groups]) => [\n key,\n groups.map((group) =>\n Object.fromEntries(Object.entries(group).map(([k, v]) => [k, [...v]])),\n ),\n ]),\n ),\n },\n});\n\n/** Kept for callers and tests that enumerate the design-system text steps. */\nexport const DESIGN_SYSTEM_TEXT_SIZES = TW_MERGE_THEME.text;\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","/**\n * Runtime color resolution for APIs that cannot consume CSS variables\n * (Canvas, WebGL, some animation libs).\n *\n * Layers (do not mix):\n * - Product action / CTA: getProductPrimary() → semantic `--primary` (roles.action)\n * - Brand mark / AI badge / logo tint: getBrandMark() → `--brand-mark` (roles.brand)\n * - VI lock (print / legal assets): getBrandPrimary() → `--brand-primary` hex\n *\n * Prefer CSS / Tailwind in components:\n * - `bg-primary` for CTAs\n * - `bg-brand-mark` / `text-brand-mark` for Logo/AI badge (see recipe.css)\n *\n * @see packages/design/ARCHITECTURE.md\n * @see packages/design/tokens/recipe.css\n */\n\nimport { tokenColor, tokenValue } from \"@nebutra/tokens/values\";\n\n/**\n * SSR fallbacks when document is unavailable — the light-mode token values,\n * read from @nebutra/tokens/values rather than restated. Hand-copied, these\n * had drifted: the product action was still the old blue after --primary\n * became ink (a shader painted blue on the server and flipped to ink on\n * hydration) and tertiary named a colour --brand-tertiary does not hold.\n */\nexport const BRAND_FALLBACK = {\n /** VI 云毓蓝 — identity only */\n primary: tokenColor(\"--brand-primary\"),\n accent: tokenColor(\"--brand-accent\"),\n tertiary: tokenColor(\"--brand-tertiary\"),\n primaryDark: tokenColor(\"--nebutra-blue-600\"),\n backDark: tokenColor(\"--nebutra-blue-950\"),\n /** Product action — semantic --primary */\n productPrimary: tokenColor(\"--primary\"),\n /**\n * Brand mark fallback (= product action: the factory recipe sets\n * --brand-mark: var(--primary)). Skins may diverge.\n */\n brandMark: tokenColor(\"--primary\"),\n brandMarkForeground: tokenColor(\"--primary-foreground\"),\n} as const;\n\n/**\n * Read a CSS variable from :root and return its trimmed value.\n */\nexport function readCssVar(name: string, fallback: string): string {\n if (typeof window === \"undefined\" || typeof document === \"undefined\") {\n return fallback;\n }\n const value = getComputedStyle(document.documentElement).getPropertyValue(name).trim();\n return value || fallback;\n}\n\n/** Turn HSL channel triple or full color into a CSS color string. */\nfunction asCssColor(value: string, fallback: string): string {\n const v = value.trim() || fallback;\n if (\n v.startsWith(\"#\") ||\n v.startsWith(\"rgb\") ||\n v.startsWith(\"hsl\") ||\n v.startsWith(\"oklch\") ||\n v.startsWith(\"color(\")\n ) {\n return v;\n }\n // shadcn-style \"228 85% 56%\"\n return `hsl(${v})`;\n}\n\n/**\n * Product action color — follows the active skin (`--primary`).\n * Use for shaders/canvas that must match buttons/CTAs.\n */\nexport function getProductPrimary(): string {\n return asCssColor(\n readCssVar(\"--primary\", tokenValue(\"--primary\")),\n BRAND_FALLBACK.productPrimary,\n );\n}\n\n/** VI lock color — legal / print lockups only (not product chrome). */\nexport function getBrandPrimary(): string {\n return asCssVarColor(\"--brand-primary\", BRAND_FALLBACK.primary);\n}\n\n/**\n * Product brand-mark (roles.brand) — Logo tile, AI badge, identity chips.\n * Never use for default CTA (that is getProductPrimary / --primary).\n */\nexport function getBrandMark(): string {\n const raw = readCssVar(\"--brand-mark\", tokenValue(\"--primary\"));\n // Factory recipe defaults `--brand-mark: var(--primary)` — resolve to action color.\n if (/var\\(\\s*--primary\\s*\\)/u.test(raw)) {\n return getProductPrimary();\n }\n return asCssColor(raw, BRAND_FALLBACK.brandMark);\n}\n\n/** Foreground on brand-mark surfaces. */\nexport function getBrandMarkForeground(): string {\n const raw = readCssVar(\"--brand-mark-foreground\", tokenValue(\"--primary-foreground\"));\n if (/var\\(\\s*--primary-foreground\\s*\\)/u.test(raw)) {\n return asCssColor(\n readCssVar(\"--primary-foreground\", tokenValue(\"--primary-foreground\")),\n BRAND_FALLBACK.brandMarkForeground,\n );\n }\n return asCssColor(raw, BRAND_FALLBACK.brandMarkForeground);\n}\n\nfunction asCssVarColor(name: string, fallback: string): string {\n return asCssColor(readCssVar(name, fallback), fallback);\n}\n\nexport function getBrandAccent(): string {\n return asCssVarColor(\"--brand-accent\", BRAND_FALLBACK.accent);\n}\n\nexport function getBrandTertiary(): string {\n return asCssVarColor(\"--brand-tertiary\", BRAND_FALLBACK.tertiary);\n}\n","/**\n * Utility Functions\n */\n\n/** Auth split-shell + primary CTA contracts (width + ink CTA pairing). */\nexport {\n AUTH_FORM_COLUMN_CLASS,\n AUTH_OAUTH_BUTTON_CLASS,\n AUTH_OAUTH_GRID_CLASS,\n AUTH_PRIMARY_CTA_CLASS,\n} from \"./auth-surfaces\";\n/**\n * Merge class names — canonical implementation from ./cn.ts\n * Uses twMerge(clsx(...)) to correctly resolve Tailwind class conflicts.\n */\nexport { cn } from \"./cn\";\nexport {\n asPlainStyle,\n type PrimitiveComponent,\n type PrimitiveProps,\n withHtmlProps,\n} from \"./primitive-props\";\n\n/**\n * Breakpoint values (matches Primer)\n */\nexport const BREAKPOINTS = {\n xs: 0,\n sm: 544,\n md: 768,\n lg: 1012,\n xl: 1280,\n} as const;\n\nexport type Breakpoint = keyof typeof BREAKPOINTS;\n\n/**\n * Check if viewport is at or above breakpoint\n */\nexport function isBreakpointUp(breakpoint: Breakpoint): boolean {\n if (typeof window === \"undefined\") return true;\n return window.innerWidth >= BREAKPOINTS[breakpoint];\n}\n\nexport {\n BRAND_FALLBACK,\n getBrandAccent,\n getBrandMark,\n getBrandMarkForeground,\n getBrandPrimary,\n getBrandTertiary,\n getProductPrimary,\n readCssVar,\n} from \"./brand-colors\";\n"]}
package/package.json CHANGED
@@ -1,8 +1,13 @@
1
1
  {
2
2
  "name": "@nebutra/ui",
3
- "version": "0.2.3",
3
+ "version": "3.0.0",
4
4
  "description": "Nebutra design-system UI primitives, patterns, layouts, and token-integrated components",
5
5
  "private": false,
6
+ "nebutra": {
7
+ "status": "foundation",
8
+ "graph": "core",
9
+ "productionReady": false
10
+ },
6
11
  "license": "MIT",
7
12
  "type": "module",
8
13
  "sideEffects": [
@@ -17,6 +22,10 @@
17
22
  "types": "./dist/components/index.d.ts",
18
23
  "import": "./dist/components/index.js"
19
24
  },
25
+ "./chat": {
26
+ "types": "./dist/chat/index.d.ts",
27
+ "import": "./dist/chat/index.js"
28
+ },
20
29
  "./layout": {
21
30
  "types": "./dist/layout/index.d.ts",
22
31
  "import": "./dist/layout/index.js"
@@ -37,6 +46,10 @@
37
46
  "types": "./dist/theme/index.d.ts",
38
47
  "import": "./dist/theme/index.js"
39
48
  },
49
+ "./editorial": {
50
+ "types": "./dist/editorial/index.d.ts",
51
+ "import": "./dist/editorial/index.js"
52
+ },
40
53
  "./primitives": {
41
54
  "types": "./dist/primitives/index.d.ts",
42
55
  "import": "./dist/primitives/index.js"
@@ -77,6 +90,10 @@
77
90
  "types": "./dist/utils/index.d.ts",
78
91
  "import": "./dist/utils/index.js"
79
92
  },
93
+ "./utils/auth-surfaces": {
94
+ "types": "./dist/utils/auth-surfaces.d.ts",
95
+ "import": "./dist/utils/auth-surfaces.js"
96
+ },
80
97
  "./tailwind.preset": {
81
98
  "types": "./dist/tailwind.preset.d.ts",
82
99
  "import": "./dist/tailwind.preset.js"
@@ -117,6 +134,7 @@
117
134
  "piri": "^1.3.2",
118
135
  "react": "^19.2.4",
119
136
  "react-ascii-text": "*",
137
+ "react-day-picker": "^10.0.1",
120
138
  "react-dom": "^19.2.4",
121
139
  "react-hook-form": "^7.71.2",
122
140
  "react-markdown": "^10.1.0",
@@ -132,13 +150,12 @@
132
150
  "tailwind-merge": "^3.5.0",
133
151
  "usehooks-ts": "^3.1.1",
134
152
  "vaul": "^1.1.2",
135
- "@nebutra/tokens": "0.1.3",
136
- "@nebutra/icons": "0.1.2",
137
- "@nebutra/graph-model": "0.2.3",
138
- "@nebutra/brand": "0.1.2"
153
+ "@nebutra/brand": "3.0.0",
154
+ "@nebutra/graph-model": "3.0.0",
155
+ "@nebutra/tokens": "3.0.0",
156
+ "@nebutra/icons": "3.0.0"
139
157
  },
140
158
  "peerDependencies": {
141
- "@clerk/nextjs": ">=5.0.0",
142
159
  "driver.js": "^1.4.0",
143
160
  "next": ">=14.0.0",
144
161
  "next-intl": "^4.12.0",
@@ -146,9 +163,6 @@
146
163
  "react-dom": ">=19.0.0"
147
164
  },
148
165
  "peerDependenciesMeta": {
149
- "@clerk/nextjs": {
150
- "optional": true
151
- },
152
166
  "driver.js": {
153
167
  "optional": true
154
168
  },
@@ -171,6 +185,7 @@
171
185
  "@types/three": "^0.183.1",
172
186
  "@vitejs/plugin-react-swc": "^4.3.1",
173
187
  "driver.js": "^1.4.0",
188
+ "jsdom": "^29.1.1",
174
189
  "next": "^16.2.6",
175
190
  "next-intl": "^4.12.0",
176
191
  "storybook": "^8.6.17",
@@ -178,8 +193,7 @@
178
193
  "tsx": "^4.21.0",
179
194
  "typescript": "^5.9.3",
180
195
  "vitest": "^4.0.18",
181
- "jsdom": "^29.1.1",
182
- "@nebutra/design-tokens": "0.1.2"
196
+ "@nebutra/design-tokens": "3.0.0"
183
197
  },
184
198
  "homepage": "https://github.com/Nebutra/Nebutra-Sailor/tree/main/packages/design/ui#readme",
185
199
  "repository": {
@@ -6,9 +6,11 @@
6
6
  * Font loading (Next.js apps): each app's layout.tsx applies the loader classes
7
7
  * GeistSans → --font-geist-sans (variable, 100–900) Latin + numerals
8
8
  * GeistMono → --font-geist-mono (variable, 100–900) code
9
- * cjkFontClassName → --font-vivo-sans-sc (@nebutra/fonts/next/cjk) CJK
10
- * and the token stacks reference those variables in that order, so Geist keeps
11
- * Latin and only CJK falls through to vivo Sans SC.
9
+ * cjkFontClassName → --font-dm-sans (@nebutra/fonts/next/cjk) Latin headings
10
+ * <CjkFontFace /> → MiSans @font-face, CDN-hosted (licence forbids shipping
11
+ * the file in this public repo) CJK
12
+ * and the token stacks reference those in order, so Geist keeps Latin body and
13
+ * numerals, DM Sans takes headings, and only CJK falls through to MiSans.
12
14
  *
13
15
  * IMPORT ORDER MATTERS: this file must come AFTER @nebutra/tokens/styles.css
14
16
  * (see ../styles/preset.css). It used to re-declare --font-sans / --font-heading /
@@ -29,7 +31,7 @@
29
31
  token already leads with the self-hosted face; the system families repeat
30
32
  here so this alias still degrades on its own. */
31
33
  --font-cjk:
32
- var(--font-cn), "Noto Sans SC", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", sans-serif;
34
+ var(--font-cn), "MiSans", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", sans-serif;
33
35
 
34
36
  /* Not a token: no Nebutra surface uses a serif, this exists for shadcn parity. */
35
37
  --font-serif: Georgia, Cambria, "Times New Roman", Times, serif;
@@ -79,18 +81,8 @@ body {
79
81
  font-weight: 400;
80
82
  }
81
83
 
82
- /* Headings */
83
- h1,
84
- h2,
85
- h3,
86
- h4,
87
- h5,
88
- h6 {
89
- font-family: var(--font-heading), var(--font-cjk);
90
- /* Theme/DESIGN can lighten headings via fontWeight.heading; default 600. */
91
- font-weight: var(--font-weight-heading, 600);
92
- line-height: 1.25;
93
- }
84
+ /* Headings: one rule, in @nebutra/design-tokens static/base.css
85
+ (--font-heading at --font-weight-heading). Not re-declared here. */
94
86
 
95
87
  /* Code */
96
88
  code,
@@ -1,61 +0,0 @@
1
- /**
2
- * brand-override.css — Custom Brand Configuration (legacy scale remap)
3
- *
4
- * Prefer the skin surface for product chrome:
5
- * @import "@nebutra/tokens/skins/<name>.css";
6
- * @see packages/design/tokens/skins/README.md
7
- *
8
- * This file remaps the **blue scale** only (residual `bg-blue-9` call sites).
9
- * New code should use semantic tokens (`bg-primary`, `border-border`).
10
- *
11
- * Drop into globals.css after tokens if you still need scale remapping:
12
- * @import "@nebutra/ui/styles/brand-override.css";
13
- *
14
- * ────────────────────────────────────────────────────────────
15
- * HOW THE CASCADE WORKS
16
- *
17
- * 1. You define: --your-primary-* (11 steps)
18
- * 2. System maps: --blue-9 → --your-primary-500 (solid fill)
19
- * --blue-3 → --your-primary-200 (component bg)
20
- * 3. Residual blue-N utilities follow your brand; semantic CSS still wins
21
- * for Button / Input that already use --primary.
22
- * ────────────────────────────────────────────────────────────
23
- */
24
-
25
- :root {
26
- /* ══════════════════════════════════════════════════════════
27
- PRIMARY BRAND COLOR — replace #0033FE with your primary
28
- ════════════════════════════════════════════════════════ */
29
- --nebutra-blue-50: #f0f4ff; /* lightest tint — backgrounds */
30
- --nebutra-blue-100: #dbe4ff;
31
- --nebutra-blue-200: #bac8ff;
32
- --nebutra-blue-300: #91a7ff;
33
- --nebutra-blue-400: #5c7cfa;
34
- --nebutra-blue-500: #0033fe; /* ← YOUR PRIMARY COLOR HERE */
35
- --nebutra-blue-600: #002ad4;
36
- --nebutra-blue-700: #0021ab;
37
- --nebutra-blue-800: #001882;
38
- --nebutra-blue-900: #000f59;
39
- --nebutra-blue-950: #000830; /* darkest — text */
40
-
41
- /* ══════════════════════════════════════════════════════════
42
- SECONDARY ACCENT COLOR — replace #0BF1C3 with your accent
43
- ════════════════════════════════════════════════════════ */
44
- --nebutra-cyan-50: #e6fff8; /* lightest tint */
45
- --nebutra-cyan-100: #b3ffec;
46
- --nebutra-cyan-200: #80ffe0;
47
- --nebutra-cyan-300: #4dfcd4;
48
- --nebutra-cyan-400: #1af7c8;
49
- --nebutra-cyan-500: #0bf1c3; /* ← YOUR ACCENT COLOR HERE */
50
- --nebutra-cyan-600: #09c9a3;
51
- --nebutra-cyan-700: #07a183;
52
- --nebutra-cyan-800: #057963;
53
- --nebutra-cyan-900: #035143;
54
- --nebutra-cyan-950: #012923; /* darkest */
55
-
56
- /* ══════════════════════════════════════════════════════════
57
- OPTIONAL: Brand name tokens (used in metadata / docs only)
58
- ════════════════════════════════════════════════════════ */
59
- /* --brand-name: "Your Brand"; */
60
- /* --brand-domain: "yourbrand.com"; */
61
- }
@@ -1,61 +0,0 @@
1
- /**
2
- * brand-override.css — Custom Brand Configuration (legacy scale remap)
3
- *
4
- * Prefer the skin surface for product chrome:
5
- * @import "@nebutra/tokens/skins/<name>.css";
6
- * @see packages/design/tokens/skins/README.md
7
- *
8
- * This file remaps the **blue scale** only (residual `bg-blue-9` call sites).
9
- * New code should use semantic tokens (`bg-primary`, `border-border`).
10
- *
11
- * Drop into globals.css after tokens if you still need scale remapping:
12
- * @import "@nebutra/ui/styles/brand-override.css";
13
- *
14
- * ────────────────────────────────────────────────────────────
15
- * HOW THE CASCADE WORKS
16
- *
17
- * 1. You define: --your-primary-* (11 steps)
18
- * 2. System maps: --blue-9 → --your-primary-500 (solid fill)
19
- * --blue-3 → --your-primary-200 (component bg)
20
- * 3. Residual blue-N utilities follow your brand; semantic CSS still wins
21
- * for Button / Input that already use --primary.
22
- * ────────────────────────────────────────────────────────────
23
- */
24
-
25
- :root {
26
- /* ══════════════════════════════════════════════════════════
27
- PRIMARY BRAND COLOR — replace #0033FE with your primary
28
- ════════════════════════════════════════════════════════ */
29
- --nebutra-blue-50: #f0f4ff; /* lightest tint — backgrounds */
30
- --nebutra-blue-100: #dbe4ff;
31
- --nebutra-blue-200: #bac8ff;
32
- --nebutra-blue-300: #91a7ff;
33
- --nebutra-blue-400: #5c7cfa;
34
- --nebutra-blue-500: #0033fe; /* ← YOUR PRIMARY COLOR HERE */
35
- --nebutra-blue-600: #002ad4;
36
- --nebutra-blue-700: #0021ab;
37
- --nebutra-blue-800: #001882;
38
- --nebutra-blue-900: #000f59;
39
- --nebutra-blue-950: #000830; /* darkest — text */
40
-
41
- /* ══════════════════════════════════════════════════════════
42
- SECONDARY ACCENT COLOR — replace #0BF1C3 with your accent
43
- ════════════════════════════════════════════════════════ */
44
- --nebutra-cyan-50: #e6fff8; /* lightest tint */
45
- --nebutra-cyan-100: #b3ffec;
46
- --nebutra-cyan-200: #80ffe0;
47
- --nebutra-cyan-300: #4dfcd4;
48
- --nebutra-cyan-400: #1af7c8;
49
- --nebutra-cyan-500: #0bf1c3; /* ← YOUR ACCENT COLOR HERE */
50
- --nebutra-cyan-600: #09c9a3;
51
- --nebutra-cyan-700: #07a183;
52
- --nebutra-cyan-800: #057963;
53
- --nebutra-cyan-900: #035143;
54
- --nebutra-cyan-950: #012923; /* darkest */
55
-
56
- /* ══════════════════════════════════════════════════════════
57
- OPTIONAL: Brand name tokens (used in metadata / docs only)
58
- ════════════════════════════════════════════════════════ */
59
- /* --brand-name: "Your Brand"; */
60
- /* --brand-domain: "yourbrand.com"; */
61
- }