@attrus-ds/core 0.3.1 → 1.0.2

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.
package/README.md CHANGED
@@ -22,6 +22,8 @@ What's inside:
22
22
  npm install @attrus-ds/core
23
23
  ```
24
24
 
25
+
26
+
25
27
  ## Usage
26
28
 
27
29
  ### Import everything
@@ -132,13 +132,13 @@
132
132
  4. VARIANTS
133
133
  ---------------------------------------------------------------- */
134
134
 
135
- /* PRIMARY — brand-blue solid */
135
+ /* PRIMARY — brand solid */
136
136
  .btn-primary {
137
- background: var(--color-brand-secondary-500);
138
- color: var(--color-foreground-on-solid);
137
+ background: var(--color-brand-solid);
138
+ color: var(--color-brand-on-solid);
139
139
  }
140
- .btn-primary:hover { background: var(--color-brand-secondary-600); }
141
- .btn-primary:active { background: var(--color-brand-secondary-700); }
140
+ .btn-primary:hover { background: var(--color-brand-solid-hover); }
141
+ .btn-primary:active { background: var(--color-brand-solid-active); }
142
142
  .btn-primary:focus-visible { box-shadow: var(--shadow-focus); }
143
143
 
144
144
 
@@ -184,8 +184,8 @@
184
184
  border-radius: var(--radius-2xs);
185
185
  text-decoration: none;
186
186
  }
187
- .btn-link:hover { color: var(--color-brand-secondary-700); text-decoration: underline; text-underline-offset: 2px; }
188
- .btn-link:active { color: var(--color-brand-secondary-800); }
187
+ .btn-link:hover { color: var(--color-brand-text); text-decoration: underline; text-underline-offset: 2px; }
188
+ .btn-link:active { color: var(--color-brand-text-strong); }
189
189
  .btn-link:focus-visible { box-shadow: var(--shadow-focus); }
190
190
 
191
191
 
@@ -223,9 +223,9 @@
223
223
  /* INVERSE — white pill on dark/brand surfaces */
224
224
  .btn-inverse {
225
225
  background: var(--color-pure-white);
226
- color: var(--color-brand-secondary-700);
226
+ color: var(--color-brand-text);
227
227
  }
228
- .btn-inverse:hover { background: var(--color-neutral-100); color: var(--color-brand-secondary-800); }
228
+ .btn-inverse:hover { background: var(--color-neutral-100); color: var(--color-brand-text-strong); }
229
229
  .btn-inverse:active { background: var(--color-neutral-150); }
230
230
  .btn-inverse:focus-visible { box-shadow: var(--shadow-focus-sky); }
231
231
 
@@ -12,7 +12,7 @@
12
12
  display: block;
13
13
  background: var(--color-background-surface);
14
14
  border: 1px solid var(--color-border-default);
15
- border-radius: var(--radius-md);
15
+ border-radius: var(--shape-container);
16
16
  box-shadow: var(--shadow-xs);
17
17
  color: var(--color-foreground-default);
18
18
  font-family: var(--font-sans);
@@ -103,7 +103,7 @@
103
103
  height: 40px;
104
104
  padding: 0 var(--space-4);
105
105
  border: 1px solid var(--color-border-default);
106
- border-radius: var(--radius-sm);
106
+ border-radius: var(--shape-control);
107
107
  background: var(--color-background-surface);
108
108
  color: var(--color-foreground-default);
109
109
 
@@ -241,7 +241,7 @@ textarea.input.input-lg { height: auto; min-height: 120px; padding: var(--space-
241
241
  width: 100%;
242
242
  height: 40px;
243
243
  border: 1px solid var(--color-border-default);
244
- border-radius: var(--radius-sm);
244
+ border-radius: var(--shape-control);
245
245
  background: var(--color-background-surface);
246
246
  overflow: hidden;
247
247
  transition:
@@ -366,7 +366,7 @@ textarea.input.input-lg { height: auto; min-height: 120px; padding: var(--space-
366
366
  min-height: 40px;
367
367
  padding: 5px 8px;
368
368
  border: 1px solid var(--color-border-default);
369
- border-radius: var(--radius-sm);
369
+ border-radius: var(--shape-control);
370
370
  background: var(--color-background-surface);
371
371
  transition:
372
372
  border-color var(--transition-fast),
@@ -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(--radius-sm);
472
+ border-radius: var(--shape-container);
473
473
  outline: none;
474
474
  background: var(--color-background-surface);
475
475
  color: var(--color-foreground-default);
@@ -510,7 +510,7 @@ textarea.input.input-lg { height: auto; min-height: 120px; padding: var(--space-
510
510
  transition: transform var(--transition-base);
511
511
  }
512
512
  .switch input { position: absolute; opacity: 0; pointer-events: none; }
513
- .switch input:checked ~ .switch-track { background: var(--color-brand-secondary-500); }
513
+ .switch input:checked ~ .switch-track { background: var(--color-brand-solid); }
514
514
  .switch input:checked ~ .switch-track .switch-thumb { transform: translateX(16px); }
515
515
  .switch input:focus-visible ~ .switch-track { box-shadow: var(--shadow-focus); }
516
516
  .switch input:disabled ~ .switch-track { opacity: 0.5; cursor: not-allowed; }
@@ -553,13 +553,13 @@ textarea.input.input-lg { height: auto; min-height: 120px; padding: var(--space-
553
553
  }
554
554
  .check-box svg { width: 14px; height: 14px; stroke-width: 3; opacity: 0; transform: scale(0.8); transition: opacity var(--transition-fast), transform var(--transition-fast); }
555
555
  .check input:checked ~ .check-box {
556
- background: var(--color-brand-secondary-500);
557
- border-color: var(--color-brand-secondary-500);
556
+ background: var(--color-brand-solid);
557
+ border-color: var(--color-brand-solid);
558
558
  }
559
559
  .check input:checked ~ .check-box svg { opacity: 1; transform: scale(1); }
560
560
  .check input:indeterminate ~ .check-box {
561
- background: var(--color-brand-secondary-500);
562
- border-color: var(--color-brand-secondary-500);
561
+ background: var(--color-brand-solid);
562
+ border-color: var(--color-brand-solid);
563
563
  }
564
564
  .check input:indeterminate ~ .check-box::after {
565
565
  content: '';
@@ -607,11 +607,11 @@ textarea.input.input-lg { height: auto; min-height: 120px; padding: var(--space-
607
607
  width: 8px;
608
608
  height: 8px;
609
609
  border-radius: var(--radius-pill);
610
- background: var(--color-brand-secondary-500);
610
+ background: var(--color-brand-solid);
611
611
  transform: scale(0);
612
612
  transition: transform var(--transition-fast);
613
613
  }
614
- .radio input:checked ~ .radio-dot { border-color: var(--color-brand-secondary-500); }
614
+ .radio input:checked ~ .radio-dot { border-color: var(--color-brand-solid); }
615
615
  .radio input:checked ~ .radio-dot::after { transform: scale(1); }
616
616
  .radio input:focus-visible ~ .radio-dot { box-shadow: var(--shadow-focus); }
617
617
  .radio input:disabled ~ .radio-dot { opacity: 0.5; cursor: not-allowed; }
@@ -629,7 +629,7 @@ textarea.input.input-lg { height: auto; min-height: 120px; padding: var(--space-
629
629
  height: 40px;
630
630
  padding: 0 var(--space-4);
631
631
  border: 1px solid var(--color-border-default);
632
- border-radius: var(--radius-sm);
632
+ border-radius: var(--shape-control);
633
633
  background: var(--color-background-surface);
634
634
  color: var(--color-foreground-default);
635
635
  font-family: var(--font-sans);
@@ -739,7 +739,7 @@ textarea.input.input-lg { height: auto; min-height: 120px; padding: var(--space-
739
739
  cursor: pointer;
740
740
  transition: color var(--transition-fast);
741
741
  }
742
- .file-list-action:hover { color: var(--color-brand-secondary-700); }
742
+ .file-list-action:hover { color: var(--color-brand-text); }
743
743
 
744
744
  .file-rows {
745
745
  list-style: none;
@@ -771,9 +771,9 @@ textarea.input.input-lg { height: auto; min-height: 120px; padding: var(--space-
771
771
  color: var(--color-foreground-muted);
772
772
  }
773
773
  .file-icon[data-kind="pdf"] { background: color-mix(in srgb, var(--color-danger-500) 8%, var(--color-background-surface)); color: var(--color-feedback-danger-foreground); }
774
- .file-icon[data-kind="img"] { background: color-mix(in srgb, var(--color-brand-secondary-500) 8%, var(--color-background-surface)); color: var(--color-brand-secondary-700); }
774
+ .file-icon[data-kind="img"] { background: color-mix(in srgb, var(--color-brand-solid) 8%, var(--color-background-surface)); color: var(--color-brand-text); }
775
775
  .file-icon[data-kind="csv"] { background: color-mix(in srgb, var(--color-success-500) 8%, var(--color-background-surface)); color: var(--color-feedback-success-foreground); }
776
- .file-icon[data-kind="doc"] { background: color-mix(in srgb, var(--color-brand-secondary-500) 10%, var(--color-background-surface)); color: var(--color-brand-secondary-700); }
776
+ .file-icon[data-kind="doc"] { background: color-mix(in srgb, var(--color-brand-solid) 10%, var(--color-background-surface)); color: var(--color-brand-text); }
777
777
 
778
778
  .file-icon-tag {
779
779
  position: absolute;
@@ -823,7 +823,7 @@ textarea.input.input-lg { height: auto; min-height: 120px; padding: var(--space-
823
823
  .file-progress > span {
824
824
  display: block;
825
825
  height: 100%;
826
- background: var(--color-brand-secondary-500);
826
+ background: var(--color-brand-solid);
827
827
  border-radius: inherit;
828
828
  transition: width var(--transition-fast);
829
829
  }
@@ -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-secondary-700); background: color-mix(in srgb, var(--color-brand-secondary-500) 10%, transparent); }
845
+ .file-status.pending { color: var(--color-brand-text); background: var(--color-brand-subtle); }
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 {
@@ -889,7 +889,7 @@ textarea.input.input-lg { height: auto; min-height: 120px; padding: var(--space-
889
889
  width: 18px;
890
890
  height: 18px;
891
891
  border-radius: var(--radius-pill);
892
- background: var(--color-brand-secondary-500);
892
+ background: var(--color-brand-solid);
893
893
  border: 2px solid var(--color-pure-white);
894
894
  box-shadow: 0 1px 4px color-mix(in srgb, var(--color-shadow-tint) 22%, transparent);
895
895
  margin-top: -7px;
@@ -899,7 +899,7 @@ textarea.input.input-lg { height: auto; min-height: 120px; padding: var(--space-
899
899
  width: 18px;
900
900
  height: 18px;
901
901
  border-radius: var(--radius-pill);
902
- background: var(--color-brand-secondary-500);
902
+ background: var(--color-brand-solid);
903
903
  border: 2px solid var(--color-pure-white);
904
904
  box-shadow: 0 1px 4px color-mix(in srgb, var(--color-shadow-tint) 22%, transparent);
905
905
  }
@@ -57,7 +57,7 @@
57
57
  right: var(--space-3);
58
58
  bottom: 0;
59
59
  height: 2px;
60
- background: var(--color-brand-accent-500);
60
+ background: var(--color-accent-solid);
61
61
  border-radius: var(--radius-xs) var(--radius-xs) 0 0;
62
62
  }
63
63
  .tab:focus-visible {
@@ -83,7 +83,7 @@
83
83
  }
84
84
  .tab[aria-selected="true"] .tab-count,
85
85
  .tab.is-active .tab-count {
86
- background: color-mix(in srgb, var(--color-brand-accent-500) 16%, transparent);
86
+ background: var(--color-accent-subtle);
87
87
  color: var(--color-foreground-accent);
88
88
  }
89
89
 
@@ -234,7 +234,7 @@
234
234
  height: 2px;
235
235
  width: var(--ind-w, 0);
236
236
  transform: translateX(var(--ind-x, 0));
237
- background: var(--color-brand-accent-500);
237
+ background: var(--color-accent-solid);
238
238
  border-radius: var(--radius-xs) var(--radius-xs) 0 0;
239
239
  pointer-events: none;
240
240
  transition: transform var(--duration-base) var(--ease-emphasis),
@@ -160,7 +160,32 @@
160
160
  --color-background-sunken: var(--color-neutral-100); /* inputs, wells */
161
161
  --color-background-hover: var(--color-neutral-100);
162
162
  --color-background-press: var(--color-neutral-150);
163
- --color-background-selected: var(--color-brand-secondary-50);
163
+ --color-background-selected: var(--color-brand-subtle-solid); /* product-aware via brand-subtle-solid (dark theme overrides below) */
164
+
165
+ /* ─────────────────────────────────────────────────────────────────────────
166
+ THEMING SURFACE — product axis (semantic brand/accent tokens)
167
+ ─────────────────────────────────────────────────────────────────────────
168
+ A product theme (`[data-product="…"]`) redefines ONLY this short set; every
169
+ component fill, text and tint reads from these, so swapping them reskins the
170
+ whole catalog with no per-component edits. Primer/Spectrum-style aliasing.
171
+
172
+ The two axes stay orthogonal:
173
+ • PRODUCT axis → matiz: this set + the brand/accent scales, logo, hero grad.
174
+ • THEME axis (light/dark) → surface ramp + tint intensity. NEVER matiz.
175
+
176
+ Brand = institutional / primary action. */
177
+ --color-brand-solid: var(--color-brand-primary-500); /* Enterprise primary — ATTRUS Navy #002142 (buttons, avatars, toggles, badges, hero) */
178
+ --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
+ --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 */
183
+ --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 */
186
+ /* 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 */
164
189
 
165
190
  /* ─────────────────────────────────────────────────────────────────────────
166
191
  INVERSE LAYER — contextual contrast surface, NOT dark theme
@@ -185,9 +210,9 @@
185
210
  ✗ Mixing inverse and surface tokens in the same component without intent
186
211
  ✗ Hard-coding #0B1230 / white instead of inverse tokens
187
212
  ───────────────────────────────────────────────────────────────────────── */
188
- --color-background-inverse: var(--color-ink-base);
189
- --color-background-inverse-surface: var(--color-ink-raised);
190
- --color-background-inverse-subtle: var(--color-ink-deep);
213
+ --color-background-inverse: color-mix(in srgb, var(--color-brand-solid) 16%, var(--color-ink-base)); /* product-tinted dark panel */
214
+ --color-background-inverse-surface: color-mix(in srgb, var(--color-brand-solid) 20%, var(--color-ink-raised));
215
+ --color-background-inverse-subtle: color-mix(in srgb, var(--color-brand-solid) 12%, var(--color-ink-deep));
191
216
  --color-background-inverse-hover: var(--color-ink-hover);
192
217
 
193
218
  /* Scrim — modal/drawer/sheet backdrop. Same in light and dark themes.
@@ -197,8 +222,8 @@
197
222
  --color-scrim: rgba(10, 15, 31, 0.32);
198
223
  --scrim-blur: 6px;
199
224
  --color-background-inverse-press: color-mix(in srgb, var(--color-ink-hover) 70%, var(--color-pure-white));
200
- --color-background-inverse-selected: color-mix(in srgb, var(--color-brand-secondary-500) 22%, var(--color-ink-base));
201
- --color-background-inverse-brand: var(--color-brand-primary-500); /* CTA / hero with brand weight — Navy */
225
+ --color-background-inverse-selected: color-mix(in srgb, var(--color-brand-solid) 22%, var(--color-ink-base));
226
+ --color-background-inverse-brand: var(--color-brand-solid); /* CTA / hero with brand weight — follows product */
202
227
 
203
228
  /* Foreground (text + icons) on LIGHT surfaces */
204
229
  --color-foreground-default: var(--color-neutral-800); /* primary copy / headings */
@@ -224,8 +249,8 @@
224
249
  --color-border-subtle: var(--color-neutral-100);
225
250
  --color-border-default: var(--color-neutral-150);
226
251
  --color-border-strong: var(--color-neutral-200);
227
- --color-border-focus: var(--color-brand-accent-500);
228
- --color-border-accent: var(--color-brand-accent-500);
252
+ --color-border-focus: var(--color-accent-solid); /* per-theme accent (Sky default) — follows the product's accent */
253
+ --color-border-accent: var(--color-accent-solid);
229
254
  --color-border-success: var(--color-success-500);
230
255
  --color-border-warning: var(--color-warning-500);
231
256
  --color-border-danger: var(--color-danger-500);
@@ -279,11 +304,26 @@
279
304
  ATTRUS / Cabiros — GRADIENTS (primary brand + layers)
280
305
  ============================================================ */
281
306
 
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. */
282
312
  :root {
283
- --grad-brand: linear-gradient(135deg, #001A4D 0%, #003399 50%, #3399FF 100%);
284
- --grad-brand-soft: linear-gradient(135deg, #002A80 0%, #003399 100%);
285
- --grad-ink: linear-gradient(160deg, #0B1230 0%, #001A4D 55%, #002A80 100%);
286
- --grad-hero: linear-gradient(180deg, #001133 0%, #003399 100%);
313
+ --grad-brand: linear-gradient(135deg,
314
+ color-mix(in srgb, var(--color-pure-black) 45%, var(--color-brand-solid)) 0%,
315
+ var(--color-brand-solid) 55%,
316
+ var(--color-accent-solid) 100%);
317
+ --grad-brand-soft: linear-gradient(135deg,
318
+ var(--color-brand-solid) 0%,
319
+ color-mix(in srgb, var(--color-pure-black) 20%, var(--color-brand-solid)) 100%);
320
+ --grad-ink: linear-gradient(160deg,
321
+ color-mix(in srgb, var(--color-pure-black) 68%, var(--color-brand-solid)) 0%,
322
+ 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%);
324
+ --grad-hero: linear-gradient(180deg,
325
+ 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%);
287
327
  --grad-sheen: linear-gradient(120deg,
288
328
  color-mix(in srgb, var(--color-pure-white) 14%, transparent) 0%,
289
329
  color-mix(in srgb, var(--color-pure-white) 0%, transparent) 40%,
@@ -293,8 +333,8 @@
293
333
  color-mix(in srgb, var(--color-pure-white) 65%, transparent) 0%,
294
334
  color-mix(in srgb, var(--color-pure-white) 0%, transparent) 100%);
295
335
  --grad-radial-glow: radial-gradient(1200px 500px at 20% -10%,
296
- color-mix(in srgb, var(--color-brand-accent-500) 25%, transparent) 0%,
297
- color-mix(in srgb, var(--color-brand-accent-500) 0%, transparent) 60%);
336
+ color-mix(in srgb, var(--color-accent-solid) 25%, transparent) 0%,
337
+ color-mix(in srgb, var(--color-accent-solid) 0%, transparent) 60%);
298
338
  --grad-data-pos: linear-gradient(180deg,
299
339
  color-mix(in srgb, var(--color-success-500) 35%, transparent) 0%,
300
340
  color-mix(in srgb, var(--color-success-500) 0%, transparent) 100%);
@@ -412,7 +452,7 @@
412
452
  0 32px 80px color-mix(in srgb, var(--color-shadow-tint) 18%, transparent);
413
453
  --shadow-2xl: 0 24px 48px color-mix(in srgb, var(--color-shadow-tint) 14%, transparent),
414
454
  0 48px 120px color-mix(in srgb, var(--color-shadow-tint) 24%, transparent); /* deepest — modals, drawers, floating overlays above scrim */
415
- --shadow-focus: 0 0 0 4px color-mix(in srgb, var(--color-brand-accent-500) 22%, transparent);
455
+ --shadow-focus: 0 0 0 4px color-mix(in srgb, var(--color-accent-solid) 22%, transparent); /* per-theme accent */
416
456
  --shadow-focus-sky: 0 0 0 4px color-mix(in srgb, var(--color-brand-accent-500) 25%, transparent);
417
457
  --shadow-focus-success: 0 0 0 4px color-mix(in srgb, var(--color-success-500) 22%, transparent);
418
458
  --shadow-focus-warning: 0 0 0 4px color-mix(in srgb, var(--color-warning-500) 22%, transparent);
@@ -586,10 +626,17 @@
586
626
  --color-background-press: color-mix(in srgb, var(--color-pure-white) 10%, var(--color-ink-raised));
587
627
  --color-background-selected: var(--color-background-inverse-selected);
588
628
 
629
+ /* Enterprise primary is Navy (#002142) — near-ink, so it vanishes as a solid
630
+ fill on the dark canvas. Lift it to a visible deep-blue in dark (Business,
631
+ via [data-product=business], re-asserts its own #1F6FD6 and wins by order). */
632
+ --color-brand-solid: var(--color-brand-primary-400); /* #2F4F75 — reads on ink */
633
+ --color-brand-solid-hover: var(--color-brand-primary-300); /* #5F7596 */
634
+ --color-brand-solid-active: var(--color-brand-primary-500); /* settles to navy */
635
+
589
636
  /* Inverse layer — stays distinct: a brand-tinted dark, lifted off the ambient ink */
590
- --color-background-inverse: color-mix(in srgb, var(--color-brand-primary-500) 24%, var(--color-ink-base));
591
- --color-background-inverse-surface: color-mix(in srgb, var(--color-brand-primary-500) 30%, var(--color-ink-raised));
592
- --color-background-inverse-subtle: color-mix(in srgb, var(--color-brand-primary-500) 18%, var(--color-ink-deep));
637
+ --color-background-inverse: color-mix(in srgb, var(--color-brand-solid) 24%, var(--color-ink-base));
638
+ --color-background-inverse-surface: color-mix(in srgb, var(--color-brand-solid) 30%, var(--color-ink-raised));
639
+ --color-background-inverse-subtle: color-mix(in srgb, var(--color-brand-solid) 18%, var(--color-ink-deep));
593
640
 
594
641
  /* Foreground — light on dark */
595
642
  --color-foreground-default: var(--color-neutral-50);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@attrus-ds/core",
3
- "version": "0.3.1",
3
+ "version": "1.0.2",
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",
@@ -38,6 +38,8 @@
38
38
  "./fonts.css": "./dist/css/fonts.css",
39
39
  "./tokens.json": "./dist/tokens/attrus-tokens.json",
40
40
  "./tokens.flat.json": "./dist/tokens/attrus-tokens.flat.json",
41
+ "./themes": "./dist/css/themes/index.css",
42
+ "./themes/*": "./dist/css/themes/*",
41
43
  "./components/*": "./dist/css/components/*",
42
44
  "./react": "./dist/react/index.ts",
43
45
  "./react/*": "./dist/react/*",