@attrus-ds/core 1.0.4 → 1.0.6

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.
@@ -132,7 +132,7 @@
132
132
  4. VARIANTS
133
133
  ---------------------------------------------------------------- */
134
134
 
135
- /* PRIMARY — brand solid */
135
+ /* PRIMARY — brand-blue solid */
136
136
  .btn-primary {
137
137
  background: var(--color-brand-solid);
138
138
  color: var(--color-brand-on-solid);
@@ -38,7 +38,7 @@
38
38
  --callout-fg theme-aware foreground → icon color
39
39
  ============================================================ */
40
40
  .callout {
41
- --callout-tint: var(--color-brand-secondary-500); /* info / royal */
41
+ --callout-tint: var(--color-brand-solid); /* info / royal */
42
42
  --callout-fg: var(--color-foreground-accent); /* sky, theme-aware */
43
43
  display: flex;
44
44
  gap: var(--space-3);
@@ -73,8 +73,8 @@
73
73
  .combobox-avatar {
74
74
  width: 24px; height: 24px;
75
75
  border-radius: var(--radius-pill);
76
- background: var(--color-brand-secondary-100);
77
- color: var(--color-brand-secondary-700);
76
+ background: var(--color-brand-subtle-solid);
77
+ color: var(--color-brand-text);
78
78
  display: inline-flex; align-items: center; justify-content: center;
79
79
  font-size: var(--fs-xxs);
80
80
  font-weight: var(--w-semibold);
@@ -198,7 +198,7 @@
198
198
  margin-top: 1px;
199
199
  }
200
200
  .combobox-option.is-selected .combobox-option-meta {
201
- color: var(--color-brand-secondary-600);
201
+ color: var(--color-brand-text);
202
202
  }
203
203
 
204
204
  .combobox-option-check {
@@ -306,9 +306,9 @@
306
306
  .combobox-filters { display: flex; flex-wrap: wrap; gap: var(--space-2); padding: var(--space-3); border-bottom: 1px solid var(--color-border-subtle); }
307
307
  .combobox-filter-chip { display: inline-flex; align-items: center; gap: var(--space-2); padding: 4px var(--space-3); background: var(--color-background-surface); border: 1px solid var(--color-border-default); border-radius: var(--radius-pill); font-family: var(--font-sans); font-size: var(--fs-xs); font-weight: var(--w-medium); color: var(--color-foreground-secondary); cursor: pointer; transition: var(--transition-fast); }
308
308
  .combobox-filter-chip:hover { background: var(--color-background-hover); border-color: var(--color-border-strong); color: var(--color-foreground-default); }
309
- .combobox-filter-chip.is-active { background: var(--color-background-selected); border-color: var(--color-brand-secondary-200); color: var(--color-foreground-brand); font-weight: var(--w-semibold); }
309
+ .combobox-filter-chip.is-active { background: var(--color-background-selected); border-color: var(--color-brand-border); color: var(--color-foreground-brand); font-weight: var(--w-semibold); }
310
310
  .combobox-filter-chip .count { font-family: var(--font-mono); font-size: var(--fs-xxs); color: var(--color-foreground-muted); }
311
- .combobox-filter-chip.is-active .count { color: var(--color-brand-secondary-600); }
311
+ .combobox-filter-chip.is-active .count { color: var(--color-brand-text); }
312
312
  .combobox-meta { padding: var(--space-2) var(--space-3) var(--space-1); font-size: var(--fs-xxs); font-weight: var(--w-semibold); letter-spacing: var(--ls-caps); text-transform: uppercase; color: var(--color-foreground-muted); border-bottom: 1px solid var(--color-border-subtle); }
313
313
  .combobox-foot-meta { padding: var(--space-2) var(--space-3); font-size: var(--fs-xs); color: var(--color-foreground-muted); border-top: 1px solid var(--color-border-subtle); }
314
314
 
@@ -469,7 +469,7 @@ textarea.input.input-lg { height: auto; min-height: 120px; padding: var(--space-
469
469
  font-size: var(--fs-xl);
470
470
  font-weight: var(--w-semibold);
471
471
  border: 1px solid var(--color-border-default);
472
- border-radius: var(--shape-container);
472
+ border-radius: var(--shape-control);
473
473
  outline: none;
474
474
  background: var(--color-background-surface);
475
475
  color: var(--color-foreground-default);
@@ -842,7 +842,7 @@ textarea.input.input-lg { height: auto; min-height: 120px; padding: var(--space-
842
842
  white-space: nowrap;
843
843
  }
844
844
  .file-status.ok { color: var(--color-feedback-success-foreground); background: var(--color-feedback-success-background); }
845
- .file-status.pending { color: var(--color-brand-text); background: var(--color-brand-subtle); }
845
+ .file-status.pending { color: var(--color-brand-text); background: color-mix(in srgb, var(--color-brand-solid) 10%, transparent); }
846
846
  .file-status.err { color: var(--color-feedback-danger-foreground); background: var(--color-feedback-danger-background); cursor: pointer; }
847
847
 
848
848
  .file-remove {
@@ -952,7 +952,7 @@ textarea.input.input-lg { height: auto; min-height: 120px; padding: var(--space-
952
952
  .dark .chips:focus-within,
953
953
  .dark .number-input:focus-within,
954
954
  .dark .date-trigger:focus-visible {
955
- border-color: var(--color-brand-secondary-300);
955
+ border-color: var(--color-border-focus);
956
956
  box-shadow: var(--shadow-focus-sky);
957
957
  }
958
958
  .dark .field > label { color: var(--color-foreground-inverse-default); }
@@ -37,7 +37,7 @@
37
37
  display: flex;
38
38
  flex-direction: column;
39
39
  background: var(--color-background-surface);
40
- border-radius: var(--radius-lg);
40
+ border-radius: var(--shape-overlay);
41
41
  box-shadow: var(--shadow-2xl);
42
42
  opacity: 0;
43
43
  pointer-events: none;
@@ -237,7 +237,7 @@
237
237
  justify-content: space-between;
238
238
  gap: var(--space-4);
239
239
  padding: var(--space-6);
240
- background: var(--glass-white);
240
+ background: var(--glass-chrome);
241
241
  -webkit-backdrop-filter: var(--glass-blur);
242
242
  backdrop-filter: var(--glass-blur);
243
243
  border-bottom: 1px solid var(--color-border-subtle);
@@ -307,7 +307,7 @@
307
307
  display: inline-flex;
308
308
  align-items: center;
309
309
  justify-content: center;
310
- border-radius: var(--radius-md);
310
+ border-radius: var(--shape-container);
311
311
  }
312
312
  .drawer-lead i, .drawer-lead svg { width: 20px; height: 20px; stroke-width: var(--icon-stroke); }
313
313
 
@@ -328,7 +328,7 @@
328
328
  justify-content: flex-end;
329
329
  gap: var(--space-3);
330
330
  padding: var(--space-5) var(--space-6);
331
- background: var(--glass-white);
331
+ background: var(--glass-chrome);
332
332
  -webkit-backdrop-filter: var(--glass-blur);
333
333
  backdrop-filter: var(--glass-blur);
334
334
  border-top: 1px solid var(--color-border-subtle);
@@ -343,7 +343,7 @@
343
343
  display: flex;
344
344
  justify-content: center;
345
345
  padding: var(--space-3) 0 var(--space-1);
346
- background: var(--glass-white);
346
+ background: var(--glass-chrome);
347
347
  -webkit-backdrop-filter: var(--glass-blur);
348
348
  backdrop-filter: var(--glass-blur);
349
349
  flex-shrink: 0;
@@ -32,7 +32,7 @@
32
32
 
33
33
  /* Tone — accent-on-tinted-bg uses the same background+foreground pair as feedback pills,
34
34
  so an Avatar reads as the same "object" as a status pill that references it. */
35
- .av-brand { background: var(--color-brand-secondary-50); color: var(--color-brand-secondary-700); }
35
+ .av-brand { background: var(--color-brand-subtle-solid); color: var(--color-brand-text); }
36
36
  .av-success { background: var(--color-feedback-success-background); color: var(--color-feedback-success-foreground); }
37
37
  .av-warning { background: var(--color-feedback-warning-background); color: var(--color-feedback-warning-foreground); }
38
38
  .av-danger { background: var(--color-feedback-danger-background); color: var(--color-feedback-danger-foreground); }
@@ -141,7 +141,7 @@
141
141
  padding: var(--space-5);
142
142
  background: var(--color-background-surface);
143
143
  border: 1px solid var(--color-border-default);
144
- border-radius: var(--radius-md);
144
+ border-radius: var(--shape-container);
145
145
  }
146
146
  .stat-label {
147
147
  font-family: var(--font-mono);
@@ -253,7 +253,7 @@
253
253
  .eyebrow-muted { color: var(--color-foreground-muted); }
254
254
  .eyebrow-secondary { color: var(--color-foreground-secondary); }
255
255
  .eyebrow-default { color: var(--color-foreground-default); }
256
- .eyebrow-brand { color: var(--color-brand-secondary-700); }
256
+ .eyebrow-brand { color: var(--color-brand-text); }
257
257
  .eyebrow-inverse { color: var(--color-foreground-inverse-muted); }
258
258
 
259
259
  /* =================== FILTER CHIP =================== */
@@ -280,7 +280,7 @@
280
280
  /* Selected (aria-pressed via FilterChip TSX) — same active treatment as combobox filter chips */
281
281
  .filter-chip[aria-pressed="true"] {
282
282
  background: var(--color-background-selected);
283
- border-color: var(--color-brand-secondary-200);
283
+ border-color: var(--color-brand-border);
284
284
  color: var(--color-foreground-brand);
285
285
  font-weight: var(--w-semibold);
286
286
  }
@@ -58,6 +58,7 @@
58
58
  font-family: var(--font-sans);
59
59
  font-size: var(--fs-xxs); font-weight: var(--w-semibold);
60
60
  color: var(--color-foreground-muted);
61
+ opacity: 0.7;
61
62
  letter-spacing: var(--ls-caps); text-transform: uppercase;
62
63
  }
63
64
 
@@ -66,7 +67,7 @@
66
67
  padding: 8px 10px; margin: 3px 10px;
67
68
  height: 36px; box-sizing: border-box;
68
69
  border-radius: var(--radius-sm);
69
- color: var(--color-foreground-secondary);
70
+ color: var(--color-foreground-default);
70
71
  font-size: var(--fs-md); font-weight: var(--w-medium);
71
72
  cursor: pointer; position: relative;
72
73
  white-space: nowrap; overflow: hidden;
@@ -81,10 +82,10 @@
81
82
  .sb-item.active::before {
82
83
  content: ""; position: absolute; left: -10px; top: 9px; bottom: 9px;
83
84
  width: 2px; border-radius: var(--radius-pill);
84
- background: var(--color-brand-secondary-500);
85
+ background: var(--color-brand-solid);
85
86
  }
86
87
  .sb-item .ic { width: 15px; height: 15px; stroke-width: var(--icon-stroke); flex-shrink: 0; opacity: 0.85; }
87
- .sb-item.active .ic { color: var(--color-brand-secondary-500); opacity: 1; }
88
+ .sb-item.active .ic { color: var(--color-brand-solid); opacity: 1; }
88
89
  .sb-item .label { flex: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
89
90
  .sb-item.disabled { color: var(--color-foreground-placeholder); cursor: not-allowed; }
90
91
  .sb-item.disabled:hover { background: transparent; }
@@ -94,7 +95,7 @@
94
95
  font-family: var(--font-sans); font-size: 9px; font-weight: var(--w-bold);
95
96
  letter-spacing: .06em; line-height: 1.4;
96
97
  padding: 1px var(--space-2-5); border-radius: var(--radius-pill);
97
- background: var(--color-brand-secondary-500); color: var(--color-pure-white);
98
+ background: var(--color-brand-solid); color: var(--color-brand-on-solid);
98
99
  }
99
100
  .sb-badge.alert { background: var(--color-danger-500); }
100
101
  .sb-badge.warning { background: var(--color-warning-500); }
@@ -104,7 +105,7 @@
104
105
  background: var(--color-background-subtle);
105
106
  padding: 1px 6px; border-radius: var(--radius-xs);
106
107
  }
107
- .sb-item.active .sb-count { background: color-mix(in srgb, var(--color-brand-secondary-200) 70%, transparent); color: var(--color-brand-secondary-700); }
108
+ .sb-item.active .sb-count { background: var(--color-brand-subtle); color: var(--color-brand-text); }
108
109
 
109
110
  /* Footer — user mini-card */
110
111
  .sb-foot {
@@ -115,7 +116,7 @@
115
116
  }
116
117
  .sb-foot .avatar {
117
118
  width: 26px; height: 26px; border-radius: var(--radius-pill);
118
- background: var(--color-brand-secondary-500); color: var(--color-pure-white);
119
+ background: var(--color-brand-solid); color: var(--color-brand-on-solid);
119
120
  font-size: 10px; font-weight: var(--w-bold);
120
121
  display: inline-flex; align-items: center; justify-content: center; flex-shrink: 0;
121
122
  }
@@ -124,6 +125,18 @@
124
125
  .sb-foot .meta .role { font-size: var(--fs-xxs); color: var(--color-foreground-muted); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
125
126
  .sb-foot .logout { color: var(--color-foreground-muted); cursor: pointer; flex-shrink: 0; display: inline-flex; }
126
127
  .sb-foot .logout svg, .sb-foot .logout i { width: 14px; height: 14px; stroke-width: var(--icon-stroke); }
128
+ /* Card variant — enclosed footer that reads as a distinct card and stacks the
129
+ company under the name (mirrors the top-bar account control). Use .co for the
130
+ company line. Consumed via AppSidebar's `foot` slot: <div class="sb-foot sb-foot-card">. */
131
+ .sb-foot-card {
132
+ margin: var(--space-3);
133
+ padding: var(--space-3);
134
+ border: 1px solid var(--color-border-default);
135
+ border-radius: var(--shape-container);
136
+ background: var(--color-background-surface);
137
+ }
138
+ .sb-foot-card .meta { display: flex; flex-direction: column; line-height: 1.3; }
139
+ .sb-foot-card .meta .co { font-size: var(--fs-xxs); color: var(--color-foreground-muted); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
127
140
 
128
141
  /* ===== Collapsed (60px icon rail) ===== */
129
142
  .sb.collapsed { width: 60px; }
@@ -169,7 +182,7 @@
169
182
  .sb-children .sb-subitem:hover { background: var(--color-background-hover); color: var(--color-foreground-default); }
170
183
  .sb-children .sb-subitem:hover::before { opacity: 1; background: var(--color-foreground-muted); }
171
184
  .sb-children .sb-subitem.active { color: var(--color-foreground-brand); font-weight: var(--w-semibold); background: var(--color-background-selected); }
172
- .sb-children .sb-subitem.active::before { background: var(--color-brand-secondary-500); opacity: 1; }
185
+ .sb-children .sb-subitem.active::before { background: var(--color-brand-solid); opacity: 1; }
173
186
  .sb-children .sb-subitem .count, .sb-children .sb-subitem .sb-count {
174
187
  margin-left: auto;
175
188
  font-family: var(--font-mono); font-size: var(--fs-xxs);
@@ -18,7 +18,7 @@
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); }
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); }
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); }
@@ -32,7 +32,7 @@
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-secondary-50); color: var(--color-brand-secondary-700); }
35
+ .ss-list-item .icon-leading.brand { background: var(--color-brand-subtle-solid); color: var(--color-brand-text); }
36
36
  .ss-list-item .text { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 1px; }
37
37
  .ss-list-item .text .label { font-size: var(--fs-sm); font-weight: var(--w-semibold); 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; }
@@ -56,7 +56,7 @@
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
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: color-mix(in srgb, var(--color-brand-secondary-500) 12%, transparent); padding: 1px var(--space-2); border-radius: var(--radius-xs); }
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); }
60
60
 
