anentrypoint-design 0.0.470 → 0.0.471

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/247420.css CHANGED
@@ -805,50 +805,26 @@
805
805
  }
806
806
 
807
807
  /* app-shell.css */
808
- /* ============================================================
809
- 247420 design system — component sheet
810
- shadcn-neutral: system-font display + body + mono, no custom web fonts.
811
- Confident hierarchy, centered editorial stack, neutral grayscale accent.
812
- Indicator rails over hairlines.
813
- ============================================================ */
814
-
815
- /* ============================================================
816
- Base
817
- ============================================================ */
818
808
  .ds-247420 * { box-sizing: border-box; }
819
809
  .ds-247420, .ds-247420 body { margin: 0; padding: 0; }
820
810
  .ds-247420 button, .ds-247420 input, .ds-247420 select, .ds-247420 textarea { font: inherit; }
821
811
 
822
- /* ============================================================
823
- Accessibility — Skip Link
824
- ============================================================ */
825
812
  .ds-247420 .skip-link {
813
+ --skip-link-preflight-translate-clear: -100%;
826
814
  position: absolute;
827
- /* -40px alone left the 44px-tall pill (padding + min-height floor below)
828
- poking ~4px into every page pre-focus -- measured live via
829
- getBoundingClientRect(). The offset must clear the full rendered height,
830
- not a guessed constant, so translateY pushes it out by its own box. */
831
815
  top: 0;
832
816
  left: 0;
833
- transform: translateY(-100%);
817
+ transform: translateY(var(--skip-link-preflight-translate-clear));
834
818
  background: var(--accent);
835
819
  color: var(--accent-fg);
836
820
  padding: var(--space-2) var(--space-3);
837
821
  text-decoration: none;
838
- /* Must outrank every layer of chrome once focused, or the first Tab press
839
- lands on a control hidden behind the sticky header (was z-index:100,
840
- which the header alone now matches). */
841
822
  z-index: var(--z-top);
842
823
  border-radius: var(--r-pill);
843
824
  font-weight: 600;
844
825
  font-size: var(--fs-sm);
845
- /* The skip link is the first thing a keyboard or switch user reaches, so it
846
- is the last control that should be hard to hit. Its padding alone rendered
847
- it 39px tall -- measured live under coarse-pointer emulation on every kit.
848
- Floored unconditionally rather than under a pointer:coarse query, because
849
- switch and head-pointer users are not detected as coarse pointers and need
850
- the larger target just as much. */
851
- min-height: 44px;
826
+ --skip-link-min-touch-target: 44px;
827
+ min-height: var(--skip-link-min-touch-target);
852
828
  display: inline-flex;
853
829
  align-items: center;
854
830
  }
@@ -858,23 +834,6 @@
858
834
  outline: var(--focus-w) solid var(--focus-color);
859
835
  outline-offset: var(--focus-offset);
860
836
  }
861
- /* Visually-hidden but still in the accessibility tree. Emitted by Row() (the
862
- rail status word), FilterBar()/FileGrid() (aria-live result counts) and
863
- form-primitives' required marker — all of which shipped BEFORE this rule
864
- existed anywhere the app shell loads. The only other definitions live in
865
- app-surfaces.css (pre-scoped to `.ds-247420`, so it never reaches a kit that
866
- does not mount that root) and editor-primitives.css (a separate opt-in
867
- <link>), which left every app-shell consumer rendering screen-reader-only
868
- text VISIBLY the moment it passed `rail`/`resultCount`.
869
- Deliberately NOT `display:none` / `visibility:hidden` / `width:0`: those
870
- remove the node from the accessibility tree too, which defeats the entire
871
- purpose — the text exists only for AT. The clip + 1px box is what keeps it
872
- announced while occupying no visible area.
873
- `margin: -1px` is OFF-SCALE ON PURPOSE — it is not rhythm, it is one half of
874
- the canonical visually-hidden idiom: the negative margin cancels the 1px box
875
- so the clipped element contributes zero layout. Snapping it to a --space-*
876
- rung would reintroduce a measurable gap. `clip` is deprecated but retained
877
- alongside `clip-path` for older AT/browser pairs that ignore the latter. */
878
837
  .ds-247420 .sr-only {
879
838
  position: absolute;
880
839
  width: 1px;
@@ -888,11 +847,6 @@
888
847
  border: 0;
889
848
  }
890
849
 
891
- /* .ds-aspect — generic aspect-ratio utility. Native `aspect-ratio` property
892
- (broadly supported for years) rather than the padding-bottom hack: no
893
- extra wrapper markup, no absolutely-positioned inner layer needed just to
894
- fill the box. `--aspect` defaults to 16/9; a caller overrides it inline
895
- (e.g. style="--aspect:1/1") or via a ratio-named modifier class below. */
896
850
  .ds-247420 .ds-aspect {
897
851
  aspect-ratio: var(--aspect, 16 / 9);
898
852
  width: 100%;
@@ -912,14 +866,11 @@
912
866
  -webkit-font-smoothing: antialiased;
913
867
  text-rendering: optimizeLegibility;
914
868
  }
