anentrypoint-design 0.0.384 → 0.0.386

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.
Files changed (33) hide show
  1. package/community.css +21 -18
  2. package/dist/247420.css +107 -49
  3. package/dist/247420.js +22 -22
  4. package/package.json +1 -1
  5. package/scripts/lint-css.mjs +24 -10
  6. package/src/components/chat/composer-affordances.js +109 -0
  7. package/src/components/chat/composer.js +256 -0
  8. package/src/components/chat/message.js +130 -0
  9. package/src/components/chat/stats.js +36 -0
  10. package/src/components/chat/thread-scroll.js +42 -0
  11. package/src/components/chat/threads.js +105 -0
  12. package/src/components/chat.js +20 -628
  13. package/src/components/freddie/pages-chat.js +149 -0
  14. package/src/components/freddie/pages-config.js +203 -0
  15. package/src/components/freddie/pages-infra.js +120 -0
  16. package/src/components/freddie/pages-overview.js +107 -0
  17. package/src/components/freddie/pages-runners.js +102 -0
  18. package/src/components/freddie/pages-telemetry.js +126 -0
  19. package/src/components/freddie/pages-workspace.js +176 -0
  20. package/src/components/freddie/shared.js +32 -0
  21. package/src/components/freddie/sse.js +85 -0
  22. package/src/components/freddie.js +21 -1064
  23. package/src/components/sessions/format.js +42 -0
  24. package/src/components/shell/app-shell.js +195 -0
  25. package/src/components/shell/atoms.js +165 -0
  26. package/src/components/shell/icons.js +123 -0
  27. package/src/components/shell/workspace-columns.js +179 -0
  28. package/src/components/shell/workspace-shell.js +181 -0
  29. package/src/components/shell.js +15 -805
  30. package/src/css/app-shell/chat-polish.css +18 -6
  31. package/src/css/app-shell/files.css +15 -4
  32. package/src/css/app-shell/hero-content.css +16 -1
  33. package/src/css/app-shell/kits-appended.css +26 -15
package/community.css CHANGED
@@ -273,7 +273,7 @@
273
273
  justify-content: center;
274
274
  width: 12px;
275
275
  height: 12px;
276
- font-size: 10px;
276
+ font-size: var(--fs-pico);
277
277
  transform: rotate(90deg);
278
278
  transition: transform var(--dur-base) var(--ease);
279
279
  flex-shrink: 0;
@@ -551,7 +551,7 @@
551
551
  display: inline-flex;
552
552
  align-items: center;
553
553
  justify-content: center;
554
- font-size: 10px;
554
+ font-size: var(--fs-pico);
555
555
  font-weight: 600;
556
556
  overflow: hidden;
557
557
  transition: box-shadow var(--dur-snap) var(--ease);
@@ -1151,7 +1151,7 @@
1151
1151
  border: none;
1152
1152
  background: transparent;
1153
1153
  color: var(--fg);
1154
- font-size: 18px;
1154
+ font-size: var(--fs-lg);
1155
1155
  line-height: 1;
1156
1156
  cursor: pointer;
1157
1157
  border-radius: var(--r-1);
@@ -1182,7 +1182,7 @@
1182
1182
  bar here was the generic accent-stripe tell; the real accent still lands
1183
1183
  on .cm-rb-author. */
1184
1184
  border-left: var(--bw-hair) solid var(--rule-strong);
1185
- font-size: 0.85rem;
1185
+ font-size: var(--fs-xs);
1186
1186
  }
1187
1187
  .cm-rb-label { flex: none; color: var(--fg-2); }
1188
1188
  .cm-rb-author { color: var(--accent); font-weight: 600; }
@@ -1201,7 +1201,7 @@
1201
1201
  border: none;
1202
1202
  background: transparent;
1203
1203
  color: var(--fg-2);
1204
- font-size: 13px;
1204
+ font-size: var(--fs-tiny);
1205
1205
  line-height: 1;
1206
1206
  cursor: pointer;
1207
1207
  border-radius: var(--r-1);
@@ -1216,7 +1216,7 @@
1216
1216
  gap: var(--space-2);
1217
1217
  width: 100%;
1218
1218
  padding: var(--space-2) var(--space-3);
1219
- font-size: 0.875rem;
1219
+ font-size: var(--fs-xs);
1220
1220
  font-weight: 500;
1221
1221
  }
1222
1222
  .cm-banner.clickable { cursor: pointer; }
@@ -1547,7 +1547,7 @@
1547
1547
  border: var(--bw-hair) solid var(--rule-strong);
1548
1548
  border-radius: var(--r-1);
1549
1549
  background: var(--bg-3); color: var(--fg);
1550
- cursor: pointer; font-size: 16px; line-height: 1;
1550
+ cursor: pointer; font-size: var(--fs-body); line-height: 1;
1551
1551
  }
1552
1552
  .vx-vc-btn:hover { background: var(--bg-4, var(--bg-3)); }
1553
1553
  .vx-vc-on { background: var(--accent); color: var(--accent-fg); border-color: var(--accent); }
@@ -1577,11 +1577,11 @@
1577
1577
  display: flex; align-items: center; justify-content: space-between;
1578
1578
  padding: var(--space-2); border-bottom: var(--bw-hair) solid var(--rule);
1579
1579
  }
1580
- .cm-tp-title { font-weight: 700; font-size: var(--fs-1, 14px); }
1580
+ .cm-tp-title { font-weight: 700; font-size: var(--fs-xs); }
1581
1581
  .cm-tp-head-actions { display: flex; gap: var(--space-1); }
1582
1582
  .cm-tp-new, .cm-tp-close {
1583
1583
  border: none; background: transparent; color: var(--fg-2, var(--fg));
1584
- cursor: pointer; font-size: 16px; width: 24px; height: 24px; border-radius: var(--r-1);
1584
+ cursor: pointer; font-size: var(--fs-body); width: 24px; height: 24px; border-radius: var(--r-1);
1585
1585
  }
1586
1586
  .cm-tp-new:hover, .cm-tp-close:hover { background: var(--bg-3); color: var(--fg); }
1587
1587
  .cm-tp-list { flex: 1; min-height: 0; overflow-y: auto; }
@@ -1597,9 +1597,9 @@
1597
1597
  .cm-tp-item.is-active { background: var(--bg-3); box-shadow: inset 3px 0 0 var(--accent); }
1598
1598
  .cm-tp-item.is-unread .cm-tp-item-title { font-weight: 700; }
1599
1599
  .cm-tp-dot { position: absolute; left: 4px; top: 50%; transform: translateY(-50%); width: 8px; height: 8px; border-radius: 50%; background: var(--accent); }