61
61
  /* ID type-picker buttons */
62
62
  .ss-typebtns { display: flex; flex-direction: column; gap: var(--space-2); padding: 0 var(--space-2); }
@@ -131,7 +131,7 @@
131
131
  .pill.solid.danger { background: var(--color-danger-500); color: var(--color-pure-white); border-color: transparent; }
132
132
  .pill.solid.info { background: var(--color-info-500); color: var(--color-pure-white); border-color: transparent; }
133
133
  .pill.solid.neutral { background: var(--color-neutral-700); color: var(--color-pure-white); border-color: transparent; }
134
- .pill.solid.brand { background: var(--color-brand-secondary-500); color: var(--color-foreground-on-solid); border-color: transparent; }
134
+ .pill.solid.brand { background: var(--color-brand-solid); color: var(--color-brand-on-solid); border-color: transparent; }
135
135
  .pill.solid > .dot { background: currentColor; }
136
136
 
137
137
  .pill.outline.success { background: transparent; color: var(--color-feedback-success-foreground); border-color: var(--color-success-500); }
@@ -139,7 +139,7 @@
139
139
  .pill.outline.danger { background: transparent; color: var(--color-feedback-danger-foreground); border-color: var(--color-danger-500); }
140
140
  .pill.outline.info { background: transparent; color: var(--color-feedback-info-foreground); border-color: var(--color-info-500); }