915
- /* Light (paper, the default theme) needs a stronger accent share than dark to
916
- clear a visible selection tint against --bg-2 -- the dark-theme value (24%)
917
- read too weak on paper. Dark/ink keeps its existing 24% mix, restored below
918
- in the ink/dark + auto-dark blocks (mirrors the --danger/--flame pattern of
919
- scoping a value per theme rather than sharing one across both). */
920
- .ds-247420 ::selection { background: color-mix(in oklab, var(--accent) 46%, var(--bg-2)); color: var(--fg); }
869
+ .ds-247420 {
870
+ --selection-tint-paper-share: 46%;
871
+ }
872
+ .ds-247420 ::selection { background: color-mix(in oklab, var(--accent) var(--selection-tint-paper-share), var(--bg-2)); color: var(--fg); }
921
873
 
922
- /* Every root has a CQ container so fluid type can resolve to a meaningful inline-size. */
923
874
  .ds-247420 .app, .ds-247420 .ds-stage {
924
875
  container-type: inline-size;
925
876
  overflow-x: clip;
@@ -927,29 +878,16 @@
927
878
  }
928
879
  .ds-247420 .app * { min-width: 0; }
929
880
 
930
- /* Scrollbar treatment, applied once at the root rather than per-component.
931
- chat.css already styled its own thread and code blocks this way, but every
932
- other scroll container (.app-side-shell, .app-main, .ds-scroll-x,
933
- .ds-table-wrap, .ds-live-log) fell back to the UA default -- measured live,
934
- 4 of 4 containers on dashboard and 7 of 7 on gm_inspector were unstyled while
935
- chat's two were not. A default scrollbar reads as a bright seam against a
936
- near-black panel in the ink and dark themes, and inconsistently between two
937
- panels on the same page. Tokens mean the thumb follows the active theme.
938
- Inheriting from the container also covers scrollers added later. */
939
881
  .ds-247420 .app, .ds-247420 .ds-stage, .ds-247420 .app *, .ds-247420 .ds-stage * {
940
882
  scrollbar-width: thin;
941
883
  scrollbar-color: var(--bg-3) transparent;
942
884
  }
943
885
 
944
- /* ============================================================
945
- Typography
946
- ============================================================ */
947
886
  .ds-247420 h1, .ds-247420 .t-h1 { font-family: var(--ff-display); font-size: var(--fs-h1); line-height: var(--lh-snug); letter-spacing: var(--tr-tight); font-weight: 600; margin: 0; }
948
887
  .ds-247420 h2, .ds-247420 .t-h2 { font-family: var(--ff-display); font-size: var(--fs-h2); line-height: var(--lh-snug); letter-spacing: var(--tr-tight); font-weight: 600; margin: 0; }
949
888
  .ds-247420 h3, .ds-247420 .t-h3 { font-family: var(--ff-display); font-size: var(--fs-h3); line-height: var(--lh-snug); letter-spacing: -0.01em; font-weight: 600; margin: 0; }
950
889
  .ds-247420 h4, .ds-247420 .t-h4 { font-family: var(--ff-display); font-size: var(--fs-h4); line-height: var(--lh-snug); font-weight: 600; margin: 0; }
951
890
 
952
- /* App/chrome typescale opt-in: compact heading ceiling for application UIs. */
953
891
  .ds-247420[data-typescale="app"] h1, .ds-247420[data-typescale="app"] .t-h1 { font-size: var(--fs-h1-app); line-height: 1.15; }
954
892
  .ds-247420[data-typescale="app"] h2, .ds-247420[data-typescale="app"] .t-h2 { font-size: var(--fs-h2-app); }
955
893
  .ds-247420[data-typescale="app"] h3, .ds-247420[data-typescale="app"] .t-h3 { font-size: var(--fs-h3-app); }
@@ -959,21 +897,9 @@
959
897
  .ds-247420 .t-mega { font-family: var(--ff-display); font-size: var(--fs-mega); line-height: 0.92; letter-spacing: var(--tr-tighter); font-weight: 700; margin: 0; }
960
898
 
961
899
  .ds-247420 .t-display { font-family: var(--ff-display); font-weight: 600; letter-spacing: var(--tr-tight); }
962
- /* Explicit weight, not relying on inherited normal: --ff-mono's stack (Menlo,
963
- Consolas, ui-monospace) can resolve to a variable-font fallback on some
964
- platforms whose default instance isn't the 400 weight, rendering "body ·
965
- 16px regular" visibly bold despite its own label -- pin the weight so the
966
- sample matches what it claims regardless of which font in the stack loads. */
967
900
  .ds-247420 .t-mono { font-family: var(--ff-mono); font-weight: 400; }
968
901
  .ds-247420 .t-body { font-family: var(--ff-body); }
969
902
 
970
- /* House small-label voice, in two sizes. Every declaration here is sourced
971
- from a token, so a sheet that cannot join these selector lists (community.css
972
- and gm-prose.css ship as separate <link>-able exports and must not depend on
973
- app-shell.css being present) still composes the same voice by referencing the
974
- same four tokens — --ff-mono / --fs-* / uppercase / --tr-label. That token
975
- set, not this rule, is the single source of truth; a selector that restates a
976
- literal instead of the token is the drift this pairing exists to prevent. */
977
903
  .ds-247420 .t-label { font-family: var(--ff-mono); font-size: var(--fs-tiny); text-transform: uppercase; letter-spacing: var(--tr-label); font-weight: 500; }
978
904
  .ds-247420 .t-micro { font-family: var(--ff-mono); font-size: var(--fs-micro); text-transform: uppercase; letter-spacing: var(--tr-label); color: var(--fg-3); }
979
905
  .ds-247420 .t-meta { font-family: var(--ff-body); font-size: var(--fs-sm); color: var(--fg-3); }
@@ -984,35 +910,14 @@
984
910
  margin: 0;
985
911
  }
