@scttlnd/fintech-design-system 0.2.0 → 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 (51) hide show
  1. package/AGENTS.md +1 -1
  2. package/README.md +9 -3
  3. package/dist/components/Badge.d.mts +9 -0
  4. package/dist/components/Badge.mjs +18 -0
  5. package/dist/components/Badge.mjs.map +1 -0
  6. package/dist/components/Button.d.mts +6 -0
  7. package/dist/components/Button.mjs +14 -0
  8. package/dist/components/Button.mjs.map +1 -0
  9. package/dist/components/Field.d.mts +20 -0
  10. package/dist/components/Field.mjs +57 -0
  11. package/dist/components/Field.mjs.map +1 -0
  12. package/dist/components/Menu.d.mts +18 -0
  13. package/dist/components/Menu.mjs +109 -0
  14. package/dist/components/Menu.mjs.map +1 -0
  15. package/dist/components/Meter.d.mts +39 -0
  16. package/dist/components/Meter.mjs +82 -0
  17. package/dist/components/Meter.mjs.map +1 -0
  18. package/dist/components/Metric.d.mts +17 -0
  19. package/dist/components/Metric.mjs +34 -0
  20. package/dist/components/Metric.mjs.map +1 -0
  21. package/dist/components/Notice.d.mts +16 -0
  22. package/dist/components/Notice.mjs +48 -0
  23. package/dist/components/Notice.mjs.map +1 -0
  24. package/dist/components/Panel.d.mts +13 -0
  25. package/dist/components/Panel.mjs +42 -0
  26. package/dist/components/Panel.mjs.map +1 -0
  27. package/dist/index.d.mts +10 -125
  28. package/dist/index.mjs +9 -365
  29. package/dist/lib/cn.d.mts +2 -0
  30. package/dist/lib/cn.mjs +7 -0
  31. package/dist/lib/cn.mjs.map +1 -0
  32. package/package.json +18 -3
  33. package/styles/components/badge.css +33 -0
  34. package/styles/components/button.css +45 -0
  35. package/styles/components/empty-state.css +20 -0
  36. package/styles/components/eyebrow.css +11 -0
  37. package/styles/components/field.css +59 -0
  38. package/styles/components/grain.css +245 -0
  39. package/styles/components/menu.css +74 -0
  40. package/styles/components/meter.css +62 -0
  41. package/styles/components/metric.css +28 -0
  42. package/styles/components/notice.css +34 -0
  43. package/styles/components/panel.css +42 -0
  44. package/styles/components/tone.css +15 -0
  45. package/styles/components.css +11 -367
  46. package/styles/index.css +2 -43
  47. package/styles/themes/funder.css +76 -8
  48. package/styles/themes/investor.css +76 -8
  49. package/styles/themes/portare.css +90 -22
  50. package/styles/tokens.css +88 -23
  51. package/dist/index.mjs.map +0 -1
