anentrypoint-design 0.0.469 → 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);
@@ -1100,8 +988,9 @@
1100
988
  }
1101
989
 
1102
990
  .ds-247420 code {
991
+ --code-pill-tier3-surface: var(--bg-3);
1103
992
  font-family: var(--ff-mono); font-size: 0.92em;
1104
- background: var(--bg-2); 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);
1105
994
  }
1106
995
 
1107
996
  .ds-247420 pre {
@@ -1515,15 +1404,8 @@
1515
1404
  border-bottom: var(--bw-hair, 1px) dotted var(--rule-strong);
1516
1405
  }
1517
1406
 
1518
- /* ============================================================
1519
- Primitives
1520
- ============================================================ */
1521
1407
  .ds-247420 .btn, .ds-247420 .btn-primary, .ds-247420 .btn-ghost {
1522
1408
  display: inline-flex; align-items: center; justify-content: center; gap: 6px;
1523
- /* Fixed height + horizontal-only padding: the control height is exact and
1524
- alignable (flex centres the label vertically), the way webgeist snaps every
1525
- control to a height ladder. Default is the --ctl-md rung; --btn-sm/--btn-lg
1526
- retune height + h-padding + font per size. Density scales the ladder. */
1527
1409
  height: var(--ctl-md); min-height: var(--ctl-md);
1528
1410
  padding: 0 var(--space-2-75);
1529
1411
  font-family: var(--ff-body);
@@ -1531,30 +1413,15 @@
1531
1413
  text-decoration: none;
1532
1414
  white-space: nowrap;
1533
1415
  cursor: pointer;
1534
- /* Rounded-rect app chrome, not a marketing-page stadium CTA.
1535
- Shape vocabulary: r-1/r-2 = actionable buttons, icon-buttons, and
1536
- containers; r-pill = reserved for status/input/chip/badge/progress
1537
- surfaces (composer input, chips, badges, progress bars, theme-toggle
1538
- segments) - never for actions. */
1539
1416
  border-radius: var(--r-1);
1540
1417
  border: var(--bw-hair) solid transparent;
1541
1418
  box-shadow: none;
1542
- /* Restrained hover-lift: a 1px rise + hairline shadow reads as a crisp,
1543
- confident affordance rather than a soft glow-card float. */
1544
1419
  transition: transform var(--dur-base) var(--ease-spring), background var(--dur-snap) var(--ease),
1545
1420
  color var(--dur-snap) var(--ease), box-shadow var(--dur-base) var(--ease-spring),
1546
1421
  border-color var(--dur-snap) var(--ease);
1547
1422
  }
1548
1423
  .ds-247420 .btn { background: var(--bg-2); color: var(--fg); border-color: var(--rule); }
1549
1424
  .ds-247420 .btn:hover { background: var(--bg-3); color: var(--fg); transform: translateY(-1px); box-shadow: var(--shadow-1); }
1550
- /* Primary CTA — the brand green as a solid editorial block; hover inverts to
1551
- an ink block with green text, a confident two-tone flip. Uses --green
1552
- (the site's own #247420 identity color, dark-mode-retuned to --green's
1553
- ink-safe #5CBF52 rather than --accent/--acid, which a prior contrast-driven
1554
- restyle deliberately flattened to a neutral gray for --accent's OTHER
1555
- consumers (nav active state, focus rings, etc) -- .btn-primary needed the
1556
- brand color back for click-hierarchy without undoing that restyle
1557
- elsewhere. --on-color (#fff) clears AA on both light and dark --green. */
1558
1425
  .ds-247420 .btn-primary {
1559
1426
  background: var(--green); color: var(--on-color);
1560
1427
  font-weight: 700;
@@ -1568,10 +1435,6 @@
1568
1435
  outline-offset: var(--focus-offset);
1569
1436
  }
1570
1437
 
1571
- /* Button size ladder — the size prop on Btn() (sm | md | lg). md is the base
1572
- rule above; sm/lg retune height (off the --ctl-* ladder), horizontal padding,
1573
- and font-size so a size swap is one class, never inline padding overrides
1574
- (the old preview faked sizes with style=). Applies to every variant. */
1575
1438
  .ds-247420 .btn-sm, .ds-247420 .btn-sm.btn-primary, .ds-247420 .btn-sm.btn-ghost {
1576
1439
  height: var(--ctl-sm); min-height: var(--ctl-sm);
1577
1440
  padding: 0 var(--space-2); font-size: var(--fs-tiny); gap: var(--space-1);
@@ -1581,10 +1444,6 @@
1581
1444
  padding: 0 var(--space-4); font-size: var(--fs-body); gap: var(--space-2);
1582
1445
  }
