anentrypoint-design 0.0.381 → 0.0.382

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 (49) hide show
  1. package/dist/247420.css +228 -162
  2. package/dist/247420.js +24 -24
  3. package/package.json +1 -1
  4. package/src/components/content/avatar.js +31 -0
  5. package/src/components/content/charts.js +50 -0
  6. package/src/components/content/cli.js +46 -0
  7. package/src/components/content/feedback.js +77 -0
  8. package/src/components/content/fields.js +136 -0
  9. package/src/components/content/hero.js +146 -0
  10. package/src/components/content/lists.js +85 -0
  11. package/src/components/content/panel.js +79 -0
  12. package/src/components/content/row.js +115 -0
  13. package/src/components/content/table.js +97 -0
  14. package/src/components/content/views.js +81 -0
  15. package/src/components/content.js +29 -861
  16. package/src/components/editor-primitives/batch.js +60 -0
  17. package/src/components/editor-primitives/chrome.js +146 -0
  18. package/src/components/editor-primitives/collapse.js +46 -0
  19. package/src/components/editor-primitives/context-menu.js +127 -0
  20. package/src/components/editor-primitives/diagnostics.js +44 -0
  21. package/src/components/editor-primitives/focus-trap.js +26 -0
  22. package/src/components/editor-primitives/json-viewer.js +123 -0
  23. package/src/components/editor-primitives/layout.js +89 -0
  24. package/src/components/editor-primitives/modals.js +89 -0
  25. package/src/components/editor-primitives/pager.js +74 -0
  26. package/src/components/editor-primitives/property-grid.js +57 -0
  27. package/src/components/editor-primitives/shared.js +18 -0
  28. package/src/components/editor-primitives/split-panel.js +101 -0
  29. package/src/components/editor-primitives/toast.js +59 -0
  30. package/src/components/editor-primitives/tree.js +75 -0
  31. package/src/components/editor-primitives.js +35 -1048
  32. package/src/components/overlay-primitives/approval-prompt.js +38 -0
  33. package/src/components/overlay-primitives/auth-modal.js +89 -0
  34. package/src/components/overlay-primitives/command-palette.js +101 -0
  35. package/src/components/overlay-primitives/emoji-picker.js +103 -0
  36. package/src/components/overlay-primitives/floating.js +146 -0
  37. package/src/components/overlay-primitives/full-screen.js +45 -0
  38. package/src/components/overlay-primitives/menus.js +131 -0
  39. package/src/components/overlay-primitives/popover.js +51 -0
  40. package/src/components/overlay-primitives/roving-menu.js +73 -0
  41. package/src/components/overlay-primitives/settings-popover.js +85 -0
  42. package/src/components/overlay-primitives/tooltip.js +55 -0
  43. package/src/components/overlay-primitives.js +33 -855
  44. package/src/css/app-shell/chat-polish.css +39 -32
  45. package/src/css/app-shell/data-density.css +25 -21
  46. package/src/css/app-shell/files.css +37 -29
  47. package/src/css/app-shell/kits-appended.css +73 -50
  48. package/src/css/app-shell/responsive.css +47 -29
  49. package/src/kits/os/freddie-dashboard.css +2 -2
@@ -30,9 +30,15 @@
30
30
  app scale (--fs-h1-app, 22-30px) is what these tokens exist for. Applied
31
31
  here rather than as a data-attribute on each kit shell so any surface using
32
32
  this root gets the app voice without a per-kit opt-in that kits forget. */
33
- .ds-app-surface > h1, .ds-app-surface > .t-h1 { font-size: var(--fs-h1-app); line-height: 1.15; }
34
- .ds-app-surface > h2, .ds-app-surface > .t-h2 { font-size: var(--fs-h2-app); }
35
- .ds-app-surface > h3, .ds-app-surface > .t-h3 { font-size: var(--fs-h3-app); }
33
+ /* Descendant, not direct-child: a kit that wraps its title in a head row (an
34
+ h1 beside a theme toggle, say) still gets the app voice. The direct-child
35
+ form silently missed exactly that shape and left those titles at the 64px
36
+ display ceiling -- the surface opted in but the rule did not reach the
37
+ heading. Nested .ds-section content is unaffected because nothing re-raises
38
+ the size below this point. */
39
+ .ds-app-surface h1, .ds-app-surface .t-h1 { font-size: var(--fs-h1-app); line-height: 1.15; }
40
+ .ds-app-surface h2, .ds-app-surface .t-h2 { font-size: var(--fs-h2-app); }
41
+ .ds-app-surface h3, .ds-app-surface .t-h3 { font-size: var(--fs-h3-app); }
36
42
  /* The lede is supporting chrome under an app title, not a marketing stand-first:
37
43
  it drops to body size and keeps a readable measure instead of --fs-xl. */
38
44
  .ds-app-surface > .lede, .ds-app-surface > .t-lede { font-size: var(--fs-body); max-width: 60ch; }
@@ -138,7 +144,7 @@
138
144
  margin: var(--space-3) auto;
139
145
  background: var(--bg-2);
140
146
  border-radius: var(--r-2);
141
- padding: clamp(16px, 5vw, 64px);
147
+ padding: clamp(var(--space-3), 5vw, var(--space-7));
142
148
  box-sizing: border-box;
