anentrypoint-design 0.0.383 → 0.0.385

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.
@@ -55,7 +55,7 @@
55
55
  width: 36px; height: 36px; flex-shrink: 0;
56
56
  border-radius: 50%; background: var(--bg-3); color: var(--fg);
57
57
  display: inline-flex; align-items: center; justify-content: center;
58
- font-family: var(--ff-mono); font-size: 12px; font-weight: 600;
58
+ font-family: var(--ff-mono); font-size: var(--fs-micro); font-weight: 600;
59
59
  text-transform: lowercase; letter-spacing: 0.02em; user-select: none;
60
60
  transition: transform 0.12s ease, box-shadow 0.12s ease;
61
61
  position: relative;
@@ -96,6 +96,9 @@
96
96
  border: 1px solid color-mix(in oklab, var(--mascot) 28%, transparent);
97
97
  }
98
98
  .chat-bubble code {
99
+ /* em-relative on purpose: inline code tracks the size of the prose it sits
100
+ inside (the mono face runs optically large next to the system stack, hence
101
+ 0.92). An absolute --fs-* tier would decouple it from its own paragraph. */
99
102
  font-family: var(--ff-mono); font-size: 0.92em;
100
103
  background: color-mix(in oklab, var(--fg) 10%, transparent);
101
104
  /* 1px block is deliberately under --space-hair (2px): inline <code> must not
@@ -122,6 +125,11 @@
122
125
  font-family: var(--ff-body); font-weight: 600;
123
126
  margin: var(--space-2) 0 var(--space-1); line-height: var(--lh-snug);
124
127
  }
128
+ /* em-relative on purpose, NOT --fs-h1..h3: markdown headings inside a chat
129
+ bubble are a hierarchy WITHIN the bubble's own type size, not page headings.
130
+ The --fs-h* tiers are fluid clamp()s tuned to page container queries and
131
+ would render a bubble heading at 34px+, dwarfing the message it labels.
132
+ These stay a tight ratio ladder off whatever size the bubble is set at. */
125
133
  .chat-bubble.chat-md h1 { font-size: 1.15em; }
126
134
  .chat-bubble.chat-md h2 { font-size: 1.08em; }
127
135
  .chat-bubble.chat-md h3 { font-size: 1.04em; }
@@ -158,7 +166,7 @@
158
166
  }
159
167
  /* Markdown tables + horizontal rules: agents routinely emit them, but they were
160
168
  unstyled (bare unspaced cells, vanished rules). */
161
- .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; }
169
+ .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; }
162
170
  .chat-bubble.chat-md th,
163
171
  .chat-bubble.chat-md td { border: var(--bw-hair) solid var(--rule); padding: var(--space-1) var(--space-2-5); text-align: left; }
164
172
  .chat-bubble.chat-md th { background: color-mix(in oklab, var(--fg) 5%, transparent); font-weight: 600; }
@@ -268,6 +276,9 @@
268
276
  }
269
277
  .chat-file:hover { background: var(--bg-3); }
270
278
  .chat-file .glyph {
279
+ /* 22px is the ICON size inside a 36px chip — matched to the chip box, not to
280
+ the type scale (--fs-xl is 21px, and above it every rung is a fluid
281
+ heading clamp). Snapping it visibly resizes the mark. */
271
282
  font-size: 22px; width: 36px; height: 36px;
272
283
  display: inline-flex; align-items: center; justify-content: center;
273
284
  background: var(--bg-3);
@@ -280,7 +291,7 @@
280
291
  }
281
292
  .chat-file .meta { display: flex; flex-direction: column; gap: var(--space-hair); min-width: 0; flex: 1; }
282
293
  .chat-file .size { font-family: var(--ff-mono); font-size: var(--fs-xs); color: var(--fg-3); }
283
- .chat-file .go { font-family: var(--ff-mono); font-size: 16px; color: var(--fg-3); flex-shrink: 0; }
294
+ .chat-file .go { font-family: var(--ff-mono); font-size: var(--fs-body); color: var(--fg-3); flex-shrink: 0; }
284
295
  .chat-file:hover .go { color: var(--accent-ink); }
285
296
 
286
297
  .chat-msg.you .chat-pdf,