986
912
 
987
- /* h1/h2/h3/h4 and .lede/.t-lede are both margin:0 primitives by design (a
988
- heading used standalone must not force space its context doesn't want).
989
- But a heading immediately followed by a lede is a named pairing, not two
990
- independent primitives that happen to be adjacent -- it needs its own gap
991
- regardless of whether the surrounding shell opts into .ds-app-surface
992
- (which only adds this spacing on landing/marketing surfaces, leaving every
993
- Operate-mode kit that skips that class with a zero-gap heading+subtitle). */
994
913
  .ds-247420 h1 + .lede, .ds-247420 h1 + .t-lede, .ds-247420 h2 + .lede, .ds-247420 h2 + .t-lede, .ds-247420 h3 + .lede, .ds-247420 h3 + .t-lede, .ds-247420 .t-h1 + .lede, .ds-247420 .t-h1 + .t-lede {
995
914
  margin-top: var(--space-2);
996
915
  }
997
916
 
998
- /* A lede immediately followed by the article body is a named pairing too --
999
- same rationale as the heading+lede gap above. Without this, .lede's
1000
- margin:0 leaves zero space above the first paragraph while every
1001
- paragraph-to-paragraph gap below it uses --space-4 (.ds-prose p), so the
1002
- dek reads as glued to the body it introduces. */
1003
917
  .ds-247420 .lede + .post-body, .ds-247420 .t-lede + .post-body, .ds-247420 .lede + .ds-prose, .ds-247420 .t-lede + .ds-prose {
1004
918
  margin-top: var(--space-4);
1005
919
  }
1006
920
 
1007
- /* Same gap-ownership problem again for .ds-section (hero-content.css):
1008
- `* + .ds-section { margin-top: 0 }` deliberately relies on the PRECEDING
1009
- sibling supplying the lead-in space, so two spacing primitives can
1010
- coordinate into one gap instead of stacking. .lede supplies none (margin:0
1011
- by design), so a lede-then-section pairing (e.g. project_page's h1 -> lede
1012
- -> "install" section) collapses to a flush 0px gap instead of inheriting
1013
- .ds-section's own --space-8 lead. Measured live on project_page: the
1014
- "install" h3 sat ~4px from the lede above it (padding only) vs the
1015
- intended --space-8/2 gap other section-adjacent siblings get. */
1016
921
  .ds-247420 .lede + .ds-section, .ds-247420 .t-lede + .ds-section {
1017
922
  margin-top: var(--space-8);
1018
923
  }
@@ -1026,7 +931,6 @@
1026
931
  color: var(--accent-ink);
1027
932
  display: inline-flex; align-items: center; gap: 12px;
1028
933
  }
1029
- /* Editorial kicker mark — a short solid ink rule, the print-byline tell. */
1030
934
  .ds-247420 .eyebrow::before {
1031
935
  content: '';
1032
936
  width: 28px; height: 3px; background: currentColor;
@@ -1055,21 +959,6 @@
1055
959
  font-family: var(--ff-body);
1056
960
  }
1057
961
  .ds-247420 .ds-prose blockquote p:last-child { margin-bottom: 0; }
1058
- /* Closing line of an article ("end. reply by opening a pr."), set off from the
1059
- body it terminates. Quieter and smaller than the prose around it: it takes
1060
- the mono face and the --fg-3 tone the house uses for ancillary voices
1061
- (.t-micro, .dim), so the endnote reads as chrome around the article rather
1062
- than a final paragraph of it. The --space-5 lead does the "set off" — it
1063
- breaks the paragraph rhythm so the eye registers the piece has ended before
1064
- reading the words; margin-bottom:0 overrides .ds-prose p's --space-4 so the
1065
- article does not end on dead space.
1066
- Lives here, beside the rest of the .ds-prose family, NOT in gm-prose.css:
1067
- the blog kit that uses this class links only colors_and_type.css +
1068
- app-shell.css, so a rule in that separately-<link>-ed export would be exactly
1069
- as undefined as the class was before. Sized at --fs-xs, not the --fs-micro
1070
- label rung: this is a readable sentence with a link in it, not a micro-label.
1071
- The link inherits .ds-prose a's --accent-ink treatment (a readable TEXT tone;
1072
- the bare --accent fill is ~1.07:1 on paper) — deliberately not re-stated. */
1073
962
  .ds-247420 .ds-prose .ds-prose-endnote,
