pandorga 1.13.0 → 1.14.1

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,110 @@ 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
+ /* Detail actions: green section primary on the gray hover mark was 4.48:1 at 82%. */
401
+ --action-ink-mix: 74%;
402
+ --mk-angle: 104deg;
403
+ --mk-s0: 0.9%;
404
+ --mk-s1: 2.6%;
405
+ --mk-mid: 58%;
406
+ --mk-end: 98%;
407
+ --mk-h: 100%;
408
+ --mk-y: 50%;
409
+ }
410
+
411
+ html[data-theme="dark"] {
412
+ --mark-a: 14%;
413
+ --mark-b: 10%;
414
+ --mark-c: 4%;
415
+ --mark-strong-a: 22%;
416
+ --mark-strong-b: 17%;
417
+ --mark-strong-c: 6%;
418
+ --mark-facet-a: 14%;
419
+ --mark-facet-b: 11%;
420
+ --mark-facet-c: 4%;
421
+ --mark-hover-a: 24%;
422
+ --mark-hover-b: 18%;
423
+ --mark-hover-c: 7%;
424
+ --mark-quiet-a: 10%;
425
+ --mark-quiet-b: 7%;
426
+ --mark-quiet-c: 3%;
427
+ /* Not 100%: the YouTube red facet was 4.24:1 on its own dark mark. */
428
+ --facet-ink-mix: 85%;
429
+ --action-ink-mix: 85%;
430
+ }
431
+
432
+ /* Shared mark foundation */
433
+ .ledger-mark,
434
+ .ledger-chip,
435
+ .listing-filter-chip:is(:hover, .is-active),
436
+ .lang-pill,
437
+ .source-facet,
438
+ .bib-facet,
439
+ :is(.ledger-cta--emphasis, .ledger-cta--emphasis-alt),
440
+ :is(.detail-action, .detail-type-size-trigger, .article-related-section-pill, .listing-filter-trigger) {
441
+ --mark-ink: var(--color-primary);
442
+ --mark-1: var(--mark-a);
443
+ --mark-2: var(--mark-b);
444
+ --mark-3: var(--mark-c);
445
+ 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;
446
+ -webkit-box-decoration-break: clone;
447
+ box-decoration-break: clone;
448
+ }
449
+
450
+ :is(.ledger-chip, .site-rail-link, .listing-filter-chip):nth-child(3n+1) {
451
+ --mk-angle: 104deg;
452
+ --mk-s0: 0.9%;
453
+ --mk-s1: 2.6%;
454
+ --mk-mid: 58%;
455
+ --mk-end: 98%;
456
+ --mk-h: 100%;
457
+ --mk-y: 50%;
458
+ }
459
+
460
+ :is(.ledger-chip, .site-rail-link, .listing-filter-chip):nth-child(3n+2) {
461
+ --mk-angle: 97deg;
462
+ --mk-s0: 1.8%;
463
+ --mk-s1: 4%;
464
+ --mk-mid: 66%;
465
+ --mk-end: 96%;
466
+ --mk-h: 88%;
467
+ --mk-y: 85%;
468
+ }
469
+
470
+ :is(.ledger-chip, .site-rail-link, .listing-filter-chip):nth-child(3n) {
471
+ --mk-angle: 111deg;
472
+ --mk-s0: 0.4%;
473
+ --mk-s1: 1.8%;
474
+ --mk-mid: 48%;
475
+ --mk-end: 92%;
476
+ --mk-h: 90%;
477
+ --mk-y: 20%;
478
+ }
479
+
480
+ :is(.ledger-chip, .listing-filter-chip, .ledger-cta, .detail-action, .detail-type-size-trigger, .site-rail-link, .listing-filter-trigger):focus-visible {
481
+ outline: 2px solid var(--color-primary);
482
+ outline-offset: 2px;
483
+ }
484
+
381
485
  /* ── Page-level accent ────────────────────────────────────────────────
382
486
  The shared triad (theme/theme-vars-block.liquid) declares one primary per
383
487
  theme, but each section of the site reads in its own hue: Projects and
@@ -692,22 +796,31 @@ a.no-underline:active {
692
796
  display: inline-flex;
693
797
  align-items: center;
694
798
  gap: 0.5rem;
695
- padding: 0.35rem 0.75rem;
696
- border: 1.5px solid var(--border-ink);
799
+ margin: 1px;
800
+ /* +0.5px per side keeps the box of the removed 1.5px border (with the margin). */
801
+ padding: calc(0.35rem + 0.5px) calc(0.75rem + 0.5px);
802
+ border: 0;
697
803
  border-radius: var(--radius-card);
698
- background: var(--color-surface-card);
804
+ --mark-ink: var(--color-on-surface-variant);
805
+ --mark-1: var(--mark-quiet-a);
806
+ --mark-2: var(--mark-quiet-b);
807
+ --mark-3: var(--mark-quiet-c);
699
808
  color: var(--color-on-surface-variant);
