@solexllc/usx-theme 0.2.2 → 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.2",
3
+ "version": "0.3.0",
4
4
  "description": "Design tokens package for USX.",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -35,16 +35,18 @@
35
35
 
36
36
  // Omits null/false values; an optional second argument guards composites
37
37
  // so partial values like `1px solid null` never reach the CSS output.
38
- @function usx-when($condition, $value: $condition) {
38
+ // An optional third argument supplies a fallback for when $condition is
39
+ // falsy, for compile-time constants that always have a usable value.
40
+ @function usx-when($condition, $value: $condition, $fallback: null) {
39
41
  @if not $condition {
40
- @return null;
42
+ @return $fallback;
41
43
  }
42
44
 
43
45
  @return $value;
44
46
  }
45
47
 
46
48
  // ── Layout (compile-time only) ───────────────────────────────────────────────
47
- $max-layout-width: 60rem !default;
49
+ $max-layout-width: 64rem !default;
48
50
  $max-sidebar-width: 16rem !default;
49
51
 
50
52
  // ── Breakpoints (compile-time only) ─────────────────────────────────────────
@@ -358,6 +360,67 @@ $surface-colors: (
358
360
  'surface-inverse': $usx-text-ink,
359
361
  ) !default;
360
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
+
361
424
  // ── Spacing ─────────────────────────────────────────────────────────────────
362
425
  $usx-spacing-xs-var: null !default;
363
426
  $usx-spacing-xs: usx-var($usx-spacing-xs-var) !default;
@@ -421,7 +484,8 @@ $usx-font-family: usx-var($usx-font-family-var,
421
484
  // everywhere) but are their own hook, so a theme with a distinct display/
422
485
  // serif face for headings (e.g. VA.gov's Bitter) can override just this one.
423
486
  $usx-font-family-heading-var: null !default;
424
- $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;
425
489
 
426
490
  $usx-font-size-base-var: null !default;
427
491
  $usx-font-size-base: usx-var($usx-font-size-base-var, 1rem) !default;
@@ -493,48 +557,6 @@ $usx-tag-line-height: usx-var($usx-tag-line-height-var, 1.6) !default;
493
557
  $usx-task-list-link-font-size-var: null !default;
494
558
  $usx-task-list-link-font-size: usx-var($usx-task-list-link-font-size-var, 1.31rem) !default;
495
559
 
496
- // ── Radius — primitives (reserved for utility classes) ──────────────────────
497
- $usx-radius-sm-var: null !default;
498
- $usx-radius-sm: usx-var($usx-radius-sm-var) !default;
499
-
500
- $usx-radius-md-var: null !default;
501
- $usx-radius-md: usx-var($usx-radius-md-var) !default;
502
-
503
- $usx-radius-lg-var: null !default;
504
- $usx-radius-lg: usx-var($usx-radius-lg-var) !default;
505
-
506
- $usx-radius-xl-var: null !default;
507
- $usx-radius-xl: usx-var($usx-radius-xl-var) !default;
508
-
509
- $usx-radius-full-var: null !default;
510
- $usx-radius-full: usx-var($usx-radius-full-var) !default;
511
-
512
- // Semantic radii (DaisyUI-inspired): components pick a radius by group, so all
513
- // boxes, all fields, all selectors, and all square components are themed
514
- // independently with one variable each. Per-component "advanced" hooks
515
- // (--usx-<component>-radius) override the group.
516
- $usx-radius-box-var: null !default; // boxes: cards, code blocks, summary boxes, hero callouts, images
517
- $usx-radius-box: usx-var($usx-radius-box-var) !default;
518
-
519
- $usx-radius-field-var: null !default; // fields: buttons, inputs, selects, comboboxes, text areas
520
- $usx-radius-field: usx-var($usx-radius-field-var) !default;
521
-
522
- $usx-radius-selector-var: null !default; // selectors: checkboxes, badges/tags, small controls
523
- $usx-radius-selector: usx-var($usx-radius-selector-var) !default;
524
-
525
- $usx-radius-none-var: null !default; // square-by-default components: accordions, alerts
526
- $usx-radius-none: usx-var($usx-radius-none-var) !default;
527
-
528
- // ── Border ───────────────────────────────────────────────────────────────────
529
- $usx-border-width-sm-var: null !default;
530
- $usx-border-width-sm: usx-var($usx-border-width-sm-var) !default;
531
- $usx-border-width-md-var: null !default;
532
- $usx-border-width-md: usx-var($usx-border-width-md-var) !default;
533
- $usx-border-width-lg-var: null !default;
534
- $usx-border-width-lg: usx-var($usx-border-width-lg-var) !default;
535
- $usx-border-width-xl-var: null !default;
536
- $usx-border-width-xl: usx-var($usx-border-width-xl-var) !default;
537
-
538
560
  // ── Component tokens: Button ─────────────────────────────────────────────────
539
561
  $usx-radius-button-var: null !default;
540
562
  $usx-radius-button: usx-var($usx-radius-button-var, $usx-radius-field) !default;
@@ -688,6 +710,21 @@ $usx-site-alert-maintenance-bg: null !default;
688
710
  // so a theme that repoints the info family carries the summary box along
689
711
  // with it. Text/link colors match existing primitives too, so they chain
690
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
+
691
728
  $usx-summary-box-border-color-var: null !default;
692
729
  $usx-summary-box-border-color: usx-var($usx-summary-box-border-color-var, $usx-color-info-light) !default;
693
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;