@fluixi-ui/tokens 0.3.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 (59) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +106 -0
  3. package/dist/css/accordion.css +7 -0
  4. package/dist/css/alert.css +42 -0
  5. package/dist/css/avatar.css +36 -0
  6. package/dist/css/badge.css +12 -0
  7. package/dist/css/base.css +10 -0
  8. package/dist/css/bulk-editor.css +478 -0
  9. package/dist/css/button.css +92 -0
  10. package/dist/css/calendar.css +140 -0
  11. package/dist/css/checkbox-radio.css +66 -0
  12. package/dist/css/command.css +90 -0
  13. package/dist/css/date-field.css +58 -0
  14. package/dist/css/date-picker.css +81 -0
  15. package/dist/css/field.css +19 -0
  16. package/dist/css/hover-card.css +16 -0
  17. package/dist/css/input.css +85 -0
  18. package/dist/css/kbd.css +20 -0
  19. package/dist/css/menubar.css +27 -0
  20. package/dist/css/navigation-menu.css +144 -0
  21. package/dist/css/number-field.css +83 -0
  22. package/dist/css/parts/listbox.css +111 -0
  23. package/dist/css/parts/menu.css +69 -0
  24. package/dist/css/parts/motion.css +34 -0
  25. package/dist/css/parts/overlays.css +36 -0
  26. package/dist/css/progress.css +40 -0
  27. package/dist/css/select-combobox.css +76 -0
  28. package/dist/css/separator.css +15 -0
  29. package/dist/css/skeleton.css +22 -0
  30. package/dist/css/slider.css +71 -0
  31. package/dist/css/spinner.css +17 -0
  32. package/dist/css/switch.css +33 -0
  33. package/dist/css/table.css +173 -0
  34. package/dist/css/tabs.css +32 -0
  35. package/dist/css/toast.css +154 -0
  36. package/dist/css/toggle.css +74 -0
  37. package/dist/css/toolbar.css +48 -0
  38. package/dist/css/tooltip.css +13 -0
  39. package/dist/index.d.ts +6 -0
  40. package/dist/index.d.ts.map +1 -0
  41. package/dist/index.js +5 -0
  42. package/dist/lib/css/index.d.ts +20 -0
  43. package/dist/lib/css/index.d.ts.map +1 -0
  44. package/dist/lib/css/index.js +135 -0
  45. package/dist/lib/reference/colors.d.ts +24 -0
  46. package/dist/lib/reference/colors.d.ts.map +1 -0
  47. package/dist/lib/reference/colors.js +150 -0
  48. package/dist/lib/reference/index.d.ts +302 -0
  49. package/dist/lib/reference/index.d.ts.map +1 -0
  50. package/dist/lib/reference/index.js +147 -0
  51. package/dist/lib/theme/index.d.ts +32 -0
  52. package/dist/lib/theme/index.d.ts.map +1 -0
  53. package/dist/lib/theme/index.js +87 -0
  54. package/dist/lib/vars/index.d.ts +131 -0
  55. package/dist/lib/vars/index.d.ts.map +1 -0
  56. package/dist/lib/vars/index.js +40 -0
  57. package/dist/preset.css +47 -0
  58. package/dist/tsconfig.lib.tsbuildinfo +1 -0
  59. package/package.json +79 -0