1074
963
  .ds-247420 .ds-prose-endnote {
1075
964
  margin-top: var(--space-5);
@@ -1082,7 +971,6 @@
1082
971
 
1083
972
  .ds-247420 .dim { color: var(--fg-3); }
1084
973
 
1085
- /* Links */
1086
974
  .ds-247420 a { color: inherit; text-decoration: none; }
1087
975
  .ds-247420 a.ds-link-accent, .ds-247420 .ds-prose a {
1088
976
  color: var(--accent-ink);
@@ -1099,15 +987,10 @@
1099
987
  background: var(--bg-2); padding: 2px 6px; border-radius: var(--r-1);
1100
988
  }
1101
989
 
1102
- /* --bg-3 (not --bg-2): an inline code pill needs to read as a distinct
1103
- surface against the page background, not just against adjacent text — at
1104
- --bg-2 the pill measured 1.39:1 background-to-background contrast in dark
1105
- theme (barely distinguishable from the page itself). --bg-3 is the same
1106
- tier-3 surface step .chip.tone-dim already uses for the same reason,
1107
- bringing the pill to 2.07:1, consistent with the rest of the tier-3 ramp. */
1108
990
  .ds-247420 code {
991
+ --code-pill-tier3-surface: var(--bg-3);
1109
992
  font-family: var(--ff-mono); font-size: 0.92em;
1110
- background: var(--bg-3); padding: 0.15em 0.5em; border-radius: var(--r-1);
993
+ background: var(--code-pill-tier3-surface); padding: 0.15em 0.5em; border-radius: var(--r-1);
1111
994
  }
1112
995
 
1113
996
  .ds-247420 pre {
@@ -1521,15 +1404,8 @@
1521
1404
  border-bottom: var(--bw-hair, 1px) dotted var(--rule-strong);
1522
1405
  }
1523
1406
 
1524
- /* ============================================================
1525
- Primitives
1526
- ============================================================ */
1527
1407
  .ds-247420 .btn, .ds-247420 .btn-primary, .ds-247420 .btn-ghost {
1528
1408
  display: inline-flex; align-items: center; justify-content: center; gap: 6px;
1529
- /* Fixed height + horizontal-only padding: the control height is exact and
1530
- alignable (flex centres the label vertically), the way webgeist snaps every
1531
- control to a height ladder. Default is the --ctl-md rung; --btn-sm/--btn-lg
1532
- retune height + h-padding + font per size. Density scales the ladder. */
1533
1409
  height: var(--ctl-md); min-height: var(--ctl-md);
1534
1410
  padding: 0 var(--space-2-75);
1535
1411
  font-family: var(--ff-body);
@@ -1537,30 +1413,15 @@
1537
1413
  text-decoration: none;
1538
1414
  white-space: nowrap;
1539
1415
  cursor: pointer;
1540
- /* Rounded-rect app chrome, not a marketing-page stadium CTA.
1541
- Shape vocabulary: r-1/r-2 = actionable buttons, icon-buttons, and
1542
- containers; r-pill = reserved for status/input/chip/badge/progress
1543
- surfaces (composer input, chips, badges, progress bars, theme-toggle
1544
- segments) - never for actions. */
1545
1416
  border-radius: var(--r-1);
1546
1417
  border: var(--bw-hair) solid transparent;
1547
1418
  box-shadow: none;
1548
- /* Restrained hover-lift: a 1px rise + hairline shadow reads as a crisp,
1549
- confident affordance rather than a soft glow-card float. */
1550
1419
  transition: transform var(--dur-base) var(--ease-spring), background var(--dur-snap) var(--ease),
1551
1420
  color var(--dur-snap) var(--ease), box-shadow var(--dur-base) var(--ease-spring),
1552
1421
  border-color var(--dur-snap) var(--ease);
1553
1422
  }
1554
1423
  .ds-247420 .btn { background: var(--bg-2); color: var(--fg); border-color: var(--rule); }
1555
1424
  .ds-247420 .btn:hover { background: var(--bg-3); color: var(--fg); transform: translateY(-1px); box-shadow: var(--shadow-1); }
1556
- /* Primary CTA — the brand green as a solid editorial block; hover inverts to
1557
- an ink block with green text, a confident two-tone flip. Uses --green
1558
- (the site's own #247420 identity color, dark-mode-retuned to --green's
1559
- ink-safe #5CBF52 rather than --accent/--acid, which a prior contrast-driven
1560
- restyle deliberately flattened to a neutral gray for --accent's OTHER
1561
- consumers (nav active state, focus rings, etc) -- .btn-primary needed the
1562
- brand color back for click-hierarchy without undoing that restyle
1563
- elsewhere. --on-color (#fff) clears AA on both light and dark --green. */
1564
1425
  .ds-247420 .btn-primary {
1565
1426
  background: var(--green); color: var(--on-color);
1566
1427
  font-weight: 700;
@@ -1574,10 +1435,6 @@
1574
1435
  outline-offset: var(--focus-offset);
1575
1436
  }
1576
1437
 
1577
- /* Button size ladder — the size prop on Btn() (sm | md | lg). md is the base
1578
- rule above; sm/lg retune height (off the --ctl-* ladder), horizontal padding,
1579
- and font-size so a size swap is one class, never inline padding overrides
1580
- (the old preview faked sizes with style=). Applies to every variant. */
1581
1438
  .ds-247420 .btn-sm, .ds-247420 .btn-sm.btn-primary, .ds-247420 .btn-sm.btn-ghost {
1582
1439
  height: var(--ctl-sm); min-height: var(--ctl-sm);
1583
1440
  padding: 0 var(--space-2); font-size: var(--fs-tiny); gap: var(--space-1);
@@ -1587,10 +1444,6 @@
1587
1444
  padding: 0 var(--space-4); font-size: var(--fs-body); gap: var(--space-2);
1588
1445
  }
1589
1446
 
1590
- /* App-mode quiet interactions — the marketing hover-lift (translateY + shadow)
1591
- and the .row .meta slide read as decorative float on a dense working surface.
1592
- Under [data-typescale="app"], state changes are background/border-only: crisp,
1593
- no motion, no elevation. Marketing surfaces (no data-typescale) keep the lift. */
1594
1447
  .ds-247420[data-typescale="app"] .btn:hover,
1595
1448
  .ds-247420[data-typescale="app"] .btn-primary:hover,
1596
1449
  .ds-247420[data-typescale="app"] .btn-ghost:hover { transform: none; box-shadow: none; }
@@ -1601,9 +1454,6 @@
1601
1454
  .ds-247420[data-typescale="app"] a.row:hover .meta,
1602
1455
  .ds-247420[data-typescale="app"] .row[role="button"]:hover .meta { transform: none; }
1603
1456
 
1604
- /* ============================================================
1605
- IconButton — square icon-only button
1606
- ============================================================ */
1607
1457
  .ds-247420 .ds-icon-btn {
1608
1458
  display: inline-flex; align-items: center; justify-content: center;
1609
1459
  padding: 0; border: none; cursor: pointer;
@@ -1620,7 +1470,6 @@
1620
1470
  .ds-247420 .ds-icon-btn-ghost:hover { background: var(--fg); color: var(--bg); }
1621
1471
  .ds-247420 .ds-icon-btn-primary { background: var(--accent); color: var(--accent-fg); }
1622
1472
  .ds-247420 .ds-icon-btn-primary:hover { background: var(--fg); color: var(--accent-ink); }
1623
- /* warn = destructive ACTION tone; flame stays exclusively error STATUS. */
1624
1473
  .ds-247420 .ds-icon-btn-danger { background: var(--warn); color: var(--on-color); }
1625
1474
  .ds-247420 .ds-icon-btn-danger:hover { filter: brightness(0.92); }
1626
1475
  .ds-247420 .ds-icon-btn:active { transform: translateY(1px); }
@@ -1628,9 +1477,6 @@
1628
1477
  opacity: 0.5; cursor: not-allowed; pointer-events: none;
1629
1478
  }
1630
1479
 
1631
- /* ============================================================
1632
- Badge — small inline count/status pill
1633
- ============================================================ */
1634
1480
  .ds-247420 .ds-badge {
1635
1481
  display: inline-flex; align-items: center; justify-content: center;
1636
1482
  min-width: 18px; height: 18px; padding: 0 6px;
@@ -1638,15 +1484,8 @@
1638
1484
  border-radius: var(--r-pill);
1639
1485
  background: var(--bg-3); color: var(--fg-2);
1640
1486
  }
1641
- /* Badge size ladder — sm for dense inline counts, lg for prominent markers.
1642
- Base (above) stays the 18px default. */
1643
1487
  .ds-247420 .ds-badge.ds-badge--sm { min-width: 14px; height: 14px; padding: 0 var(--space-1); font-size: 10px; }
1644
1488
  .ds-247420 .ds-badge.ds-badge--lg { min-width: 22px; height: 22px; padding: 0 var(--space-2); font-size: var(--fs-tiny); }
1645
- /* Canonical tone names are tone-success / tone-error / tone-neutral. Every
1646
- other tone name grouped into the same rule below (tone-green/tone-live,
1647
- tone-flame, tone-wip, tone-sun/tone-yellow, tone-ok/tone-miss) is a
1648
- true-synonym legacy alias, kept working but sharing one declaration so the
1649
- tone-family colors can't drift apart across names. */
1650
1489
  .ds-247420 .ds-badge.tone-green, .ds-247420 .ds-badge.tone-live, .ds-247420 .ds-badge.tone-success {
1651
1490
  background: var(--green-tint); color: var(--green-deep);
1652
1491
  }
@@ -1673,18 +1512,12 @@
1673
1512
  letter-spacing: var(--tr-caps); text-transform: uppercase;
1674
1513
  border-radius: var(--r-pill);
1675
1514
  }
