@guildofgleks/ui 21.9.1 → 21.11.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/styles/theme.css CHANGED
@@ -49,6 +49,11 @@
49
49
  --gog-font-body: system-ui, -apple-system, 'Segoe UI', sans-serif;
50
50
  --gog-font-mono: ui-monospace, SFMono-Regular, 'JetBrains Mono', monospace;
51
51
 
52
+ /* 11px, below `xs`. The chip and the tag both wrote it as a literal at `xsm` — the same value
53
+ chosen twice, independently, which is a missing rung rather than two opinions, exactly as
54
+ `slg` was. Moving them to `xs` instead would have made `xsm` and `sm` the same size, which
55
+ is the one thing `xsm` exists to avoid. */
56
+ --gog-text-2xs: 0.6875rem;
52
57
  --gog-text-xs: 0.75rem;
53
58
  --gog-text-sm: 0.875rem;
54
59
  --gog-text-md: 1rem;
@@ -221,7 +226,9 @@
221
226
 
222
227
  /* ── Toast stack ──────────────────────────────────────────────────────────── */
223
228
  --gog-toast-min-width: 280px;
224
- --gog-toast-max-width: 400px;
229
+ /* --gog-toast-max-width lives in the :root, [data-theme] block below — it derives from
230
+ --gog-toast-stack-padding, and a derived value cannot live in this literals-only block (it
231
+ would not follow a scoped theme). */
225
232
  --gog-toast-z-index: 9999;
226
233
  --gog-toast-enter-distance: 110%;
227
234
  --gog-toast-shadow: 0 4px 24px rgba(0, 0, 0, 0.25);
@@ -413,44 +420,56 @@
413
420
  /* The blocking overlay outranks everything, including a dialog it may be covering. */
414
421
  --gog-spinner-overlay-z: calc(var(--gog-z-base) + 8000);
415
422
 
416
- --gog-space-2: calc(2px * var(--gog-density));
417
423
  --gog-space-4: calc(4px * var(--gog-density));
418
- --gog-space-6: calc(6px * var(--gog-density));
419
424
  --gog-space-8: calc(8px * var(--gog-density));
420
- --gog-space-10: calc(10px * var(--gog-density));
421
425
  --gog-space-12: calc(12px * var(--gog-density));
422
- --gog-space-14: calc(14px * var(--gog-density));
423
426
  --gog-space-16: calc(16px * var(--gog-density));
424
- --gog-space-18: calc(18px * var(--gog-density));
425
427
  --gog-space-20: calc(20px * var(--gog-density));
426
428
  --gog-space-24: calc(24px * var(--gog-density));
427
429
  --gog-space-28: calc(28px * var(--gog-density));
428
430
  --gog-space-32: calc(32px * var(--gog-density));
431
+ /* 21.11.0. Added because the optical ratio requires it, not because a design asked: a control
432
+ with 20px of vertical padding needs exactly 40px horizontal, and `slg` is that control on
433
+ `gog-button`, `gog-inputfield` and every field that shares their tier. The scale had 32 and
434
+ then jumped to 48. */
435
+ --gog-space-40: calc(40px * var(--gog-density));
429
436
  --gog-space-48: calc(48px * var(--gog-density));
430
437
  --gog-space-xs: var(--gog-space-4);
431
438
  --gog-space-sm: var(--gog-space-8);
432
439
  --gog-space-md: var(--gog-space-16);
433
440
  --gog-space-lg: var(--gog-space-24);
434
441
  --gog-space-2xl: var(--gog-space-48);
435
- --gog-control-padding-y: var(--gog-space-10);
436
- --gog-control-padding-x: var(--gog-space-14);
437
- --gog-control-checkbox-padding: var(--gog-space-6);
442
+ /* The shared control tier, on the 4px grid at a ratio of exactly 2.0 (styling.instructions.md,
443
+ law 3). It was 10/14, a ratio of 1.40; `--gog-field-md-padding-*` derives from it, so this
444
+ pair is what an `md` input, select, multiselect, autocomplete and datepicker are padded by. */
445
+ --gog-control-padding-y: var(--gog-space-12);
446
+ --gog-control-padding-x: var(--gog-space-24);
447
+ /* One value, all four sides: this is the padding a checkable control's `<label>` carries around
448
+ its box, and it is part of the pointer target — a 12px `xsm` box inside 8px of padding is a
449
+ 28px target, which is how the smallest checkbox clears WCAG 2.5.8 without growing. */
450
+ --gog-control-checkbox-padding: var(--gog-space-8);
438
451
  --gog-field-xsm-padding-y: var(--gog-space-4);
439
452
  --gog-field-xsm-padding-x: var(--gog-space-8);
440
- --gog-field-sm-padding-y: var(--gog-space-6);
441
- --gog-field-sm-padding-x: var(--gog-space-10);
442
- --gog-field-lg-padding-y: var(--gog-space-14);
443
- --gog-field-lg-padding-x: var(--gog-space-18);
444
- --gog-field-slg-padding-y: var(--gog-space-18);
445
- --gog-field-slg-padding-x: var(--gog-space-20);
453
+ --gog-field-sm-padding-y: var(--gog-space-8);
454
+ --gog-field-sm-padding-x: var(--gog-space-16);
455
+ --gog-field-lg-padding-y: var(--gog-space-16);
456
+ --gog-field-lg-padding-x: var(--gog-space-32);
457
+ --gog-field-slg-padding-y: var(--gog-space-20);
458
+ --gog-field-slg-padding-x: var(--gog-space-40);
446
459
  --gog-field-float-label-over-gap: var(--gog-space-8);
447
- --gog-toast-gap: var(--gog-space-10);
460
+ --gog-toast-gap: var(--gog-space-12);
448
461
  --gog-toast-stack-padding: var(--gog-space-16);
449
- --gog-field-xsm-icon-offset: var(--gog-space-6);
462
+ /* L9 (docs/component-geometry.md, "D7 — taken"): the message wraps, so its cap is a measure —
463
+ 53ch at --gog-toast-message-font-size (14px), the nearest whole character to today's 400px so
464
+ this changes robustness to a font-size change, not the pixels anyone sees today. L8's viewport
465
+ exception is layered on top: the margin reads --gog-toast-stack-padding above, the container's
466
+ own edge inset, rather than a new number. */
467
+ --gog-toast-max-width: min(53ch, calc(100vw - var(--gog-toast-stack-padding) * 2));
468
+ --gog-field-xsm-icon-offset: var(--gog-space-8);
450
469
  --gog-field-sm-icon-offset: var(--gog-space-8);
451
- --gog-field-lg-icon-offset: var(--gog-space-14);
452
- --gog-field-slg-icon-offset: var(--gog-space-18);
453
- --gog-control-icon-offset: var(--gog-space-10);
470
+ --gog-field-lg-icon-offset: var(--gog-space-16);
471
+ --gog-field-slg-icon-offset: var(--gog-space-20);
472
+ --gog-control-icon-offset: var(--gog-space-12);
454
473
  --gog-elevated-surface-color: var(--gog-surface-color);
455
474
  --gog-panel-radius: calc(var(--gog-radius) + 8px);
456
475
  --gog-field-xsm-font-size: var(--gog-text-xs);
@@ -460,6 +479,16 @@
460
479
  literals-only `:root` freezes to that scope's scale (rule C). */
461
480
  --gog-field-slg-font-size: var(--gog-text-slg);
462
481
 
482
+ /* Leading for the three kinds of text every field renders, declared once and aliased by each
483
+ component the way the padding and float-label tiers above already are. A block that sets a
484
+ font size sets its leading (law 4): inheriting it while changing the size moves the ratio
485
+ silently, which is the thing the law guards. Roles, from
486
+ `docs/component-geometry.md` — the value in the field itself is one UI line whose box is the
487
+ row height; a label and an error message may both wrap beside their control. */
488
+ --gog-field-line-height: var(--gog-line-height-normal);
489
+ --gog-field-label-line-height: var(--gog-line-height-snug);
490
+ --gog-field-error-line-height: var(--gog-line-height-snug);
491
+
463
492
  --gog-field-md-padding-y: var(--gog-control-padding-y);
464
493
  --gog-field-md-padding-x: var(--gog-control-padding-x);
465
494
 
@@ -535,41 +564,59 @@
535
564
  --gog-accordion-xsm-padding-y: var(--gog-space-4);
536
565
  --gog-accordion-xsm-padding-x: var(--gog-space-8);
537
566
  --gog-accordion-xsm-font-size: var(--gog-text-xs);
567
+ /* The header label is one UI line whose box is the row height (law 4, role ui-line). */
568
+ --gog-accordion-line-height: var(--gog-line-height-normal);
538
569
  --gog-accordion-xsm-letter-spacing: 0.2px;
539
- --gog-accordion-xsm-content-gap: var(--gog-space-2);
570
+ --gog-accordion-xsm-content-gap: var(--gog-space-4);
540
571
  --gog-accordion-xsm-body-font-size: var(--gog-text-xs);
541
572
  --gog-accordion-xsm-body-line-height: var(--gog-line-height-relaxed);
542
573
  --gog-accordion-xsm-body-padding-top: var(--gog-space-4);
543
- --gog-accordion-xsm-body-padding-bottom: var(--gog-space-6);
544
- --gog-accordion-xsm-chevron-size: 11px;
545
- --gog-accordion-xsm-chevron-font-size: 10px;
546
-
547
- --gog-accordion-sm-padding-y: var(--gog-space-6);
548
- --gog-accordion-sm-padding-x: var(--gog-space-10);
574
+ --gog-accordion-xsm-body-padding-bottom: var(--gog-space-8);
575
+ --gog-accordion-xsm-chevron-size: 1.4em;
576
+ /* The chevron is a ratio of the header's own type, not a px ladder of its own. It had been
577
+ 10/12/14/16/18px of glyph basis inside an 11/13/15/18/20px box, beside a label in rem -- so
578
+ raising the browser's text size grew the label and left the chevron where it was, and the
579
+ box/label ratio drifted 0.92 to 1.29 across the five sizes.
580
+
581
+ Two bugs came out of writing it as a ratio. The box was *smaller than its glyph at every
582
+ size*: `gog-icon` renders at `--gog-icon-size: 1.2em` of this font size, so the mark was
583
+ 12/14.4/16.8/19.2/21.6px inside a box of 11/13/15/18/20 and overflowed it everywhere. And
584
+ the five sizes had five ratios where they needed one.
585
+
586
+ `1em` makes this the em basis rather than the glyph size, so the mark is 1.2em of the header
587
+ and the 1.4em box surrounds it. All five steps hold the same ratio and still render five
588
+ different sizes, because the header's type differs -- the tokens stay per-size so an override
589
+ keeps working. */
590
+ --gog-accordion-xsm-chevron-font-size: 1em;
591
+ /* A glyph in its own box: leading would push it off the centre it is placed on. */
592
+ --gog-accordion-chevron-line-height: var(--gog-line-height-none);
593
+
594
+ --gog-accordion-sm-padding-y: var(--gog-space-8);
595
+ --gog-accordion-sm-padding-x: var(--gog-space-16);
549
596
  --gog-accordion-sm-font-size: var(--gog-text-xs);