@@ -298,7 +309,7 @@
298
309
  background: color-mix(in oklab, var(--fg) 5%, var(--bg-2));
299
310
  border-bottom: 1px solid color-mix(in oklab, var(--fg) 10%, transparent);
300
311
  }
301
- .chat-pdf-head .glyph { font-size: 18px; color: var(--mascot); flex-shrink: 0; }
312
+ .chat-pdf-head .glyph { font-size: var(--fs-lg); color: var(--mascot); flex-shrink: 0; }
302
313
  .chat-pdf-head .name { flex: 1; font-weight: 600; font-size: var(--fs-sm); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
303
314
  .chat-pdf-head .size { font-family: var(--ff-mono); font-size: var(--fs-xs); color: var(--fg-3); }
304
315
  .chat-pdf-head a { color: var(--accent-ink); font-family: var(--ff-mono); font-size: var(--fs-xs); text-decoration: none; }
@@ -357,8 +368,8 @@
357
368
  border-color: color-mix(in oklab, var(--accent) 55%, transparent);
358
369
  color: var(--accent-ink);
359
370
  }
360
- .chat-reactions .rxn .e { font-size: 14px; line-height: 1; }
361
- .chat-reactions .rxn .n { font-family: var(--ff-mono); font-weight: 600; font-size: 11px; color: var(--fg-2); }
371
+ .chat-reactions .rxn .e { font-size: var(--fs-xs); line-height: 1; }
372
+ .chat-reactions .rxn .n { font-family: var(--ff-mono); font-weight: 600; font-size: var(--fs-nano); color: var(--fg-2); }
362
373
  .chat-reactions .rxn.you .n { color: var(--accent-ink); }
363
374
 
364
375
  .chat-typing { display: inline-flex; gap: var(--space-1); align-items: center; }
@@ -485,6 +496,7 @@
485
496
 
486
497
  .aicat-portrait { display: inline-flex; align-items: center; gap: var(--space-2-5); padding: var(--space-1) 0; }
487
498
  .aicat-face {
499
+ /* 24px is the ICON size inside a 32px round chip — see .chat-file .glyph. */
488
500
  width: 32px; height: 32px; font-size: 24px;
489
501
  display: inline-flex; align-items: center; justify-content: center;
490
502
  background: color-mix(in oklab, var(--mascot) 22%, var(--bg-2));
@@ -128,7 +128,7 @@
128
128
  /* File icon — glyph chip, tinted per type. */
129
129
  .ds-file-icon {
130
130
  display: inline-flex; align-items: center; justify-content: center;
131
- width: 26px; height: 26px; font-size: 15px; line-height: 1;
131
+ width: 26px; height: 26px; font-size: var(--fs-sm); line-height: 1;
132
132
  color: var(--fg-2);
133
133
  }
134
134
  .ds-file-row[data-file-type="dir"] .ds-file-icon { color: var(--accent-ink); }
@@ -152,7 +152,7 @@
152
152
  display: inline-flex; align-items: center; justify-content: center;
153
153
  width: 28px; height: 28px; padding: 0;
154
154
  background: transparent; border: 0; border-radius: var(--r-1);
155
- color: var(--fg-3); font-size: 14px; cursor: pointer;
155
+ color: var(--fg-3); font-size: var(--fs-xs); cursor: pointer;
156
156
  transition: background var(--dur-snap) var(--ease), color var(--dur-snap) var(--ease);
157
157
  }
158
158
  .ds-file-act:hover { background: var(--bg-3); color: var(--fg); }
@@ -251,7 +251,7 @@
251
251
  .ds-file-grid[data-density="compact"] .ds-file-row { padding: var(--space-1-5) var(--space-2-75); gap: var(--space-2-5); }
252
252
  .ds-file-grid[data-density="compact"] .ds-file-row .title { font-size: var(--fs-xs); }
253
253
  .ds-file-grid[data-density="compact"] .ds-file-row .ds-file-meta { font-size: var(--fs-micro); }
254
- .ds-file-grid[data-density="compact"] .ds-file-icon { width: 20px; height: 20px; font-size: 13px; }
254
+ .ds-file-grid[data-density="compact"] .ds-file-icon { width: 20px; height: 20px; font-size: var(--fs-tiny); }
255
255
 