1676
- /* Chip size ladder — sm for dense toolbars/table cells, lg for prominent
1677
- status. tone-* colouring (below) is orthogonal to size. */
1678
1515
  .ds-247420 .chip.chip--sm { padding: var(--space-half) var(--space-2); font-size: var(--fs-micro); gap: var(--space-1); }
1679
1516
  .ds-247420 .chip.chip--lg { padding: var(--space-1-75) var(--space-2-75); font-size: var(--fs-xs); }
1680
- /* Tag variant — a rectangular, sentence-case chip for dense data (table cells,
1681
- inline labels) where the all-caps pill reads too shouty and space-hungry.
1682
- Keeps the tone-* palette; drops the caps + pill for a tight --r-0 corner. */
1683
1517
  .ds-247420 .chip.chip--tag {
1684
1518
  text-transform: none; letter-spacing: 0; font-weight: 500;
1685
1519
  border-radius: var(--r-0); padding: var(--space-half) var(--space-2);
1686
1520
  }
1687
- /* Same canonical/legacy-alias grouping as .ds-badge above. */
1688
1521
  .ds-247420 .chip.tone-green, .ds-247420 .chip.tone-live, .ds-247420 .chip.tone-success, .ds-247420 .chip.tone-ok {
1689
1522
  background: var(--green-tint); color: var(--green-deep);
1690
1523
  }
@@ -1694,21 +1527,9 @@
1694
1527
  .ds-247420 .chip.tone-wip, .ds-247420 .chip.tone-neutral {
1695
1528
  background: var(--bg-3); color: var(--fg-2);
1696
1529
  }
1697
- /* `.chip.accent` is the bare-adjective spelling of tone-accent (ui_kits/blog
1698
- uses it for a "draft" chip). It had no rule anywhere, so an accented chip
1699
- rendered byte-identical to a plain one. Folded into the alias grouping rather
1700
- than given its own block, so the two spellings cannot drift apart. --accent
1701
- is the FILL and --accent-ink the readable text tone (AGENTS.md) — the bare
1702
- lead is ~1.07:1 on paper and unreadable as text. */
1703
1530
  .ds-247420 .chip.accent, .ds-247420 .chip.tone-accent {
1704
1531
  background: var(--accent-tint); color: var(--accent-ink);
1705
1532
  }