1583
1446
 
1584
- /* App-mode quiet interactions — the marketing hover-lift (translateY + shadow)
1585
- and the .row .meta slide read as decorative float on a dense working surface.
1586
- Under [data-typescale="app"], state changes are background/border-only: crisp,
1587
- no motion, no elevation. Marketing surfaces (no data-typescale) keep the lift. */
1588
1447
  .ds-247420[data-typescale="app"] .btn:hover,
1589
1448
  .ds-247420[data-typescale="app"] .btn-primary:hover,
1590
1449
  .ds-247420[data-typescale="app"] .btn-ghost:hover { transform: none; box-shadow: none; }
@@ -1595,9 +1454,6 @@
1595
1454
  .ds-247420[data-typescale="app"] a.row:hover .meta,
1596
1455
  .ds-247420[data-typescale="app"] .row[role="button"]:hover .meta { transform: none; }
1597
1456
 
1598
- /* ============================================================
1599
- IconButton — square icon-only button
1600
- ============================================================ */
1601
1457
  .ds-247420 .ds-icon-btn {
1602
1458
  display: inline-flex; align-items: center; justify-content: center;
1603
1459
  padding: 0; border: none; cursor: pointer;
@@ -1614,7 +1470,6 @@
1614
1470
  .ds-247420 .ds-icon-btn-ghost:hover { background: var(--fg); color: var(--bg); }
1615
1471
  .ds-247420 .ds-icon-btn-primary { background: var(--accent); color: var(--accent-fg); }
1616
1472
  .ds-247420 .ds-icon-btn-primary:hover { background: var(--fg); color: var(--accent-ink); }
1617
- /* warn = destructive ACTION tone; flame stays exclusively error STATUS. */
1618
1473
  .ds-247420 .ds-icon-btn-danger { background: var(--warn); color: var(--on-color); }
1619
1474
  .ds-247420 .ds-icon-btn-danger:hover { filter: brightness(0.92); }
1620
1475
  .ds-247420 .ds-icon-btn:active { transform: translateY(1px); }
@@ -1622,9 +1477,6 @@
1622
1477
  opacity: 0.5; cursor: not-allowed; pointer-events: none;
1623
1478
  }
1624
1479
 
1625
- /* ============================================================
1626
- Badge — small inline count/status pill
1627
- ============================================================ */
1628
1480
  .ds-247420 .ds-badge {
1629
1481
  display: inline-flex; align-items: center; justify-content: center;
1630
1482
  min-width: 18px; height: 18px; padding: 0 6px;
@@ -1632,15 +1484,8 @@
1632
1484
  border-radius: var(--r-pill);
1633
1485
  background: var(--bg-3); color: var(--fg-2);
1634
1486
  }
1635
- /* Badge size ladder — sm for dense inline counts, lg for prominent markers.
1636
- Base (above) stays the 18px default. */
1637
1487
  .ds-247420 .ds-badge.ds-badge--sm { min-width: 14px; height: 14px; padding: 0 var(--space-1); font-size: 10px; }
1638
1488
  .ds-247420 .ds-badge.ds-badge--lg { min-width: 22px; height: 22px; padding: 0 var(--space-2); font-size: var(--fs-tiny); }
1639
- /* Canonical tone names are tone-success / tone-error / tone-neutral. Every
1640
- other tone name grouped into the same rule below (tone-green/tone-live,
1641
- tone-flame, tone-wip, tone-sun/tone-yellow, tone-ok/tone-miss) is a
1642
- true-synonym legacy alias, kept working but sharing one declaration so the
1643
- tone-family colors can't drift apart across names. */
1644
1489
  .ds-247420 .ds-badge.tone-green, .ds-247420 .ds-badge.tone-live, .ds-247420 .ds-badge.tone-success {
1645
1490
  background: var(--green-tint); color: var(--green-deep);
1646
1491
  }
@@ -1667,18 +1512,12 @@
1667
1512
  letter-spacing: var(--tr-caps); text-transform: uppercase;