143
149
  display: flex;
144
150
  overflow: hidden;
@@ -153,8 +159,10 @@
153
159
  }
154
160
  .ds-deck-slide { flex: 1; display: flex; min-width: 0; }
155
161
  .ds-deck-controls {
162
+ /* 14px sits between --space-2-75 (12) and --space-3 (16) with no tier; it is
163
+ the deck control spacing tuned against the mono glyph run. */
156
164
  display: flex; align-items: center; justify-content: center; gap: 14px;
157
- padding: 8px; font-family: var(--ff-mono); font-size: var(--fs-sm);
165
+ padding: var(--space-2); font-family: var(--ff-mono); font-size: var(--fs-sm);
158
166
  }
159
167
  .ds-deck-count { color: var(--fg-3); }
160
168
  @media (pointer: coarse) {
@@ -181,9 +189,9 @@
181
189
  full-bleed slide chrome, not panel chrome) and owns its own bottom gutter. */
182
190
  .ds-slide-eyebrow {
183
191
  color: var(--fg-3);
184
- margin-bottom: clamp(12px, 2.5cqw, 24px);
192
+ margin-bottom: clamp(var(--space-2-75), 2.5cqw, var(--space-4));
185
193
  }
186
- .ds-slide-col { display: flex; flex-direction: column; justify-content: center; gap: clamp(12px, 2.5cqw, 24px); min-width: 0; }
194
+ .ds-slide-col { display: flex; flex-direction: column; justify-content: center; gap: clamp(var(--space-2-75), 2.5cqw, var(--space-4)); min-width: 0; }
187
195
  .ds-slide-col--start { align-items: flex-start; }
188
196
  .ds-slide-col--narrow { max-width: 38ch; }
189
197
  .ds-slide-col--quote { max-width: 42ch; }
@@ -197,15 +205,17 @@
197
205
  font-size: clamp(var(--fs-h3), 4.5cqw, var(--fs-h1));
198
206
  line-height: var(--lh-snug); color: var(--fg); font-weight: 500; min-width: 0;
199
207
  }
200
- .ds-slide-h1--lead { margin-bottom: 12px; }
208
+ .ds-slide-h1--lead { margin-bottom: var(--space-2-75); }
201
209
  .ds-slide-quote-body {
202
210
  font-size: clamp(var(--fs-lg), 3.5cqw, var(--fs-h2));
203
211
  line-height: var(--lh-snug); color: var(--fg); font-weight: 400; font-style: italic;
204
212
  }
205
213
  .ds-slide-cite { font-family: var(--ff-mono); font-size: var(--fs-sm); color: var(--fg-3); }
206
214
  .ds-slide-bullet {
207
- display: flex; gap: clamp(8px, 2vw, 18px); align-items: baseline;
208
- border-bottom: 1px solid var(--rule); padding: 12px 0; flex-wrap: wrap;
215
+ /* 18px ceiling has no tier (--space-3 is 16, --space-3-5 is 20); it is the
216
+ bullet key/value split tuned against the clamp(56px,18%,100px) key column. */
217
+ display: flex; gap: clamp(var(--space-2), 2vw, 18px); align-items: baseline;
218
+ border-bottom: 1px solid var(--rule); padding: var(--space-2-75) 0; flex-wrap: wrap;
209
219
  }
210
220
  .ds-slide-bullet-key {
211
221
  flex: 0 1 clamp(56px, 18%, 100px); min-width: 0;
@@ -213,7 +223,7 @@
213
223
  color: var(--slide-accent, var(--accent-ink));
214
224
  }
215
225
  .ds-slide-bullet-val { color: var(--fg-2); font-size: var(--fs-lg); min-width: 0; }
216
- .ds-slide-split { display: grid; grid-template-columns: 1fr 1fr; gap: clamp(12px, 3vw, 32px); margin-top: 12px; }
226
+ .ds-slide-split { display: grid; grid-template-columns: 1fr 1fr; gap: clamp(var(--space-2-75), 3vw, var(--space-5)); margin-top: var(--space-2-75); }
217
227
  @media (max-width: 760px) {
218
228
  .ds-slide-split { grid-template-columns: 1fr; }
219
229
  }
@@ -239,7 +249,10 @@
239
249
 
240
250
  /* --- error 404 --------------------------------------------- */
241
251
  .ds-err-hero {
242
- padding: clamp(16px, 5vw, 36px) clamp(12px, 4vw, 22px);
252
+ /* 36px/22px clamp ceilings and the 14px gap are off-scale on purpose: this
253
+ hero is centred around a clamp(56px,20vw,120px) numeral and the insets are
254
+ tuned to it, not to the panel rhythm the --space-* scale encodes. */
255
+ padding: clamp(var(--space-3), 5vw, 36px) clamp(var(--space-2-75), 4vw, 22px);
243
256
  text-align: center; display: flex; flex-direction: column; gap: 14px; align-items: center;
244
257
  }
245
258
  .ds-err-numeral {
@@ -247,25 +260,25 @@
247
260
  line-height: 1; color: var(--panel-text-3); letter-spacing: -0.03em;
248
261
  }