1706
- /* tone-dim was applied by five kits (aicat, project_page, signin, system_primer,
1707
- terminal) with no rule anywhere, so a "dim" chip rendered byte-identical to a
1708
- plain one — measured at rgb(234,230,218) on rgb(31,31,38), same opacity. It is
1709
- the recede-into-the-row tone: the tier-3 foreground on the same recessed
1710
- surface tone-wip uses, which is quieter than the default --fg-2 without
1711
- dropping to an opacity fade that would take the border and background with it. */
1712
1533
  .ds-247420 .chip.tone-dim {
1713
1534
  background: var(--bg-3); color: var(--fg-3);
1714
1535
  }
@@ -1722,10 +1543,6 @@
1722
1543
  .ds-247420 .chip.tone-orange { background: color-mix(in oklab, var(--flame) 30%, var(--sun) 70%); color: var(--ink); }
1723
1544
  .ds-247420 .chip.tone-yellow { background: var(--sun); color: var(--ink); }
1724
1545
 
1725
- /* Removable chip — a trailing dismiss (x) button for editable tag/filter
1726
- chip lists (session tags, saved-search chips). Reuses the chip's own
1727
- tone/size; the button itself stays neutral-at-rest, per the standing
1728
- color-reserved-for-meaning convention, tinting only on hover/focus. */
1729
1546
  .ds-247420 .chip.ds-chip-removable { padding-right: var(--space-1); }
1730
1547
  .ds-247420 .ds-chip-remove-btn {
1731
1548
  display: inline-flex; align-items: center; justify-content: center;
@@ -1741,8 +1558,6 @@
1741
1558
  .ds-247420 .ds-chip-remove-btn svg { width: 12px; height: 12px; }
1742
1559
  }
1743
1560
 
1744
- /* ds-pill — plain neutral chip, distinct from the toned .ds-badge/.chip family
1745
- (gmsniff's .pill: a bare rounded label with no semantic tone). */
1746
1561
  .ds-247420 .ds-pill {
1747
1562
  display: inline-block;
1748
1563
  padding: 1px 7px;
@@ -1760,16 +1575,6 @@
1760
1575
  font-family: var(--ff-mono); font-size: var(--fs-tiny);
1761
1576
  opacity: 0.8;
1762
1577
  }
1763
- /* Glyph() (src/components/shell/atoms.js) emits `glyph glyph-{size}` and an
1764
- inline `font-size: var(--glyph-size-{size}, <literal>)`. The custom property
1765
- is the documented theming hook — it is what lets a theme retune glyph scale
1766
- without touching the component — but nothing declared it, so every glyph fell
1767
- through to the hard-coded inline literal and the hook was inert. Declaring
1768
- the three rungs on the scale makes the hook real; the sm/lg classes also give
1769
- the box a matching footprint instead of the one-size 18px square. */
1770
- /* Values mirror Glyph()'s own inline fallbacks exactly (11 / 13 / 16px), so
1771
- declaring the hook changes nothing visually — it only makes the property
1772
- themeable, which is what it always claimed to be. */
1773
1578
  .ds-247420 .glyph { --glyph-size-sm: var(--fs-nano); --glyph-size-base: var(--fs-tiny); --glyph-size-lg: var(--fs-body); }
1774
1579
  .ds-247420 .glyph-sm { width: 14px; height: 14px; }
1775
1580
  .ds-247420 .glyph-lg { width: 22px; height: 22px; }
@@ -13350,25 +13155,10 @@
13350
13155
  .ds-247420 .fd-page-error { max-height: 60vh; overflow: auto; white-space: pre-wrap; word-break: break-all; }
13351
13156
 
13352
13157
  /* gm-prose.css */
13353
- /* ============================================================
13354
- gm-prose -- long-form article + doc-site prose surfaces
13355
- Extracted-article host, sticky table-of-contents rail, CLI
13356
- transcript block, definition-panel rows, repo cards, tag
13357
- chips, and attributed callouts. Consumed pro-rata by doc
13358
- sites (the gm paper) that mount the SDK and inject a flatspace
13359
- article into #ds-article-host. Every color is a token from
13360
- colors_and_type.css; no raw literals.
13361
- ============================================================ */
13362
-
13363
13158
  .ds-247420 .ds-prose { line-height: 1.65; }
13364
13159
  .ds-247420 .ds-prose a { color: var(--panel-accent); }
13365
13160
  .ds-247420 .ds-prose a:hover { background: none; color: var(--panel-accent); text-decoration-color: transparent; }
13366
13161
  .ds-247420 .ds-prose pre, .ds-247420 .ds-prose table { overflow-x: auto; max-width: 100%; }
13367
- /* Mermaid diagrams render with an explicit width/height mermaid.js computes
13368
- from the source graph, not the column it's mounted in — without this, a
13369
- wide diagram overflows a narrow article-col and a narrow one leaves dead
13370
- space rather than filling it. cursor:zoom-in signals the click-to-enlarge
13371
- wiring theme.mjs adds after mermaid.run() finishes. */
13372
13162
  .ds-247420 .ds-prose .mermaid { max-width: 100%; }
13373
13163
  .ds-247420 .ds-prose .mermaid svg { max-width: 100%; height: auto; cursor: zoom-in; }
13374
13164
  .ds-247420 .ds-prose canvas {
@@ -13386,23 +13176,17 @@
13386
13176
  min-height: 0;
13387
13177
  }
