pandorga 1.13.0 → 1.14.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.
data/assets/css/base.css CHANGED
@@ -378,6 +378,107 @@ html body {
378
378
  color-mix(in srgb, var(--color-tertiary) 2%, transparent) 98%);
379
379
  }
380
380
 
381
+ /* Highlighter mark tokens */
382
+ html:root,
383
+ html[data-theme="light"] {
384
+ --mark-a: 18%;
385
+ --mark-b: 14%;
386
+ --mark-c: 5%;
387
+ --mark-strong-a: 28%;
388
+ --mark-strong-b: 22%;
389
+ --mark-strong-c: 8%;
390
+ --mark-facet-a: 14%;
391
+ --mark-facet-b: 11%;
392
+ --mark-facet-c: 4%;
393
+ --mark-hover-a: 30%;
394
+ --mark-hover-b: 24%;
395
+ --mark-hover-c: 9%;
396
+ --mark-quiet-a: 12%;
397
+ --mark-quiet-b: 9%;
398
+ --mark-quiet-c: 3%;
399
+ --facet-ink-mix: 82%;
400
+ --mk-angle: 104deg;
401
+ --mk-s0: 0.9%;
402
+ --mk-s1: 2.6%;
403
+ --mk-mid: 58%;
404
+ --mk-end: 98%;
405
+ --mk-h: 100%;
406
+ --mk-y: 50%;
407
+ }
408
+
409
+ html[data-theme="dark"] {
410
+ --mark-a: 14%;
411
+ --mark-b: 10%;
412
+ --mark-c: 4%;
413
+ --mark-strong-a: 22%;
414
+ --mark-strong-b: 17%;
415
+ --mark-strong-c: 6%;
416
+ --mark-facet-a: 14%;
417
+ --mark-facet-b: 11%;
418
+ --mark-facet-c: 4%;
419
+ --mark-hover-a: 24%;
420
+ --mark-hover-b: 18%;
421
+ --mark-hover-c: 7%;
422
+ --mark-quiet-a: 10%;
423
+ --mark-quiet-b: 7%;
424
+ --mark-quiet-c: 3%;
425
+ /* Not 100%: the YouTube red facet was 4.24:1 on its own dark mark. */
426
+ --facet-ink-mix: 85%;
427
+ }
428
+
429
+ /* Shared mark foundation */
430
+ .ledger-mark,
431
+ .ledger-chip,
432
+ .listing-filter-chip:is(:hover, .is-active),
433
+ .lang-pill,
434
+ .source-facet,
435
+ .bib-facet,
436
+ :is(.ledger-cta--emphasis, .ledger-cta--emphasis-alt),
437
+ :is(.detail-action, .detail-type-size-trigger, .article-related-section-pill, .listing-filter-trigger) {
438
+ --mark-ink: var(--color-primary);
439
+ --mark-1: var(--mark-a);
440
+ --mark-2: var(--mark-b);
441
+ --mark-3: var(--mark-c);
442
+ background: linear-gradient(var(--mk-angle), transparent var(--mk-s0), color-mix(in srgb, var(--mark-ink) var(--mark-1), transparent) var(--mk-s1), color-mix(in srgb, var(--mark-ink) var(--mark-2), transparent) var(--mk-mid), color-mix(in srgb, var(--mark-ink) var(--mark-3), transparent) var(--mk-end), transparent 100%) 0 var(--mk-y) / 100% var(--mk-h) no-repeat;
443
+ -webkit-box-decoration-break: clone;
444
+ box-decoration-break: clone;
445
+ }
446
+
447
+ :is(.ledger-chip, .site-rail-link, .listing-filter-chip):nth-child(3n+1) {
448
+ --mk-angle: 104deg;
449
+ --mk-s0: 0.9%;
450
+ --mk-s1: 2.6%;
451
+ --mk-mid: 58%;
452
+ --mk-end: 98%;
453
+ --mk-h: 100%;
454
+ --mk-y: 50%;
455
+ }
456
+
457
+ :is(.ledger-chip, .site-rail-link, .listing-filter-chip):nth-child(3n+2) {
458
+ --mk-angle: 97deg;
459
+ --mk-s0: 1.8%;
460
+ --mk-s1: 4%;
461
+ --mk-mid: 66%;
462
+ --mk-end: 96%;
463
+ --mk-h: 88%;
464
+ --mk-y: 85%;
465
+ }
466
+
467
+ :is(.ledger-chip, .site-rail-link, .listing-filter-chip):nth-child(3n) {
468
+ --mk-angle: 111deg;
469
+ --mk-s0: 0.4%;
470
+ --mk-s1: 1.8%;
471
+ --mk-mid: 48%;
472
+ --mk-end: 92%;
473
+ --mk-h: 90%;
474
+ --mk-y: 20%;
475
+ }
476
+
477
+ :is(.ledger-chip, .listing-filter-chip, .ledger-cta, .detail-action, .detail-type-size-trigger, .site-rail-link, .listing-filter-trigger):focus-visible {
478
+ outline: 2px solid var(--color-primary);
479
+ outline-offset: 2px;
480
+ }
481
+
381
482
  /* ── Page-level accent ────────────────────────────────────────────────
382
483
  The shared triad (theme/theme-vars-block.liquid) declares one primary per
383
484
  theme, but each section of the site reads in its own hue: Projects and
@@ -692,22 +793,31 @@ a.no-underline:active {
692
793
  display: inline-flex;
693
794
  align-items: center;
694
795
  gap: 0.5rem;
695
- padding: 0.35rem 0.75rem;
696
- border: 1.5px solid var(--border-ink);
796
+ margin: 1px;
797
+ /* +0.5px per side keeps the box of the removed 1.5px border (with the margin). */
798
+ padding: calc(0.35rem + 0.5px) calc(0.75rem + 0.5px);
799
+ border: 0;
697
800
  border-radius: var(--radius-card);