1600
- .cm-tp-item-title { font-size: var(--fs-1, 14px); }
1601
- .cm-tp-item-snippet { font-size: var(--fs-0, 12px); color: var(--fg-2, var(--fg)); opacity: .8; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
1602
- .cm-tp-item-meta { display: flex; gap: var(--space-2); font-size: var(--fs-micro, 11px); color: var(--fg-2, var(--fg)); opacity: .7; }
1600
+ .cm-tp-item-title { font-size: var(--fs-xs); }
1601
+ .cm-tp-item-snippet { font-size: var(--fs-micro); color: var(--fg-2, var(--fg)); opacity: .8; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
1602
+ .cm-tp-item-meta { display: flex; gap: var(--space-2); font-size: var(--fs-micro); color: var(--fg-2, var(--fg)); opacity: .7; }
1603
1603
  .cm-tp-empty, .cm-forum-empty, .cm-channel-empty, .cm-member-empty {
1604
1604
  display: flex; flex-direction: column; align-items: center; gap: var(--space-2);
1605
1605
  padding: var(--space-4) var(--space-3); text-align: center;
@@ -1651,10 +1651,10 @@
1651
1651
  .cm-forum-item { display: flex; flex-direction: column; gap: var(--space-1); width: 100%; text-align: left; cursor: pointer; padding: var(--space-2) var(--space-3); border: none; background: transparent; border-bottom: var(--bw-hair) solid var(--rule); color: var(--fg); }
1652
1652
  .cm-forum-item:hover { background: var(--bg-3); }
1653
1653
  .cm-forum-item-head { display: flex; align-items: center; justify-content: space-between; gap: var(--space-2); }
1654
- .cm-forum-item-title { font-weight: 700; font-size: var(--fs-1, 14px); }
1655
- .cm-forum-item-replies { font-size: var(--fs-0, 12px); color: var(--fg-2, var(--fg)); opacity: .8; white-space: nowrap; }
1656
- .cm-forum-item-snippet { font-size: var(--fs-0, 12px); color: var(--fg-2, var(--fg)); opacity: .85; }
1657
- .cm-forum-item-meta { display: flex; flex-wrap: wrap; gap: var(--space-2); align-items: center; font-size: var(--fs-micro, 11px); color: var(--fg-2, var(--fg)); opacity: .7; }
1654
+ .cm-forum-item-title { font-weight: 700; font-size: var(--fs-xs); }
1655
+ .cm-forum-item-replies { font-size: var(--fs-micro); color: var(--fg-2, var(--fg)); opacity: .8; white-space: nowrap; }
1656
+ .cm-forum-item-snippet { font-size: var(--fs-micro); color: var(--fg-2, var(--fg)); opacity: .85; }
1657
+ .cm-forum-item-meta { display: flex; flex-wrap: wrap; gap: var(--space-2); align-items: center; font-size: var(--fs-micro); color: var(--fg-2, var(--fg)); opacity: .7; }
1658
1658
  .cm-forum-item-tags { display: inline-flex; gap: var(--space-1); }
1659
1659
  /* 1px vertical is OFF-SCALE ON PURPOSE — the tag is an inline chip inside the
1660
1660
  forum meta row; --space-hair (2px) tips it past the row height. */
@@ -1663,7 +1663,7 @@
1663
1663
  /* PageView — cm-page / cm-page-* */
1664
1664
  .cm-page { display: flex; flex-direction: column; height: 100%; min-height: 0; overflow-y: auto; background: var(--bg-1, var(--bg-2)); color: var(--fg); }
1665
1665
  .cm-page-head { display: flex; align-items: center; justify-content: space-between; gap: var(--space-2); padding: var(--space-3); border-bottom: var(--bw-hair) solid var(--rule); }
1666
- .cm-page-title { margin: 0; font-size: var(--fs-3, 20px); font-weight: 700; }
1666
+ .cm-page-title { margin: 0; font-size: var(--fs-xl); font-weight: 700; }
1667
1667
  .cm-page-edit { padding: var(--space-1) var(--space-2); border: var(--bw-hair) solid var(--rule-strong); border-radius: var(--r-1); background: var(--bg-3); color: var(--fg); cursor: pointer; }
1668
1668
  .cm-page-body { padding: var(--space-3); line-height: 1.6; }
1669
1669
  .cm-page-empty { color: var(--fg-2, var(--fg)); opacity: .7; }
@@ -1677,8 +1677,11 @@
1677
1677
  .fd-page-inner > * { min-width: 0; }
1678
1678
  .fd-loading { display: flex; align-items: center; gap: var(--space-2, 10px); padding: var(--space-4, 24px); color: var(--fg-2, var(--fg)); }
1679
1679
  .fd-empty { display: flex; flex-direction: column; align-items: center; justify-content: center; gap: var(--space-2, 10px); padding: var(--space-5, 32px) var(--space-3, 16px); color: var(--fg-2, var(--fg)); text-align: center; }
1680
+ /* 28px is an ICON size (empty-state mark), not a type tier — the --fs-* ladder
1681
+ tops out at --fs-xl (21px) before every remaining rung becomes a fluid
1682
+ heading clamp, so neither substitutes without visibly resizing the mark. */
1680
1683
  .fd-empty-glyph { font-size: 28px; opacity: .55; line-height: 1; }
1681
- .fd-pre { margin: 0; padding: var(--space-2, 10px); background: var(--bg-3, var(--panel-bg-2)); border: var(--bw-hair, 1px) solid var(--rule, var(--panel-accent)); border-radius: var(--r-1, 6px); overflow: auto; max-height: 460px; white-space: pre-wrap; overflow-wrap: anywhere; word-break: break-word; font-family: var(--font-mono, ui-monospace, monospace); font-size: 12px; line-height: 1.5; }
1684
+ .fd-pre { margin: 0; padding: var(--space-2, 10px); background: var(--bg-3, var(--panel-bg-2)); border: var(--bw-hair, 1px) solid var(--rule, var(--panel-accent)); border-radius: var(--r-1, 6px); overflow: auto; max-height: 460px; white-space: pre-wrap; overflow-wrap: anywhere; word-break: break-word; font-family: var(--font-mono, ui-monospace, monospace); font-size: var(--fs-micro); line-height: 1.5; }
1682
1685
  .fd-skill-body { max-height: 320px; }
1683
1686
  .fd-row-actions { display: inline-flex; gap: var(--space-1, 6px); align-items: center; }
1684
1687
  .fd-chat { display: flex; flex-direction: column; gap: var(--space-2, 10px); height: 100%; min-height: 0; }
package/dist/247420.css CHANGED
@@ -1642,6 +1642,11 @@
1642
1642
  .ds-247420 .ds-hero-stat:last-child { border-bottom: 0; padding-bottom: 0; }
1643
1643
  .ds-247420 .ds-hero-title {
1644
1644
  font-family: var(--ff-display); font-weight: 700;
1645
+ /* Bespoke display clamp, deliberately off the --fs-* ladder: --fs-hero is
1646
+ clamp(42px,7cqi,96px) and --fs-mega is clamp(56px,11cqi,168px). This lead
1647
+ runs a steeper 9cqi slope with a LOWER 40px floor so a two-line 16ch title
1648
+ still fits a narrow column, and a 116px ceiling between the two tiers.
1649
+ Snapping to either changes the hero's whole optical weight. */
1645
1650
  font-size: clamp(40px, 9cqi, 116px);
1646
1651
  line-height: 0.96; letter-spacing: var(--tr-tighter);
1647
1652
  margin: 0; max-width: 16ch; text-wrap: balance;
@@ -1685,6 +1690,12 @@
1685
1690
  .ds-247420 .ds-section-compact { margin-top: 0; margin-bottom: var(--space-4); }
1686
1691
  .ds-247420 .ds-section > h3 {
1687
1692
  font-family: var(--ff-body); font-weight: 600; font-size: var(--fs-h3);
1693
+ /* Zero top margin looks like it inverts the more-space-above-than-below rule,
1694
+ but it does not: this h3 is always the section's first child and .ds-section
1695
+ itself carries the --space-8 (96px) lead, so the effective space above is
1696
+ 96px against 32px below. Adding a top margin here would double the lead.
1697
+ Measured live on project_page: gapAboveInSection 0 with the section margin
1698
+ supplying the separation, gapBelow 32. */
1688
1699
  margin: 0 0 var(--space-5);
1689
1700
  letter-spacing: -0.01em;
1690
1701
  }
@@ -1776,7 +1787,7 @@
1776
1787
  }
1777
1788
  .ds-247420 .ds-cli-row {
1778
1789
  display: flex; gap: 10px;
1779
- font-family: var(--ff-mono); font-size: 13px; line-height: 1.6;
1790
+ font-family: var(--ff-mono); font-size: var(--fs-tiny); line-height: 1.6;
1780
1791
  padding: 3px 0;
1781
1792
  }
1782
1793
  .ds-247420 .ds-cli-row .prompt { color: var(--green-2); flex: 0 0 auto; user-select: none; }
@@ -1920,6 +1931,10 @@
1920
1931
  }
1921
1932
  .ds-247420 .kpi-card .num {
1922
1933
  font-family: var(--ff-body); font-weight: 600;
1934
+ /* Numeric display size, not a heading tier: --fs-h4 is clamp(19px,1.8cqi,
1935
+ 24px) — too small and too flat a slope for a KPI figure that must read as
1936
+ the loudest thing in its card, and --fs-h3 (22/30) tops out short of 32.
1937
+ Deliberate off-scale value tuned to the .kpi-card box. */
1923
1938
  font-size: clamp(22px, 3cqi, 32px); line-height: 1;
1924
1939
  letter-spacing: var(--tr-tight);
1925
1940
  }
@@ -2459,7 +2474,7 @@
2459
2474
  /* File icon — glyph chip, tinted per type. */
2460
2475
  .ds-247420 .ds-file-icon {
2461
2476
  display: inline-flex; align-items: center; justify-content: center;
2462
- width: 26px; height: 26px; font-size: 15px; line-height: 1;
2477
+ width: 26px; height: 26px; font-size: var(--fs-sm); line-height: 1;
2463
2478
  color: var(--fg-2);
2464
2479
  }
2465
2480
  .ds-247420 .ds-file-row[data-file-type="dir"] .ds-file-icon { color: var(--accent-ink); }
@@ -2483,7 +2498,7 @@
2483
2498
  display: inline-flex; align-items: center; justify-content: center;
2484
2499
  width: 28px; height: 28px; padding: 0;
2485
2500
  background: transparent; border: 0; border-radius: var(--r-1);
2486
- color: var(--fg-3); font-size: 14px; cursor: pointer;
2501
+ color: var(--fg-3); font-size: var(--fs-xs); cursor: pointer;
2487
2502
  transition: background var(--dur-snap) var(--ease), color var(--dur-snap) var(--ease);
2488
2503
  }
2489
2504
  .ds-247420 .ds-file-act:hover { background: var(--bg-3); color: var(--fg); }
@@ -2582,7 +2597,7 @@
2582
2597
  .ds-247420 .ds-file-grid[data-density="compact"] .ds-file-row { padding: var(--space-1-5) var(--space-2-75); gap: var(--space-2-5); }
2583
2598
  .ds-247420 .ds-file-grid[data-density="compact"] .ds-file-row .title { font-size: var(--fs-xs); }
2584
2599
  .ds-247420 .ds-file-grid[data-density="compact"] .ds-file-row .ds-file-meta { font-size: var(--fs-micro); }
2585
- .ds-247420 .ds-file-grid[data-density="compact"] .ds-file-icon { width: 20px; height: 20px; font-size: 13px; }
2600
+ .ds-247420 .ds-file-grid[data-density="compact"] .ds-file-icon { width: 20px; height: 20px; font-size: var(--fs-tiny); }
2586
2601
 
2587
2602
  /* Thumbnail density — tile grid; image entries carry a real lazy thumbnail. */
2588
2603
  .ds-247420 .ds-file-grid-thumb {
@@ -2622,6 +2637,10 @@
2622
2637
  width: 100%; aspect-ratio: 4 / 3;
2623
2638
  background: var(--bg-2); border-radius: var(--r-1); overflow: hidden;
2624
2639
  }
2640
+ /* 24px is the ICON size inside a 34px chip, not a type tier — it is matched to
2641
+ the chip box, not to the text scale (the --fs-* rungs jump 21px -> fluid
2642
+ heading clamps, so neither substitutes without resizing the icon). Same
2643
+ reasoning for the other four .ds-*-glyph rules in this sheet. */
2625
2644
  .ds-247420 .ds-file-cell-media .ds-file-icon { width: 34px; height: 34px; font-size: 24px; }
2626
2645
  .ds-247420 .ds-file-cell-thumb { width: 100%; height: 100%; object-fit: cover; }
2627
2646
  /* Per-type icon tints on thumb tiles so the grid keeps the colour-coding the
@@ -2765,6 +2784,7 @@
2765
2784
  gap: var(--space-2); flex-wrap: wrap;
2766
2785
  padding: var(--space-4) var(--space-3); text-align: center;
2767
2786
  }
2787
+ /* Icon size, not type — see .ds-file-cell-media .ds-file-icon above. */
2768
2788
  .ds-247420 .ds-dropzone-glyph { font-size: 22px; color: var(--fg-3); }
2769
2789
  .ds-247420 .ds-dropzone-label { font-size: var(--fs-sm); color: var(--fg-3); }
2770
2790
  .ds-247420 .ds-dropzone.dragover {
@@ -2873,6 +2893,7 @@
2873
2893
  gap: var(--space-2); padding: var(--space-6) var(--space-3);
2874
2894
  color: var(--fg-3); text-align: center;
2875
2895
  }
2896
+ /* Icon size, not type — see .ds-file-cell-media .ds-file-icon above. */
2876
2897
  .ds-247420 .ds-file-empty-glyph { font-size: 34px; opacity: 0.55; }
2877
2898
  .ds-247420 .ds-file-empty-text { font-size: var(--fs-sm); }
2878
2899
 
@@ -2928,7 +2949,11 @@
2928
2949
  font-family: inherit; font-size: var(--fs-sm);
2929
2950
  }