249
262
  .ds-err-path {
250
- display: inline-flex; gap: 6px; align-items: baseline; flex-wrap: wrap; max-width: 100%;
263
+ display: inline-flex; gap: var(--space-1-75); align-items: baseline; flex-wrap: wrap; max-width: 100%;
251
264
  font-family: var(--ff-mono); font-size: 13px; color: var(--panel-text-2);
252
- background: var(--panel-1); padding: 6px 12px; border-radius: var(--r-0);
265
+ background: var(--panel-1); padding: var(--space-1-75) var(--space-2-75); border-radius: var(--r-0);
253
266
  overflow-wrap: anywhere; word-break: break-all;
254
267
  }
255
268
 
256
269
  /* --- gallery ------------------------------------------------ */
257
270
  .ds-tile-grid {
258
- padding: clamp(8px, 2.5vw, 16px);
259
- display: grid; grid-template-columns: repeat(auto-fill, minmax(min(180px, 100%), 1fr)); gap: 8px;
271
+ padding: clamp(var(--space-2), 2.5vw, var(--space-3));
272
+ display: grid; grid-template-columns: repeat(auto-fill, minmax(min(180px, 100%), 1fr)); gap: var(--space-2);
260
273
  }
261
274
  .ds-tile-grid--tight { grid-template-columns: repeat(auto-fill, minmax(min(140px, 100%), 1fr)); }
262
275
  .ds-swatch-grid {
263
- padding: clamp(8px, 2.5vw, 16px);
264
- display: grid; grid-template-columns: repeat(auto-fill, minmax(min(160px, 100%), 1fr)); gap: 12px;
276
+ padding: clamp(var(--space-2), 2.5vw, var(--space-3));
277
+ display: grid; grid-template-columns: repeat(auto-fill, minmax(min(160px, 100%), 1fr)); gap: var(--space-2-75);
265
278
  }
