@frame-kit/tokens 0.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.
@@ -0,0 +1,1123 @@
1
+ /* ==========================================================================
2
+ Design Tokens — libs/ui-shared
3
+ Components must ONLY consume --fk-* tokens.
4
+ Themes/adapters override these.
5
+
6
+ Order: ITCSS + Atomic Design
7
+ 1. Primitives (colors, typography, spacing, radius, focus)
8
+ 2. Semantic (color assignments, type scale, rhythm)
9
+ 3. Atoms (text, link, icon, badge, loader, headline, image)
10
+ 4. Molecules (button, icon-badge)
11
+ 5. Organisms (nav-bar, cards, etc.)
12
+ 6. Keyframes / animations
13
+ ========================================================================== */
14
+
15
+ :root {
16
+ /* ==========================================================================
17
+ 1. PRIMITIVES — raw values, no component awareness
18
+ ========================================================================== */
19
+
20
+ /* ---------- Color palette (neutral default — slate + restrained blue) ---------- */
21
+ --fk-color-primary: #2563eb;
22
+ --fk-color-primary-hover: #1d4ed8;
23
+ --fk-color-primary-active: #1e40af;
24
+ --fk-color-primary-light: #eff6ff;
25
+ --fk-color-primary-light-border: #bfdbfe;
26
+ --fk-color-primary-light-gradient: #dbeafe;
27
+ --fk-color-primary-subtle: #eff6ff;
28
+
29
+ --fk-color-accent-gradient: #dbeafe;
30
+
31
+ --fk-color-ghost-white: #fdfdfd;
32
+
33
+ --fk-color-surface: #ffffff;
34
+ --fk-color-surface-muted: #f8fafc;
35
+ --fk-color-surface-dim: #f1f5f9;
36
+ --fk-color-surface-dimmer: #e2e8f0;
37
+ --fk-color-surface-hover: #f8fafc;
38
+ --fk-color-surface-raised: #ffffff;
39
+ --fk-color-surface-overlay: rgba(15, 23, 42, 0.5);
40
+
41
+ --fk-color-text: #1e293b;
42
+ --fk-color-text-strong: #0f172a;
43
+ --fk-color-text-muted: #64748b;
44
+ --fk-color-text-disabled: #94a3b8;
45
+ --fk-color-muted: #64748b;
46
+ --fk-color-muted-bg: #f1f5f9;
47
+ --fk-color-border: #e2e8f0;
48
+ --fk-color-border-light: #f1f5f9;
49
+
50
+ --fk-color-success: #16a34a;
51
+ --fk-color-success-subtle: #f0fdf4;
52
+ --fk-color-warning: #d97706;
53
+ --fk-color-warning-subtle: #fffbeb;
54
+ --fk-color-danger: #dc2626;
55
+ --fk-color-danger-light: #fee2e2;
56
+ --fk-color-danger-light-border: #fecaca;
57
+ --fk-color-danger-subtle: #fef2f2;
58
+ --fk-color-danger-surface: #fee2e2;
59
+
60
+ --fk-white: #fff;
61
+
62
+ /* ---------- Utility ---------- */
63
+ --fk-black-50: rgba(0, 0, 0, 0.5);
64
+
65
+ /* ---------- Typography primitives ---------- */
66
+ --fk-font-family-base:
67
+ 'Inter', ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto,
68
+ Helvetica, Arial, 'Apple Color Emoji', 'Segoe UI Emoji';
69
+ --fk-font-family-mono:
70
+ ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono',
71
+ 'Courier New', monospace;
72
+ --fk-font-weight-normal: 400;
73
+ --fk-font-weight-medium: 500;
74
+ --fk-font-weight-semibold: 600;
75
+ --fk-font-weight-bold: 700;
76
+
77
+ --fk-font-size-body: 0.875rem;
78
+ --fk-line-height-body: 1.5;
79
+
80
+ /* font-size scale (consumed by components) */
81
+ --fk-font-size-xs: 0.75rem;
82
+ --fk-font-size-sm: 0.875rem;
83
+ --fk-font-size-md: 1rem;
84
+ --fk-font-size-lg: 1.125rem;
85
+ --fk-font-size-xl: 1.25rem;
86
+
87
+ /* ---------- Spacing scale ---------- */
88
+ --fk-space-2: 8px;
89
+ --fk-space-3: 12px;
90
+
91
+ /* ---------- Radius scale ---------- */
92
+ --fk-radius-none: 0;
93
+ --fk-radius-sm: 0.25rem;
94
+ --fk-radius-md: 0.375rem;
95
+ --fk-radius-lg: 0.75rem;
96
+ --fk-radius-full: 9999px;
97
+
98
+ /* ---------- Overlays ---------- */
99
+ --fk-overlay-brand: rgba(37, 99, 235, 0.18);
100
+
101
+ /* ---------- Shadows ---------- */
102
+
103
+ /* ---------- Focus ---------- */
104
+ --fk-focus-ring: 0 0 0 3px rgba(37, 99, 235, 0.18);
105
+
106
+ /* ==========================================================================
107
+ 2. SEMANTIC — meaningful assignments using primitives
108
+ ========================================================================== */
109
+
110
+ /* ---------- Typography scale ---------- */
111
+
112
+ /* Subtitle — alias for lead, used by landing page */
113
+ --fk-typography-subtitle-font-size: var(--fk-typography-lead-font-size);
114
+
115
+ /* Headline scale (mobile-first — tablet/desktop overrides below) */
116
+ --fk-typography-heading-font-size: 1.5rem;
117
+
118
+ --fk-typography-h1-font-size: 2.25rem;
119
+ --fk-typography-h1-line-height: 1.05;
120
+ --fk-typography-h1-font-weight: var(--fk-font-weight-bold);
121
+ --fk-typography-h1-letter-spacing: -0.02em;
122
+
123
+ --fk-typography-h2-font-size: 1.75rem;
124
+ --fk-typography-h2-line-height: 1.1;
125
+ --fk-typography-h2-font-weight: var(--fk-font-weight-bold);
126
+ --fk-typography-h2-letter-spacing: -0.01em;
127
+
128
+ --fk-typography-h3-font-size: 1.375rem;
129
+ --fk-typography-h3-line-height: 1.2;
130
+ --fk-typography-h3-font-weight: var(--fk-font-weight-semibold);
131
+ --fk-typography-h3-letter-spacing: 0em;
132
+
133
+ --fk-typography-h4-font-size: 1.125rem;
134
+ --fk-typography-h4-line-height: 1.25;
135
+ --fk-typography-h4-font-weight: var(--fk-font-weight-semibold);
136
+ --fk-typography-h4-letter-spacing: 0em;
137
+
138
+ --fk-typography-h5-font-size: 0.9375rem;
139
+ --fk-typography-h5-line-height: 1.3;
140
+ --fk-typography-h5-font-weight: var(--fk-font-weight-semibold);
141
+ --fk-typography-h5-letter-spacing: 0.01em;
142
+
143
+ --fk-typography-h6-font-size: 0.8125rem;
144
+ --fk-typography-h6-line-height: 1.4;
145
+ --fk-typography-h6-font-weight: var(--fk-font-weight-semibold);
146
+ --fk-typography-h6-letter-spacing: 0.02em;
147
+
148
+ /* Body / text scale */
149
+ --fk-typography-body-font-size: 0.9375rem;
150
+ --fk-typography-body-font-weight: var(--fk-font-weight-normal);
151
+ --fk-typography-body-line-height: 1.5;
152
+ --fk-typography-body-letter-spacing: 0.01em;
153
+
154
+ --fk-typography-lead-font-size: 1rem;
155
+ --fk-typography-lead-font-weight: var(--fk-font-weight-normal);
156
+ --fk-typography-lead-line-height: 1.4;
157
+ --fk-typography-lead-letter-spacing: 0em;
158
+
159
+ --fk-typography-small-font-size: 0.8125rem;
160
+ --fk-typography-small-font-weight: var(--fk-font-weight-normal);
161
+ --fk-typography-small-line-height: 1.4;
162
+ --fk-typography-small-letter-spacing: 0.01em;
163
+
164
+ --fk-typography-caption-font-size: 0.6875rem;
165
+ --fk-typography-caption-font-weight: var(--fk-font-weight-medium);
166
+ --fk-typography-caption-line-height: 1.3;
167
+ --fk-typography-caption-letter-spacing: 0.02em;
168
+
169
+ --fk-typography-label-font-size: 0.8125rem;
170
+ --fk-typography-label-font-weight: var(--fk-font-weight-semibold);
171
+ --fk-typography-label-line-height: 1.25;
172
+ --fk-typography-label-letter-spacing: 0.01em;
173
+
174
+ --fk-typography-code-font-family:
175
+ ui-monospace, 'SFMono-Regular', 'SF Mono', Menlo, Consolas,
176
+ 'Liberation Mono', monospace;
177
+ --fk-typography-code-font-size: 0.8125rem;
178
+ --fk-typography-code-font-weight: var(--fk-font-weight-normal);
179
+ --fk-typography-code-line-height: 1.45;
180
+ --fk-typography-code-letter-spacing: 0em;
181
+
182
+ --fk-typography-large-font-size: 1.125rem;
183
+
184
+ --fk-typography-button-font-size: 1rem;
185
+ --fk-typography-button-font-weight: var(--fk-font-weight-normal);
186
+ --fk-typography-button-line-height: 1.5;
187
+
188
+ --fk-typography-gutter-bottom: 1rem;
189
+
190
+ /* Vertical rhythm */
191
+ --fk-rhythm-1: 0.25rem;
192
+ --fk-rhythm-2: 0.5rem;
193
+ --fk-rhythm-3: 0.75rem;
194
+ --fk-rhythm-4: 1rem;
195
+ --fk-rhythm-5: 1.25rem;
196
+ --fk-rhythm-6: 1.5rem;
197
+ --fk-rhythm-7: 1.75rem;
198
+ --fk-rhythm-8: 2rem;
199
+ --fk-rhythm-10: 2.5rem;
200
+ --fk-rhythm-12: 3rem;
201
+ --fk-rhythm-14: 3.5rem;
202
+ --fk-rhythm-16: 4rem;
203
+
204
+ /* ==========================================================================
205
+ 3. ATOMS — smallest standalone components
206
+ ========================================================================== */
207
+
208
+ /* ---------- Text ---------- */
209
+ --fk-text-color-default: var(--fk-color-text);
210
+ --fk-text-color-muted: var(--fk-color-muted);
211
+ --fk-text-color-subtle: #9ca3af;
212
+ --fk-text-color-danger: var(--fk-color-danger);
213
+ --fk-text-color-success: var(--fk-color-success);
214
+ --fk-text-margin-block-start: var(--fk-rhythm-4);
215
+ --fk-text-margin-block-end: 0;
216
+
217
+ /* ---------- Link ---------- */
218
+ --fk-link-color-default: var(--fk-color-text);
219
+ --fk-link-color-default-hover: var(--fk-color-primary);
220
+ --fk-link-color-muted: var(--fk-color-muted);
221
+ --fk-link-color-muted-hover: var(--fk-color-text);
222
+ --fk-link-color-primary: var(--fk-color-primary);
223
+ --fk-link-color-primary-hover: var(--fk-color-primary-hover);
224
+ --fk-link-color-primary-active: var(--fk-color-primary-active);
225
+ --fk-link-color-danger: var(--fk-color-danger);
226
+ --fk-link-color-danger-hover: #b91c1c;
227
+ --fk-link-color-disabled: #9ca3af;
228
+
229
+ /* Link sizes */
230
+ --fk-link-font-size-small: var(--fk-typography-small-font-size);
231
+ --fk-link-font-size-medium: var(--fk-typography-body-font-size);
232
+ --fk-link-font-size-large: var(--fk-typography-large-font-size);
233
+ --fk-link-line-height-small: 1.5;
234
+ --fk-link-line-height-medium: 1.5;
235
+ --fk-link-line-height-large: 1.5;
236
+ --fk-link-opacity-disabled: 0.6;
237
+ --fk-link-opacity-loading: 0.7;
238
+ --fk-link-focus-radius: 2px;
239
+
240
+ /* ---------- Icon ---------- */
241
+ --fk-icon-size-xs: 0.75rem;
242
+ --fk-icon-size-sm: 1rem;
243
+ --fk-icon-size-md: 1.25rem;
244
+ --fk-icon-size-lg: 1.5rem;
245
+ --fk-icon-size-xl: 2rem;
246
+
247
+ --fk-icon-color-default: var(--fk-color-text);
248
+ --fk-icon-color-muted: var(--fk-color-muted);
249
+ --fk-icon-color-primary: var(--fk-color-primary);
250
+ --fk-icon-color-danger: var(--fk-color-danger);
251
+ --fk-icon-color-success: var(--fk-color-success);
252
+
253
+ /* ---------- Card ---------- */
254
+ --fk-card-bg: var(--fk-color-surface);
255
+ --fk-card-border-color: var(--fk-color-border);
256
+ --fk-card-border-radius: var(--fk-radius-lg);
257
+ --fk-card-padding-sm: var(--fk-rhythm-4);
258
+ --fk-card-padding-md: var(--fk-rhythm-6);
259
+ --fk-card-padding-lg: var(--fk-rhythm-8);
260
+
261
+ /* ---------- Badge ---------- */
262
+ --fk-badge-height: 1.5rem;
263
+ --fk-badge-border-radius: 999px;
264
+ --fk-badge-padding-inline: 0.5rem;
265
+ --fk-badge-font-size: 0.75rem;
266
+ --fk-badge-font-weight: var(--fk-font-weight-medium);
267
+
268
+ --fk-badge-default-bg: #f3f4f6;
269
+ --fk-badge-default-color: #374151;
270
+ --fk-badge-primary-bg: var(--fk-color-primary-light, #dbeafe);
271
+ --fk-badge-primary-color: var(--fk-color-primary-active, #1e40af);
272
+ --fk-badge-success-bg: #dcfce7;
273
+ --fk-badge-success-color: #15803d;
274
+ --fk-badge-warning-bg: #fef3c7;
275
+ --fk-badge-warning-color: #92400e;
276
+ --fk-badge-danger-bg: #fee2e2;
277
+ --fk-badge-danger-color: #991b1b;
278
+
279
+ /* ---------- Toast ---------- */
280
+ --fk-toast-bg: var(--fk-color-surface);
281
+ --fk-toast-border-color: var(--fk-color-border);
282
+ --fk-toast-border-radius: var(--fk-radius-lg);
283
+ --fk-toast-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
284
+ --fk-toast-padding: var(--fk-rhythm-4);
285
+ --fk-toast-gap: var(--fk-rhythm-3);
286
+ --fk-toast-icon-size: 1.25rem;
287
+ --fk-toast-summary-font-size: var(--fk-typography-body-font-size);
288
+ --fk-toast-summary-font-weight: var(--fk-font-weight-semibold);
289
+ --fk-toast-summary-color: var(--fk-color-text);
290
+ --fk-toast-detail-font-size: var(--fk-typography-small-font-size);
291
+ --fk-toast-detail-color: var(--fk-color-muted);
292
+ --fk-toast-success-accent: var(--fk-color-success);
293
+ --fk-toast-success-color: var(--fk-color-success);
294
+ --fk-toast-error-accent: var(--fk-color-danger);
295
+ --fk-toast-error-color: var(--fk-color-danger);
296
+ --fk-toast-warning-accent: var(--fk-color-warning);
297
+ --fk-toast-warning-color: var(--fk-color-warning);
298
+ --fk-toast-info-accent: var(--fk-color-primary);
299
+ --fk-toast-info-color: var(--fk-color-primary);
300
+ --fk-toast-dismiss-color: var(--fk-color-muted);
301
+ --fk-toast-dismiss-hover-color: var(--fk-color-text);
302
+ --fk-toast-container-z-index: 9500;
303
+ --fk-toast-container-gap: var(--fk-rhythm-3);
304
+ --fk-toast-container-padding: var(--fk-rhythm-4);
305
+ --fk-toast-container-max-width: 24rem;
306
+
307
+ /* ---------- Loader ---------- */
308
+ --fk-loader-size-xs: 0.75rem;
309
+ --fk-loader-size-sm: 1rem;
310
+ --fk-loader-size-md: 1.25rem;
311
+ --fk-loader-size-lg: 1.5rem;
312
+ --fk-loader-size-xl: 2rem;
313
+ --fk-loader-animation-duration: 0.8s;
314
+
315
+ /* ---------- Headline ---------- */
316
+ --fk-headline-color-default: var(--fk-color-text);
317
+ --fk-headline-color-muted: var(--fk-color-muted);
318
+ --fk-headline-margin-block-start: var(--fk-rhythm-4);
319
+ --fk-headline-margin-block-end: 0;
320
+
321
+ /* ---------- Progress Bar ---------- */
322
+ --fk-progress-bar-height-sm: var(--fk-rhythm-1);
323
+ --fk-progress-bar-height-md: var(--fk-rhythm-2);
324
+ --fk-progress-bar-height-lg: var(--fk-rhythm-3);
325
+ --fk-progress-bar-radius: var(--fk-radius-full);
326
+ --fk-progress-bar-bg: var(--fk-color-surface-muted);
327
+ --fk-progress-bar-fill: var(--fk-color-primary);
328
+ --fk-progress-bar-fill-success: var(--fk-color-success);
329
+ --fk-progress-bar-fill-warning: var(--fk-color-warning);
330
+ --fk-progress-bar-fill-danger: var(--fk-color-danger);
331
+ --fk-progress-bar-label-color: var(--fk-color-text);
332
+
333
+ /* ---------- Segmented Bar ---------- */
334
+ --fk-segmented-bar-height-sm: var(--fk-rhythm-1);
335
+ --fk-segmented-bar-height-md: var(--fk-rhythm-2);
336
+ --fk-segmented-bar-height-lg: var(--fk-rhythm-3);
337
+ --fk-segmented-bar-radius: var(--fk-radius-full);
338
+ --fk-segmented-bar-bg: var(--fk-color-surface-muted);
339
+
340
+ /* ---------- Timeline ---------- */
341
+ --fk-timeline-marker-size-sm: 1rem;
342
+ --fk-timeline-marker-size-md: 1.5rem;
343
+ --fk-timeline-marker-size-lg: 2rem;
344
+ --fk-timeline-marker-bg: var(--fk-color-surface);
345
+ --fk-timeline-marker-border-color: var(--fk-color-border);
346
+ --fk-timeline-marker-active: var(--fk-color-primary);
347
+ --fk-timeline-marker-completed: var(--fk-color-success);
348
+ --fk-timeline-marker-error: var(--fk-color-danger);
349
+ --fk-timeline-marker-warning: var(--fk-color-warning);
350
+ --fk-timeline-connector-color: var(--fk-color-border);
351
+ --fk-timeline-title-color: var(--fk-color-text);
352
+ --fk-timeline-description-color: var(--fk-color-muted);
353
+
354
+ /* ---------- Separator ---------- */
355
+ --fk-separator-color: var(--fk-color-border);
356
+ --fk-separator-margin-top: var(--fk-rhythm-6);
357
+ --fk-separator-margin-bottom: 0;
358
+ --fk-separator-border-width: 1px;
359
+
360
+ /* ---------- Tooltip ---------- */
361
+ --fk-tooltip-bg: var(--fk-color-surface);
362
+ --fk-tooltip-color: var(--fk-color-text);
363
+ --fk-tooltip-font-family: var(--fk-font-family-base);
364
+ --fk-tooltip-font-size: var(--fk-typography-caption-font-size);
365
+ --fk-tooltip-font-weight: var(--fk-font-weight-medium);
366
+ --fk-tooltip-line-height: var(--fk-typography-caption-line-height);
367
+ --fk-tooltip-padding: var(--fk-rhythm-1) var(--fk-rhythm-2);
368
+ --fk-tooltip-border-radius: var(--fk-radius-sm);
369
+ --fk-tooltip-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);
370
+ --fk-tooltip-arrow-size: 6px;
371
+ --fk-tooltip-max-width: 20rem;
372
+ --fk-tooltip-enter-duration: 0.15s;
373
+ --fk-tooltip-exit-duration: 0.1s;
374
+ --fk-tooltip-easing: ease-out;
375
+
376
+ /* ---------- Nav Separator ---------- */
377
+ --fk-nav-separator-color: var(--fk-color-border);
378
+
379
+ /* ---------- Image ---------- */
380
+ --fk-image-object-fit: cover;
381
+ --fk-image-object-position: center;
382
+
383
+ /* ==========================================================================
384
+ 4. MOLECULES — composed from atoms
385
+ ========================================================================== */
386
+
387
+ /* ---------- Button ---------- */
388
+ --fk-button-font-weight: var(--fk-typography-button-font-weight);
389
+ --fk-button-line-height: var(--fk-typography-button-line-height);
390
+ --fk-button-border-radius: 0.5rem;
391
+ --fk-button-border-width: 1px;
392
+ --fk-button-cursor: pointer;
393
+ --fk-button-cursor-disabled: not-allowed;
394
+ --fk-button-opacity-disabled: 0.6;
395
+ --fk-button-transition:
396
+ background-color 0.15s ease, border-color 0.15s ease, color 0.15s ease;
397
+
398
+ /* Button icon */
399
+ --fk-button-icon-gap: 0.5rem;
400
+
401
+ /* Button sizes */
402
+ --fk-button-padding-sm: 0.375rem 0.75rem;
403
+ --fk-button-padding-md: 0.5rem 1rem;
404
+ --fk-button-padding-lg: 0.625rem 1.25rem;
405
+ --fk-button-font-size-sm: 0.875rem;
406
+ --fk-button-font-size-md: 1rem;
407
+ --fk-button-font-size-lg: 1.125rem;
408
+
409
+ /* Button variant: primary */
410
+ --fk-button-primary-bg: var(--fk-color-primary);
411
+ --fk-button-primary-bg-hover: var(--fk-color-primary-hover);
412
+ --fk-button-primary-bg-active: var(--fk-color-primary-active);
413
+ --fk-button-primary-color: var(--fk-color-surface);
414
+ --fk-button-primary-border-color: transparent;
415
+
416
+ /* Button variant: secondary */
417
+ --fk-button-secondary-bg: transparent;
418
+ --fk-button-secondary-bg-hover: var(--fk-color-surface-muted);
419
+ --fk-button-secondary-bg-active: var(--fk-color-border);
420
+ --fk-button-secondary-color: var(--fk-color-primary);
421
+ --fk-button-secondary-border-color: var(--fk-color-border);
422
+
423
+ /* Button variant: outline (matches secondary per spec) */
424
+ --fk-button-outline-bg: transparent;
425
+ --fk-button-outline-bg-hover: var(--fk-color-surface-muted);
426
+ --fk-button-outline-bg-active: var(--fk-color-border);
427
+ --fk-button-outline-color: var(--fk-color-primary);
428
+ --fk-button-outline-border-color: var(--fk-color-border);
429
+
430
+ /* Button variant: danger */
431
+ --fk-button-danger-bg: var(--fk-color-danger);
432
+ --fk-button-danger-bg-hover: #b91c1c;
433
+ --fk-button-danger-bg-active: #991b1b;
434
+ --fk-button-danger-color: var(--fk-color-surface);
435
+ --fk-button-danger-border-color: transparent;
436
+
437
+ /* ---------- Callout ---------- */
438
+ --fk-callout-bg: var(--fk-color-surface-muted);
439
+ --fk-callout-border-color: var(--fk-color-border);
440
+ --fk-callout-padding: var(--fk-rhythm-4);
441
+ --fk-callout-border-radius: var(--fk-radius-md);
442
+ --fk-callout-font-size: var(--fk-typography-small-font-size);
443
+ --fk-callout-title-font-size: inherit;
444
+ --fk-callout-title-gap: var(--fk-rhythm-2);
445
+
446
+ /* ---------- Note ---------- */
447
+ --fk-note-border-width: 3px;
448
+ --fk-note-padding-block: var(--fk-rhythm-2);
449
+ --fk-note-padding-inline-start: var(--fk-rhythm-4);
450
+ --fk-note-color: var(--fk-color-muted);
451
+ --fk-note-font-size: 0.9375rem;
452
+ --fk-note-line-height: var(--fk-typography-body-line-height);
453
+ --fk-note-info-accent: var(--fk-color-primary);
454
+ --fk-note-success-accent: var(--fk-color-success);
455
+ --fk-note-warning-accent: var(--fk-color-warning);
456
+ --fk-note-danger-accent: var(--fk-color-danger);
457
+
458
+ /* ---------- Icon List ---------- */
459
+ --fk-icon-list-row-gap: var(--fk-rhythm-3);
460
+
461
+ /* ---------- Icon List Item ---------- */
462
+ --fk-icon-list-item-gap: var(--fk-rhythm-2);
463
+ --fk-icon-list-item-label-color: var(--fk-color-text);
464
+ --fk-icon-list-item-line-height: var(--fk-typography-body-line-height);
465
+ --fk-icon-list-item-sm-font-size: var(--fk-typography-small-font-size);
466
+ --fk-icon-list-item-md-font-size: 0.875rem;
467
+ --fk-icon-list-item-lg-font-size: var(--fk-typography-lead-font-size);
468
+ --fk-icon-list-item-default-color: var(--fk-color-muted);
469
+ --fk-icon-list-item-primary-color: var(--fk-color-primary);
470
+ --fk-icon-list-item-success-color: var(--fk-color-success);
471
+ --fk-icon-list-item-warning-color: var(--fk-color-warning);
472
+ --fk-icon-list-item-danger-color: var(--fk-color-danger);
473
+
474
+ /* ---------- Numbered List ---------- */
475
+ --fk-numbered-list-margin-top: var(--fk-rhythm-4);
476
+ --fk-numbered-list-row-gap: var(--fk-rhythm-3);
477
+
478
+ /* ---------- Numbered List Item ---------- */
479
+ --fk-numbered-list-item-gap: var(--fk-rhythm-3);
480
+ --fk-numbered-list-item-color: var(--fk-color-text);
481
+ --fk-numbered-list-item-line-height: var(--fk-typography-body-line-height);
482
+ --fk-numbered-list-item-sm-font-size: var(--fk-typography-small-font-size);
483
+ --fk-numbered-list-item-md-font-size: 0.875rem;
484
+ --fk-numbered-list-item-lg-font-size: var(--fk-typography-lead-font-size);
485
+ --fk-numbered-list-badge-size: 1.5rem;
486
+ --fk-numbered-list-badge-radius: 50%;
487
+ --fk-numbered-list-badge-bg: var(--fk-color-primary-light);
488
+ --fk-numbered-list-badge-color: var(--fk-color-primary);
489
+ --fk-numbered-list-badge-font-size: 0.75rem;
490
+ --fk-numbered-list-badge-font-weight: var(--fk-font-weight-semibold);
491
+
492
+ /* ---------- Themed Card ---------- */
493
+ --lib-themed-card-radius: var(--fk-radius-lg);
494
+ --lib-themed-card-padding: var(--fk-rhythm-5);
495
+ --lib-themed-card-header-gap: var(--fk-rhythm-3);
496
+ --lib-themed-card-body-gap: var(--fk-rhythm-3);
497
+
498
+ /* ---------- Numbered Title ---------- */
499
+ --lib-numbered-title-gap: var(--fk-rhythm-3);
500
+ --lib-numbered-title-sm-circle-size: 1.5rem;
501
+ --lib-numbered-title-md-circle-size: 2rem;
502
+ --lib-numbered-title-lg-circle-size: 2.5rem;
503
+ --lib-numbered-title-sm-font-size: var(--fk-typography-caption-font-size);
504
+ --lib-numbered-title-md-font-size: var(--fk-typography-small-font-size);
505
+ --lib-numbered-title-lg-font-size: var(--fk-typography-body-font-size);
506
+ --lib-numbered-title-default-bg: var(--fk-color-surface-muted);
507
+ --lib-numbered-title-default-color: var(--fk-color-text);
508
+ --lib-numbered-title-primary-bg: var(--fk-color-primary);
509
+ --lib-numbered-title-primary-color: var(--fk-color-surface);
510
+ --lib-numbered-title-success-bg: var(--fk-color-success);
511
+ --lib-numbered-title-success-color: var(--fk-color-surface);
512
+ --lib-numbered-title-warning-bg: var(--fk-color-warning);
513
+ --lib-numbered-title-warning-color: var(--fk-color-surface);
514
+ --lib-numbered-title-danger-bg: var(--fk-color-danger);
515
+ --lib-numbered-title-danger-color: var(--fk-color-surface);
516
+
517
+ /* ---------- Copyable Field ---------- */
518
+ --fk-copyable-field-gap: var(--fk-rhythm-2);
519
+ --fk-copyable-field-bg: var(--fk-color-surface-muted);
520
+ --fk-copyable-field-border-color: var(--fk-color-border);
521
+ --fk-copyable-field-radius: var(--fk-radius-md);
522
+ --fk-copyable-field-value-color: var(--fk-color-text);
523
+
524
+ --fk-copyable-field-label-color: var(--fk-color-muted);
525
+ --fk-copyable-field-label-font-size: var(--fk-typography-small-font-size);
526
+ --fk-copyable-field-label-font-weight: var(--fk-font-weight-medium);
527
+ --fk-copyable-field-label-gap: var(--fk-rhythm-1);
528
+
529
+ --fk-copyable-field-action-color: var(--fk-color-muted);
530
+ --fk-copyable-field-action-color-hover: var(--fk-color-text);
531
+ --fk-copyable-field-action-bg-hover: var(--fk-color-surface-dim);
532
+ --fk-copyable-field-action-padding: var(--fk-rhythm-1);
533
+ --fk-copyable-field-action-radius: var(--fk-radius-sm);
534
+
535
+ --fk-copyable-field-padding-sm: var(--fk-rhythm-1) var(--fk-rhythm-2);
536
+ --fk-copyable-field-padding-md: var(--fk-rhythm-2) var(--fk-rhythm-3);
537
+ --fk-copyable-field-padding-lg: var(--fk-rhythm-3) var(--fk-rhythm-4);
538
+
539
+ --fk-copyable-field-font-size-sm: var(--fk-typography-caption-font-size);
540
+ --fk-copyable-field-font-size-md: var(--fk-typography-small-font-size);
541
+ --fk-copyable-field-font-size-lg: var(--fk-typography-body-font-size);
542
+
543
+ --fk-copyable-field-mono-font-family: var(--fk-font-family-mono);
544
+
545
+ /* ---------- Alert ---------- */
546
+ --fk-alert-padding: var(--fk-rhythm-4);
547
+ --fk-alert-border-radius: var(--fk-radius-md);
548
+ --fk-alert-font-size: var(--fk-typography-small-font-size);
549
+ --fk-alert-icon-gap: 0.5rem;
550
+
551
+ --fk-alert-info-bg: #e8f4fd;
552
+ --fk-alert-info-border-color: #b6e0fe;
553
+ --fk-alert-info-color: #084298;
554
+
555
+ --fk-alert-success-bg: #e6f4ea;
556
+ --fk-alert-success-border-color: #a3d9a5;
557
+ --fk-alert-success-color: #1e7e34;
558
+
559
+ --fk-alert-warning-bg: #fff4e5;
560
+ --fk-alert-warning-border-color: #ffd8a8;
561
+ --fk-alert-warning-color: #8a5700;
562
+
563
+ --fk-alert-error-bg: #fdecea;
564
+ --fk-alert-error-border-color: #f5c2c7;
565
+ --fk-alert-error-color: #842029;
566
+
567
+ /* ---------- Accordion ---------- */
568
+ --fk-accordion-color: var(--fk-color-text);
569
+ --fk-accordion-border-color: var(--fk-color-border);
570
+ --fk-accordion-border-width: 1px;
571
+ --fk-accordion-radius: var(--fk-radius-md);
572
+ --fk-accordion-header-bg: transparent;
573
+ --fk-accordion-header-bg-hover: var(--fk-color-surface-muted);
574
+ --fk-accordion-header-bg-expanded: var(--fk-color-surface-muted);
575
+ --fk-accordion-header-padding-block: var(--fk-rhythm-3);
576
+ --fk-accordion-header-padding-inline: var(--fk-rhythm-4);
577
+ --fk-accordion-leading-icon-gap: var(--fk-rhythm-3);
578
+ --fk-accordion-trailing-gap: var(--fk-rhythm-3);
579
+ --fk-accordion-title-color: var(--fk-color-text);
580
+ --fk-accordion-title-font-size: var(--fk-typography-body-font-size);
581
+ --fk-accordion-title-font-weight: var(--fk-font-weight-semibold);
582
+ --fk-accordion-description-color: var(--fk-color-muted);
583
+ --fk-accordion-description-font-size: var(--fk-typography-small-font-size);
584
+ --fk-accordion-description-gap: var(--fk-rhythm-1);
585
+ --fk-accordion-leading-text-color: var(--fk-color-muted);
586
+ --fk-accordion-leading-text-font-size: var(--fk-typography-small-font-size);
587
+ --fk-accordion-leading-text-font-weight: var(--fk-font-weight-semibold);
588
+ --fk-accordion-leading-text-gap: var(--fk-rhythm-2);
589
+ --fk-accordion-chevron-color: var(--fk-color-muted);
590
+ --fk-accordion-panel-color: var(--fk-color-text);
591
+ --fk-accordion-panel-gap: var(--fk-rhythm-2);
592
+ --fk-accordion-panel-padding-block: var(--fk-rhythm-3);
593
+ --fk-accordion-panel-padding-inline: var(--fk-rhythm-4);
594
+ --fk-accordion-focus-ring: var(--fk-focus-ring);
595
+ --fk-accordion-sm-header-padding-block: var(--fk-rhythm-2);
596
+ --fk-accordion-sm-header-padding-inline: var(--fk-rhythm-3);
597
+ --fk-accordion-sm-title-font-size: var(--fk-typography-small-font-size);
598
+ --fk-accordion-sm-description-font-size: 0.75rem;
599
+
600
+ --fk-accordion-group-gap: var(--fk-rhythm-3);
601
+
602
+ /* ---------- Icon Badge ---------- */
603
+ --fk-icon-badge-padding-xs: 0.25rem;
604
+ --fk-icon-badge-padding-sm: 0.375rem;
605
+ --fk-icon-badge-padding-md: 0.5rem;
606
+ --fk-icon-badge-padding-lg: 0.625rem;
607
+ --fk-icon-badge-padding-xl: 0.75rem;
608
+
609
+ --fk-icon-badge-border-width: 1px;
610
+ --fk-icon-badge-border-radius: 0.375rem;
611
+
612
+ /* ---------- Nav Brand ---------- */
613
+ --fk-nav-brand-gap: 0.5rem;
614
+ --fk-nav-brand-color: inherit;
615
+ --fk-nav-brand-color-hover: inherit;
616
+ --fk-nav-brand-font-size: 1.125rem;
617
+ --fk-nav-brand-font-weight: var(--fk-font-weight-semibold);
618
+ --fk-nav-brand-line-height: 1;
619
+
620
+ /* ---------- Avatar ---------- */
621
+ --fk-avatar-radius: var(--fk-radius-full);
622
+ --fk-avatar-bg: var(--fk-color-primary);
623
+ --fk-avatar-color: var(--fk-color-surface);
624
+ --fk-avatar-font-family: var(--fk-font-family-base);
625
+ --fk-avatar-font-weight: var(--fk-font-weight-semibold);
626
+ --fk-avatar-size-sm: 1.75rem;
627
+ --fk-avatar-size-md: 2.25rem;
628
+ --fk-avatar-size-lg: 3rem;
629
+ --fk-avatar-font-size-sm: 0.6875rem;
630
+ --fk-avatar-font-size-md: 0.8125rem;
631
+ --fk-avatar-font-size-lg: 1rem;
632
+ --fk-avatar-status-border: var(--fk-color-surface);
633
+ --fk-avatar-status-online: var(--fk-color-success);
634
+ --fk-avatar-status-offline: var(--fk-color-muted);
635
+ --fk-avatar-status-away: var(--fk-color-warning);
636
+ --fk-avatar-status-busy: var(--fk-color-danger);
637
+
638
+ /* ---------- Menu Item ---------- */
639
+ --fk-menu-item-gap: var(--fk-rhythm-2);
640
+ --fk-menu-item-padding: var(--fk-rhythm-2) var(--fk-rhythm-3);
641
+ --fk-menu-item-radius: var(--fk-radius-md);
642
+ --fk-menu-item-font-size: 0.875rem;
643
+ --fk-menu-item-color: var(--fk-color-text);
644
+ --fk-menu-item-bg-hover: var(--fk-color-surface-muted);
645
+ --fk-menu-item-danger-color: var(--fk-color-danger);
646
+ --fk-menu-item-danger-bg-hover: #fef2f2;
647
+ --fk-menu-item-focus-ring: var(--fk-focus-ring);
648
+ --fk-menu-item-opacity-disabled: 0.5;
649
+ --fk-menu-separator-color: var(--fk-color-border);
650
+
651
+ /* ---------- Dropdown Menu ---------- */
652
+ --fk-dropdown-menu-panel-z: 100;
653
+ --fk-dropdown-menu-panel-min-width: 12rem;
654
+ --fk-dropdown-menu-panel-padding: var(--fk-rhythm-1);
655
+ --fk-dropdown-menu-panel-radius: var(--fk-radius-lg);
656
+ --fk-dropdown-menu-panel-bg: var(--fk-color-surface);
657
+ --fk-dropdown-menu-panel-border: var(--fk-color-border);
658
+ --fk-dropdown-menu-panel-shadow:
659
+ 0 4px 16px rgba(0, 0, 0, 0.08), 0 1px 4px rgba(0, 0, 0, 0.04);
660
+
661
+ /* ---------- Editable Field ---------- */
662
+ --fk-editable-field-bg: var(--fk-color-surface);
663
+ --fk-editable-field-border-color: var(--fk-color-border);
664
+ --fk-editable-field-border-radius: var(--fk-radius-md);
665
+ --fk-editable-field-hover-border: var(--fk-color-primary);
666
+ --fk-editable-field-focus-border: var(--fk-color-primary);
667
+ --fk-editable-field-color: var(--fk-color-text);
668
+ --fk-editable-field-empty-color: var(--fk-color-muted);
669
+ --fk-editable-field-font-size: var(--fk-typography-body-font-size);
670
+ --fk-editable-field-sm-font-size: var(--fk-typography-small-font-size);
671
+ --fk-editable-field-lg-font-size: var(--fk-typography-heading-font-size);
672
+ --fk-editable-field-lg-font-weight: var(--fk-font-weight-semibold);
673
+ --fk-editable-field-input-padding: var(--fk-rhythm-1) var(--fk-rhythm-2);
674
+ --fk-editable-field-trailing-padding: var(--fk-rhythm-1);
675
+ --fk-editable-field-gap: var(--fk-rhythm-2);
676
+ --fk-editable-field-trigger-color: var(--fk-color-muted);
677
+ --fk-editable-field-trigger-hover-color: var(--fk-color-primary);
678
+ --fk-editable-field-inline-btn-size: 1.5rem;
679
+ --fk-editable-field-save-bg: var(--fk-color-primary);
680
+ --fk-editable-field-save-color: #ffffff;
681
+ --fk-editable-field-action-font-size: var(--fk-typography-small-font-size);
682
+ --fk-editable-field-disabled-opacity: 0.6;
683
+
684
+ /* ---------- User Menu ---------- */
685
+ --fk-user-menu-trigger-bg: transparent;
686
+ --fk-user-menu-trigger-bg-hover: transparent;
687
+ --fk-user-menu-trigger-radius: var(--fk-radius-md);
688
+ --fk-user-menu-name-color: var(--fk-color-text);
689
+ --fk-user-menu-name-font-weight: var(--fk-font-weight-semibold);
690
+ --fk-user-menu-email-color: var(--fk-color-muted);
691
+ --fk-user-menu-chevron-color: var(--fk-color-muted);
692
+ --fk-user-menu-badge-bg: var(--fk-color-primary);
693
+ --fk-user-menu-badge-color: var(--fk-color-surface);
694
+ --fk-user-menu-panel-bg: var(--fk-color-surface);
695
+ --fk-user-menu-panel-border: var(--fk-color-border);
696
+ --fk-user-menu-panel-radius: var(--fk-radius-lg);
697
+ --fk-user-menu-panel-shadow:
698
+ 0 4px 16px rgba(0, 0, 0, 0.08), 0 1px 4px rgba(0, 0, 0, 0.04);
699
+ --fk-user-menu-item-color: var(--fk-color-text);
700
+ --fk-user-menu-item-bg-hover: var(--fk-color-surface-muted);
701
+ --fk-user-menu-item-radius: var(--fk-radius-md);
702
+ --fk-user-menu-item-danger-color: var(--fk-color-danger);
703
+ --fk-user-menu-separator-color: var(--fk-color-border);
704
+ --fk-user-menu-focus-ring: var(--fk-focus-ring);
705
+
706
+ /* ---------- Sidenav Link ---------- */
707
+ --fk-sidenav-link-gap: var(--fk-rhythm-2);
708
+ --fk-sidenav-link-padding-block: var(--fk-rhythm-2);
709
+ --fk-sidenav-link-padding-inline: var(--fk-rhythm-3);
710
+ --fk-sidenav-link-radius: var(--fk-radius-md);
711
+ --fk-sidenav-link-bg: transparent;
712
+ --fk-sidenav-link-bg-hover: var(--fk-color-surface-dimmer);
713
+ --fk-sidenav-link-bg-active: var(--fk-color-primary);
714
+ --fk-sidenav-link-font-family: var(--fk-font-family-base);
715
+ --fk-sidenav-link-font-size: 0.875rem;
716
+ --fk-sidenav-link-font-weight-active: var(--fk-font-weight-semibold);
717
+ --fk-sidenav-link-color: var(--fk-color-text);
718
+ --fk-sidenav-link-color-hover: var(--fk-color-primary);
719
+ --fk-sidenav-link-color-active: var(--fk-white);
720
+ --fk-sidenav-link-focus-ring: var(--fk-focus-ring);
721
+
722
+ /* ---------- Tabs ---------- */
723
+ --fk-tabs-font-size: 0.875rem;
724
+ --fk-tabs-font-size-sm: var(--fk-typography-small-font-size);
725
+ --fk-tabs-font-size-lg: 1rem;
726
+ --fk-tabs-font-weight: var(--fk-font-weight-medium);
727
+ --fk-tabs-font-weight-active: var(--fk-font-weight-semibold);
728
+ --fk-tabs-tab-color: var(--fk-color-text-muted);
729
+ --fk-tabs-tab-color-active: var(--fk-color-primary);
730
+ --fk-tabs-tab-color-hover: var(--fk-color-text);
731
+ --fk-tabs-tab-color-disabled: var(--fk-color-text-disabled);
732
+ --fk-tabs-tab-opacity-disabled: 0.5;
733
+ --fk-tabs-tab-gap: var(--fk-rhythm-2);
734
+ --fk-tabs-tab-padding: var(--fk-rhythm-3) var(--fk-rhythm-4);
735
+ --fk-tabs-tab-padding-sm: var(--fk-rhythm-2) var(--fk-rhythm-3);
736
+ --fk-tabs-tab-padding-lg: var(--fk-rhythm-4) var(--fk-rhythm-5);
737
+ --fk-tabs-border-color: var(--fk-color-border);
738
+ --fk-tabs-border-width: var(--fk-border-width);
739
+ --fk-tabs-indicator-color: var(--fk-color-primary);
740
+ --fk-tabs-indicator-height: 2px;
741
+ --fk-tabs-indicator-radius: var(--fk-radius-full);
742
+ --fk-tabs-pill-active-bg: var(--fk-color-primary);
743
+ --fk-tabs-pill-active-color: var(--fk-color-surface);
744
+ --fk-tabs-pill-radius: var(--fk-radius-full);
745
+ --fk-tabs-contained-bg: var(--fk-color-surface-muted);
746
+ --fk-tabs-contained-border: none;
747
+ --fk-tabs-contained-active-bg: var(--fk-color-surface);
748
+ --fk-tabs-contained-active-shadow: var(--fk-shadow-sm);
749
+ --fk-tabs-contained-radius: var(--fk-radius-md);
750
+ --fk-tabs-contained-padding: var(--fk-rhythm-1);
751
+ --fk-tabs-badge-bg: var(--fk-color-surface-muted);
752
+ --fk-tabs-badge-color: var(--fk-color-text-muted);
753
+ --fk-tabs-close-bg-hover: var(--fk-color-surface-muted);
754
+ --fk-tabs-scroll-btn-bg: var(--fk-color-surface);
755
+ --fk-tabs-scroll-btn-color: var(--fk-color-text-muted);
756
+ --fk-tabs-scroll-btn-color-hover: var(--fk-color-text);
757
+
758
+ /* ---------- Breadcrumb (route-driven) ---------- */
759
+ --fk-breadcrumb-gap: var(--fk-rhythm-1);
760
+ --fk-breadcrumb-font-size: var(--fk-typography-caption-font-size);
761
+ --fk-breadcrumb-link-color: var(--fk-color-muted);
762
+ --fk-breadcrumb-link-color-hover: var(--fk-color-text);
763
+ --fk-breadcrumb-current-color: var(--fk-color-text);
764
+ --fk-breadcrumb-current-font-weight: var(--fk-font-weight-medium);
765
+ --fk-breadcrumb-separator-color: var(--fk-color-muted);
766
+
767
+ /* ---------- Node Tree Breadcrumb ---------- */
768
+ --fk-node-tree-breadcrumb-gap: var(--fk-rhythm-1);
769
+ --fk-node-tree-breadcrumb-font-size: var(--fk-typography-caption-font-size);
770
+ --fk-node-tree-breadcrumb-link-color: var(--fk-color-muted);
771
+ --fk-node-tree-breadcrumb-link-color-hover: var(--fk-color-text);
772
+ --fk-node-tree-breadcrumb-current-color: var(--fk-color-primary);
773
+ --fk-node-tree-breadcrumb-current-font-weight: var(--fk-font-weight-medium);
774
+ --fk-node-tree-breadcrumb-separator-color: var(--fk-color-muted);
775
+
776
+ /* ---------- List Editor ---------- */
777
+ --fk-list-editor-row-gap: var(--fk-rhythm-2);
778
+ --fk-list-editor-item-padding: var(--fk-rhythm-2) var(--fk-rhythm-3);
779
+ --fk-list-editor-item-bg: var(--fk-color-surface);
780
+ --fk-list-editor-item-border-color: var(--fk-color-border);
781
+ --fk-list-editor-item-radius: var(--fk-radius-md);
782
+ --fk-list-editor-input-border-color: var(--fk-color-border);
783
+ --fk-list-editor-input-radius: var(--fk-radius-md);
784
+ --fk-list-editor-input-color: var(--fk-color-text);
785
+ --fk-list-editor-input-bg: var(--fk-color-surface);
786
+ --fk-list-editor-input-focus-border-color: var(--fk-color-primary);
787
+ --fk-list-editor-order-bg: var(--fk-color-primary-light);
788
+ --fk-list-editor-order-color: var(--fk-color-primary);
789
+ --fk-list-editor-remove-color: var(--fk-color-muted);
790
+ --fk-list-editor-remove-hover-color: var(--fk-color-danger);
791
+ --fk-list-editor-empty-color: var(--fk-color-muted);
792
+ --fk-list-editor-error-color: var(--fk-color-danger);
793
+ --fk-list-editor-focus-ring: var(--fk-focus-ring);
794
+ --fk-list-editor-placeholder-bg: var(--fk-color-surface-muted);
795
+ --fk-list-editor-placeholder-border-color: var(--fk-color-border);
796
+ --fk-list-editor-drag-border-color: var(--fk-color-primary);
797
+
798
+ /* ==========================================================================
799
+ 5. ORGANISMS — complex composed components
800
+ ========================================================================== */
801
+
802
+ /* ---------- App Shell ---------- */
803
+ --fk-app-shell-header-z-index: 100;
804
+ --fk-app-shell-overlay-z-index: 200;
805
+ --fk-app-shell-aside-z-index: 201;
806
+ --fk-app-shell-overlay-bg: var(--fk-black-50);
807
+ --fk-app-shell-aside-bg: var(--fk-color-surface);
808
+ --fk-app-shell-mobile-sidenav-width: 100%;
809
+ --fk-app-shell-end-bg: var(--fk-color-surface);
810
+ --fk-app-shell-end-z-index: 201;
811
+ --fk-app-shell-end-radius: var(--fk-radius-lg) 0 0 var(--fk-radius-lg);
812
+ --fk-app-shell-end-shadow: -4px 0 16px rgba(0, 0, 0, 0.08);
813
+ --fk-app-shell-end-padding: var(--fk-rhythm-4);
814
+ --fk-app-shell-end-header-padding: var(--fk-rhythm-4);
815
+ --fk-app-shell-end-footer-padding: var(--fk-rhythm-4);
816
+
817
+ /* ---------- Data Table ---------- */
818
+ --fk-data-table-head-bg: var(--fk-color-surface-muted);
819
+ --fk-data-table-head-color: var(--fk-color-text-muted);
820
+ --fk-data-table-head-hover-color: var(--fk-color-text);
821
+ --fk-data-table-head-font-weight: var(--fk-font-weight-semibold);
822
+ --fk-data-table-head-font-size: var(--fk-typography-small-font-size);
823
+ --fk-data-table-body-bg: var(--fk-color-surface);
824
+ --fk-data-table-body-color: var(--fk-color-text);
825
+ --fk-data-table-body-font-size: 0.875rem;
826
+ --fk-data-table-border-color: var(--fk-color-border);
827
+ --fk-data-table-border-width: 0;
828
+ --fk-data-table-border-radius: var(--fk-radius-md);
829
+ --fk-data-table-row-hover-bg: var(--fk-color-surface-muted);
830
+ --fk-data-table-cell-padding: var(--fk-rhythm-3);
831
+ --fk-data-table-empty-padding: var(--fk-rhythm-8);
832
+ --fk-data-table-empty-color: var(--fk-color-text-muted);
833
+ --fk-data-table-loading-bg: var(--fk-color-surface-overlay);
834
+ --fk-data-table-loading-color: var(--fk-color-text-muted);
835
+ /* Row selection */
836
+ --fk-data-table-selection-cell-width: 2.75rem;
837
+ --fk-data-table-row-selected-bg: var(--fk-color-primary-light);
838
+ --fk-data-table-row-selected-hover-bg: var(--fk-color-primary-light-gradient);
839
+ --fk-data-table-checkbox-size: 1rem;
840
+ --fk-data-table-checkbox-border-color: var(--fk-color-border);
841
+ --fk-data-table-checkbox-radius: var(--fk-radius-sm);
842
+ --fk-data-table-checkbox-bg: var(--fk-color-surface);
843
+ --fk-data-table-checkbox-hover-border-color: var(--fk-color-primary);
844
+ --fk-data-table-checkbox-checked-bg: var(--fk-color-primary);
845
+ --fk-data-table-checkbox-checked-border-color: var(--fk-color-primary);
846
+ --fk-data-table-checkbox-icon-color: var(--fk-color-surface);
847
+
848
+ /* ---------- Node Tree ---------- */
849
+ --fk-node-tree-row-gap: var(--fk-rhythm-2);
850
+ --fk-node-tree-row-padding: var(--fk-rhythm-2) var(--fk-rhythm-3);
851
+ --fk-node-tree-row-radius: var(--fk-radius-md);
852
+ --fk-node-tree-row-color: var(--fk-color-text);
853
+ --fk-node-tree-row-font-size: var(--fk-typography-body-font-size);
854
+ --fk-node-tree-row-bg-hover: var(--fk-color-surface-muted);
855
+ --fk-node-tree-row-bg-selected: var(--fk-overlay-brand);
856
+ --fk-node-tree-row-color-selected: var(--fk-color-primary);
857
+ --fk-node-tree-row-font-weight-selected: var(--fk-font-weight-medium);
858
+ --fk-node-tree-row-toggle-color: var(--fk-color-muted);
859
+ --fk-node-tree-row-toggle-color-hover: var(--fk-color-text);
860
+ --fk-node-tree-row-toggle-bg-hover: var(--fk-color-surface-muted);
861
+ --fk-node-tree-row-handle-color: var(--fk-color-muted);
862
+ --fk-node-tree-row-handle-color-hover: var(--fk-color-text);
863
+ --fk-node-tree-row-bg-drop-target: var(--fk-overlay-brand);
864
+ --fk-node-tree-row-border-drop-target: var(--fk-color-primary);
865
+ --fk-node-tree-row-drag-source-opacity: 0.4;
866
+ --fk-node-tree-drag-preview-bg: var(--fk-color-surface);
867
+ --fk-node-tree-drag-preview-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
868
+ --fk-node-tree-drag-placeholder-bg: var(--fk-color-primary);
869
+
870
+ /* ---------- Content Split ---------- */
871
+ --fk-content-split-left-bg: var(--fk-color-surface);
872
+ --fk-content-split-left-border: 1px solid var(--fk-color-border);
873
+ --fk-content-split-overlay-bg: var(--fk-black-50, rgba(0, 0, 0, 0.5));
874
+ --fk-content-split-rail-toggle-color: var(--fk-color-muted);
875
+ --fk-content-split-rail-toggle-color-hover: var(--fk-color-text);
876
+ --fk-content-split-rail-toggle-bg-hover: var(--fk-color-surface-muted);
877
+
878
+ /* ---------- Dialog ---------- */
879
+ --fk-dialog-overlay-bg: rgba(0, 0, 0, 0.5);
880
+ --fk-dialog-overlay-z-index: 1000;
881
+
882
+ --fk-dialog-panel-bg: var(--fk-color-surface);
883
+ --fk-dialog-panel-border-radius: var(--fk-radius-lg);
884
+ --fk-dialog-panel-shadow: 0 8px 32px rgba(0, 0, 0, 0.12);
885
+ --fk-dialog-panel-border: none;
886
+ --fk-dialog-panel-max-height: 85vh;
887
+
888
+ --fk-dialog-width-sm: 24rem;
889
+ --fk-dialog-width-md: 32rem;
890
+ --fk-dialog-width-lg: 40rem;
891
+ --fk-dialog-width-xl: 52rem;
892
+
893
+ --fk-dialog-panel-margin: var(--fk-rhythm-4);
894
+
895
+ --fk-dialog-header-padding-inline: var(--fk-rhythm-6);
896
+ --fk-dialog-header-padding: var(--fk-rhythm-4)
897
+ var(--fk-dialog-header-padding-inline);
898
+ --fk-dialog-body-padding: var(--fk-rhythm-6);
899
+ --fk-dialog-footer-padding: var(--fk-rhythm-4) var(--fk-rhythm-6);
900
+ --fk-dialog-footer-border: 1px solid var(--fk-color-border);
901
+
902
+ --fk-dialog-close-size: 2rem;
903
+ --fk-dialog-close-color: var(--fk-color-muted);
904
+ --fk-dialog-close-color-hover: var(--fk-color-text);
905
+
906
+ /* ---------- Wizard Dialog ---------- */
907
+ --fk-wizard-dialog-stepper-gap: var(--fk-rhythm-2);
908
+ --fk-wizard-dialog-stepper-padding: 0 0 0.75rem;
909
+ --fk-wizard-dialog-step-color: var(--fk-form-hint-color);
910
+ --fk-wizard-dialog-step-active-color: var(--fk-color-primary);
911
+ --fk-wizard-dialog-step-completed-color: var(--fk-form-label-color);
912
+ --fk-wizard-dialog-step-number-active-color: #fff;
913
+ // Symmetric padding (vertical and horizontal). The wizard body owns
914
+ // its own scroll container (`overflow-y: auto`), which auto-promotes
915
+ // overflow-x to clipping — content flush against its left/right edge
916
+ // gets cut off (focus outlines, outer shadows, etc.). Horizontal
917
+ // padding gives every step's content a safe gutter from the clip
918
+ // edge regardless of the step's internal layout.
919
+ --fk-wizard-dialog-body-padding: var(--fk-rhythm-4) var(--fk-rhythm-4);
920
+ --fk-wizard-dialog-footer-gap: var(--fk-rhythm-3);
921
+ --fk-wizard-dialog-footer-padding: var(--fk-rhythm-4) var(--fk-rhythm-6);
922
+ --fk-wizard-dialog-footer-border: 1px solid var(--fk-color-border);
923
+
924
+ /* ---------- Form Field ---------- */
925
+ --fk-input-font-family: var(--fk-font-family-base);
926
+ --fk-input-font-size: 0.875rem;
927
+ --fk-input-line-height: var(--fk-typography-body-line-height);
928
+ --fk-input-font-weight: var(--fk-font-weight-normal);
929
+ --fk-input-color: var(--fk-color-text);
930
+ --fk-input-placeholder-color: var(--fk-color-muted);
931
+ --fk-select-placeholder-color: var(--fk-color-muted);
932
+ --fk-input-bg: var(--fk-color-surface);
933
+ --fk-input-border-color: var(--fk-color-border);
934
+ --fk-input-border-color-hover: var(--fk-color-muted);
935
+ --fk-input-border-color-focus: var(--fk-color-primary);
936
+ --fk-input-border-color-error: var(--fk-color-danger);
937
+ --fk-input-border-radius: var(--fk-radius-md);
938
+ --fk-input-border-width: 1px;
939
+ --fk-input-padding: var(--fk-rhythm-2) var(--fk-rhythm-3);
940
+ --fk-input-focus-ring: var(--fk-focus-ring);
941
+ --fk-input-disabled-opacity: 0.5;
942
+ --fk-input-error-focus-ring: 0 0 0 3px rgba(224, 36, 36, 0.2);
943
+
944
+ /* ---------- Autocomplete ---------- */
945
+ --fk-autocomplete-dropdown-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
946
+
947
+ /* ---------- Checkbox ---------- */
948
+ --fk-checkbox-size: 1.125rem;
949
+ --fk-checkbox-gap: 0.5rem;
950
+ --fk-checkbox-border-radius: var(--fk-radius-sm);
951
+ --fk-checkbox-checked-bg: var(--fk-color-primary);
952
+ --fk-checkbox-check-color: #ffffff;
953
+
954
+ /* ---------- Radio ---------- */
955
+ --fk-radio-size: 1.125rem;
956
+ --fk-radio-gap: var(--fk-rhythm-2);
957
+
958
+ /* ---------- Switch ---------- */
959
+ --fk-switch-width: 2.25rem;
960
+ --fk-switch-height: 1.25rem;
961
+ --fk-switch-thumb-size: 1rem;
962
+ --fk-switch-gap: var(--fk-rhythm-2);
963
+ --fk-switch-thumb-shadow: 0 1px 3px rgba(0, 0, 0, 0.15);
964
+
965
+ /* ---------- Slider ---------- */
966
+ --fk-slider-track-height: 6px;
967
+ --fk-slider-track-radius: 3px;
968
+ --fk-slider-thumb-size: 18px;
969
+
970
+ /* ---------- File Dropzone ---------- */
971
+ --fk-file-dropzone-padding: var(--fk-rhythm-10);
972
+ --fk-file-dropzone-min-height: 10rem;
973
+ --fk-file-dropzone-gap: var(--fk-rhythm-2);
974
+ --fk-file-dropzone-bg: var(--fk-color-surface-raised);
975
+ --fk-file-dropzone-bg-dragging: rgba(37, 99, 235, 0.04);
976
+ --fk-file-dropzone-border-width: 2px;
977
+ --fk-file-dropzone-border-style: dashed;
978
+ --fk-file-dropzone-border-color: var(--fk-color-border);
979
+ --fk-file-dropzone-border-color-hover: var(--fk-color-primary);
980
+ --fk-file-dropzone-border-color-dragging: var(--fk-color-primary);
981
+ --fk-file-dropzone-border-radius: var(--fk-radius-lg);
982
+ --fk-file-dropzone-prompt-color: var(--fk-color-text);
983
+ --fk-file-dropzone-hint-font-size: 0.8125rem;
984
+ --fk-file-dropzone-icon-color-disabled: var(--fk-color-muted);
985
+ --fk-file-dropzone-opacity-disabled: 0.6;
986
+
987
+ --fk-form-label-font-size: var(--fk-typography-label-font-size);
988
+ --fk-form-label-font-weight: var(--fk-typography-label-font-weight);
989
+ --fk-form-label-line-height: var(--fk-typography-label-line-height);
990
+ --fk-form-label-color: var(--fk-color-text-strong);
991
+ --fk-form-label-gap: var(--fk-rhythm-2);
992
+ --fk-form-subscript-gap: var(--fk-rhythm-1);
993
+
994
+ --fk-form-field-gap: var(--fk-rhythm-2);
995
+ --fk-form-error-font-size: 0.75rem;
996
+ --fk-form-error-color: var(--fk-color-danger);
997
+
998
+ --fk-form-hint-font-size: var(--fk-typography-small-font-size);
999
+ --fk-form-hint-color: var(--fk-color-muted);
1000
+
1001
+ /* ---------- Pagination ---------- */
1002
+ --fk-pagination-color: var(--fk-color-muted);
1003
+ --fk-pagination-border-width: 1px;
1004
+ --fk-pagination-border-color: var(--fk-color-border);
1005
+ --fk-pagination-font-size: var(--fk-typography-small-font-size);
1006
+ --fk-pagination-label-color: var(--fk-color-muted);
1007
+ --fk-pagination-select-color: var(--fk-color-text);
1008
+ --fk-pagination-select-bg: var(--fk-color-surface);
1009
+ --fk-pagination-select-border-color: var(--fk-color-border);
1010
+ --fk-pagination-select-border-radius: var(--fk-radius-md);
1011
+ --fk-pagination-select-focus-border-color: var(--fk-color-primary);
1012
+ --fk-pagination-select-focus-ring: var(--fk-focus-ring);
1013
+ --fk-pagination-page-info-color: var(--fk-color-text);
1014
+ --fk-pagination-btn-color: var(--fk-color-text);
1015
+ --fk-pagination-btn-border-color: var(--fk-color-border);
1016
+ --fk-pagination-btn-border-radius: var(--fk-radius-md);
1017
+ --fk-pagination-btn-bg-hover: var(--fk-color-surface-hover);
1018
+ --fk-pagination-btn-border-color-hover: var(--fk-color-muted);
1019
+ --fk-pagination-btn-disabled-opacity: var(--fk-input-disabled-opacity);
1020
+ --fk-pagination-btn-focus-border-color: var(--fk-color-primary);
1021
+ --fk-pagination-btn-focus-ring: var(--fk-focus-ring);
1022
+
1023
+ /* ---------- Drawer ---------- */
1024
+ --fk-drawer-overlay-bg: var(--fk-overlay-bg);
1025
+ --fk-drawer-bg: var(--fk-color-surface);
1026
+ --fk-drawer-border-color: var(--fk-color-border);
1027
+ --fk-drawer-header-border-color: var(--fk-color-border);
1028
+ --fk-drawer-title-color: var(--fk-color-text-strong);
1029
+ --fk-drawer-title-font-size: var(--fk-typography-h4-font-size);
1030
+ --fk-drawer-title-font-weight: var(--fk-font-weight-semibold);
1031
+ --fk-drawer-close-color: var(--fk-color-muted);
1032
+ --fk-drawer-close-color-hover: var(--fk-color-text);
1033
+ --fk-drawer-close-bg-hover: var(--fk-color-surface-hover);
1034
+ --fk-drawer-close-radius: var(--fk-radius-md);
1035
+ --fk-drawer-close-focus-ring: var(--fk-focus-ring);
1036
+
1037
+ /* ---------- Avatar Stack ---------- */
1038
+ --fk-avatar-stack-overlap: 0.5rem;
1039
+ --fk-avatar-stack-ring: 0 0 0 2px var(--fk-color-surface);
1040
+ --fk-avatar-stack-overflow-color: var(--fk-color-text);
1041
+ --fk-avatar-stack-overflow-bg: var(--fk-color-surface-muted);
1042
+ --fk-avatar-stack-overflow-bg-hover: var(--fk-color-surface-hover);
1043
+ --fk-avatar-stack-overflow-focus-ring: var(--fk-focus-ring);
1044
+ }
1045
+
1046
+ /* ==========================================================================
1047
+ RESPONSIVE OVERRIDES
1048
+ Mobile-first: base ≤ 767px · tablet ≥ 768px · desktop ≥ 1024px
1049
+ Only font-size tokens that need to scale are overridden here.
1050
+ ========================================================================== */
1051
+
1052
+ @media (min-width: 64em) {
1053
+ :root {
1054
+ --fk-font-size-body: 0.9375rem;
1055
+
1056
+ /* Headline scale — desktop */
1057
+ --fk-typography-h1-font-size: 3.5rem;
1058
+ --fk-typography-h2-font-size: 2.25rem;
1059
+ --fk-typography-h3-font-size: 1.75rem;
1060
+ --fk-typography-h4-font-size: 1.25rem;
1061
+ --fk-typography-h5-font-size: 1rem;
1062
+ --fk-typography-h6-font-size: 0.875rem;
1063
+
1064
+ /* Text scale — desktop */
1065
+ --fk-typography-body-font-size: 0.9375rem;
1066
+ --fk-typography-lead-font-size: 1.125rem;
1067
+ --fk-typography-small-font-size: 0.875rem;
1068
+ --fk-typography-caption-font-size: 0.75rem;
1069
+ --fk-typography-label-font-size: 0.875rem;
1070
+ --fk-typography-code-font-size: 0.875rem;
1071
+ }
1072
+ }
1073
+
1074
+ /* ==========================================================================
1075
+ 6. DOCS — components used only inside developer documentation surfaces
1076
+ ========================================================================== */
1077
+
1078
+ :root {
1079
+ /* ---------- Method Badge ---------- */
1080
+ --fk-method-badge-min-width: 3rem;
1081
+ --fk-method-badge-padding-block: 2px;
1082
+ --fk-method-badge-padding-inline: var(--fk-rhythm-2);
1083
+ --fk-method-badge-radius: var(--fk-radius-sm);
1084
+ --fk-method-badge-font-size: 0.6875rem;
1085
+ --fk-method-badge-font-weight: var(--fk-font-weight-bold);
1086
+ --fk-method-badge-color: var(--fk-color-text);
1087
+
1088
+ --fk-method-badge-bg-neutral: #d6d6d6;
1089
+ --fk-method-badge-bg-get: #89ecac;
1090
+ --fk-method-badge-bg-post: #94c4fd;
1091
+ --fk-method-badge-bg-put: #fbb972;
1092
+ --fk-method-badge-bg-patch: #c8a7fb;
1093
+ --fk-method-badge-bg-delete: #fb8d8d;
1094
+ --fk-method-badge-bg-head: var(--fk-method-badge-bg-neutral);
1095
+ --fk-method-badge-bg-options: var(--fk-method-badge-bg-neutral);
1096
+
1097
+ /* ---------- Endpoint Link ---------- */
1098
+ --fk-endpoint-link-gap: var(--fk-rhythm-2);
1099
+ --fk-endpoint-link-padding-block: var(--fk-rhythm-1);
1100
+ --fk-endpoint-link-padding-inline: var(--fk-rhythm-3);
1101
+ --fk-endpoint-link-radius: var(--fk-radius-md);
1102
+ --fk-endpoint-link-font-size: 0.875rem;
1103
+ --fk-endpoint-link-color: var(--fk-color-text);
1104
+ --fk-endpoint-link-bg-hover: var(--fk-color-surface-muted);
1105
+ --fk-endpoint-link-bg-active: var(--fk-color-primary-light);
1106
+ --fk-endpoint-link-color-active: var(--fk-color-primary);
1107
+ --fk-endpoint-link-font-weight-active: var(--fk-font-weight-semibold);
1108
+ --fk-endpoint-link-focus-ring: var(--fk-focus-ring);
1109
+ }
1110
+
1111
+ /* ==========================================================================
1112
+ 7. KEYFRAMES / ANIMATIONS
1113
+ ========================================================================== */
1114
+
1115
+ @keyframes fk-loader-spin {
1116
+ from {
1117
+ transform: rotate(0deg);
1118
+ }
1119
+
1120
+ to {
1121
+ transform: rotate(360deg);
1122
+ }
1123
+ }