256
256
  /* Thumbnail density — tile grid; image entries carry a real lazy thumbnail. */
257
257
  .ds-file-grid-thumb {
@@ -291,6 +291,10 @@
291
291
  width: 100%; aspect-ratio: 4 / 3;
292
292
  background: var(--bg-2); border-radius: var(--r-1); overflow: hidden;
293
293
  }
294
+ /* 24px is the ICON size inside a 34px chip, not a type tier — it is matched to
295
+ the chip box, not to the text scale (the --fs-* rungs jump 21px -> fluid
296
+ heading clamps, so neither substitutes without resizing the icon). Same
297
+ reasoning for the other four .ds-*-glyph rules in this sheet. */
294
298
  .ds-file-cell-media .ds-file-icon { width: 34px; height: 34px; font-size: 24px; }
295
299
  .ds-file-cell-thumb { width: 100%; height: 100%; object-fit: cover; }
296
300
  /* Per-type icon tints on thumb tiles so the grid keeps the colour-coding the
@@ -434,6 +438,7 @@
434
438
  gap: var(--space-2); flex-wrap: wrap;
435
439
  padding: var(--space-4) var(--space-3); text-align: center;
436
440
  }
441
+ /* Icon size, not type — see .ds-file-cell-media .ds-file-icon above. */
437
442
  .ds-dropzone-glyph { font-size: 22px; color: var(--fg-3); }
438
443
  .ds-dropzone-label { font-size: var(--fs-sm); color: var(--fg-3); }
439
444
  .ds-dropzone.dragover {
@@ -542,6 +547,7 @@
542
547
  gap: var(--space-2); padding: var(--space-6) var(--space-3);
543
548
  color: var(--fg-3); text-align: center;
544
549
  }
550
+ /* Icon size, not type — see .ds-file-cell-media .ds-file-icon above. */
545
551
  .ds-file-empty-glyph { font-size: 34px; opacity: 0.55; }
546
552
  .ds-file-empty-text { font-size: var(--fs-sm); }
547
553
 
@@ -597,7 +603,11 @@
597
603
  font-family: inherit; font-size: var(--fs-sm);
598
604
  }
599
605
  .ds-modal-input:focus-visible { outline: var(--focus-w) solid var(--focus-color); outline-offset: var(--focus-offset); }
600
- /* iOS auto-zooms inputs under 16px on focus, breaking the modal layout. */
606
+ /* iOS auto-zooms inputs under 16px on focus, breaking the modal layout.
607
+ Deliberately a literal, NOT var(--fs-body): --fs-body is re-declared to
608
+ 15px under [data-typescale="sm"], which would silently drop this input back
609
+ under the zoom threshold on any density-reduced page. The 16px here is a
610
+ platform constant, not a point on the type scale. */
601
611
  @media (hover: none), (pointer: coarse) {
602
612
  .ds-modal-input { font-size: 16px; min-height: 44px; }
603
613
  }
@@ -694,6 +704,7 @@
694
704
  display: flex; flex-direction: column; align-items: center; justify-content: center;
695
705
  gap: var(--space-2); padding: var(--space-6); color: var(--fg-3);
696
706
  }
707
+ /* Icon size, not type — see .ds-file-cell-media .ds-file-icon above. */
697
708
  .ds-preview-glyph { font-size: 34px; opacity: 0.6; }
698
709
 
699
710
  /* Thin scrollbars inside preview bodies. */
@@ -41,6 +41,11 @@
41
41
  .ds-hero-stat:last-child { border-bottom: 0; padding-bottom: 0; }