266
279
  .ds-gallery-tile {
267
- cursor: pointer; display: flex; flex-direction: column; gap: 6px;
268
- padding: 12px; border-radius: var(--r-1); min-height: clamp(120px, 18vw, 160px);
280
+ cursor: pointer; display: flex; flex-direction: column; gap: var(--space-1-75);
281
+ padding: var(--space-2-75); border-radius: var(--r-1); min-height: clamp(120px, 18vw, 160px);
269
282
  border: 0; text-align: left; font: inherit; color: inherit;
270
283
  background: var(--tile-tone, var(--panel-1));
271
284
  transition: transform var(--dur-base) var(--ease), box-shadow var(--dur-base) var(--ease);
@@ -279,20 +292,23 @@
279
292
  .ds-lightbox {
280
293
  position: fixed; inset: 0; background: var(--scrim);
281
294
  display: flex; align-items: center; justify-content: center;
282
- padding: clamp(12px, 4vw, 32px);
283
- padding-bottom: max(clamp(12px, 4vw, 32px), env(safe-area-inset-bottom));
295
+ padding: clamp(var(--space-2-75), 4vw, var(--space-5));
296
+ padding-bottom: max(clamp(var(--space-2-75), 4vw, var(--space-5)), env(safe-area-inset-bottom));
284
297
  z-index: var(--z-modal);
285
298
  }
286
299
  .ds-lightbox-card {
287
- background: var(--panel-0); border-radius: var(--r-2); padding: clamp(16px, 4vw, 28px);
300
+ /* 28px ceiling has no tier (--space-4 is 24, --space-5 is 32); it is the
301
+ lightbox card inset tuned against the min(520px,100%) card width. */
302
+ background: var(--panel-0); border-radius: var(--r-2); padding: clamp(var(--space-3), 4vw, 28px);
288
303
  width: min(520px, 100%); min-width: 0;
289
304
  max-height: calc(100vh - 24px);
290
305
  max-height: calc(100dvh - 24px);
291
306
  overflow: auto;
292
- display: flex; flex-direction: column; gap: 14px;
307
+ display: flex; flex-direction: column; gap: 14px; /* off-scale, matches the card inset above */
293
308
  }
294
309
  .ds-lightbox-preview {
295
- padding: clamp(16px, 6vw, 36px); border-radius: var(--r-1); text-align: center;
310
+ /* 36px ceiling has no tier (--space-5 is 32, --space-6 is 48). */
311
+ padding: clamp(var(--space-3), 6vw, 36px); border-radius: var(--r-1); text-align: center;
296
312
  font-family: var(--ff-mono); white-space: pre-line; font-size: clamp(16px, 5vw, 24px);
297
313
  background: var(--tile-tone, var(--panel-1));
298
314
  }
@@ -302,25 +318,31 @@
302
318
  @media (max-width: 480px) {
303
319
  .ds-topbar-search { flex-basis: 100%; }
304
320
  }
305
- .ds-empty-state { padding: clamp(16px, 5vw, 24px); text-align: center; color: var(--panel-text-3); }
321
+ .ds-empty-state { padding: clamp(var(--space-3), 5vw, var(--space-4)); text-align: center; color: var(--panel-text-3); }
306
322
  .ds-empty-state-glyph { font-size: clamp(24px, 6vw, 32px); }
307
- .ds-empty-state-msg { margin: 6px 0; }
323
+ .ds-empty-state-msg { margin: var(--space-1-75) 0; }
308
324
  .ds-empty-state-hint { margin: 0; font-size: var(--fs-sm); }
309
325
 
310
326
  /* --- system primer ------------------------------------------ */
327
+ /* The three primer panels below share one fluid inset,
328
+ clamp(10px, 2.5vw, 14px) clamp(10px, 3vw, 18px), and a 14/18px gap. None of
329
+ 10/14/18 is a --space-* tier (the scale jumps 8 -> 10 -> 12 -> 16 -> 20) and
330
+ the three values are tuned as a set against the 64px label columns, so the
331
+ panels stay optically identical to each other. Snapping any one of them
332
+ desyncs the family; they are deliberate literals, not un-migrated drift. */
311
333
  .ds-swatch-grid-sm {
312
334
  display: grid; grid-template-columns: repeat(auto-fill, minmax(min(110px, 100%), 1fr));
313
- gap: 12px; padding: clamp(10px, 2.5vw, 14px) clamp(10px, 3vw, 18px);
335
+ gap: var(--space-2-75); padding: clamp(10px, 2.5vw, 14px) clamp(10px, 3vw, 18px);
314
336
  }
315
337
  .ds-swatch-grid-lg { grid-template-columns: repeat(auto-fill, minmax(min(150px, 100%), 1fr)); }
316
- .ds-swatch-col { display: flex; flex-direction: column; gap: 6px; }
338
+ .ds-swatch-col { display: flex; flex-direction: column; gap: var(--space-1-75); }
317
339
  .ds-swatch-chip { height: 48px; border-radius: var(--r-1); border: 1px solid var(--rule); background: var(--swatch, var(--panel-1)); }
318
340
  .ds-swatch-chip--big { height: 64px; }
319
341
  .ds-swatch-name { font-family: var(--ff-mono); font-size: 11px; color: var(--fg-3); }
320
342
  .ds-type-panel { padding: clamp(10px, 2.5vw, 14px) clamp(10px, 3vw, 18px); display: flex; flex-direction: column; gap: 14px; }
321
343
  .ds-type-row {
322
344
  display: flex; align-items: baseline; gap: 14px;
323
- border-bottom: 1px solid var(--rule); padding-bottom: 8px; flex-wrap: wrap;
345
+ border-bottom: 1px solid var(--rule); padding-bottom: var(--space-2); flex-wrap: wrap;
324
346
  }
325
347
  .ds-type-row-label { flex: 0 0 64px; font-family: var(--ff-mono); font-size: 11px; color: var(--fg-3); }
326
348
  .ds-type-sample {
@@ -328,7 +350,7 @@
328
350
  font-size: var(--sample-size, var(--fs-body));
329
351
  }
330
352
  .ds-prim-panel { padding: clamp(10px, 2.5vw, 14px) clamp(10px, 3vw, 18px); display: flex; flex-direction: column; gap: 18px; }
331
- .ds-prim-row { display: flex; gap: 10px; flex-wrap: wrap; align-items: center; }
353
+ .ds-prim-row { display: flex; gap: var(--space-2-5); flex-wrap: wrap; align-items: center; }
332
354
  .ds-prim-label { flex: 0 0 64px; font-family: var(--ff-mono); font-size: 11px; color: var(--fg-3); }
333
355
 
334
356
  /* == appended: content-site == */
@@ -384,7 +406,7 @@
384
406
  matching the "color reserved for meaning, not decoration" pattern seen in
385
407
  docstudio's admin table. */
386
408
  .ds-table-sort-btn {
387
- display: inline-flex; align-items: center; gap: 4px;
409
+ display: inline-flex; align-items: center; gap: var(--space-1);
388
410
  background: none; border: none; padding: 0; margin: 0;
389
411
  font: inherit; font-weight: inherit; color: inherit; cursor: pointer;
390
412
  }
@@ -457,55 +479,56 @@
457
479
  /* == appended: signin kit cleanup == */
458
480
  /* -- signin kit (ui_kits/signin) -- */
459
481
  .ds-auth-wrap { padding: var(--space-2, 8px); display: flex; flex-direction: column; align-items: center; }
460
- .ds-auth-col { width: 100%; max-width: 440px; display: flex; flex-direction: column; gap: 8px; margin: clamp(12px, 4vw, 24px) 0; min-width: 0; }
461
- .ds-auth-form { padding: clamp(12px, 3vw, 18px); display: flex; flex-direction: column; gap: 10px; }
482
+ .ds-auth-col { width: 100%; max-width: 440px; display: flex; flex-direction: column; gap: var(--space-2); margin: clamp(var(--space-2-75), 4vw, var(--space-4)) 0; min-width: 0; }
483
+ /* 18px ceiling: no tier between --space-3 (16) and --space-3-5 (20). */
484
+ .ds-auth-form { padding: clamp(var(--space-2-75), 3vw, 18px); display: flex; flex-direction: column; gap: var(--space-2-5); }
462
485
  .ds-auth-sent { align-items: center; text-align: center; }
463
486
  .ds-auth-sent-glyph { font-size: 32px; color: var(--panel-accent); }
464
487
  .ds-auth-sent-title { margin: 0; font-weight: 600; }
465
488
  .ds-auth-sent-sub { margin: 0; color: var(--panel-text-2); overflow-wrap: anywhere; }
466
- .ds-auth-field { display: flex; flex-direction: column; gap: 4px; }
489
+ .ds-auth-field { display: flex; flex-direction: column; gap: var(--space-1); }
467
490
  /* .ds-auth-field-label joins the kit small-label voice above, no overrides. */
468
- .ds-auth-row-between { display: flex; align-items: center; justify-content: space-between; gap: 8px; flex-wrap: wrap; }
469
- .ds-auth-remember { display: flex; align-items: center; gap: 6px; cursor: pointer; }
491
+ .ds-auth-row-between { display: flex; align-items: center; justify-content: space-between; gap: var(--space-2); flex-wrap: wrap; }
492
+ .ds-auth-remember { display: flex; align-items: center; gap: var(--space-1-75); cursor: pointer; }
470
493
  .ds-auth-remember-text { color: var(--panel-text-2); font-size: 13px; }
471
494
  .ds-auth-forgot { font-size: 13px; }
472
- .ds-auth-error { padding: 8px 10px; background: var(--panel-1); border-radius: var(--r-0); color: var(--danger); font-size: 13px; overflow-wrap: anywhere; }
473
- .ds-auth-providers { display: flex; gap: 8px; flex-wrap: wrap; }
474
- .ds-auth-provider-btn { flex: 1 1 100px; min-width: 0; display: flex; align-items: center; justify-content: center; gap: 8px; padding: 10px; }
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; }
496
+ .ds-auth-providers { display: flex; gap: var(--space-2); flex-wrap: wrap; }
497
+ .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); }
475
498
  .ds-auth-provider-btn--loading { opacity: 0.7; pointer-events: none; }