700
809
  cursor: pointer;
701
810
  transition: color var(--motion-duration-fast) var(--motion-ease-default),
702
- border-color var(--motion-duration-fast) var(--motion-ease-default),
703
811
  background-color var(--motion-duration-fast) var(--motion-ease-default);
704
812
  }
705
813
 
814
+ /* Neutral control: a quiet gray mark at rest, a deeper one on hover and
815
+ while its panel is open. */
706
816
  .listing-filter-trigger:hover,
707
817
  .listing-filter-trigger[aria-expanded="true"] {
708
- color: var(--color-secondary);
709
- border-color: var(--color-secondary);
710
- background: var(--color-surface-high);
818
+ --mark-1: var(--mark-hover-a);
819
+ --mark-2: var(--mark-hover-b);
820
+ --mark-3: var(--mark-hover-c);
821
+ /* Darkened in light like the strong marks: plain secondary on the gray
822
+ hover mark was 3.65:1. */
823
+ color: color-mix(in srgb, var(--color-secondary) var(--facet-ink-mix), var(--color-on-surface));
711
824
  }
712
825
 
713
826
  .listing-filter-trigger .material-symbols-outlined {
@@ -816,9 +929,9 @@ a.no-underline:active {
816
929
  align-items: center;
817
930
  justify-content: center;
818
931
  gap: 0.35rem;
819
- padding: 0.35rem 0.55rem;
820
- border: 1.5px solid var(--border-ink);
821
- border-radius: var(--radius-card);
932
+ padding: calc(0.35rem + 1.5px) calc(0.55rem + 1.5px);
933
+ border: 0;
934
+ border-radius: 0;
822
935
  background: transparent;
823
936
  color: var(--color-on-surface-variant);
824
937
  font-family: var(--font-label);
@@ -827,19 +940,22 @@ a.no-underline:active {
827
940
  letter-spacing: 0.02em;
828
941
  line-height: 1.2;
829
942
  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);
943
+ transition: color var(--motion-duration-fast) var(--motion-ease-default);
831
944
  }
832
945
 
833
946
  .listing-filter-chip:hover {
834
- border-color: color-mix(in srgb, var(--color-primary) 55%, var(--border-ink));
835
- color: var(--color-primary);
947
+ --mark-1: var(--mark-quiet-a);
948
+ --mark-2: var(--mark-quiet-b);
949
+ --mark-3: var(--mark-quiet-c);
950
+ color: var(--color-on-surface);
836
951
  }
837
952
 
953
+ /* Active filter chip uses menu-strength mark and full-contrast text. */
838
954
  .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);
955
+ --mark-1: var(--mark-a);
956
+ --mark-2: var(--mark-b);
957
+ --mark-3: var(--mark-c);
958
+ color: var(--color-on-surface);
843
959
  }
844
960
 
845
961
  .listing-filter-swatch {
@@ -860,17 +976,23 @@ a.no-underline:active {
860
976
  font-size: var(--type-label);
861
977
  font-weight: var(--weight-label);
862
978
  letter-spacing: 0.03em;
863
- padding: 0.1rem 0.4rem;
864
- border: 1px solid color-mix(in srgb, currentColor 35%, transparent);
979
+ padding: calc(0.1rem + 1px) calc(0.4rem + 1px);
980
+ border: 0;
865
981
  white-space: nowrap;
982
+ --facet-ink: currentColor;
983
+ color: color-mix(in srgb, var(--facet-ink) var(--facet-ink-mix), var(--color-on-surface));
984
+ --mark-ink: currentColor;
985
+ --mark-1: var(--mark-facet-a);
986
+ --mark-2: var(--mark-facet-b);
987
+ --mark-3: var(--mark-facet-c);
866
988
  }
867
989
 
868
990
  .lang-pill--enus {
869
- color: var(--color-primary);
991
+ --facet-ink: var(--color-primary);
870
992
  }
871
993
 
872
994
  .lang-pill--ptbr {
873
- color: var(--color-secondary);
995
+ --facet-ink: var(--color-secondary);
874
996
  }
875
997
 
876
998
  .ledger-chip-row {
@@ -888,77 +1010,32 @@ a.no-underline:active {
888
1010
  font-weight: var(--weight-label);
889
1011
  letter-spacing: 0.03em;
890
1012
  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));
1013
+ /* Tags use a borderless felt-pen mark in the page accent, rebound via
1014
+ --color-primary by .page-accent--*. No inset ring or border is applied. */
901
1015
  color: color-mix(in srgb, var(--color-primary) 82%, var(--color-on-surface));
902
1016
  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. */
1017
+ border: 0;
1018
+ border-radius: 0;
1019
+ transition: color var(--motion-duration-fast) var(--motion-ease-default);
1020
+ }
1021
+
1022
+ a.ledger-chip {
1023
+ color: color-mix(in srgb, var(--color-primary) 82%, var(--color-on-surface));
1024
+ }
1025
+
1026
+ /* Hover deepens the mark strength. */
938
1027
  a.ledger-chip:hover {
1028
+ --mark-1: var(--mark-hover-a);
1029
+ --mark-2: var(--mark-hover-b);
1030
+ --mark-3: var(--mark-hover-c);
939
1031
  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
1032
  border-color: transparent;
950
1033
  }