@@ -1,367 +1,11 @@
1
- /* Shared primitives. Only --fds-* tokens; tones are derived with color-mix so every theme works. */
2
-
3
- .fds-eyebrow {
4
- margin: 0;
5
- font-size: 0.75rem;
6
- letter-spacing: 0.06em;
7
- text-transform: uppercase;
8
- color: var(--fds-muted);
9
- }
10
-
11
- /* Panel */
12
- .fds-panel {
13
- padding: 1rem;
14
- border: 1px solid var(--fds-line);
15
- border-radius: var(--fds-radius-lg);
16
- background: var(--fds-panel);
17
- color: var(--fds-foreground);
18
- }
19
- .fds-panel__header {
20
- display: flex;
21
- flex-direction: column;
22
- gap: 0.75rem;
23
- margin-bottom: 1rem;
24
- }
25
- .fds-panel__heading {
26
- min-width: 0;
27
- }
28
- .fds-panel__title {
29
- margin: 0.25rem 0 0;
30
- font-size: 1.125rem;
31
- font-weight: 600;
32
- }
33
- .fds-panel__help {
34
- margin: 0.375rem 0 0;
35
- max-width: 65ch;
36
- font-size: 0.75rem;
37
- line-height: 1.5;
38
- color: var(--fds-muted);
39
- }
40
- @media (min-width: 640px) {
41
- .fds-panel {
42
- padding: 1.25rem;
43
- }
44
- .fds-panel__header {
45
- flex-direction: row;
46
- align-items: flex-start;
47
- justify-content: space-between;
48
- gap: 1rem;
49
- }
50
- }
51
-
52
- /* Tones */
53
- .fds-tone--accent {
54
- color: var(--fds-accent);
55
- }
56
- .fds-tone--success {
57
- color: var(--fds-success);
58
- }
59
- .fds-tone--warn {
60
- color: var(--fds-warn);
61
- }
62
- .fds-tone--danger {
63
- color: var(--fds-danger);
64
- }
65
-
66
- /* Metric / KeyValue */
67
- .fds-metric,
68
- .fds-keyvalue {
69
- padding: 0.75rem;
70
- border: 1px solid var(--fds-line);
71
- border-radius: var(--fds-radius-md);
72
- background: var(--fds-panel-soft, var(--fds-panel));
73
- }
74
- .fds-keyvalue {
75
- border-color: var(--fds-line-soft, var(--fds-line));
76
- }
77
- .fds-metric__label {
78
- margin: 0;
79
- font-size: 0.75rem;
80
- color: var(--fds-muted);
81
- }
82
- .fds-metric__value {
83
- margin: 0.5rem 0 0;
84
- font-size: 1.125rem;
85
- font-weight: 600;
86
- font-variant-numeric: tabular-nums;
87
- }
88
- .fds-keyvalue__value {
89
- margin: 0.25rem 0 0;
90
- font-weight: 500;
91
- }
92
-
93
- /* Badge */
94
- .fds-badge {
95
- --fds-badge-color: var(--fds-muted-strong, var(--fds-foreground));
96
- display: inline-flex;
97
- align-items: center;
98
- gap: 0.375rem;
99
- min-height: 1.75rem;
100
- padding: 0 0.5rem;
101
- border: 1px solid color-mix(in srgb, var(--fds-badge-color) 30%, transparent);
102
- border-radius: var(--fds-radius-sm);
103
- background: color-mix(in srgb, var(--fds-badge-color) 12%, transparent);
104
- color: var(--fds-badge-color);
105
- font-size: 0.75rem;
106
- font-weight: 500;
107
- white-space: nowrap;
108
- }
109
- .fds-badge--accent {
110
- --fds-badge-color: var(--fds-accent);
111
- }
112
- .fds-badge--success {
113
- --fds-badge-color: var(--fds-success);
114
- }
115
- .fds-badge--warn {
116
- --fds-badge-color: var(--fds-warn);
117
- }
118
- .fds-badge--danger {
119
- --fds-badge-color: var(--fds-danger);
120
- }
121
- .fds-badge__icon {
122
- display: inline-flex;
123
- }
124
-
125
- /* Notice */
126
- .fds-notice {
127
- --fds-notice-color: var(--fds-accent);
128
- display: flex;
129
- flex-wrap: wrap;
130
- align-items: center;
131
- justify-content: space-between;
132
- gap: 0.75rem;
133
- padding: 0.75rem 1rem;
134
- border: 1px solid color-mix(in srgb, var(--fds-notice-color) 35%, transparent);
135
- border-left-width: 4px;
136
- border-radius: var(--fds-radius-md);
137
- background: color-mix(in srgb, var(--fds-notice-color) 10%, transparent);
138
- color: var(--fds-foreground);
139
- }
140
- .fds-notice--success {
141
- --fds-notice-color: var(--fds-success);
142
- }
143
- .fds-notice--warn {
144
- --fds-notice-color: var(--fds-warn);
145
- }
146
- .fds-notice--danger {
147
- --fds-notice-color: var(--fds-danger);
148
- }
149
- .fds-notice__title {
150
- margin: 0;
151
- font-weight: 600;
152
- }
153
- .fds-notice__text {
154
- font-size: 0.875rem;
155
- color: var(--fds-muted-strong, var(--fds-foreground));
156
- }
157
-
158
- /* Empty state */
159
- .fds-empty {
160
- padding: 2rem 1rem;
161
- text-align: center;
162
- }
163
- .fds-empty__title {
164
- margin: 0;
165
- font-weight: 600;
166
- }
167
- .fds-empty__description {
168
- margin: 0.5rem auto 0;
169
- max-width: 45ch;
170
- font-size: 0.875rem;
171
- color: var(--fds-muted);
172
- }
173
- .fds-empty__action {
174
- margin-top: 1rem;
175
- }
176
-
177
- /* Form controls: 44px targets on touch / small screens, 16px font to stop iOS zoom. */
178
- .fds-field {
179
- display: flex;
180
- flex-direction: column;
181
- gap: 0.375rem;
182
- }
183
- .fds-field__label {
184
- font-size: 0.875rem;
185
- font-weight: 500;
186
- }
187
- .fds-field__hint,
188
- .fds-field__error {
189
- margin: 0;
190
- font-size: 0.8125rem;
191
- }
192
- .fds-field__hint {
193
- color: var(--fds-muted);
194
- }
195
- .fds-field__error {
196
- color: var(--fds-danger);
197
- }
198
- .fds-control {
199
- width: 100%;
200
- min-height: 2.75rem;
201
- padding: 0.5rem 0.75rem;
202
- border: 1px solid var(--fds-line);
203
- border-radius: var(--fds-radius-md);
204
- background: var(--fds-panel-soft, var(--fds-panel));
205
- color: var(--fds-foreground);
206
- font: inherit;
207
- font-size: 1rem;
208
- }
209
- .fds-control--multiline {
210
- min-height: 6rem;
211
- resize: vertical;
212
- }
213
- .fds-control:focus-visible {
214
- outline: 2px solid var(--fds-accent);
215
- outline-offset: 2px;
216
- border-color: var(--fds-accent);
217
- }
218
- .fds-control[aria-invalid="true"] {
219
- border-color: var(--fds-danger);
220
- }
221
- .fds-control:disabled {
222
- opacity: 0.5;
223
- cursor: not-allowed;
224
- }
225
- @media (min-width: 640px) and (pointer: fine) {
226
- .fds-control {
227
- min-height: 2.25rem;
228
- font-size: 0.875rem;
229
- }
230
- .fds-control--multiline {
231
- min-height: 6rem;
232
- }
233
- }
234
-
235
- /* Meters */
236
- .fds-meter {
237
- height: 0.5rem;
238
- overflow: hidden;
239
- border-radius: 999px;
240
- background: var(--fds-line);
241
- }
242
- .fds-meter--thin {
243
- height: 0.375rem;
244
- }
245
- .fds-meter__fill {
246
- height: 100%;
247
- border-radius: inherit;
248
- background: var(--fds-accent);
249
- }
250
- .fds-segmeter {
251
- display: flex;
252
- align-items: center;
253
- gap: 0.25rem;
254
- }
255
- .fds-segmeter__segment {
256
- width: 0.5rem;
257
- height: 1rem;
258
- border-radius: 2px;
259
- background: var(--fds-line);
260
- }
261
- .fds-segmeter__segment--on {
262
- background: var(--fds-accent);
263
- }
264
- .fds-distribution__list {
265
- display: flex;
266
- flex-direction: column;
267
- gap: 0.5rem;
268
- margin: 0;
269
- padding: 0;
270
- list-style: none;
271
- }
272
- .fds-distribution__meta {
273
- display: flex;
274
- justify-content: space-between;
275
- gap: 0.75rem;
276
- margin-bottom: 0.25rem;
277
- font-size: 0.75rem;
278
- }
279
- .fds-distribution__label {
280
- color: var(--fds-muted-strong, var(--fds-foreground));
281
- }
282
- .fds-distribution__value {
283
- font-weight: 500;
284
- font-variant-numeric: tabular-nums;
285
- }
286
- .fds-distribution__empty,
287
- .fds-distribution__overflow {
288
- margin: 0;
289
- font-size: 0.8125rem;
290
- color: var(--fds-muted);
291
- }
292
- .fds-distribution__overflow {
293
- margin-top: 0.5rem;
294
- }
295
-
296
- /* Menu */
297
- .fds-menu {
298
- position: relative;
299
- display: inline-block;
300
- }
301
- .fds-menu__trigger {
302
- display: inline-flex;
303
- align-items: center;
304
- justify-content: center;
305
- width: 2.75rem;
306
- height: 2.75rem;
307
- border: 1px solid var(--fds-line);
308
- border-radius: var(--fds-radius-md);
309
- background: var(--fds-panel-soft, var(--fds-panel));
310
- color: var(--fds-muted);
311
- cursor: pointer;
312
- }
313
- .fds-menu__trigger:hover {
314
- border-color: var(--fds-accent);
315
- color: var(--fds-foreground);
316
- }
317
- .fds-menu__trigger:focus-visible,
318
- .fds-menu__item:focus-visible {
319
- outline: 2px solid var(--fds-accent);
320
- outline-offset: 2px;
321
- }
322
- .fds-menu__list {
323
- position: absolute;
324
- top: 100%;
325
- right: 0;
326
- z-index: 30;
327
- min-width: 11rem;
328
- margin-top: 0.25rem;
329
- padding: 0.25rem 0;
330
- overflow: hidden;
331
- border: 1px solid var(--fds-line);
332
- border-radius: var(--fds-radius-md);
333
- background: var(--fds-panel);
334
- box-shadow: 0 10px 30px rgb(0 0 0 / 0.25);
335
- }
336
- .fds-menu__item {
337
- display: block;
338
- width: 100%;
339
- min-height: 2.75rem;
340
- padding: 0.5rem 0.75rem;
341
- border: 0;
342
- background: transparent;
343
- color: var(--fds-foreground);
344
- font: inherit;
345
- text-align: left;
346
- cursor: pointer;
347
- }
348
- .fds-menu__item:hover,
349
- .fds-menu__item:focus-visible {
350
- background: var(--fds-panel-raised);
351
- }
352
- .fds-menu__item--danger {
353
- color: var(--fds-danger);
354
- }
355
- .fds-menu__item:disabled {
356
- opacity: 0.5;
357
- cursor: not-allowed;
358
- }
359
- @media (min-width: 640px) and (pointer: fine) {
360
- .fds-menu__trigger {
361
- width: 2.25rem;
362
- height: 2.25rem;
363
- }
364
- .fds-menu__item {
365
- min-height: 2.25rem;
366
- }
367
- }
1
+ @import "./components/eyebrow.css";
2
+ @import "./components/panel.css";
3
+ @import "./components/tone.css";
4
+ @import "./components/metric.css";
5
+ @import "./components/badge.css";
6
+ @import "./components/notice.css";
7
+ @import "./components/empty-state.css";
8
+ @import "./components/field.css";
9
+ @import "./components/meter.css";
10
+ @import "./components/menu.css";
11
+ @import "./components/button.css";
package/styles/index.css CHANGED
@@ -1,45 +1,4 @@
1
+ @layer fds;
1
2
  @import "./tokens.css";