141
141
  .pill.outline.neutral { background: transparent; color: var(--color-foreground-secondary); border-color: var(--color-border-strong); }
142
- .pill.outline.brand { background: transparent; color: var(--color-foreground-accent); border-color: var(--color-brand-secondary-500); }
142
+ .pill.outline.brand { background: transparent; color: var(--color-foreground-accent); border-color: var(--color-brand-solid); }
143
143
 
144
144
 
145
145
  /* ----------------------------------------------------------------
@@ -54,7 +54,7 @@
54
54
  .dt-wrap {
55
55
  background: var(--color-background-surface);
56
56
  border: 1px solid var(--color-border-default);
57
- border-radius: var(--radius-md);
57
+ border-radius: var(--shape-container);
58
58
  overflow: hidden;
59
59
  box-shadow: var(--shadow-xs);
60
60
  }
@@ -138,8 +138,8 @@
138
138
  .dt-pagination .page-btn:hover { background: var(--color-background-hover); color: var(--color-foreground-default); }
139
139
  .dt-pagination .page-btn:disabled { opacity: 0.4; cursor: not-allowed; }
140
140
  .dt-pagination .page-btn.is-current {
141
- background: color-mix(in srgb, var(--color-brand-accent-500) 14%, transparent);
142
- border-color: color-mix(in srgb, var(--color-brand-accent-500) 36%, transparent);
141
+ background: var(--color-accent-subtle);
142
+ border-color: color-mix(in srgb, var(--color-accent-solid) 36%, transparent);
143
143
  color: var(--color-foreground-accent);
144
144
  }
145
145
  .dt-pagination .page-btn > i, .dt-pagination .page-btn > svg,
@@ -16,7 +16,7 @@
16
16
  -webkit-backdrop-filter: var(--glass-blur);
17
17
  backdrop-filter: var(--glass-blur);
18
18
  border: var(--glass-border);
19
- border-radius: var(--radius-md);
19
+ border-radius: var(--shape-container);
20
20
  box-shadow: var(--shadow-glass), var(--shadow-lg);
21
21
  font-family: var(--font-sans);
22
22
  font-size: var(--fs-sm);
@@ -80,7 +80,7 @@
80
80
  /* Avatar chip */
