@attrus-ds/core 1.0.10 → 1.0.12

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 (50) hide show
  1. package/dist/css/components/action-bar.css +93 -0
  2. package/dist/css/components/ambient.css +97 -0
  3. package/dist/css/components/animated-bg.css +261 -0
  4. package/dist/css/components/buttons.css +4 -4
  5. package/dist/css/components/callout.css +4 -3
  6. package/dist/css/components/cards.css +4 -3
  7. package/dist/css/components/combobox.css +16 -13
  8. package/dist/css/components/inputs.css +99 -15
  9. package/dist/css/components/number-input.css +6 -3
  10. package/dist/css/components/primitives.css +20 -15
  11. package/dist/css/components/sel-card.css +212 -0
  12. package/dist/css/components/sidebar.css +11 -9
  13. package/dist/css/components/smart-search.css +13 -11
  14. package/dist/css/components/status-pills.css +1 -1
  15. package/dist/css/components/stepper.css +81 -4
  16. package/dist/css/components/table.css +168 -7
  17. package/dist/css/components/tabs.css +4 -3
  18. package/dist/css/components/toast.css +2 -2
  19. package/dist/css/components/toggle-chip.css +137 -0
  20. package/dist/css/components/tooltip.css +8 -5
  21. package/dist/css/components/topbar.css +8 -7
  22. package/dist/css/index.css +5 -0
  23. package/dist/css/tokens.css +126 -22
  24. package/dist/react/ActionBar/ActionBar.d.ts +19 -0
  25. package/dist/react/ActionBar/ActionBar.tsx +54 -0
  26. package/dist/react/AmbientBackdrop/AmbientBackdrop.d.ts +17 -0
  27. package/dist/react/AmbientBackdrop/AmbientBackdrop.tsx +53 -0
  28. package/dist/react/AnimatedBackdrop/AnimatedBackdrop.d.ts +22 -0
  29. package/dist/react/AnimatedBackdrop/AnimatedBackdrop.tsx +317 -0
  30. package/dist/react/Callout/Callout.d.ts +1 -1
  31. package/dist/react/Callout/Callout.tsx +1 -1
  32. package/dist/react/Combobox/Combobox.d.ts +2 -0
  33. package/dist/react/Combobox/Combobox.tsx +85 -39
  34. package/dist/react/DataTable/DataTable.tsx +3 -3
  35. package/dist/react/Drawer/Drawer.tsx +7 -1
  36. package/dist/react/Input/Input.d.ts +1 -1
  37. package/dist/react/Input/Input.tsx +1 -1
  38. package/dist/react/Modal/Modal.tsx +8 -1
  39. package/dist/react/SelectableCard/SelectableCard.d.ts +39 -0
  40. package/dist/react/SelectableCard/SelectableCard.tsx +94 -0
  41. package/dist/react/SmartSearch/SmartSearch.tsx +2 -2
  42. package/dist/react/Stepper/Stepper.d.ts +3 -0
  43. package/dist/react/Stepper/Stepper.tsx +7 -0
  44. package/dist/react/Toast/Toast.d.ts +1 -1
  45. package/dist/react/Toast/Toast.tsx +1 -1
  46. package/dist/react/ToggleChip/ToggleChip.d.ts +29 -0
  47. package/dist/react/ToggleChip/ToggleChip.tsx +76 -0
  48. package/dist/react/Tooltip/Tooltip.d.ts +1 -1
  49. package/dist/react/Tooltip/Tooltip.tsx +1 -1
  50. package/package.json +1 -1