698
- background: var(--color-surface-card);
801
+ --mark-ink: var(--color-on-surface-variant);
802
+ --mark-1: var(--mark-quiet-a);
803
+ --mark-2: var(--mark-quiet-b);
804
+ --mark-3: var(--mark-quiet-c);
699
805
  color: var(--color-on-surface-variant);
700
806
  cursor: pointer;
701
807
  transition: color var(--motion-duration-fast) var(--motion-ease-default),
702
- border-color var(--motion-duration-fast) var(--motion-ease-default),
703
808
  background-color var(--motion-duration-fast) var(--motion-ease-default);
704
809
  }
705
810
 
811
+ /* Neutral control: a quiet gray mark at rest, a deeper one on hover and
812
+ while its panel is open. */
706
813
  .listing-filter-trigger:hover,
707
814
  .listing-filter-trigger[aria-expanded="true"] {
708
- color: var(--color-secondary);
709
- border-color: var(--color-secondary);
710
- background: var(--color-surface-high);
815
+ --mark-1: var(--mark-hover-a);
816
+ --mark-2: var(--mark-hover-b);
817
+ --mark-3: var(--mark-hover-c);
818
+ /* Darkened in light like the strong marks: plain secondary on the gray
819
+ hover mark was 3.65:1. */
820
+ color: color-mix(in srgb, var(--color-secondary) var(--facet-ink-mix), var(--color-on-surface));
711
821
  }
712
822
 