81
81
  .tb-avatar {
82
82
  width: 30px; height: 30px; border-radius: var(--radius-pill);
83
- background: var(--color-brand-secondary-500); color: var(--color-pure-white);
83
+ background: var(--color-brand-solid); color: var(--color-brand-on-solid);
84
84
  font-size: var(--fs-xs); font-weight: var(--w-bold);
85
85
  display: inline-flex; align-items: center; justify-content: center;
86
86
  flex-shrink: 0; margin-left: var(--space-1);
@@ -1,14 +1,14 @@
1
1
  /* @attrus/cabiros — design tokens + type classes (concatenated).
2
2
  Generated by scripts/build.mjs from src/tokens/ and src/typography/. */
3
3
 
4
- /* ============================================================
5
- ATTRUS / Cabiros — BASE PALETTE (raw color tokens)
6
- The primitive layer. Theme-agnostic. Referenced only by the
7
- semantic layer (color-semantic.css) and effect layers — never
8
- consumed directly by components.
9
- ============================================================ */
4
+ /* AUTO-GENERATED by tools/sync-to-ds.cjs from Cabiros/colors_and_type.css.
5
+ Edit the source there, then re-run the sync — do not hand-edit this file. */
10
6
 
11
7
  :root {
8
+ /* ============================================================
9
+ 1. BASE PALETTE — raw color tokens
10
+ ============================================================ */
11
+
12
12
  /* --- Brand (from manual: Lato + 4 HEX stops) --- */
13
13
  --brand-attrus-ink: #0F0F1A; /* almost-black, blue-tinted */
14
14
  --brand-attrus-navy: #002142; /* deep navy */
@@ -143,15 +143,16 @@
143
143
  --color-info-900: #072951;
144
144
  }
145
145
 
146
- /* ============================================================
147
- ATTRUS / Cabiros — SEMANTIC COLOR TOKENS
148
- Reference the base palette (palette.css). This is the layer
149
- components consume.
150
- Roles: default | secondary | muted | accent | placeholder
151
- Contexts: fg (text/icon), bg (surface), br (border)
152
- ============================================================ */
146
+ /* AUTO-GENERATED by tools/sync-to-ds.cjs from Cabiros/colors_and_type.css.
147
+ Edit the source there, then re-run the sync — do not hand-edit this file. */
153
148
 
154
149
  :root {
150
+ /* ============================================================
151
+ 2. SEMANTIC TOKENS — reference the base palette
152
+ Roles: default | secondary | muted | accent | placeholder
153
+ Contexts: fg (text/icon), bg (surface), br (border)
154
+ ============================================================ */
155
+
155
156
  /* Default (light) theme — the 60% whites/light grays */
156
157
  --color-background-canvas: var(--color-neutral-25); /* app background */
157
158
  --color-background-surface: var(--color-neutral-0); /* card / container */
@@ -169,23 +170,27 @@
169
170
  component fill, text and tint reads from these, so swapping them reskins the
170
171
  whole catalog with no per-component edits. Primer/Spectrum-style aliasing.
171
172
 
172
- The two axes stay orthogonal:
173
+ Defaults below = today's Cabiros values (Royal solid, Sky accent), so these
174
+ are ADDITIVE — introducing them changes nothing until components migrate
175
+ (Phase 2). The two axes stay orthogonal:
173
176
  • PRODUCT axis → matiz: this set + the brand/accent scales, logo, hero grad.
174
177
  • THEME axis (light/dark) → surface ramp + tint intensity. NEVER matiz.
178
+ A product that needs a SURFACE token is not a sub-brand — it is a separate
179
+ system (see preview/theming.html for the full contract).
175
180
 
176
- Brand = institutional / primary action. */
177
- --color-brand-solid: var(--color-brand-primary-500); /* Enterprise primary — ATTRUS Navy #002142 (buttons, avatars, toggles, badges, hero) */
181
+ Brand = institutional / primary action (Royal). */
182
+ --color-brand-solid: var(--color-brand-primary-500); /* Enterprise primary — ATTRUS Navy #002142 (buttons, avatars, toggles, badges, hero) */
178
183
  --color-brand-solid-hover: color-mix(in srgb, var(--color-pure-white) 12%, var(--color-brand-primary-500)); /* navy is near-ink → states LIGHTEN */
179
184
  --color-brand-solid-active: color-mix(in srgb, var(--color-pure-white) 6%, var(--color-brand-primary-500));
180
- --color-brand-text: var(--color-brand-primary-500); /* navy as text — 15:1 on white */
181
- --color-brand-text-strong: var(--color-brand-primary-700); /* brand text pressed/emphasis */
182
- --color-brand-subtle: color-mix(in srgb, var(--color-brand-primary-500) 12%, transparent); /* tints: brand chips, selected, tags */
185
+ --color-brand-text: var(--color-brand-primary-500); /* navy as text — 15:1 on white */
186
+ --color-brand-text-strong: var(--color-brand-primary-700); /* brand text pressed/emphasis */
187
+ --color-brand-subtle: color-mix(in srgb, var(--color-brand-primary-500) 12%, transparent); /* tints: brand chips, selected, tags */
183
188
  --color-brand-subtle-solid: var(--color-brand-primary-50); /* opaque light brand tint: brand avatars, selected-row base */
184
- --color-brand-border: var(--color-brand-primary-200); /* light brand border: selected filter chips */
185
- --color-brand-on-solid: var(--color-foreground-on-solid); /* text/icon on --color-brand-solid */
189
+ --color-brand-border: var(--color-brand-primary-200); /* light brand border: selected filter chips */
190
+ --color-brand-on-solid: var(--color-foreground-on-solid); /* text/icon on --color-brand-solid */
186
191
  /* Accent = interactive / wayfinding (Sky). accent text = --color-foreground-accent. */
187
- --color-accent-solid: var(--color-brand-accent-500); /* tab/active indicator, focus ring */
188
- --color-accent-subtle: color-mix(in srgb, var(--color-brand-accent-500) 14%, transparent); /* counts, pagination, accent chips */
192
+ --color-accent-solid: var(--color-brand-accent-500); /* tab/active indicator, focus ring */
193
+ --color-accent-subtle: color-mix(in srgb, var(--color-brand-accent-500) 14%, transparent); /* counts, pagination, accent chips */
189
194
 
190
195
  /* ─────────────────────────────────────────────────────────────────────────
191
196
  INVERSE LAYER — contextual contrast surface, NOT dark theme
@@ -210,7 +215,7 @@
210
215
  ✗ Mixing inverse and surface tokens in the same component without intent
211
216
  ✗ Hard-coding #0B1230 / white instead of inverse tokens
212
217
  ───────────────────────────────────────────────────────────────────────── */
213
- --color-background-inverse: color-mix(in srgb, var(--color-brand-solid) 16%, var(--color-ink-base)); /* product-tinted dark panel */
218
+ --color-background-inverse: color-mix(in srgb, var(--color-brand-solid) 16%, var(--color-ink-base)); /* product-tinted dark panel (Enterprise≈navy, Business≈blue) */
214
219
  --color-background-inverse-surface: color-mix(in srgb, var(--color-brand-solid) 20%, var(--color-ink-raised));
215
220
  --color-background-inverse-subtle: color-mix(in srgb, var(--color-brand-solid) 12%, var(--color-ink-deep));
216
221
  --color-background-inverse-hover: var(--color-ink-hover);
@@ -300,63 +305,67 @@
300
305
  --color-feedback-info-foreground-on-inverse-muted: color-mix(in srgb, var(--color-info-100) 70%, var(--color-foreground-inverse-muted));
301
306
  }
302
307
 
303
- /* ============================================================
304
- ATTRUS / Cabiros — GRADIENTS (primary brand + layers)
305
- ============================================================ */
308
+ /* AUTO-GENERATED by tools/sync-to-ds.cjs from Cabiros/colors_and_type.css.
309
+ Edit the source there, then re-run the sync — do not hand-edit this file. */
306
310
 
307
- /* Brand gradients — DERIVED from --color-brand-solid so they follow the
308
- active product automatically (Enterprise Navy / Business Blue / …). The
309
- var() resolves at use-site, so an element under [data-product] recomputes
310
- these with that product's primary — no per-product override needed.
311
- --grad-brand tips into the shared Sky accent. */
312
311
  :root {
312
+ /* ============================================================
313
+ 3. GRADIENTS — primary brand + layers
314
+ ============================================================ */
315
+ /* Brand gradients — DERIVED from --color-brand-solid so they follow the
316
+ active product automatically (Enterprise Navy / Business Blue / …). The
317
+ var() resolves at use-site, so an element under [data-product] recomputes
318
+ these with that product's primary — no per-product override needed.
319
+ --grad-brand tips into the shared Sky accent. */
313
320
  --grad-brand: linear-gradient(135deg,
314
321
  color-mix(in srgb, var(--color-pure-black) 45%, var(--color-brand-solid)) 0%,
315
322
  var(--color-brand-solid) 55%,
316
- var(--color-accent-solid) 100%);
323
+ var(--color-accent-solid) 100%); /* @kind color */
317
324
  --grad-brand-soft: linear-gradient(135deg,
318
325
  var(--color-brand-solid) 0%,
319
- color-mix(in srgb, var(--color-pure-black) 20%, var(--color-brand-solid)) 100%);
326
+ color-mix(in srgb, var(--color-pure-black) 20%, var(--color-brand-solid)) 100%); /* @kind color */
320
327
  --grad-ink: linear-gradient(160deg,
321
328
  color-mix(in srgb, var(--color-pure-black) 68%, var(--color-brand-solid)) 0%,
322
329
  color-mix(in srgb, var(--color-pure-black) 45%, var(--color-brand-solid)) 55%,
323
- color-mix(in srgb, var(--color-pure-black) 25%, var(--color-brand-solid)) 100%);
330
+ color-mix(in srgb, var(--color-pure-black) 25%, var(--color-brand-solid)) 100%); /* @kind color */
324
331
  --grad-hero: linear-gradient(180deg,
325
332
  color-mix(in srgb, var(--color-pure-black) 52%, var(--color-brand-solid)) 0%,
326
- color-mix(in srgb, var(--color-pure-black) 18%, var(--color-brand-solid)) 100%);
333
+ color-mix(in srgb, var(--color-pure-black) 18%, var(--color-brand-solid)) 100%); /* @kind color */
327
334
  --grad-sheen: linear-gradient(120deg,
328
335
  color-mix(in srgb, var(--color-pure-white) 14%, transparent) 0%,
329
336
  color-mix(in srgb, var(--color-pure-white) 0%, transparent) 40%,
330
337
  color-mix(in srgb, var(--color-pure-white) 0%, transparent) 60%,
331
- color-mix(in srgb, var(--color-pure-white) 8%, transparent) 100%);
338
+ color-mix(in srgb, var(--color-pure-white) 8%, transparent) 100%); /* @kind color */
332
339
  --grad-surface-top: linear-gradient(180deg,
333
340
  color-mix(in srgb, var(--color-pure-white) 65%, transparent) 0%,
334
- color-mix(in srgb, var(--color-pure-white) 0%, transparent) 100%);
341
+ color-mix(in srgb, var(--color-pure-white) 0%, transparent) 100%); /* @kind color */
335
342
  --grad-radial-glow: radial-gradient(1200px 500px at 20% -10%,
336
343
  color-mix(in srgb, var(--color-accent-solid) 25%, transparent) 0%,
337
- color-mix(in srgb, var(--color-accent-solid) 0%, transparent) 60%);
344
+ color-mix(in srgb, var(--color-accent-solid) 0%, transparent) 60%); /* @kind color */
338
345
  --grad-data-pos: linear-gradient(180deg,
339
346
  color-mix(in srgb, var(--color-success-500) 35%, transparent) 0%,
340
- color-mix(in srgb, var(--color-success-500) 0%, transparent) 100%);
347
+ color-mix(in srgb, var(--color-success-500) 0%, transparent) 100%); /* @kind color */
341
348
  --grad-data-neg: linear-gradient(180deg,
342
349
  color-mix(in srgb, var(--color-danger-500) 35%, transparent) 0%,
343
- color-mix(in srgb, var(--color-danger-500) 0%, transparent) 100%);
350
+ color-mix(in srgb, var(--color-danger-500) 0%, transparent) 100%); /* @kind color */
344
351
  --grad-data-brand: linear-gradient(180deg,
345
352
  color-mix(in srgb, var(--color-brand-accent-500) 30%, transparent) 0%,
346
- color-mix(in srgb, var(--color-brand-accent-500) 0%, transparent) 100%);
353
+ color-mix(in srgb, var(--color-brand-accent-500) 0%, transparent) 100%); /* @kind color */
347
354
  }