@@ -0,0 +1,24 @@
1
+ export type ThemeName = 'light' | 'dark' | 'high-contrast';
2
+ /** Swappable accent palettes. `blue` is the built-in default baked into the base scales. */
3
+ export type AccentName = 'blue' | 'violet' | 'rose' | 'green';
4
+ export declare const DEFAULT_ACCENT: AccentName;
5
+ type Scale = Record<number, string>;
6
+ export declare const colorScales: Record<ThemeName, Record<string, string>>;
7
+ export declare const semanticColors: Record<string, string>;
8
+ export declare const semanticOverrides: Partial<Record<ThemeName, Record<string, string>>>;
9
+ /**
10
+ * Alternate accent palettes, selected via `data-accent`. Only the accent scale
11
+ * changes — every `color-primary`/focus/selection token derives from it. `fg`
12
+ * overrides `color-primary-fg` for a light-solid accent whose step 9 can't carry
13
+ * white text (green); the rest keep the default white. `blue` is omitted: it's
14
+ * the base scale, so `data-accent="blue"` (or none) is the built-in look.
15
+ * Scales follow the Radix functional model (violet / crimson / grass).
16
+ */
17
+ export interface AccentPreset {
18
+ light: Scale;
19
+ dark: Scale;
20
+ fg?: string;
21
+ }
22
+ export declare const accentPresets: Record<Exclude<AccentName, 'blue'>, AccentPreset>;
23
+ export {};
24
+ //# sourceMappingURL=colors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"colors.d.ts","sourceRoot":"","sources":["../../../src/lib/reference/colors.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,SAAS,GAAG,OAAO,GAAG,MAAM,GAAG,eAAe,CAAC;AAE3D,4FAA4F;AAC5F,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,CAAC;AAC9D,eAAO,MAAM,cAAc,EAAE,UAAmB,CAAC;AAEjD,KAAK,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAsGpC,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAQjE,CAAC;AAEF,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAwBjD,CAAC;AAEF,eAAO,MAAM,iBAAiB,EAAE,OAAO,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAUhF,CAAC;AAEF;;;;;;;GAOG;AACH,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,KAAK,CAAC;IACb,IAAI,EAAE,KAAK,CAAC;IACZ,EAAE,CAAC,EAAE,MAAM,CAAC;CACb;AAED,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,OAAO,CAAC,UAAU,EAAE,MAAM,CAAC,EAAE,YAAY,CAc3E,CAAC"}
@@ -0,0 +1,150 @@
1
+ export const DEFAULT_ACCENT = 'blue';
2
+ // Neutrals: a balanced, faintly cool gray — professional and quiet, the calm
3
+ // canvas that lets content (not chrome) carry the interface. Steps follow the
4
+ // Radix functional model: 1–2 surfaces, 3–5 component fills, 6–8 borders,
5
+ // 9–10 solid, 11 muted text, 12 primary text.
6
+ const grayLight = {
7
+ 1: '#fcfcfd',
8
+ 2: '#f9fafb',
9
+ 3: '#f1f2f4',
10
+ 4: '#eaecef',
11
+ 5: '#e3e5e9',
12
+ 6: '#dcdfe3',
13
+ 7: '#ced2d8',
14
+ 8: '#b8bdc6',
15
+ 9: '#8a9099',
16
+ 10: '#7e848d',
17
+ 11: '#60646c',
18
+ 12: '#1a1d21',
19
+ };
20
+ const grayDark = {
21
+ 1: '#0e0f11',
22
+ 2: '#161719',
23
+ 3: '#1d1f22',
24
+ 4: '#232629',
25
+ 5: '#292d31',
26
+ 6: '#31353a',
27
+ 7: '#3d424a',
28
+ 8: '#4e545e',
29
+ 9: '#5c626c',
30
+ 10: '#697079',
31
+ 11: '#a5abb3',
32
+ 12: '#eceef0',
33
+ };
34
+ // Accent: a restrained, confident blue used sparingly — primary actions, focus,
35
+ // selection. Not a decorative wash: the neutrals do the heavy lifting. Step 9 is
36
+ // the solid and clears AA for white text (~5.1:1).
37
+ const accentLight = {
38
+ 1: '#fbfdff',
39
+ 2: '#f3f8ff',
40
+ 3: '#e7f1ff',
41
+ 4: '#d7e7ff',
42
+ 5: '#c3dafe',
43
+ 6: '#aac8fb',
44
+ 7: '#87aff5',
45
+ 8: '#568eec',
46
+ 9: '#2563eb',
47
+ 10: '#1b57d8',
48
+ 11: '#295ec2',
49
+ 12: '#12275c',
50
+ };
51
+ const accentDark = {
52
+ 1: '#0c1420',
53
+ 2: '#0f1a2c',
54
+ 3: '#0f2547',
55
+ 4: '#0e2f5a',
56
+ 5: '#153a6b',
57
+ 6: '#1e477d',
58
+ 7: '#265795',
59
+ 8: '#2e6ab8',
60
+ 9: '#3162cf',
61
+ 10: '#4074e2',
62
+ 11: '#8fb4fb',
63
+ 12: '#d6e6ff',
64
+ };
65
+ const statusLight = {
66
+ 'danger-solid': '#e5484d',
67
+ 'danger-subtle': '#feebec',
68
+ 'danger-fg': '#ffffff',
69
+ 'success-solid': '#30a46c',
70
+ 'success-subtle': '#e6f6ec',
71
+ 'success-fg': '#ffffff',
72
+ 'warning-solid': '#ffb224',
73
+ 'warning-subtle': '#fff4d5',
74
+ 'warning-fg': '#1c2024',
75
+ };
76
+ const statusDark = {
77
+ 'danger-solid': '#ff6369',
78
+ 'danger-subtle': '#3b1219',
79
+ 'danger-fg': '#ffffff',
80
+ 'success-solid': '#3dd68c',
81
+ 'success-subtle': '#0f291e',
82
+ 'success-fg': '#ffffff',
83
+ 'warning-solid': '#ffca16',
84
+ 'warning-subtle': '#3a2e00',
85
+ 'warning-fg': '#1c2024',
86
+ };
87
+ function scaleRecord(gray, accent, status) {
88
+ const out = {};
89
+ for (const [step, value] of Object.entries(gray))
90
+ out[`gray-${step}`] = value;
91
+ for (const [step, value] of Object.entries(accent))
92
+ out[`accent-${step}`] = value;
93
+ return { ...out, ...status };
94
+ }
95
+ export const colorScales = {
96
+ light: scaleRecord(grayLight, accentLight, statusLight),
97
+ dark: scaleRecord(grayDark, accentDark, statusDark),
98
+ 'high-contrast': scaleRecord({ ...grayLight, 1: '#ffffff', 6: '#8a9099', 8: '#5f636b', 12: '#000000' }, { ...accentLight, 9: '#123f9c', 10: '#0e3176' }, statusLight),
99
+ };
100
+ export const semanticColors = {
101
+ 'color-bg': 'var(--flx-ui-gray-1)',
102
+ 'color-bg-subtle': 'var(--flx-ui-gray-2)',
103
+ 'color-bg-muted': 'var(--flx-ui-gray-3)',
104
+ 'color-fg': 'var(--flx-ui-gray-12)',
105
+ 'color-fg-muted': 'var(--flx-ui-gray-11)',
106
+ 'color-border': 'var(--flx-ui-gray-6)',
107
+ 'color-border-strong': 'var(--flx-ui-gray-8)',
108
+ 'color-focus-ring': 'var(--flx-ui-accent-8)',
109
+ 'color-primary': 'var(--flx-ui-accent-9)',
110
+ 'color-primary-hover': 'var(--flx-ui-accent-10)',
111
+ 'color-primary-active': 'var(--flx-ui-accent-11)',
112
+ 'color-primary-fg': '#ffffff',
113
+ 'color-primary-subtle': 'var(--flx-ui-accent-3)',
114
+ 'color-danger': 'var(--flx-ui-danger-solid)',
115
+ 'color-danger-fg': 'var(--flx-ui-danger-fg)',
116
+ 'color-danger-subtle': 'var(--flx-ui-danger-subtle)',
117
+ 'color-success': 'var(--flx-ui-success-solid)',
118
+ 'color-success-fg': 'var(--flx-ui-success-fg)',
119
+ 'color-success-subtle': 'var(--flx-ui-success-subtle)',
120
+ 'color-warning': 'var(--flx-ui-warning-solid)',
121
+ 'color-warning-fg': 'var(--flx-ui-warning-fg)',
122
+ 'color-warning-subtle': 'var(--flx-ui-warning-subtle)',
123
+ 'color-overlay': 'rgba(0, 0, 0, 0.4)',
124
+ };
125
+ export const semanticOverrides = {
126
+ dark: {
127
+ // The dark solid stays deep enough for white text (~4.9:1), so no flip.
128
+ 'color-overlay': 'rgba(0, 0, 0, 0.6)',
129
+ },
130
+ 'high-contrast': {
131
+ 'color-border': 'var(--flx-ui-gray-12)',
132
+ 'color-border-strong': 'var(--flx-ui-gray-12)',
133
+ 'color-focus-ring': 'var(--flx-ui-gray-12)',
134
+ },
135
+ };
136
+ export const accentPresets = {
137
+ violet: {
138
+ light: { 1: '#fdfcfe', 2: '#faf8ff', 3: '#f4f0fe', 4: '#ebe4ff', 5: '#e1d5ff', 6: '#d4c4fb', 7: '#c2adf0', 8: '#aa8fe0', 9: '#6e56cf', 10: '#654dc4', 11: '#6550b9', 12: '#2f265f' },
139
+ dark: { 1: '#14121f', 2: '#1b1525', 3: '#291f43', 4: '#33255b', 5: '#3c2e69', 6: '#473876', 7: '#56468b', 8: '#6958ad', 9: '#6e56cf', 10: '#7d66d9', 11: '#baa7ff', 12: '#e2ddfe' },
140
+ },
141
+ rose: {
142
+ light: { 1: '#fffcfd', 2: '#fef7f9', 3: '#ffe9f0', 4: '#fedce7', 5: '#facedd', 6: '#f3bed1', 7: '#eaacc3', 8: '#e093b2', 9: '#e93d82', 10: '#df3478', 11: '#cb1d63', 12: '#621639' },
143
+ dark: { 1: '#191114', 2: '#201318', 3: '#381525', 4: '#4d122f', 5: '#5c1839', 6: '#6d2545', 7: '#873356', 8: '#b0436e', 9: '#e93d82', 10: '#ee518a', 11: '#ff92ad', 12: '#fdd3e8' },
144
+ },
145
+ green: {
146
+ light: { 1: '#fbfefb', 2: '#f5fbf5', 3: '#e9f6e9', 4: '#daf1db', 5: '#c9e8ca', 6: '#b2ddb5', 7: '#94ce9a', 8: '#65ba74', 9: '#46a758', 10: '#3e9b4f', 11: '#2a7e3b', 12: '#203c25' },
147
+ dark: { 1: '#0e1511', 2: '#141a15', 3: '#1b2a1e', 4: '#1d3a24', 5: '#25482d', 6: '#2d5736', 7: '#366740', 8: '#3e7949', 9: '#46a758', 10: '#53b365', 11: '#71d083', 12: '#c2f0c2' },
148
+ fg: '#0c2617', // step 9 is too light for white text
149
+ },
150
+ };
@@ -0,0 +1,302 @@
1
+ export declare const space: {
2
+ readonly 0: "0px";
3
+ readonly 1: "0.25rem";
4
+ readonly 2: "0.5rem";
5
+ readonly 3: "0.75rem";
6
+ readonly 4: "1rem";
7
+ readonly 5: "1.25rem";
8
+ readonly 6: "1.5rem";
9
+ readonly 8: "2rem";
10
+ readonly 10: "2.5rem";
11
+ readonly 12: "3rem";
12
+ readonly 16: "4rem";
13
+ readonly 20: "5rem";
14
+ readonly 24: "6rem";
15
+ };
16
+ export declare const size: {
17
+ readonly xs: "1.5rem";
18
+ readonly sm: "2rem";
19
+ readonly md: "2.5rem";
20
+ readonly lg: "3rem";
21
+ readonly xl: "3.5rem";
22
+ };
23
+ export declare const fontFamily: {
24
+ readonly sans: "ui-sans-serif, system-ui, -apple-system, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif";
25
+ readonly serif: "ui-serif, Georgia, Cambria, \"Times New Roman\", serif";
26
+ readonly mono: "ui-monospace, SFMono-Regular, \"SF Mono\", Menlo, Consolas, monospace";
27
+ };
28
+ export declare const fontSize: {
29
+ readonly xs: "0.75rem";
30
+ readonly sm: "0.875rem";
31
+ readonly md: "1rem";
32
+ readonly lg: "1.125rem";
33
+ readonly xl: "1.25rem";
34
+ readonly '2xl': "1.5rem";
35
+ readonly '3xl': "1.875rem";
36
+ readonly '4xl': "2.25rem";
37
+ };
38
+ export declare const fontWeight: {
39
+ readonly normal: "400";
40
+ readonly medium: "500";
41
+ readonly semibold: "600";
42
+ readonly bold: "700";
43
+ };
44
+ export declare const lineHeight: {
45
+ readonly none: "1";
46
+ readonly tight: "1.25";
47
+ readonly normal: "1.5";
48
+ readonly relaxed: "1.75";
49
+ };
50
+ export declare const letterSpacing: {
51
+ readonly tight: "-0.01em";
52
+ readonly normal: "0em";
53
+ readonly wide: "0.02em";
54
+ };
55
+ export declare const radius: {
56
+ readonly none: "0px";
57
+ readonly sm: "0.25rem";
58
+ readonly md: "0.375rem";
59
+ readonly lg: "0.5rem";
60
+ readonly xl: "0.75rem";
61
+ readonly full: "9999px";
62
+ };
63
+ export declare const borderWidth: {
64
+ readonly none: "0px";
65
+ readonly thin: "1px";
66
+ readonly thick: "2px";
67
+ };
68
+ export declare const shadow: {
69
+ readonly sm: "0 1px 2px rgba(17, 24, 39, 0.06)";
70
+ readonly md: "0 2px 4px -1px rgba(17, 24, 39, 0.06), 0 4px 8px -2px rgba(17, 24, 39, 0.05)";
71
+ readonly lg: "0 4px 8px -2px rgba(17, 24, 39, 0.06), 0 12px 20px -6px rgba(17, 24, 39, 0.10)";
72
+ readonly xl: "0 8px 16px -4px rgba(17, 24, 39, 0.08), 0 20px 32px -12px rgba(17, 24, 39, 0.14)";
73
+ };
74
+ export declare const duration: {
75
+ readonly instant: "0ms";
76
+ readonly fast: "150ms";
77
+ readonly normal: "200ms";
78
+ readonly slow: "300ms";
79
+ };
80
+ export declare const easing: {
81
+ readonly standard: "cubic-bezier(0.2, 0, 0, 1)";
82
+ readonly emphasized: "cubic-bezier(0.3, 0, 0, 1)";
83
+ readonly linear: "linear";
84
+ };
85
+ export declare const opacity: {
86
+ readonly 0: "0";
87
+ readonly 25: "0.25";
88
+ readonly 50: "0.5";
89
+ readonly 75: "0.75";
90
+ readonly 100: "1";
91
+ readonly disabled: "0.5";
92
+ };
93
+ export declare const blur: {
94
+ readonly sm: "4px";
95
+ readonly md: "8px";
96
+ readonly lg: "16px";
97
+ };
98
+ export declare const zIndex: {
99
+ readonly hide: "-1";
100
+ readonly base: "0";
101
+ readonly dropdown: "1000";
102
+ readonly sticky: "1100";
103
+ readonly overlay: "1200";
104
+ readonly modal: "1300";
105
+ readonly popover: "1400";
106
+ readonly toast: "1500";
107
+ readonly tooltip: "1600";
108
+ readonly max: "2147483647";
109
+ };
110
+ export declare const elevation: {
111
+ readonly 1: "var(--flx-ui-shadow-sm)";
112
+ readonly 2: "var(--flx-ui-shadow-md)";
113
+ readonly 3: "var(--flx-ui-shadow-lg)";
114
+ readonly 4: "var(--flx-ui-shadow-xl)";
115
+ };
116
+ export declare const breakpoint: {
117
+ readonly sm: "640px";
118
+ readonly md: "768px";
119
+ readonly lg: "1024px";
120
+ readonly xl: "1280px";
121
+ readonly '2xl': "1536px";
122
+ };
123
+ export interface TokenCategory {
124
+ prefix: string;
125
+ values: Record<string, string>;
126
+ }
127
+ export declare const staticTokens: {
128
+ readonly space: {
129
+ readonly prefix: "space";
130
+ readonly values: {
131
+ readonly 0: "0px";
132
+ readonly 1: "0.25rem";
133
+ readonly 2: "0.5rem";
134
+ readonly 3: "0.75rem";
135
+ readonly 4: "1rem";
136
+ readonly 5: "1.25rem";
137
+ readonly 6: "1.5rem";
138
+ readonly 8: "2rem";
139
+ readonly 10: "2.5rem";
140
+ readonly 12: "3rem";
141
+ readonly 16: "4rem";
142
+ readonly 20: "5rem";
143
+ readonly 24: "6rem";
144
+ };
145
+ };
146
+ readonly size: {
147
+ readonly prefix: "size";
148
+ readonly values: {
149
+ readonly xs: "1.5rem";
150
+ readonly sm: "2rem";
151
+ readonly md: "2.5rem";
152
+ readonly lg: "3rem";
153
+ readonly xl: "3.5rem";
154
+ };
155
+ };
156
+ readonly fontFamily: {
157
+ readonly prefix: "font-family";
158
+ readonly values: {
159
+ readonly sans: "ui-sans-serif, system-ui, -apple-system, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif";
160
+ readonly serif: "ui-serif, Georgia, Cambria, \"Times New Roman\", serif";
161
+ readonly mono: "ui-monospace, SFMono-Regular, \"SF Mono\", Menlo, Consolas, monospace";
162
+ };
163
+ };
164
+ readonly fontSize: {
165
+ readonly prefix: "font-size";
166
+ readonly values: {
167
+ readonly xs: "0.75rem";
168
+ readonly sm: "0.875rem";
169
+ readonly md: "1rem";
170
+ readonly lg: "1.125rem";
171
+ readonly xl: "1.25rem";
172
+ readonly '2xl': "1.5rem";
173
+ readonly '3xl': "1.875rem";
174
+ readonly '4xl': "2.25rem";
175
+ };
176
+ };
177
+ readonly fontWeight: {
178
+ readonly prefix: "font-weight";
179
+ readonly values: {
180
+ readonly normal: "400";
181
+ readonly medium: "500";
182
+ readonly semibold: "600";
183
+ readonly bold: "700";
184
+ };
185
+ };
186
+ readonly lineHeight: {
187
+ readonly prefix: "line-height";
188
+ readonly values: {
189
+ readonly none: "1";
190
+ readonly tight: "1.25";
191
+ readonly normal: "1.5";
192
+ readonly relaxed: "1.75";
193
+ };
194
+ };
195
+ readonly letterSpacing: {
196
+ readonly prefix: "letter-spacing";
197
+ readonly values: {
198
+ readonly tight: "-0.01em";
199
+ readonly normal: "0em";
200
+ readonly wide: "0.02em";
201
+ };
202
+ };
203
+ readonly radius: {
204
+ readonly prefix: "radius";
205
+ readonly values: {
206
+ readonly none: "0px";
207
+ readonly sm: "0.25rem";
208
+ readonly md: "0.375rem";
209
+ readonly lg: "0.5rem";
210
+ readonly xl: "0.75rem";
211
+ readonly full: "9999px";
212
+ };
213
+ };
214
+ readonly borderWidth: {
215
+ readonly prefix: "border-width";
216
+ readonly values: {
217
+ readonly none: "0px";
218
+ readonly thin: "1px";
219
+ readonly thick: "2px";
220
+ };
221
+ };
222
+ readonly shadow: {
223
+ readonly prefix: "shadow";
224
+ readonly values: {
225
+ readonly sm: "0 1px 2px rgba(17, 24, 39, 0.06)";
226
+ readonly md: "0 2px 4px -1px rgba(17, 24, 39, 0.06), 0 4px 8px -2px rgba(17, 24, 39, 0.05)";
227
+ readonly lg: "0 4px 8px -2px rgba(17, 24, 39, 0.06), 0 12px 20px -6px rgba(17, 24, 39, 0.10)";
228
+ readonly xl: "0 8px 16px -4px rgba(17, 24, 39, 0.08), 0 20px 32px -12px rgba(17, 24, 39, 0.14)";
229
+ };
230
+ };
231
+ readonly duration: {
232
+ readonly prefix: "duration";
233
+ readonly values: {
234
+ readonly instant: "0ms";
235
+ readonly fast: "150ms";
236
+ readonly normal: "200ms";
237
+ readonly slow: "300ms";
238
+ };
239
+ };
240
+ readonly easing: {
241
+ readonly prefix: "ease";
242
+ readonly values: {
243
+ readonly standard: "cubic-bezier(0.2, 0, 0, 1)";
244
+ readonly emphasized: "cubic-bezier(0.3, 0, 0, 1)";
245
+ readonly linear: "linear";
246
+ };
247
+ };
248
+ readonly opacity: {
249
+ readonly prefix: "opacity";
250
+ readonly values: {
251
+ readonly 0: "0";
252
+ readonly 25: "0.25";
253
+ readonly 50: "0.5";
254
+ readonly 75: "0.75";
255
+ readonly 100: "1";
256
+ readonly disabled: "0.5";
257
+ };
258
+ };
259
+ readonly blur: {
260
+ readonly prefix: "blur";
261
+ readonly values: {
262
+ readonly sm: "4px";
263
+ readonly md: "8px";
264
+ readonly lg: "16px";
265
+ };
266
+ };
267
+ readonly zIndex: {
268
+ readonly prefix: "z";
269
+ readonly values: {
270
+ readonly hide: "-1";
271
+ readonly base: "0";
272
+ readonly dropdown: "1000";
273
+ readonly sticky: "1100";
274
+ readonly overlay: "1200";
275
+ readonly modal: "1300";
276
+ readonly popover: "1400";
277
+ readonly toast: "1500";
278
+ readonly tooltip: "1600";
279
+ readonly max: "2147483647";
280
+ };
281
+ };
282
+ readonly elevation: {
283
+ readonly prefix: "elevation";
284
+ readonly values: {
285
+ readonly 1: "var(--flx-ui-shadow-sm)";
286
+ readonly 2: "var(--flx-ui-shadow-md)";
287
+ readonly 3: "var(--flx-ui-shadow-lg)";
288
+ readonly 4: "var(--flx-ui-shadow-xl)";
289
+ };
290
+ };
291
+ readonly breakpoint: {
292
+ readonly prefix: "breakpoint";
293
+ readonly values: {
294
+ readonly sm: "640px";
295
+ readonly md: "768px";
296
+ readonly lg: "1024px";
297
+ readonly xl: "1280px";
298
+ readonly '2xl': "1536px";
299
+ };
300
+ };
301
+ };
302
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/reference/index.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,KAAK;;;;;;;;;;;;;;CAcR,CAAC;AAEX,eAAO,MAAM,IAAI;;;;;;CAMP,CAAC;AAEX,eAAO,MAAM,UAAU;;;;CAIb,CAAC;AAEX,eAAO,MAAM,QAAQ;;;;;;;;;CASX,CAAC;AAEX,eAAO,MAAM,UAAU;;;;;CAKb,CAAC;AAEX,eAAO,MAAM,UAAU;;;;;CAKb,CAAC;AAEX,eAAO,MAAM,aAAa;;;;CAIhB,CAAC;AAKX,eAAO,MAAM,MAAM;;;;;;;CAOT,CAAC;AAEX,eAAO,MAAM,WAAW;;;;CAId,CAAC;AAKX,eAAO,MAAM,MAAM;;;;;CAKT,CAAC;AAEX,eAAO,MAAM,QAAQ;;;;;CAKX,CAAC;AAEX,eAAO,MAAM,MAAM;;;;CAIT,CAAC;AAEX,eAAO,MAAM,OAAO;;;;;;;CAOV,CAAC;AAEX,eAAO,MAAM,IAAI;;;;CAIP,CAAC;AAEX,eAAO,MAAM,MAAM;;;;;;;;;;;CAWT,CAAC;AAEX,eAAO,MAAM,SAAS;;;;;CAKZ,CAAC;AAEX,eAAO,MAAM,UAAU;;;;;;CAMb,CAAC;AAEX,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAChC;AAED,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkByB,CAAC"}
@@ -0,0 +1,147 @@
1
+ export const space = {
2
+ 0: '0px',
3
+ 1: '0.25rem',
4
+ 2: '0.5rem',
5
+ 3: '0.75rem',
6
+ 4: '1rem',
7
+ 5: '1.25rem',
8
+ 6: '1.5rem',
9
+ 8: '2rem',
10
+ 10: '2.5rem',
11
+ 12: '3rem',
12
+ 16: '4rem',
13
+ 20: '5rem',
14
+ 24: '6rem',
15
+ };
16
+ export const size = {
17
+ xs: '1.5rem',
18
+ sm: '2rem',
19
+ md: '2.5rem',
20
+ lg: '3rem',
21
+ xl: '3.5rem',
22
+ };
23
+ export const fontFamily = {
24
+ sans: 'ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, Helvetica, Arial, sans-serif',
25
+ serif: 'ui-serif, Georgia, Cambria, "Times New Roman", serif',
26
+ mono: 'ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace',
27
+ };
28
+ export const fontSize = {
29
+ xs: '0.75rem',
30
+ sm: '0.875rem',
31
+ md: '1rem',
32
+ lg: '1.125rem',
33
+ xl: '1.25rem',
34
+ '2xl': '1.5rem',
35
+ '3xl': '1.875rem',
36
+ '4xl': '2.25rem',
37
+ };
38
+ export const fontWeight = {
39
+ normal: '400',
40
+ medium: '500',
41
+ semibold: '600',
42
+ bold: '700',
43
+ };
44
+ export const lineHeight = {
45
+ none: '1',
46
+ tight: '1.25',
47
+ normal: '1.5',
48
+ relaxed: '1.75',
49
+ };
50
+ export const letterSpacing = {
51
+ tight: '-0.01em',
52
+ normal: '0em',
53
+ wide: '0.02em',
54
+ };
55
+ // A tight, consistent radius scale. Corners are softened, never large or
56
+ // pill-like (except `full`, reserved for badges/avatars) — restraint reads as
57
+ // modern and professional.
58
+ export const radius = {
59
+ none: '0px',
60
+ sm: '0.25rem', // 4px — inner elements, checkboxes
61
+ md: '0.375rem', // 6px — the default: buttons, inputs, menu items
62
+ lg: '0.5rem', // 8px — surfaces: cards, menus, dialogs
63
+ xl: '0.75rem', // 12px — large surfaces only
64
+ full: '9999px',
65
+ };
66
+ export const borderWidth = {
67
+ none: '0px',
68
+ thin: '1px',
69
+ thick: '2px',
70
+ };
71
+ // Minimal, neutral shadows — used only to convey elevation, never as decoration.
72
+ // A near-black cool ink at low opacity; structure comes from spacing and borders,
73
+ // so even `xl` stays restrained.
74
+ export const shadow = {
75
+ sm: '0 1px 2px rgba(17, 24, 39, 0.06)',
76
+ md: '0 2px 4px -1px rgba(17, 24, 39, 0.06), 0 4px 8px -2px rgba(17, 24, 39, 0.05)',
77
+ lg: '0 4px 8px -2px rgba(17, 24, 39, 0.06), 0 12px 20px -6px rgba(17, 24, 39, 0.10)',
78
+ xl: '0 8px 16px -4px rgba(17, 24, 39, 0.08), 0 20px 32px -12px rgba(17, 24, 39, 0.14)',
79
+ };
80
+ export const duration = {
81
+ instant: '0ms',
82
+ fast: '150ms',
83
+ normal: '200ms',
84
+ slow: '300ms',
85
+ };
86
+ export const easing = {
87
+ standard: 'cubic-bezier(0.2, 0, 0, 1)',
88
+ emphasized: 'cubic-bezier(0.3, 0, 0, 1)',
89
+ linear: 'linear',
90
+ };
91
+ export const opacity = {
92
+ 0: '0',
93
+ 25: '0.25',
94
+ 50: '0.5',
95
+ 75: '0.75',
96
+ 100: '1',
97
+ disabled: '0.5',
98
+ };
99
+ export const blur = {
100
+ sm: '4px',
101
+ md: '8px',
102
+ lg: '16px',
103
+ };
104
+ export const zIndex = {
105
+ hide: '-1',
106
+ base: '0',
107
+ dropdown: '1000',
108
+ sticky: '1100',
109
+ overlay: '1200',
110
+ modal: '1300',
111
+ popover: '1400',
112
+ toast: '1500',
113
+ tooltip: '1600',
114
+ max: '2147483647',
115
+ };
116
+ export const elevation = {
117
+ 1: 'var(--flx-ui-shadow-sm)',
118
+ 2: 'var(--flx-ui-shadow-md)',
119
+ 3: 'var(--flx-ui-shadow-lg)',
120
+ 4: 'var(--flx-ui-shadow-xl)',
121
+ };
122
+ export const breakpoint = {
123
+ sm: '640px',
124
+ md: '768px',
125
+ lg: '1024px',
126
+ xl: '1280px',
127
+ '2xl': '1536px',
128
+ };
129
+ export const staticTokens = {
130
+ space: { prefix: 'space', values: space },
131
+ size: { prefix: 'size', values: size },
132
+ fontFamily: { prefix: 'font-family', values: fontFamily },
133
+ fontSize: { prefix: 'font-size', values: fontSize },
134
+ fontWeight: { prefix: 'font-weight', values: fontWeight },
135
+ lineHeight: { prefix: 'line-height', values: lineHeight },
136
+ letterSpacing: { prefix: 'letter-spacing', values: letterSpacing },
137
+ radius: { prefix: 'radius', values: radius },
138
+ borderWidth: { prefix: 'border-width', values: borderWidth },
139
+ shadow: { prefix: 'shadow', values: shadow },
140
+ duration: { prefix: 'duration', values: duration },
141
+ easing: { prefix: 'ease', values: easing },
142
+ opacity: { prefix: 'opacity', values: opacity },
143
+ blur: { prefix: 'blur', values: blur },
144
+ zIndex: { prefix: 'z', values: zIndex },
145
+ elevation: { prefix: 'elevation', values: elevation },
146
+ breakpoint: { prefix: 'breakpoint', values: breakpoint },
147
+ };
@@ -0,0 +1,32 @@
1
+ import { type Accessor } from '@fluixi/reactive/signal';
2
+ import type { ThemeName } from '../reference/colors.js';
3
+ export type ThemePreference = ThemeName | 'system';
4
+ export declare const TOKENS_STYLE_ID = "fluixi-tokens";
5
+ export declare function setTheme(theme: ThemeName, target?: HTMLElement | undefined): void;
6
+ export declare function clearTheme(target?: HTMLElement | undefined): void;
7
+ export declare function getTheme(target?: HTMLElement | undefined): ThemeName | undefined;
8
+ export declare function getSystemTheme(): 'light' | 'dark';
9
+ export declare function prefersHighContrast(): boolean;
10
+ export declare function prefersReducedMotion(): boolean;
11
+ export declare function resolveTheme(preference: ThemePreference): ThemeName;
12
+ /** Inject the token stylesheet into the document head once (idempotent). */
13
+ export declare function injectTokens(target?: Document): HTMLStyleElement;
14
+ export interface ThemeControllerOptions {
15
+ defaultPreference?: ThemePreference;
16
+ storageKey?: string | null;
17
+ target?: HTMLElement;
18
+ }
19
+ export interface ThemeController {
20
+ preference: Accessor<ThemePreference>;
21
+ theme: Accessor<ThemeName>;
22
+ setPreference: (preference: ThemePreference) => void;
23
+ toggle: () => void;
24
+ }
25
+ /**
26
+ * Reactive theme controller. Resolves the active theme from a preference
27
+ * (`light` / `dark` / `high-contrast` / `system`), applies it to the target via
28
+ * `data-theme`, persists the preference, and follows system changes while the
29
+ * preference is `system`.
30
+ */
31
+ export declare function createThemeController(options?: ThemeControllerOptions): ThemeController;
32
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/theme/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAyC,KAAK,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAG/F,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAExD,MAAM,MAAM,eAAe,GAAG,SAAS,GAAG,QAAQ,CAAC;AAEnD,eAAO,MAAM,eAAe,kBAAkB,CAAC;AAW/C,wBAAgB,QAAQ,CAAC,KAAK,EAAE,SAAS,EAAE,MAAM,GAAE,WAAW,GAAG,SAAkB,GAAG,IAAI,CAEzF;AAED,wBAAgB,UAAU,CAAC,MAAM,GAAE,WAAW,GAAG,SAAkB,GAAG,IAAI,CAEzE;AAED,wBAAgB,QAAQ,CAAC,MAAM,GAAE,WAAW,GAAG,SAAkB,GAAG,SAAS,GAAG,SAAS,CAExF;AAED,wBAAgB,cAAc,IAAI,OAAO,GAAG,MAAM,CAEjD;AAED,wBAAgB,mBAAmB,IAAI,OAAO,CAE7C;AAED,wBAAgB,oBAAoB,IAAI,OAAO,CAE9C;AAED,wBAAgB,YAAY,CAAC,UAAU,EAAE,eAAe,GAAG,SAAS,CAInE;AAED,4EAA4E;AAC5E,wBAAgB,YAAY,CAAC,MAAM,GAAE,QAAmB,GAAG,gBAAgB,CAQ1E;AAED,MAAM,WAAW,sBAAsB;IACrC,iBAAiB,CAAC,EAAE,eAAe,CAAC;IACpC,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,QAAQ,CAAC,eAAe,CAAC,CAAC;IACtC,KAAK,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAC;IAC3B,aAAa,EAAE,CAAC,UAAU,EAAE,eAAe,KAAK,IAAI,CAAC;IACrD,MAAM,EAAE,MAAM,IAAI,CAAC;CACpB;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,GAAE,sBAA2B,GAAG,eAAe,CAsC3F"}