2930
2951
  .ds-247420 .ds-modal-input:focus-visible { outline: var(--focus-w) solid var(--focus-color); outline-offset: var(--focus-offset); }
2931
- /* iOS auto-zooms inputs under 16px on focus, breaking the modal layout. */
2952
+ /* iOS auto-zooms inputs under 16px on focus, breaking the modal layout.
2953
+ Deliberately a literal, NOT var(--fs-body): --fs-body is re-declared to
2954
+ 15px under [data-typescale="sm"], which would silently drop this input back
2955
+ under the zoom threshold on any density-reduced page. The 16px here is a
2956
+ platform constant, not a point on the type scale. */
2932
2957
  @media (hover: none), (pointer: coarse) {
2933
2958
  .ds-247420 .ds-modal-input { font-size: 16px; min-height: 44px; }
2934
2959
  }
@@ -3025,6 +3050,7 @@
3025
3050
  display: flex; flex-direction: column; align-items: center; justify-content: center;
3026
3051
  gap: var(--space-2); padding: var(--space-6); color: var(--fg-3);
3027
3052
  }
3053
+ /* Icon size, not type — see .ds-file-cell-media .ds-file-icon above. */
3028
3054
  .ds-247420 .ds-preview-glyph { font-size: 34px; opacity: 0.6; }