348
355
 
349
- /* ============================================================
350
- ATTRUS / Cabiros — DATA VISUALIZATION (chart palettes & structure)
351
- Categorical = qualitative series (distinct, on-brand, cool).
352
- Sequential = single-hue magnitude ramp (Sky).
353
- Diverging = danger ← neutral → success (variance/heatmap).
354
- Structure = grid / axis / track / reference (semantic → theme).
355
- Categorical gets dark-theme overrides (lift the dark hues, in
356
- theme-dark.css); ramps + structure follow semantic tokens.
357
- ============================================================ */
356
+ /* AUTO-GENERATED by tools/sync-to-ds.cjs from Cabiros/colors_and_type.css.
357
+ Edit the source there, then re-run the sync — do not hand-edit this file. */
358
358
 
359
359
  :root {
360
+ /* ============================================================
361
+ 3b. DATA VISUALIZATION — chart palettes & structure
362
+ Categorical = qualitative series (distinct, on-brand, cool).
363
+ Sequential = single-hue magnitude ramp (Sky).
364
+ Diverging = danger ← neutral → success (variance/heatmap).
365
+ Structure = grid / axis / track / reference (semantic → theme).
366
+ Categorical gets dark-theme overrides (lift the dark hues);
367
+ ramps + structure follow semantic tokens automatically.
368
+ ============================================================ */
360
369
  /* Categorical — order chosen for max adjacent contrast */
361
370
  --dataviz-cat-1: #003399; /* Royal — brand-anchored series 1 */
362
371
  --dataviz-cat-2: #3399FF; /* Sky */
@@ -397,12 +406,14 @@
397
406
  --dataviz-reference: var(--color-foreground-muted); /* dashed target/avg line */
398
407
  }