476
499
  .ds-auth-provider-glyph { font-family: var(--ff-mono); color: var(--panel-text-3); display: inline-flex; }
477
- .ds-auth-modes { display: flex; justify-content: center; gap: 14px; margin-top: 8px; font-size: 13px; flex-wrap: wrap; }
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; }
478
501
  .ds-auth-mode-link { color: var(--panel-text-3); text-decoration: none; }
479
502
  .ds-auth-mode-link--active { color: var(--panel-text); text-decoration: underline; }
480
- .ds-auth-fineprint { text-align: center; font-size: 12px; color: var(--panel-text-3); margin: 6px 0; }
503
+ .ds-auth-fineprint { text-align: center; font-size: 12px; color: var(--panel-text-3); margin: var(--space-1-75) 0; }
481
504
 
482
505
  /* == appended: gallery-misc kit cleanup == */
483
506
  /* --- shared helpers (converted from inline styles) --- */
484
507
  .ds-m0 { margin: 0; }
485
508
  .ds-text-2 { color: var(--panel-text-2); }
486
509
  .ds-text-3 { color: var(--panel-text-3); }
487
- .ds-kit-head { display: flex; align-items: center; justify-content: space-between; gap: clamp(8px, 2vw, 16px); flex-wrap: wrap; }
510
+ .ds-kit-head { display: flex; align-items: center; justify-content: space-between; gap: clamp(var(--space-2), 2vw, var(--space-3)); flex-wrap: wrap; }
488
511
 
489
512
  /* --- gallery kit --- */
490
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; }
491
- .ds-tile-meta { display: flex; align-items: center; justify-content: space-between; gap: 6px; font-size: 12px; flex-wrap: wrap; min-width: 0; }
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; }
492
515
  .ds-tile-glyph { font-family: var(--ff-mono); color: var(--panel-text-3); }
493
516
  .ds-tile-label { color: var(--panel-text); overflow-wrap: anywhere; }
494
517
  .ds-gal-swatch { height: 64px; border-radius: var(--r-0); background: var(--swatch, var(--panel-1)); }
495
- .ds-gal-swatch-meta { display: flex; justify-content: space-between; gap: 6px; flex-wrap: wrap; font-family: var(--ff-mono); font-size: 11px; min-width: 0; }
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; }
496
519
  .ds-gal-swatch-name { color: var(--panel-text); }
497
520
  .ds-gal-swatch-hint { color: var(--panel-text-3); overflow-wrap: anywhere; }
498
- .ds-lightbox-head { display: flex; justify-content: space-between; align-items: center; gap: 8px; flex-wrap: wrap; }
521
+ .ds-lightbox-head { display: flex; justify-content: space-between; align-items: center; gap: var(--space-2); flex-wrap: wrap; }
499
522
  /* .ds-lightbox-tag joins the kit small-label voice above, no overrides. */
500
523
 
501
524
  /* --- error_404 kit --- */
502
- .ds-err-actions { display: flex; gap: 8px; flex-wrap: wrap; justify-content: center; margin-top: 6px; }
503
- .ds-err-chips { display: flex; gap: 6px; flex-wrap: wrap; justify-content: center; margin-top: 4px; }
525
+ .ds-err-actions { display: flex; gap: var(--space-2); flex-wrap: wrap; justify-content: center; margin-top: var(--space-1-75); }
526
+ .ds-err-chips { display: flex; gap: var(--space-1-75); flex-wrap: wrap; justify-content: center; margin-top: var(--space-1); }
504
527
 