1668
1513
  border-radius: var(--r-pill);
1669
1514
  }
1670
- /* Chip size ladder — sm for dense toolbars/table cells, lg for prominent
1671
- status. tone-* colouring (below) is orthogonal to size. */
1672
1515
  .ds-247420 .chip.chip--sm { padding: var(--space-half) var(--space-2); font-size: var(--fs-micro); gap: var(--space-1); }
1673
1516
  .ds-247420 .chip.chip--lg { padding: var(--space-1-75) var(--space-2-75); font-size: var(--fs-xs); }
1674
- /* Tag variant — a rectangular, sentence-case chip for dense data (table cells,
1675
- inline labels) where the all-caps pill reads too shouty and space-hungry.
1676
- Keeps the tone-* palette; drops the caps + pill for a tight --r-0 corner. */
1677
1517
  .ds-247420 .chip.chip--tag {
1678
1518
  text-transform: none; letter-spacing: 0; font-weight: 500;
1679
1519
  border-radius: var(--r-0); padding: var(--space-half) var(--space-2);
1680
1520
  }
1681
- /* Same canonical/legacy-alias grouping as .ds-badge above. */
1682
1521
  .ds-247420 .chip.tone-green, .ds-247420 .chip.tone-live, .ds-247420 .chip.tone-success, .ds-247420 .chip.tone-ok {
1683
1522
  background: var(--green-tint); color: var(--green-deep);
1684
1523
  }
@@ -1688,21 +1527,9 @@
1688
1527
  .ds-247420 .chip.tone-wip, .ds-247420 .chip.tone-neutral {
1689
1528
  background: var(--bg-3); color: var(--fg-2);
1690
1529
  }
1691
- /* `.chip.accent` is the bare-adjective spelling of tone-accent (ui_kits/blog
1692
- uses it for a "draft" chip). It had no rule anywhere, so an accented chip
1693
- rendered byte-identical to a plain one. Folded into the alias grouping rather
1694
- than given its own block, so the two spellings cannot drift apart. --accent
1695
- is the FILL and --accent-ink the readable text tone (AGENTS.md) — the bare
1696
- lead is ~1.07:1 on paper and unreadable as text. */
1697
1530
  .ds-247420 .chip.accent, .ds-247420 .chip.tone-accent {
1698
1531
  background: var(--accent-tint); color: var(--accent-ink);
1699
1532
  }
1700
- /* tone-dim was applied by five kits (aicat, project_page, signin, system_primer,
1701
- terminal) with no rule anywhere, so a "dim" chip rendered byte-identical to a
1702
- plain one — measured at rgb(234,230,218) on rgb(31,31,38), same opacity. It is
1703
- the recede-into-the-row tone: the tier-3 foreground on the same recessed
1704
- surface tone-wip uses, which is quieter than the default --fg-2 without
1705
- dropping to an opacity fade that would take the border and background with it. */
1706
1533
  .ds-247420 .chip.tone-dim {
1707
1534
  background: var(--bg-3); color: var(--fg-3);
1708
1535
  }
@@ -1716,10 +1543,6 @@
1716
1543
  .ds-247420 .chip.tone-orange { background: color-mix(in oklab, var(--flame) 30%, var(--sun) 70%); color: var(--ink); }
1717
1544
  .ds-247420 .chip.tone-yellow { background: var(--sun); color: var(--ink); }
1718
1545
 
1719
- /* Removable chip — a trailing dismiss (x) button for editable tag/filter
1720
- chip lists (session tags, saved-search chips). Reuses the chip's own
1721
- tone/size; the button itself stays neutral-at-rest, per the standing
1722
- color-reserved-for-meaning convention, tinting only on hover/focus. */
1723
1546
  .ds-247420 .chip.ds-chip-removable { padding-right: var(--space-1); }
1724
1547
  .ds-247420 .ds-chip-remove-btn {
1725
1548
  display: inline-flex; align-items: center; justify-content: center;
@@ -1735,8 +1558,6 @@
1735
1558
  .ds-247420 .ds-chip-remove-btn svg { width: 12px; height: 12px; }
1736
1559
  }
1737
1560
 