399
408
 
400
- /* ============================================================
401
- ATTRUS / Cabiros — LIQUID GLASS (transparent / frosted layers)
402
- Use with backdrop-filter: blur().
403
- ============================================================ */
409
+ /* AUTO-GENERATED by tools/sync-to-ds.cjs from Cabiros/colors_and_type.css.
410
+ Edit the source there, then re-run the sync — do not hand-edit this file. */
404
411
 
405
412
  :root {
413
+ /* ============================================================
414
+ 4. LIQUID GLASS — transparent / frosted layers
415
+ Use with backdrop-filter: blur().
416
+ ============================================================ */
406
417
  --glass-white: color-mix(in srgb, var(--color-pure-white) 58%, transparent);
407
418
  --glass-white-hi: color-mix(in srgb, var(--color-pure-white) 78%, transparent);
408
419
  --glass-white-lo: color-mix(in srgb, var(--color-pure-white) 38%, transparent);
@@ -410,19 +421,23 @@
410
421
  --glass-ink: color-mix(in srgb, var(--color-background-inverse) 55%, transparent); /* dark navy */
411
422
  --glass-ink-hi: color-mix(in srgb, var(--color-background-inverse) 78%, transparent);
412
423
  --glass-ink-lo: color-mix(in srgb, var(--color-background-inverse) 35%, transparent);
413
- --glass-blur: saturate(140%) blur(18px);
414
- --glass-blur-sm: saturate(130%) blur(10px);
415
- --glass-blur-lg: saturate(160%) blur(28px);
424
+ /* Theme-aware frosted chrome (drawer/modal header+footer): white glass in light,
425
+ ink glass in dark. Use this — NOT raw --glass-white — on themed chrome. */
426
+ --glass-chrome: var(--glass-white);
427
+ --glass-blur: saturate(140%) blur(18px); /* @kind other */
428
+ --glass-blur-sm: saturate(130%) blur(10px); /* @kind other */
429
+ --glass-blur-lg: saturate(160%) blur(28px); /* @kind other */
416
430
  --glass-border: 1px solid color-mix(in srgb, var(--color-pure-white) 45%, transparent);
417
431
  --glass-border-dark: 1px solid color-mix(in srgb, var(--color-pure-white) 10%, transparent);
418
432
  }
419
433
 
420
- /* ============================================================
421
- ATTRUS / Cabiros — RADII
422
- Mostly softly rounded; buttons fully rounded.
423
- ============================================================ */
434
+ /* AUTO-GENERATED by tools/sync-to-ds.cjs from Cabiros/colors_and_type.css.
435
+ Edit the source there, then re-run the sync — do not hand-edit this file. */
424
436
 
425
437
  :root {
438
+ /* ============================================================
439
+ 5. RADII — mostly softly rounded; buttons fully rounded
440
+ ============================================================ */
426
441
  --radius-2xs: 2px; /* never-square minimum — tiny chips, ticks, dividers */
427
442
  --radius-xs: 4px;
428
443
  --radius-sm: 6px;
@@ -434,13 +449,27 @@
434
449
  --radius-xl: 20px; /* hero / large panels */
435
450
  --radius-2xl: 28px;
436
451
  --radius-pill: 999px; /* BUTTONS — fully rounded */
452
+
453
+ /* ─────────────────────────────────────────────────────────────────────────
454
+ SHAPE — product axis (roundness of the product surface)
455
+ ─────────────────────────────────────────────────────────────────────────
456
+ A product theme (`[data-product]`) may redefine these to read sharper or
457
+ softer — they PICK a step from the raw --radius-* scale (never a raw px),
458
+ so the scale stays the single source and the linter can enforce it.
459
+ Defaults below = today's values (value-preserving). Buttons stay pill by
460
+ deliberate brand stance (own token, not shape-themable here). */
461
+ --shape-control: var(--radius-sm); /* inputs, select, segmented, file trigger, number-input */
462
+ --shape-container: var(--radius-md); /* cards, stat tiles, table wrapper, toast, drawer-lead */
463
+ --shape-overlay: var(--radius-lg); /* modals, drawer panels, large surfaces */
437
464
  }
438
465
 
439
- /* ============================================================
440
- ATTRUS / Cabiros — SHADOWS (soft, blue-tinted, multi-layer)
441
- ============================================================ */
466
+ /* AUTO-GENERATED by tools/sync-to-ds.cjs from Cabiros/colors_and_type.css.
467
+ Edit the source there, then re-run the sync — do not hand-edit this file. */
442
468
 
443
469
  :root {
470
+ /* ============================================================
471
+ 6. SHADOWS — soft, blue-tinted, multi-layer
472
+ ============================================================ */
444
473
  --shadow-xs: 0 1px 2px color-mix(in srgb, var(--color-shadow-tint) 5%, transparent);
445
474
  --shadow-sm: 0 1px 2px color-mix(in srgb, var(--color-shadow-tint) 6%, transparent),
446
475
  0 2px 6px color-mix(in srgb, var(--color-shadow-tint) 4%, transparent);
@@ -484,12 +513,13 @@
484
513
  0 10px 40px color-mix(in srgb, var(--color-pure-black) 35%, transparent);
485
514
  }