3029
3055
 
3030
3056
  /* Thin scrollbars inside preview bodies. */
@@ -3268,7 +3294,7 @@
3268
3294
  width: 36px; height: 36px; flex-shrink: 0;
3269
3295
  border-radius: 50%; background: var(--bg-3); color: var(--fg);
3270
3296
  display: inline-flex; align-items: center; justify-content: center;
3271
- font-family: var(--ff-mono); font-size: 12px; font-weight: 600;
3297
+ font-family: var(--ff-mono); font-size: var(--fs-micro); font-weight: 600;
3272
3298
  text-transform: lowercase; letter-spacing: 0.02em; user-select: none;
3273
3299
  transition: transform 0.12s ease, box-shadow 0.12s ease;
3274
3300
  position: relative;
@@ -3309,6 +3335,9 @@
3309
3335
  border: 1px solid color-mix(in oklab, var(--mascot) 28%, transparent);
3310
3336
  }
3311
3337
  .ds-247420 .chat-bubble code {
3338
+ /* em-relative on purpose: inline code tracks the size of the prose it sits
3339
+ inside (the mono face runs optically large next to the system stack, hence
3340
+ 0.92). An absolute --fs-* tier would decouple it from its own paragraph. */
3312
3341
  font-family: var(--ff-mono); font-size: 0.92em;
3313
3342
  background: color-mix(in oklab, var(--fg) 10%, transparent);
3314
3343
  /* 1px block is deliberately under --space-hair (2px): inline <code> must not
@@ -3335,6 +3364,11 @@
3335
3364
  font-family: var(--ff-body); font-weight: 600;
3336
3365
  margin: var(--space-2) 0 var(--space-1); line-height: var(--lh-snug);
3337
3366
  }
3367
+ /* em-relative on purpose, NOT --fs-h1..h3: markdown headings inside a chat
3368
+ bubble are a hierarchy WITHIN the bubble's own type size, not page headings.
3369
+ The --fs-h* tiers are fluid clamp()s tuned to page container queries and
3370
+ would render a bubble heading at 34px+, dwarfing the message it labels.
3371
+ These stay a tight ratio ladder off whatever size the bubble is set at. */
3338
3372
  .ds-247420 .chat-bubble.chat-md h1 { font-size: 1.15em; }
3339
3373
  .ds-247420 .chat-bubble.chat-md h2 { font-size: 1.08em; }
3340
3374
  .ds-247420 .chat-bubble.chat-md h3 { font-size: 1.04em; }
@@ -3370,7 +3404,7 @@
3370
3404
  }
3371
3405
  /* Markdown tables + horizontal rules: agents routinely emit them, but they were
3372
3406
  unstyled (bare unspaced cells, vanished rules). */
3373
- .ds-247420 .chat-bubble.chat-md table { border-collapse: collapse; width: auto; max-width: 100%; margin: var(--space-2) 0; font-size: .95em; display: block; overflow-x: auto; }
3407
+ .ds-247420 .chat-bubble.chat-md table { border-collapse: collapse; width: auto; max-width: 100%; margin: var(--space-2) 0; font-size: .95em; /* em-relative: a table inside a bubble reads one notch down from the bubble's own copy, not off an absolute tier */ display: block; overflow-x: auto; }
3374
3408
  .ds-247420 .chat-bubble.chat-md th,
3375
3409
  .ds-247420 .chat-bubble.chat-md td { border: var(--bw-hair) solid var(--rule); padding: var(--space-1) var(--space-2-5); text-align: left; }
3376
3410
  .ds-247420 .chat-bubble.chat-md th { background: color-mix(in oklab, var(--fg) 5%, transparent); font-weight: 600; }
@@ -3480,6 +3514,9 @@
3480
3514
  }
3481
3515
  .ds-247420 .chat-file:hover { background: var(--bg-3); }
3482
3516
  .ds-247420 .chat-file .glyph {
3517
+ /* 22px is the ICON size inside a 36px chip — matched to the chip box, not to
3518
+ the type scale (--fs-xl is 21px, and above it every rung is a fluid
3519
+ heading clamp). Snapping it visibly resizes the mark. */
3483
3520
  font-size: 22px; width: 36px; height: 36px;
3484
3521
  display: inline-flex; align-items: center; justify-content: center;
3485
3522
  background: var(--bg-3);
@@ -3492,7 +3529,7 @@
3492
3529
  }
3493
3530
  .ds-247420 .chat-file .meta { display: flex; flex-direction: column; gap: var(--space-hair); min-width: 0; flex: 1; }
3494
3531
  .ds-247420 .chat-file .size { font-family: var(--ff-mono); font-size: var(--fs-xs); color: var(--fg-3); }
3495
- .ds-247420 .chat-file .go { font-family: var(--ff-mono); font-size: 16px; color: var(--fg-3); flex-shrink: 0; }
3532
+ .ds-247420 .chat-file .go { font-family: var(--ff-mono); font-size: var(--fs-body); color: var(--fg-3); flex-shrink: 0; }
3496
3533
  .ds-247420 .chat-file:hover .go { color: var(--accent-ink); }
3497
3534
 
3498
3535
  .ds-247420 .chat-msg.you .chat-pdf,
@@ -3510,7 +3547,7 @@
3510
3547
  background: color-mix(in oklab, var(--fg) 5%, var(--bg-2));
3511
3548
  border-bottom: 1px solid color-mix(in oklab, var(--fg) 10%, transparent);
3512
3549
  }
3513
- .ds-247420 .chat-pdf-head .glyph { font-size: 18px; color: var(--mascot); flex-shrink: 0; }
3550
+ .ds-247420 .chat-pdf-head .glyph { font-size: var(--fs-lg); color: var(--mascot); flex-shrink: 0; }
3514
3551
  .ds-247420 .chat-pdf-head .name { flex: 1; font-weight: 600; font-size: var(--fs-sm); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
3515
3552
  .ds-247420 .chat-pdf-head .size { font-family: var(--ff-mono); font-size: var(--fs-xs); color: var(--fg-3); }
3516
3553
  .ds-247420 .chat-pdf-head a { color: var(--accent-ink); font-family: var(--ff-mono); font-size: var(--fs-xs); text-decoration: none; }
@@ -3569,8 +3606,8 @@
3569
3606
  border-color: color-mix(in oklab, var(--accent) 55%, transparent);
3570
3607
  color: var(--accent-ink);
3571
3608
  }
3572
- .ds-247420 .chat-reactions .rxn .e { font-size: 14px; line-height: 1; }
3573
- .ds-247420 .chat-reactions .rxn .n { font-family: var(--ff-mono); font-weight: 600; font-size: 11px; color: var(--fg-2); }
3609
+ .ds-247420 .chat-reactions .rxn .e { font-size: var(--fs-xs); line-height: 1; }
3610
+ .ds-247420 .chat-reactions .rxn .n { font-family: var(--ff-mono); font-weight: 600; font-size: var(--fs-nano); color: var(--fg-2); }
3574
3611
  .ds-247420 .chat-reactions .rxn.you .n { color: var(--accent-ink); }
3575
3612
 
3576
3613
  .ds-247420 .chat-typing { display: inline-flex; gap: var(--space-1); align-items: center; }
@@ -3697,6 +3734,7 @@
3697
3734
 
