@hilum/ui 1.0.1 → 2.0.1

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 (82) hide show
  1. package/README.md +2 -2
  2. package/dist/{chunk-ELL3JM3Z.js → chunk-H6JZQWX3.js} +59 -15
  3. package/dist/chunk-H6JZQWX3.js.map +1 -0
  4. package/dist/index.d.ts +350 -290
  5. package/dist/index.js +490 -436
  6. package/dist/index.js.map +1 -1
  7. package/dist/tokens.css +42 -16
  8. package/dist/tokens.d.ts +33 -8
  9. package/dist/tokens.js +1 -1
  10. package/llms.txt +9 -9
  11. package/package.json +1 -1
  12. package/src/components/accordion.tsx +5 -5
  13. package/src/components/action-panel.tsx +8 -6
  14. package/src/components/activity-feed.tsx +7 -5
  15. package/src/components/alert-dialog.tsx +5 -5
  16. package/src/components/alert.tsx +5 -5
  17. package/src/components/avatar-stack.tsx +3 -3
  18. package/src/components/avatar.tsx +4 -4
  19. package/src/components/badge.tsx +7 -7
  20. package/src/components/breadcrumb.tsx +5 -6
  21. package/src/components/button-group.tsx +7 -4
  22. package/src/components/button.tsx +7 -7
  23. package/src/components/calendar.tsx +10 -10
  24. package/src/components/card-heading.tsx +3 -3
  25. package/src/components/card.tsx +4 -4
  26. package/src/components/chart.tsx +10 -10
  27. package/src/components/checkbox.tsx +2 -2
  28. package/src/components/color-input.tsx +7 -5
  29. package/src/components/color-picker.tsx +8 -6
  30. package/src/components/combobox.tsx +66 -31
  31. package/src/components/command-palette.tsx +13 -11
  32. package/src/components/command.tsx +14 -12
  33. package/src/components/context-menu.tsx +16 -16
  34. package/src/components/data-table.tsx +18 -7
  35. package/src/components/date-picker.tsx +2 -2
  36. package/src/components/description-list.tsx +10 -8
  37. package/src/components/dialog.tsx +4 -4
  38. package/src/components/drawer.tsx +5 -5
  39. package/src/components/dropdown-menu.tsx +16 -16
  40. package/src/components/empty-state.tsx +5 -3
  41. package/src/components/field.tsx +4 -4
  42. package/src/components/grid-list.tsx +17 -13
  43. package/src/components/hover-card.tsx +1 -1
  44. package/src/components/input-group.tsx +10 -10
  45. package/src/components/input-number.tsx +7 -7
  46. package/src/components/input-otp.tsx +3 -3
  47. package/src/components/input.tsx +4 -4
  48. package/src/components/kbd.tsx +1 -1
  49. package/src/components/label.tsx +1 -1
  50. package/src/components/media-object.tsx +2 -0
  51. package/src/components/menubar.tsx +21 -21
  52. package/src/components/native-select.tsx +5 -5
  53. package/src/components/navigation-menu.tsx +10 -10
  54. package/src/components/notification.tsx +13 -11
  55. package/src/components/page-heading.tsx +8 -8
  56. package/src/components/pagination.tsx +1 -1
  57. package/src/components/popover.tsx +1 -1
  58. package/src/components/progress.tsx +1 -1
  59. package/src/components/property-row.tsx +3 -1
  60. package/src/components/radio-card.tsx +10 -8
  61. package/src/components/radio-group.tsx +4 -4
  62. package/src/components/resizable.tsx +3 -3
  63. package/src/components/scroll-area.tsx +1 -1
  64. package/src/components/section-heading.tsx +3 -3
  65. package/src/components/select.tsx +13 -13
  66. package/src/components/separator.tsx +1 -1
  67. package/src/components/sheet.tsx +4 -4
  68. package/src/components/sidebar.tsx +20 -20
  69. package/src/components/skeleton.tsx +1 -1
  70. package/src/components/slider.tsx +2 -2
  71. package/src/components/sonner.tsx +9 -8
  72. package/src/components/stacked-list.tsx +5 -5
  73. package/src/components/stat-card.tsx +9 -7
  74. package/src/components/steps.tsx +16 -14
  75. package/src/components/switch.tsx +2 -2
  76. package/src/components/table.tsx +9 -9
  77. package/src/components/tabs.tsx +2 -2
  78. package/src/components/textarea.tsx +4 -4
  79. package/src/components/toggle.tsx +9 -9
  80. package/src/components/tooltip.tsx +1 -1
  81. package/src/tokens/tokens.ts +36 -9
  82. package/dist/chunk-ELL3JM3Z.js.map +0 -1