1738
- /* ds-pill — plain neutral chip, distinct from the toned .ds-badge/.chip family
1739
- (gmsniff's .pill: a bare rounded label with no semantic tone). */
1740
1561
  .ds-247420 .ds-pill {
1741
1562
  display: inline-block;
1742
1563
  padding: 1px 7px;
@@ -1754,16 +1575,6 @@
1754
1575
  font-family: var(--ff-mono); font-size: var(--fs-tiny);
1755
1576
  opacity: 0.8;
1756
1577
  }
1757
- /* Glyph() (src/components/shell/atoms.js) emits `glyph glyph-{size}` and an
1758
- inline `font-size: var(--glyph-size-{size}, <literal>)`. The custom property
1759
- is the documented theming hook — it is what lets a theme retune glyph scale
1760
- without touching the component — but nothing declared it, so every glyph fell
1761
- through to the hard-coded inline literal and the hook was inert. Declaring
1762
- the three rungs on the scale makes the hook real; the sm/lg classes also give
1763
- the box a matching footprint instead of the one-size 18px square. */
1764
- /* Values mirror Glyph()'s own inline fallbacks exactly (11 / 13 / 16px), so
1765
- declaring the hook changes nothing visually — it only makes the property
1766
- themeable, which is what it always claimed to be. */
1767
1578
  .ds-247420 .glyph { --glyph-size-sm: var(--fs-nano); --glyph-size-base: var(--fs-tiny); --glyph-size-lg: var(--fs-body); }
1768
1579
  .ds-247420 .glyph-sm { width: 14px; height: 14px; }
1769
1580
  .ds-247420 .glyph-lg { width: 22px; height: 22px; }
@@ -13344,20 +13155,12 @@
13344
13155
  .ds-247420 .fd-page-error { max-height: 60vh; overflow: auto; white-space: pre-wrap; word-break: break-all; }
13345
13156
 
13346
13157
  /* gm-prose.css */
13347
- /* ============================================================
13348
- gm-prose -- long-form article + doc-site prose surfaces
13349
- Extracted-article host, sticky table-of-contents rail, CLI
13350
- transcript block, definition-panel rows, repo cards, tag
13351
- chips, and attributed callouts. Consumed pro-rata by doc
13352
- sites (the gm paper) that mount the SDK and inject a flatspace
13353
- article into #ds-article-host. Every color is a token from
13354
- colors_and_type.css; no raw literals.
13355
- ============================================================ */
13356
-
13357
13158
  .ds-247420 .ds-prose { line-height: 1.65; }
13358
13159
  .ds-247420 .ds-prose a { color: var(--panel-accent); }
13359
13160
  .ds-247420 .ds-prose a:hover { background: none; color: var(--panel-accent); text-decoration-color: transparent; }
13360
13161
  .ds-247420 .ds-prose pre, .ds-247420 .ds-prose table { overflow-x: auto; max-width: 100%; }
13162
+ .ds-247420 .ds-prose .mermaid { max-width: 100%; }
13163
+ .ds-247420 .ds-prose .mermaid svg { max-width: 100%; height: auto; cursor: zoom-in; }
13361
13164
  .ds-247420 .ds-prose canvas {
13362
13165
  display: block;
13363
13166
  width: 100%;
@@ -13373,33 +13176,33 @@
13373
13176
  min-height: 0;
13374
13177
  }
13375
13178
 
13179
+ .ds-247420 {
13180
+ --article-toc-rail-w: 256px;
13181
+ --article-toc-gutter-nonrhythm: 44px;
13182
+ --article-toc-header-gap: 16px;
13183
+ }
13376
13184
  .ds-247420 #ds-article-host.has-toc {
13377
13185
  display: flex;
13378
13186
  align-items: flex-start;
13379
- /* 44px is OFF-SCALE ON PURPOSE — it is not a rhythm step but one term of the
13380
- three-term width equation on the next line (256px rail + 44px gutter +
13381
- measure). It sits between --space-6 (48) and --space-5 (32); snapping it
13382
- would silently change the host's computed max-width unless the calc were
13383
- re-derived, so the literal and the calc stay coupled and explicit. */
13384
- column-gap: 44px;
13385
- gap: 44px;
13386
- max-width: calc(256px + 44px + var(--measure-narrow));
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));
13387
13190
  margin-left: auto;
13388
13191
  margin-right: auto;
13389
13192
  }
13390
13193
  .ds-247420 #ds-article-host.has-toc > .article-col {
13391
13194
  flex: 1 1 0;