13388
13178
 
13389
- /* Article prose measure — a character-count cap (--measure, 68ch) rather than
13390
- a fixed pixel width (the old --measure-narrow: 760px), so the line length a
13391
- reader actually experiences stays in the 60-75ch reading-comfort band
13392
- regardless of the article-col's body font-size. --measure-narrow remains
13393
- defined in colors_and_type.css for other consumers; this sheet switches to
13394
- the ch-unit token for its own article-col width. */
13179
+ .ds-247420 {
13180
+ --article-toc-rail-w: 256px;
13181
+ --article-toc-gutter-nonrhythm: 44px;
13182
+ --article-toc-header-gap: 16px;
13183
+ }
13395
13184
  .ds-247420 #ds-article-host.has-toc {
13396
13185
  display: flex;
13397
13186
  align-items: flex-start;
13398
- /* 44px is OFF-SCALE ON PURPOSE — it is not a rhythm step but one term of the
13399
- three-term width equation on the next line (256px rail + 44px gutter +
13400
- measure). It sits between --space-6 (48) and --space-5 (32); snapping it
13401
- would silently change the host's computed max-width unless the calc were
13402
- re-derived, so the literal and the calc stay coupled and explicit. */
13403
- column-gap: 44px;
13404
- gap: 44px;
13405
- max-width: calc(256px + 44px + var(--measure));
13187
+ column-gap: var(--article-toc-gutter-nonrhythm);
13188
+ gap: var(--article-toc-gutter-nonrhythm);
13189
+ max-width: calc(var(--article-toc-rail-w) + var(--article-toc-gutter-nonrhythm) + var(--measure));
13406
13190
  margin-left: auto;
13407
13191
  margin-right: auto;
13408
13192
  }
@@ -13411,21 +13195,11 @@
13411
13195
  min-width: 0;
13412
13196
  max-width: var(--measure);
13413
13197
  }
13414
- /* Sticky offset accounts for the page's own sticky header band (.app-chrome,
13415
- which stacks --app-topbar-h + --app-crumb-h when both Topbar and Crumb are
13416
- present — the gm paper page always renders both) plus a visual gap, so the
13417
- TOC's own sticky rail settles just below the header instead of the header
13418
- painting over its top rows. The 16px gap between header and TOC/max-height
13419
- ceiling below is a small breathing margin, not a rhythm token — this sheet
13420
- has no other layout depending on it. */
13421
13198
  .ds-247420 #ds-article-host.has-toc > .toc {
13422
- flex: 0 0 256px;
13199
+ flex: 0 0 var(--article-toc-rail-w);
13423
13200
  align-self: flex-start;
13424
13201
  position: sticky;
13425
- /* --article-header-h, when set (theme.mjs measures the real .app-chrome
13426
- rect after layout+fonts settle), is the accurate figure; the calc()
13427
- fallback covers a consumer that never sets it. */
13428
- top: calc(var(--article-header-h, calc(var(--app-topbar-h, 0px) + var(--app-crumb-h, 0px))) + 16px);
13202
+ top: calc(var(--article-header-h, calc(var(--app-topbar-h, 0px) + var(--app-crumb-h, 0px))) + var(--article-toc-header-gap));
13429
13203
  align-self: start;
13430
13204
  max-height: calc(100vh - var(--article-header-h, calc(var(--app-topbar-h, 0px) + var(--app-crumb-h, 0px))) - 32px);
13431
13205
  max-height: calc(100dvh - var(--article-header-h, calc(var(--app-topbar-h, 0px) + var(--app-crumb-h, 0px))) - 32px);
@@ -13452,15 +13226,6 @@
13452
13226
  background: var(--panel-text-3);
13453
13227
  background-clip: padding-box;
13454
13228
  }
13455
- /* Small-label voice — the local composition of the house `.t-label` recipe
13456
- (src/css/app-shell/base.css). This sheet is a standalone published export
13457
- with its own <link>, so it cannot join the `.t-label` selector list; it
13458
- composes by referencing the identical token set. Both members are gm-
13459
- generated markup (injected into #ds-article-host), so the class list is not
13460
- reachable from src/ — the rule, not the markup, does the composing.
13461
- Deliberate override for both: --panel-text-2, because prose surfaces use the
13462
- panel text ramp rather than the app --fg ramp. Sized at --fs-nano: these
13463
- labels ride above dense article chrome, not UI text. */
13464
13229
  .ds-247420 #ds-article-host .toc .toc-title,
13465
13230
  .ds-247420 .ds-prose .gm-callout .who {
13466
13231
  font-family: var(--ff-mono);
@@ -13474,13 +13239,6 @@
13474
13239
  margin: 0 0 var(--space-3) 0;
13475
13240
  }
13476
13241
  .ds-247420 #ds-article-host .toc ol { margin: 0; padding-left: var(--space-3-5); }
13477
- /* Even wrap rhythm regardless of title length ("Fix on Sight" vs "In-Phase
13478
- Quality: The Search and Code Discipline"): a fixed min-height per entry
13479
- keeps one-line and two-line titles landing on the same row grid instead of
13480
- the list visually concertina-ing between tight and loose rows, and a light
13481
- separator every 5th entry breaks a long flat run (this TOC's source has no
13482
- h3-level entries, so grouping is a typographic rhythm aid, not a fabricated
13483
- semantic nesting the article doesn't declare). */
13484
13242
  .ds-247420 #ds-article-host .toc li {
13485
13243
  font-size: var(--fs-tiny);
