@solexllc/usx-theme 0.2.3 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/_hooks.scss CHANGED
@@ -103,6 +103,7 @@
103
103
  $usx-textarea-radius-var: --usx-textarea-radius,
104
104
  $usx-code-radius-var: --usx-code-radius,
105
105
  $usx-summary-box-radius-var: --usx-summary-box-radius,
106
+ $usx-card-radius-var: --usx-card-radius,
106
107
  $usx-hero-callout-radius-var: --usx-hero-callout-radius,
107
108
  $usx-image-radius-var: --usx-image-radius,
108
109
  $usx-tag-radius-var: --usx-tag-radius,
@@ -118,6 +119,7 @@
118
119
  $usx-task-list-outer-border-width-var: --usx-task-list-outer-border-width,
119
120
  $usx-step-indicator-segment-bar-width-var: --usx-step-indicator-segment-bar-width,
120
121
  $usx-accordion-border-width-var: --usx-accordion-border-width,
122
+ $usx-card-border-width-var: --usx-card-border-width,
121
123
  $usx-button-outline-border-width-var: --usx-button-outline-border-width,
122
124
  $usx-switch-border-width-var: --usx-switch-border-width,
123
125
  $usx-file-input-border-width-var: --usx-file-input-border-width,
@@ -149,6 +151,11 @@
149
151
  $usx-tag-line-height-var: --usx-tag-line-height,
150
152
  $usx-task-list-link-font-size-var: --usx-task-list-link-font-size,
151
153
  $usx-link-text-var: --usx-link-text,
154
+ $usx-card-bg-var: --usx-card-bg,
155
+ $usx-card-text-var: --usx-card-text,
156
+ $usx-card-heading-text-var: --usx-card-heading-text,
157
+ $usx-card-media-bg-var: --usx-card-media-bg,
158
+ $usx-card-border-color-var: --usx-card-border-color,
152
159
  $usx-link-text-visited-var: --usx-link-text-visited,
153
160
  $usx-link-text-dark-var: --usx-link-text-dark,
154
161
  $usx-link-text-visited-dark-var: --usx-link-text-visited-dark,