@@ -56,7 +56,7 @@
56
56
  .sb-section {
57
57
  padding: var(--space-6) var(--space-5) var(--space-2);
58
58
  font-family: var(--font-sans);
59
- font-size: var(--fs-xxs); font-weight: var(--w-semibold);
59
+ font-size: var(--fs-xxs); font-weight: var(--w-regular);
60
60
  color: var(--color-foreground-muted);
61
61
  opacity: 0.7;
62
62
  letter-spacing: var(--ls-caps); text-transform: uppercase;
@@ -68,7 +68,7 @@
68
68
  height: 36px; box-sizing: border-box;
69
69
  border-radius: var(--radius-sm);
70
70
  color: var(--color-foreground-default);
71
- font-size: var(--fs-md); font-weight: var(--w-medium);
71
+ font-size: var(--fs-md); font-weight: var(--w-regular);
72
72
  cursor: pointer; position: relative;
73
73
  white-space: nowrap; overflow: hidden;
74
74
  transition: background .15s, color .15s;
@@ -77,7 +77,7 @@
77
77
  .sb-item.active {
78
78
  background: var(--color-background-selected);
79
79
  color: var(--color-foreground-brand);
80
- font-weight: var(--w-semibold);
80
+ font-weight: var(--w-regular);
81
81
  }
82
82
  .sb-item.active::before {
83
83
  content: ""; position: absolute; left: -10px; top: 9px; bottom: 9px;
@@ -100,12 +100,13 @@
100
100
  .sb-badge.alert { background: var(--color-danger-500); }
101
101
  .sb-badge.warning { background: var(--color-warning-500); }
102
102
  .sb-count {
103
- font-family: var(--font-mono); font-size: var(--fs-xxs);
103
+ font-family: var(--font-mono);
104
+ font-size-adjust: var(--font-mono-adjust); font-size: var(--fs-xxs);
104
105
  color: var(--color-foreground-muted);
105
106
  background: var(--color-background-subtle);
106
107
  padding: 1px 6px; border-radius: var(--radius-xs);
107
108
  }
108
- .sb-item.active .sb-count { background: var(--color-brand-subtle); color: var(--color-brand-text); }
109
+ .sb-item.active .sb-count { background: var(--color-brand-subtle); color: var(--color-foreground-brand); }
109
110
 
110
111
  /* Footer — user mini-card */
111
112
  .sb-foot {
@@ -121,7 +122,7 @@
121
122
  display: inline-flex; align-items: center; justify-content: center; flex-shrink: 0;
122
123
  }
123
124
  .sb-foot .meta { flex: 1; min-width: 0; }
124
- .sb-foot .meta .name { font-size: var(--fs-sm); font-weight: var(--w-semibold); color: var(--color-foreground-default); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
125
+ .sb-foot .meta .name { font-size: var(--fs-sm); font-weight: var(--w-regular); color: var(--color-foreground-default); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
125
126
  .sb-foot .meta .role { font-size: var(--fs-xxs); color: var(--color-foreground-muted); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
126
127
  .sb-foot .logout { color: var(--color-foreground-muted); cursor: pointer; flex-shrink: 0; display: inline-flex; }
127
128
  .sb-foot .logout svg, .sb-foot .logout i { width: 14px; height: 14px; stroke-width: var(--icon-stroke); }
@@ -169,7 +170,7 @@
169
170
  height: 38px; box-sizing: border-box;
170
171
  border-radius: var(--radius-sm);
171
172
  color: var(--color-foreground-secondary);
172
- font-size: var(--fs-sm); font-weight: var(--w-medium);
173
+ font-size: var(--fs-sm); font-weight: var(--w-regular);
173
174
  cursor: pointer; position: relative;
174
175
  transition: var(--transition-fast);
175
176
  }
@@ -181,11 +182,12 @@
181
182
  }
182
183
  .sb-children .sb-subitem:hover { background: var(--color-background-hover); color: var(--color-foreground-default); }
183
184
  .sb-children .sb-subitem:hover::before { opacity: 1; background: var(--color-foreground-muted); }
184
- .sb-children .sb-subitem.active { color: var(--color-foreground-brand); font-weight: var(--w-semibold); background: var(--color-background-selected); }
185
+ .sb-children .sb-subitem.active { color: var(--color-foreground-brand); font-weight: var(--w-regular); background: var(--color-background-selected); }
185
186
  .sb-children .sb-subitem.active::before { background: var(--color-brand-solid); opacity: 1; }
186
187
  .sb-children .sb-subitem .count, .sb-children .sb-subitem .sb-count {
187
188
  margin-left: auto;
188
- font-family: var(--font-mono); font-size: var(--fs-xxs);
189
+ font-family: var(--font-mono);
190
+ font-size-adjust: var(--font-mono-adjust); font-size: var(--fs-xxs);
189
191
  color: var(--color-foreground-muted);
190
192
  background: var(--color-background-subtle);
191
193
  padding: 1px 6px; border-radius: var(--radius-xs);
@@ -18,11 +18,11 @@
18
18
 
19
19
  .ss-section { padding: var(--space-3) var(--space-2); border-bottom: 1px solid var(--color-border-subtle); }
20
20
  .ss-section:last-of-type { border-bottom: 0; }
21
- .ss-section-label { font-size: var(--fs-xxs); font-weight: var(--w-semibold); letter-spacing: var(--ls-caps); text-transform: uppercase; color: var(--color-foreground-muted); padding: 0 var(--space-2); margin-bottom: var(--space-2); }: var(--space-2); }
21
+ .ss-section-label { font-size: var(--fs-xxs); font-weight: var(--w-regular); letter-spacing: var(--ls-caps); text-transform: uppercase; color: var(--color-foreground-muted); padding: 0 var(--space-2); margin-bottom: var(--space-2); }
22
22
 
23
23
  /* Suggestion chips (active state) */
24
24
  .ss-chips { display: flex; flex-wrap: wrap; gap: var(--space-2); padding: 0 var(--space-2); }
25
- .ss-chip { display: inline-flex; align-items: center; gap: var(--space-2); padding: 4px var(--space-3); background: var(--color-background-canvas); border: 1px solid var(--color-border-default); border-radius: var(--radius-pill); font-size: var(--fs-xs); font-weight: var(--w-medium); color: var(--color-foreground-default); cursor: pointer; transition: var(--transition-fast); }
25
+ .ss-chip { display: inline-flex; align-items: center; gap: var(--space-2); padding: 4px var(--space-3); background: var(--color-background-canvas); border: 1px solid var(--color-border-default); border-radius: var(--radius-pill); font-size: var(--fs-xs); font-weight: var(--w-regular); color: var(--color-foreground-default); cursor: pointer; transition: var(--transition-fast); }
26
26
  .ss-chip:hover { background: var(--color-background-hover); border-color: var(--color-border-strong); }
27
27
  .ss-chip svg, .ss-chip i { width: 11px; height: 11px; stroke-width: var(--icon-stroke); color: var(--color-foreground-muted); }
28
28
 
@@ -32,9 +32,9 @@
32
32
  .ss-list-item:hover, .ss-list-item.is-active { background: var(--color-background-hover); }
33
33
  .ss-list-item .icon-leading { width: 28px; height: 28px; border-radius: var(--radius-sm); background: var(--color-background-canvas); display: inline-flex; align-items: center; justify-content: center; color: var(--color-foreground-secondary); flex-shrink: 0; }
34
34
  .ss-list-item .icon-leading svg, .ss-list-item .icon-leading i { width: 14px; height: 14px; stroke-width: var(--icon-stroke); }
35
- .ss-list-item .icon-leading.brand { background: var(--color-brand-subtle-solid); color: var(--color-brand-text); }
35
+ .ss-list-item .icon-leading.brand { background: var(--color-brand-subtle-solid); color: var(--color-brand-text-on-light); }
36
36
  .ss-list-item .text { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 1px; }
37
- .ss-list-item .text .label { font-size: var(--fs-sm); font-weight: var(--w-semibold); color: var(--color-foreground-default); }
37
+ .ss-list-item .text .label { font-size: var(--fs-sm); font-weight: var(--w-regular); color: var(--color-foreground-default); }
38
38
  .ss-list-item .text .meta { font-size: var(--fs-xs); color: var(--color-foreground-muted); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
39
39
  .ss-list-item .icon-trailing { display: inline-flex; align-items: center; justify-content: center; width: 16px; height: 16px; flex-shrink: 0; color: var(--color-foreground-muted); }
40
40
  .ss-list-item .icon-trailing svg, .ss-list-item .icon-trailing i { width: 14px; height: 14px; stroke-width: var(--icon-stroke); }
@@ -46,21 +46,22 @@
46
46
 
47
47
  /* Empty/result label */
48
48
  .ss-result-label { padding: 0 var(--space-2) var(--space-2); }
49
- .ss-result-label .l { font-size: var(--fs-xxs); font-weight: var(--w-semibold); letter-spacing: var(--ls-caps); text-transform: uppercase; color: var(--color-foreground-muted); }
49
+ .ss-result-label .l { font-size: var(--fs-xxs); font-weight: var(--w-regular); letter-spacing: var(--ls-caps); text-transform: uppercase; color: var(--color-foreground-muted); }
50
50
  .ss-no-result { padding: 0 var(--space-2); font-size: var(--fs-sm); color: var(--color-foreground-muted); }
51
- .ss-no-result strong { color: var(--color-foreground-default); font-weight: var(--w-semibold); }
51
+ .ss-no-result strong { color: var(--color-foreground-default); font-weight: var(--w-regular); }
52
52
 
53
53
  /* Tip / hint card (similar match suggestion, ID format hint) */
54
54
  .ss-hint { display: flex; align-items: center; gap: var(--space-3); padding: var(--space-3); background: var(--color-background-subtle); border: 1px solid var(--color-border-subtle); border-radius: var(--radius-sm); margin: var(--space-3) var(--space-2) 0; }
55
55
  .ss-hint .icon-leading { color: var(--color-foreground-muted); flex-shrink: 0; display: inline-flex; align-items: center; justify-content: center; width: 14px; height: 14px; }
56
56
  .ss-hint .icon-leading svg, .ss-hint .icon-leading i { width: 14px; height: 14px; stroke-width: var(--icon-stroke); }
57
57
  .ss-hint .body { font-size: var(--fs-sm); color: var(--color-foreground-secondary); line-height: var(--lh-relaxed); }
58
- .ss-hint .body strong { color: var(--color-foreground-default); font-weight: var(--w-semibold); }
59
- .ss-hint .body code { font-family: var(--font-mono); font-size: var(--fs-xs); color: var(--color-foreground-accent); background: var(--color-brand-subtle); padding: 1px var(--space-2); border-radius: var(--radius-xs); }
58
+ .ss-hint .body strong { color: var(--color-foreground-default); font-weight: var(--w-regular); }
59
+ .ss-hint .body code { font-family: var(--font-mono);
60
+ font-size-adjust: var(--font-mono-adjust); font-size: var(--fs-xs); color: var(--color-foreground-accent); background: var(--color-brand-subtle); padding: 1px var(--space-2); border-radius: var(--radius-xs); }
60
61
 
61
62
  /* ID type-picker buttons */
62
63
  .ss-typebtns { display: flex; flex-direction: column; gap: var(--space-2); padding: 0 var(--space-2); }
63
- .ss-typebtn { display: flex; align-items: center; gap: var(--space-3); padding: var(--space-3) var(--space-3); background: var(--color-background-canvas); border: 1px solid var(--color-border-default); border-radius: var(--radius-sm); font-size: var(--fs-sm); font-weight: var(--w-medium); color: var(--color-foreground-default); cursor: pointer; transition: var(--transition-fast); text-align: left; width: 100%; }
64
+ .ss-typebtn { display: flex; align-items: center; gap: var(--space-3); padding: var(--space-3) var(--space-3); background: var(--color-background-canvas); border: 1px solid var(--color-border-default); border-radius: var(--radius-sm); font-size: var(--fs-sm); font-weight: var(--w-regular); color: var(--color-foreground-default); cursor: pointer; transition: var(--transition-fast); text-align: left; width: 100%; }
64
65
  .ss-typebtn:hover { background: var(--color-background-hover); border-color: var(--color-border-strong); }
65
66
  .ss-typebtn svg, .ss-typebtn i { width: 16px; height: 16px; stroke-width: var(--icon-stroke); color: var(--color-foreground-muted); }
66
67
  .ss-typebtn .grow { flex: 1; }
@@ -79,13 +80,14 @@
79
80
 
80
81
  .ss-illo { display: flex; flex-direction: column; align-items: center; gap: var(--space-3); padding: var(--space-7) var(--space-5); text-align: center; }
81
82
  .ss-illo svg.illustration { width: 84px; height: 60px; }
82
- .ss-illo .title { font-size: var(--fs-md); font-weight: var(--w-semibold); color: var(--color-foreground-default); }
83
+ .ss-illo .title { font-size: var(--fs-md); font-weight: var(--w-regular); color: var(--color-foreground-default); }
83
84
  .ss-illo .body { font-size: var(--fs-xs); color: var(--color-foreground-muted); max-width: 32ch; line-height: var(--lh-relaxed); }
84
85
 
85
86
  /* Footer with keyboard shortcuts */
86
87
  .ss-foot { display: flex; align-items: center; gap: var(--space-4); padding: var(--space-2) var(--space-3); background: var(--color-background-subtle); border-top: 1px solid var(--color-border-subtle); font-size: var(--fs-xxs); color: var(--color-foreground-muted); }
87
88
  .ss-foot .kbd-group { display: inline-flex; align-items: center; gap: 4px; }
88
- kbd.ss-kbd { display: inline-flex; align-items: center; justify-content: center; min-width: 18px; height: 18px; padding: 0 4px; background: var(--color-background-surface); border: 1px solid var(--color-border-default); border-radius: var(--radius-xs); font-family: var(--font-mono); font-size: 10px; font-weight: var(--w-semibold); color: var(--color-foreground-secondary); }
89
+ kbd.ss-kbd { display: inline-flex; align-items: center; justify-content: center; min-width: 18px; height: 18px; padding: 0 4px; background: var(--color-background-surface); border: 1px solid var(--color-border-default); border-radius: var(--radius-xs); font-family: var(--font-mono);
90
+ font-size-adjust: var(--font-mono-adjust); font-size: 10px; font-weight: var(--w-regular); color: var(--color-foreground-secondary); }
89
91
  .ss-foot .sep { width: 1px; height: 12px; background: var(--color-border-default); }
90
92
 
91
93
 
@@ -19,7 +19,7 @@
19
19
  border-radius: var(--radius-pill);
20
20
  font-family: var(--font-sans);
21
21
  font-size: var(--fs-xs);
22
- font-weight: var(--w-semibold);
22
+ font-weight: var(--w-regular);
23
23
  line-height: 1;
24
24
  letter-spacing: var(--ls-caps);
25
25
  white-space: nowrap;
@@ -66,8 +66,9 @@
66
66
  background: var(--color-background-surface);
67
67
  border: 1.5px solid var(--color-border-default);
68
68
  font-family: var(--font-mono);
69
+ font-size-adjust: var(--font-mono-adjust);
69
70
  font-size: var(--fs-sm);
70
- font-weight: var(--w-semibold);
71
+ font-weight: var(--w-regular);
71
72
  color: var(--color-foreground-muted);
72
73
  text-decoration: none;
73
74
  transition: var(--transition-fast);
@@ -98,10 +99,30 @@ a.step-marker:focus-visible {
98
99
  }
99
100
  .step-label {
100
101
  font-size: var(--fs-sm);
101
- font-weight: var(--w-semibold);
102
+ font-weight: var(--w-regular);
102
103
  letter-spacing: var(--ls-title);
103
104
  color: var(--color-foreground-secondary);
104
105
  line-height: var(--lh-tight);
106
+ /* Truncate by default — labels used to overlap into "AtivaçãoRecebimento" in any
107
+ narrow container. Opt into two lines with .stepper.is-wrap. */
108
+ white-space: nowrap;
109
+ overflow: hidden;
110
+ text-overflow: ellipsis;
111
+ max-width: 100%;
112
+ }
113
+ .step-help {
114
+ white-space: nowrap;
115
+ overflow: hidden;
116
+ text-overflow: ellipsis;
117
+ max-width: 100%;
118
+ }
119
+ /* Wrap modifier — allow labels/helpers to run to two lines instead of truncating */
120
+ .stepper.is-wrap .step-label,
121
+ .stepper.is-wrap .step-help {
122
+ white-space: normal;
123
+ overflow: visible;
124
+ text-overflow: clip;
125
+ text-wrap: pretty;
105
126
  }
106
127
  .step-help {
107
128
  font-size: var(--fs-xs);
@@ -199,7 +220,11 @@ a.step-marker:focus-visible {
199
220
  .stepper .step-body {
200
221
  align-items: center;
201
222
  padding-top: 0;
202
- max-width: 16ch;
223
+ /* Constrain to the step, never wider — a fixed 16ch let the body overflow its
224
+ own flex:1 step on both sides, so the label's nowrap+ellipsis never engaged
225
+ and the labels overlapped ("AtivaçãoRecebimento"). */
226
+ max-width: 100%;
227
+ min-width: 0;
203
228
  }
204
229
  .stepper .step-label { text-align: center; }
205
230
  .stepper .step-help { text-align: center; }
@@ -282,10 +307,11 @@ a.step-marker:focus-visible {
282
307
  .stepper.is-rule .step-label {
283
308
  text-align: left;
284
309
  font-family: var(--font-mono);
310
+ font-size-adjust: var(--font-mono-adjust);
285
311
  font-size: var(--fs-xxs);
286
312
  text-transform: uppercase;
287
313
  letter-spacing: var(--ls-caps);
288
- font-weight: var(--w-semibold);
314
+ font-weight: var(--w-regular);
289
315
  }
290
316
  .stepper.is-rule .step.is-done .step-marker { background: var(--color-feedback-success-foreground); }
291
317
  .stepper.is-rule .step.is-current .step-marker { background: var(--color-brand-accent-700); box-shadow: none; }
@@ -301,6 +327,57 @@ a.step-marker:focus-visible {
301
327
  .stepper.is-collapse-sm .step { gap: 0; }
302
328
  }
303
329
 
330
+ /* ============================================================
331
+ LABEL SIZE — .stepper-label-sm / -md / -lg
332
+ Type scale for the label + helper, independent of marker geometry.
333
+ Density (marker size, connector offset) stays with .is-compact, so the two
334
+ axes compose: a compact stepper can still carry a large label, and a full
335
+ stepper can carry a small one.
336
+ Default (no class) is --fs-sm for the label and --fs-xs for the helper.
337
+ ============================================================ */
338
+ .stepper-label-sm .step-label { font-size: var(--fs-xs); }
339
+ .stepper-label-sm .step-help { font-size: var(--fs-xxs); }
340
+ .stepper-label-md .step-label { font-size: var(--fs-sm); }
341
+ .stepper-label-md .step-help { font-size: var(--fs-xs); }
342
+ .stepper-label-lg .step-label { font-size: var(--fs-md); }
343
+ .stepper-label-lg .step-help { font-size: var(--fs-sm); }
344
+ /* An explicit label size wins over the density modifier's own type scale */
345
+ .stepper.is-compact.stepper-label-md .step-label { font-size: var(--fs-sm); }
346
+ .stepper.is-compact.stepper-label-md .step-help { font-size: var(--fs-xs); }
347
+ .stepper.is-compact.stepper-label-lg .step-label { font-size: var(--fs-md); }
348
+ .stepper.is-compact.stepper-label-lg .step-help { font-size: var(--fs-sm); }
349
+
350
+ /* ============================================================
351
+ ON INVERSE — stepper on a permanently-dark surface
352
+ ============================================================ */
353
+ .stepper.on-inverse .step-label { color: var(--color-foreground-inverse-secondary); }
354
+ .stepper.on-inverse .step-help { color: var(--color-foreground-inverse-muted); }
355
+ .stepper.on-inverse .step-marker {
356
+ background: color-mix(in srgb, var(--color-pure-white) 8%, transparent);
357
+ border-color: var(--color-border-inverse);
358
+ color: var(--color-foreground-inverse-secondary);
359
+ }
360
+ .stepper.on-inverse .step::after { background: var(--color-border-inverse); }
361
+ .stepper.on-inverse .step.is-current .step-marker {
362
+ background: var(--color-accent-solid);
363
+ border-color: var(--color-accent-solid);
364
+ color: var(--color-foreground-on-solid);
365
+ }
366
+ .stepper.on-inverse .step.is-current .step-label,
367
+ .stepper.on-inverse .step.is-done .step-label { color: var(--color-foreground-inverse-default); }
368
+ .stepper.on-inverse .step.is-done .step-marker {
369
+ background: color-mix(in srgb, var(--color-accent-solid) 30%, transparent);
370
+ border-color: var(--color-accent-solid);
371
+ color: var(--color-foreground-inverse-default);
372
+ }
373
+ .stepper.on-inverse .step.is-done::after { background: var(--color-accent-solid); }
374
+ .stepper.on-inverse .step.is-error .step-marker,
375
+ .stepper.on-inverse .step.is-error .step-label { color: var(--color-danger-300); }
376
+ .stepper.on-inverse .step.is-error .step-marker { border-color: var(--color-danger-300); }
377
+ .stepper.on-inverse .step.is-skipped .step-label,
378
+ .stepper.on-inverse .step.is-skipped .step-marker { color: var(--color-foreground-inverse-muted); }
379
+ .stepper.on-inverse .step-btn:focus-visible { box-shadow: var(--shadow-focus-inverse); }
380
+
304
381
  /* ============================================================
305
382
  Reduced motion
306
383
  ============================================================ */
@@ -74,7 +74,7 @@
74
74
  }
75
75
  .dt-toolbar .count {
76
76
  color: var(--color-foreground-default);
77
- font-weight: var(--w-semibold);
77
+ font-weight: var(--w-regular);
78
78
  }
79
79
  .dt-toolbar .count .total {
80
80
  color: var(--color-foreground-muted);
@@ -106,6 +106,7 @@
106
106
  }
107
107
  .dt-pagination .range {
108
108
  font-family: var(--font-mono);
109
+ font-size-adjust: var(--font-mono-adjust);
109
110
  font-size: var(--fs-xs);
110
111
  color: var(--color-foreground-muted);
111
112
  }
@@ -126,8 +127,9 @@
126
127
  background: var(--color-background-surface);
127
128
  border-radius: var(--radius-sm);
128
129
  font-family: var(--font-mono);
130
+ font-size-adjust: var(--font-mono-adjust);
129
131
  font-size: var(--fs-xs);
130
- font-weight: var(--w-semibold);
132
+ font-weight: var(--w-regular);
131
133
  color: var(--color-foreground-secondary);
132
134
  cursor: pointer;
133
135
  transition:
@@ -165,8 +167,9 @@
165
167
  ---------------------------------------------------------------- */
166
168
  .dt thead th {
167
169
  font-family: var(--font-mono);
170
+ font-size-adjust: var(--font-mono-adjust);
168
171
  font-size: var(--fs-xxs);
169
- font-weight: var(--w-semibold);
172
+ font-weight: var(--w-regular);
170
173
  color: var(--color-foreground-muted);
171
174
  text-transform: uppercase;
172
175
  letter-spacing: var(--ls-caps);
@@ -244,7 +247,7 @@
244
247
  }
245
248
  .dt-cell-stack > .pri {
246
249
  font-size: var(--fs-md);
247
- font-weight: var(--w-semibold);
250
+ font-weight: var(--w-regular);
248
251
  color: var(--color-foreground-default);
249
252
  white-space: nowrap;
250
253
  overflow: hidden;
@@ -257,6 +260,7 @@
257
260
  }
258
261
  .dt-cell-stack > .sub.mono {
259
262
  font-family: var(--font-mono);
263
+ font-size-adjust: var(--font-mono-adjust);
260
264
  font-size: var(--fs-xs);
261
265
  }
262
266
 
@@ -309,6 +313,10 @@
309
313
  white-space: nowrap;
310
314
  letter-spacing: -0.01em;
311
315
  }
316
+ /* Header label follows the values (beats `.dt thead th { text-align:left }`
317
+ by specificity); stacked cells in a numeric column align flex to the right. */
318
+ .dt thead th.dt-num { text-align: right; }
319
+ .dt td.dt-num .dt-cell-stack { align-items: flex-end; }
312
320
  .dt-num .ccy {
313
321
  color: var(--color-foreground-muted);
314
322
  font-weight: var(--w-regular);
@@ -322,6 +330,7 @@
322
330
  /* IDs / hashes */
323
331
  .dt-id {
324
332
  font-family: var(--font-mono);
333
+ font-size-adjust: var(--font-mono-adjust);
325
334
  font-size: var(--fs-xs);
326
335
  color: var(--color-foreground-muted);
327
336
  white-space: nowrap;
@@ -415,7 +424,7 @@
415
424
  .dt-empty .ttl {
416
425
  display: block;
417
426
  font-size: var(--fs-base);
418
- font-weight: var(--w-semibold);
427
+ font-weight: var(--w-regular);
419
428
  color: var(--color-foreground-default);
420
429
  margin-bottom: var(--space-2);
421
430
  }
@@ -459,6 +468,7 @@
459
468
  background: var(--color-background-subtle);
460
469
  padding: var(--space-3) var(--space-5);
461
470
  font-family: var(--font-mono);
471
+ font-size-adjust: var(--font-mono-adjust);
462
472
  font-size: var(--fs-xxs);
463
473
  font-weight: var(--w-regular);
464
474
  color: var(--color-foreground-muted);
@@ -566,8 +576,9 @@
566
576
  content: attr(data-label);
567
577
  flex-shrink: 0;
568
578
  font-family: var(--font-mono);
579
+ font-size-adjust: var(--font-mono-adjust);
569
580
  font-size: var(--fs-xxs);
570
- font-weight: var(--w-semibold);
581
+ font-weight: var(--w-regular);
571
582
  text-transform: uppercase;
572
583
  letter-spacing: var(--ls-caps);
573
584
  color: var(--color-foreground-muted);
@@ -582,7 +593,7 @@
582
593
  justify-content: flex-start;
583
594
  text-align: left;
584
595
  font-size: var(--fs-base);
585
- font-weight: var(--w-semibold);
596
+ font-weight: var(--w-regular);
586
597
  padding-top: var(--space-3);
587
598
  }
588
599
  /* The lead block (avatar + name + country/doc) reads left-to-right */
@@ -600,3 +611,153 @@
600
611
  .dt-responsive .dt tbody tr.dt-empty td { border: 0; text-align: center; }
601
612
  .dt-responsive .dt tbody tr.dt-empty td::before { content: none; }
602
613
  }
614
+
615
+ /* ----------------------------------------------------------------
616
+ 12. SUBROWS — a row bound to the row above it
617
+ ----------------------------------------------------------------
618
+ For a line item that belongs to another line item and shares its columns:
619
+ an ACH fee under its payment, a refund under its charge, a leg under its
620
+ transfer. This is hierarchy (tree rows), NOT a detail panel — the child
621
+ fills the same columns as the parent, so the two read as one block.
622
+
623
+ Structure:
624
+ <tr class="has-subrows"> parent — loses its bottom border, so the pair glues
625
+ <tr class="dt-subrow"> child — sunken bg, one type step down, no border
626
+ <tr class="dt-subrow is-last"> last child of the group — restores the border
627
+
628
+ Indent scales by depth through one token, so nesting costs no new rules:
629
+ <tr class="dt-subrow" data-depth="2">
630
+
631
+ ROW STATES DO NOT CASCADE IN CSS — a sibling selector cannot read the
632
+ previous row's class. The component echoes is-muted / is-error / is-selected
633
+ onto each subrow; without that the child visually detaches from its parent.
634
+
635
+ ACCESSIBILITY — native table semantics are kept on purpose. role="treegrid"
636
+ is the formally correct role for hierarchical rows, but it is a PROMISE of a
637
+ keyboard model (arrow-key cell/row navigation, aria-level, aria-expanded,
638
+ posinset/setsize). Claiming it without implementing that model is worse for
639
+ a screen-reader user than a plain table. Since these subrows are always
640
+ visible and one level deep, hierarchy is conveyed in CONTENT instead: the
641
+ lead cell carries a visually-hidden prefix naming its parent. Revisit
642
+ treegrid only if the rows ever become collapsible and keyboard-navigable.
643
+ ---------------------------------------------------------------- */
644
+
645
+ /* Glue: the parent gives up its bottom border so no line splits the pair */
646
+ .dt tbody tr.has-subrows > td { border-bottom: 0; }
647
+
648
+ .dt tbody tr.dt-subrow > td {
649
+ background: var(--color-background-subtle);
650
+ border-bottom: 0;
651
+ padding-top: var(--space-2-5);
652
+ padding-bottom: var(--space-2-5);
653
+ font-size: var(--fs-sm);
654
+ color: var(--color-foreground-secondary);
655
+ }
656
+ /* The group closes with a normal rule */
657
+ .dt tbody tr.dt-subrow.is-last > td { border-bottom: 1px solid var(--color-border-default); }
658
+
659
+ /* Hover reads on the whole group, not on one row */
660
+ .dt tbody tr.has-subrows.is-clickable:hover > td,
661
+ .dt tbody tr.has-subrows.is-clickable:hover + tr.dt-subrow > td {
662
+ background: var(--color-background-hover);
663
+ }
664
+
665
+ /* Indent — one token, multiplied by depth */
666
+ /* --subrow-indent is a real token (declared in colors_and_type.css §7 spacing);
667
+ depth multiplies it in the calc, so no custom property is declared under a
668
+ component selector and N levels still cost one rule each. */
669
+ .dt tbody tr.dt-subrow > td:first-child {
670
+ padding-left: calc(var(--space-5) + var(--subrow-indent) * 1);
671
+ }
672
+ .dt tbody tr.dt-subrow[data-depth="2"] > td:first-child {
673
+ padding-left: calc(var(--space-5) + var(--subrow-indent) * 2);
674
+ }
675
+ .dt tbody tr.dt-subrow[data-depth="3"] > td:first-child {
676
+ padding-left: calc(var(--space-5) + var(--subrow-indent) * 3);
677
+ }
678
+
679
+ /* Lead cell — connector glyph + content. The glyph is a ::before so it is not
680
+ copied with the text and not announced as a character. */
681
+ .dt-subrow-lead {
682
+ display: flex;
683
+ align-items: center;
684
+ gap: var(--space-3);
685
+ min-width: 0;
686
+ }
687
+ .dt-subrow-lead::before {
688
+ content: "\21B3";
689
+ color: var(--color-foreground-placeholder);
690
+ font-size: var(--fs-sm);
691
+ line-height: 1;
692
+ flex-shrink: 0;
693
+ }
694
+ /* Small square icon tile, quieter than the parent's .ic-tile */
695
+ .dt-subrow-lead > .ic-mini {
696
+ width: 20px; height: 20px;
697
+ border-radius: var(--radius-2xs);
698
+ background: var(--color-background-surface);
699
+ border: 1px solid var(--color-border-default);
700
+ color: var(--color-foreground-muted);
701
+ display: inline-flex; align-items: center; justify-content: center;
702
+ flex-shrink: 0;
703
+ }
704
+ .dt-subrow-lead > .ic-mini > i,
705
+ .dt-subrow-lead > .ic-mini > svg { width: 11px; height: 11px; stroke-width: var(--icon-stroke); }
706
+ .dt-subrow-lead > .txt {
707
+ color: var(--color-foreground-default);
708
+ overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
709
+ }
710
+
711
+ /* Neutral tag for the item kind (Fee, Refund, Leg) */
712
+ .dt-subrow-tag {
713
+ font-size: var(--fs-xxs);
714
+ color: var(--color-foreground-muted);
715
+ background: var(--color-background-surface);
716
+ border: 1px solid var(--color-border-default);
717
+ border-radius: var(--radius-2xs);
718
+ padding: 1px var(--space-2);
719
+ flex-shrink: 0;
720
+ }
721
+ /* Status text on a subrow is plain muted copy, not a pill — the parent owns the
722
+ status signal and two pills in a group compete. */
723
+ .dt-subrow-status { color: var(--color-foreground-muted); font-size: var(--fs-xs); flex-shrink: 0; }
724
+
725
+ /* Row states echoed from the parent by the component */
726
+ .dt tbody tr.dt-subrow.is-muted > td { opacity: .55; }
727
+ .dt tbody tr.dt-subrow.is-selected > td { background: var(--color-background-selected); }
728
+ .dt tbody tr.dt-subrow.is-error > td { background: color-mix(in srgb, var(--color-feedback-danger-background) 40%, transparent); }
729
+
730
+ /* Inverse / dark */
731
+ .dt.on-inverse tbody tr.dt-subrow > td,
732
+ .dark .dt tbody tr.dt-subrow > td {
733
+ background: color-mix(in srgb, var(--color-pure-white) 3%, transparent);
734
+ color: var(--color-foreground-inverse-secondary);
735
+ }
736
+ .dt.on-inverse .dt-subrow-lead > .txt,
737
+ .dark .dt .dt-subrow-lead > .txt { color: var(--color-foreground-inverse-default); }
738
+ .dt.on-inverse .dt-subrow-lead > .ic-mini,
739
+ .dark .dt .dt-subrow-lead > .ic-mini {
740
+ background: transparent;
741
+ border-color: var(--color-border-inverse);
742
+ color: var(--color-foreground-inverse-muted);
743
+ }
744
+ .dt.on-inverse .dt-subrow-tag,
745
+ .dark .dt .dt-subrow-tag {
746
+ background: transparent;
747
+ border-color: var(--color-border-inverse);
748
+ color: var(--color-foreground-inverse-muted);
749
+ }
750
+
751
+ /* Mobile — inside the card stack the child becomes a nested block, still
752
+ visibly hanging off its parent card. */
753
+ @media (max-width: 900px) {
754
+ .dt-responsive .dt tbody tr.dt-subrow {
755
+ margin: calc(-1 * var(--space-3)) var(--space-3) var(--space-3);
756
+ border-radius: var(--shape-control);
757
+ border: 1px solid var(--color-border-default);
758
+ border-top: 0;
759
+ display: flex; flex-wrap: wrap; gap: var(--space-2);
760
+ }
761
+ .dt-responsive .dt tbody tr.dt-subrow > td { border-bottom: 0; padding-left: var(--space-4); }
762
+ .dt-responsive .dt tbody tr.dt-subrow > td::before { display: none; }
763
+ }
@@ -36,7 +36,7 @@
36
36
  cursor: pointer;
37
37
  font-family: var(--font-sans);
38
38
  font-size: var(--fs-sm);
39
- font-weight: var(--w-medium);
39
+ font-weight: var(--w-regular);
40
40
  color: var(--color-foreground-secondary);
41
41
  position: relative;
42
42
  white-space: nowrap;
@@ -47,7 +47,7 @@
47
47
  .tab[aria-selected="true"],
48
48
  .tab.is-active {
49
49
  color: var(--color-brand-accent-700);
50
- font-weight: var(--w-semibold);
50
+ font-weight: var(--w-regular);
51
51
  }
52
52
  .tab[aria-selected="true"]::after,
53
53
  .tab.is-active::after {
@@ -75,6 +75,7 @@
75
75
  height: 20px;
76
76
  padding: 0 var(--space-2);
77
77
  font-family: var(--font-mono);
78
+ font-size-adjust: var(--font-mono-adjust);
78
79
  font-size: var(--fs-xxs);
79
80
  font-weight: var(--w-bold);
80
81
  background: var(--color-background-subtle);
@@ -204,7 +205,7 @@
204
205
  }
205
206
  .tab-label::after {
206
207
  content: attr(data-label);
207
- font-weight: var(--w-semibold);
208
+ font-weight: var(--w-regular);
208
209
  height: 0;
209
210
  visibility: hidden;
210
211
  overflow: hidden;
@@ -54,7 +54,7 @@
54
54
  }
55
55
  .toast-title {
56
56
  font-size: var(--fs-sm);
57
- font-weight: var(--w-semibold);
57
+ font-weight: var(--w-regular);
58
58
  color: var(--color-foreground-default);
59
59
  margin: 0 0 var(--space-1);
60
60
  letter-spacing: var(--ls-tight);
@@ -74,7 +74,7 @@
74
74
  border: 0;
75
75
  padding: 0;
76
76
  font: inherit;
77
- font-weight: var(--w-semibold);
77
+ font-weight: var(--w-regular);
78
78
  color: var(--color-foreground-accent);
79
79
  text-decoration: underline;
80
80
  text-underline-offset: 3px;