42
42
  .ds-hero-title {
43
43
  font-family: var(--ff-display); font-weight: 700;
44
+ /* Bespoke display clamp, deliberately off the --fs-* ladder: --fs-hero is
45
+ clamp(42px,7cqi,96px) and --fs-mega is clamp(56px,11cqi,168px). This lead
46
+ runs a steeper 9cqi slope with a LOWER 40px floor so a two-line 16ch title
47
+ still fits a narrow column, and a 116px ceiling between the two tiers.
48
+ Snapping to either changes the hero's whole optical weight. */
44
49
  font-size: clamp(40px, 9cqi, 116px);
45
50
  line-height: 0.96; letter-spacing: var(--tr-tighter);
46
51
  margin: 0; max-width: 16ch; text-wrap: balance;
@@ -84,6 +89,12 @@
84
89
  .ds-section-compact { margin-top: 0; margin-bottom: var(--space-4); }
85
90
  .ds-section > h3 {
86
91
  font-family: var(--ff-body); font-weight: 600; font-size: var(--fs-h3);
92
+ /* Zero top margin looks like it inverts the more-space-above-than-below rule,
93
+ but it does not: this h3 is always the section's first child and .ds-section
94
+ itself carries the --space-8 (96px) lead, so the effective space above is
95
+ 96px against 32px below. Adding a top margin here would double the lead.
96
+ Measured live on project_page: gapAboveInSection 0 with the section margin
97
+ supplying the separation, gapBelow 32. */
87
98
  margin: 0 0 var(--space-5);
88
99
  letter-spacing: -0.01em;
89
100
  }
@@ -175,7 +186,7 @@
175
186
  }
176
187
  .ds-cli-row {
177
188
  display: flex; gap: 10px;
178
- font-family: var(--ff-mono); font-size: 13px; line-height: 1.6;
189
+ font-family: var(--ff-mono); font-size: var(--fs-tiny); line-height: 1.6;
179
190
  padding: 3px 0;
180
191
  }
181
192
  .ds-cli-row .prompt { color: var(--green-2); flex: 0 0 auto; user-select: none; }
@@ -254,6 +265,16 @@ table tr.clickable:focus-visible td { background: var(--bg-2); }
254
265
  Changelog
255
266
  ============================================================ */
256
267
  .ds-changelog-row {
268
+ /* The !important is load-bearing and was empirically confirmed so -- do not
269
+ remove it on a specificity argument. A changelog row carries three tracks
270
+ (date, version, message) where a plain .row carries two, and the responsive
271
+ blocks in responsive.css legitimately rewrite .row's template at several
272
+ breakpoints. Those blocks are later in the cascade, so at tablet width the
273
+ two-track override wins on source order and collapses the version column:
274
+ measured live, removing this flag changes the computed template from
275
+ "120.75px 77.625px 70.125px" to "103.5px 0px 165px" -- a zero-width column
276
+ and the version silently gone. Scoping to .app does not help, because the
277
+ competing rules would need to be scoped in lockstep. */
257
278
  grid-template-columns: minmax(110px, 14ch) minmax(60px, 9ch) minmax(0, 1fr) !important;
258
279
  }
259
280
  .ds-changelog-ver {
@@ -309,6 +330,10 @@ table tr.clickable:focus-visible td { background: var(--bg-2); }
309
330
  }
310
331
  .kpi-card .num {
311
332
  font-family: var(--ff-body); font-weight: 600;
333
+ /* Numeric display size, not a heading tier: --fs-h4 is clamp(19px,1.8cqi,
334
+ 24px) — too small and too flat a slope for a KPI figure that must read as
335
+ the loudest thing in its card, and --fs-h3 (22/30) tops out short of 32.
336
+ Deliberate off-scale value tuned to the .kpi-card box. */
312
337
  font-size: clamp(22px, 3cqi, 32px); line-height: 1;
313
338
  letter-spacing: var(--tr-tight);
314
339
  }
@@ -261,7 +261,7 @@
261
261
  }
262
262
  .ds-err-path {
263
263
  display: inline-flex; gap: var(--space-1-75); align-items: baseline; flex-wrap: wrap; max-width: 100%;
264
- font-family: var(--ff-mono); font-size: 13px; color: var(--panel-text-2);
264
+ font-family: var(--ff-mono); font-size: var(--fs-tiny); color: var(--panel-text-2);
265
265
  background: var(--panel-1); padding: var(--space-1-75) var(--space-2-75); border-radius: var(--r-0);
266
266
  overflow-wrap: anywhere; word-break: break-all;
267
267
  }
@@ -319,6 +319,9 @@
319
319
  .ds-topbar-search { flex-basis: 100%; }
320
320
  }
321
321
  .ds-empty-state { padding: clamp(var(--space-3), 5vw, var(--space-4)); text-align: center; color: var(--panel-text-3); }