2
3
  @import "./components.css";
3
- .fds-button {
4
- display: inline-flex;
5
- align-items: center;
6
- justify-content: center;
7
- gap: 0.5rem;
8
- min-height: 2.5rem;
9
- padding: 0.55rem 1rem;
10
- border-radius: var(--fds-radius-md);
11
- font: inherit;
12
- font-weight: 600;
13
- cursor: pointer;
14
- transition:
15
- background-color 0.15s,
16
- border-color 0.15s;
17
- }
18
- .fds-button:focus-visible {
19
- outline: 2px solid var(--fds-accent);
20
- outline-offset: 2px;
21
- }
22
- .fds-button:disabled {
23
- opacity: 0.5;
24
- cursor: not-allowed;
25
- }
26
- .fds-button--primary {
27
- background: var(--fds-accent);
28
- color: var(--fds-on-accent);
29
- border: 1px solid transparent;
30
- }
31
- .fds-button--secondary {
32
- background: var(--fds-panel-raised);
33
- color: var(--fds-foreground);
34
- border: 1px solid var(--fds-line);
35
- }
36
- .fds-button--ghost {
37
- background: transparent;
38
- color: var(--fds-foreground);
39
- border: 1px solid transparent;
40
- }
41
- @media (prefers-reduced-motion: reduce) {
42
- .fds-button {
43
- transition: none;
44
- }
45
- }
4
+ @import "./components/grain.css";
@@ -1,9 +1,77 @@
1
- :root,
2
- [data-fds-theme="funder"] {
3
- color-scheme: dark;
4
- --fds-background: #08090b;
5
- --fds-foreground: #f4f4f5;
6
- --fds-accent: #7dd3fc;
7
- --fds-accent-strong: #38bdf8;
8
- --fds-on-accent: #08090b;
1
+ @layer fds {
2
+ :root,
3
+ [data-fds-theme="funder"] {
4
+ color-scheme: dark;
5
+ --fds-background: #08090b;
6
+ --fds-foreground: #f4f4f5;
7
+ --fds-accent: #7dd3fc;
8
+ --fds-accent-strong: #38bdf8;
9
+ --fds-on-accent: #08090b;
10
+ }
11
+
12
+ /* Phase 0 foundations. Spacing retains the retired showcase's 4px scale. */
13
+ :root,
14
+ [data-fds-theme="funder"] {
15
+ --fds-space-1: 4px;
16
+ --fds-space-2: 8px;
17
+ --fds-space-3: 12px;
18
+ --fds-space-4: 16px;
19
+ --fds-space-5: 20px;
20
+ --fds-space-6: 24px;
21
+ --fds-space-7: 28px;
22
+ --fds-space-8: 32px;
23
+ --fds-text-xs: 0.75rem;
24
+ --fds-text-sm: 0.875rem;
25
+ --fds-text-base: 1rem;
26
+ --fds-text-lg: 1.125rem;
27
+ --fds-text-xl: 1.25rem;
28
+ --fds-text-2xl: 1.5rem;
29
+ --fds-leading-tight: 1.25;
30
+ --fds-leading-normal: 1.5;
31
+ --fds-leading-relaxed: 1.75;
32
+ --fds-font-mono: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
33
+ --fds-numeric: tabular-nums;
34
+ --fds-control-h: 2.75rem;
35
+ --fds-control-h-sm: 2.75rem;
36
+ --fds-focus-ring: var(--fds-accent);
37
+ --fds-shadow-popover: 0 10px 30px rgb(0 0 0 / 0.25);
38
+ --fds-shadow-dialog: 0 24px 64px rgb(0 0 0 / 0.4);
39
+ --fds-overlay: rgb(0 0 0 / 0.6);
40
+ --fds-z-dropdown: 30;
41
+ --fds-z-sticky: 20;
42
+ --fds-z-overlay: 40;
43
+ --fds-z-modal: 50;
44
+ --fds-z-toast: 60;
45
+ --fds-z-tooltip: 70;
46
+ --fds-duration-fast: 0.15s;
47
+ --fds-duration-base: 0.2s;
48
+ --fds-ease-out: cubic-bezier(0.16, 1, 0.3, 1);
49
+ --fds-on-danger: var(--fds-background);
50
+ --fds-on-success: var(--fds-background);
51
+ --fds-chart-1: #7dd3fc;
52
+ --fds-chart-2: #c4b5fd;
53
+ --fds-chart-3: #fbbf24;
54
+ --fds-chart-4: #fda4af;
55
+ --fds-chart-5: #86efac;
56
+ --fds-chart-6: #67e8f9;
57
+ --fds-chart-grid: #71717a;
58
+ --fds-chart-positive: var(--fds-success);
59
+ --fds-chart-negative: var(--fds-danger);
60
+ }
61
+
62
+ @media (min-width: 640px) and (pointer: fine) {
63
+ :root,
64
+ [data-fds-theme="funder"] {
65
+ --fds-control-h: 2.25rem;
66
+ --fds-control-h-sm: 2rem;
67
+ }
68
+ }
69
+
70
+ @media (prefers-reduced-motion: reduce) {
71
+ :root,
72
+ [data-fds-theme="funder"] {
73
+ --fds-duration-fast: 0s;
74
+ --fds-duration-base: 0s;
75
+ }
76
+ }
9
77
  }
@@ -1,9 +1,77 @@
1
- :root,
2
- [data-fds-theme="investor"] {
3
- color-scheme: dark;
4
- --fds-background: #08090b;
5
- --fds-foreground: #f4f4f5;
6
- --fds-accent: #7dd3fc;
7
- --fds-accent-strong: #38bdf8;
8
- --fds-on-accent: #08090b;
1
+ @layer fds {
2
+ :root,
3
+ [data-fds-theme="investor"] {
4
+ color-scheme: dark;
5
+ --fds-background: #08090b;
6
+ --fds-foreground: #f4f4f5;
7
+ --fds-accent: #7dd3fc;
8
+ --fds-accent-strong: #38bdf8;
9
+ --fds-on-accent: #08090b;
10
+ }
11
+
12
+ /* Phase 0 foundations. Spacing retains the retired showcase's 4px scale. */
13
+ :root,
14
+ [data-fds-theme="investor"] {
15
+ --fds-space-1: 4px;
16
+ --fds-space-2: 8px;
17
+ --fds-space-3: 12px;
18
+ --fds-space-4: 16px;
19
+ --fds-space-5: 20px;
20
+ --fds-space-6: 24px;
21
+ --fds-space-7: 28px;
22
+ --fds-space-8: 32px;
23
+ --fds-text-xs: 0.75rem;
24
+ --fds-text-sm: 0.875rem;
25
+ --fds-text-base: 1rem;
26
+ --fds-text-lg: 1.125rem;
27
+ --fds-text-xl: 1.25rem;
28
+ --fds-text-2xl: 1.5rem;
29
+ --fds-leading-tight: 1.25;
30
+ --fds-leading-normal: 1.5;
31
+ --fds-leading-relaxed: 1.75;
32
+ --fds-font-mono: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
33
+ --fds-numeric: tabular-nums;
34
+ --fds-control-h: 2.75rem;
35
+ --fds-control-h-sm: 2.75rem;
36
+ --fds-focus-ring: var(--fds-accent);
37
+ --fds-shadow-popover: 0 10px 30px rgb(0 0 0 / 0.25);
38
+ --fds-shadow-dialog: 0 24px 64px rgb(0 0 0 / 0.4);
39
+ --fds-overlay: rgb(0 0 0 / 0.6);
40
+ --fds-z-dropdown: 30;
41
+ --fds-z-sticky: 20;
42
+ --fds-z-overlay: 40;
43
+ --fds-z-modal: 50;
44
+ --fds-z-toast: 60;
45
+ --fds-z-tooltip: 70;
46
+ --fds-duration-fast: 0.15s;
47
+ --fds-duration-base: 0.2s;
48
+ --fds-ease-out: cubic-bezier(0.16, 1, 0.3, 1);
49
+ --fds-on-danger: var(--fds-background);
50
+ --fds-on-success: var(--fds-background);
51
+ --fds-chart-1: #7dd3fc;
52
+ --fds-chart-2: #c4b5fd;
53
+ --fds-chart-3: #fbbf24;
54
+ --fds-chart-4: #fda4af;
55
+ --fds-chart-5: #86efac;
56
+ --fds-chart-6: #67e8f9;
57
+ --fds-chart-grid: #71717a;
58
+ --fds-chart-positive: var(--fds-success);
59
+ --fds-chart-negative: var(--fds-danger);
60
+ }
61
+
62
+ @media (min-width: 640px) and (pointer: fine) {
63
+ :root,
64
+ [data-fds-theme="investor"] {
65
+ --fds-control-h: 2.25rem;
66
+ --fds-control-h-sm: 2rem;
67
+ }
68
+ }
69
+
70
+ @media (prefers-reduced-motion: reduce) {
71
+ :root,
72
+ [data-fds-theme="investor"] {
73
+ --fds-duration-fast: 0s;
74
+ --fds-duration-base: 0s;
75
+ }
76
+ }
9
77
  }
@@ -1,24 +1,92 @@
1
- :root,
2
- [data-fds-theme="portare"] {
3
- color-scheme: light;
4
- --fds-background: #fafbfc;
5
- --fds-foreground: #111827;
6
- --fds-muted: #525b6b;
7
- --fds-panel: #fff;
8
- --fds-panel-raised: #f3f5f8;
9
- --fds-line: #d8dee7;
10
- --fds-accent: #075e7c;
11
- --fds-accent-strong: #064c66;
12
- --fds-on-accent: #fff;
13
- }
1
+ @layer fds {
2
+ :root,
3
+ [data-fds-theme="portare"] {
4
+ color-scheme: light;
5
+ --fds-background: #fafbfc;
6
+ --fds-foreground: #111827;
7
+ --fds-muted: #525b6b;
8
+ --fds-panel: #fff;
9
+ --fds-panel-raised: #f3f5f8;
10
+ --fds-line: #d8dee7;
11
+ --fds-accent: #075e7c;
12
+ --fds-accent-strong: #064c66;
13
+ --fds-on-accent: #fff;
14
+ }
15
+
16
+ /* Semantic and secondary surface tokens: the base (dark) values fail contrast on a light surface. */
17
+ :root,
18
+ [data-fds-theme="portare"] {
19
+ --fds-muted-strong: #374151;
20
+ --fds-line-soft: #e5e9f0;
21
+ --fds-panel-soft: #f8fafc;
22
+ --fds-success: #1f6f4a;
23
+ --fds-warn: #8a5a00;
24
+ --fds-danger: #b3261e;
25
+ }
26
+
27
+ /* Phase 0 foundations. Spacing retains the retired showcase's 4px scale. */
28
+ :root,
29
+ [data-fds-theme="portare"] {
30
+ --fds-space-1: 4px;
31
+ --fds-space-2: 8px;
32
+ --fds-space-3: 12px;
33
+ --fds-space-4: 16px;
34
+ --fds-space-5: 20px;
35
+ --fds-space-6: 24px;
36
+ --fds-space-7: 28px;
37
+ --fds-space-8: 32px;
38
+ --fds-text-xs: 0.75rem;
39
+ --fds-text-sm: 0.875rem;
40
+ --fds-text-base: 1rem;
41
+ --fds-text-lg: 1.125rem;
42
+ --fds-text-xl: 1.25rem;
43
+ --fds-text-2xl: 1.5rem;
44
+ --fds-leading-tight: 1.25;
45
+ --fds-leading-normal: 1.5;
46
+ --fds-leading-relaxed: 1.75;
47
+ --fds-font-mono: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
48
+ --fds-numeric: tabular-nums;
49
+ --fds-control-h: 2.75rem;
50
+ --fds-control-h-sm: 2.75rem;
51
+ --fds-focus-ring: var(--fds-accent);
52
+ --fds-shadow-popover: 0 10px 30px rgb(0 0 0 / 0.15);
53
+ --fds-shadow-dialog: 0 24px 64px rgb(0 0 0 / 0.25);
54
+ --fds-overlay: rgb(0 0 0 / 0.5);
55
+ --fds-z-dropdown: 30;
56
+ --fds-z-sticky: 20;
57
+ --fds-z-overlay: 40;
58
+ --fds-z-modal: 50;
59
+ --fds-z-toast: 60;
60
+ --fds-z-tooltip: 70;
61
+ --fds-duration-fast: 0.15s;
62
+ --fds-duration-base: 0.2s;
63
+ --fds-ease-out: cubic-bezier(0.16, 1, 0.3, 1);
64
+ --fds-on-danger: #fff;
65
+ --fds-on-success: #fff;
66
+ --fds-chart-1: #075e7c;
67
+ --fds-chart-2: #6941a5;
68
+ --fds-chart-3: #8a5a00;
69
+ --fds-chart-4: #b3261e;
70
+ --fds-chart-5: #1f6f4a;
71
+ --fds-chart-6: #0e6574;
72
+ --fds-chart-grid: #667085;
73
+ --fds-chart-positive: var(--fds-success);
74
+ --fds-chart-negative: var(--fds-danger);
75
+ }
76
+
77
+ @media (min-width: 640px) and (pointer: fine) {
78
+ :root,
79
+ [data-fds-theme="portare"] {
80
+ --fds-control-h: 2.25rem;
81
+ --fds-control-h-sm: 2rem;
82
+ }
83
+ }
14
84
 
15
- /* Semantic and secondary surface tokens: the base (dark) values fail contrast on a light surface. */
16
- :root,
17
- [data-fds-theme="portare"] {
18
- --fds-muted-strong: #374151;
19
- --fds-line-soft: #e5e9f0;
20
- --fds-panel-soft: #f8fafc;
21
- --fds-success: #1f6f4a;
22
- --fds-warn: #8a5a00;
23
- --fds-danger: #b3261e;
85
+ @media (prefers-reduced-motion: reduce) {
86
+ :root,
87
+ [data-fds-theme="portare"] {
88
+ --fds-duration-fast: 0s;
89
+ --fds-duration-base: 0s;
90
+ }
91
+ }
24
92
  }