505
528
  /* == appended: terminal-capp kit cleanup == */
506
529
  /* --- terminal kit ------------------------------------------ */
507
- .ds-section-pad-sm { padding: 8px; }
508
- .ds-kit-head-row { display: flex; align-items: center; justify-content: space-between; gap: 16px; flex-wrap: wrap; }
530
+ .ds-section-pad-sm { padding: var(--space-2); }
531
+ .ds-kit-head-row { display: flex; align-items: center; justify-content: space-between; gap: var(--space-3); flex-wrap: wrap; }
509
532
  .ds-cli-cmt .cmd { color: var(--fg-3); }
510
533
  .ds-cli-out .cmd { color: var(--fg-2); }
511
534
  .ds-cli-ok .prompt, .ds-cli-ok .cmd { color: var(--accent-ink); }
@@ -14,7 +14,7 @@
14
14
  brand and let it scroll horizontally. The brand stays on the first row;
15
15
  nav wraps to a second row at 100% width (flex-wrap on .app-topbar). */
16
16
  .app-topbar {
17
- gap: var(--space-2); padding: 12px var(--space-3);
17
+ gap: var(--space-2); padding: var(--space-2-75) var(--space-3);
18
18
  }
19
19
  /* When the topbar is folded into .app-chrome it is a flex:0 0 auto child, so
20
20
  it sizes to its nav's content and overflows the viewport instead of letting
@@ -23,7 +23,7 @@
23
23
  .app-chrome > .app-topbar { max-width: 100%; min-width: 0; flex-basis: 100%; }
24
24
  .app-topbar > nav {
25
25
  flex: 1 1 100%; margin-left: 0; order: 3; min-width: 0; max-width: 100%;
26
- display: flex; gap: 2px; flex-wrap: nowrap;
26
+ display: flex; gap: var(--space-hair); flex-wrap: nowrap;
27
27
  overflow-x: auto; scrollbar-width: none; -webkit-overflow-scrolling: touch;
28
28
  /* Fade the trailing edge so a clipped last item (e.g. "source ->" cut to
29
29
  "sour") reads as scrollable content, not a broken/truncated label. */
@@ -32,7 +32,7 @@
32
32
  }
33
33
  .app-topbar nav::-webkit-scrollbar { display: none; }
34
34
  .app-topbar nav a {
35
- flex: 0 0 auto; padding: 10px 12px; min-height: 44px; white-space: nowrap;
35
+ flex: 0 0 auto; padding: var(--space-2-5) var(--space-2-75); min-height: 44px; white-space: nowrap;
36
36
  }
37
37
  .brand { font-size: var(--fs-tiny); font-weight: 600; }
38
38
 
@@ -55,8 +55,8 @@
55
55
 
56
56
  .row {
57
57
  grid-template-columns: minmax(0, 1fr) auto !important;
58
- gap: var(--space-2); padding: 12px 16px;
59
- row-gap: 4px !important;
58
+ gap: var(--space-2); padding: var(--space-2-75) var(--space-3);
59
+ row-gap: var(--space-1) !important;
60
60
  }
61
61
  .row .sub { grid-column: 1 / -1; order: 3; }
62
62
  .row .title { font-size: var(--fs-sm); }
@@ -67,7 +67,10 @@
67
67
 
68
68
  /* Buttons */
69
69
  .btn, .btn-primary, .btn-ghost {
70
- padding: 11px 16px; font-size: var(--fs-tiny);
70
+ /* 11px vertical is optical, not scale drift: --space-2-75 (12) would tip
71
+ the intrinsic box past the 44px min-height floor below and make the
72
+ floor dead, changing the mobile button rhythm. */
73
+ padding: 11px var(--space-3); font-size: var(--fs-tiny);
71
74
  min-height: 44px; /* Touch target minimum */
72
75
  }
73
76
 
@@ -75,13 +78,13 @@
75
78
  .ds-file-grid {
76
79
  display: flex;
77
80
  flex-direction: column;
78
- gap: 3px;
81
+ gap: var(--space-half);
79
82
  }
80
83
  .ds-file-row {
81
- gap: 8px; padding: 10px 12px;
84
+ gap: var(--space-2); padding: var(--space-2-5) var(--space-2-75);
82
85
  font-size: var(--fs-xs);
83
86
  }
84
- .ds-file-open { gap: 10px; }
87
+ .ds-file-open { gap: var(--space-2-5); }
85
88
  /* At mobile row widths, a fixed-size meta column (date/size) plus the
86
89
  always-visible action buttons leave the flexible title only a few px —
87
90
  not enough for even one legible character before the two collide. Drop
@@ -98,12 +101,12 @@
98
101
  /* Chat */
99
102
  .chat-stack { max-width: 100%; min-width: 0; }
100
103
  .chat-bubble {
101
- padding: 10px 12px; font-size: var(--fs-sm);
104
+ padding: var(--space-2-5) var(--space-2-75); font-size: var(--fs-sm);
102
105
  }
103
106
  .chat-avatar { width: 28px; height: 28px; font-size: 11px; }