322
+ /* Fluid ICON size (empty-state mark), not a type tier: it scales with the
323
+ viewport between 24 and 32px. Every fluid --fs-* tier is a heading clamp
324
+ tuned to cqi + heading weight, so none of them substitutes here. */
322
325
  .ds-empty-state-glyph { font-size: clamp(24px, 6vw, 32px); }
323
326
  .ds-empty-state-msg { margin: var(--space-1-75) 0; }
324
327
  .ds-empty-state-hint { margin: 0; font-size: var(--fs-sm); }
@@ -338,20 +341,20 @@
338
341
  .ds-swatch-col { display: flex; flex-direction: column; gap: var(--space-1-75); }
339
342
  .ds-swatch-chip { height: 48px; border-radius: var(--r-1); border: 1px solid var(--rule); background: var(--swatch, var(--panel-1)); }
340
343
  .ds-swatch-chip--big { height: 64px; }
341
- .ds-swatch-name { font-family: var(--ff-mono); font-size: 11px; color: var(--fg-3); }
344
+ .ds-swatch-name { font-family: var(--ff-mono); font-size: var(--fs-nano); color: var(--fg-3); }
342
345
  .ds-type-panel { padding: clamp(10px, 2.5vw, 14px) clamp(10px, 3vw, 18px); display: flex; flex-direction: column; gap: 14px; }
343
346
  .ds-type-row {
344
347
  display: flex; align-items: baseline; gap: 14px;
345
348
  border-bottom: 1px solid var(--rule); padding-bottom: var(--space-2); flex-wrap: wrap;
346
349
  }
347
- .ds-type-row-label { flex: 0 0 64px; font-family: var(--ff-mono); font-size: 11px; color: var(--fg-3); }
350
+ .ds-type-row-label { flex: 0 0 64px; font-family: var(--ff-mono); font-size: var(--fs-nano); color: var(--fg-3); }
348
351
  .ds-type-sample {
349
352
  min-width: 0; overflow-wrap: anywhere; line-height: var(--lh-tight); color: var(--fg);
350
353
  font-size: var(--sample-size, var(--fs-body));
351
354
  }
352
355
  .ds-prim-panel { padding: clamp(10px, 2.5vw, 14px) clamp(10px, 3vw, 18px); display: flex; flex-direction: column; gap: 18px; }
353
356
  .ds-prim-row { display: flex; gap: var(--space-2-5); flex-wrap: wrap; align-items: center; }
354
- .ds-prim-label { flex: 0 0 64px; font-family: var(--ff-mono); font-size: 11px; color: var(--fg-3); }
357
+ .ds-prim-label { flex: 0 0 64px; font-family: var(--ff-mono); font-size: var(--fs-nano); color: var(--fg-3); }
355
358
 
356
359
  /* == appended: content-site == */
357
360
  /* Home landing wrappers (site/theme.mjs) — replace banned inline styles. */
@@ -483,6 +486,10 @@
483
486
  /* 18px ceiling: no tier between --space-3 (16) and --space-3-5 (20). */
484
487
  .ds-auth-form { padding: clamp(var(--space-2-75), 3vw, 18px); display: flex; flex-direction: column; gap: var(--space-2-5); }
485
488
  .ds-auth-sent { align-items: center; text-align: center; }
489
+ /* 32px is an ICON size, not a type size: this is the confirmation mark above
490
+ the "check your mail" copy, sized to the 440px auth column, and the --fs-*
491
+ scale tops out at --fs-xl (21px) before jumping to fluid clamp() heading
492
+ tiers. Snapping it to either would visibly resize the mark. */
486
493
  .ds-auth-sent-glyph { font-size: 32px; color: var(--panel-accent); }
487
494
  .ds-auth-sent-title { margin: 0; font-weight: 600; }
488
495
  .ds-auth-sent-sub { margin: 0; color: var(--panel-text-2); overflow-wrap: anywhere; }
@@ -490,17 +497,17 @@
490
497
  /* .ds-auth-field-label joins the kit small-label voice above, no overrides. */
491
498
  .ds-auth-row-between { display: flex; align-items: center; justify-content: space-between; gap: var(--space-2); flex-wrap: wrap; }
492
499
  .ds-auth-remember { display: flex; align-items: center; gap: var(--space-1-75); cursor: pointer; }