13392
13195
  min-width: 0;
13393
- max-width: var(--measure-narrow);
13196
+ max-width: var(--measure);
13394
13197
  }
13395
13198
  .ds-247420 #ds-article-host.has-toc > .toc {
13396
- flex: 0 0 256px;
13199
+ flex: 0 0 var(--article-toc-rail-w);
13397
13200
  align-self: flex-start;
13398
13201
  position: sticky;
13399
- top: 24px;
13202
+ top: calc(var(--article-header-h, calc(var(--app-topbar-h, 0px) + var(--app-crumb-h, 0px))) + var(--article-toc-header-gap));
13400
13203
  align-self: start;
13401
- max-height: calc(100vh - 48px);
13402
- max-height: calc(100dvh - 48px);
13204
+ max-height: calc(100vh - var(--article-header-h, calc(var(--app-topbar-h, 0px) + var(--app-crumb-h, 0px))) - 32px);
13205
+ max-height: calc(100dvh - var(--article-header-h, calc(var(--app-topbar-h, 0px) + var(--app-crumb-h, 0px))) - 32px);
13403
13206
  overflow-y: auto;
13404
13207
  overscroll-behavior: contain;
13405
13208
  margin: 0;
@@ -13423,15 +13226,6 @@
13423
13226
  background: var(--panel-text-3);
13424
13227
  background-clip: padding-box;
13425
13228
  }
13426
- /* Small-label voice — the local composition of the house `.t-label` recipe
13427
- (src/css/app-shell/base.css). This sheet is a standalone published export
13428
- with its own <link>, so it cannot join the `.t-label` selector list; it
13429
- composes by referencing the identical token set. Both members are gm-
13430
- generated markup (injected into #ds-article-host), so the class list is not
13431
- reachable from src/ — the rule, not the markup, does the composing.
13432
- Deliberate override for both: --panel-text-2, because prose surfaces use the
13433
- panel text ramp rather than the app --fg ramp. Sized at --fs-nano: these
13434
- labels ride above dense article chrome, not UI text. */
13435
13229
  .ds-247420 #ds-article-host .toc .toc-title,
13436
13230
  .ds-247420 .ds-prose .gm-callout .who {
13437
13231
  font-family: var(--ff-mono);
@@ -13445,7 +13239,13 @@
13445
13239
  margin: 0 0 var(--space-3) 0;
13446
13240
  }
13447
13241
  .ds-247420 #ds-article-host .toc ol { margin: 0; padding-left: var(--space-3-5); }
13448
- .ds-247420 #ds-article-host .toc li { font-size: var(--fs-tiny); line-height: 1.85; color: var(--panel-text); }
13242
+ .ds-247420 #ds-article-host .toc li {
13243
+ font-size: var(--fs-tiny);
13244
+ line-height: 1.85;
13245
+ color: var(--panel-text);
13246
+ min-height: 1.85em;
13247
+ }
13248
+ .ds-247420 #ds-article-host .toc li:nth-child(5n) { margin-bottom: var(--space-2); }
13449
13249
  .ds-247420 #ds-article-host .toc li::marker { color: var(--panel-text-3); font-variant-numeric: tabular-nums; }
13450
13250
  .ds-247420 #ds-article-host .toc a { color: var(--panel-text-2); text-decoration: none; transition: color .12s ease; }
13451
13251
  .ds-247420 #ds-article-host .toc a:hover { color: var(--panel-accent); }
@@ -13461,28 +13261,15 @@
13461
13261
  }
13462
13262
  }
13463
13263
 