104
- .chat-msg:hover { padding: 4px 0; margin: 0; background: transparent; }
105
- .chat-composer { padding: 8px; gap: 6px; }
106
- .chat-composer textarea { padding: 10px 12px; font-size: var(--fs-sm); }
107
+ .chat-msg:hover { padding: var(--space-1) 0; margin: 0; background: transparent; }
108
+ .chat-composer { padding: var(--space-2); gap: var(--space-1-75); }
109
+ .chat-composer textarea { padding: var(--space-2-5) var(--space-2-75); font-size: var(--fs-sm); }
107
110
 
108
111
  /* KPI Cards */
109
112
  .kpi {
@@ -119,9 +122,11 @@
119
122
  .empty { padding: var(--space-5); font-size: var(--fs-xs); }
120
123
 
121
124
  /* Form */
122
- .row-form { gap: 10px; padding: var(--space-3); }
125
+ .row-form { gap: var(--space-2-5); padding: var(--space-3); }
123
126
  .row-form input,
124
- .row-form textarea { padding: 11px 12px; font-size: var(--fs-sm); }
127
+ /* 11px block is the tuned inset that lines the textarea baseline up with the
128
+ sibling input; --space-2-75 (12) would offset the two by 1px each side. */
129
+ .row-form textarea { padding: 11px var(--space-2-75); font-size: var(--fs-sm); }
125
130
 
126
131
  /* Hero Section — keep fluid base font-size, just unconstrain width on mobile. */
127
132
  .ds-hero { padding: var(--space-6) 0 var(--space-5); }
@@ -131,14 +136,14 @@
131
136
  /* Table Responsiveness */
132
137
  table { font-size: var(--fs-xs); }
133
138
  table th,
134
- table td { padding: 10px 12px; }
139
+ table td { padding: var(--space-2-5) var(--space-2-75); }
135
140
 
136
141
  /* CLI Block */
137
142
  .cli {
138
- flex-direction: column; align-items: flex-start; gap: 10px;
139
- padding: 16px 12px; font-size: var(--fs-xs);
143
+ flex-direction: column; align-items: flex-start; gap: var(--space-2-5);
144
+ padding: var(--space-3) var(--space-2-75); font-size: var(--fs-xs);
140
145
  }
141
- .cli .copy { padding: 6px 12px; font-size: var(--fs-micro); }
146
+ .cli .copy { padding: var(--space-1-75) var(--space-2-75); font-size: var(--fs-micro); }
142
147
  }
143
148
 
144
149
  /* --------------------------------------------------------------------
@@ -147,8 +152,8 @@
147
152
  @container (max-width: 760px) {
148
153
  .app-body { grid-template-columns: 1fr !important; }
149
154
  .app-side-shell { border-right: 0; border-bottom: 1px solid var(--rule); }
150
- .app-topbar nav { font-size: var(--fs-xs); gap: 14px; }
151
- .row { grid-template-columns: minmax(0, 1fr) auto !important; row-gap: 4px !important; }
155
+ .app-topbar nav { font-size: var(--fs-xs); gap: var(--space-2-75); }
156
+ .row { grid-template-columns: minmax(0, 1fr) auto !important; row-gap: var(--space-1) !important; }
152
157
  .row .sub { grid-column: 1 / -1; order: 3; }
153
158
  .ds-changelog-row { grid-template-columns: minmax(70px, 10ch) minmax(0, 1fr) !important; }
154
159
  .ds-changelog-row .title { grid-column: 1 / -1; }
@@ -160,7 +165,7 @@
160
165
  @media (min-width: 481px) and (max-width: 1024px) {
161
166
  /* App Layout — side handled by 900px drawer block; restore for 901-1024 */