951
1034
 
952
1035
  [data-theme="dark"] a.ledger-chip {
953
- background: color-mix(in srgb, var(--color-primary) 10%, var(--color-surface-high));
954
1036
  color: color-mix(in srgb, var(--color-primary) 78%, var(--color-on-surface));
955
1037
  }
956
1038
 
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
1039
  /* Dates live here. The chips and language pills inside the strip set their
963
1040
  own uppercase, so the strip itself leaves case alone — running small caps
964
1041
  over a date is heavier than the date deserves. */
@@ -998,8 +1075,8 @@ a.ledger-chip:hover {
998
1075
  }
999
1076
 
1000
1077
  /* 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. */
1078
+ same gesture as the marker wash on titles. Emphasis buttons carry a
1079
+ strong mark instead. */
1003
1080
  .ledger-cta:not(.ledger-cta--emphasis):not(.ledger-cta--emphasis-alt)>span:not(.ledger-cta-arrow):not(.ledger-cta-icon) {
1004
1081
  text-decoration: underline;
1005
1082
  text-decoration-color: color-mix(in srgb, var(--color-primary) 50%, transparent);
@@ -1049,63 +1126,47 @@ a.ledger-chip:hover {
1049
1126
  Those set real button padding (0.85rem vertical, --space-lg horizontal) and a
1050
1127
  solid filled background for the primary case. `.ledger-cta--emphasis` is the
1051
1128
  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
1129
+ Vitæ"): still a `.ledger-cta`, just with tight padding and a strong
1130
+ highlighter mark instead of a tinted box or a heavy solid block, so it
1131
+ reads as a real button without becoming a bulky box; hover fills solid. Reuse this instead of adding
1055
1132
  another one-off CTA class. `--emphasis-alt` swaps the hue to secondary, for
1056
1133
  a second hero-level action (e.g. "Contacts") that needs to read as a
1057
1134
  distinct button next to the primary one rather than a duplicate of it. */
1058
1135
  .ledger-cta--emphasis {
1136
+ margin: 1px;
1059
1137
  padding: 0.35rem 0.85rem;
1060
- border: 1px solid var(--color-primary);
1138
+ border: 0;
1061
1139
  border-radius: var(--radius-card);
1062
- background: color-mix(in srgb, var(--color-primary) 22%, var(--color-background));
1140
+ --mark-ink: var(--color-primary);
1141
+ --mark-1: var(--mark-strong-a);
1142
+ --mark-2: var(--mark-strong-b);
1143
+ --mark-3: var(--mark-strong-c);
1144
+ color: color-mix(in srgb, var(--color-primary) var(--facet-ink-mix), var(--color-on-surface));
1063
1145
  transition: color var(--motion-duration-fast) var(--motion-ease-default),
1064
- border-color var(--motion-duration-fast) var(--motion-ease-default),
1065
1146
  background-color var(--motion-duration-fast) var(--motion-ease-default);
1066
1147
  }
1067
1148
 
1068
1149
  .ledger-cta--emphasis:hover {
1069
1150
  color: var(--color-on-primary, var(--color-surface));
1070
- border-color: var(--color-link-hover);
1071
1151
  background: var(--color-primary);
1072
1152
  }
1073
1153
 
1074
1154
  .ledger-cta--emphasis-alt {
1155
+ margin: 1px;
1075
1156
  padding: 0.35rem 0.85rem;
1076
- border: 1px solid var(--color-secondary);
1157
+ border: 0;
1077
1158
  border-radius: var(--radius-card);
1078
- background: color-mix(in srgb, var(--color-secondary) 22%, var(--color-background));
1079
- color: var(--color-secondary);
1159
+ --mark-ink: var(--color-secondary);
1160
+ --mark-1: var(--mark-strong-a);
1161
+ --mark-2: var(--mark-strong-b);
1162
+ --mark-3: var(--mark-strong-c);
1163
+ color: color-mix(in srgb, var(--color-secondary) var(--facet-ink-mix), var(--color-on-surface));
1080
1164
  transition: color var(--motion-duration-fast) var(--motion-ease-default),
1081
- border-color var(--motion-duration-fast) var(--motion-ease-default),
1082
1165
  background-color var(--motion-duration-fast) var(--motion-ease-default);
1083
1166
  }
1084
1167
 
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
1168
  .ledger-cta--emphasis-alt:hover {
1107
1169
  color: var(--color-on-secondary, var(--color-surface));
1108
- border-color: var(--color-secondary);
1109
1170
  background: var(--color-secondary);
1110
1171
  }
1111
1172
 
@@ -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(--action-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(--action-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
  }