3698
3735
  .ds-247420 .aicat-portrait { display: inline-flex; align-items: center; gap: var(--space-2-5); padding: var(--space-1) 0; }
3699
3736
  .ds-247420 .aicat-face {
3737
+ /* 24px is the ICON size inside a 32px round chip — see .chat-file .glyph. */
3700
3738
  width: 32px; height: 32px; font-size: 24px;
3701
3739
  display: inline-flex; align-items: center; justify-content: center;
3702
3740
  background: color-mix(in oklab, var(--mascot) 22%, var(--bg-2));
@@ -5635,7 +5673,7 @@
5635
5673
  }
5636
5674
  .ds-247420 .ds-err-path {
5637
5675
  display: inline-flex; gap: var(--space-1-75); align-items: baseline; flex-wrap: wrap; max-width: 100%;
5638
- font-family: var(--ff-mono); font-size: 13px; color: var(--panel-text-2);
5676
+ font-family: var(--ff-mono); font-size: var(--fs-tiny); color: var(--panel-text-2);
5639
5677
  background: var(--panel-1); padding: var(--space-1-75) var(--space-2-75); border-radius: var(--r-0);
5640
5678
  overflow-wrap: anywhere; word-break: break-all;
5641
5679
  }
@@ -5693,6 +5731,9 @@
5693
5731
  .ds-247420 .ds-topbar-search { flex-basis: 100%; }
5694
5732
  }
5695
5733
  .ds-247420 .ds-empty-state { padding: clamp(var(--space-3), 5vw, var(--space-4)); text-align: center; color: var(--panel-text-3); }
5734
+ /* Fluid ICON size (empty-state mark), not a type tier: it scales with the
5735
+ viewport between 24 and 32px. Every fluid --fs-* tier is a heading clamp
5736
+ tuned to cqi + heading weight, so none of them substitutes here. */
5696
5737
  .ds-247420 .ds-empty-state-glyph { font-size: clamp(24px, 6vw, 32px); }
5697
5738
  .ds-247420 .ds-empty-state-msg { margin: var(--space-1-75) 0; }
5698
5739
  .ds-247420 .ds-empty-state-hint { margin: 0; font-size: var(--fs-sm); }
@@ -5712,20 +5753,20 @@
5712
5753
  .ds-247420 .ds-swatch-col { display: flex; flex-direction: column; gap: var(--space-1-75); }
5713
5754
  .ds-247420 .ds-swatch-chip { height: 48px; border-radius: var(--r-1); border: 1px solid var(--rule); background: var(--swatch, var(--panel-1)); }
5714
5755
  .ds-247420 .ds-swatch-chip--big { height: 64px; }
5715
- .ds-247420 .ds-swatch-name { font-family: var(--ff-mono); font-size: 11px; color: var(--fg-3); }
5756
+ .ds-247420 .ds-swatch-name { font-family: var(--ff-mono); font-size: var(--fs-nano); color: var(--fg-3); }
5716
5757
  .ds-247420 .ds-type-panel { padding: clamp(10px, 2.5vw, 14px) clamp(10px, 3vw, 18px); display: flex; flex-direction: column; gap: 14px; }
5717
5758
  .ds-247420 .ds-type-row {
5718
5759
  display: flex; align-items: baseline; gap: 14px;
5719
5760
  border-bottom: 1px solid var(--rule); padding-bottom: var(--space-2); flex-wrap: wrap;
5720
5761
  }
5721
- .ds-247420 .ds-type-row-label { flex: 0 0 64px; font-family: var(--ff-mono); font-size: 11px; color: var(--fg-3); }
5762
+ .ds-247420 .ds-type-row-label { flex: 0 0 64px; font-family: var(--ff-mono); font-size: var(--fs-nano); color: var(--fg-3); }
5722
5763
  .ds-247420 .ds-type-sample {
5723
5764
  min-width: 0; overflow-wrap: anywhere; line-height: var(--lh-tight); color: var(--fg);
5724
5765
  font-size: var(--sample-size, var(--fs-body));
5725
5766
  }
5726
5767
  .ds-247420 .ds-prim-panel { padding: clamp(10px, 2.5vw, 14px) clamp(10px, 3vw, 18px); display: flex; flex-direction: column; gap: 18px; }
5727
5768
  .ds-247420 .ds-prim-row { display: flex; gap: var(--space-2-5); flex-wrap: wrap; align-items: center; }
5728
- .ds-247420 .ds-prim-label { flex: 0 0 64px; font-family: var(--ff-mono); font-size: 11px; color: var(--fg-3); }
5769
+ .ds-247420 .ds-prim-label { flex: 0 0 64px; font-family: var(--ff-mono); font-size: var(--fs-nano); color: var(--fg-3); }
5729
5770
 
5730
5771
  /* == appended: content-site == */
5731
5772
  /* Home landing wrappers (site/theme.mjs) — replace banned inline styles. */
@@ -5857,6 +5898,10 @@
5857
5898
  /* 18px ceiling: no tier between --space-3 (16) and --space-3-5 (20). */
5858
5899
  .ds-247420 .ds-auth-form { padding: clamp(var(--space-2-75), 3vw, 18px); display: flex; flex-direction: column; gap: var(--space-2-5); }
5859
5900
  .ds-247420 .ds-auth-sent { align-items: center; text-align: center; }
5901
+ /* 32px is an ICON size, not a type size: this is the confirmation mark above
5902
+ the "check your mail" copy, sized to the 440px auth column, and the --fs-*
5903
+ scale tops out at --fs-xl (21px) before jumping to fluid clamp() heading
5904
+ tiers. Snapping it to either would visibly resize the mark. */
5860
5905
  .ds-247420 .ds-auth-sent-glyph { font-size: 32px; color: var(--panel-accent); }
5861
5906
  .ds-247420 .ds-auth-sent-title { margin: 0; font-weight: 600; }
5862
5907
  .ds-247420 .ds-auth-sent-sub { margin: 0; color: var(--panel-text-2); overflow-wrap: anywhere; }
@@ -5864,17 +5909,17 @@
5864
5909
  /* .ds-auth-field-label joins the kit small-label voice above, no overrides. */
5865
5910
  .ds-247420 .ds-auth-row-between { display: flex; align-items: center; justify-content: space-between; gap: var(--space-2); flex-wrap: wrap; }
5866
5911
  .ds-247420 .ds-auth-remember { display: flex; align-items: center; gap: var(--space-1-75); cursor: pointer; }
5867
- .ds-247420 .ds-auth-remember-text { color: var(--panel-text-2); font-size: 13px; }
5868
- .ds-247420 .ds-auth-forgot { font-size: 13px; }
5869
- .ds-247420 .ds-auth-error { padding: var(--space-2) var(--space-2-5); background: var(--panel-1); border-radius: var(--r-0); color: var(--danger); font-size: 13px; overflow-wrap: anywhere; }
5912
+ .ds-247420 .ds-auth-remember-text { color: var(--panel-text-2); font-size: var(--fs-tiny); }
5913
+ .ds-247420 .ds-auth-forgot { font-size: var(--fs-tiny); }
5914
+ .ds-247420 .ds-auth-error { padding: var(--space-2) var(--space-2-5); background: var(--panel-1); border-radius: var(--r-0); color: var(--danger); font-size: var(--fs-tiny); overflow-wrap: anywhere; }
5870
5915
  .ds-247420 .ds-auth-providers { display: flex; gap: var(--space-2); flex-wrap: wrap; }