550
597
  --gog-accordion-sm-letter-spacing: 0.4px;
551
- --gog-accordion-sm-content-gap: var(--gog-space-2);
598
+ --gog-accordion-sm-content-gap: var(--gog-space-4);
552
599
  --gog-accordion-sm-body-font-size: var(--gog-text-xs);
553
600
  --gog-accordion-sm-body-line-height: var(--gog-accordion-body-line-height);
554
- --gog-accordion-sm-body-padding-top: var(--gog-space-6);
601
+ --gog-accordion-sm-body-padding-top: var(--gog-space-8);
555
602
  --gog-accordion-sm-body-padding-bottom: var(--gog-space-8);
556
- --gog-accordion-sm-chevron-size: 13px;
557
- --gog-accordion-sm-chevron-font-size: 12px;
603
+ --gog-accordion-sm-chevron-size: 1.4em;
604
+ --gog-accordion-sm-chevron-font-size: 1em;
558
605
 
559
- --gog-accordion-md-padding-y: var(--gog-space-10);
560
- --gog-accordion-md-padding-x: var(--gog-space-14);
606
+ --gog-accordion-md-padding-y: var(--gog-space-12);
607
+ --gog-accordion-md-padding-x: var(--gog-space-24);
561
608
  --gog-accordion-md-font-size: var(--gog-text-xs);
562
609
  --gog-accordion-md-letter-spacing: 0.8px;
563
- --gog-accordion-md-content-gap: var(--gog-space-2);
610
+ --gog-accordion-md-content-gap: var(--gog-space-4);
564
611
  --gog-accordion-md-body-font-size: var(--gog-text-sm);
565
612
  --gog-accordion-md-body-line-height: var(--gog-accordion-body-line-height);
566
613
  --gog-accordion-md-body-padding-top: var(--gog-space-8);
567
614
  --gog-accordion-md-body-padding-bottom: var(--gog-space-12);
568
- --gog-accordion-md-chevron-size: 15px;
569
- --gog-accordion-md-chevron-font-size: 14px;
615
+ --gog-accordion-md-chevron-size: 1.4em;
616
+ --gog-accordion-md-chevron-font-size: 1em;
570
617
 
571
- --gog-accordion-lg-padding-y: var(--gog-space-14);
572
- --gog-accordion-lg-padding-x: var(--gog-space-16);
618
+ --gog-accordion-lg-padding-y: var(--gog-space-16);
619
+ --gog-accordion-lg-padding-x: var(--gog-space-32);
573
620
  --gog-accordion-lg-font-size: var(--gog-text-sm);
574
621
  --gog-accordion-lg-letter-spacing: 0.8px;
575
622
  --gog-accordion-lg-content-gap: var(--gog-space-4);
@@ -577,11 +624,11 @@
577
624
  --gog-accordion-lg-body-line-height: var(--gog-accordion-body-line-height);
578
625
  --gog-accordion-lg-body-padding-top: var(--gog-space-12);
579
626
  --gog-accordion-lg-body-padding-bottom: var(--gog-space-16);
580
- --gog-accordion-lg-chevron-size: 18px;
581
- --gog-accordion-lg-chevron-font-size: 16px;
627
+ --gog-accordion-lg-chevron-size: 1.4em;
628
+ --gog-accordion-lg-chevron-font-size: 1em;
582
629
 
583
- --gog-accordion-slg-padding-y: var(--gog-space-18);
584
- --gog-accordion-slg-padding-x: var(--gog-space-18);
630
+ --gog-accordion-slg-padding-y: var(--gog-space-20);
631
+ --gog-accordion-slg-padding-x: var(--gog-space-40);
585
632
  --gog-accordion-slg-font-size: var(--gog-text-md);
586
633
  --gog-accordion-slg-letter-spacing: 0.8px;
587
634
  --gog-accordion-slg-content-gap: var(--gog-space-4);
@@ -589,8 +636,8 @@
589
636
  --gog-accordion-slg-body-line-height: var(--gog-accordion-body-line-height);
590
637
  --gog-accordion-slg-body-padding-top: var(--gog-space-16);
591
638
  --gog-accordion-slg-body-padding-bottom: var(--gog-space-20);
592
- --gog-accordion-slg-chevron-size: 20px;
593
- --gog-accordion-slg-chevron-font-size: 18px;
639
+ --gog-accordion-slg-chevron-size: 1.4em;
640
+ --gog-accordion-slg-chevron-font-size: 1em;
594
641
 
595
642
  /* ── Collapsible ───────────────────────────────────────────────────────────
596
643
  No portal, no owned markup — see utilities.css for the actual `.gog-collapsible__*`
@@ -614,10 +661,10 @@
614
661
  `--gog-button-font-size` are intentionally NOT declared — they are the per-instance
615
662
  escape hatch the variant/size classes fall back through. */
616
663
  --gog-button-xsm-padding: var(--gog-space-4) var(--gog-space-8);
617
- --gog-button-sm-padding: var(--gog-space-8) var(--gog-space-14);
618
- --gog-button-md-padding: var(--gog-space-12) var(--gog-space-20);
619
- --gog-button-lg-padding: var(--gog-space-16) var(--gog-space-24);
620
- --gog-button-slg-padding: var(--gog-space-20) var(--gog-space-28);
664
+ --gog-button-sm-padding: var(--gog-space-8) var(--gog-space-16);
665
+ --gog-button-md-padding: var(--gog-space-12) var(--gog-space-24);
666
+ --gog-button-lg-padding: var(--gog-space-16) var(--gog-space-32);
667
+ --gog-button-slg-padding: var(--gog-space-20) var(--gog-space-40);
621
668
  --gog-button-xsm-font-size: var(--gog-text-xs);
622
669
  --gog-button-sm-font-size: var(--gog-text-sm);
623
670
  --gog-button-md-font-size: var(--gog-text-md);
@@ -866,6 +913,7 @@
866
913
  --gog-calendar-weekday-padding: var(--gog-space-4) 0;
867
914
  --gog-calendar-weekday-color: var(--gog-muted-text-color);
868
915
  --gog-calendar-weekday-font-size: var(--gog-text-xs);
916
+ --gog-calendar-weekday-line-height: var(--gog-line-height-none);
869
917
  --gog-calendar-weekday-font-weight: var(--gog-font-weight-semibold);
870
918
  --gog-calendar-weekday-text-transform: var(--gog-text-transform);
871
919
  --gog-calendar-day-radius: calc(var(--gog-radius) - 2px);
@@ -895,12 +943,12 @@
895
943
  --gog-calendar-divider-width: 1px;
896
944
  --gog-calendar-divider-style: solid;
897
945
  --gog-calendar-divider-color: var(--gog-border-color);
898
- --gog-calendar-time-gap: var(--gog-space-6);
899
- --gog-calendar-time-margin: var(--gog-space-10);
946
+ --gog-calendar-time-gap: var(--gog-space-8);
947
+ --gog-calendar-time-margin: var(--gog-space-12);
900
948
  --gog-calendar-time-input-width: 3.5rem;
901
- --gog-calendar-time-input-padding: var(--gog-space-4) var(--gog-space-6);
949
+ --gog-calendar-time-input-padding: var(--gog-space-4) var(--gog-space-8);
902
950
  --gog-calendar-time-input-bg: var(--gog-background-color);
903
- --gog-calendar-action-padding: var(--gog-space-4) var(--gog-space-10);
951
+ --gog-calendar-action-padding: var(--gog-space-4) var(--gog-space-8);
904
952
  --gog-calendar-footer-gap: var(--gog-space-8);
905
953
  --gog-calendar-xsm-font-size: var(--gog-text-xs);
906
954
  --gog-calendar-xsm-day-size: 24px;
@@ -911,6 +959,7 @@
911
959
  --gog-calendar-lg-font-size: var(--gog-text-md);
912
960
  --gog-calendar-lg-day-size: 40px;
913
961
  --gog-calendar-slg-font-size: var(--gog-text-lg);
962
+ --gog-calendar-line-height: var(--gog-line-height-normal);
914
963
  --gog-calendar-slg-day-size: 46px;
915
964
 
916
965
  /* ── Card ──────────────────────────────────────────────────────────────────
@@ -955,17 +1004,17 @@
955
1004
  --gog-card-footer-padding-top: var(--gog-space-sm);
956
1005
 
957
1006
  --gog-card-xsm-padding-y: var(--gog-space-8);
958
- --gog-card-xsm-padding-x: var(--gog-space-10);
959
- --gog-card-xsm-gap: var(--gog-space-6);
1007
+ --gog-card-xsm-padding-x: var(--gog-space-12);
1008
+ --gog-card-xsm-gap: var(--gog-space-8);
960
1009
  --gog-card-sm-padding-y: var(--gog-space-12);
961
- --gog-card-sm-padding-x: var(--gog-space-14);
1010
+ --gog-card-sm-padding-x: var(--gog-space-16);
962
1011
  --gog-card-sm-gap: var(--gog-space-sm);
963
1012
  --gog-card-md-padding-y: var(--gog-space-md);
964
1013
  --gog-card-md-padding-x: var(--gog-space-20);
965
1014
  --gog-card-md-gap: var(--gog-space-12);
966
1015
  --gog-card-lg-padding-y: var(--gog-space-20);
967
1016
  --gog-card-lg-padding-x: var(--gog-space-lg);
968
- --gog-card-lg-gap: var(--gog-space-14);
1017
+ --gog-card-lg-gap: var(--gog-space-16);
969
1018
  --gog-card-slg-padding-y: var(--gog-space-28);
970
1019
  --gog-card-slg-padding-x: var(--gog-space-32);
971
1020
  --gog-card-slg-gap: var(--gog-space-md);
@@ -974,7 +1023,7 @@
974
1023
  Box/label/icon size and padding come from the `--gog-control-checkbox-*` scale;
975
1024
  checkbox.component.ts maps the `size` input onto the host. */
976
1025
  --gog-checkbox-font-family: var(--gog-font-body);
977
- --gog-checkbox-gap: var(--gog-space-10);
1026
+ --gog-checkbox-gap: var(--gog-space-12);
978
1027
  --gog-checkbox-radius: var(--gog-radius);
979
1028
  --gog-checkbox-border-width: var(--gog-control-border-width);
980
1029
  --gog-checkbox-border-style: var(--gog-control-border-style);
@@ -983,6 +1032,8 @@
983
1032
  --gog-checkbox-checked-bg: var(--gog-accent-color);
984
1033
  --gog-checkbox-checked-border: var(--gog-accent-color);
985
1034
  --gog-checkbox-icon-color: var(--gog-accent-text-color, var(--gog-primary-color));