486
515
 
487
- /* ============================================================
488
- ATTRUS / Cabiros — SPACING
489
- 4px base; dense, data-heavy layouts.
490
- ============================================================ */
516
+ /* AUTO-GENERATED by tools/sync-to-ds.cjs from Cabiros/colors_and_type.css.
517
+ Edit the source there, then re-run the sync — do not hand-edit this file. */
491
518
 
492
519
  :root {
520
+ /* ============================================================
521
+ 7. SPACING — 4px base; dense, data-heavy layouts
522
+ ============================================================ */
493
523
  --space-0: 0;
494
524
  --space-1: 2px;
495
525
  --space-2: 4px;
@@ -509,11 +539,13 @@
509
539
  --space-16: 96px;
510
540
  }
511
541
 
512
- /* ============================================================
513
- ATTRUS / Cabiros — ICONOGRAPHY (Lucide; sized to pair with type scale)
514
- ============================================================ */
542
+ /* AUTO-GENERATED by tools/sync-to-ds.cjs from Cabiros/colors_and_type.css.
543
+ Edit the source there, then re-run the sync — do not hand-edit this file. */
515
544
 
516
545
  :root {
546
+ /* ============================================================
547
+ 7b. ICONOGRAPHY — Lucide; sized to pair with type scale
548
+ ============================================================ */
517
549
  --icon-xs: 12px; /* helper text, micro caption (paired w/ 11–12px text) */
518
550
  --icon-sm: 14px; /* input affix, dense inline (paired w/ 13px text) */
519
551
  --icon-md: 16px; /* default — buttons, nav, body (paired w/ 14px text) */
@@ -521,54 +553,56 @@
521
553
  --icon-xl: 24px; /* hero, empty states, splash (paired w/ 18+ text) */
522
554
 
523
555
  /* Stroke widths — Lucide */
524
- --icon-stroke: 1.75; /* default — slightly bolder than 1.5, calmer than 2 */
556
+ --icon-stroke: 1.75; /* @kind other */ /* default — slightly bolder than 1.5, calmer than 2 */
525
557
  --icon-stroke-bold: 2; /* close buttons, X marks, indicators where weight matters */
526
558
  --icon-stroke-thin: 1.5; /* decorative / large hero icons where 1.75 looks heavy */
527
559
  }
528
560
 
529
- /* ============================================================
530
- ATTRUS / Cabiros — MOTION (durations + easings for transitions/animations)
531
- ============================================================ */
561
+ /* AUTO-GENERATED by tools/sync-to-ds.cjs from Cabiros/colors_and_type.css.
562
+ Edit the source there, then re-run the sync — do not hand-edit this file. */
532
563
 
533
564
  :root {
565
+ /* ============================================================
566
+ 7c. MOTION — durations + easings for transitions/animations
567
+ ============================================================ */
534
568
  /* Easing — single curve across the system; "out-expo-ish" for snappy UI */
535
- --ease-standard: cubic-bezier(.2, .8, .2, 1);
536
- --ease-emphasis: cubic-bezier(.2, .9, .15, 1); /* slightly more overshoot — for entries */
537
- --ease-linear: linear; /* loading bars, scrubbers */
569
+ --ease-standard: cubic-bezier(.2, .8, .2, 1); /* @kind other */
570
+ --ease-emphasis: cubic-bezier(.2, .9, .15, 1); /* @kind other */ /* slightly more overshoot — for entries */
571
+ --ease-linear: linear; /* @kind other */ /* loading bars, scrubbers */
538
572
 
539
573
  /* Durations — paired with --ease-standard unless noted */
540
- --duration-instant: 80ms; /* micro feedback (tap echo) */
541
- --duration-fast: 140ms; /* hover, focus, color shifts */
542
- --duration-base: 200ms; /* default for most UI */
543
- --duration-slow: 320ms; /* expansions, reveals */
544
- --duration-slower: 480ms; /* page-level transitions */
545
- --duration-deliberate: 640ms; /* overlays — modal/drawer entry */
574
+ --duration-instant: 80ms; /* @kind other */ /* micro feedback (tap echo) */
575
+ --duration-fast: 140ms; /* @kind other */ /* hover, focus, color shifts */
576
+ --duration-base: 200ms; /* @kind other */ /* default for most UI */
577
+ --duration-slow: 320ms; /* @kind other */ /* expansions, reveals */
578
+ --duration-slower: 480ms; /* @kind other */ /* page-level transitions */
579
+ --duration-deliberate: 640ms; /* @kind other */ /* overlays — modal/drawer entry */
546
580
 
547
581
  /* Pre-composed transition shorthand (most common cases) */
548
- --transition-fast: 140ms var(--ease-standard); /* default for buttons/inputs */
549
- --transition-base: 200ms var(--ease-standard);
550
- --transition-slow: 320ms var(--ease-standard);
582
+ --transition-fast: 140ms var(--ease-standard); /* @kind other */ /* default for buttons/inputs */
583
+ --transition-base: 200ms var(--ease-standard); /* @kind other */
584
+ --transition-slow: 320ms var(--ease-standard); /* @kind other */
551
585
  }
552
586
 
553
- /* ============================================================
554
- ATTRUS / Cabiros — TYPOGRAPHY TOKENS (Lato family per brand manual)
555
- Font families, weights, type scale, line heights, letter spacing.
556
- Ready-to-use type CLASSES live in ../typography/index.css.
557
- ============================================================ */
587
+ /* AUTO-GENERATED by tools/sync-to-ds.cjs from Cabiros/colors_and_type.css.
588
+ Edit the source there, then re-run the sync — do not hand-edit this file. */
558
589
 