5871
5916
  .ds-247420 .ds-auth-provider-btn { flex: 1 1 100px; min-width: 0; display: flex; align-items: center; justify-content: center; gap: var(--space-2); padding: var(--space-2-5); }
5872
5917
  .ds-247420 .ds-auth-provider-btn--loading { opacity: 0.7; pointer-events: none; }
5873
5918
  .ds-247420 .ds-auth-provider-glyph { font-family: var(--ff-mono); color: var(--panel-text-3); display: inline-flex; }
5874
- .ds-247420 .ds-auth-modes { display: flex; justify-content: center; gap: 14px; /* off-scale, matches the auth form inset */ margin-top: var(--space-2); font-size: 13px; flex-wrap: wrap; }
5919
+ .ds-247420 .ds-auth-modes { display: flex; justify-content: center; gap: 14px; /* off-scale, matches the auth form inset */ margin-top: var(--space-2); font-size: var(--fs-tiny); flex-wrap: wrap; }
5875
5920
  .ds-247420 .ds-auth-mode-link { color: var(--panel-text-3); text-decoration: none; }
5876
5921
  .ds-247420 .ds-auth-mode-link--active { color: var(--panel-text); text-decoration: underline; }
5877
- .ds-247420 .ds-auth-fineprint { text-align: center; font-size: 12px; color: var(--panel-text-3); margin: var(--space-1-75) 0; }
5922
+ .ds-247420 .ds-auth-fineprint { text-align: center; font-size: var(--fs-micro); color: var(--panel-text-3); margin: var(--space-1-75) 0; }
5878
5923
 
5879
5924
  /* == appended: gallery-misc kit cleanup == */
5880
5925
  /* --- shared helpers (converted from inline styles) --- */
@@ -5884,12 +5929,12 @@
5884
5929
  .ds-247420 .ds-kit-head { display: flex; align-items: center; justify-content: space-between; gap: clamp(var(--space-2), 2vw, var(--space-3)); flex-wrap: wrap; }
5885
5930
 
5886
5931
  /* --- gallery kit --- */
5887
- .ds-247420 .ds-tile-cap { flex: 1; display: flex; align-items: center; justify-content: center; font-family: var(--ff-mono); white-space: pre-line; color: var(--panel-text-2); font-size: 18px; min-width: 0; text-align: center; }
5888
- .ds-247420 .ds-tile-meta { display: flex; align-items: center; justify-content: space-between; gap: var(--space-1-75); font-size: 12px; flex-wrap: wrap; min-width: 0; }
5932
+ .ds-247420 .ds-tile-cap { flex: 1; display: flex; align-items: center; justify-content: center; font-family: var(--ff-mono); white-space: pre-line; color: var(--panel-text-2); font-size: var(--fs-lg); min-width: 0; text-align: center; }
5933
+ .ds-247420 .ds-tile-meta { display: flex; align-items: center; justify-content: space-between; gap: var(--space-1-75); font-size: var(--fs-micro); flex-wrap: wrap; min-width: 0; }
5889
5934
  .ds-247420 .ds-tile-glyph { font-family: var(--ff-mono); color: var(--panel-text-3); }
5890
5935
  .ds-247420 .ds-tile-label { color: var(--panel-text); overflow-wrap: anywhere; }
5891
5936
  .ds-247420 .ds-gal-swatch { height: 64px; border-radius: var(--r-0); background: var(--swatch, var(--panel-1)); }
5892
- .ds-247420 .ds-gal-swatch-meta { display: flex; justify-content: space-between; gap: var(--space-1-75); flex-wrap: wrap; font-family: var(--ff-mono); font-size: 11px; min-width: 0; }
5937
+ .ds-247420 .ds-gal-swatch-meta { display: flex; justify-content: space-between; gap: var(--space-1-75); flex-wrap: wrap; font-family: var(--ff-mono); font-size: var(--fs-nano); min-width: 0; }
5893
5938
  .ds-247420 .ds-gal-swatch-name { color: var(--panel-text); }
5894
5939
  .ds-247420 .ds-gal-swatch-hint { color: var(--panel-text-3); overflow-wrap: anywhere; }
5895
5940
  .ds-247420 .ds-lightbox-head { display: flex; justify-content: space-between; align-items: center; gap: var(--space-2); flex-wrap: wrap; }
@@ -5948,9 +5993,9 @@
5948
5993
  font-family: var(--ff-mono); font-weight: 600; text-transform: lowercase;
5949
5994
  letter-spacing: 0.02em; user-select: none; flex-shrink: 0; object-fit: cover;
5950
5995
  }
5951
- .ds-247420 .ds-avatar-sm { width: 24px; height: 24px; font-size: 10px; }
5952
- .ds-247420 .ds-avatar-md { width: 36px; height: 36px; font-size: 12px; }
5953
- .ds-247420 .ds-avatar-lg { width: 48px; height: 48px; font-size: 15px; }
5996
+ .ds-247420 .ds-avatar-sm { width: 24px; height: 24px; font-size: var(--fs-pico); }
5997
+ .ds-247420 .ds-avatar-md { width: 36px; height: 36px; font-size: var(--fs-micro); }
5998
+ .ds-247420 .ds-avatar-lg { width: 48px; height: 48px; font-size: var(--fs-sm); }
5954
5999
  .ds-247420 .ds-avatar-square { border-radius: var(--r-2, 6px); }
5955
6000
 
5956
6001
  /* SpreadsheetPreview — tabbed inline spreadsheet/CSV viewer (docstudio
@@ -6139,6 +6184,10 @@
6139
6184
  same tonal chip treatment .chat-bubble code uses. */
6140
6185
  .ds-247420 .ds-pattern-notes code {
6141
6186
  font-family: var(--ff-mono);
6187
+ /* em-relative on purpose: inline code must track whatever size the
6188
+ surrounding prose is set at (the mono face runs optically large next to
6189
+ the system stack, hence 0.92). An absolute --fs-* tier would decouple it
6190
+ from its own paragraph and break at every containing type size. */
6142
6191
  font-size: 0.92em;
6143
6192
  background: color-mix(in oklab, var(--fg) 8%, transparent);
6144
6193
  padding: 0 var(--space-1);
@@ -6847,7 +6896,7 @@
6847
6896
  justify-content: center;
6848
6897
  width: 12px;
6849
6898
  height: 12px;
6850
- font-size: 10px;
6899
+ font-size: var(--fs-pico);
6851
6900
  transform: rotate(90deg);
6852
6901
  transition: transform var(--dur-base) var(--ease);
6853
6902
  flex-shrink: 0;
@@ -7125,7 +7174,7 @@
7125
7174
  display: inline-flex;
7126
7175
  align-items: center;
7127
7176
  justify-content: center;
7128
- font-size: 10px;
7177
+ font-size: var(--fs-pico);
7129
7178
  font-weight: 600;
7130
7179
  overflow: hidden;
7131
7180
  transition: box-shadow var(--dur-snap) var(--ease);
@@ -7725,7 +7774,7 @@
7725
7774
  border: none;
7726
7775
  background: transparent;
7727
7776
  color: var(--fg);
7728
- font-size: 18px;
7777
+ font-size: var(--fs-lg);
7729
7778
  line-height: 1;
7730
7779
  cursor: pointer;
7731
7780
  border-radius: var(--r-1);
@@ -7756,7 +7805,7 @@
7756
7805
  bar here was the generic accent-stripe tell; the real accent still lands
7757
7806
  on .cm-rb-author. */
7758
7807
  border-left: var(--bw-hair) solid var(--rule-strong);
7759
- font-size: 0.85rem;
7808
+ font-size: var(--fs-xs);
7760
7809
  }