713
823
  .listing-filter-trigger .material-symbols-outlined {
@@ -816,9 +926,9 @@ a.no-underline:active {
816
926
  align-items: center;
817
927
  justify-content: center;
818
928
  gap: 0.35rem;
819
- padding: 0.35rem 0.55rem;
820
- border: 1.5px solid var(--border-ink);
821
- border-radius: var(--radius-card);
929
+ padding: calc(0.35rem + 1.5px) calc(0.55rem + 1.5px);
930
+ border: 0;
931
+ border-radius: 0;
822
932
  background: transparent;
823
933
  color: var(--color-on-surface-variant);
824
934
  font-family: var(--font-label);
@@ -827,19 +937,22 @@ a.no-underline:active {
827
937
  letter-spacing: 0.02em;
828
938
  line-height: 1.2;
829
939
  cursor: pointer;
830
- transition: border-color var(--motion-duration-fast) var(--motion-ease-default), color var(--motion-duration-fast) var(--motion-ease-default), background-color var(--motion-duration-fast) var(--motion-ease-default);
940
+ transition: color var(--motion-duration-fast) var(--motion-ease-default);
831
941
  }
832
942
 
833
943
  .listing-filter-chip:hover {
834
- border-color: color-mix(in srgb, var(--color-primary) 55%, var(--border-ink));
835
- color: var(--color-primary);
944
+ --mark-1: var(--mark-quiet-a);
945
+ --mark-2: var(--mark-quiet-b);
946
+ --mark-3: var(--mark-quiet-c);
947
+ color: var(--color-on-surface);
836
948
  }
837
949
 
950
+ /* Active filter chip uses menu-strength mark and full-contrast text. */
838
951
  .listing-filter-chip.is-active {
839
- border-color: var(--color-primary);
840
- color: var(--color-primary);
841
- /* High-transparency accent wash — selected cue without a solid green plate. */
842
- background: color-mix(in srgb, var(--color-primary) 8%, transparent);
952
+ --mark-1: var(--mark-a);
953
+ --mark-2: var(--mark-b);
954
+ --mark-3: var(--mark-c);
955
+ color: var(--color-on-surface);
843
956
  }
844
957
 
845
958
  .listing-filter-swatch {
@@ -860,17 +973,23 @@ a.no-underline:active {
860
973
  font-size: var(--type-label);
861
974
  font-weight: var(--weight-label);
862
975
  letter-spacing: 0.03em;
863
- padding: 0.1rem 0.4rem;
864
- border: 1px solid color-mix(in srgb, currentColor 35%, transparent);
976
+ padding: calc(0.1rem + 1px) calc(0.4rem + 1px);
977
+ border: 0;
865
978
  white-space: nowrap;
979
+ --facet-ink: currentColor;
980
+ color: color-mix(in srgb, var(--facet-ink) var(--facet-ink-mix), var(--color-on-surface));
981
+ --mark-ink: currentColor;
982
+ --mark-1: var(--mark-facet-a);
983
+ --mark-2: var(--mark-facet-b);
984
+ --mark-3: var(--mark-facet-c);
866
985
  }
867
986
 
868
987
  .lang-pill--enus {
869
- color: var(--color-primary);
988
+ --facet-ink: var(--color-primary);
870
989
  }
871
990
 
872
991
  .lang-pill--ptbr {
873
- color: var(--color-secondary);
992
+ --facet-ink: var(--color-secondary);
874
993
  }
875
994
 
876
995
  .ledger-chip-row {
@@ -888,77 +1007,32 @@ a.no-underline:active {
888
1007
  font-weight: var(--weight-label);
889
1008
  letter-spacing: 0.03em;
890
1009
  padding: 0.15rem 0.45rem;
891
- /* Tags carry the page's accent rather than a neutral grey. Both values mix
892
- `--color-primary`, which `.page-accent--*` rebinds per page, so a chip is
893
- blue on Projects, green on Articles and the CV, ochre on Rascunhos with
894
- no per-page rule anywhere. The fill stays mostly surface so a row of
895
- chips reads as metadata and not as a row of buttons; the ink carries
896
- most of the hue, which is what makes the tag legible as a tag.
897
- Note this is `.ledger-chip` only: the page-header tag line (the CV's
898
- "Engineering Leadership. Team Building…") is a separate
899
- `data-content-header-tags` span and is deliberately left alone. */
900
- background: color-mix(in srgb, var(--color-primary) 16%, var(--color-surface-high));
1010
+ /* Tags use a borderless felt-pen mark in the page accent, rebound via
1011
+ --color-primary by .page-accent--*. No inset ring or border is applied. */
901
1012
  color: color-mix(in srgb, var(--color-primary) 82%, var(--color-on-surface));
902
1013
  text-decoration: none;
903
- border-radius: var(--radius-card);
904
- /* The hover hairline arrives as an inset ring rather than a border, and is
905
- declared transparent here so it has something to transition from. This is
906
- not the shadow the system forbids — nothing is offset, blurred or spread,
907
- so it draws a 1px line on the chip's own edge, exactly where a border
908
- would sit. A real border would be the idiom, but it would have to be
909
- present at rest to avoid a 2px jump under the pointer, and the padding
910
- compensation that costs only lands exactly at integer device pixel
911
- ratios: at 1.75 the browser snaps the border to 0.571px and the chip
912
- quietly loses most of a pixel on both axes. The ring takes no space at
913
- any ratio, so the resting chip keeps its size, its fill and its square
914
- corners. */
915
- box-shadow: inset 0 0 0 1px transparent;
916
- transition: color var(--motion-duration-fast) var(--motion-ease-default), background-color var(--motion-duration-fast) var(--motion-ease-default), box-shadow var(--motion-duration-fast) var(--motion-ease-default), border-color var(--motion-duration-fast) var(--motion-ease-default);
917
- }
918
-
919
- /* Hover reads `.ledger-card:hover` — one tonal step plus an accent-warmed
920
- hairline — at chip scale.
921
-
922
- The step cannot be a ladder rung: the chip's resting fill is already the
923
- ladder's top one. What it used to do instead was borrow a rung from the
924
- other surface family (`surfaceHigh` → `surfaceContainerHigh`), which is
925
- the defect DESIGN.md records under *Two surface families name the same
926
- colours* — in dark the two are the same value to the byte, so the hover
927
- measured 1.000 : 1 and only the text changed, and in light they are close
928
- enough to have read the same way. Tinting the resting fill with the page
929
- accent instead is a real step in both palettes — down on paper, up on the
930
- dark canvas — and stays right whichever way the light ladder is pointed,
931
- which the borrowed rung did not. 8% is the value
932
- `.listing-filter-chip.is-active` already uses for an accent-tinted fill.
933
-
934
- The hairline carries the rest, at 35% accent over plain `--border-gentle`
935
- rather than the card's 40% over `--border-gentle-hover`. A line drawn
936
- around something this small is a far larger share of its ink than the same
937
- line around a card, so the quieter mix is the proportionate one. */
1014
+ border: 0;
1015
+ border-radius: 0;
1016
+ transition: color var(--motion-duration-fast) var(--motion-ease-default);
1017
+ }
1018
+
1019
+ a.ledger-chip {
1020
+ color: color-mix(in srgb, var(--color-primary) 82%, var(--color-on-surface));
1021
+ }
1022
+
1023
+ /* Hover deepens the mark strength. */
938
1024
  a.ledger-chip:hover {
1025
+ --mark-1: var(--mark-hover-a);
1026
+ --mark-2: var(--mark-hover-b);
1027
+ --mark-3: var(--mark-hover-c);
939
1028
  color: var(--color-on-surface);
940
- /* Resting fill is 16% accent in light; hover must clear that. */
941
- background: color-mix(in srgb, var(--color-primary) 28%, var(--color-surface-high));
942
- box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--color-primary) 45%, var(--border-gentle));
943
- /* No-op for the filled chip, which has no border. It matters on the sources
944
- facets, the one place that outlines the chip instead of filling it: the
945
- ring would otherwise be drawn just inside that outline and the two
946
- hairlines would read as one 2px line. Handing the edge to the ring keeps
947
- the hover at a single line there too, and the fill that page expects on
948
- hover still arrives. */
949
1029
  border-color: transparent;
950
1030
  }
951
1031
 
952
1032
  [data-theme="dark"] a.ledger-chip {
953
- background: color-mix(in srgb, var(--color-primary) 10%, var(--color-surface-high));
954
1033
  color: color-mix(in srgb, var(--color-primary) 78%, var(--color-on-surface));
955
1034
  }
956
1035
 
957
- [data-theme="dark"] a.ledger-chip:hover {
958
- background: color-mix(in srgb, var(--color-primary) 22%, var(--color-surface-high));
959
- box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--color-primary) 35%, var(--border-gentle));
960
- }
961
-
962
1036
  /* Dates live here. The chips and language pills inside the strip set their
963
1037
  own uppercase, so the strip itself leaves case alone — running small caps
964
1038
  over a date is heavier than the date deserves. */
