@hilum/ui 3.8.5 → 3.10.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/README.md +32 -1
- package/dist/{chunk-RI6QJR2L.js → chunk-R576DV2A.js} +120 -14
- package/dist/chunk-R576DV2A.js.map +1 -0
- package/dist/create-theme.js +2 -1
- package/dist/create-theme.js.map +1 -1
- package/dist/index.d.ts +733 -68
- package/dist/index.js +3097 -1619
- package/dist/index.js.map +1 -1
- package/dist/tokens.css +163 -19
- package/dist/tokens.d.ts +69 -5
- package/dist/tokens.js +1 -1
- package/llms.txt +11 -4
- package/package.json +11 -10
- package/src/components/accordion.tsx +2 -2
- package/src/components/account-menu.tsx +1 -1
- package/src/components/alert-dialog.tsx +107 -0
- package/src/components/ask-user-questions.tsx +24 -18
- package/src/components/badge.tsx +36 -3
- package/src/components/breadcrumb.tsx +4 -2
- package/src/components/button-group.tsx +1 -1
- package/src/components/button.tsx +31 -23
- package/src/components/calendar.tsx +1 -1
- package/src/components/card.tsx +4 -2
- package/src/components/checkbox-card.tsx +1 -1
- package/src/components/checkbox-group.tsx +2 -1
- package/src/components/code-block.tsx +99 -0
- package/src/components/color-input.tsx +9 -6
- package/src/components/color-picker.tsx +38 -26
- package/src/components/combobox.tsx +59 -12
- package/src/components/command-palette.tsx +150 -42
- package/src/components/command.tsx +5 -3
- package/src/components/context-menu.tsx +18 -15
- package/src/components/contextual-save-bar.tsx +156 -0
- package/src/components/data-table.tsx +34 -5
- package/src/components/date-picker.tsx +275 -28
- package/src/components/date-text.tsx +90 -0
- package/src/components/dropdown-menu.tsx +11 -8
- package/src/components/dropdown.tsx +6 -3
- package/src/components/empty-state.tsx +85 -20
- package/src/components/file-dropzone.tsx +2 -1
- package/src/components/file-thumbnail.tsx +84 -20
- package/src/components/filter-bar.tsx +91 -0
- package/src/components/grid-list.tsx +2 -2
- package/src/components/help-tooltip.tsx +1 -1
- package/src/components/input-copy.tsx +1 -1
- package/src/components/input-group.tsx +1 -1
- package/src/components/input-message.tsx +5 -4
- package/src/components/input-number.tsx +103 -11
- package/src/components/input.tsx +5 -3
- package/src/components/label.tsx +1 -0
- package/src/components/media-asset-card.tsx +1 -1
- package/src/components/menu-item.tsx +37 -3
- package/src/components/menubar.tsx +21 -18
- package/src/components/native-select.tsx +1 -1
- package/src/components/navigation-menu.tsx +2 -2
- package/src/components/notification.tsx +1 -1
- package/src/components/pagination.tsx +97 -3
- package/src/components/popover.tsx +2 -0
- package/src/components/property-row.tsx +7 -4
- package/src/components/radio-card.tsx +1 -1
- package/src/components/radio-group.tsx +2 -1
- package/src/components/rating.tsx +136 -0
- package/src/components/resizable.tsx +1 -1
- package/src/components/resource-item.tsx +133 -0
- package/src/components/rich-text-editor.tsx +1 -0
- package/src/components/search-input.tsx +98 -0
- package/src/components/searchable-table.tsx +10 -11
- package/src/components/select.tsx +28 -9
- package/src/components/sidebar.tsx +4 -4
- package/src/components/slider.tsx +78 -36
- package/src/components/sonner.tsx +18 -4
- package/src/components/stat-card.tsx +121 -37
- package/src/components/status-badge.tsx +142 -47
- package/src/components/status-tile.tsx +9 -0
- package/src/components/switch.tsx +6 -5
- package/src/components/tabs-subtle.tsx +10 -2
- package/src/components/tabs.tsx +23 -3
- package/src/components/textarea.tsx +2 -3
- package/src/components/thinking-steps.tsx +3 -3
- package/src/components/toggle.tsx +14 -13
- package/src/components/tooltip.tsx +11 -8
- package/src/components/url-redirect-prompt.tsx +0 -1
- package/src/index.ts +15 -0
- package/src/lib/density-context.tsx +65 -0
- package/src/lib/format.tsx +301 -0
- package/src/lib/interaction.ts +12 -4
- package/src/lib/scroll-fade.tsx +39 -0
- package/src/tokens/tokens.test.ts +77 -0
- package/src/tokens/tokens.ts +114 -5
- package/dist/chunk-RI6QJR2L.js.map +0 -1
package/src/lib/scroll-fade.tsx
CHANGED
|
@@ -239,3 +239,42 @@ export function ScrollEdgeCue({
|
|
|
239
239
|
</div>
|
|
240
240
|
);
|
|
241
241
|
}
|
|
242
|
+
|
|
243
|
+
// ---------------------------------------------------------------------------
|
|
244
|
+
// Horizontal overflow helpers (tab strips, chip rows)
|
|
245
|
+
// ---------------------------------------------------------------------------
|
|
246
|
+
|
|
247
|
+
const EDGE_FADE_PX = 24;
|
|
248
|
+
|
|
249
|
+
/**
|
|
250
|
+
* CSS mask that fades whichever horizontal edges still hide content. Works on
|
|
251
|
+
* any background (unlike a surface-coloured gradient), so it suits tab tracks.
|
|
252
|
+
*/
|
|
253
|
+
export function horizontalEdgeMask(left: boolean, right: boolean): string | undefined {
|
|
254
|
+
if (!left && !right) return undefined;
|
|
255
|
+
const start = left ? `transparent 0, #000 ${EDGE_FADE_PX}px` : "#000 0";
|
|
256
|
+
const end = right ? `#000 calc(100% - ${EDGE_FADE_PX}px), transparent 100%` : "#000 100%";
|
|
257
|
+
return `linear-gradient(to right, ${start}, ${end})`;
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
/** Style for a horizontally scrolling strip: edge fades while content is hidden. */
|
|
261
|
+
export function useHorizontalOverflowMask(
|
|
262
|
+
ref: RefObject<HTMLElement | null>,
|
|
263
|
+
enabled = true,
|
|
264
|
+
): CSSProperties | undefined {
|
|
265
|
+
const edges = useScrollEdges(ref, { axis: "horizontal", enabled });
|
|
266
|
+
const mask = enabled ? horizontalEdgeMask(edges.left, edges.right) : undefined;
|
|
267
|
+
return mask ? { maskImage: mask, WebkitMaskImage: mask } : undefined;
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
/** Scroll `index`'s `[data-proximity-index]` child into view inside a horizontal strip. */
|
|
271
|
+
export function scrollStripItemIntoView(container: HTMLElement | null, index: number) {
|
|
272
|
+
if (!container || index < 0 || container.scrollWidth <= container.clientWidth) return;
|
|
273
|
+
const el = container.querySelector<HTMLElement>(`[data-proximity-index="${index}"]`);
|
|
274
|
+
if (!el) return;
|
|
275
|
+
const left = el.offsetLeft;
|
|
276
|
+
const right = left + el.offsetWidth;
|
|
277
|
+
if (left < container.scrollLeft) container.scrollLeft = Math.max(0, left - EDGE_FADE_PX);
|
|
278
|
+
else if (right > container.scrollLeft + container.clientWidth)
|
|
279
|
+
container.scrollLeft = right - container.clientWidth + EDGE_FADE_PX;
|
|
280
|
+
}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { describe, it, expect } from "vitest";
|
|
2
|
+
import { tokens } from "./tokens";
|
|
3
|
+
import { SURFACE_BG, SURFACE_SHADOW } from "../lib/surface-classes";
|
|
4
|
+
|
|
5
|
+
describe("surface ladder tokens", () => {
|
|
6
|
+
it.each(["light", "mid", "dark"] as const)("%s defines every level surface-classes emits", (theme) => {
|
|
7
|
+
const levels = Object.keys(SURFACE_BG).length;
|
|
8
|
+
expect(Object.keys(SURFACE_SHADOW)).toHaveLength(levels);
|
|
9
|
+
expect(tokens.surfaces[theme].bg).toHaveLength(levels);
|
|
10
|
+
expect(tokens.surfaces[theme].shadow).toHaveLength(levels);
|
|
11
|
+
});
|
|
12
|
+
|
|
13
|
+
it("level 1 matches the theme background", () => {
|
|
14
|
+
for (const theme of ["light", "mid", "dark"] as const) {
|
|
15
|
+
expect(tokens.surfaces[theme].bg[0]).toBe(tokens.semantic[theme].background);
|
|
16
|
+
}
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
it("shadow weight grows monotonically with level", () => {
|
|
20
|
+
const layers = tokens.surfaces.light.shadow.map((s) => s.split("px ").length);
|
|
21
|
+
for (let i = 1; i < layers.length; i++) expect(layers[i]).toBeGreaterThan(layers[i - 1]);
|
|
22
|
+
});
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
describe("semantic tokens", () => {
|
|
26
|
+
const themes = ["light", "mid", "dark"] as const;
|
|
27
|
+
|
|
28
|
+
it("every theme defines the same semantic keys", () => {
|
|
29
|
+
const keys = Object.keys(tokens.semantic.light).sort();
|
|
30
|
+
for (const theme of themes) expect(Object.keys(tokens.semantic[theme]).sort()).toEqual(keys);
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
it("defines the interaction, edge and canvas tokens components rely on", () => {
|
|
34
|
+
for (const theme of themes) {
|
|
35
|
+
for (const key of ["hover", "active", "borderStrong", "canvas", "checkerA", "checkerB"]) {
|
|
36
|
+
expect(tokens.semantic[theme]).toHaveProperty(key);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
// WCAG relative-luminance contrast between two #rrggbb colours.
|
|
42
|
+
const luminance = (hex: string) => {
|
|
43
|
+
const [r, g, b] = [1, 3, 5].map((i) => {
|
|
44
|
+
const c = parseInt(hex.slice(i, i + 2), 16) / 255;
|
|
45
|
+
return c <= 0.03928 ? c / 12.92 : ((c + 0.055) / 1.055) ** 2.4;
|
|
46
|
+
});
|
|
47
|
+
return 0.2126 * r + 0.7152 * g + 0.0722 * b;
|
|
48
|
+
};
|
|
49
|
+
const contrast = (a: string, b: string) => {
|
|
50
|
+
const [hi, lo] = [luminance(a), luminance(b)].sort((x, y) => y - x);
|
|
51
|
+
return (hi + 0.05) / (lo + 0.05);
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
it("borders stay visible against their theme background", () => {
|
|
55
|
+
expect(contrast(tokens.semantic.light.border, tokens.semantic.light.background)).toBeGreaterThan(1.2);
|
|
56
|
+
expect(contrast(tokens.semantic.dark.border, tokens.semantic.dark.background)).toBeGreaterThanOrEqual(2);
|
|
57
|
+
expect(contrast(tokens.semantic.mid.border, tokens.semantic.mid.card)).toBeGreaterThan(1.5);
|
|
58
|
+
for (const theme of themes) {
|
|
59
|
+
expect(tokens.semantic[theme].input).toBe(tokens.semantic[theme].border);
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
describe("density tokens", () => {
|
|
65
|
+
it("compact tier matches the editor-chrome spec", () => {
|
|
66
|
+
expect(tokens.density.compact).toMatchObject({
|
|
67
|
+
controlHeight: "24px",
|
|
68
|
+
rowHeight: "28px",
|
|
69
|
+
text: "12px",
|
|
70
|
+
label: "11px",
|
|
71
|
+
menuItemHeight: "28px",
|
|
72
|
+
menuText: "13px",
|
|
73
|
+
paddingX: "8px",
|
|
74
|
+
});
|
|
75
|
+
expect(Object.keys(tokens.density.compact).sort()).toEqual(Object.keys(tokens.density.default).sort());
|
|
76
|
+
});
|
|
77
|
+
});
|
package/src/tokens/tokens.ts
CHANGED
|
@@ -15,6 +15,24 @@
|
|
|
15
15
|
//
|
|
16
16
|
// ground — neutral spine for text, borders, and structure (values: Tailwind neutral)
|
|
17
17
|
|
|
18
|
+
// Surface elevation ladder helper. Level 1 is a hairline ring only; every
|
|
19
|
+
// step above adds one more (progressively softer, larger) drop layer, so
|
|
20
|
+
// shadow weight grows monotonically with the surface level. `ring` is the
|
|
21
|
+
// hairline edge colour, `drop` the drop-shadow colour at a given alpha.
|
|
22
|
+
const surfaceShadowRamp = (ring: string, drop: (alpha: number) => string) => {
|
|
23
|
+
const layers = [
|
|
24
|
+
`0 0 0 1px ${ring}`,
|
|
25
|
+
`0 1px 1px -0.5px ${drop(0.06)}, 0 3px 3px -1.5px ${drop(0.06)}`,
|
|
26
|
+
`0 6px 6px -3px ${drop(0.06)}`,
|
|
27
|
+
`0 12px 12px -6px ${drop(0.04)}`,
|
|
28
|
+
`0 24px 24px -12px ${drop(0.04)}`,
|
|
29
|
+
`0 24px 24px 2px ${drop(0.08)}`,
|
|
30
|
+
`0 32px 40px 4px ${drop(0.1)}`,
|
|
31
|
+
`0 48px 56px 8px ${drop(0.12)}`,
|
|
32
|
+
];
|
|
33
|
+
return [1, 2, 3, 4, 5, 6, 7, 8].map((level) => layers.slice(0, level).join(", "));
|
|
34
|
+
};
|
|
35
|
+
|
|
18
36
|
export const tokens = {
|
|
19
37
|
/* ============================================================== *
|
|
20
38
|
* PALETTE — concrete colors *
|
|
@@ -84,12 +102,19 @@ export const tokens = {
|
|
|
84
102
|
cardForeground: "#171717",
|
|
85
103
|
surface: "#fafafa", // ground-50
|
|
86
104
|
surfaceForeground: "#262626", // ground-800
|
|
87
|
-
|
|
88
|
-
|
|
105
|
+
// ground-200 on white ≈ 1.26:1 — the same hairline weight Figma/Linear use
|
|
106
|
+
// for panel and field edges (#f5f5f5 was ~1.09:1 and read as invisible).
|
|
107
|
+
border: "#e5e5e5", // ground-200
|
|
108
|
+
borderStrong: "#d4d4d4", // ground-300 — hover / emphasised edges
|
|
109
|
+
input: "#e5e5e5", // input edge (border-input) — matches border
|
|
89
110
|
muted: "#fafafa",
|
|
90
111
|
mutedForeground: "#737373", // ground-500
|
|
91
112
|
accent: "#fdf0ff", // purple-50
|
|
92
113
|
accentForeground: "#740092", // purple-700
|
|
114
|
+
// Neutral interaction washes behind `bg-hover` / `bg-active` (tabs,
|
|
115
|
+
// accordions, radio/checkbox groups, ghost + outline buttons).
|
|
116
|
+
hover: "rgba(23, 23, 23, 0.05)",
|
|
117
|
+
active: "rgba(23, 23, 23, 0.08)",
|
|
93
118
|
primary: "#c100f1", // purple-500 = brand.primary
|
|
94
119
|
primaryForeground: "#ffffff",
|
|
95
120
|
secondary: "#fafafa", // ground-50
|
|
@@ -101,6 +126,12 @@ export const tokens = {
|
|
|
101
126
|
warning: "#fff5bf", // butter-200 = brand.secondary
|
|
102
127
|
warningForeground: "#171717", // ground-900
|
|
103
128
|
ring: "#c100f1", // purple-500 = brand.primary
|
|
129
|
+
// Transparency checkerboard (colour picker alpha track, swatches).
|
|
130
|
+
checkerA: "#ffffff",
|
|
131
|
+
checkerB: "#e5e5e5",
|
|
132
|
+
// Editor workspace behind floating chrome (Figma-style grey canvas),
|
|
133
|
+
// one step below panels so they read as raised in every theme.
|
|
134
|
+
canvas: "#f5f5f5", // ground-100
|
|
104
135
|
},
|
|
105
136
|
// Mid — a neutral medium-gray theme (from the Pappery designer "mid" palette,
|
|
106
137
|
// mapped onto the ground scale). Sits between light and dark.
|
|
@@ -112,11 +143,14 @@ export const tokens = {
|
|
|
112
143
|
surface: "#525252", // ground-600 (designer canvas/pane)
|
|
113
144
|
surfaceForeground: "#fafafa",
|
|
114
145
|
border: "#a3a3a3", // ground-400 (designer border — lighter so it reads on the gray)
|
|
115
|
-
|
|
146
|
+
borderStrong: "#bdbdbd", // hover / emphasised edges
|
|
147
|
+
input: "#a3a3a3", // input edge (border-input) — matches border
|
|
116
148
|
muted: "#525252", // ground-600
|
|
117
149
|
mutedForeground: "#e5e5e5", // ground-200 (designer text-secondary)
|
|
118
150
|
accent: "#404040", // ground-700 (designer item-hover-bg)
|
|
119
151
|
accentForeground: "#fafafa",
|
|
152
|
+
hover: "rgba(255, 255, 255, 0.08)",
|
|
153
|
+
active: "rgba(255, 255, 255, 0.13)",
|
|
120
154
|
primary: "#c100f1", // brand stays consistent across themes
|
|
121
155
|
primaryForeground: "#ffffff",
|
|
122
156
|
secondary: "#525252", // ground-600
|
|
@@ -128,6 +162,9 @@ export const tokens = {
|
|
|
128
162
|
warning: "#fff5bf", // butter-200
|
|
129
163
|
warningForeground: "#171717",
|
|
130
164
|
ring: "#c100f1",
|
|
165
|
+
checkerA: "#8a8a8a",
|
|
166
|
+
checkerB: "#6b6b6b",
|
|
167
|
+
canvas: "#636363",
|
|
131
168
|
},
|
|
132
169
|
dark: {
|
|
133
170
|
background: "#171717", // ground-900 — designer canvas (deepest)
|
|
@@ -136,12 +173,17 @@ export const tokens = {
|
|
|
136
173
|
cardForeground: "#fafafa",
|
|
137
174
|
surface: "#1a1a1a", // designer item-hover depth
|
|
138
175
|
surfaceForeground: "#f5f5f5",
|
|
139
|
-
|
|
140
|
-
|
|
176
|
+
// ≈2:1 against the page background and ~1.7:1 against card panels;
|
|
177
|
+
// #404040 (1.73:1 vs bg) blended into panels at small sizes.
|
|
178
|
+
border: "#4a4a4a",
|
|
179
|
+
borderStrong: "#5c5c5c", // hover / emphasised edges
|
|
180
|
+
input: "#4a4a4a", // input edge (border-input) — matches border
|
|
141
181
|
muted: "#262626", // ground-800
|
|
142
182
|
mutedForeground: "#a3a3a3", // ground-400
|
|
143
183
|
accent: "#404040", // ground-700 — neutral elevated/hover (designer item-hover)
|
|
144
184
|
accentForeground: "#fafafa",
|
|
185
|
+
hover: "rgba(250, 250, 250, 0.06)",
|
|
186
|
+
active: "rgba(250, 250, 250, 0.1)",
|
|
145
187
|
primary: "#c100f1", // purple-500 — brand stays consistent (D8)
|
|
146
188
|
primaryForeground: "#ffffff",
|
|
147
189
|
secondary: "#262626", // ground-800
|
|
@@ -153,6 +195,38 @@ export const tokens = {
|
|
|
153
195
|
warning: "#221600", // butter-950 surface
|
|
154
196
|
warningForeground: "#fffad0", // butter-100
|
|
155
197
|
ring: "#c100f1", // purple-500 = brand.primary
|
|
198
|
+
checkerA: "#4a4a4a",
|
|
199
|
+
checkerB: "#333333",
|
|
200
|
+
canvas: "#1c1c1c",
|
|
201
|
+
},
|
|
202
|
+
},
|
|
203
|
+
|
|
204
|
+
/* ============================================================== *
|
|
205
|
+
* SURFACES — elevation ladder (levels 1–8) *
|
|
206
|
+
* ============================================================== *
|
|
207
|
+
* Consumed via surfaceClasses() / <Elevated> / SurfaceProvider:
|
|
208
|
+
* `bg-surface-N`, `shadow-surface-N`, and the raw `var(--surface-N)`
|
|
209
|
+
* (scroll-fade gradients). Level 1 is the page substrate; each nested
|
|
210
|
+
* layer (popover +2, dialog +4, …) walks up the ladder. Index 0 = level 1.
|
|
211
|
+
*
|
|
212
|
+
* Light: surfaces stay white (matching card/popover) and elevation is
|
|
213
|
+
* carried by the shadow ramp, the house style.
|
|
214
|
+
* Mid/Dark: surfaces step lighter/darker per level so nested layers stay
|
|
215
|
+
* distinguishable where drop shadows barely read. */
|
|
216
|
+
surfaces: {
|
|
217
|
+
light: {
|
|
218
|
+
bg: ["#ffffff", "#ffffff", "#ffffff", "#ffffff", "#ffffff", "#ffffff", "#ffffff", "#ffffff"],
|
|
219
|
+
shadow: surfaceShadowRamp("rgba(0, 0, 0, 0.06)", (a) => `rgba(0, 0, 0, ${a})`),
|
|
220
|
+
},
|
|
221
|
+
mid: {
|
|
222
|
+
// background (#737373) → card (#525252) → ground-700 (#404040)
|
|
223
|
+
bg: ["#737373", "#6b6b6b", "#636363", "#5b5b5b", "#525252", "#4d4d4d", "#474747", "#404040"],
|
|
224
|
+
shadow: surfaceShadowRamp("rgba(0, 0, 0, 0.14)", (a) => `rgba(0, 0, 0, ${Math.min(a * 2.5, 0.3)})`),
|
|
225
|
+
},
|
|
226
|
+
dark: {
|
|
227
|
+
// background (#171717) → card (#262626) → accent (#404040)
|
|
228
|
+
bg: ["#171717", "#1f1f1f", "#262626", "#2b2b2b", "#303030", "#353535", "#3a3a3a", "#404040"],
|
|
229
|
+
shadow: surfaceShadowRamp("rgba(255, 255, 255, 0.08)", (a) => `rgba(0, 0, 0, ${Math.min(a * 4, 0.4)})`),
|
|
156
230
|
},
|
|
157
231
|
},
|
|
158
232
|
|
|
@@ -232,6 +306,9 @@ export const tokens = {
|
|
|
232
306
|
lineHeight: "1.625",
|
|
233
307
|
textWrap: "pretty",
|
|
234
308
|
},
|
|
309
|
+
/** 11px — dense metadata (table sub-lines, chips, editor hints). Use instead of text-[11px]. */
|
|
310
|
+
"caption-sm": { family: "sans", size: "0.6875rem", weight: 400, lineHeight: "1.5" },
|
|
311
|
+
/** 10px — the floor. Use instead of text-[10px]; keep to non-essential metadata. */
|
|
235
312
|
"caption-xs": { family: "sans", size: "0.625rem", weight: 400, lineHeight: "1.625" },
|
|
236
313
|
|
|
237
314
|
/* --- "Eyebrow" family — uppercase tracked label used above headlines, --- *
|
|
@@ -295,6 +372,38 @@ export const tokens = {
|
|
|
295
372
|
full: "9999px",
|
|
296
373
|
},
|
|
297
374
|
|
|
375
|
+
/* ============================================================== *
|
|
376
|
+
* DENSITY — control sizing tiers *
|
|
377
|
+
* ============================================================== *
|
|
378
|
+
* Emitted as `--density-*` custom properties: `:root` carries the
|
|
379
|
+
* default tier, `[data-density="compact"]` the editor-chrome tier.
|
|
380
|
+
* Components switch via the `compact:` Tailwind variant (same
|
|
381
|
+
* attribute); consumers can read the vars for bespoke controls. */
|
|
382
|
+
density: {
|
|
383
|
+
default: {
|
|
384
|
+
controlHeight: "32px",
|
|
385
|
+
inputHeight: "40px",
|
|
386
|
+
rowHeight: "36px",
|
|
387
|
+
text: "14px",
|
|
388
|
+
label: "12px",
|
|
389
|
+
menuItemHeight: "40px",
|
|
390
|
+
menuText: "14px",
|
|
391
|
+
paddingX: "12px",
|
|
392
|
+
radius: "8px",
|
|
393
|
+
},
|
|
394
|
+
compact: {
|
|
395
|
+
controlHeight: "24px",
|
|
396
|
+
inputHeight: "24px",
|
|
397
|
+
rowHeight: "28px",
|
|
398
|
+
text: "12px",
|
|
399
|
+
label: "11px",
|
|
400
|
+
menuItemHeight: "28px",
|
|
401
|
+
menuText: "13px",
|
|
402
|
+
paddingX: "8px",
|
|
403
|
+
radius: "5px",
|
|
404
|
+
},
|
|
405
|
+
},
|
|
406
|
+
|
|
298
407
|
/* ============================================================== *
|
|
299
408
|
* Z-INDEX — semantic layering scale *
|
|
300
409
|
* ============================================================== */
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/tokens/tokens.ts"],"names":[],"mappings":"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","file":"chunk-RI6QJR2L.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 // Mid — a neutral medium-gray theme (from the Pappery designer \"mid\" palette,\n // mapped onto the ground scale). Sits between light and dark.\n mid: {\n background: \"#737373\", // ground-500 — main surface (designer panel)\n foreground: \"#fafafa\", // ground-50\n card: \"#525252\", // ground-600 — elevated items (designer item-bg)\n cardForeground: \"#fafafa\",\n surface: \"#525252\", // ground-600 (designer canvas/pane)\n surfaceForeground: \"#fafafa\",\n border: \"#a3a3a3\", // ground-400 (designer border — lighter so it reads on the gray)\n input: \"#404040\", // ground-700 (designer input-bg)\n muted: \"#525252\", // ground-600\n mutedForeground: \"#e5e5e5\", // ground-200 (designer text-secondary)\n accent: \"#404040\", // ground-700 (designer item-hover-bg)\n accentForeground: \"#fafafa\",\n primary: \"#c100f1\", // brand stays consistent across themes\n primaryForeground: \"#ffffff\",\n secondary: \"#525252\", // ground-600\n secondaryForeground: \"#fafafa\",\n destructive: \"#ef4444\", // red-500\n destructiveForeground: \"#ffffff\",\n success: \"#CDEA19\", // lime — functional semantic only\n successForeground: \"#171717\",\n warning: \"#fff5bf\", // butter-200\n warningForeground: \"#171717\",\n ring: \"#c100f1\",\n },\n dark: {\n background: \"#171717\", // ground-900 — designer canvas (deepest)\n foreground: \"#fafafa\", // ground-50\n card: \"#262626\", // ground-800 — designer panel-bg (elevated over bg)\n cardForeground: \"#fafafa\",\n surface: \"#1a1a1a\", // designer item-hover depth\n surfaceForeground: \"#f5f5f5\",\n border: \"#404040\", // ground-700 — designer border (reads on the dark)\n input: \"#262626\", // ground-800\n muted: \"#262626\", // ground-800\n mutedForeground: \"#a3a3a3\", // ground-400\n accent: \"#404040\", // ground-700 — neutral elevated/hover (designer item-hover)\n accentForeground: \"#fafafa\",\n primary: \"#c100f1\", // purple-500 — brand stays consistent (D8)\n primaryForeground: \"#ffffff\",\n secondary: \"#262626\", // ground-800\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 display:\n 'Gabarito, Inter, ui-sans-serif, -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-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\": {\n family: \"display\",\n size: \"3rem\",\n weight: 400,\n lineHeight: \"1.15\",\n textWrap: \"balance\",\n },\n display: {\n family: \"display\",\n size: \"2.25rem\",\n weight: 400,\n lineHeight: \"1.15\",\n textWrap: \"balance\",\n },\n \"heading-xl\": {\n family: \"display\",\n size: \"1.875rem\",\n weight: 400,\n lineHeight: \"1.2\",\n textWrap: \"balance\",\n },\n heading: {\n family: \"display\",\n size: \"1.5rem\",\n weight: 400,\n lineHeight: \"1.2\",\n textWrap: \"balance\",\n },\n subheading: {\n family: \"display\",\n size: \"1.25rem\",\n weight: 400,\n lineHeight: \"1.4\",\n textWrap: \"balance\",\n },\n \"body-lg\": {\n family: \"sans\",\n size: \"1rem\",\n weight: 400,\n lineHeight: \"1.625\",\n textWrap: \"pretty\",\n },\n body: {\n family: \"sans\",\n size: \"0.875rem\",\n weight: 400,\n lineHeight: \"1.625\",\n textWrap: \"pretty\",\n },\n \"body-sm\": {\n family: \"sans\",\n size: \"0.75rem\",\n weight: 500,\n lineHeight: \"1.625\",\n textWrap: \"pretty\",\n },\n caption: {\n family: \"sans\",\n size: \"0.75rem\",\n weight: 400,\n lineHeight: \"1.625\",\n textWrap: \"pretty\",\n },\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 \"hilum-orbit\": \"hilum-orbit 1.4s ease-in-out infinite\",\n \"hilum-spring-in\": \"hilum-spring-in 180ms cubic-bezier(0.2, 0.9, 0.2, 1.15)\",\n \"hilum-thinking\": \"hilum-thinking 1.1s ease-in-out infinite\",\n },\n} as const;\n\nexport type Tokens = typeof tokens;\nexport type SemanticTokens = typeof tokens.semantic.light;\n"]}
|