@@ -637,8 +637,8 @@ $themes: (
637
637
  --usx-radius-box: 0,
638
638
  --usx-radius-button: 4px,
639
639
  --usx-checkable-tile-radius: 0,
640
- --usx-font-family: ("Source Sans Pro Web", "Helvetica Neue", Helvetica, Roboto, Arial, sans-serif),
641
640
  --usx-link-text: #d83933,
641
+ --usx-card-text: var(--usx-text-inverse),
642
642
  --usx-summary-box-bg: var(--usx-surface-3),
643
643
  --usx-summary-box-border-color: var(--usx-color-primary),
644
644
  --usx-summary-box-text: var(--usx-text-inverse),
@@ -774,6 +774,7 @@ $defaults: (
774
774
  --usx-textarea-radius: var(--usx-radius-field),
775
775
  --usx-code-radius: var(--usx-radius-box),
776
776
  --usx-summary-box-radius: var(--usx-radius-box),
777
+ --usx-card-radius: var(--usx-radius-box),
777
778
  --usx-hero-callout-radius: var(--usx-radius-box),
778
779
  --usx-image-radius: var(--usx-radius-box),
779
780
  --usx-tag-radius: var(--usx-radius-selector),
@@ -789,13 +790,14 @@ $defaults: (
789
790
  --usx-task-list-outer-border-width: var(--usx-border-width-md),
790
791
  --usx-step-indicator-segment-bar-width: var(--usx-border-width-xl),
791
792
  --usx-accordion-border-width: var(--usx-border-width-lg),
793
+ --usx-card-border-width: var(--usx-border-width-md),
792
794
  --usx-button-outline-border-width: var(--usx-border-width-md),
793
795
  --usx-switch-border-width: 2px,
794
796
  --usx-file-input-border-width: var(--usx-border-width-inputs),
795
797
  --usx-file-input-item-border-width: var(--usx-border-width-sm),
796
798
  --usx-range-slider-border-width: var(--usx-border-width-md),
797
799
  --usx-font-family: (Source Sans Pro Web, Helvetica Neue, Helvetica, Roboto, Arial, sans-serif),
798
- --usx-font-family-heading: var(--usx-font-family),
800
+ --usx-font-family-heading: (Merriweather Web, Georgia, Cambria, Times New Roman, Times, serif),
799
801
  --usx-font-size-base: 1rem,
800
802
  --usx-font-size-h1: 2.5rem,
801
803
  --usx-font-size-h2: 2rem,
@@ -820,6 +822,11 @@ $defaults: (
820
822
  --usx-tag-line-height: 1.6,
821
823
  --usx-task-list-link-font-size: 1.31rem,
822
824
  --usx-link-text: #005ea2,
825
+ --usx-card-bg: var(--usx-surface-3),
826
+ --usx-card-text: var(--usx-text-ink),
827
+ --usx-card-heading-text: var(--usx-card-text),
828
+ --usx-card-media-bg: var(--usx-surface-3),
829
+ --usx-card-border-color: var(--usx-color-border),
823
830
  --usx-link-text-visited: var(--usx-color-visited),
824
831
  --usx-link-text-dark: #e6e6e6,
825
832
  --usx-link-text-visited-dark: #e6e6e6,
@@ -1030,6 +1030,13 @@
1030
1030
  "group": "radius-advanced",
1031
1031
  "type": "length"
1032
1032
  },
1033
+ {
1034
+ "name": "usx-card-radius",
1035
+ "cssVar": "--usx-card-radius",
1036
+ "defaultValue": "var(--usx-radius-box)",
1037
+ "group": "radius-advanced",
1038
+ "type": "length"
1039
+ },
1033
1040
  {
1034
1041
  "name": "usx-hero-callout-radius",
1035
1042
  "cssVar": "--usx-hero-callout-radius",
@@ -1135,6 +1142,13 @@
1135
1142
  "group": "border-advanced",
1136
1143
  "type": "length"
1137
1144
  },
1145
+ {
1146
+ "name": "usx-card-border-width",
1147
+ "cssVar": "--usx-card-border-width",
1148
+ "defaultValue": "var(--usx-border-width-md)",
1149
+ "group": "border-advanced",
1150
+ "type": "length"
1151
+ },
1138
1152
  {
1139
1153
  "name": "usx-button-outline-border-width",
1140
1154
  "cssVar": "--usx-button-outline-border-width",
@@ -1180,7 +1194,7 @@
1180
1194
  {
1181
1195
  "name": "font-family-heading",
1182
1196
  "cssVar": "--usx-font-family-heading",
1183
- "defaultValue": "var(--usx-font-family)",
1197
+ "defaultValue": "Merriweather Web, Georgia, Cambria, Times New Roman, Times, serif",
1184
1198
  "group": "typography",
1185
1199
  "type": "font-family"
1186
1200
  },
@@ -1353,6 +1367,41 @@
1353
1367
  "type": "color",
1354
1368
  "derivedFrom": "color-primary"
1355
1369
  },
1370
+ {
1371
+ "name": "usx-card-bg",
1372
+ "cssVar": "--usx-card-bg",
1373
+ "defaultValue": "var(--usx-surface-3)",
1374
+ "group": "component",
1375
+ "type": "color"
1376
+ },
1377
+ {
1378
+ "name": "usx-card-text",
1379
+ "cssVar": "--usx-card-text",
1380
+ "defaultValue": "var(--usx-text-ink)",
1381
+ "group": "component",
1382
+ "type": "color"
1383
+ },
1384
+ {
1385
+ "name": "usx-card-heading-text",
1386
+ "cssVar": "--usx-card-heading-text",
1387
+ "defaultValue": "var(--usx-card-text)",
1388
+ "group": "component",
1389
+ "type": "color"
1390
+ },
1391
+ {
1392
+ "name": "usx-card-media-bg",
1393
+ "cssVar": "--usx-card-media-bg",
1394
+ "defaultValue": "var(--usx-surface-3)",
1395
+ "group": "component",
1396
+ "type": "color"
1397
+ },
1398
+ {
1399
+ "name": "usx-card-border-color",
1400
+ "cssVar": "--usx-card-border-color",
1401
+ "defaultValue": "var(--usx-color-border)",
1402
+ "group": "component",
1403
+ "type": "color"
1404
+ },
1356
1405
  {
1357
1406
  "name": "usx-link-text-visited",
1358
1407
  "cssVar": "--usx-link-text-visited",
package/dist/theme.css CHANGED
@@ -101,6 +101,7 @@
101
101
  --usx-textarea-radius: var(--usx-radius-field);
102
102
  --usx-code-radius: var(--usx-radius-box);
103
103
  --usx-summary-box-radius: var(--usx-radius-box);
104
+ --usx-card-radius: var(--usx-radius-box);
104
105
  --usx-hero-callout-radius: var(--usx-radius-box);
105
106
  --usx-image-radius: var(--usx-radius-box);
106
107
  --usx-tag-radius: var(--usx-radius-selector);
@@ -116,13 +117,14 @@
116
117
  --usx-task-list-outer-border-width: var(--usx-border-width-md);
117
118
  --usx-step-indicator-segment-bar-width: var(--usx-border-width-xl);
118
119
  --usx-accordion-border-width: var(--usx-border-width-lg);
120
+ --usx-card-border-width: var(--usx-border-width-md);
119
121
  --usx-button-outline-border-width: var(--usx-border-width-md);
120
122
  --usx-switch-border-width: 2px;
121
123
  --usx-file-input-border-width: var(--usx-border-width-inputs);
122
124
  --usx-file-input-item-border-width: var(--usx-border-width-sm);
123
125
  --usx-range-slider-border-width: var(--usx-border-width-md);
124
126
  --usx-font-family: Source Sans Pro Web, Helvetica Neue, Helvetica, Roboto, Arial, sans-serif;
125
- --usx-font-family-heading: var(--usx-font-family);
127
+ --usx-font-family-heading: Merriweather Web, Georgia, Cambria, Times New Roman, Times, serif;
126
128
  --usx-font-size-base: 1rem;
127
129
  --usx-font-size-h1: 2.5rem;
128
130
  --usx-font-size-h2: 2rem;
@@ -147,6 +149,11 @@
147
149
  --usx-tag-line-height: 1.6;
148
150
  --usx-task-list-link-font-size: 1.31rem;
149
151
  --usx-link-text: #005ea2;
152
+ --usx-card-bg: var(--usx-surface-3);
153
+ --usx-card-text: var(--usx-text-ink);
154
+ --usx-card-heading-text: var(--usx-card-text);
155
+ --usx-card-media-bg: var(--usx-surface-3);
156
+ --usx-card-border-color: var(--usx-color-border);
150
157
  --usx-link-text-visited: var(--usx-color-visited);
151
158
  --usx-link-text-dark: #e6e6e6;
152
159
  --usx-link-text-visited-dark: #e6e6e6;
@@ -641,8 +641,8 @@
641
641
  --usx-radius-box: 0;
642
642
  --usx-radius-button: 4px;
643
643
  --usx-checkable-tile-radius: 0;
644
- --usx-font-family: "Source Sans Pro Web", "Helvetica Neue", Helvetica, Roboto, Arial, sans-serif;
645
644
  --usx-link-text: #d83933;
645
+ --usx-card-text: var(--usx-text-inverse);
646
646
  --usx-summary-box-bg: var(--usx-surface-3);
647
647
  --usx-summary-box-border-color: var(--usx-color-primary);
648
648
  --usx-summary-box-text: var(--usx-text-inverse);
@@ -36,8 +36,8 @@
36
36
  --usx-radius-box: 0;
37
37
  --usx-radius-button: 4px;
38
38
  --usx-checkable-tile-radius: 0;
39
- --usx-font-family: "Source Sans Pro Web", "Helvetica Neue", Helvetica, Roboto, Arial, sans-serif;
40
39
  --usx-link-text: #d83933;
40
+ --usx-card-text: var(--usx-text-inverse);
41
41
  --usx-summary-box-bg: var(--usx-surface-3);
42
42
  --usx-summary-box-border-color: var(--usx-color-primary);
43
43
  --usx-summary-box-text: var(--usx-text-inverse);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@solexllc/usx-theme",
3
- "version": "0.2.3",
3
+ "version": "0.3.0",
4
4
  "description": "Design tokens package for USX.",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -360,6 +360,67 @@ $surface-colors: (
360
360
  'surface-inverse': $usx-text-ink,
361
361
  ) !default;
362
362
 
363
+ // ── Radius — primitives (reserved for utility classes) ──────────────────────
364
+ $usx-radius-sm-var: null !default;
365
+ $usx-radius-sm: usx-var($usx-radius-sm-var) !default;
366
+
367
+ $usx-radius-md-var: null !default;
368
+ $usx-radius-md: usx-var($usx-radius-md-var) !default;
369
+
370
+ $usx-radius-lg-var: null !default;
371
+ $usx-radius-lg: usx-var($usx-radius-lg-var) !default;
372
+
373
+ $usx-radius-xl-var: null !default;
374
+ $usx-radius-xl: usx-var($usx-radius-xl-var) !default;
375
+
376
+ $usx-radius-full-var: null !default;
377
+ $usx-radius-full: usx-var($usx-radius-full-var) !default;
378
+
379
+ // Semantic radii (DaisyUI-inspired): components pick a radius by group, so all
380
+ // boxes, all fields, all selectors, and all square components are themed
381
+ // independently with one variable each. Per-component "advanced" hooks
382
+ // (--usx-<component>-radius) override the group.
383
+ $usx-radius-box-var: null !default; // boxes: cards, code blocks, summary boxes, hero callouts, images
384
+ $usx-radius-box: usx-var($usx-radius-box-var) !default;
385
+
386
+ $usx-radius-field-var: null !default; // fields: buttons, inputs, selects, comboboxes, text areas
387
+ $usx-radius-field: usx-var($usx-radius-field-var) !default;
388
+
389
+ $usx-radius-selector-var: null !default; // selectors: checkboxes, badges/tags, small controls
390
+ $usx-radius-selector: usx-var($usx-radius-selector-var) !default;
391
+
392
+ $usx-radius-none-var: null !default; // square-by-default components: accordions, alerts
393
+ $usx-radius-none: usx-var($usx-radius-none-var) !default;
394
+
395
+ $border-radius: (
396
+ 'sm': $usx-radius-sm,
397
+ 'md': $usx-radius-md,
398
+ 'lg': $usx-radius-lg,
399
+ 'xl': $usx-radius-xl,
400
+ 'full': $usx-radius-full,
401
+ 'box': $usx-radius-box,
402
+ 'field': $usx-radius-field,
403
+ 'selector': $usx-radius-selector,
404
+ 'none': $usx-radius-none,
405
+ ) !default;
406
+
407
+ // ── Border width ─────────────────────────────────────────────────────────────
408
+ $usx-border-width-sm-var: null !default;
409
+ $usx-border-width-sm: usx-var($usx-border-width-sm-var) !default;
410
+ $usx-border-width-md-var: null !default;
411
+ $usx-border-width-md: usx-var($usx-border-width-md-var) !default;
412
+ $usx-border-width-lg-var: null !default;
413
+ $usx-border-width-lg: usx-var($usx-border-width-lg-var) !default;
414
+ $usx-border-width-xl-var: null !default;
415
+ $usx-border-width-xl: usx-var($usx-border-width-xl-var) !default;
416
+
417
+ $border-width: (
418
+ 'sm': $usx-border-width-sm,
419
+ 'md': $usx-border-width-md,
420
+ 'lg': $usx-border-width-lg,
421
+ 'xl': $usx-border-width-xl,
422
+ ) !default;
423
+
363
424
  // ── Spacing ─────────────────────────────────────────────────────────────────
364
425
  $usx-spacing-xs-var: null !default;
365
426
  $usx-spacing-xs: usx-var($usx-spacing-xs-var) !default;
@@ -423,7 +484,8 @@ $usx-font-family: usx-var($usx-font-family-var,
423
484
  // everywhere) but are their own hook, so a theme with a distinct display/
424
485
  // serif face for headings (e.g. VA.gov's Bitter) can override just this one.
425
486
  $usx-font-family-heading-var: null !default;
426
- $usx-font-family-heading: usx-var($usx-font-family-heading-var, $usx-font-family) !default;
487
+ $usx-font-family-heading: usx-var($usx-font-family-heading-var,
488
+ 'Merriweather Web, Georgia, Cambria, Times New Roman, Times, serif') !default;
427
489
 
428
490
  $usx-font-size-base-var: null !default;
429
491
  $usx-font-size-base: usx-var($usx-font-size-base-var, 1rem) !default;
@@ -495,48 +557,6 @@ $usx-tag-line-height: usx-var($usx-tag-line-height-var, 1.6) !default;
495
557
  $usx-task-list-link-font-size-var: null !default;
496
558
  $usx-task-list-link-font-size: usx-var($usx-task-list-link-font-size-var, 1.31rem) !default;
497
559
 
498
- // ── Radius — primitives (reserved for utility classes) ──────────────────────
499
- $usx-radius-sm-var: null !default;
500
- $usx-radius-sm: usx-var($usx-radius-sm-var) !default;
501
-
502
- $usx-radius-md-var: null !default;
503
- $usx-radius-md: usx-var($usx-radius-md-var) !default;
504
-
505
- $usx-radius-lg-var: null !default;
506
- $usx-radius-lg: usx-var($usx-radius-lg-var) !default;
507
-
508
- $usx-radius-xl-var: null !default;
509
- $usx-radius-xl: usx-var($usx-radius-xl-var) !default;
510
-
511
- $usx-radius-full-var: null !default;
512
- $usx-radius-full: usx-var($usx-radius-full-var) !default;
513
-
514
- // Semantic radii (DaisyUI-inspired): components pick a radius by group, so all
515
- // boxes, all fields, all selectors, and all square components are themed
516
- // independently with one variable each. Per-component "advanced" hooks
517
- // (--usx-<component>-radius) override the group.
518
- $usx-radius-box-var: null !default; // boxes: cards, code blocks, summary boxes, hero callouts, images
519
- $usx-radius-box: usx-var($usx-radius-box-var) !default;
520
-
521
- $usx-radius-field-var: null !default; // fields: buttons, inputs, selects, comboboxes, text areas
522
- $usx-radius-field: usx-var($usx-radius-field-var) !default;
523
-
524
- $usx-radius-selector-var: null !default; // selectors: checkboxes, badges/tags, small controls
525
- $usx-radius-selector: usx-var($usx-radius-selector-var) !default;
526
-
527
- $usx-radius-none-var: null !default; // square-by-default components: accordions, alerts
528
- $usx-radius-none: usx-var($usx-radius-none-var) !default;
529
-
530
- // ── Border ───────────────────────────────────────────────────────────────────
531
- $usx-border-width-sm-var: null !default;
532
- $usx-border-width-sm: usx-var($usx-border-width-sm-var) !default;
533
- $usx-border-width-md-var: null !default;
534
- $usx-border-width-md: usx-var($usx-border-width-md-var) !default;
535
- $usx-border-width-lg-var: null !default;
536
- $usx-border-width-lg: usx-var($usx-border-width-lg-var) !default;
537
- $usx-border-width-xl-var: null !default;
538
- $usx-border-width-xl: usx-var($usx-border-width-xl-var) !default;
539
-
540
560
  // ── Component tokens: Button ─────────────────────────────────────────────────
541
561
  $usx-radius-button-var: null !default;
542
562
  $usx-radius-button: usx-var($usx-radius-button-var, $usx-radius-field) !default;
@@ -690,6 +710,21 @@ $usx-site-alert-maintenance-bg: null !default;
690
710
  // so a theme that repoints the info family carries the summary box along
691
711
  // with it. Text/link colors match existing primitives too, so they chain
692
712
  // to those instead.
713
+ $usx-card-bg-var: null !default;
714
+ $usx-card-bg: usx-var($usx-card-bg-var, $usx-surface-3) !default;
715
+ $usx-card-text-var: null !default;
716
+ $usx-card-text: usx-var($usx-card-text-var, $usx-text-ink) !default;
717
+ $usx-card-heading-text-var: null !default;
718
+ $usx-card-heading-text: usx-var($usx-card-heading-text-var, $usx-card-text) !default;
719
+ $usx-card-media-bg-var: null !default;
720
+ $usx-card-media-bg: usx-var($usx-card-media-bg-var, $usx-surface-3) !default;
721
+ $usx-card-border-color-var: null !default;
722
+ $usx-card-border-color: usx-var($usx-card-border-color-var, $usx-color-border) !default;
723
+ $usx-card-border-width-var: null !default;
724
+ $usx-card-border-width: usx-var($usx-card-border-width-var, $usx-border-width-md) !default;
725
+ $usx-card-radius-var: null !default;
726
+ $usx-card-radius: usx-var($usx-card-radius-var, $usx-radius-box) !default;
727
+
693
728
  $usx-summary-box-border-color-var: null !default;
694
729
  $usx-summary-box-border-color: usx-var($usx-summary-box-border-color-var, $usx-color-info-light) !default;
695
730
  $usx-summary-box-border: usx-when($usx-summary-box-border-color, $usx-border-width-sm solid $usx-summary-box-border-color) !default;
package/src/presets.js CHANGED
@@ -307,7 +307,6 @@ export const PRESETS = {
307
307
  // hover color against black, so it's left on the default.
308
308
  'usx-header-nav-link-text': 'var(--usx-text-inverse)',
309
309
  'usx-header-secondary-link-text': 'var(--usx-text-inverse)',
310
- 'font-family': '"Source Sans Pro Web", "Helvetica Neue", Helvetica, Roboto, Arial, sans-serif', // real nasa.gov body font (same USWDS default stack)
311
310
  // The real CTA button (e.g. "Live Mission Coverage") measures a 4px
312
311
  // corner radius, not our default 0.5rem — verified via computed style
313
312
  // on the live site.
@@ -317,6 +316,7 @@ export const PRESETS = {
317
316
  'radius-button': '4px',
318
317
  // nasa.gov's content cards (hds-content-card) render perfectly square —
319
318
  // verified live.
319
+ 'usx-card-text': 'var(--usx-text-inverse)',
320
320
  'usx-checkable-tile-radius': '0',
321
321
  // nasa.gov's nav literally renders stock USWDS usa-accordion markup, so
322
322
  // its button background is stock USWDS base-lightest rather than our
@@ -248,6 +248,7 @@ export const themeManifest = [
248
248
  scale('usx-textarea-radius', '--usx-textarea-radius', 'var(--usx-radius-field)', 'radius-advanced'),
249
249
  scale('usx-code-radius', '--usx-code-radius', 'var(--usx-radius-box)', 'radius-advanced'),
250
250
  scale('usx-summary-box-radius', '--usx-summary-box-radius', 'var(--usx-radius-box)', 'radius-advanced'),
251
+ scale('usx-card-radius', '--usx-card-radius', 'var(--usx-radius-box)', 'radius-advanced'),
251
252
  scale('usx-hero-callout-radius', '--usx-hero-callout-radius', 'var(--usx-radius-box)', 'radius-advanced'),
252
253
  scale('usx-image-radius', '--usx-image-radius', 'var(--usx-radius-box)', 'radius-advanced'),
253
254
  scale('usx-tag-radius', '--usx-tag-radius', 'var(--usx-radius-selector)', 'radius-advanced'),
@@ -267,6 +268,7 @@ export const themeManifest = [
267
268
  scale('usx-task-list-outer-border-width', '--usx-task-list-outer-border-width', 'var(--usx-border-width-md)', 'border-advanced'),
268
269
  scale('usx-step-indicator-segment-bar-width', '--usx-step-indicator-segment-bar-width', 'var(--usx-border-width-xl)', 'border-advanced'),
269
270
  scale('usx-accordion-border-width', '--usx-accordion-border-width', 'var(--usx-border-width-lg)', 'border-advanced'),
271
+ scale('usx-card-border-width', '--usx-card-border-width', 'var(--usx-border-width-md)', 'border-advanced'),
270
272
  scale('usx-button-outline-border-width', '--usx-button-outline-border-width', 'var(--usx-border-width-md)', 'border-advanced'),
271
273
  scale('usx-switch-border-width', '--usx-switch-border-width', '2px', 'border-advanced'),
272
274
  scale('usx-file-input-border-width', '--usx-file-input-border-width', 'var(--usx-border-width-inputs)', 'border-advanced'),
@@ -281,7 +283,8 @@ export const themeManifest = [
281
283
  'Source Sans Pro Web, Helvetica Neue, Helvetica, Roboto, Arial, sans-serif',
282
284
  'typography', 'font-family'),
283
285
  // Chains to font-family by default — see _variables.scss.
284
- scale('font-family-heading', '--usx-font-family-heading', 'var(--usx-font-family)',
286
+ scale('font-family-heading', '--usx-font-family-heading',
287
+ 'Merriweather Web, Georgia, Cambria, Times New Roman, Times, serif',
285
288
  'typography', 'font-family'),
286
289
  scale('font-size-base', '--usx-font-size-base', '1rem', 'typography'),
287
290
  scale('font-size-h1', '--usx-font-size-h1', '2.5rem', 'typography'),
@@ -314,6 +317,11 @@ export const themeManifest = [
314
317
 
315
318
  // ── Component tokens (hardcoded-hex promotions) ───────────────────────────
316
319
  component('usx-link-text', '#005ea2', 'color-primary'),
320
+ component('usx-card-bg', 'var(--usx-surface-3)'),
321
+ component('usx-card-text', 'var(--usx-text-ink)'),
322
+ component('usx-card-heading-text', 'var(--usx-card-text)'),
323
+ component('usx-card-media-bg', 'var(--usx-surface-3)'),
324
+ component('usx-card-border-color', 'var(--usx-color-border)'),
317
325
  component('usx-link-text-visited', 'var(--usx-color-visited)'),
318
326
  // USWDS swaps link/visited color to a light neutral on a dark background
319
327
  // (`.usa-dark-background`) instead of the illegible blue/purple defaults;