1035
+ /* A glyph in its own box: role label-none, so the box is the glyph and not the font. */
1036
+ --gog-checkbox-icon-line-height: var(--gog-line-height-none);
986
1037
  --gog-checkbox-label-color: var(--gog-muted-text-color);
987
1038
  --gog-checkbox-label-line-height: var(--gog-line-height-snug);
988
1039
  --gog-checkbox-focus-ring: var(--gog-accent-pale);
@@ -998,12 +1049,12 @@
998
1049
  Box/label size reuse the `--gog-control-checkbox-*` scale (see Checkbox above);
999
1050
  radio-group.component.ts maps the `size` input onto the host the same way. */
1000
1051
  --gog-radio-font-family: var(--gog-font-body);
1001
- --gog-radio-group-gap: var(--gog-space-10);
1052
+ --gog-radio-group-gap: var(--gog-space-12);
1002
1053
  --gog-radio-group-label-size: var(--gog-text-sm);
1003
1054
  --gog-radio-group-label-color: var(--gog-muted-text-color);
1004
1055
  --gog-radio-group-option-gap: var(--gog-space-8);
1005
1056
  --gog-radio-group-option-gap-horizontal: var(--gog-space-20);
1006
- --gog-radio-gap: var(--gog-space-10);
1057
+ --gog-radio-gap: var(--gog-space-12);
1007
1058
  --gog-radio-border-width: var(--gog-control-border-width);
1008
1059
  --gog-radio-border-style: var(--gog-control-border-style);
1009
1060
  --gog-radio-border-color: var(--gog-accent-dim);
@@ -1020,6 +1071,7 @@
1020
1071
  --gog-radio-disabled-opacity: var(--gog-disabled-opacity);
1021
1072
  --gog-radio-transition-duration: var(--gog-duration-base);
1022
1073
  --gog-radio-error-font-size: var(--gog-text-xs);
1074
+ --gog-radio-error-line-height: var(--gog-field-error-line-height);
1023
1075
  --gog-radio-error-color: var(--gog-danger-color);
1024
1076
 
1025
1077
  /* ── Chip ──────────────────────────────────────────────────────────────────
@@ -1056,9 +1108,9 @@
1056
1108
  --gog-chip-focus-ring-width: 2px;
1057
1109
  --gog-chip-focus-ring-offset: var(--gog-focus-ring-offset);
1058
1110
 
1059
- --gog-chip-xsm-font-size: 0.6875rem;
1111
+ --gog-chip-xsm-font-size: var(--gog-text-2xs);
1060
1112
  --gog-chip-xsm-padding-block: var(--gog-space-4);
1061
- --gog-chip-xsm-padding-inline: var(--gog-space-6);
1113
+ --gog-chip-xsm-padding-inline: var(--gog-space-8);
1062
1114
  --gog-chip-xsm-gap: var(--gog-space-4);
1063
1115
  --gog-chip-xsm-avatar-size: 0.875rem;
1064
1116
  --gog-chip-xsm-icon-size: 0.6875rem;
@@ -1067,30 +1119,30 @@
1067
1119
  --gog-chip-sm-font-size: var(--gog-text-xs);
1068
1120
  --gog-chip-sm-padding-block: var(--gog-space-4);
1069
1121
  --gog-chip-sm-padding-inline: var(--gog-space-8);
1070
- --gog-chip-sm-gap: var(--gog-space-6);
1122
+ --gog-chip-sm-gap: var(--gog-space-8);
1071
1123
  --gog-chip-sm-avatar-size: 1rem;
1072
1124
  --gog-chip-sm-icon-size: 0.75rem;
1073
1125
  --gog-chip-sm-remove-size: 0.875rem;
1074
1126
 
1075
1127
  --gog-chip-md-font-size: var(--gog-text-sm);
1076
1128
  --gog-chip-md-padding-block: var(--gog-space-8);
1077
- --gog-chip-md-padding-inline: var(--gog-space-12);
1129
+ --gog-chip-md-padding-inline: var(--gog-space-16);
1078
1130
  --gog-chip-md-gap: var(--gog-space-8);
1079
1131
  --gog-chip-md-avatar-size: 1.25rem;
1080
1132
  --gog-chip-md-icon-size: 0.875rem;
1081
1133
  --gog-chip-md-remove-size: 1rem;
1082
1134
 
1083
1135
  --gog-chip-lg-font-size: var(--gog-text-md);
1084
- --gog-chip-lg-padding-block: var(--gog-space-10);
1085
- --gog-chip-lg-padding-inline: var(--gog-space-14);
1086
- --gog-chip-lg-gap: var(--gog-space-10);
1136
+ --gog-chip-lg-padding-block: var(--gog-space-12);
1137
+ --gog-chip-lg-padding-inline: var(--gog-space-24);
1138
+ --gog-chip-lg-gap: var(--gog-space-12);
1087
1139
  --gog-chip-lg-avatar-size: 1.5rem;
1088
1140
  --gog-chip-lg-icon-size: 1rem;
1089
1141
  --gog-chip-lg-remove-size: 1.125rem;
1090
1142
 
1091
1143
  --gog-chip-slg-font-size: var(--gog-text-lg);
1092
1144
  --gog-chip-slg-padding-block: var(--gog-space-12);
1093
- --gog-chip-slg-padding-inline: var(--gog-space-16);
1145
+ --gog-chip-slg-padding-inline: var(--gog-space-24);
1094
1146
  --gog-chip-slg-gap: var(--gog-space-12);
1095
1147
  --gog-chip-slg-avatar-size: 1.75rem;
1096
1148
  --gog-chip-slg-icon-size: 1.125rem;
@@ -1115,13 +1167,20 @@
1115
1167
  --gog-dialog-shadow: 0 24px 48px rgba(0, 0, 0, 0.5);
1116
1168
  --gog-dialog-min-width: 320px;
1117
1169
  --gog-dialog-max-height: 90vh;
1118
- --gog-dialog-header-padding: var(--gog-space-16) var(--gog-space-20) var(--gog-space-14);
1170
+ --gog-dialog-header-padding: var(--gog-space-16) var(--gog-space-20) var(--gog-space-16);
1119
1171
  --gog-dialog-header-gap: var(--gog-space-12);
1120
1172
  --gog-dialog-header-border-color: var(--gog-border-color);
1173
+ /* `.gog-dialog__title` is the library's only <h2>; before this it rendered at the browser's
1174
+ default 24px bold rather than a stated size. --gog-text-xl is exactly today's rendered size,
1175
+ so this states an accident as a declaration rather than changing anything visible. `snug`
1176
+ (1.3) is law 4's `heading` role (docs/component-geometry.md, D4). */
1177
+ --gog-dialog-title-font-size: var(--gog-text-xl);
1178
+ --gog-dialog-title-line-height: var(--gog-line-height-snug);
1121
1179
  --gog-dialog-body-padding: var(--gog-space-20);
1122
1180
  --gog-dialog-body-max-height: calc(var(--gog-dialog-max-height) - 60px);
1123
1181
  --gog-dialog-close-size: 2rem;
1124
1182
  --gog-dialog-close-font-size: var(--gog-text-sm);
1183
+ --gog-dialog-close-line-height: var(--gog-line-height-none);
1125
1184
  --gog-dialog-close-color: var(--gog-muted-text-color);
1126
1185
  --gog-dialog-close-hover-color: var(--gog-text-color);
1127
1186
  --gog-dialog-close-hover-bg: var(--gog-hover-color);
@@ -1133,7 +1192,37 @@
1133
1192
  /* Confirmation dialog */
1134
1193
  --gog-confirmation-dialog-gap: var(--gog-space-12);
1135
1194
  --gog-confirmation-dialog-min-width: 320px;
1136
- --gog-confirmation-dialog-max-width: 440px;
1195
+ /* The title and description carried dead utility classes (`heading-md` / `body-sm`) with no
1196
+ CSS rule anywhere in the library, so both rendered at whatever the browser inherited rather
1197
+ than a step of the type scale (docs/backlog.md, fixed here). `lg` for the title rather than
1198
+ `md`: the dead class named `md`, but it never ran, so it is not evidence of intent — 18.72px
1199
+ is what actually rendered, and --gog-text-lg (18px) is the nearest step to that, so this
1200
+ states what shipped rather than silently shrinking every confirmation dialog. The description
1201
+ takes `sm`, the size every other muted secondary line in the library already uses. */
1202
+ --gog-confirmation-dialog-title-font-size: var(--gog-text-lg);
1203
+ --gog-confirmation-dialog-title-line-height: var(--gog-line-height-snug);
1204
+ --gog-confirmation-dialog-description-font-size: var(--gog-text-sm);
1205
+ --gog-confirmation-dialog-description-line-height: var(--gog-line-height-relaxed);
1206
+ /* L9 (docs/component-geometry.md, "D7 — taken"): the description wraps, so its cap is a
1207
+ measure — 51ch at 16px, the nearest whole character to today's 440px, so this changes
1208
+ robustness to a font-size change, not the pixels anyone sees today. The 16px is
1209
+ `.confirm-dialog`'s own inherited size (it declares no font-size of its own; see
1210
+ confirmation-dialog.component.scss), not the description's — the description now reads
1211
+ --gog-confirmation-dialog-description-font-size (14px, fixed above), but a `ch` cap resolves
1212
+ against the element `max-width` is declared on, never a descendant's, so that change does not
1213
+ move this number. What it changes is the *measure* the 440px produces against a 14px
1214
+ description: 439.9px ÷ (0.5391 × 14px) ≈ 58ch by hand (scripts/survey-measure.mjs's own
1215
+ `chCount` line is a tautology for this token — it resolves against `.confirm-dialog`'s 16px,
1216
+ not the description's font; see that script's reason string for the full account), still
1217
+ inside L9's 45–75 band, so no token value here needs to change.
1218
+
1219
+ L8's viewport clamp is deliberately NOT here, unlike the other three overlays: this renders
1220
+ inside .gog-dialog__panel, which already caps itself at 90vw (an inline style in
1221
+ dialog.component.html), and .gog-dialog__body spends --gog-dialog-body-padding a side inside
1222
+ that. The width available here is therefore `0.9 * 100vw - 40px`, tighter than any
1223
+ `100vw - margin` clamp at every viewport above 80px, so a second clamp on the child could
1224
+ never bind. An inert declaration is the thing this repo keeps finding rather than shipping. */
1225
+ --gog-confirmation-dialog-max-width: 51ch;
1137
1226
  --gog-confirmation-dialog-color: var(--gog-text-color);
1138
1227
  --gog-confirmation-dialog-description-color: var(--gog-muted-text-color);
1139
1228
  --gog-confirmation-dialog-actions-gap: var(--gog-space-sm);
@@ -1150,6 +1239,7 @@
1150
1239
  --gog-autocomplete-gap: var(--gog-space-4);
1151
1240
  --gog-autocomplete-label-color: var(--gog-accent-color);