559
590
  :root {
591
+ /* ============================================================
592
+ 8. TYPOGRAPHY — Lato family per brand manual
593
+ ============================================================ */
560
594
  --font-sans: 'Lato', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
561
595
  --font-mono: 'JetBrains Mono', 'SF Mono', ui-monospace, Menlo, Consolas, monospace;
562
596
  --font-display: 'Lato', -apple-system, BlinkMacSystemFont, sans-serif;
563
597
 
564
598
  /* Weights (per manual) */
565
- --w-light: 300;
566
- --w-regular: 400;
567
- --w-medium: 500; /* Lato doesn't ship 500 natively; maps to 400 */
568
- --w-semibold: 600;
569
- --w-bold: 700;
570
- --w-extrabold: 800;
571
- --w-black: 900;
599
+ --w-light: 300; /* @kind font */
600
+ --w-regular: 400; /* @kind font */
601
+ --w-medium: 500; /* @kind font */ /* Lato doesn't ship 500 natively; maps to 400 */
602
+ --w-semibold: 600; /* @kind font */
603
+ --w-bold: 700; /* @kind font */
604
+ --w-extrabold: 800; /* @kind font */
605
+ --w-black: 900; /* @kind font */
572
606
 
573
607
  /* Type scale (px) */
574
608
  --fs-xxs: 10px;
@@ -587,31 +621,22 @@
587
621
  --fs-8xl: 72px;
588
622
 
589
623
  /* Line heights */
590
- --lh-tight: 1.15;
591
- --lh-snug: 1.3;
592
- --lh-normal: 1.5;
593
- --lh-relaxed: 1.65;
624
+ --lh-tight: 1.15; /* @kind font */
625
+ --lh-snug: 1.3; /* @kind font */
626
+ --lh-normal: 1.5; /* @kind font */
627
+ --lh-relaxed: 1.65; /* @kind font */
594
628
 
595
629
  /* Letter spacing — per Lato manual rules */
596
- --ls-display: -0.03em; /* 32–80px headlines */
597
- --ls-tight: -0.01em; /* large numerics / stat values — between display and body */
598
- --ls-title: -0.015em; /* 16–32px titles (manual says -5%, but -5% looks tight on screens; using -1.5%) */
599
- --ls-body: 0em; /* <16px body */
600
- --ls-label: 0.02em; /* small caps / labels */
601
- --ls-caps: 0.08em;
630
+ --ls-display: -0.03em; /* @kind font */ /* 32–80px headlines */
631
+ --ls-tight: -0.01em; /* @kind font */ /* large numerics / stat values — between display and body */
632
+ --ls-title: -0.015em; /* @kind font */ /* 16–32px titles (manual says -5%, but -5% looks tight on screens; using -1.5%) */
633
+ --ls-body: 0em; /* @kind font */ /* <16px body */
634
+ --ls-label: 0.02em; /* @kind font */ /* small caps / labels */
635
+ --ls-caps: 0.08em; /* @kind font */
602
636
  }
603
637
 
604
- /* ============================================================
605
- ATTRUS / Cabiros — DARK THEME
606
- [data-theme="dark"] remaps the AMBIENT semantic tokens to a dark
607
- ink ramp. Components consume semantic tokens, so they flip
608
- automatically — no per-component dark CSS needed.
609
- Philosophy: the INVERSE layer stays a deliberate, brand-tinted
610
- dark even here (see note in color-semantic.css), distinct from the
611
- ambient surface. Raw palette + brand/accent scales are theme-agnostic.
612
- Toggle via JS: set data-theme on <html>, persist to localStorage,
613
- seed from prefers-color-scheme.
614
- ============================================================ */
638
+ /* AUTO-GENERATED by tools/sync-to-ds.cjs from Cabiros/colors_and_type.css.
639
+ Edit the source there, then re-run the sync — do not hand-edit this file. */
615
640
 
616
641
  [data-theme="dark"] {
617
642
  color-scheme: dark;
@@ -670,7 +695,9 @@
670
695
  --color-feedback-info-border: color-mix(in srgb, var(--color-info-500) 34%, transparent);
671
696
 
672
697
  /* Surface-top sheen reads wrong on dark → neutralize */
673
- --grad-surface-top: linear-gradient(180deg, color-mix(in srgb, var(--color-pure-white) 6%, transparent) 0%, transparent 100%);
698
+ --grad-surface-top: linear-gradient(180deg, color-mix(in srgb, var(--color-pure-white) 6%, transparent) 0%, transparent 100%); /* @kind color */
699
+ /* Frosted chrome flips to ink glass on dark (drawer/modal header+footer) */
700
+ --glass-chrome: var(--glass-ink);
674
701
 
675
702
  /* Data-viz categorical — lift the dark hues so every series reads on dark ink.
676
703
  Ramps (seq/div) + structure follow the semantic tokens already remapped above. */
@@ -684,10 +711,11 @@
684
711
  --dataviz-cat-8: #A6B0C4; /* Slate, lightened */
685
712
  }
686
713
 
714
+ /* AUTO-GENERATED by tools/sync-to-ds.cjs from Cabiros/colors_and_type.css.
715
+ Edit the source there, then re-run the sync — do not hand-edit this file. */
716
+
687
717
  /* ============================================================
688
- ATTRUS / Cabiros — SEMANTIC TYPE CLASSES (ready-to-use)
689
- Base document styles + the display/heading/body/utility classes.
690
- Consumes typography + color tokens (see ../tokens).
718
+ 9. SEMANTIC TYPE CLASSES — ready-to-use
691
719
  ============================================================ */
692
720
 
693
721
  html, body {
@@ -740,3 +768,34 @@ h6, .h6 { font-weight: var(--w-semibold); font-size: var(--fs-lg); line-height:
740
768
  .inverse .color-foreground-muted { color: var(--color-foreground-inverse-muted); }
741
769
  .inverse .fg-accent { color: var(--color-foreground-inverse-accent); }
742
770
 
771
+
772
+ /* ---- doc-back link (fixed top-left on every preview page) ---- */
773
+ .doc-back {
774
+ position: fixed;
775
+ top: var(--space-5);
776
+ left: var(--space-5);
777
+ z-index: 1000;
778
+ display: inline-flex;
779
+ align-items: center;
780
+ gap: var(--space-2);
781
+ font-family: var(--font-sans);
782
+ font-size: var(--fs-sm);
783
+ font-weight: var(--w-semibold);
784
+ letter-spacing: 0;
785
+ text-transform: none;
786
+ color: var(--color-foreground-default);
787
+ text-decoration: none;
788
+ padding: var(--space-3) var(--space-4);
789
+ border: 1px solid var(--color-border-default);
790
+ border-radius: var(--radius-pill);
791
+ background: var(--color-background-surface);
792
+ box-shadow: var(--shadow-sm);
793
+ transition: var(--transition-fast);
794
+ }
795
+ .doc-back:hover {
796
+ color: var(--color-foreground-default);
797
+ border-color: var(--color-border-strong);
798
+ box-shadow: var(--shadow-md);
799
+ }
800
+ .doc-back svg, .doc-back i { width: 18px; height: 18px; stroke-width: var(--icon-stroke); }
801
+
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@attrus-ds/core",
3
- "version": "1.0.4",
3
+ "version": "1.0.6",
4
4
  "description": "ATTRUS / Cabiros design system — design tokens, component styles, brand assets, fonts and an optional typed React component layer.",
5
5
  "keywords": [
6
6
  "design-system",