7761
7810
  .ds-247420 .cm-rb-label { flex: none; color: var(--fg-2); }
7762
7811
  .ds-247420 .cm-rb-author { color: var(--accent); font-weight: 600; }
@@ -7775,7 +7824,7 @@
7775
7824
  border: none;
7776
7825
  background: transparent;
7777
7826
  color: var(--fg-2);
7778
- font-size: 13px;
7827
+ font-size: var(--fs-tiny);
7779
7828
  line-height: 1;
7780
7829
  cursor: pointer;
7781
7830
  border-radius: var(--r-1);
@@ -7790,7 +7839,7 @@
7790
7839
  gap: var(--space-2);
7791
7840
  width: 100%;
7792
7841
  padding: var(--space-2) var(--space-3);
7793
- font-size: 0.875rem;
7842
+ font-size: var(--fs-xs);
7794
7843
  font-weight: 500;
7795
7844
  }
7796
7845
  .ds-247420 .cm-banner.clickable { cursor: pointer; }
@@ -8121,7 +8170,7 @@
8121
8170
  border: var(--bw-hair) solid var(--rule-strong);
8122
8171
  border-radius: var(--r-1);
8123
8172
  background: var(--bg-3); color: var(--fg);
8124
- cursor: pointer; font-size: 16px; line-height: 1;
8173
+ cursor: pointer; font-size: var(--fs-body); line-height: 1;
8125
8174
  }
8126
8175
  .ds-247420 .vx-vc-btn:hover { background: var(--bg-4, var(--bg-3)); }
8127
8176
  .ds-247420 .vx-vc-on { background: var(--accent); color: var(--accent-fg); border-color: var(--accent); }
@@ -8151,11 +8200,11 @@
8151
8200
  display: flex; align-items: center; justify-content: space-between;
8152
8201
  padding: var(--space-2); border-bottom: var(--bw-hair) solid var(--rule);
8153
8202
  }
8154
- .ds-247420 .cm-tp-title { font-weight: 700; font-size: var(--fs-1, 14px); }
8203
+ .ds-247420 .cm-tp-title { font-weight: 700; font-size: var(--fs-xs); }
8155
8204
  .ds-247420 .cm-tp-head-actions { display: flex; gap: var(--space-1); }
8156
8205
  .ds-247420 .cm-tp-new, .ds-247420 .cm-tp-close {
8157
8206
  border: none; background: transparent; color: var(--fg-2, var(--fg));
8158
- cursor: pointer; font-size: 16px; width: 24px; height: 24px; border-radius: var(--r-1);
8207
+ cursor: pointer; font-size: var(--fs-body); width: 24px; height: 24px; border-radius: var(--r-1);
8159
8208
  }
8160
8209
  .ds-247420 .cm-tp-new:hover, .ds-247420 .cm-tp-close:hover { background: var(--bg-3); color: var(--fg); }
8161
8210
  .ds-247420 .cm-tp-list { flex: 1; min-height: 0; overflow-y: auto; }
@@ -8171,9 +8220,9 @@
8171
8220
  .ds-247420 .cm-tp-item.is-active { background: var(--bg-3); box-shadow: inset 3px 0 0 var(--accent); }
8172
8221
  .ds-247420 .cm-tp-item.is-unread .cm-tp-item-title { font-weight: 700; }
8173
8222
  .ds-247420 .cm-tp-dot { position: absolute; left: 4px; top: 50%; transform: translateY(-50%); width: 8px; height: 8px; border-radius: 50%; background: var(--accent); }