1152
1241
  --gog-autocomplete-label-font-size: var(--gog-text-sm);
1242
+ --gog-autocomplete-label-line-height: var(--gog-field-label-line-height);
1153
1243
  --gog-autocomplete-label-font-weight: var(--gog-font-weight-semibold);
1154
1244
  --gog-autocomplete-label-letter-spacing: var(--gog-letter-spacing);
1155
1245
  --gog-autocomplete-label-text-transform: var(--gog-text-transform);
@@ -1171,12 +1261,13 @@
1171
1261
  --gog-autocomplete-error-border-color: var(--gog-danger-color);
1172
1262
  --gog-autocomplete-error-font-family: var(--gog-font-body);
1173
1263
  --gog-autocomplete-error-font-size: var(--gog-text-xs);
1264
+ --gog-autocomplete-error-line-height: var(--gog-field-error-line-height);
1174
1265
  /* Floor for an auto-width field, so [fullWidth]="false" cannot collapse it to its chrome. */
1175
1266
  --gog-autocomplete-min-width: 120px;
1176
1267
  /* Trailing chrome: spinner and clear button, clear outermost — the arrangement the other
1177
1268
  dropdowns settled on, so all of them line up in a form. */
1178
1269
  --gog-autocomplete-actions-inset: var(--gog-control-icon-offset);
1179
- --gog-autocomplete-actions-gap: var(--gog-space-6);
1270
+ --gog-autocomplete-actions-gap: var(--gog-space-8);
1180
1271
  /* Right padding on the input, reserving room for the actions above. */
1181
1272
  --gog-autocomplete-actions-reserve: 40px;
1182
1273
  --gog-autocomplete-clear-color: var(--gog-autocomplete-placeholder-color);
@@ -1190,14 +1281,21 @@
1190
1281
  --gog-autocomplete-panel-border-style: var(--gog-panel-border-style);
1191
1282
  --gog-autocomplete-panel-border-color: var(--gog-border-color);
1192
1283
  --gog-autocomplete-panel-radius: var(--gog-radius);
1193
- --gog-autocomplete-panel-gap: var(--gog-space-2);
1284
+ --gog-autocomplete-panel-gap: var(--gog-space-4);
1194
1285
  --gog-autocomplete-panel-max-height: 260px;
1195
1286
  /* Ceiling for a content-sized panel, so one very long option cannot span the viewport. */
1196
1287
  --gog-autocomplete-panel-max-width: 420px;
1197
1288
  --gog-autocomplete-options-padding: var(--gog-space-4);
1198
- --gog-autocomplete-option-padding: var(--gog-space-8) var(--gog-space-10);
1199
- --gog-autocomplete-option-radius: calc(var(--gog-radius) - 4px);
1200
- --gog-autocomplete-option-gap: var(--gog-space-10);
1289
+ --gog-autocomplete-option-padding: var(--gog-space-8) var(--gog-space-16);
1290
+ /* Concentric with the panel: the option row is inset by the list's own padding, so its corner
1291
+ is the panel's corner minus that distance. Written as the two tokens rather than as
1292
+ `calc(var(--gog-radius) - 4px)`, which was right only at `--gog-density: 1` -- the padding
1293
+ scales with density and a restated `4px` does not. */
1294
+ --gog-autocomplete-option-radius: max(
1295
+ 0px,
1296
+ calc(var(--gog-autocomplete-panel-radius) - var(--gog-autocomplete-options-padding))
1297
+ );
1298
+ --gog-autocomplete-option-gap: var(--gog-space-12);
1201
1299
  --gog-autocomplete-option-color: var(--gog-text-color);
1202
1300
  --gog-autocomplete-option-hover-bg: var(--gog-hover-color);
1203
1301
  --gog-autocomplete-option-press-bg: var(--gog-border-color);
@@ -1214,6 +1312,7 @@
1214
1312
  --gog-autocomplete-option-height: 36px;
1215
1313
  --gog-autocomplete-empty-color: var(--gog-autocomplete-placeholder-color);
1216
1314
  --gog-autocomplete-empty-font-size: var(--gog-text-sm);
1315
+ --gog-autocomplete-empty-line-height: var(--gog-line-height-normal);
1217
1316
  --gog-autocomplete-float-label-reserve: var(--gog-field-float-label-reserve);
1218
1317
  --gog-autocomplete-float-label-in-top: var(--gog-field-float-label-in-top);
1219
1318
  --gog-autocomplete-float-label-over-gap: var(--gog-field-float-label-over-gap);
@@ -1230,8 +1329,12 @@
1230
1329
  --gog-badge-dot-size: 0.5rem;
1231
1330
  --gog-badge-padding-inline: var(--gog-space-4);
1232
1331
  --gog-badge-radius: 999px;
1233
- /* How far the badge hangs outside its host's corner. */
1234
- --gog-badge-offset: var(--gog-space-6);
1332
+ /* How far the badge hangs outside its host's corner. `space-8` rather than the `space-6` it
1333
+ was: every off-grid step this library had sat exactly halfway between two grid steps, so the
1334
+ 4px grid made the tie-break a real decision, and it rounds up (docs/component-geometry.md,
1335
+ D3b). Here that is also the better answer on its own terms — a 20px badge hanging 8px out
1336
+ clears the host's corner radius at `--gog-radius: 8px`, which 6px did not quite do. */
1337
+ --gog-badge-offset: var(--gog-space-8);
1235
1338
  --gog-badge-border-width: 0;
1236
1339
  --gog-badge-border-style: var(--gog-border-style);
1237
1340
  --gog-badge-border-color: transparent;
@@ -1259,6 +1362,7 @@
1259
1362
  --gog-datepicker-gap: var(--gog-space-4);
1260
1363
  --gog-datepicker-label-color: var(--gog-accent-color);
1261
1364
  --gog-datepicker-label-font-size: var(--gog-text-sm);
1365
+ --gog-datepicker-label-line-height: var(--gog-field-label-line-height);
1262
1366
  --gog-datepicker-label-letter-spacing: var(--gog-letter-spacing);
1263
1367
  --gog-datepicker-label-text-transform: var(--gog-text-transform);
1264
1368
  --gog-datepicker-field-bg: var(--gog-surface-color);
@@ -1279,9 +1383,10 @@
1279
1383
  --gog-datepicker-error-border-color: var(--gog-danger-color);
1280
1384
  --gog-datepicker-error-font-family: var(--gog-font-body);
1281
1385
  --gog-datepicker-error-font-size: var(--gog-text-xs);
1386
+ --gog-datepicker-error-line-height: var(--gog-field-error-line-height);
1282
1387
  --gog-datepicker-min-width: 150px;
1283
1388
  --gog-datepicker-actions-inset: var(--gog-control-icon-offset);
1284
- --gog-datepicker-actions-gap: var(--gog-space-6);
1389
+ --gog-datepicker-actions-gap: var(--gog-space-8);
1285
1390
  /* Right padding on the input, reserving room for the calendar and clear buttons. */
1286
1391
  --gog-datepicker-actions-reserve: 40px;
1287
1392
  --gog-datepicker-icon-color: var(--gog-accent-color);
@@ -1295,7 +1400,7 @@
1295
1400
  --gog-datepicker-panel-border-style: var(--gog-panel-border-style);
1296
1401
  --gog-datepicker-panel-border-color: var(--gog-border-color);
1297
1402
  --gog-datepicker-panel-radius: var(--gog-radius);
1298
- --gog-datepicker-panel-gap: var(--gog-space-2);
1403
+ --gog-datepicker-panel-gap: var(--gog-space-4);
1299
1404
  /* The dropdown surface. Inline mode is `gog-calendar` itself, so it sizes from
1300
1405
  `--gog-calendar-max-width` rather than from this. */
1301
1406
  --gog-datepicker-panel-width: max-content;
@@ -1334,6 +1439,7 @@
1334
1439
  --gog-input-gap: var(--gog-space-4);
1335
1440
  --gog-input-label-color: var(--gog-accent-color);
1336
1441
  --gog-input-label-font-size: var(--gog-text-sm);
1442
+ --gog-input-label-line-height: var(--gog-field-label-line-height);
1337
1443
  --gog-input-label-letter-spacing: var(--gog-letter-spacing);
1338
1444
  --gog-input-label-text-transform: var(--gog-text-transform);
1339
1445
  --gog-input-field-bg: var(--gog-surface-color);
@@ -1350,6 +1456,7 @@
1350
1456
  --gog-input-focus-ring-offset: var(--gog-focus-ring-offset);
1351
1457
  --gog-input-error-color: var(--gog-danger-color);
1352
1458
  --gog-input-error-font-size: var(--gog-text-xs);
1459
+ --gog-input-error-line-height: var(--gog-field-error-line-height);
1353
1460
  /* Extra space above the error line, *on top of* the host's own `--gog-input-gap`, which
1354
1461
  already separates every child of the field. It shipped as `2px` and put this field's error
1355
1462
  6px under it while `gog-select`, `gog-autocomplete` and `gog-datepicker` — same gap, no
@@ -1358,6 +1465,7 @@
1358
1465
  pushed further than the rest. */
1359
1466
  --gog-input-error-offset: 0px;
1360
1467
  --gog-input-icon-color: var(--gog-muted-text-color);
1468
+ --gog-input-icon-line-height: var(--gog-line-height-none);
1361
1469
  --gog-input-icon-hover-color: var(--gog-accent-color);
1362
1470
  --gog-input-icon-action-radius: calc(var(--gog-radius) - 4px);
1363
1471
  --gog-input-icon-focus-ring-width: 2px;
@@ -1380,12 +1488,16 @@
1380
1488
  `gog-toast` and `gog-accordion` keep their flat `0px` on purpose: those are a chosen shape,
1381
1489
  not a number that forgot where it came from. */
1382
1490
  --gog-input-clear-radius: calc(var(--gog-radius) / 4);
1491
+ --gog-input-clear-line-height: var(--gog-line-height-none);
1383
1492
  --gog-input-clear-icon-ratio: var(--gog-control-clear-icon-ratio);
1384
1493
  /*
1385
1494
  The textarea's clear button gets a full-size glyph. The 0.7 ratio above suits the dense
1386
1495
  single-line trigger of a dropdown; on a large multi-line box it reads as a speck.
1387
1496
  */
1388
1497
  --gog-textarea-clear-icon-ratio: 1;