@@ -6,11 +6,11 @@ function Textarea({ className, ...props }: React.ComponentProps<"textarea">) {
6
6
  <textarea
7
7
  data-slot="textarea"
8
8
  className={cn(
9
- "flex min-h-[80px] w-full rounded-md border border-ground-200 bg-white px-3 py-2",
10
- "body text-ground-900 placeholder:text-ground-400",
9
+ "flex min-h-[80px] w-full rounded-md border border-border bg-card px-3 py-2",
10
+ "body text-foreground placeholder:text-muted-foreground",
11
11
  "resize-none transition-colors duration-150",
12
- "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ground-900/15 focus-visible:border-ground-400",
13
- "disabled:cursor-not-allowed disabled:opacity-50 disabled:bg-ground-50",
12
+ "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring/20 focus-visible:border-border",
13
+ "disabled:cursor-not-allowed disabled:opacity-50 disabled:bg-muted",
14
14
  className,
15
15
  )}
16
16
  {...props}
@@ -18,19 +18,19 @@ const toggleVariants = cva(
18
18
  variants: {
19
19
  variant: {
20
20
  default: [
21
- "bg-transparent text-ground-600",
22
- "hover:bg-ground-100 hover:text-ground-900",
23
- "data-[state=on]:bg-ground-100 data-[state=on]:text-ground-900",
21
+ "bg-transparent text-muted-foreground",
22
+ "hover:bg-muted hover:text-foreground",
23
+ "data-[state=on]:bg-muted data-[state=on]:text-foreground",
24
24
  ],
25
25
  outline: [
26
- "border border-ground-200 bg-white text-ground-600 shadow-natural",
27
- "hover:bg-ground-50 hover:text-ground-900",
28
- "data-[state=on]:bg-ground-100 data-[state=on]:text-ground-900 data-[state=on]:border-ground-300",
26
+ "border border-border bg-card text-muted-foreground shadow-natural",
27
+ "hover:bg-muted hover:text-foreground",
28
+ "data-[state=on]:bg-muted data-[state=on]:text-foreground data-[state=on]:border-border",
29
29
  ],
30
30
  brand: [
31
- "bg-transparent text-ground-600",
32
- "hover:bg-ground-100 hover:text-ground-900",
33
- "data-[state=on]:bg-brand-primary data-[state=on]:text-white",
31
+ "bg-transparent text-muted-foreground",
32
+ "hover:bg-muted hover:text-foreground",
33
+ "data-[state=on]:bg-brand-primary data-[state=on]:text-background",
34
34
  ],
35
35
  },
36
36
  size: {
@@ -27,7 +27,7 @@ const TooltipContent = React.forwardRef<
27
27
  ref={ref}
28
28
  sideOffset={sideOffset}
29
29
  className={cn(
30
- "z-50 rounded-lg bg-ground-900 px-2.5 py-1.5 caption text-white",
30
+ "z-50 rounded-lg bg-foreground px-2.5 py-1.5 caption text-background",
31
31
  "animate-in fade-in-0 zoom-in-95",
32
32
  "data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95",
33
33
  "data-[side=bottom]:slide-in-from-top-1 data-[side=top]:slide-in-from-bottom-1",
@@ -102,22 +102,49 @@ export const tokens = {
102
102
  warningForeground: "#171717", // ground-900
103
103
  ring: "#c100f1", // purple-500 = brand.primary
104
104
  },
105
+ // Mid — a neutral medium-gray theme (from the Pappery designer "mid" palette,
106
+ // mapped onto the ground scale). Sits between light and dark.
107
+ mid: {
108
+ background: "#737373", // ground-500 — main surface (designer panel)
109
+ foreground: "#fafafa", // ground-50
110
+ card: "#525252", // ground-600 — elevated items (designer item-bg)
111
+ cardForeground: "#fafafa",
112
+ surface: "#525252", // ground-600 (designer canvas/pane)
113
+ surfaceForeground: "#fafafa",
114
+ border: "#a3a3a3", // ground-400 (designer border — lighter so it reads on the gray)
115
+ input: "#404040", // ground-700 (designer input-bg)
116
+ muted: "#525252", // ground-600
117
+ mutedForeground: "#e5e5e5", // ground-200 (designer text-secondary)
118
+ accent: "#404040", // ground-700 (designer item-hover-bg)
119
+ accentForeground: "#fafafa",
120
+ primary: "#c100f1", // brand stays consistent across themes
121
+ primaryForeground: "#ffffff",
122
+ secondary: "#525252", // ground-600
123
+ secondaryForeground: "#fafafa",
124
+ destructive: "#ef4444", // red-500
125
+ destructiveForeground: "#ffffff",
126
+ success: "#CDEA19", // lime — functional semantic only
127
+ successForeground: "#171717",
128
+ warning: "#fff5bf", // butter-200
129
+ warningForeground: "#171717",
130
+ ring: "#c100f1",
131
+ },
105
132
  dark: {
106
- background: "#0a0a0a", // ground-950
133
+ background: "#171717", // ground-900 — designer canvas (deepest)
107
134
  foreground: "#fafafa", // ground-50
108
- card: "#171717", // ground-900
135
+ card: "#262626", // ground-800 — designer panel-bg (elevated over bg)
109
136
  cardForeground: "#fafafa",
110
- surface: "#171717",
137
+ surface: "#1a1a1a", // designer item-hover depth
111
138
  surfaceForeground: "#f5f5f5",
112
- border: "#262626", // ground-800
113
- input: "#262626",
114
- muted: "#171717",
139
+ border: "#404040", // ground-700 — designer border (reads on the dark)
140
+ input: "#262626", // ground-800
141
+ muted: "#262626", // ground-800
115
142
  mutedForeground: "#a3a3a3", // ground-400
116
- accent: "#330040", // purple-900
117
- accentForeground: "#f5d6ff", // purple-100
143
+ accent: "#404040", // ground-700 — neutral elevated/hover (designer item-hover)
144
+ accentForeground: "#fafafa",
118
145
  primary: "#c100f1", // purple-500 — brand stays consistent (D8)
119
146
  primaryForeground: "#ffffff",
120
- secondary: "#171717",
147
+ secondary: "#262626", // ground-800
121
148
  secondaryForeground: "#f5f5f5",
122
149
  destructive: "#ef4444", // red-500 (slightly lighter for dark)
123
150
  destructiveForeground: "#ffffff",
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/tokens/tokens.ts"],"names":[],"mappings":"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","file":"chunk-ELL3JM3Z.js","sourcesContent":["// @hilum/ui/tokens — JS-first design tokens (D6).\n//\n// This module is the single source of truth for the Hilum visual identity.\n// A build step (scripts/build-tokens.mjs) reads the compiled output of this\n// file and emits dist/tokens.css for consumers to `@import`.\n//\n// Brand model: D8 — base palette is fixed here. Per-product overrides are\n// applied at runtime via createTheme() in @hilum/ui/create-theme.\n// Color modes: D7 — light + dark, both auto (`prefers-color-scheme`) and\n// explicit via `[data-theme]`.\n//\n// Core brand colors:\n// brand.primary #C100F1 — vivid purple — purple-500 on the scale below\n// brand.secondary #FFF5BF — pale lemon — butter-200 on the scale below\n//\n// ground — neutral spine for text, borders, and structure (values: Tailwind neutral)\n\nexport const tokens = {\n /* ============================================================== *\n * PALETTE — concrete colors *\n * ============================================================== */\n\n ground: {\n 50: \"#fafafa\",\n 100: \"#f5f5f5\",\n 200: \"#e5e5e5\",\n 300: \"#d4d4d4\",\n 400: \"#a3a3a3\",\n 500: \"#737373\",\n 600: \"#525252\",\n 700: \"#404040\",\n 800: \"#262626\",\n 900: \"#171717\",\n 950: \"#0a0a0a\",\n },\n\n // Pale lemon — anchor: butter-200 = #FFF5BF\n butter: {\n 50: \"#ffffe8\",\n 100: \"#fffad0\",\n 200: \"#fff5bf\",\n 300: \"#fde870\",\n 400: \"#f6d42a\",\n 500: \"#dab010\",\n 600: \"#a88008\",\n 700: \"#7c5c04\",\n 800: \"#543e02\",\n 900: \"#382801\",\n 950: \"#221600\",\n },\n\n // Vivid purple — anchor: purple-500 = #C100F1 (brand.primary)\n purple: {\n 50: \"#fdf0ff\",\n 100: \"#f5d6ff\",\n 200: \"#e8a8ff\",\n 300: \"#d870f9\",\n 400: \"#c840f6\",\n 500: \"#c100f1\",\n 600: \"#9c00c0\",\n 700: \"#740092\",\n 800: \"#4e0062\",\n 900: \"#330040\",\n 950: \"#200028\",\n },\n\n // Legacy functional colors — used by components not yet migrated to the new palette.\n brand: {\n primary: \"#C100F1\", // purple-500\n secondary: \"#FFF5BF\", // butter-200\n },\n\n destructive: \"#dc2626\", // red-600\n\n /* ============================================================== *\n * SEMANTIC — what components reference *\n * ============================================================== */\n\n semantic: {\n light: {\n background: \"#ffffff\",\n foreground: \"#171717\", // ground-900\n card: \"#ffffff\",\n cardForeground: \"#171717\",\n surface: \"#fafafa\", // ground-50\n surfaceForeground: \"#262626\", // ground-800\n border: \"#f5f5f5\", // ground-100\n input: \"#f5f5f5\",\n muted: \"#fafafa\",\n mutedForeground: \"#737373\", // ground-500\n accent: \"#fdf0ff\", // purple-50\n accentForeground: \"#740092\", // purple-700\n primary: \"#c100f1\", // purple-500 = brand.primary\n primaryForeground: \"#ffffff\",\n secondary: \"#fafafa\", // ground-50\n secondaryForeground: \"#404040\", // ground-700\n destructive: \"#dc2626\",\n destructiveForeground: \"#ffffff\",\n success: \"#CDEA19\", // lime — functional semantic only\n successForeground: \"#171717\",\n warning: \"#fff5bf\", // butter-200 = brand.secondary\n warningForeground: \"#171717\", // ground-900\n ring: \"#c100f1\", // purple-500 = brand.primary\n },\n dark: {\n background: \"#0a0a0a\", // ground-950\n foreground: \"#fafafa\", // ground-50\n card: \"#171717\", // ground-900\n cardForeground: \"#fafafa\",\n surface: \"#171717\",\n surfaceForeground: \"#f5f5f5\",\n border: \"#262626\", // ground-800\n input: \"#262626\",\n muted: \"#171717\",\n mutedForeground: \"#a3a3a3\", // ground-400\n accent: \"#330040\", // purple-900\n accentForeground: \"#f5d6ff\", // purple-100\n primary: \"#c100f1\", // purple-500 — brand stays consistent (D8)\n primaryForeground: \"#ffffff\",\n secondary: \"#171717\",\n secondaryForeground: \"#f5f5f5\",\n destructive: \"#ef4444\", // red-500 (slightly lighter for dark)\n destructiveForeground: \"#ffffff\",\n success: \"#CDEA19\", // lime — functional semantic only\n successForeground: \"#0a0a0a\",\n warning: \"#221600\", // butter-950 surface\n warningForeground: \"#fffad0\", // butter-100\n ring: \"#c100f1\", // purple-500 = brand.primary\n },\n },\n\n /* ============================================================== *\n * TYPOGRAPHY *\n * ============================================================== */\n\n fontFamily: {\n sans: 'Inter, ui-sans-serif, -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif',\n serif: '\"Instrument Serif\", ui-serif, Georgia, serif',\n mono: 'ui-monospace, \"SFMono-Regular\", \"Menlo\", \"Consolas\", monospace',\n },\n\n /** Type scale utilities — emitted as Tailwind v4 `@utility` blocks. */\n typeScale: {\n \"display-xl\": { family: \"serif\", size: \"3rem\", weight: 400, lineHeight: \"1.15\" },\n display: { family: \"serif\", size: \"2.25rem\", weight: 400, lineHeight: \"1.15\" },\n \"heading-xl\": { family: \"serif\", size: \"1.875rem\", weight: 400, lineHeight: \"1.2\" },\n heading: { family: \"serif\", size: \"1.5rem\", weight: 400, lineHeight: \"1.2\" },\n subheading: { family: \"serif\", size: \"1.25rem\", weight: 400, lineHeight: \"1.4\" },\n \"body-lg\": { family: \"sans\", size: \"1rem\", weight: 400, lineHeight: \"1.625\" },\n body: { family: \"sans\", size: \"0.875rem\", weight: 400, lineHeight: \"1.625\" },\n \"body-sm\": { family: \"sans\", size: \"0.75rem\", weight: 500, lineHeight: \"1.625\" },\n caption: { family: \"sans\", size: \"0.75rem\", weight: 400, lineHeight: \"1.625\" },\n \"caption-xs\": { family: \"sans\", size: \"0.625rem\", weight: 400, lineHeight: \"1.625\" },\n\n /* --- \"Eyebrow\" family — uppercase tracked label used above headlines, --- *\n * on badges, and on section markers. `eyebrow` is the canonical name; *\n * `overline` (Material parlance), `kicker` (editorial parlance) and *\n * `label` (legacy) are aliases of the same scale so consumers can pick *\n * whichever vocabulary reads best in their context. `eyebrow-sm` is *\n * the compact variant for badge-sized chips and tiny status pills. */\n eyebrow: {\n family: \"sans\",\n size: \"0.75rem\",\n weight: 600,\n lineHeight: \"1\",\n letterSpacing: \"0.1em\",\n textTransform: \"uppercase\" as const,\n },\n \"eyebrow-sm\": {\n family: \"sans\",\n size: \"0.625rem\",\n weight: 600,\n lineHeight: \"1\",\n letterSpacing: \"0.1em\",\n textTransform: \"uppercase\" as const,\n },\n overline: {\n family: \"sans\",\n size: \"0.75rem\",\n weight: 600,\n lineHeight: \"1\",\n letterSpacing: \"0.1em\",\n textTransform: \"uppercase\" as const,\n },\n kicker: {\n family: \"sans\",\n size: \"0.75rem\",\n weight: 600,\n lineHeight: \"1\",\n letterSpacing: \"0.1em\",\n textTransform: \"uppercase\" as const,\n },\n label: {\n family: \"sans\",\n size: \"0.75rem\",\n weight: 600,\n lineHeight: \"1\",\n letterSpacing: \"0.1em\",\n textTransform: \"uppercase\" as const,\n },\n },\n\n /* ============================================================== *\n * GEOMETRY *\n * ============================================================== */\n\n radius: {\n base: \"0.5rem\",\n sm: \"calc(0.5rem - 4px)\",\n md: \"calc(0.5rem - 2px)\",\n lg: \"calc(0.5rem + 2px)\",\n xl: \"calc(0.5rem + 4px)\",\n full: \"9999px\",\n },\n\n /* ============================================================== *\n * Z-INDEX — semantic layering scale *\n * ============================================================== */\n\n zIndex: {\n dropdown: 40,\n sticky: 50,\n fixed: 60,\n modal: 100,\n popover: 110,\n tooltip: 120,\n },\n\n shadow: {\n natural:\n \"0 0px 0px 1px rgba(0, 0, 0, 0.06), 0 1px 1px -0.5px rgba(0, 0, 0, 0.06), 0 3px 3px -1.5px rgba(0, 0, 0, 0.06)\",\n elevated:\n \"0 0px 0px 1px rgba(0, 0, 0, 0.06), 0 1px 1px -0.5px rgba(0, 0, 0, 0.06), 0 3px 3px -1.5px rgba(0, 0, 0, 0.06), 0 6px 6px -3px rgba(0, 0, 0, 0.06), 0 12px 12px -6px rgba(0, 0, 0, 0.04), 0 24px 24px -12px rgba(0, 0, 0, 0.04), 0 24px 24px 2px rgba(0, 0, 0, 0.1)\",\n },\n\n /* ============================================================== *\n * ANIMATION *\n * ============================================================== */\n\n animation: {\n \"accordion-down\": \"accordion-down 0.2s ease-out\",\n \"accordion-up\": \"accordion-up 0.2s ease-out\",\n \"caret-blink\": \"caret-blink 1.25s ease-out infinite\",\n },\n} as const;\n\nexport type Tokens = typeof tokens;\nexport type SemanticTokens = typeof tokens.semantic.light;\n"]}