8174
- .ds-247420 .cm-tp-item-title { font-size: var(--fs-1, 14px); }
8175
- .ds-247420 .cm-tp-item-snippet { font-size: var(--fs-0, 12px); color: var(--fg-2, var(--fg)); opacity: .8; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
8176
- .ds-247420 .cm-tp-item-meta { display: flex; gap: var(--space-2); font-size: var(--fs-micro, 11px); color: var(--fg-2, var(--fg)); opacity: .7; }
8223
+ .ds-247420 .cm-tp-item-title { font-size: var(--fs-xs); }
8224
+ .ds-247420 .cm-tp-item-snippet { font-size: var(--fs-micro); color: var(--fg-2, var(--fg)); opacity: .8; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
8225
+ .ds-247420 .cm-tp-item-meta { display: flex; gap: var(--space-2); font-size: var(--fs-micro); color: var(--fg-2, var(--fg)); opacity: .7; }
8177
8226
  .ds-247420 .cm-tp-empty, .ds-247420 .cm-forum-empty, .ds-247420 .cm-channel-empty, .ds-247420 .cm-member-empty {
8178
8227
  display: flex; flex-direction: column; align-items: center; gap: var(--space-2);
8179
8228
  padding: var(--space-4) var(--space-3); text-align: center;
@@ -8223,10 +8272,10 @@
8223
8272
  .ds-247420 .cm-forum-item { display: flex; flex-direction: column; gap: var(--space-1); width: 100%; text-align: left; cursor: pointer; padding: var(--space-2) var(--space-3); border: none; background: transparent; border-bottom: var(--bw-hair) solid var(--rule); color: var(--fg); }
8224
8273
  .ds-247420 .cm-forum-item:hover { background: var(--bg-3); }
8225
8274
  .ds-247420 .cm-forum-item-head { display: flex; align-items: center; justify-content: space-between; gap: var(--space-2); }
8226
- .ds-247420 .cm-forum-item-title { font-weight: 700; font-size: var(--fs-1, 14px); }
8227
- .ds-247420 .cm-forum-item-replies { font-size: var(--fs-0, 12px); color: var(--fg-2, var(--fg)); opacity: .8; white-space: nowrap; }
8228
- .ds-247420 .cm-forum-item-snippet { font-size: var(--fs-0, 12px); color: var(--fg-2, var(--fg)); opacity: .85; }
8229
- .ds-247420 .cm-forum-item-meta { display: flex; flex-wrap: wrap; gap: var(--space-2); align-items: center; font-size: var(--fs-micro, 11px); color: var(--fg-2, var(--fg)); opacity: .7; }
8275
+ .ds-247420 .cm-forum-item-title { font-weight: 700; font-size: var(--fs-xs); }
8276
+ .ds-247420 .cm-forum-item-replies { font-size: var(--fs-micro); color: var(--fg-2, var(--fg)); opacity: .8; white-space: nowrap; }
8277
+ .ds-247420 .cm-forum-item-snippet { font-size: var(--fs-micro); color: var(--fg-2, var(--fg)); opacity: .85; }
8278
+ .ds-247420 .cm-forum-item-meta { display: flex; flex-wrap: wrap; gap: var(--space-2); align-items: center; font-size: var(--fs-micro); color: var(--fg-2, var(--fg)); opacity: .7; }
8230
8279
  .ds-247420 .cm-forum-item-tags { display: inline-flex; gap: var(--space-1); }
8231
8280
  /* 1px vertical is OFF-SCALE ON PURPOSE — the tag is an inline chip inside the
8232
8281
  forum meta row; --space-hair (2px) tips it past the row height. */
@@ -8235,7 +8284,7 @@
8235
8284
  /* PageView — cm-page / cm-page-* */
8236
8285
  .ds-247420 .cm-page { display: flex; flex-direction: column; height: 100%; min-height: 0; overflow-y: auto; background: var(--bg-1, var(--bg-2)); color: var(--fg); }
8237
8286
  .ds-247420 .cm-page-head { display: flex; align-items: center; justify-content: space-between; gap: var(--space-2); padding: var(--space-3); border-bottom: var(--bw-hair) solid var(--rule); }
8238
- .ds-247420 .cm-page-title { margin: 0; font-size: var(--fs-3, 20px); font-weight: 700; }
8287
+ .ds-247420 .cm-page-title { margin: 0; font-size: var(--fs-xl); font-weight: 700; }
8239
8288
  .ds-247420 .cm-page-edit { padding: var(--space-1) var(--space-2); border: var(--bw-hair) solid var(--rule-strong); border-radius: var(--r-1); background: var(--bg-3); color: var(--fg); cursor: pointer; }
8240
8289
  .ds-247420 .cm-page-body { padding: var(--space-3); line-height: 1.6; }
8241
8290
  .ds-247420 .cm-page-empty { color: var(--fg-2, var(--fg)); opacity: .7; }
@@ -8249,8 +8298,11 @@
8249
8298
  .ds-247420 .fd-page-inner > * { min-width: 0; }
8250
8299
  .ds-247420 .fd-loading { display: flex; align-items: center; gap: var(--space-2, 10px); padding: var(--space-4, 24px); color: var(--fg-2, var(--fg)); }
8251
8300
  .ds-247420 .fd-empty { display: flex; flex-direction: column; align-items: center; justify-content: center; gap: var(--space-2, 10px); padding: var(--space-5, 32px) var(--space-3, 16px); color: var(--fg-2, var(--fg)); text-align: center; }
8301
+ /* 28px is an ICON size (empty-state mark), not a type tier — the --fs-* ladder
8302
+ tops out at --fs-xl (21px) before every remaining rung becomes a fluid
8303
+ heading clamp, so neither substitutes without visibly resizing the mark. */
8252
8304
  .ds-247420 .fd-empty-glyph { font-size: 28px; opacity: .55; line-height: 1; }
8253
- .ds-247420 .fd-pre { margin: 0; padding: var(--space-2, 10px); background: var(--bg-3, var(--panel-bg-2)); border: var(--bw-hair, 1px) solid var(--rule, var(--panel-accent)); border-radius: var(--r-1, 6px); overflow: auto; max-height: 460px; white-space: pre-wrap; overflow-wrap: anywhere; word-break: break-word; font-family: var(--font-mono, ui-monospace, monospace); font-size: 12px; line-height: 1.5; }
8305
+ .ds-247420 .fd-pre { margin: 0; padding: var(--space-2, 10px); background: var(--bg-3, var(--panel-bg-2)); border: var(--bw-hair, 1px) solid var(--rule, var(--panel-accent)); border-radius: var(--r-1, 6px); overflow: auto; max-height: 460px; white-space: pre-wrap; overflow-wrap: anywhere; word-break: break-word; font-family: var(--font-mono, ui-monospace, monospace); font-size: var(--fs-micro); line-height: 1.5; }
8254
8306
  .ds-247420 .fd-skill-body { max-height: 320px; }
8255
8307
  .ds-247420 .fd-row-actions { display: inline-flex; gap: var(--space-1, 6px); align-items: center; }
8256
8308
  .ds-247420 .fd-chat { display: flex; flex-direction: column; gap: var(--space-2, 10px); height: 100%; min-height: 0; }
@@ -12009,7 +12061,7 @@
12009
12061
  margin: 0 0 var(--space-3) 0;
12010
12062
  }
12011
12063
  .ds-247420 #ds-article-host .toc ol { margin: 0; padding-left: var(--space-3-5); }
12012
- .ds-247420 #ds-article-host .toc li { font-size: 13px; line-height: 1.85; color: var(--panel-text); }
12064
+ .ds-247420 #ds-article-host .toc li { font-size: var(--fs-tiny); line-height: 1.85; color: var(--panel-text); }
12013
12065
  .ds-247420 #ds-article-host .toc li::marker { color: var(--panel-text-3); font-variant-numeric: tabular-nums; }
12014
12066
  .ds-247420 #ds-article-host .toc a { color: var(--panel-text-2); text-decoration: none; transition: color .12s ease; }
12015
12067
  .ds-247420 #ds-article-host .toc a:hover { color: var(--panel-accent); }
@@ -12040,6 +12092,12 @@
12040
12092
  padding: var(--space-3) var(--space-3-5);
12041
12093
  margin: var(--space-3) 0 var(--space-5) 0;
12042
12094
  font-family: var(--ff-mono);
12095
+ /* Deliberate half-step, NOT un-migrated drift: this is a transcript block set
12096
+ in the mono face, which runs optically ~1 rung larger than the system
12097
+ stack at the same px. --fs-micro (12) reads thin against the surrounding
12098
+ prose and --fs-tiny (13) reads heavy; 12.5 is the tuned midpoint. There is
12099
+ no half-rung on the --fs-* ladder and one must not be invented for a
12100
+ single block, so this literal stays. */
12043
12101
  font-size: 12.5px;
12044
12102
  line-height: 1.6;
12045
12103
  color: var(--panel-text);
@@ -12086,7 +12144,7 @@
12086
12144
  margin-top: var(--space-1-75);
12087
12145
  font-weight: 400;
12088
12146
  color: var(--panel-text-2);
12089
- font-size: 13px;
12147
+ font-size: var(--fs-tiny);
12090
12148
  line-height: 1.6;
12091
12149
  }
12092
12150
 
@@ -12098,15 +12156,15 @@
12098
12156
  margin: var(--space-2) 0;
12099
12157
  background: var(--panel-1);
12100
12158
  border-radius: var(--r-0);
12101
- font-size: 13px;
12159
+ font-size: var(--fs-tiny);
12102
12160
  box-shadow: var(--panel-shadow);
12103
12161
  text-decoration: none;
12104
12162
  }
12105
12163
  .ds-247420 .ds-prose .card:hover { background: var(--panel-hover); }
12106
12164
  .ds-247420 .ds-prose .card .card-top { display: flex; align-items: baseline; justify-content: space-between; gap: var(--space-2-75); }
12107
12165
  .ds-247420 .ds-prose .card .repo-name { font-weight: 600; color: var(--panel-text); }
12108
- .ds-247420 .ds-prose .card .stars { color: var(--panel-text-3); font-family: var(--ff-mono); font-size: 12px; flex: 0 0 auto; }
12109
- .ds-247420 .ds-prose .card .desc { color: var(--panel-text-2); font-size: 12px; line-height: 1.5; margin: 0; }
12166
+ .ds-247420 .ds-prose .card .stars { color: var(--panel-text-3); font-family: var(--ff-mono); font-size: var(--fs-micro); flex: 0 0 auto; }
12167
+ .ds-247420 .ds-prose .card .desc { color: var(--panel-text-2); font-size: var(--fs-micro); line-height: 1.5; margin: 0; }
12110
12168
  .ds-247420 .ds-prose .tags { display: flex; gap: var(--space-1-75); flex-wrap: wrap; }
12111
12169
  .ds-247420 .ds-prose .tag {
12112
12170
  background: var(--panel-2);