1498
+ /* The field is the one place in the library that renders a paragraph the consumer typed:
1499
+ role prose. */
1500
+ --gog-textarea-line-height: var(--gog-line-height-relaxed);
1389
1501
  /* Custom resize grip — see the `::-webkit-resizer` comment in textarea.component.scss for
1390
1502
  why this replaces rather than restyles the native glyph. Colour follows the field's own
1391
1503
  border by default, not a fixed muted grey, so it reads as part of the field rather than a
@@ -1394,8 +1506,12 @@
1394
1506
  --gog-textarea-resize-grip-color: var(--gog-input-field-border);
1395
1507
  --gog-textarea-resize-grip-opacity: 0.8;
1396
1508
  --gog-textarea-resize-grip-stripe-width: 1.5px;
1397
- --gog-textarea-resize-grip-stripe-gap: var(--gog-space-2);
1398
- --gog-textarea-resize-grip-offset: 3px;
1509
+ /* The three hairlines of the resize grip and the gap between them: a length inside one painted
1510
+ mark, not spacing between two things, so it is off the 4px grid on purpose (OPTICAL_CHROME in
1511
+ check-geometry.mjs). At 4px the three stripes would be a 20px block in the corner of every
1512
+ textarea instead of a 9px hint. */
1513
+ --gog-textarea-resize-grip-stripe-gap: 2px;
1514
+ --gog-textarea-resize-grip-offset: var(--gog-space-4);
1399
1515
  /*
1400
1516
  Both default to 0 and are overwritten per instance, as an inline style on the field, from
1401
1517
  the component's own ResizeObserver — they close the gap that opens once the field has been
@@ -1429,6 +1545,7 @@
1429
1545
  --gog-multiselect-options-padding: var(--gog-space-4);
1430
1546
  --gog-multiselect-label-color: var(--gog-accent-color);
1431
1547
  --gog-multiselect-label-font-size: var(--gog-text-sm);
1548
+ --gog-multiselect-label-line-height: var(--gog-field-label-line-height);
1432
1549
  --gog-multiselect-label-letter-spacing: var(--gog-letter-spacing);
1433
1550
  --gog-multiselect-label-text-transform: var(--gog-text-transform);
1434
1551
  --gog-multiselect-field-bg: var(--gog-surface-color);
@@ -1446,6 +1563,7 @@
1446
1563
  --gog-multiselect-focus-ring-offset: var(--gog-focus-ring-offset);
1447
1564
  --gog-multiselect-error-color: var(--gog-danger-color);
1448
1565
  --gog-multiselect-error-font-size: var(--gog-text-xs);
1566
+ --gog-multiselect-error-line-height: var(--gog-field-error-line-height);
1449
1567
  /* Zero by default since 21.9.0 — see `--gog-input-error-offset` for why. */
1450
1568
  --gog-multiselect-error-offset: 0px;
1451
1569
  --gog-multiselect-border-color: var(--gog-accent-color);
@@ -1453,15 +1571,22 @@
1453
1571
  --gog-multiselect-panel-border: var(--gog-accent-color);
1454
1572
  --gog-multiselect-panel-shadow: var(--gog-panel-shadow);
1455
1573
  --gog-multiselect-panel-max-height: 260px;
1456
- --gog-multiselect-panel-offset: var(--gog-space-2);
1574
+ --gog-multiselect-panel-offset: var(--gog-space-4);
1457
1575
  --gog-multiselect-option-hover-bg: var(--gog-hover-color);
1458
1576
  --gog-multiselect-option-press-bg: var(--gog-border-color);
1459
1577
  --gog-multiselect-option-color: var(--gog-text-color);
1460
- --gog-multiselect-option-gap-inline: var(--gog-space-10);
1578
+ --gog-multiselect-option-gap-inline: var(--gog-space-12);
1461
1579
  /* Estimated row height fed into the panel's up/down placement math; not itself a real
1462
1580
  layout property, so it has no effect unless the JS reads it. */
1463
1581
  --gog-multiselect-option-height: 40px;
1464
- --gog-multiselect-option-radius: calc(var(--gog-radius) - 2px);
1582
+ /* Concentric with the panel. The panel paints `--gog-multiselect-radius` (the field's token --
1583
+ this component has no panel radius of its own) and insets its rows by the list padding, so
1584
+ the row's corner is that radius minus that padding. It had subtracted 2px against 4px of
1585
+ padding, and a restated literal also stops being true once density moves. */
1586
+ --gog-multiselect-option-radius: max(
1587
+ 0px,
1588
+ calc(var(--gog-multiselect-radius) - var(--gog-multiselect-options-padding))
1589
+ );
1465
1590
  --gog-multiselect-option-disabled-opacity: var(--gog-disabled-opacity);
1466
1591
  --gog-multiselect-option-transition-duration: var(--gog-duration-fast);
1467
1592
  --gog-multiselect-checkbox-border: var(--gog-accent-dim);
@@ -1469,30 +1594,42 @@
1469
1594
  --gog-multiselect-checkbox-checked-bg: var(--gog-accent-color);
1470
1595
  --gog-multiselect-checkbox-checked-color: var(--gog-primary-color);
1471
1596
  --gog-multiselect-controls-gap: var(--gog-space-4);
1472
- --gog-multiselect-controls-padding: var(--gog-space-6) var(--gog-space-10);
1473
- --gog-multiselect-actions-gap: var(--gog-space-6);
1474
- --gog-multiselect-filter-padding: var(--gog-space-6);
1475
- --gog-multiselect-filter-input-padding-y: var(--gog-space-6);
1476
- --gog-multiselect-filter-input-padding-x: var(--gog-space-8);
1597
+ --gog-multiselect-controls-padding: var(--gog-space-8) var(--gog-space-12);
1598
+ --gog-multiselect-actions-gap: var(--gog-space-8);
1599
+ --gog-multiselect-filter-padding: var(--gog-space-8);
1600
+ --gog-multiselect-filter-input-padding-y: var(--gog-space-8);
1601
+ --gog-multiselect-filter-input-padding-x: var(--gog-space-16);
1477
1602
  --gog-multiselect-filter-input-bg: var(--gog-background-color);
1478
1603
  --gog-multiselect-filter-input-color: var(--gog-multiselect-field-color);
1479
1604
  --gog-multiselect-filter-input-border: var(--gog-multiselect-field-border);
1480
- --gog-multiselect-filter-input-radius: var(--gog-radius);
1605
+ /* Concentric with the panel, and the concentric answer here is a square corner. The filter is
1606
+ inset by `--gog-multiselect-filter-padding`, which equals the panel's radius -- and where the
1607
+ inset equals the radius, the inner box's corner point lands exactly on the centre of the
1608
+ outer arc, so a right angle is equidistant from the whole curve. It is the only shape that
1609
+ keeps the gap constant, not a value clamped to zero for want of a better one. */
1610
+ --gog-multiselect-filter-input-radius: max(
1611
+ 0px,
1612
+ calc(var(--gog-multiselect-radius) - var(--gog-multiselect-filter-padding))
1613
+ );
1481
1614
  --gog-multiselect-filter-border-width: var(--gog-panel-border-width);
1482
1615
  --gog-multiselect-filter-border-style: var(--gog-panel-border-style);
1483
1616
  --gog-multiselect-filter-border-color: var(--gog-border-color);
1484
- --gog-multiselect-filter-empty-padding: var(--gog-space-10);
1617
+ --gog-multiselect-filter-empty-padding: var(--gog-space-12);
1485
1618
  --gog-multiselect-filter-empty-color: var(--gog-multiselect-placeholder-color);
1486
1619
  /* Matches --gog-select-chevron-inset; see the note there. */
1487
1620
  /* "+N" badge shown when the selection does not fit on one line. */
1488
1621
  --gog-multiselect-overflow-color: var(--gog-multiselect-placeholder-color);
1489
1622
  --gog-multiselect-overflow-font-size: var(--gog-text-sm);
1490
- --gog-multiselect-overflow-gap: var(--gog-space-6);
1623
+ /* It sits on the field values own baseline (align-self: baseline, 21.7.2), so it takes the
1624
+ field text leading rather than a mark leading. */
1625
+ --gog-multiselect-overflow-line-height: var(--gog-field-line-height);
1626
+ --gog-multiselect-overflow-gap: var(--gog-space-8);
1491
1627
  --gog-multiselect-min-width: 120px;
1492
1628
  --gog-multiselect-panel-max-width: 420px;
1493
1629
  --gog-multiselect-actions-inset: var(--gog-control-icon-offset);
1494
1630
  /* A quarter of the corner radius — see `--gog-input-clear-radius` for why. */
1495
1631
  --gog-multiselect-clear-radius: calc(var(--gog-radius) / 4);
1632
+ --gog-multiselect-clear-line-height: var(--gog-line-height-none);
1496
1633
  --gog-multiselect-disabled-opacity: var(--gog-disabled-opacity);
1497
1634
  --gog-multiselect-transition-duration: var(--gog-duration-base);
1498
1635
  --gog-multiselect-float-label-reserve: var(--gog-field-float-label-reserve);
@@ -1518,10 +1655,14 @@
1518
1655
  --gog-menu-shadow: var(--gog-dialog-shadow);
1519
1656
  --gog-menu-font-family: var(--gog-font-body);
1520
1657
  --gog-menu-padding: var(--gog-space-4);
1521
- --gog-menu-gap: var(--gog-space-2);
1658
+ --gog-menu-gap: var(--gog-space-4);
1522
1659
  --gog-menu-offset: var(--gog-space-4);
1523
1660
  --gog-menu-min-width: 180px;
1524
- --gog-menu-max-width: 320px;
1661
+ /* L8's viewport exception (docs/component-geometry.md, "D7 — taken"): a menu portals into
1662
+ <body> and floats over the viewport, not a container. Its items do not wrap (L9 does not
1663
+ apply — the width stays in px), but L8 still does: no edge-inset token exists on this
1664
+ component today, so the margin reads the scale directly. */
1665
+ --gog-menu-max-width: min(320px, calc(100vw - var(--gog-space-16) * 2));
1525
1666
  --gog-menu-max-height: 320px;
1526
1667
  --gog-menu-transition-duration: var(--gog-duration-base);
1527
1668
  --gog-menu-focus-ring: var(--gog-accent-color);
@@ -1535,8 +1676,11 @@
1535
1676
  --gog-menu-item-press-bg: var(--gog-border-color);
1536
1677
  --gog-menu-item-hover-color: var(--gog-text-color);
1537
1678
  --gog-menu-item-font-size: var(--gog-text-sm);
1538
- --gog-menu-item-padding: var(--gog-space-8) var(--gog-space-12);
1539
- --gog-menu-item-radius: var(--gog-radius);
1679
+ --gog-menu-item-padding: var(--gog-space-8) var(--gog-space-16);
1680
+ /* Concentric with the panel, which paints `--gog-panel-radius` (8px larger than the base) and
1681
+ insets its items by `--gog-menu-padding`. Repeating the base radius here made the first and
1682
+ last items visibly squarer than the corner they sit in. */
1683
+ --gog-menu-item-radius: max(0px, calc(var(--gog-menu-radius) - var(--gog-menu-padding)));
1540
1684
  --gog-menu-item-gap: var(--gog-space-sm);
1541
1685
  --gog-menu-item-disabled-opacity: var(--gog-disabled-opacity);
1542
1686
  --gog-menu-item-disabled-color: var(--gog-muted-text-color);
@@ -1547,6 +1691,7 @@
1547
1691
  --gog-paginator-gap: var(--gog-space-4);