@@ -998,8 +1072,8 @@ a.ledger-chip:hover {
998
1072
  }
999
1073
 
1000
1074
  /* Text CTAs carry a gentle accent underline so the clickable cue is not the
1001
- same gesture as the marker wash on titles. Emphasis buttons keep a box
1002
- fill instead — underline would fight the border. */
1075
+ same gesture as the marker wash on titles. Emphasis buttons carry a
1076
+ strong mark instead. */
1003
1077
  .ledger-cta:not(.ledger-cta--emphasis):not(.ledger-cta--emphasis-alt)>span:not(.ledger-cta-arrow):not(.ledger-cta-icon) {
1004
1078
  text-decoration: underline;
1005
1079
  text-decoration-color: color-mix(in srgb, var(--color-primary) 50%, transparent);
@@ -1049,63 +1123,47 @@ a.ledger-chip:hover {
1049
1123
  Those set real button padding (0.85rem vertical, --space-lg horizontal) and a
1050
1124
  solid filled background for the primary case. `.ledger-cta--emphasis` is the
1051
1125
  one or two truly primary actions per page (e.g. hero "Full Curriculum
1052
- Vitæ"): still a `.ledger-cta`, just with tight padding and a tinted fill
1053
- instead of a heavy solid block, so it reads as a real button — with color
1054
- and contrast — without becoming a bulky box. Reuse this instead of adding
1126
+ Vitæ"): still a `.ledger-cta`, just with tight padding and a strong
1127
+ highlighter mark instead of a tinted box or a heavy solid block, so it
1128
+ reads as a real button without becoming a bulky box; hover fills solid. Reuse this instead of adding
1055
1129
  another one-off CTA class. `--emphasis-alt` swaps the hue to secondary, for
1056
1130
  a second hero-level action (e.g. "Contacts") that needs to read as a
1057
1131
  distinct button next to the primary one rather than a duplicate of it. */
1058
1132
  .ledger-cta--emphasis {
1133
+ margin: 1px;
1059
1134
  padding: 0.35rem 0.85rem;
1060
- border: 1px solid var(--color-primary);
1135
+ border: 0;
1061
1136
  border-radius: var(--radius-card);
1062
- background: color-mix(in srgb, var(--color-primary) 22%, var(--color-background));
1137
+ --mark-ink: var(--color-primary);
1138
+ --mark-1: var(--mark-strong-a);
1139
+ --mark-2: var(--mark-strong-b);
1140
+ --mark-3: var(--mark-strong-c);
1141
+ color: color-mix(in srgb, var(--color-primary) var(--facet-ink-mix), var(--color-on-surface));
1063
1142
  transition: color var(--motion-duration-fast) var(--motion-ease-default),
1064
- border-color var(--motion-duration-fast) var(--motion-ease-default),
1065
1143
  background-color var(--motion-duration-fast) var(--motion-ease-default);
1066
1144
  }
1067
1145
 
1068
1146
  .ledger-cta--emphasis:hover {
1069
1147
  color: var(--color-on-primary, var(--color-surface));
1070
- border-color: var(--color-link-hover);
1071
1148
  background: var(--color-primary);
1072
1149
  }
1073
1150
 
1074
1151
  .ledger-cta--emphasis-alt {
1152
+ margin: 1px;
1075
1153
  padding: 0.35rem 0.85rem;
1076
- border: 1px solid var(--color-secondary);
1154
+ border: 0;
1077
1155
  border-radius: var(--radius-card);
1078
- background: color-mix(in srgb, var(--color-secondary) 22%, var(--color-background));
1079
- color: var(--color-secondary);
1156
+ --mark-ink: var(--color-secondary);
1157
+ --mark-1: var(--mark-strong-a);
1158
+ --mark-2: var(--mark-strong-b);
1159
+ --mark-3: var(--mark-strong-c);
1160
+ color: color-mix(in srgb, var(--color-secondary) var(--facet-ink-mix), var(--color-on-surface));
1080
1161
  transition: color var(--motion-duration-fast) var(--motion-ease-default),
1081
- border-color var(--motion-duration-fast) var(--motion-ease-default),
1082
1162
  background-color var(--motion-duration-fast) var(--motion-ease-default);
1083
1163
  }
1084
1164
 
1085
- [data-theme="dark"] .ledger-cta--emphasis {
1086
- background: color-mix(in srgb, var(--color-primary) 18%, var(--color-background));
1087
- }
1088
-
1089
- [data-theme="dark"] .ledger-cta--emphasis-alt {
1090
- background: color-mix(in srgb, var(--color-secondary) 18%, var(--color-background));
1091
- }
1092
-
1093
- /* Dark resting mixes sit after the shared :hover fill and match its
1094
- specificity (attr + class vs class + :hover), so without these the
1095
- primary button kept the 14% wash under the pointer while the ink
1096
- stepped to on-primary — dark text on a near-black hero. Alt escaped
1097
- because its :hover rule already follows the dark rest. */
1098
- [data-theme="dark"] .ledger-cta--emphasis:hover {
1099
- background: var(--color-primary);
1100
- }
1101
-
1102
- [data-theme="dark"] .ledger-cta--emphasis-alt:hover {
1103
- background: var(--color-secondary);
1104
- }
1105
-
1106
1165
  .ledger-cta--emphasis-alt:hover {
1107
1166
  color: var(--color-on-secondary, var(--color-surface));
1108
- border-color: var(--color-secondary);
1109
1167
  background: var(--color-secondary);
1110
1168
  }
1111
1169
 
@@ -122,38 +122,43 @@
122
122
  display: inline-flex;
123
123
  align-items: center;
124
124
  height: var(--bib-facet-height);
125
- padding: 0 var(--space-sm);
126
- border: 1.5px solid color-mix(in srgb, currentColor 40%, var(--border-ink));
125
+ padding: 0 calc(var(--space-sm) + 1.5px);
126
+ border: 0;
127
127
  border-radius: var(--radius-card);
128
- background: transparent;
129
128
  white-space: nowrap;
130
129
  font-family: var(--font-label);
131
130
  font-size: var(--type-label);
132
131
  font-weight: var(--weight-label);
133
132
  letter-spacing: 0.03em;
134
133
  line-height: 1;
135
- color: var(--color-on-surface-variant);
134
+ --facet-ink: var(--color-on-surface-variant);
135
+ color: color-mix(in srgb, var(--facet-ink) var(--facet-ink-mix), var(--color-on-surface));
136
+ --mark-ink: currentColor;
137
+ --mark-1: var(--mark-facet-a);
138
+ --mark-2: var(--mark-facet-b);
139
+ --mark-3: var(--mark-facet-c);
136
140
  }
137
141
 
138
142
  .bib-facet--article {
139
- color: var(--color-primary);
143
+ --facet-ink: var(--color-primary);
140
144
  }
141
145
 
142
146
  .bib-facet--book {
143
- color: var(--color-secondary);
147
+ --facet-ink: var(--color-secondary);
144
148
  }
145
149
 
146
150
  .bib-facet--report {
147
- color: var(--color-tertiary);
151
+ --facet-ink: var(--color-tertiary);
148
152
  }
149
153
 
150
154
  .bib-facet--techreport {
151
- color: var(--color-tertiary);
155
+ --facet-ink: var(--color-tertiary);
152
156
  }
153
157
 
154
158
  .bib-facet--news {
155
- /* Hardcoded salmon colors for now, since punctual */
156
- color: #b7756e;
159
+ /* Hardcoded salmon colors for now, since punctual. Pre-mixed toward the
160
+ text color: plain salmon stayed under 4.5:1 on its mark in light. */
161
+ --facet-ink: color-mix(in srgb, #b7756e 85%, var(--color-on-surface));
157
162
  }
158
163
 
159
164
  .bib-key {
@@ -91,22 +91,13 @@
91
91
  box-shadow: none;
92
92
  background: linear-gradient(104deg,
93
93
  transparent 0.9%,
94
- color-mix(in srgb, var(--color-primary) 18%, transparent) 2.4%,
95
- color-mix(in srgb, var(--color-primary) 14%, transparent) 58%,
96
- color-mix(in srgb, var(--color-primary) 5%, transparent) 98%);
94
+ color-mix(in srgb, var(--color-primary) var(--mark-a), transparent) 2.4%,
95
+ color-mix(in srgb, var(--color-primary) var(--mark-b), transparent) 58%,
96
+ color-mix(in srgb, var(--color-primary) var(--mark-c), transparent) 98%);
97
97
  box-decoration-break: clone;
98
98
  -webkit-box-decoration-break: clone;
99
99
  }
100
100
 
101
- [data-theme="dark"] .site-rail-link.is-active {
102
- background: linear-gradient(104deg,
103
- transparent 0.9%,
104
- color-mix(in srgb, var(--color-primary) 14%, transparent) 2.4%,
105
- color-mix(in srgb, var(--color-primary) 10%, transparent) 58%,
106
- color-mix(in srgb, var(--color-primary) 4%, transparent) 98%);
107
- box-shadow: none;
108
- }
109
-
110
101
  /* The rail needs room for six labels before it earns its place; below that
111
102
  the Explore menu carries the same links. */
112
103
  @media (min-width: 1024px) {
@@ -802,6 +802,27 @@ html[data-theme="light"] .cv-product {
802
802
  border: 1.5px solid var(--border-ink);
803
803
  border-radius: var(--radius-card);
804
804
  overflow: hidden;
805
+ touch-action: pan-x pan-y;
806
+ }
807
+
808
+ #timeline-chart-wrapper:focus-visible {
809
+ outline: 2px solid var(--color-primary);
810
+ outline-offset: -2px;
811
+ }
812
+
813
+ #timeline-chart {
814
+ cursor: grab;
815
+ }
816
+
817
+ #timeline-chart.is-dragging,
818
+ #timeline-chart-wrapper.is-dragging {
819
+ cursor: grabbing;
820
+ user-select: none;
821
+ }
822
+
823
+ .cv-timeline-hint {
824
+ margin: 0;
825
+ color: var(--color-on-surface-variant);
805
826
  }