493
- .ds-auth-remember-text { color: var(--panel-text-2); font-size: 13px; }
494
- .ds-auth-forgot { font-size: 13px; }
495
- .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; }
500
+ .ds-auth-remember-text { color: var(--panel-text-2); font-size: var(--fs-tiny); }
501
+ .ds-auth-forgot { font-size: var(--fs-tiny); }
502
+ .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; }
496
503
  .ds-auth-providers { display: flex; gap: var(--space-2); flex-wrap: wrap; }
497
504
  .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); }
498
505
  .ds-auth-provider-btn--loading { opacity: 0.7; pointer-events: none; }
499
506
  .ds-auth-provider-glyph { font-family: var(--ff-mono); color: var(--panel-text-3); display: inline-flex; }
500
- .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; }
507
+ .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; }
501
508
  .ds-auth-mode-link { color: var(--panel-text-3); text-decoration: none; }
502
509
  .ds-auth-mode-link--active { color: var(--panel-text); text-decoration: underline; }
503
- .ds-auth-fineprint { text-align: center; font-size: 12px; color: var(--panel-text-3); margin: var(--space-1-75) 0; }
510
+ .ds-auth-fineprint { text-align: center; font-size: var(--fs-micro); color: var(--panel-text-3); margin: var(--space-1-75) 0; }
504
511
 
505
512
  /* == appended: gallery-misc kit cleanup == */
506
513
  /* --- shared helpers (converted from inline styles) --- */
@@ -510,12 +517,12 @@
510
517
  .ds-kit-head { display: flex; align-items: center; justify-content: space-between; gap: clamp(var(--space-2), 2vw, var(--space-3)); flex-wrap: wrap; }
511
518
 
512
519
  /* --- gallery kit --- */
513
- .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; }
514
- .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; }
520
+ .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; }
521
+ .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; }
515
522
  .ds-tile-glyph { font-family: var(--ff-mono); color: var(--panel-text-3); }
516
523
  .ds-tile-label { color: var(--panel-text); overflow-wrap: anywhere; }
517
524
  .ds-gal-swatch { height: 64px; border-radius: var(--r-0); background: var(--swatch, var(--panel-1)); }
518
- .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; }
525
+ .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; }
519
526
  .ds-gal-swatch-name { color: var(--panel-text); }
520
527
  .ds-gal-swatch-hint { color: var(--panel-text-3); overflow-wrap: anywhere; }
521
528
  .ds-lightbox-head { display: flex; justify-content: space-between; align-items: center; gap: var(--space-2); flex-wrap: wrap; }
@@ -574,9 +581,9 @@
574
581
  font-family: var(--ff-mono); font-weight: 600; text-transform: lowercase;
575
582
  letter-spacing: 0.02em; user-select: none; flex-shrink: 0; object-fit: cover;
576
583
  }
577
- .ds-avatar-sm { width: 24px; height: 24px; font-size: 10px; }
578
- .ds-avatar-md { width: 36px; height: 36px; font-size: 12px; }
579
- .ds-avatar-lg { width: 48px; height: 48px; font-size: 15px; }
584
+ .ds-avatar-sm { width: 24px; height: 24px; font-size: var(--fs-pico); }
585
+ .ds-avatar-md { width: 36px; height: 36px; font-size: var(--fs-micro); }
586
+ .ds-avatar-lg { width: 48px; height: 48px; font-size: var(--fs-sm); }
580
587
  .ds-avatar-square { border-radius: var(--r-2, 6px); }
581
588
 
582
589
  /* SpreadsheetPreview — tabbed inline spreadsheet/CSV viewer (docstudio
@@ -765,6 +772,10 @@
765
772
  same tonal chip treatment .chat-bubble code uses. */
766
773
  .ds-pattern-notes code {
767
774
  font-family: var(--ff-mono);
775
+ /* em-relative on purpose: inline code must track whatever size the
776
+ surrounding prose is set at (the mono face runs optically large next to
777
+ the system stack, hence 0.92). An absolute --fs-* tier would decouple it
778
+ from its own paragraph and break at every containing type size. */
768
779
  font-size: 0.92em;
769
780
  background: color-mix(in oklab, var(--fg) 8%, transparent);
770
781
  padding: 0 var(--space-1);