1548
1692
  --gog-paginator-ellipsis-color: var(--gog-muted-text-color);
1549
1693
  --gog-paginator-ellipsis-font-size: var(--gog-text-sm);
1694
+ --gog-paginator-ellipsis-line-height: var(--gog-line-height-none);
1550
1695
  --gog-paginator-ellipsis-font-family: var(--gog-font-body);
1551
1696
  /* Enough for a three-digit page size plus the chevron, so the row doesn't shift on change. */
1552
1697
  --gog-paginator-page-size-min-width: 5rem;
@@ -1571,7 +1716,11 @@
1571
1716
  --gog-panel-heading-font-family: var(--gog-font-heading);
1572
1717
  --gog-panel-heading-font-size: var(--gog-text-xl);
1573
1718
  --gog-panel-heading-font-weight: var(--gog-font-weight-semibold);
1574
- --gog-panel-heading-line-height: 1.25;
1719
+ /* Role heading, the same step the card heading takes. It had been 1.25 -- the one leading in
1720
+ the library outside the scale, which runs 1.2 then 1.3 with nothing between. Two headings
1721
+ four steps apart differing by 0.05 is two people picking a nice number, not the inverse
1722
+ relationship law 4 describes; that one holds across the roles, where it is real. */
1723
+ --gog-panel-heading-line-height: var(--gog-line-height-snug);
1575
1724
 
1576
1725
  --gog-panel-outlined-bg: var(--gog-surface-color);
1577
1726
  --gog-panel-outlined-border-color: var(--gog-border-color);
@@ -1597,13 +1746,13 @@
1597
1746
  --gog-panel-footer-gap: var(--gog-space-sm);
1598
1747
  --gog-panel-footer-padding-top: var(--gog-space-sm);
1599
1748
 
1600
- --gog-panel-xsm-padding-y: var(--gog-space-10);
1749
+ --gog-panel-xsm-padding-y: var(--gog-space-12);
1601
1750
  --gog-panel-xsm-padding-x: var(--gog-space-12);
1602
1751
  --gog-panel-xsm-gap: var(--gog-space-sm);
1603
- --gog-panel-sm-padding-y: var(--gog-space-14);
1752
+ --gog-panel-sm-padding-y: var(--gog-space-16);
1604
1753
  --gog-panel-sm-padding-x: var(--gog-space-md);
1605
- --gog-panel-sm-gap: var(--gog-space-10);
1606
- --gog-panel-md-padding-y: var(--gog-space-18);
1754
+ --gog-panel-sm-gap: var(--gog-space-12);
1755
+ --gog-panel-md-padding-y: var(--gog-space-20);
1607
1756
  --gog-panel-md-padding-x: var(--gog-space-20);
1608
1757
  --gog-panel-md-gap: var(--gog-space-12);
1609
1758
  --gog-panel-lg-padding-y: var(--gog-space-lg);
@@ -1627,11 +1776,27 @@
1627
1776
  --gog-progressbar-value-color: var(--gog-muted-text-color);
1628
1777
  --gog-progressbar-value-font-family: var(--gog-font-body);
1629
1778
  --gog-progressbar-value-font-size: var(--gog-text-sm);
1779
+ --gog-progressbar-value-line-height: var(--gog-line-height-none);
1630
1780
  --gog-progressbar-indeterminate-duration: 1.6s;
1631
1781
  --gog-progressbar-indeterminate-easing: cubic-bezier(0.65, 0.05, 0.36, 1);
1632
1782
  /* The reduced-motion stand-in for the indeterminate animation. */
1633
1783
  --gog-progressbar-stripe-size: 6px;
1634
1784
  --gog-progressbar-stripe-color: var(--gog-surface-color);
1785
+ /* The two hairlines that mark where the fill ends, and the reason they are two.
1786
+ WCAG 1.4.11 wants 3:1 for the part of a graphic that carries its meaning, and here that is
1787
+ the boundary — `showValue` is `false` by default, so nothing else states the value. The fill
1788
+ cannot carry it against the track: measured across the whole `--gog-text-color`-to-
1789
+ `--gog-border-color` axis, no single track colour clears 3:1 against all five fills in any
1790
+ theme but `primeng`, because the fills straddle mid-luminance and a track dark enough for the
1791
+ amber warning lands on the blue info (`docs/backlog.md` has the table).
1792
+ A marker can, but not in one tone either: `--gog-surface-color` alone is 1.79:1 on
1793
+ `material`'s warning fill, `--gog-text-color` alone is 1.06:1 on `one-dark`'s success. As a
1794
+ pair they always work — the ink line is 3.25:1 to 9.57:1 against the track in all eleven
1795
+ themes, and whichever tone a fill sits close to, the other one does not. `check:contrast`
1796
+ gates both halves. */
1797
+ --gog-progressbar-edge-width: 1px;
1798
+ --gog-progressbar-edge-color: var(--gog-text-color);
1799
+ --gog-progressbar-edge-backing-color: var(--gog-surface-color);
1635
1800
  /* The buffer tier is the same hue at low opacity, so it reads as "ahead of the fill"
1636
1801
  rather than as a second, competing colour. */
1637
1802
  --gog-progressbar-accent-bg: var(--gog-accent-color);
@@ -1665,7 +1830,19 @@
1665
1830
  --gog-scroll-thumb-bg: var(--gog-accent-dim);
1666
1831
  --gog-scroll-thumb-hover-bg: var(--gog-accent-color);
1667
1832
  --gog-scroll-thumb-active-bg: var(--gog-accent-bright);
1668
- --gog-scroll-thumb-radius: var(--gog-radius);
1833
+ /* Concentric with the track: the thumb is inset on every side by `--gog-scroll-thumb-inset`,
1834
+ so its corner is the track's minus that. Both radii exceed half the thumb's width at either
1835
+ track size (10px and 6px, less 2x2 of inset), so this changes no rendered pixel today -- it
1836
+ is here so that a theme raising `--gog-radius` on a wide scroller keeps the two curves
1837
+ parallel instead of letting the thumb match the track it sits inside. */
1838
+ --gog-scroll-thumb-radius: max(
1839
+ 0px,
1840
+ calc(var(--gog-scroll-track-radius) - var(--gog-scroll-thumb-inset))
1841
+ );
1842
+ /* The thumb's clearance inside its own track, off the 4px grid for the same reason
1843
+ `--gog-toggle-thumb-inset` is: a length inside a single painted mark defines that mark's
1844
+ shape rather than spacing two things apart, and 4px on a thin scrollbar would leave a thumb
1845
+ barely wider than the hairline it rides in. Listed in OPTICAL_CHROME. */
1669
1846
  --gog-scroll-thumb-inset: 2px;
1670
1847
  --gog-scroll-corner-bg: transparent;
1671
1848
  --gog-scroll-fade-duration: var(--gog-duration-base);
@@ -1682,7 +1859,7 @@
1682
1859
  `thin` variant gets more of it since its 6px track leaves the least visible thumb to aim
1683
1860
  at; both land the effective hit width in the ~22-24px range generally recommended for a
1684
1861
  comfortable pointer target. */
1685
- --gog-scroll-normal-thumb-hit-padding: var(--gog-space-6);
1862
+ --gog-scroll-normal-thumb-hit-padding: var(--gog-space-8);
1686
1863
  --gog-scroll-thin-thumb-hit-padding: var(--gog-space-8);
1687
1864
 
1688
1865
  /* ── Select ────────────────────────────────────────────────────────────────── */
@@ -1691,6 +1868,7 @@
1691
1868
  --gog-select-gap: var(--gog-space-4);
1692
1869
  --gog-select-label-color: var(--gog-accent-color);
1693
1870
  --gog-select-label-font-size: var(--gog-text-sm);
1871
+ --gog-select-label-line-height: var(--gog-field-label-line-height);
1694
1872
  --gog-select-label-letter-spacing: var(--gog-letter-spacing);
1695
1873
  --gog-select-label-text-transform: var(--gog-text-transform);
1696
1874
  --gog-select-field-bg: var(--gog-surface-color);
@@ -1707,6 +1885,7 @@
1707
1885
  --gog-select-focus-ring-offset: var(--gog-focus-ring-offset);
1708
1886
  --gog-select-error-color: var(--gog-danger-color);
1709
1887
  --gog-select-error-font-size: var(--gog-text-xs);
1888
+ --gog-select-error-line-height: var(--gog-field-error-line-height);
1710
1889
  --gog-select-chevron-color: var(--gog-accent-color);
1711
1890
  /*
1712
1891
  Distance from the trigger's right edge to the trailing chrome, matching the leading icon
@@ -1721,35 +1900,43 @@
1721
1900
  /* Ceiling for a content-sized panel, so one very long option cannot span the viewport. */
1722
1901
  --gog-select-panel-max-width: 420px;
1723
1902
  /* Filter box — only rendered when `filter` is on. */
1724
- --gog-select-filter-padding: var(--gog-space-6);
1725
- --gog-select-filter-input-padding-y: var(--gog-space-6);
1726
- --gog-select-filter-input-padding-x: var(--gog-space-8);
1903
+ --gog-select-filter-padding: var(--gog-space-8);
1904
+ --gog-select-filter-input-padding-y: var(--gog-space-8);
1905
+ --gog-select-filter-input-padding-x: var(--gog-space-16);
1727
1906
  --gog-select-filter-input-bg: var(--gog-background-color);
1728
1907
  --gog-select-filter-input-color: var(--gog-select-field-color);
1729
1908
  --gog-select-filter-input-border: var(--gog-select-field-border);
1730
- --gog-select-filter-input-radius: var(--gog-radius);
1909
+ /* Concentric with the panel, and the concentric answer here is a square corner. The filter is
1910
+ inset by `--gog-select-filter-padding`, which equals the panel's radius -- and where the inset
1911
+ equals the radius, the inner box's corner point lands exactly on the centre of the outer arc,
1912
+ so a right angle is equidistant from the whole curve. The same case as the multiselect's. */
1913
+ --gog-select-filter-input-radius: max(
1914
+ 0px,
1915
+ calc(var(--gog-select-radius) - var(--gog-select-filter-padding))
1916
+ );
1731
1917
  --gog-select-filter-border-width: var(--gog-panel-border-width);
1732
1918
  --gog-select-filter-border-style: var(--gog-panel-border-style);
1733
1919
  --gog-select-filter-border-color: var(--gog-select-option-border-color, var(--gog-border-color));
1734
- --gog-select-filter-empty-padding: var(--gog-space-10);
1920
+ --gog-select-filter-empty-padding: var(--gog-space-12);
1735
1921
  --gog-select-filter-empty-color: var(--gog-select-placeholder-color);
1736
1922
  /* Clear button — only rendered once a value is selected, see `clearable`. */
1737
1923
  /* A quarter of the corner radius — see `--gog-input-clear-radius` for why. */