806
827
 
807
828
  /* ── Dossier note and contact call to action ──
@@ -115,14 +115,21 @@ a.back-link .material-symbols-outlined {
115
115
  border-top: 1px solid var(--border-gentle-faint);
116
116
  }
117
117
 
118
+ /* Back, Share, Cite, PDF and the reading-size step are neutral controls: a
119
+ quiet gray highlighter mark at rest, a deeper one on hover (or while the
120
+ size menu is open), with the margin standing in for the removed border. */
118
121
  .detail-action {
119
122
  display: inline-flex;
120
123
  align-items: center;
121
124
  gap: 0.35rem;
125
+ margin: 1px;
122
126
  padding: 0.35rem 0.85rem;
123
- background: var(--color-surface-card);
124
- border: 1px solid var(--border-ink);
127
+ border: 0;
125
128
  border-radius: var(--radius-pill);
129
+ --mark-ink: var(--color-on-surface-variant);
130
+ --mark-1: var(--mark-quiet-a);
131
+ --mark-2: var(--mark-quiet-b);
132
+ --mark-3: var(--mark-quiet-c);
126
133
  font-family: var(--font-label);
127
134
  font-size: var(--type-label-lg);
128
135
  font-weight: var(--weight-label);
@@ -131,14 +138,14 @@ a.back-link .material-symbols-outlined {
131
138
  text-decoration: none !important;
132
139
  cursor: pointer;
133
140
  transition: background-color var(--motion-duration-fast) var(--motion-ease-default),
134
- border-color var(--motion-duration-fast) var(--motion-ease-default),
135
141
  color var(--motion-duration-fast) var(--motion-ease-default);
136
142
  }
137
143
 
138
144
  .detail-action:hover {
139
- background: var(--color-surface-high);
140
- border-color: var(--color-primary);
141
- color: var(--color-primary);
145
+ --mark-1: var(--mark-hover-a);
146
+ --mark-2: var(--mark-hover-b);
147
+ --mark-3: var(--mark-hover-c);
148
+ color: color-mix(in srgb, var(--color-primary) var(--facet-ink-mix), var(--color-on-surface));
142
149
  }
143
150
 
144
151
  .detail-action .material-symbols-outlined {
@@ -165,10 +172,14 @@ a.back-link .material-symbols-outlined {
165
172
  display: inline-flex;
166
173
  align-items: center;
167
174
  gap: 0.2rem;
175
+ margin: 1px;
168
176
  padding: 0.35rem 0.55rem 0.35rem 0.7rem;
169
- background: var(--color-surface-card);
170
- border: 1px solid var(--border-ink);
177
+ border: 0;
171
178
  border-radius: var(--radius-pill);
179
+ --mark-ink: var(--color-on-surface-variant);
180
+ --mark-1: var(--mark-quiet-a);
181
+ --mark-2: var(--mark-quiet-b);
182
+ --mark-3: var(--mark-quiet-c);
172
183
  font-family: var(--font-label);
173
184
  font-size: var(--type-label-lg);
174
185
  font-weight: var(--weight-label);
@@ -177,20 +188,20 @@ a.back-link .material-symbols-outlined {
177
188
  color: var(--color-on-surface);
178
189
  cursor: pointer;
179
190
  transition: background-color var(--motion-duration-fast) var(--motion-ease-default),
180
- border-color var(--motion-duration-fast) var(--motion-ease-default),
181
191
  color var(--motion-duration-fast) var(--motion-ease-default);
182
192
  }
183
193
 
184
194
  .detail-type-size-trigger:hover,
185
195
  .detail-type-size-trigger[aria-expanded="true"] {
186
- background: var(--color-surface-high);
187
- border-color: var(--color-primary);
188
- color: var(--color-primary);
196
+ --mark-1: var(--mark-hover-a);
197
+ --mark-2: var(--mark-hover-b);
198
+ --mark-3: var(--mark-hover-c);
199
+ color: color-mix(in srgb, var(--color-primary) var(--facet-ink-mix), var(--color-on-surface));
189
200
  }
190
201
 
191
202
  .detail-type-size-trigger:focus-visible {
192
- outline: 1px solid var(--color-primary);
193
- outline-offset: 1px;
203
+ outline: 2px solid var(--color-primary);
204
+ outline-offset: 2px;
194
205
  }
195
206
 
196
207
  .detail-type-size-trigger .material-symbols-outlined {
@@ -1279,7 +1290,10 @@ nav.text-page-nav:not(:has(a)) {
1279
1290
  padding: 0.2rem 0.7rem;
1280
1291
  min-height: 1.65rem;
1281
1292
  border-radius: 0;
1282
- background: color-mix(in srgb, var(--color-on-surface-variant) 18%, transparent);
1293
+ --mark-ink: var(--color-on-surface-variant);
1294
+ --mark-1: var(--mark-quiet-a);
1295
+ --mark-2: var(--mark-quiet-b);
1296
+ --mark-3: var(--mark-quiet-c);
1283
1297
  color: var(--color-on-surface-variant);
1284
1298
  font-family: var(--font-label);
1285
1299
  font-size: var(--type-label);
@@ -813,16 +813,20 @@ html[data-theme="light"] .home-hero-plate {
813
813
  border-top: 1px solid var(--border-gentle-divider);
814
814
  }
815
815
 
816
+ /* Solid mark: opaque under the label, fades only in the trailing padding;
817
+ hover fills solid. */
816
818
  .home-featured-foot .home-featured-cta {
817
819
  margin-left: auto;
818
820
  padding: 0.35rem var(--space-md);
819
- background: var(--color-primary);
821
+ background: linear-gradient(104deg, transparent 0.9%, var(--color-primary) 2.4%, var(--color-primary) calc(100% - 0.8rem), color-mix(in srgb, var(--color-primary) 40%, transparent) 100%);
822
+ -webkit-box-decoration-break: clone;
823
+ box-decoration-break: clone;
820
824
  color: var(--color-on-primary);
821
825
  font-weight: var(--weight-label);
822
826
  }
823
827
 
824
828
  .home-featured-foot .home-featured-cta:hover {
825
- background: color-mix(in srgb, var(--color-primary) 85%, var(--color-on-surface));
829
+ background: var(--color-primary);
826
830
  color: var(--color-on-primary);
827
831
  text-decoration: none;
828
832
  }