13486
13244
  line-height: 1.85;
@@ -13503,28 +13261,15 @@
13503
13261
  }
13504
13262
  }
13505
13263
 
13506
- /* .ds-cli-block — the multi-row article/transcript container (CliBlock()'s
13507
- outer wrapper holding stacked .ds-cli-row / .ds-cli-comment children).
13508
- Distinct from the bare `.cli` single prompt+cmd row primitive owned by
13509
- app-shell.css (Install(), HeroFromPageData(), terminal/site quickstart
13510
- lines) — the two used to share the `.cli` selector with incompatible
13511
- display models (flex row vs block transcript), so whichever stylesheet
13512
- loaded last silently won for both consumers. Renamed here to remove the
13513
- collision; see content.js CliBlock(). */
13514
13264
  .ds-247420 .ds-cli-block {
13265
+ --ds-cli-block-fs-mono-halfrung: 12.5px;
13515
13266
  display: block;
13516
13267
  background: var(--panel-1);
13517
13268
  border-radius: var(--r-0);
13518
13269
  padding: var(--space-3) var(--space-3-5);
13519
13270
  margin: var(--space-3) 0 var(--space-5) 0;
13520
13271
  font-family: var(--ff-mono);
13521
- /* Deliberate half-step, NOT un-migrated drift: this is a transcript block set
13522
- in the mono face, which runs optically ~1 rung larger than the system
13523
- stack at the same px. --fs-micro (12) reads thin against the surrounding
13524
- prose and --fs-tiny (13) reads heavy; 12.5 is the tuned midpoint. There is
13525
- no half-rung on the --fs-* ladder and one must not be invented for a
13526
- single block, so this literal stays. */
13527
- font-size: 12.5px;
13272
+ font-size: var(--ds-cli-block-fs-mono-halfrung);
13528
13273
  line-height: 1.6;
13529
13274
  color: var(--panel-text);
13530
13275
  box-shadow: var(--panel-shadow);
@@ -13597,18 +13342,11 @@
13597
13342
  color: var(--panel-text-2);
13598
13343
  border: 1px solid var(--panel-3);
13599
13344
  font-size: 0.7rem;
13600
- /* rem, not --space-*: the chip's inset is deliberately tied to the root type
13601
- scale alongside its own 0.7rem size, so the capsule keeps its proportions
13602
- when a doc site scales root font-size. A px rung would decouple them. */
13603
- padding: 0.15rem 0.5rem;
13345
+ --tag-inset-rem-coupled-to-root-fontsize: 0.15rem 0.5rem;
13346
+ padding: var(--tag-inset-rem-coupled-to-root-fontsize);
13604
13347
  border-radius: var(--r-hair);
13605
13348
  font-family: var(--ff-mono);
13606
13349
  }
13607
- /* Attributed callout — an editorial pull-quote (it carries a .who byline), so
13608
- the left accent is DELIBERATE, not the generic alert stripe. Expressed via
13609
- the house .panel-spine idiom (absolute ::before rail at --bw-chunk, squared
13610
- leading corners) instead of a raw 3px border-left, so it stays on the border
13611
- scale and matches the spine primitive in panel-row.css. */
13612
13350
  .ds-247420 .ds-prose .gm-callout {
13613
13351
  position: relative;
13614
13352
  margin: var(--space-3-5) 0;
@@ -13623,23 +13361,11 @@
13623
13361
  width: var(--bw-chunk); background: var(--panel-accent);
13624
13362
  border-radius: var(--bw-chunk) 0 0 var(--bw-chunk);
13625
13363
  }
13626
- /* Joins the small-label voice above; only its own box properties here. */
13627
13364
  .ds-247420 .ds-prose .gm-callout .who {
13628
13365
  display: block;
13629
13366
  margin-bottom: var(--space-1);
13630
13367
  }
13631
13368
 
13632
- /* .ds-prose-endnote — the closing line of an article ("end. reply by opening a
13633
- pr."), set off from the body it terminates. Quieter and smaller than prose:
13634
- it takes the mono face and the --panel-text-2 tone that this sheet's other
13635
- ancillary voices use (.toc a, .gm-callout .who, .card .desc), so the endnote
13636
- reads as chrome around the article rather than a final paragraph of it. The
13637
- generous --space-5 lead is what does the "set off" — it breaks the paragraph
13638
- rhythm so the eye registers the piece has ended before reading the words.
13639
- Sized at --fs-xs rather than the --fs-nano label rung: this is a readable
13640
- sentence with a link in it, not an uppercase micro-label.
13641
- Replaces the inline style ui_kits/blog carried before the inline-style
13642
- sweep, which named this class without ever defining it. */
13643
13369
  .ds-247420 .ds-prose .ds-prose-endnote,
13644
13370
  .ds-247420 .ds-prose-endnote {
13645
13371
  margin-top: var(--space-5);
@@ -13649,9 +13375,6 @@
13649
13375
  line-height: 1.6;
13650
13376
  color: var(--panel-text-2);
13651
13377
  }
13652
- /* The endnote's link keeps the prose accent but stays in the quiet register —
13653
- --panel-accent is the panel-ramp counterpart of --accent-ink (a readable
13654
- TEXT tone), never the bare --accent fill, which is ~1.07:1 on paper. */
13655
13378
  .ds-247420 .ds-prose-endnote a { color: var(--panel-accent); text-decoration: none; }
13656
13379
  .ds-247420 .ds-prose-endnote a:hover { text-decoration: underline; }
13657
13380