1738
1924
  --gog-select-clear-radius: calc(var(--gog-radius) / 4);
1925
+ --gog-select-clear-line-height: var(--gog-line-height-none);
1739
1926
  --gog-select-clear-icon-ratio: var(--gog-control-clear-icon-ratio);
1740
- --gog-select-clear-gap: var(--gog-space-6);
1927
+ --gog-select-clear-gap: var(--gog-space-8);
1741
1928
  --gog-select-clear-color: var(--gog-select-placeholder-color);
1742
1929
  --gog-select-clear-hover-color: var(--gog-select-label-color);
1743
1930
  --gog-select-control-gap: var(--gog-space-12);
1744
1931
  --gog-select-panel-bg: var(--gog-surface-color);
1745
1932
  --gog-select-panel-shadow: var(--gog-panel-shadow);
1746
1933
  --gog-select-panel-max-height: 260px;
1747
- --gog-select-panel-offset: var(--gog-space-2);
1934
+ --gog-select-panel-offset: var(--gog-space-4);
1748
1935
  --gog-select-option-hover-bg: var(--gog-hover-color);
1749
1936
  --gog-select-option-press-bg: var(--gog-border-color);
1750
1937
  --gog-select-option-selected-color: var(--gog-accent-color);
1751
1938
  --gog-select-option-color: var(--gog-text-color);
1752
- --gog-select-option-gap: var(--gog-space-10);
1939
+ --gog-select-option-gap: var(--gog-space-12);
1753
1940
  /* Estimated row height fed into the panel's up/down placement math; not itself a real
1754
1941
  layout property, so it has no effect unless the JS reads it. */
1755
1942
  --gog-select-option-height: 40px;
@@ -1801,13 +1988,15 @@
1801
1988
  --gog-slider-label-font-family: var(--gog-font-heading);
1802
1989
  --gog-slider-value-font-family: var(--gog-font-mono);
1803
1990
  --gog-slider-error-font-family: var(--gog-font-body);
1804
- --gog-slider-gap: var(--gog-space-6);
1991
+ --gog-slider-gap: var(--gog-space-8);
1805
1992
  --gog-slider-label-color: var(--gog-accent-color);
1806
1993
  --gog-slider-label-font-size: var(--gog-text-sm);
1994
+ --gog-slider-label-line-height: var(--gog-field-label-line-height);
1807
1995
  --gog-slider-label-letter-spacing: var(--gog-letter-spacing);
1808
1996
  --gog-slider-label-text-transform: var(--gog-text-transform);
1809
1997
  --gog-slider-value-color: var(--gog-accent-color);
1810
1998
  --gog-slider-value-font-size: var(--gog-text-sm);
1999
+ --gog-slider-value-line-height: var(--gog-line-height-none);
1811
2000
  --gog-slider-value-min-width: 40px;
1812
2001
  --gog-slider-track-height: 4px;
1813
2002
  --gog-slider-track-area-height: 20px;
@@ -1844,8 +2033,10 @@
1844
2033
  --gog-slider-focus-ring-width: var(--gog-focus-ring-width);
1845
2034
  --gog-slider-range-color: var(--gog-muted-text-color);
1846
2035
  --gog-slider-range-font-size: var(--gog-text-xs);
2036
+ --gog-slider-range-line-height: var(--gog-line-height-none);
1847
2037
  --gog-slider-error-color: var(--gog-danger-color);
1848
2038
  --gog-slider-error-font-size: var(--gog-text-xs);
2039
+ --gog-slider-error-line-height: var(--gog-field-error-line-height);
1849
2040
  --gog-slider-disabled-opacity: var(--gog-disabled-opacity);
1850
2041
 
1851
2042
  /* ── Spinner ──────────────────────────────────────────────────────────────── */
@@ -1908,37 +2099,43 @@
1908
2099
  --gog-table-header-letter-spacing: var(--gog-letter-spacing);
1909
2100
  --gog-table-header-text-transform: var(--gog-text-transform);
1910
2101
  --gog-table-num-col-width: 48px;
1911
- --gog-table-th-inner-gap: var(--gog-space-6);
2102
+ --gog-table-th-inner-gap: var(--gog-space-8);
1912
2103
  --gog-table-sort-icon-size: 0.9em;
1913
2104
  --gog-table-sort-icon-width: 1.1em;
1914
2105
  --gog-table-sort-icon-opacity: 0.6;
1915
- --gog-table-empty-padding: var(--gog-space-24) var(--gog-space-14);
2106
+ --gog-table-empty-padding: var(--gog-space-24) var(--gog-space-16);
1916
2107
  --gog-table-empty-font-size: var(--gog-text-md);
1917
- --gog-table-loading-padding: var(--gog-space-32) var(--gog-space-14);
2108
+ --gog-table-empty-line-height: var(--gog-line-height-normal);
2109
+ --gog-table-loading-padding: var(--gog-space-32) var(--gog-space-16);
1918
2110
  --gog-table-loading-opacity: 0.5;
1919
2111
  --gog-table-row-transition-duration: var(--gog-duration-fast);
1920
2112
  --gog-table-footer-gap: var(--gog-space-sm);
1921
2113
  --gog-table-footer-min-height: 32px;
1922
2114
  --gog-table-total-font-size: var(--gog-text-xs);
2115
+ --gog-table-total-line-height: var(--gog-line-height-normal);
1923
2116
  --gog-table-total-letter-spacing: 0.5px;
1924
2117
  --gog-table-total-text-transform: var(--gog-text-transform);
1925
2118
  --gog-table-num-font-size: var(--gog-text-xs);
1926
- --gog-table-padding-h: var(--gog-space-14);
1927
- --gog-table-xsm-padding-v: var(--gog-space-2);
2119
+ --gog-table-num-line-height: var(--gog-line-height-normal);
2120
+ --gog-table-padding-h: var(--gog-space-16);
2121
+ --gog-table-xsm-padding-v: var(--gog-space-4);
1928
2122
  --gog-table-xsm-th-font-size: var(--gog-text-xs);
1929
2123
  --gog-table-xsm-td-font-size: var(--gog-text-xs);
1930
- --gog-table-sm-padding-v: var(--gog-space-2);
2124
+ --gog-table-sm-padding-v: var(--gog-space-4);
1931
2125
  --gog-table-sm-th-font-size: var(--gog-text-xs);
1932
2126
  --gog-table-sm-td-font-size: var(--gog-text-xs);
1933
- --gog-table-md-padding-v: var(--gog-space-6);
2127
+ --gog-table-md-padding-v: var(--gog-space-8);
1934
2128
  --gog-table-md-th-font-size: var(--gog-text-xs);
1935
2129
  --gog-table-md-td-font-size: var(--gog-text-sm);
1936
- --gog-table-lg-padding-v: var(--gog-space-10);
2130
+ --gog-table-lg-padding-v: var(--gog-space-12);
1937
2131
  --gog-table-lg-th-font-size: var(--gog-text-sm);
1938
2132
  --gog-table-lg-td-font-size: var(--gog-text-md);
1939
- --gog-table-slg-padding-v: var(--gog-space-14);
2133
+ --gog-table-slg-padding-v: var(--gog-space-16);
1940
2134
  --gog-table-slg-th-font-size: var(--gog-text-md);
1941
2135
  --gog-table-slg-td-font-size: var(--gog-text-lg);
2136
+ /* One value for every size step: the role picks the leading and the size does not (D4). */
2137
+ --gog-table-td-line-height: var(--gog-line-height-normal);
2138
+ --gog-table-th-line-height: var(--gog-line-height-normal);
1942
2139
 
1943
2140
  /* ── Tabs ──────────────────────────────────────────────────────────────────
1944
2141
  `--gog-tabs-tab-bg`, `-tab-color`, `-tab-padding` and `-tab-font-size` are intentionally
@@ -1979,15 +2176,15 @@
1979
2176
  --gog-tabs-focus-ring-color: var(--gog-accent-color);
1980
2177
  --gog-tabs-panel-padding: var(--gog-space-md);
1981
2178
  --gog-tabs-panel-color: var(--gog-text-color);
1982
- --gog-tabs-xsm-padding: var(--gog-space-6) var(--gog-space-10);
2179
+ --gog-tabs-xsm-padding: var(--gog-space-8) var(--gog-space-16);
1983
2180
  --gog-tabs-xsm-font-size: var(--gog-text-xs);
1984
- --gog-tabs-sm-padding: var(--gog-space-8) var(--gog-space-14);
2181
+ --gog-tabs-sm-padding: var(--gog-space-8) var(--gog-space-16);
1985
2182
  --gog-tabs-sm-font-size: var(--gog-text-sm);
1986
- --gog-tabs-md-padding: var(--gog-space-12) var(--gog-space-18);
2183
+ --gog-tabs-md-padding: var(--gog-space-12) var(--gog-space-24);
1987
2184
  --gog-tabs-md-font-size: var(--gog-text-md);
1988
- --gog-tabs-lg-padding: var(--gog-space-16) var(--gog-space-24);
2185
+ --gog-tabs-lg-padding: var(--gog-space-16) var(--gog-space-32);
1989
2186
  --gog-tabs-lg-font-size: var(--gog-text-lg);
1990
- --gog-tabs-slg-padding: var(--gog-space-20) var(--gog-space-28);
2187
+ --gog-tabs-slg-padding: var(--gog-space-20) var(--gog-space-40);
1991
2188
  --gog-tabs-slg-font-size: var(--gog-text-xl);
1992
2189
 
1993
2190
  /* ── Tag ──────────────────────────────────────────────────────────────────
@@ -2000,9 +2197,21 @@
2000
2197
  --gog-tag-warning-color: var(--gog-warning-color);
2001
2198
  --gog-tag-info-color: var(--gog-info-color);
2002
2199
  --gog-tag-bg-mix: 10%;
2003
- --gog-tag-color-mix: 82%;
2200
+ /* The label is the status hue mixed **halfway toward the page's ink**, and both halves of that
2201
+ changed in 21.10.0. It was 82% of the hue mixed toward literal `black`, which is a light-theme
2202
+ assumption twice over: on a dark theme it darkened a label that already sat on a dark ground
2203
+ (one-dark's danger tag read 3.11:1), and on a light one 18% of black is not enough to bring a
2204
+ bright hue down to text contrast (material's warning, 2.49:1; primeng's success, 3.06:1).
2205
+ Eleven of the 55 shipped combinations were under WCAG AA and nothing had ever measured them —
2206
+ a tag's colours reach the DOM through `--gog-tag-variant-color`, which `check:contrast` could
2207
+ not follow until the same release taught it to.
2208
+
2209
+ `--gog-text-color` rather than `black` makes the mix follow the theme, and 50% rather than 82%
2210
+ is the same ratio, and the same argument, as `--gog-button-<status>-ink`: as body text the raw
2211
+ status hue clears AA in only a handful of themes. The worst pair is now 4.67:1. */
2212
+ --gog-tag-color-mix: 50%;
2004
2213
  --gog-tag-bg-base: var(--gog-surface-color);