13464
- /* .ds-cli-block — the multi-row article/transcript container (CliBlock()'s
13465
- outer wrapper holding stacked .ds-cli-row / .ds-cli-comment children).
13466
- Distinct from the bare `.cli` single prompt+cmd row primitive owned by
13467
- app-shell.css (Install(), HeroFromPageData(), terminal/site quickstart
13468
- lines) — the two used to share the `.cli` selector with incompatible
13469
- display models (flex row vs block transcript), so whichever stylesheet
13470
- loaded last silently won for both consumers. Renamed here to remove the
13471
- collision; see content.js CliBlock(). */
13472
13264
  .ds-247420 .ds-cli-block {
13265
+ --ds-cli-block-fs-mono-halfrung: 12.5px;
13473
13266
  display: block;
13474
13267
  background: var(--panel-1);
13475
13268
  border-radius: var(--r-0);
13476
13269
  padding: var(--space-3) var(--space-3-5);
13477
13270
  margin: var(--space-3) 0 var(--space-5) 0;
13478
13271
  font-family: var(--ff-mono);
13479
- /* Deliberate half-step, NOT un-migrated drift: this is a transcript block set
13480
- in the mono face, which runs optically ~1 rung larger than the system
13481
- stack at the same px. --fs-micro (12) reads thin against the surrounding
13482
- prose and --fs-tiny (13) reads heavy; 12.5 is the tuned midpoint. There is
13483
- no half-rung on the --fs-* ladder and one must not be invented for a
13484
- single block, so this literal stays. */
13485
- font-size: 12.5px;
13272
+ font-size: var(--ds-cli-block-fs-mono-halfrung);
13486
13273
  line-height: 1.6;
13487
13274
  color: var(--panel-text);
13488
13275
  box-shadow: var(--panel-shadow);
@@ -13555,18 +13342,11 @@
13555
13342
  color: var(--panel-text-2);
13556
13343
  border: 1px solid var(--panel-3);
13557
13344
  font-size: 0.7rem;
13558
- /* rem, not --space-*: the chip's inset is deliberately tied to the root type
13559
- scale alongside its own 0.7rem size, so the capsule keeps its proportions
13560
- when a doc site scales root font-size. A px rung would decouple them. */
13561
- 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);
13562
13347
  border-radius: var(--r-hair);
13563
13348
  font-family: var(--ff-mono);
13564
13349
  }
13565
- /* Attributed callout — an editorial pull-quote (it carries a .who byline), so
13566
- the left accent is DELIBERATE, not the generic alert stripe. Expressed via
13567
- the house .panel-spine idiom (absolute ::before rail at --bw-chunk, squared
13568
- leading corners) instead of a raw 3px border-left, so it stays on the border
13569
- scale and matches the spine primitive in panel-row.css. */
13570
13350
  .ds-247420 .ds-prose .gm-callout {
13571
13351
  position: relative;
13572
13352
  margin: var(--space-3-5) 0;
@@ -13581,23 +13361,11 @@
13581
13361
  width: var(--bw-chunk); background: var(--panel-accent);
13582
13362
  border-radius: var(--bw-chunk) 0 0 var(--bw-chunk);
13583
13363
  }
13584
- /* Joins the small-label voice above; only its own box properties here. */
13585
13364
  .ds-247420 .ds-prose .gm-callout .who {
13586
13365
  display: block;
13587
13366
  margin-bottom: var(--space-1);
13588
13367
  }
13589
13368
 
13590
- /* .ds-prose-endnote — the closing line of an article ("end. reply by opening a
13591
- pr."), set off from the body it terminates. Quieter and smaller than prose:
13592
- it takes the mono face and the --panel-text-2 tone that this sheet's other
13593
- ancillary voices use (.toc a, .gm-callout .who, .card .desc), so the endnote
13594
- reads as chrome around the article rather than a final paragraph of it. The
13595
- generous --space-5 lead is what does the "set off" — it breaks the paragraph
13596
- rhythm so the eye registers the piece has ended before reading the words.
13597
- Sized at --fs-xs rather than the --fs-nano label rung: this is a readable
13598
- sentence with a link in it, not an uppercase micro-label.
13599
- Replaces the inline style ui_kits/blog carried before the inline-style
13600
- sweep, which named this class without ever defining it. */
13601
13369
  .ds-247420 .ds-prose .ds-prose-endnote,
13602
13370
  .ds-247420 .ds-prose-endnote {
13603
13371
  margin-top: var(--space-5);
@@ -13607,9 +13375,6 @@
13607
13375
  line-height: 1.6;
13608
13376
  color: var(--panel-text-2);
13609
13377
  }
13610
- /* The endnote's link keeps the prose accent but stays in the quiet register —
13611
- --panel-accent is the panel-ramp counterpart of --accent-ink (a readable
13612
- TEXT tone), never the bare --accent fill, which is ~1.07:1 on paper. */
13613
13378
  .ds-247420 .ds-prose-endnote a { color: var(--panel-accent); text-decoration: none; }
13614
13379
  .ds-247420 .ds-prose-endnote a:hover { text-decoration: underline; }
13615
13380