162
167
  .app-side a {
163
- padding: 12px 12px; gap: 8px;
168
+ padding: var(--space-2-75) var(--space-2-75); gap: var(--space-2);
164
169
  grid-template-columns: 16px 1fr auto;
165
170
  font-size: var(--fs-xs);
166
171
  min-height: 44px;
@@ -168,14 +173,14 @@
168
173
 
169
174
  /* Topbar Navigation (flex container — no grid-template here) */
170
175
  .app-topbar {
171
- gap: var(--space-3); padding: 12px var(--space-4);
176
+ gap: var(--space-3); padding: var(--space-2-75) var(--space-4);
172
177
  }
173
178
  .app-topbar nav {
174
- display: flex; gap: 8px; font-size: var(--fs-xs);
179
+ display: flex; gap: var(--space-2); font-size: var(--fs-xs);
175
180
  flex-wrap: wrap;
176
181
  }
177
182
  .app-topbar nav a {
178
- padding: 12px 12px; font-size: var(--fs-xs);
183
+ padding: var(--space-2-75) var(--space-2-75); font-size: var(--fs-xs);
179
184
  min-height: 44px;
180
185
  }
181
186
  .brand { font-size: var(--fs-sm); }
@@ -184,7 +189,10 @@
184
189
  .app-search {
185
190
  display: inline-flex;
186
191
  max-width: 280px; font-size: var(--fs-xs);
187
- padding: 8px 14px;
192
+ /* 14px inline is between --space-2-75 (12) and --space-3 (16) with no tier;
193
+ it is the width that centers the search glyph against the 280px max-width
194
+ field. Snapping either way reads as a mis-centered control. */
195
+ padding: var(--space-2) 14px;
188
196
  }
189
197
 
190
198
  /* Main Content */
@@ -196,12 +204,17 @@
196
204
  /* File list — single column rows on tablet (cards only via data-columns) */
197
205
  .ds-file-row {
198
206
  grid-template-columns: 24px minmax(0, 1fr) auto auto;
199
- gap: 12px; padding: 12px 14px;
207
+ /* 14px inline (no tier between 12 and 16) is the tablet row inset that
208
+ keeps the 24px icon column optically flush with the panel edge. */
209
+ gap: var(--space-2-75); padding: var(--space-2-75) 14px;
200
210
  }
201
211
 
202
212
  /* Chat Bubbles */
203
213
  .chat-stack { max-width: min(75%, 420px); }
204
214
  .chat-bubble {
215
+ /* 11px/14px are the tuned tablet bubble insets; neither is on the scale
216
+ (11 sits between --space-2-5 and --space-2-75, 14 between --space-2-75
217
+ and --space-3) and snapping visibly re-pitches every bubble in a thread. */
205
218
  padding: 11px 14px; font-size: var(--fs-sm);
206
219
  }
207
220
  .chat-avatar { width: 32px; height: 32px; font-size: 12px; }
@@ -214,7 +227,10 @@
214
227
 
215
228
  /* Buttons */
216
229
  .btn, .btn-primary, .btn-ghost {
217
- padding: 12px 18px; font-size: var(--fs-sm);
230
+ /* 18px inline has no tier (--space-3 is 16, --space-3-5 is 20); it is the
231
+ tablet CTA width tuned against the 12px vertical, so snapping changes
232
+ the button aspect on the most visible control in the kit. */
233
+ padding: var(--space-2-75) 18px; font-size: var(--fs-sm);
218
234
  }
219
235
 
220
236
  /* Panel - keep the head on the body's left axis at laptop widths too. */
@@ -228,7 +244,9 @@
228
244
  /* Row */
229
245
  .row {
230
246
  grid-template-columns: minmax(90px, 12ch) minmax(0, 1fr) auto;
231
- gap: var(--space-2); padding: 14px 16px;
247
+ /* 14px block (no tier between 12 and 16) is the tablet row height tuned
248
+ against the 12ch code column; snapping re-pitches the whole list. */
249
+ gap: var(--space-2); padding: 14px var(--space-3);
232
250
  }
233
251
  }
234
252
 
@@ -59,7 +59,7 @@
59
59
  .fd-chat-config .fd-chat-field { display: flex; flex-direction: column; gap: var(--space-1, 4px); min-width: 120px; }
60
60
  .fd-chat-config .fd-chat-field > label { font-family: var(--os-mono, monospace); font-size: 10px; opacity: 0.6; letter-spacing: 0.05em; text-transform: uppercase; }
61
61
  .fd-chat-config .fd-chat-field > input,
62
- .fd-chat-config .fd-chat-field > select { width: 100%; box-sizing: border-box; padding: 6px 8px; background: var(--panel-1, transparent); color: var(--fg, inherit); border: 1px solid color-mix(in oklab, var(--fg) 14%, transparent); border-radius: var(--r-0); font: inherit; font-size: 12px; }
62
+ .fd-chat-config .fd-chat-field > select { width: 100%; box-sizing: border-box; padding: var(--space-1-75) var(--space-2); background: var(--panel-1, transparent); color: var(--fg, inherit); border: 1px solid color-mix(in oklab, var(--fg) 14%, transparent); border-radius: var(--r-0); font: inherit; font-size: 12px; }
63
63
  .fd-chat-config .fd-chat-field > input:focus-visible,
64
64
  .fd-chat-config .fd-chat-field > select:focus-visible { outline: 2px solid var(--os-accent, #247420); outline-offset: 0; border-color: color-mix(in oklab, var(--os-accent, #247420) 60%, transparent); }
65
65
  .fd-chat-config .fd-chat-row { display: flex; gap: var(--space-2, 8px); flex-wrap: wrap; }
@@ -68,5 +68,5 @@
68
68
  .app-fd ds-chat.fd-dashboard-chat { flex: 1 1 auto; min-height: 280px; display: flex; flex-direction: column; overflow: hidden; }
69
69
 
70
70
  .fd-chat-actions { display: inline-flex; gap: var(--space-1, 4px); align-items: center; }
71
- .fd-chat-actions .btn-secondary { background: transparent; color: var(--danger, #c0392b); border: 1px solid color-mix(in oklab, var(--danger, #c0392b) 40%, transparent); cursor: pointer; padding: 2px 8px; border-radius: var(--r-0); font: inherit; font-size: 12px; }
71
+ .fd-chat-actions .btn-secondary { background: transparent; color: var(--danger, #c0392b); border: 1px solid color-mix(in oklab, var(--danger, #c0392b) 40%, transparent); cursor: pointer; padding: var(--space-hair) var(--space-2); border-radius: var(--r-0); font: inherit; font-size: 12px; }
72
72
  .fd-chat-actions .btn-secondary:hover { background: color-mix(in oklab, var(--danger, #c0392b) 10%, transparent); }