2005
- --gog-tag-color-base: black;
2214
+ --gog-tag-color-base: var(--gog-text-color);
2006
2215
  --gog-tag-border-width: var(--gog-border-width);
2007
2216
  --gog-tag-border-style: var(--gog-border-style);
2008
2217
  --gog-tag-inner-border-width: var(--gog-border-width);
@@ -2011,10 +2220,10 @@
2011
2220
  --gog-tag-radius: max(var(--gog-radius), 2px);
2012
2221
  --gog-tag-pill-radius: 9999px;
2013
2222
 
2014
- --gog-tag-xsm-font-size: 0.6875rem;
2015
- --gog-tag-xsm-padding-block: var(--gog-space-2);
2016
- --gog-tag-xsm-padding-inline: var(--gog-space-6);
2017
- --gog-tag-xsm-gap: var(--gog-space-2);
2223
+ --gog-tag-xsm-font-size: var(--gog-text-2xs);
2224
+ --gog-tag-xsm-padding-block: var(--gog-space-4);
2225
+ --gog-tag-xsm-padding-inline: var(--gog-space-8);
2226
+ --gog-tag-xsm-gap: var(--gog-space-4);
2018
2227
  --gog-tag-xsm-icon-size: 0.6875rem;
2019
2228
 
2020
2229
  --gog-tag-sm-font-size: var(--gog-text-xs);
@@ -2024,21 +2233,21 @@
2024
2233
  --gog-tag-sm-icon-size: 0.75rem;
2025
2234
 
2026
2235
  --gog-tag-md-font-size: var(--gog-text-sm);
2027
- --gog-tag-md-padding-block: var(--gog-space-6);
2028
- --gog-tag-md-padding-inline: var(--gog-space-12);
2029
- --gog-tag-md-gap: var(--gog-space-6);
2236
+ --gog-tag-md-padding-block: var(--gog-space-8);
2237
+ --gog-tag-md-padding-inline: var(--gog-space-16);
2238
+ --gog-tag-md-gap: var(--gog-space-8);
2030
2239
  --gog-tag-md-icon-size: 0.875rem;
2031
2240
 
2032
2241
  --gog-tag-lg-font-size: var(--gog-text-md);
2033
2242
  --gog-tag-lg-padding-block: var(--gog-space-8);
2034
- --gog-tag-lg-padding-inline: var(--gog-space-14);
2243
+ --gog-tag-lg-padding-inline: var(--gog-space-16);
2035
2244
  --gog-tag-lg-gap: var(--gog-space-8);
2036
2245
  --gog-tag-lg-icon-size: 1rem;
2037
2246
 
2038
2247
  --gog-tag-slg-font-size: var(--gog-text-lg);
2039
- --gog-tag-slg-padding-block: var(--gog-space-10);
2040
- --gog-tag-slg-padding-inline: var(--gog-space-16);
2041
- --gog-tag-slg-gap: var(--gog-space-10);
2248
+ --gog-tag-slg-padding-block: var(--gog-space-12);
2249
+ --gog-tag-slg-padding-inline: var(--gog-space-24);
2250
+ --gog-tag-slg-gap: var(--gog-space-12);
2042
2251
  --gog-tag-slg-icon-size: 1.125rem;
2043
2252
 
2044
2253
  /* ── Toast ────────────────────────────────────────────────────────────────── */
@@ -2052,19 +2261,21 @@
2052
2261
  --gog-toast-warning-color: var(--gog-accent-bright);
2053
2262
  --gog-toast-info-color: var(--gog-accent-color);
2054
2263
  --gog-toast-accent-width: 4px;
2055
- --gog-toast-padding: var(--gog-space-12) var(--gog-space-14);
2264
+ --gog-toast-padding: var(--gog-space-12) var(--gog-space-16);
2056
2265
  --gog-toast-radius: 0px;
2057
- --gog-toast-content-gap: var(--gog-space-10);
2266
+ --gog-toast-content-gap: var(--gog-space-12);
2058
2267
  --gog-toast-main-gap: var(--gog-space-sm);
2059
- --gog-toast-actions-gap: var(--gog-space-6);
2268
+ --gog-toast-actions-gap: var(--gog-space-8);
2060
2269
  --gog-toast-message-font-size: var(--gog-text-sm);
2061
2270
  --gog-toast-message-line-height: var(--gog-line-height-relaxed);
2062
2271
  --gog-toast-icon-size: 1rem;
2063
2272
  --gog-toast-icon-line-height: var(--gog-line-height-normal);
2064
2273
  --gog-toast-action-padding: var(--gog-space-4) var(--gog-space-8);
2065
2274
  --gog-toast-action-font-size: var(--gog-text-xs);
2066
- --gog-toast-close-padding: var(--gog-space-2) var(--gog-space-4);
2275
+ --gog-toast-action-line-height: var(--gog-line-height-none);
2276
+ --gog-toast-close-padding: var(--gog-space-4) var(--gog-space-8);
2067
2277
  --gog-toast-close-font-size: var(--gog-text-xs);
2278
+ --gog-toast-close-line-height: var(--gog-line-height-none);
2068
2279
  --gog-toast-progress-height: 3px;
2069
2280
  --gog-toast-progress-opacity: 30%;
2070
2281
  --gog-toast-transition-duration: 0.25s;
@@ -2093,6 +2304,10 @@
2093
2304
  --gog-toggle-thumb-off-bg: var(--gog-surface-color);
2094
2305
  --gog-toggle-thumb-on-bg: var(--gog-accent-text-color, var(--gog-primary-color));
2095
2306
  --gog-toggle-thumb-shadow: 0 1px 3px rgba(0, 0, 0, 0.35);
2307
+ /* The thumb's clearance inside its own track, and off the 4px grid on purpose: at 2px the
2308
+ thumb is 83% of a 24px track, which is what makes a switch read as a switch, and 4px would
2309
+ take it to 67%. A length inside a single painted mark is not spacing between two things —
2310
+ `check-geometry.mjs` lists it in OPTICAL_CHROME with that reason. */
2096
2311
  --gog-toggle-thumb-inset: 2px;
2097
2312
  --gog-toggle-transition-duration: var(--gog-duration-base);
2098
2313
  --gog-toggle-disabled-opacity: var(--gog-disabled-opacity);
@@ -2106,12 +2321,12 @@
2106
2321
  --gog-toggle-state-font-weight: var(--gog-font-weight-semibold);
2107
2322
  --gog-toggle-state-letter-spacing: 0.04em;
2108
2323
  --gog-toggle-state-padding-inline: var(--gog-space-4);
2109
- --gog-toggle-state-offset: var(--gog-space-6);
2324
+ --gog-toggle-state-offset: var(--gog-space-8);
2110
2325
  /* Gap between the wording and the thumb parked at the opposite end. The clearance itself
2111
2326
  (thumb size + this) is computed in the component stylesheet, not here: a `var(` to a
2112
2327
  size-class token is substituted where it is *declared*, so doing that calc on :root would
2113
2328
  freeze it to the md thumb and stop it scaling with `size`. */
2114
- --gog-toggle-state-thumb-gap: var(--gog-space-6);
2329
+ --gog-toggle-state-thumb-gap: var(--gog-space-8);
2115
2330
  --gog-toggle-xsm-track-width: 24px;
2116
2331
  --gog-toggle-xsm-track-height: 14px;
2117
2332
  --gog-toggle-xsm-thumb-size: 10px;
@@ -2137,14 +2352,21 @@
2137
2352
  --gog-toggle-slg-thumb-size: 34px;
2138
2353
  --gog-toggle-slg-label-size: var(--gog-control-checkbox-label-size-slg);
2139
2354
  --gog-toggle-slg-state-font-size: 0.8125rem;
2355
+ --gog-toggle-state-line-height: var(--gog-line-height-none);
2140
2356
 
2141
2357
  /* ── Tooltip ──────────────────────────────────────────────────────────────── */
2142
2358
  --gog-tooltip-font-family: var(--gog-font-body);
2143
2359
  --gog-tooltip-font-size: var(--gog-text-xs);
2144
2360
  --gog-tooltip-line-height: var(--gog-line-height-normal);
2145
- --gog-tooltip-padding: var(--gog-space-6) var(--gog-space-10);
2361
+ --gog-tooltip-padding: var(--gog-space-8) var(--gog-space-12);
2146
2362
  --gog-tooltip-radius: var(--gog-radius);
2147
- --gog-tooltip-max-width: 280px;
2363
+ /* L9 (docs/component-geometry.md, "D7 — taken"): the bubble wraps, so its cap is a measure —
2364
+ 43ch at --gog-tooltip-font-size (12px), the nearest whole character to today's 280px so this
2365
+ changes robustness to a font-size change, not the pixels anyone sees today. It sits under
2366
+ Bringhurst's 45ch floor even so; widening it is a pixel decision this law does not make (see
2367
+ "D7 — taken"). L8's viewport exception is layered on top: no edge-inset token exists on this
2368
+ component today, so the margin reads the scale directly. */
2369
+ --gog-tooltip-max-width: min(43ch, calc(100vw - var(--gog-space-16) * 2));
2148
2370
  /* Caps the gog-scroll wrapping the bubble's content — see tooltip-bubble.component.html.
2149
2371
  A cap, not a fixed height: shorter content stays exactly as tall as it needs to be, this
2150
2372
  only stops something unusually long (a multi-paragraph TemplateRef) from growing to
@@ -2211,6 +2433,18 @@
2211
2433
  --gog-button-primary-hover-shadow: 0 0 16px
2212
2434
  color-mix(in srgb, var(--gog-accent-bright) 45%, transparent);
2213
2435
  --gog-button-ghost-hover-bg: color-mix(in srgb, var(--gog-accent-color) 12%, transparent);
2436
+ /* The table's header labels, one step off the raw accent and toward the page's ink. The
2437
+ accent alone is text on a tinted strip (`--gog-table-header-bg` is `--gog-hover-color`), and
2438
+ it read 4.15:1 in `light` and 4.32:1 in `one-light` — the only two themes it failed, and
2439
+ both by a margin small enough that a per-theme patch would have been the tempting fix. This
2440
+ is the general one: 20% of the ink lifts every theme (worst is now one-light at 5.09:1) and
2441
+ keeps the accent identity the header is drawn in. Flat fallback above stays the raw accent,
2442
+ which is what a browser without `color-mix()` has always shown. */
2443
+ --gog-table-accent-color: color-mix(
2444
+ in srgb,
2445
+ var(--gog-accent-color) 80%,
2446
+ var(--gog-text-color)
2447
+ );
2214
2448
  /* Every other pressable surface, one rule: 20% of the same ingredient its own hover mixes at
2215
2449
  10-12%, so the press is a clear step past the hover without becoming a fill. 20 rather than
2216
2450
  a rounder 25 is measured, not chosen: `check:contrast` resolves these washes over the