anentrypoint-design 0.0.379 → 0.0.381

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.
@@ -56,10 +56,10 @@ html, body {
56
56
  -webkit-backdrop-filter: blur(10px);
57
57
  border: none;
58
58
  color: var(--os-fg);
59
- font: 13px var(--os-font);
59
+ font: var(--fs-tiny) var(--os-font);
60
60
  height: var(--os-bar-h);
61
- padding: 0 12px;
62
- gap: 6px;
61
+ padding: 0 var(--space-2-75);
62
+ gap: var(--space-1-75);
63
63
  box-shadow: none;
64
64
  display: flex;
65
65
  align-items: center;
@@ -80,11 +80,11 @@ html, body {
80
80
  font-family: var(--os-display);
81
81
  font-weight: 700;
82
82
  letter-spacing: -0.01em;
83
- font-size: 15px;
83
+ font-size: var(--fs-sm);
84
84
  margin-right: 14px;
85
85
  display: inline-flex;
86
86
  align-items: center;
87
- gap: 8px;
87
+ gap: var(--space-2);
88
88
  text-transform: lowercase;
89
89
  }
90
90
  .os-brand::before {
@@ -103,12 +103,12 @@ html, body {
103
103
  cursor: pointer;
104
104
  font: inherit;
105
105
  font-family: var(--os-font);
106
- font-size: 13px;
106
+ font-size: var(--fs-tiny);
107
107
  border-radius: var(--r-pill, 999px);
108
108
  transition: background 80ms ease, color 80ms ease;
109
109
  display: inline-flex;
110
110
  align-items: center;
111
- gap: 6px;
111
+ gap: var(--space-1-75);
112
112
  outline: none;
113
113
  text-transform: lowercase;
114
114
  }
@@ -127,10 +127,10 @@ html, body {
127
127
  min-width: 220px;
128
128
  top: calc(var(--os-bar-h) + var(--space-1, 4px));
129
129
  left: var(--space-2, 8px);
130
- z-index: 9500;
130
+ z-index: var(--z-dropdown);
131
131
  display: none;
132
132
  flex-direction: column;
133
- gap: 2px;
133
+ gap: var(--space-hair);
134
134
  pointer-events: auto;
135
135
  /* Long app registries must scroll, not extend past the viewport. */
136
136
  max-height: calc(100vh - var(--os-bar-h) - 16px);
@@ -143,7 +143,7 @@ html, body {
143
143
  width: 100%;
144
144
  text-align: left;
145
145
  border-radius: var(--os-radius-sm);
146
- padding: 8px 10px;
146
+ padding: var(--space-2) var(--space-2-5);
147
147
  color: var(--os-fg);
148
148
  justify-content: flex-start;
149
149
  }
@@ -153,8 +153,8 @@ html, body {
153
153
  * builds the group structurally and toggles only the list's display; the static
154
154
  * layout (column flow + indent + arrow alignment) lives here so no visual rule
155
155
  * leaks back into thebird JS (zero-design-CSS contract). */
156
- .os-menu-group { display: flex; flex-direction: column; gap: 2px; }
157
- .os-menu-system-toggle { display: flex; align-items: center; gap: 6px; }
156
+ .os-menu-group { display: flex; flex-direction: column; gap: var(--space-hair); }
157
+ .os-menu-system-toggle { display: flex; align-items: center; gap: var(--space-1-75); }
158
158
  .os-menu-system-arrow { display: inline-flex; align-items: center; transition: transform 120ms ease; }
159
159
  .os-menu-system-arrow .ds-icon { width: 14px; height: 14px; }
160
160
  .os-menu-system-list { display: none; flex-direction: column; padding-left: 14px; }
@@ -165,8 +165,8 @@ html, body {
165
165
  color: var(--os-fg-2);
166
166
  font-variant-numeric: tabular-nums;
167
167
  font-family: var(--os-mono);
168
- padding: 0 10px;
169
- font-size: 12px;
168
+ padding: 0 var(--space-2-5);
169
+ font-size: var(--fs-micro);
170
170
  }
171
171
 
172
172
  .os-task {
@@ -174,8 +174,8 @@ html, body {
174
174
  background: var(--os-bg-1);
175
175
  color: var(--os-fg-2);
176
176
  border-radius: var(--r-pill, 999px);
177
- padding: 6px 14px;
178
- font-size: 12px;
177
+ padding: var(--space-1-75) 14px;
178
+ font-size: var(--fs-micro);
179
179
  font-family: var(--os-font);
180
180
  transition: background 80ms ease, color 80ms ease, box-shadow 80ms ease;
181
181
  max-width: 200px;
@@ -189,7 +189,7 @@ html, body {
189
189
  .os-task { min-height: 28px; }
190
190
  .os-task:hover { background: var(--panel-hover, var(--os-bg-2)); color: var(--os-fg); }
191
191
  /* Empty taskbar reads as an intentional strip, not a stray blurred bar. */
192
- .os-task-empty { font-size: 11px; color: var(--os-fg-3); padding: 0 10px; font-family: var(--os-font); }
192
+ .os-task-empty { font-size: var(--fs-nano); color: var(--os-fg-3); padding: 0 var(--space-2-5); font-family: var(--os-font); }
193
193
  .os-task.focused {
194
194
  background: var(--panel-select, var(--os-accent-soft));
195
195
  color: var(--os-fg);
@@ -197,55 +197,63 @@ html, body {
197
197
  box-shadow: inset 4px 0 0 var(--os-accent);
198
198
  }
199
199
 
200
- .wm-win {
201
- background: var(--os-bg-1) !important;
202
- border: none !important;
203
- border-radius: var(--r-3, 18px) !important;
204
- box-shadow: none !important;
200
+ /* Window-chrome overrides of wm.css.
201
+ *
202
+ * wm.css is loaded by the consumer as a SEPARATE raw sheet (it is not part of
203
+ * the dist bundle), so its load order relative to this file is not guaranteed.
204
+ * These rules therefore carry the `.ds-247420` scope class: at (0,2,0) they
205
+ * beat wm.css's bare (0,1,0) `.wm-*` rules on SPECIFICITY, which is order-
206
+ * independent — replacing the `!important` wall that previously did the same
207
+ * job by force. Do not un-scope these; the scope IS the override mechanism. */
208
+ .ds-247420 .wm-win {
209
+ background: var(--os-bg-1);
210
+ border: none;
211
+ border-radius: var(--r-3);
212
+ box-shadow: none;
205
213
  overflow: hidden;
206
214
  }
207
- .wm-win.wm-focused {
208
- border: none !important;
209
- box-shadow: inset 4px 0 0 var(--os-accent) !important;
215
+ .ds-247420 .wm-win.wm-focused {
216
+ border: none;
217
+ box-shadow: inset var(--space-1) 0 0 var(--os-accent);
210
218
  }
211
219
 
212
- .wm-bar {
213
- background: var(--os-bg-2) !important;
214
- border: none !important;
215
- padding: 8px 12px !important;
216
- gap: 10px !important;
220
+ .ds-247420 .wm-bar {
221
+ background: var(--os-bg-2);
222
+ border: none;
223
+ padding: var(--space-2) var(--space-2-75);
224
+ gap: var(--space-2-5);
217
225
  }
218
- .wm-title {
219
- font: 13px var(--os-font) !important;
220
- color: var(--os-fg-2) !important;
226
+ .ds-247420 .wm-title {
227
+ font: var(--fs-tiny) var(--os-font);
228
+ color: var(--os-fg-2);
221
229
  letter-spacing: 0.005em;
222
230
  text-align: center;
223
231
  font-weight: 600;
224
232
  text-transform: lowercase;
225
233
  }
226
- .wm-btns { gap: 6px !important; order: -1; }
227
- .wm-btn {
228
- width: 22px !important;
229
- height: 22px !important;
230
- border-radius: var(--r-1, 6px) !important;
231
- border: none !important;
232
- background: var(--os-bg-3) !important;
233
- color: var(--os-fg-2) !important;
234
- padding: 0 !important;
234
+ .ds-247420 .wm-btns { gap: var(--space-1-75); order: -1; }
235
+ .ds-247420 .wm-btn {
236
+ width: 22px;
237
+ height: 22px;
238
+ border-radius: var(--r-1);
239
+ border: none;
240
+ background: var(--os-bg-3);
241
+ color: var(--os-fg-2);
242
+ padding: 0;
235
243
  cursor: pointer;
236
- font: 600 12px var(--os-mono) !important;
237
- line-height: 1 !important;
238
- display: inline-flex !important;
244
+ font: 600 var(--fs-micro) var(--os-mono);
245
+ line-height: 1;
246
+ display: inline-flex;
239
247
  align-items: center;
240
248
  justify-content: center;
241
249
  transition: background 100ms ease, color 100ms ease;
242
250
  }
243
- .wm-btn:hover { background: var(--panel-hover, var(--os-bg-2)) !important; color: var(--os-fg) !important; }
251
+ .ds-247420 .wm-btn:hover { background: var(--panel-hover, var(--os-bg-2)); color: var(--os-fg); }
244
252
 
245
- .wm-resize {
246
- background: transparent !important;
247
- width: 14px !important;
248
- height: 14px !important;
253
+ .ds-247420 .wm-resize {
254
+ background: transparent;
255
+ width: 14px;
256
+ height: 14px;
249
257
  color: var(--os-fg-3);
250
258
  opacity: 0.4;
251
259
  }
@@ -261,7 +269,7 @@ html, body {
261
269
  linear-gradient(135deg, transparent 0 45%, currentColor 45% 55%, transparent 55% 100%),
262
270
  linear-gradient(135deg, transparent 0 70%, currentColor 70% 80%, transparent 80% 100%);
263
271
  }
264
- .wm-body { background: var(--os-bg-1) !important; }
272
+ .ds-247420 .wm-body { background: var(--os-bg-1); }
265
273
 
266
274
  .os-side-rail {
267
275
  position: fixed;
@@ -275,7 +283,7 @@ html, body {
275
283
  align-items: center;
276
284
  padding: var(--space-2, 8px) 0;
277
285
  gap: var(--space-1, 4px);
278
- z-index: 9100;
286
+ z-index: var(--z-dock);
279
287
  pointer-events: auto;
280
288
  }
281
289
  .os-rail-btn {
@@ -299,7 +307,7 @@ html, body {
299
307
  position: fixed;
300
308
  inset: 0;
301
309
  background: var(--os-bg-0);
302
- z-index: 9700;
310
+ z-index: var(--z-modal);
303
311
  pointer-events: auto;
304
312
  display: none;
305
313
  flex-direction: column;
@@ -318,7 +326,7 @@ html, body {
318
326
  box-sizing: border-box;
319
327
  background: var(--os-bg-2);
320
328
  }
321
- .os-drawer-title { color: var(--os-fg); font-family: var(--os-display); font-size: 22px; font-weight: 700; letter-spacing: -0.01em; text-transform: lowercase; }
329
+ .os-drawer-title { color: var(--os-fg); font-family: var(--os-display); font-size: var(--fs-xl); font-weight: 700; letter-spacing: -0.01em; text-transform: lowercase; }
322
330
  .os-drawer-close {
323
331
  width: 44px; height: 44px;
324
332
  border: none; background: transparent;
@@ -349,7 +357,7 @@ html, body {
349
357
  background: var(--os-bg-1);
350
358
  border: none;
351
359
  color: var(--os-fg);
352
- font: 13px var(--os-font);
360
+ font: var(--fs-tiny) var(--os-font);
353
361
  min-height: 100px;
354
362
  cursor: pointer;
355
363
  transition: background 80ms ease;
@@ -364,34 +372,38 @@ html, body {
364
372
  .os-drawer-tile .lbl { color: var(--os-fg); font-weight: 600; }
365
373
 
366
374
  .os-spacer { flex: 1 1 auto; }
367
- .os-tray { display: flex; align-items: center; gap: 6px; }
368
- .os-instances { display: flex; gap: 4px; margin-left: 8px; flex: 0 1 40vw; max-width: 40vw; overflow-x: auto; overflow-y: hidden; scrollbar-width: thin; padding: 0 4px; -webkit-mask-image: linear-gradient(to right, transparent, black 12px, black calc(100% - 12px), transparent); mask-image: linear-gradient(to right, transparent, black 12px, black calc(100% - 12px), transparent); }
375
+ .os-tray { display: flex; align-items: center; gap: var(--space-1-75); }
376
+ .os-instances { display: flex; gap: var(--space-1); margin-left: var(--space-2); flex: 0 1 40vw; max-width: 40vw; overflow-x: auto; overflow-y: hidden; scrollbar-width: thin; padding: 0 var(--space-1); -webkit-mask-image: linear-gradient(to right, transparent, black 12px, black calc(100% - 12px), transparent); mask-image: linear-gradient(to right, transparent, black 12px, black calc(100% - 12px), transparent); }
369
377
  .os-instances::-webkit-scrollbar { height: 4px; }
370
- .os-instances .os-btn { flex: 0 0 auto; min-width: 36px; padding: 2px 8px; font-family: var(--os-mono); font-size: 11px; }
378
+ .os-instances .os-btn { flex: 0 0 auto; min-width: 36px; padding: var(--space-hair) var(--space-2); font-family: var(--os-mono); font-size: var(--fs-nano); }
371
379
  .os-instances .os-btn.active { background: var(--panel-select, var(--os-accent-soft)); color: var(--os-fg); border-color: var(--panel-accent, var(--os-accent)); box-shadow: inset 0 0 0 1px var(--panel-accent, var(--os-accent)); }
372
380
  .os-menubar [data-role="home"] { display: none; }
373
- .os-root { position: fixed; inset: 0; display: flex; flex-direction: column; pointer-events: none; z-index: 9300; }
381
+ .os-root { position: fixed; inset: 0; display: flex; flex-direction: column; pointer-events: none; z-index: calc(var(--z-dock) + 2); }
374
382
  .os-menubar, .os-taskbar { pointer-events: auto; flex: 0 0 auto; }
375
383
  .os-taskbar { margin-top: auto; }
376
- .wm-root { top: var(--os-bar-h) !important; bottom: var(--os-bar-h) !important; inset: var(--os-bar-h) 0 var(--os-bar-h) 0 !important; }
384
+ /* Desktop default: the window layer sits BETWEEN the menubar and taskbar.
385
+ * Scoped (0,2,0) to beat wm.css's bare `.wm-root{inset:0}` by specificity
386
+ * rather than `!important`. The brand "bars overlay" block further below
387
+ * re-asserts inset:0 for .ds-247420 at equal specificity + later source order. */
388
+ .ds-247420 .wm-root { inset: var(--os-bar-h) 0 var(--os-bar-h) 0; }
377
389
 
378
390
  .app-pane { padding: var(--space-3, 16px); font: var(--fs-sm, 14px) var(--os-font); color: var(--os-fg); line-height: var(--lh-base, 1.55); overflow: auto; height: 100%; box-sizing: border-box; background: var(--os-bg-1); }
379
391
  .app-pane h2 { margin: 0 0 var(--space-2, 8px) 0; color: var(--os-fg); font-family: var(--os-display); font-size: var(--fs-xl, 21px); font-weight: 700; letter-spacing: -0.01em; line-height: var(--lh-snug, 1.2); }
380
392
  .app-pane p { margin: 0 0 var(--space-2, 8px) 0; color: var(--os-fg-2); }
381
393
  .app-pane ul { padding-left: var(--space-3, 16px); margin: var(--space-1, 4px) 0 var(--space-3, 16px); color: var(--os-fg-2); }
382
394
  .app-pane li { padding: var(--space-1, 4px) 0; }
383
- .app-pane code { font: var(--fs-tiny, 12px) var(--os-mono); background: var(--os-bg-2); padding: 1px 6px; border-radius: var(--r-1, 6px); color: var(--os-fg); }
395
+ .app-pane code { font: var(--fs-tiny, 12px) var(--os-mono); background: var(--os-bg-2); padding: 1px var(--space-1-75); border-radius: var(--r-1, 6px); color: var(--os-fg); }
384
396
  .app-pane a { color: var(--os-accent); text-decoration: none; }
385
397
  .app-pane a:hover { text-decoration: underline; text-underline-offset: 2px; }
386
398
  .app-pane .meta { color: var(--os-fg-3); font-size: var(--fs-tiny, 12px); }
387
399
  .app-pane.mono { font: var(--fs-tiny, 12px) var(--os-mono); padding: var(--space-2, 8px); background: var(--os-bg-1); }
388
400
  .app-pane.mono[data-component="monitor-app"] { white-space: pre-wrap; line-height: 1.7; }
389
- .app-pane.mono .row { padding: 4px 8px; cursor: pointer; border-radius: var(--r-1, 6px); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
401
+ .app-pane.mono .row { padding: var(--space-1) var(--space-2); cursor: pointer; border-radius: var(--r-1, 6px); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
390
402
  .app-pane.mono .row:hover { background: var(--panel-hover, var(--os-bg-2)); }
391
403
  .app-pane.mono .row.selected { background: var(--panel-select, var(--os-accent-soft)); box-shadow: inset 4px 0 0 var(--os-accent); }
392
- .app-pane.mono .head { color: var(--os-accent); margin-bottom: 8px; padding-bottom: 8px; font-weight: 600; letter-spacing: 0.02em; border-bottom: 1px solid var(--os-bg-3); }
393
- .app-pane.mono pre { background: var(--os-bg-2); padding: 10px 12px; margin: 8px 0 0 0; max-height: 220px; overflow: auto; white-space: pre-wrap; font: 11.5px var(--os-mono); border-radius: var(--r-1, 6px); color: var(--os-fg); border: none; }
394
- .app-shell-pane { margin: 0; padding: 8px; font: 12px var(--os-mono); color: var(--os-fg); background: var(--os-bg-0); height: 100%; overflow: auto; white-space: pre-wrap; box-sizing: border-box; }
404
+ .app-pane.mono .head { color: var(--os-accent); margin-bottom: var(--space-2); padding-bottom: var(--space-2); font-weight: 600; letter-spacing: 0.02em; border-bottom: 1px solid var(--os-bg-3); }
405
+ .app-pane.mono pre { background: var(--os-bg-2); padding: var(--space-2-5) var(--space-2-75); margin: var(--space-2) 0 0 0; max-height: 220px; overflow: auto; white-space: pre-wrap; font: var(--fs-nano) var(--os-mono); border-radius: var(--r-1, 6px); color: var(--os-fg); border: none; }
406
+ .app-shell-pane { margin: 0; padding: var(--space-2); font: var(--fs-micro) var(--os-mono); color: var(--os-fg); background: var(--os-bg-0); height: 100%; overflow: auto; white-space: pre-wrap; box-sizing: border-box; }
395
407
  .app-canvas { width: 100%; height: 100%; background: var(--os-bg-0); display: block; cursor: default; }
396
408
  .app-canvas.x-display { background: #0b0d10; } /* intentional: fake CRT/terminal black screen, not a theme surface */
397
409
  .app-frame { width: 100%; height: 100%; border: 0; background: var(--os-bg-0); }
@@ -405,7 +417,7 @@ html, body {
405
417
  }
406
418
  @media (max-width: 1023px) and (min-width: 768px) {
407
419
  .os-side-rail { display: flex; }
408
- .wm-root { left: calc(var(--os-rail-w) + env(safe-area-inset-left, 0px)) !important; }
420
+ .ds-247420 .wm-root { left: calc(var(--os-rail-w) + env(safe-area-inset-left, 0px)); }
409
421
  .os-menubar { padding-left: calc(var(--os-rail-w) + env(safe-area-inset-left, 0px) + var(--space-2, 8px)); }
410
422
  .os-taskbar { padding-left: calc(var(--os-rail-w) + env(safe-area-inset-left, 0px) + var(--space-2, 8px)); }
411
423
  .os-menubar .os-instances { display: flex; }
@@ -415,17 +427,17 @@ html, body {
415
427
  @media (max-width: 767px) {
416
428
  :root { --os-bar-h: var(--os-bar-h-mobile); }
417
429
  body { overscroll-behavior: none; }
418
- .os-menubar [data-role="home"] { display: inline-flex; min-width: var(--os-tap); min-height: var(--os-tap); padding: 0 12px; }
430
+ .os-menubar [data-role="home"] { display: inline-flex; min-width: var(--os-tap); min-height: var(--os-tap); padding: 0 var(--space-2-75); }
419
431
  .os-menubar [data-role="home"] .ic svg { width: 22px; height: 22px; }
420
- .os-menubar { font-size: 14px; padding: env(safe-area-inset-top, 0) max(8px, env(safe-area-inset-right, 0px)) 0 max(8px, env(safe-area-inset-left, 0px)); height: calc(var(--os-bar-h) + env(safe-area-inset-top, 0)); }
432
+ .os-menubar { font-size: var(--fs-xs); padding: env(safe-area-inset-top, 0) max(8px, env(safe-area-inset-right, 0px)) 0 max(8px, env(safe-area-inset-left, 0px)); height: calc(var(--os-bar-h) + env(safe-area-inset-top, 0)); }
421
433
  .os-menubar [data-role="apps"] { display: none; }
422
- .os-menubar .os-brand { font-size: 13px; margin-right: 6px; }
434
+ .os-menubar .os-brand { font-size: var(--fs-tiny); margin-right: var(--space-1-75); }
423
435
  .os-menubar [data-role="add"] { display: none; }
424
436
  .os-menubar .os-instances { display: none; }
425
437
  .os-clock { display: none; }
426
438
  .os-taskbar {
427
439
  padding: 6px max(8px, env(safe-area-inset-right, 0px)) calc(6px + env(safe-area-inset-bottom, 0)) max(8px, env(safe-area-inset-left, 0px));
428
- gap: 6px;
440
+ gap: var(--space-1-75);
429
441
  overflow-x: auto;
430
442
  overflow-y: hidden;
431
443
  flex-wrap: nowrap;
@@ -439,39 +451,46 @@ html, body {
439
451
  min-width: 120px;
440
452
  min-height: 44px;
441
453
  max-width: none;
442
- padding: 10px 14px;
454
+ padding: var(--space-2-5) 14px;
443
455
  scroll-snap-align: start;
444
- font-size: 13px;
456
+ font-size: var(--fs-tiny);
445
457
  }
446
- .os-task.focused { background: var(--panel-select, var(--os-accent-soft)); box-shadow: inset 4px 0 0 var(--os-accent); }
447
- .os-side-rail { display: none !important; }
448
- .os-menu { left: 8px; right: 8px; min-width: 0; top: calc(var(--os-bar-h) + env(safe-area-inset-top, 0) + 4px); }
449
- .wm-root {
450
- top: calc(var(--os-bar-h) + env(safe-area-inset-top, 0)) !important;
451
- bottom: calc(var(--os-bar-h) + env(safe-area-inset-bottom, 0)) !important;
452
- inset: calc(var(--os-bar-h) + env(safe-area-inset-top, 0)) 0 calc(var(--os-bar-h) + env(safe-area-inset-bottom, 0)) 0 !important;
458
+ .os-task.focused { background: var(--panel-select, var(--os-accent-soft)); box-shadow: inset var(--space-1) 0 0 var(--os-accent); }
459
+ .os-side-rail { display: none; }
460
+ .os-menu { left: var(--space-2); right: var(--space-2); min-width: 0; top: calc(var(--os-bar-h) + env(safe-area-inset-top, 0) + var(--space-1)); }
461
+ .ds-247420 .wm-root {
462
+ inset: calc(var(--os-bar-h) + env(safe-area-inset-top, 0)) 0 calc(var(--os-bar-h) + env(safe-area-inset-bottom, 0)) 0;
453
463
  }
454
- .wm-win {
455
- position: absolute !important;
456
- left: 0 !important; top: 0 !important;
457
- width: 100% !important; height: 100% !important;
458
- border: none !important;
459
- border-radius: 0 !important;
460
- box-shadow: none !important;
464
+ /* LOAD-BEARING !important: wm.css's own mobile block declares
465
+ * `.wm-win{left/top/width/height: ... !important}` (wm.css:157-165). An
466
+ * !important declaration can only be beaten by another !important one, so
467
+ * scoping alone cannot win here — these five must keep the flag. The
468
+ * non-!important properties in this rule do not, and were dropped. */
469
+ .ds-247420 .wm-win {
470
+ position: absolute;
471
+ left: 0 !important;
472
+ top: 0 !important;
473
+ width: 100% !important;
474
+ height: 100% !important;
475
+ border: none;
476
+ /* bare 0, not --r-0 (4px): a full-screen window has square corners.
477
+ * The radius lint intentionally does not flag unitless zero. */
478
+ border-radius: 0;
479
+ box-shadow: none;
461
480
  }
462
- .wm-bar {
463
- padding: 6px 10px !important;
464
- height: 36px !important;
465
- gap: 6px !important;
466
- cursor: default !important;
467
- touch-action: pan-y !important;
481
+ .ds-247420 .wm-bar {
482
+ padding: var(--space-1-75) var(--space-2-5);
483
+ height: 36px;
484
+ gap: var(--space-1-75);
485
+ cursor: default;
486
+ touch-action: pan-y;
468
487
  pointer-events: none;
469
488
  }
470
- .wm-bar .wm-title { pointer-events: auto; font-size: 13px !important; }
471
- .wm-bar .wm-btns { pointer-events: auto; }
472
- .wm-btns .wm-btn:nth-child(1), .wm-btns .wm-btn:nth-child(2) { display: none !important; }
473
- .wm-btns .wm-btn:nth-child(3) { width: 44px !important; height: 44px !important; border-radius: var(--r-1, 6px) !important; background: var(--os-bg-3) !important; color: var(--os-fg) !important; }
474
- .wm-resize, .wm-edge { display: none !important; }
489
+ .ds-247420 .wm-bar .wm-title { pointer-events: auto; font-size: var(--fs-tiny); }
490
+ .ds-247420 .wm-bar .wm-btns { pointer-events: auto; }
491
+ .ds-247420 .wm-btns .wm-btn:nth-child(1), .ds-247420 .wm-btns .wm-btn:nth-child(2) { display: none; }
492
+ .ds-247420 .wm-btns .wm-btn:nth-child(3) { width: 44px; height: 44px; border-radius: var(--r-1); background: var(--os-bg-3); color: var(--os-fg); }
493
+ .ds-247420 .wm-resize, .ds-247420 .wm-edge { display: none; }
475
494
  }
476
495
 
477
496
  /* ---- data-attr theme/accent: deferred to the canonical theme ----
@@ -506,7 +525,12 @@ html, body {
506
525
  * ============================================================ */
507
526
  .ds-247420 {
508
527
  --ff-ui: var(--ff-body);
509
- /* uniform bar height: 22px button + 6px+6px padding = 34px */
528
+ /* uniform bar height: 22px button + 6px+6px padding = 34px.
529
+ * LOAD-BEARING !important: `:root[data-density="compact"|"comfortable"|
530
+ * "spacious"]` (this file, "data-attr theme/accent" block above) redefines
531
+ * --os-bar-h at (0,2,0) — HIGHER than this rule's (0,1,0) — on the same
532
+ * <html> element. Without the flag the density presets silently override
533
+ * the brand's uniform 34px bar geometry. */
510
534
  --os-bar-h: 34px !important;
511
535
  --os-bar-h-mobile: 34px !important;
512
536
  --os-dock-h: 34px !important;
@@ -517,30 +541,47 @@ html, body {
517
541
  * #F5F0E4 variant. Re-assert both here rather than forcing the consumer to
518
542
  * opt into [data-theme="thebird"], which the OS boots past with
519
543
  * data-theme="auto". --accent-bright is pinned too so the ink-mode
520
- * --accent: var(--accent-bright, ...) chain still resolves to brand green. */
544
+ * --accent: var(--accent-bright, ...) chain still resolves to brand green.
545
+ * LOAD-BEARING !important: colors_and_type.css defines --accent on
546
+ * `[data-accent="acid"|"green"|...]` and `[data-theme="ink"]` — attribute
547
+ * selectors at (0,1,0), the SAME specificity as this `.ds-247420` class
548
+ * rule, on the same <html> element. colors_and_type.css is always loaded
549
+ * first, but equal specificity + later source order would still let a
550
+ * [data-accent] preset win. The flag is the only thing pinning brand green. */
521
551
  --accent: var(--green) !important;
522
552
  --accent-bright: var(--green) !important;
523
553
  --paper: #F5F0E4;
524
554
  }
525
555
  /* Window titlebar matches the 34px bar height; clamp so menubar/taskbar/titlebar
526
556
  * heights are uniform. */
527
- .ds-247420 .wm-bar { height: 34px !important; min-height: 34px !important; box-sizing: border-box !important; padding-top: 4px !important; padding-bottom: 4px !important; }
557
+ .ds-247420 .wm-bar { height: 34px; min-height: 34px; box-sizing: border-box; padding-top: var(--space-1); padding-bottom: var(--space-1); }
528
558
  /* Bars overlay windows: .wm-root fills full viewport, menubar/taskbar paint on top.
529
- * Tilde key hides them via .bars-hidden on <html>. */
530
- .ds-247420 .wm-root { top: 0 !important; bottom: 0 !important; inset: 0 !important; }
559
+ * Tilde key hides them via .bars-hidden on <html>.
560
+ * Wins over the desktop `.ds-247420 .wm-root{inset:var(--os-bar-h)...}` above by
561
+ * equal specificity + later source order (both are now (0,2,0)) — no flag needed. */
562
+ .ds-247420 .wm-root { inset: 0; }
531
563
  /* With bars overlaying the wm-root, a maximized window's 34px titlebar would
532
564
  * sit exactly under the 34px menubar (untappable) and its body under the
533
565
  * taskbar; keep maximized windows between the bars on desktop/tablet. The
534
566
  * mobile band re-asserts its own contract in the responsive layer below. */
535
567
  @media (min-width: 768px) {
568
+ /* LOAD-BEARING !important: wm.css declares `.wm-win.wm-max{top:0!important;
569
+ * height:100%!important}` (wm.css:137-143). Only another !important can beat
570
+ * an !important, regardless of specificity. */
536
571
  .ds-247420 .wm-win.wm-max {
537
572
  top: var(--os-bar-h) !important;
538
573
  height: calc(100% - (var(--os-bar-h) * 2)) !important;
539
574
  }
540
575
  }
541
- /* Instance filtering hides off-instance windows via class, not inline style. */
576
+ /* Instance filtering hides off-instance windows via class, not inline style.
577
+ * LOAD-BEARING !important: must beat wm.css's `.wm-win.wm-max{...!important}`
578
+ * geometry and any display set by the window's own state classes — a hidden
579
+ * window must stay hidden no matter which layout rule matched it. */
542
580
  .ds-247420 .wm-win.wm-inst-hidden,
543
581
  .wm-win.wm-inst-hidden { display: none !important; }
582
+ /* LOAD-BEARING !important: `.os-menubar`/`.os-taskbar` carry `display:flex`
583
+ * from rules at equal-or-higher specificity in this sheet and in the responsive
584
+ * bands below; the tilde-key hide must beat all of them unconditionally. */
544
585
  html.bars-hidden .os-menubar,
545
586
  html.bars-hidden .os-taskbar { display: none !important; }
546
587
  .ds-247420 .os-task { border-radius: var(--r-pill, 999px); }
@@ -553,12 +594,12 @@ html.bars-hidden .os-taskbar { display: none !important; }
553
594
 
554
595
  /* OS-shell z-index layering: .os-root above .wm-root so its .os-menu dropdowns
555
596
  * paint above windows. */
556
- .ds-247420 .os-root { z-index: 9300 !important; }
557
- .ds-247420 .os-menubar { z-index: 9200 !important; position: relative; }
558
- .ds-247420 .os-taskbar { z-index: 9200 !important; position: relative; }
559
- .ds-247420 .os-menu { z-index: 9500 !important; }
560
- .ds-247420 .wm-root { z-index: 9000; }
561
- .ds-247420 .launcher-dock { z-index: 9100; }
597
+ .ds-247420 .os-root { z-index: calc(var(--z-dock) + 2); }
598
+ .ds-247420 .os-menubar { z-index: calc(var(--z-dock) + 1); position: relative; }
599
+ .ds-247420 .os-taskbar { z-index: calc(var(--z-dock) + 1); position: relative; }
600
+ .ds-247420 .os-menu { z-index: var(--z-dropdown); }
601
+ .ds-247420 .wm-root { z-index: var(--z-window); }
602
+ .ds-247420 .launcher-dock { z-index: var(--z-dock); }
562
603
 
563
604
  /* Touch/gesture hardening. */
564
605
  html.ds-247420 { touch-action: pan-x pan-y; overscroll-behavior: none; -webkit-text-size-adjust: 100%; }
@@ -572,7 +613,7 @@ html.ds-247420 { touch-action: pan-x pan-y; overscroll-behavior: none; -webkit-t
572
613
  position: fixed;
573
614
  pointer-events: none;
574
615
  display: none;
575
- z-index: 9050;
616
+ z-index: calc(var(--z-window) + 1);
576
617
  background: color-mix(in oklab, var(--os-accent) 20%, transparent);
577
618
  border: 2px solid var(--os-accent);
578
619
  border-radius: var(--r-0);
@@ -590,22 +631,22 @@ html.ds-247420 { touch-action: pan-x pan-y; overscroll-behavior: none; -webkit-t
590
631
  left: 50%;
591
632
  top: 50%;
592
633
  transform: translate(-50%, -50%);
593
- padding: 16px 20px;
634
+ padding: var(--space-3) var(--space-3-5);
594
635
  background: var(--os-bg-2);
595
636
  border: 1px solid var(--os-accent);
596
637
  border-radius: var(--r-0);
597
- z-index: 9600;
638
+ z-index: var(--z-modal);
598
639
  font-family: var(--ff-ui);
599
640
  color: var(--os-fg);
600
641
  min-width: 280px;
601
642
  box-shadow: var(--shadow-overlay);
602
643
  }
603
644
  .ds-247420 .wm-switcher-item {
604
- padding: 8px 12px;
645
+ padding: var(--space-2) var(--space-2-75);
605
646
  border-radius: var(--r-0);
606
647
  display: flex;
607
648
  align-items: center;
608
- gap: 10px;
649
+ gap: var(--space-2-5);
609
650
  }
610
651
  .ds-247420 .wm-switcher-item.active {
611
652
  background: var(--os-accent);
@@ -637,16 +678,16 @@ html.ds-247420 { touch-action: pan-x pan-y; overscroll-behavior: none; -webkit-t
637
678
  }
638
679
 
639
680
  /* ---- Session-UX surfaces: chips + modals + empty state ---- */
640
- .ds-247420 .os-instances { display: flex; gap: 6px; align-items: center; flex: 0 1 auto; min-width: 0; height: var(--os-bar-h, 34px); overflow-x: auto; overflow-y: hidden; padding: 0 4px; scrollbar-width: none; }
681
+ .ds-247420 .os-instances { display: flex; gap: var(--space-1-75); align-items: center; flex: 0 1 auto; min-width: 0; height: var(--os-bar-h, 34px); overflow-x: auto; overflow-y: hidden; padding: 0 var(--space-1); scrollbar-width: none; }
641
682
  .ds-247420 .os-instances::-webkit-scrollbar { display: none; }
642
683
 
643
684
  .ds-247420 .tb-sess-chip {
644
- display: inline-flex; align-items: center; gap: 6px;
645
- height: 22px; padding: 0 6px 0 8px;
685
+ display: inline-flex; align-items: center; gap: var(--space-1-75);
686
+ height: 22px; padding: 0 var(--space-1-75) 0 var(--space-2);
646
687
  border-radius: var(--r-pill, 999px);
647
688
  background: color-mix(in oklab, var(--fg) 6%, transparent);
648
689
  color: var(--fg);
649
- font-family: var(--ff-ui); font-size: 11px; font-weight: 500;
690
+ font-family: var(--ff-ui); font-size: var(--fs-nano); font-weight: 500;
650
691
  cursor: pointer;
651
692
  border: 1px solid transparent;
652
693
  transition: background 120ms ease, border-color 120ms ease;
@@ -663,43 +704,43 @@ html.ds-247420 { touch-action: pan-x pan-y; overscroll-behavior: none; -webkit-t
663
704
  .ds-247420 .tb-sess-label { max-width: 120px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
664
705
  .ds-247420 .tb-sess-badge {
665
706
  display: inline-flex; align-items: center; justify-content: center;
666
- min-width: 16px; height: 14px; padding: 0 4px;
707
+ min-width: 16px; height: 14px; padding: 0 var(--space-1);
667
708
  border-radius: var(--r-0);
668
709
  background: color-mix(in oklab, var(--fg) 14%, transparent);
669
- font-size: 9px; font-weight: 600; line-height: 1;
710
+ font-size: var(--fs-pico); font-weight: 600; line-height: 1;
670
711
  }
671
712
  .ds-247420 .tb-sess-chip.active .tb-sess-badge { background: color-mix(in oklab, var(--os-accent) 30%, transparent); }
672
713
  .ds-247420 .tb-sess-x {
673
714
  width: 16px; height: 16px; line-height: 14px; text-align: center;
674
715
  border: 0; padding: 0; background: transparent;
675
716
  border-radius: 50%; cursor: pointer; color: inherit;
676
- font-size: 14px; font-weight: 600;
717
+ font-size: var(--fs-xs); font-weight: 600;
677
718
  opacity: 0.55; transition: opacity 120ms ease, background 120ms ease;
678
719
  }
679
720
  .ds-247420 .tb-sess-chip:hover .tb-sess-x { opacity: 1; }
680
721
  .ds-247420 .tb-sess-x:hover { background: color-mix(in oklab, var(--danger) 30%, transparent); color: var(--on-color); }
681
722
 
682
723
  .ds-247420 .tb-sess-add {
683
- display: inline-flex; align-items: center; gap: 4px;
684
- height: 22px; padding: 0 10px;
724
+ display: inline-flex; align-items: center; gap: var(--space-1);
725
+ height: 22px; padding: 0 var(--space-2-5);
685
726
  border: 1px dashed color-mix(in oklab, var(--fg) 30%, transparent);
686
727
  background: transparent;
687
728
  border-radius: var(--r-pill, 999px);
688
- font-family: var(--ff-ui); font-size: 11px; font-weight: 500;
729
+ font-family: var(--ff-ui); font-size: var(--fs-nano); font-weight: 500;
689
730
  color: var(--fg);
690
731
  cursor: pointer;
691
- margin-left: 6px;
732
+ margin-left: var(--space-1-75);
692
733
  transition: border-color 120ms ease, background 120ms ease;
693
734
  }
694
735
  .ds-247420 .tb-sess-add:hover {
695
736
  border-color: var(--os-accent);
696
737
  background: color-mix(in oklab, var(--os-accent) 8%, transparent);
697
738
  }
698
- .ds-247420 .tb-sess-add-plus { font-size: 13px; line-height: 1; }
739
+ .ds-247420 .tb-sess-add-plus { font-size: var(--fs-tiny); line-height: 1; }
699
740
  .ds-247420 .tb-sess-add-lbl { line-height: 1; }
700
741
 
701
742
  .tb-sess-overlay {
702
- position: fixed; inset: 0; z-index: 9800;
743
+ position: fixed; inset: 0; z-index: var(--z-modal);
703
744
  background: var(--scrim);
704
745
  display: flex; align-items: center; justify-content: center;
705
746
  animation: tb-sess-fade 120ms ease;
@@ -715,29 +756,29 @@ html.ds-247420 { touch-action: pan-x pan-y; overscroll-behavior: none; -webkit-t
715
756
  overflow: hidden;
716
757
  font-family: var(--ff-ui);
717
758
  }
718
- .tb-sess-modal-head { display: flex; align-items: center; justify-content: space-between; padding: 12px 16px; border-bottom: 1px solid color-mix(in oklab, var(--fg) 8%, transparent); }
719
- .tb-sess-modal-title { font-weight: 600; font-size: 14px; }
720
- .tb-sess-modal-x { background: transparent; border: 0; font-size: 20px; line-height: 1; cursor: pointer; color: inherit; padding: 0 4px; }
721
- .tb-sess-modal-body { padding: 16px; display: flex; flex-direction: column; gap: 8px; }
722
- .tb-sess-modal-lbl { font-size: 11px; font-weight: 600; letter-spacing: 0.04em; text-transform: uppercase; opacity: 0.7; }
759
+ .tb-sess-modal-head { display: flex; align-items: center; justify-content: space-between; padding: var(--space-2-75) var(--space-3); border-bottom: 1px solid color-mix(in oklab, var(--fg) 8%, transparent); }
760
+ .tb-sess-modal-title { font-weight: 600; font-size: var(--fs-xs); }
761
+ .tb-sess-modal-x { background: transparent; border: 0; font-size: var(--fs-xl); line-height: 1; cursor: pointer; color: inherit; padding: 0 var(--space-1); }
762
+ .tb-sess-modal-body { padding: var(--space-3); display: flex; flex-direction: column; gap: var(--space-2); }
763
+ .tb-sess-modal-lbl { font-size: var(--fs-nano); font-weight: 600; letter-spacing: 0.04em; text-transform: uppercase; opacity: 0.7; }
723
764
  .tb-sess-modal-input {
724
765
  width: 100%; box-sizing: border-box;
725
- height: 32px; padding: 0 10px;
766
+ height: 32px; padding: 0 var(--space-2-5);
726
767
  border: 1px solid color-mix(in oklab, var(--fg) 20%, transparent);
727
768
  border-radius: var(--r-0);
728
769
  background: color-mix(in oklab, var(--fg) 6%, var(--bg));
729
770
  color: inherit;
730
- font-family: inherit; font-size: 13px;
771
+ font-family: inherit; font-size: var(--fs-tiny);
731
772
  }
732
773
  .tb-sess-modal-input:focus { outline: none; border-color: var(--os-accent); box-shadow: 0 0 0 3px color-mix(in oklab, var(--os-accent) 20%, transparent); }
733
- .tb-sess-modal-hint { font-size: 11px; opacity: 0.7; }
734
- .tb-sess-modal-msg { font-size: 13px; }
735
- .tb-sess-modal-foot { display: flex; justify-content: flex-end; gap: 8px; padding: 12px 16px; border-top: 1px solid color-mix(in oklab, var(--fg) 8%, transparent); }
774
+ .tb-sess-modal-hint { font-size: var(--fs-nano); opacity: 0.7; }
775
+ .tb-sess-modal-msg { font-size: var(--fs-tiny); }
776
+ .tb-sess-modal-foot { display: flex; justify-content: flex-end; gap: var(--space-2); padding: var(--space-2-75) var(--space-3); border-top: 1px solid color-mix(in oklab, var(--fg) 8%, transparent); }
736
777
  .tb-sess-modal-btn {
737
778
  height: 28px; padding: 0 14px;
738
779
  border-radius: var(--r-0); border: 1px solid color-mix(in oklab, var(--fg) 20%, transparent);
739
780
  background: transparent; color: inherit;
740
- font-family: inherit; font-size: 12px; font-weight: 500; cursor: pointer;
781
+ font-family: inherit; font-size: var(--fs-micro); font-weight: 500; cursor: pointer;
741
782
  transition: background 120ms ease, border-color 120ms ease;
742
783
  }
743
784
  .tb-sess-modal-btn:hover { background: color-mix(in oklab, var(--fg) 6%, transparent); }
@@ -747,7 +788,7 @@ html.ds-247420 { touch-action: pan-x pan-y; overscroll-behavior: none; -webkit-t
747
788
  .tb-sess-modal-btn.danger:hover { background: color-mix(in oklab, var(--danger) 80%, var(--ink)); }
748
789
 
749
790
  .tb-sess-empty {
750
- position: fixed; inset: 0; z-index: 8900;
791
+ position: fixed; inset: 0; z-index: var(--z-window);
751
792
  display: flex; align-items: center; justify-content: center;
752
793
  pointer-events: none;
753
794
  }
@@ -758,17 +799,17 @@ html.ds-247420 { touch-action: pan-x pan-y; overscroll-behavior: none; -webkit-t
758
799
  border: 1px solid color-mix(in oklab, var(--fg) 14%, transparent);
759
800
  border-radius: var(--r-2);
760
801
  box-shadow: var(--shadow-3);
761
- padding: 32px 40px; text-align: center;
802
+ padding: var(--space-5) 40px; text-align: center;
762
803
  font-family: var(--ff-ui);
763
804
  max-width: 420px;
764
805
  }
765
- .tb-sess-empty-title { font-size: 18px; font-weight: 600; margin-bottom: 6px; }
766
- .tb-sess-empty-sub { font-size: 13px; opacity: 0.7; margin-bottom: 20px; }
806
+ .tb-sess-empty-title { font-size: var(--fs-lg); font-weight: 600; margin-bottom: var(--space-1-75); }
807
+ .tb-sess-empty-sub { font-size: var(--fs-tiny); opacity: 0.7; margin-bottom: var(--space-3-5); }
767
808
  .tb-sess-empty-cta {
768
- height: 40px; padding: 0 24px;
809
+ height: 40px; padding: 0 var(--space-4);
769
810
  background: var(--os-accent); color: var(--on-color);
770
811
  border: 0; border-radius: var(--r-pill, 999px);
771
- font-family: inherit; font-size: 14px; font-weight: 600;
812
+ font-family: inherit; font-size: var(--fs-xs); font-weight: 600;
772
813
  cursor: pointer;
773
814
  transition: transform 120ms ease, box-shadow 120ms ease;
774
815
  }
@@ -776,30 +817,30 @@ html.ds-247420 { touch-action: pan-x pan-y; overscroll-behavior: none; -webkit-t
776
817
 
777
818
  /* ---- Workspaces app — full-window session manager card grid ---- */
778
819
  .ds-247420 .tb-sessions-app { display: flex; flex-direction: column; height: 100%; font-family: var(--ff-ui); color: var(--fg); background: var(--bg); }
779
- .ds-247420 .tb-sessions-bar { display: flex; align-items: center; gap: 8px; padding: 10px 14px; border-bottom: 1px solid color-mix(in oklab, var(--fg) 10%, transparent); }
780
- .ds-247420 .tb-sessions-title { font-weight: 600; font-size: 14px; }
781
- .ds-247420 .tb-sessions-count { font-size: 12px; opacity: 0.6; margin-left: 4px; }
820
+ .ds-247420 .tb-sessions-bar { display: flex; align-items: center; gap: var(--space-2); padding: var(--space-2-5) 14px; border-bottom: 1px solid color-mix(in oklab, var(--fg) 10%, transparent); }
821
+ .ds-247420 .tb-sessions-title { font-weight: 600; font-size: var(--fs-xs); }
822
+ .ds-247420 .tb-sessions-count { font-size: var(--fs-micro); opacity: 0.6; margin-left: var(--space-1); }
782
823
  .ds-247420 .tb-sessions-spacer { flex: 1; }
783
- .ds-247420 .tb-sessions-btn { height: 28px; padding: 0 12px; border-radius: var(--r-0); border: 1px solid color-mix(in oklab, var(--fg) 20%, transparent); background: transparent; color: inherit; font-size: 12px; font-weight: 500; cursor: pointer; font-family: inherit; }
824
+ .ds-247420 .tb-sessions-btn { height: 28px; padding: 0 var(--space-2-75); border-radius: var(--r-0); border: 1px solid color-mix(in oklab, var(--fg) 20%, transparent); background: transparent; color: inherit; font-size: var(--fs-micro); font-weight: 500; cursor: pointer; font-family: inherit; }
784
825
  .ds-247420 .tb-sessions-btn:hover { background: color-mix(in oklab, var(--fg) 6%, transparent); }
785
826
  .ds-247420 .tb-sessions-btn.primary { background: var(--os-accent); color: var(--on-color); border-color: var(--os-accent); }
786
827
  .ds-247420 .tb-sessions-btn.danger { background: var(--danger); color: var(--on-color); border-color: var(--danger); }
787
828
  .ds-247420 .tb-sessions-btn:disabled { opacity: 0.4; cursor: not-allowed; }
788
- .ds-247420 .tb-sessions-grid { flex: 1; overflow: auto; padding: 14px; display: grid; grid-template-columns: repeat(auto-fill, minmax(240px, 1fr)); gap: 12px; align-content: start; }
789
- .ds-247420 .tb-sessions-card { padding: 12px; border-radius: var(--r-1, 10px); border: 1px solid color-mix(in oklab, var(--fg) 12%, transparent); background: color-mix(in oklab, var(--fg) 3%, transparent); display: flex; flex-direction: column; gap: 8px; transition: border-color 120ms ease, transform 120ms ease; }
829
+ .ds-247420 .tb-sessions-grid { flex: 1; overflow: auto; padding: 14px; display: grid; grid-template-columns: repeat(auto-fill, minmax(240px, 1fr)); gap: var(--space-2-75); align-content: start; }
830
+ .ds-247420 .tb-sessions-card { padding: var(--space-2-75); border-radius: var(--r-1, 10px); border: 1px solid color-mix(in oklab, var(--fg) 12%, transparent); background: color-mix(in oklab, var(--fg) 3%, transparent); display: flex; flex-direction: column; gap: var(--space-2); transition: border-color 120ms ease, transform 120ms ease; }
790
831
  .ds-247420 .tb-sessions-card:hover { border-color: var(--os-accent); }
791
832
  .ds-247420 .tb-sessions-card.active { border-color: var(--os-accent); box-shadow: 0 0 0 2px color-mix(in oklab, var(--os-accent) 30%, transparent); }
792
- .ds-247420 .tb-sessions-card-head { display: flex; align-items: center; gap: 8px; }
833
+ .ds-247420 .tb-sessions-card-head { display: flex; align-items: center; gap: var(--space-2); }
793
834
  .ds-247420 .tb-sessions-card-check { width: 14px; height: 14px; cursor: pointer; flex: 0 0 14px; }
794
- .ds-247420 .tb-sessions-card-name { font-weight: 600; font-size: 13px; flex: 1; outline: none; padding: 2px 4px; border-radius: var(--r-0); }
835
+ .ds-247420 .tb-sessions-card-name { font-weight: 600; font-size: var(--fs-tiny); flex: 1; outline: none; padding: var(--space-hair) var(--space-1); border-radius: var(--r-0); }
795
836
  .ds-247420 .tb-sessions-card-name[contenteditable="true"] { background: color-mix(in oklab, var(--fg) 8%, transparent); }
796
- .ds-247420 .tb-sessions-card-id { font-family: var(--os-mono, monospace); font-size: 10px; opacity: 0.5; }
797
- .ds-247420 .tb-sessions-card-stats { font-size: 11px; opacity: 0.7; display: flex; gap: 12px; }
798
- .ds-247420 .tb-sessions-card-actions { display: flex; gap: 6px; margin-top: 4px; }
799
- .ds-247420 .tb-sessions-card-actions button { flex: 1; height: 24px; font-size: 11px; padding: 0 8px; border-radius: var(--r-0); border: 1px solid color-mix(in oklab, var(--fg) 16%, transparent); background: transparent; color: inherit; cursor: pointer; font-family: inherit; }
837
+ .ds-247420 .tb-sessions-card-id { font-family: var(--os-mono, monospace); font-size: var(--fs-pico); opacity: 0.5; }
838
+ .ds-247420 .tb-sessions-card-stats { font-size: var(--fs-nano); opacity: 0.7; display: flex; gap: var(--space-2-75); }
839
+ .ds-247420 .tb-sessions-card-actions { display: flex; gap: var(--space-1-75); margin-top: var(--space-1); }
840
+ .ds-247420 .tb-sessions-card-actions button { flex: 1; height: 24px; font-size: var(--fs-nano); padding: 0 var(--space-2); border-radius: var(--r-0); border: 1px solid color-mix(in oklab, var(--fg) 16%, transparent); background: transparent; color: inherit; cursor: pointer; font-family: inherit; }
800
841
  .ds-247420 .tb-sessions-card-actions button:hover { background: color-mix(in oklab, var(--fg) 6%, transparent); }
801
842
  .ds-247420 .tb-sessions-card-actions button.danger:hover { background: var(--danger); color: var(--on-color); border-color: var(--danger); }
802
- .ds-247420 .tb-sessions-empty-mid { padding: 40px; text-align: center; opacity: 0.6; font-size: 13px; }
843
+ .ds-247420 .tb-sessions-empty-mid { padding: 40px; text-align: center; opacity: 0.6; font-size: var(--fs-tiny); }
803
844
 
804
845
  /* ---- prefers-contrast: more — strengthen borders + focus so the translucent
805
846
  chrome stays legible under forced/high-contrast user settings. ---- */
@@ -816,11 +857,18 @@ html.ds-247420 { touch-action: pan-x pan-y; overscroll-behavior: none; -webkit-t
816
857
 
817
858
  /* ---- print: a web-OS desktop has no meaningful print form. Suppress the
818
859
  live chrome so a Ctrl+P does not waste pages on translucent panels. ---- */
860
+ /* LOAD-BEARING !important throughout this block. Print must defeat two things
861
+ * no selector can outrank: (1) wm.css's `.wm-win.wm-max{left/top/width/height
862
+ * !important}` and its mobile `.wm-win{...!important}` band, and (2) the
863
+ * INLINE styles createWM()/renderWindow() write directly onto .wm-win/.wm-canvas
864
+ * for drag, resize and pan (element style attribute beats every stylesheet
865
+ * rule). Flattening the desktop to static flow for print is only possible by
866
+ * force. Do not remove. */
819
867
  @media print {
820
868
  .os-menubar, .os-taskbar, .wm-snap-preview,
821
869
  .tb-sess-overlay, .tb-switching, .wm-switcher { display: none !important; }
822
870
  .wm-root, .wm-canvas { position: static !important; transform: none !important; overflow: visible !important; }
823
- .wm-win { position: static !important; box-shadow: none !important; border: 1px solid var(--fg) !important; page-break-inside: avoid; margin: 0 0 12px; width: auto !important; height: auto !important; }
871
+ .wm-win { position: static !important; box-shadow: none !important; border: 1px solid var(--fg) !important; page-break-inside: avoid; margin: 0 0 var(--space-2-75); width: auto !important; height: auto !important; }
824
872
  .wm-win.wm-min { display: none !important; }
825
873
  }
826
874
 
@@ -835,7 +883,7 @@ html.ds-247420 { touch-action: pan-x pan-y; overscroll-behavior: none; -webkit-t
835
883
  .ds-247420 .wm-body:has(> .freddie-chat-wrap) { display: flex; flex-direction: column; padding: 0; }
836
884
  .ds-247420 .freddie-chat-wrap { position: absolute; inset: 0; display: flex; flex-direction: column; min-height: 0; }
837
885
  .ds-247420 .freddie-chat-wrap > freddie-chat { flex: 1 1 auto; min-height: 0; display: flex; flex-direction: column; overflow: hidden; }
838
- .ds-247420 .cc-strip { flex: 0 0 auto; font-size: 12px; border-bottom: 1px solid color-mix(in oklab, var(--fg) 16%, transparent); }
886
+ .ds-247420 .cc-strip { flex: 0 0 auto; font-size: var(--fs-micro); border-bottom: 1px solid color-mix(in oklab, var(--fg) 16%, transparent); }
839
887
  .ds-247420 .cc-toggle { all: unset; cursor: pointer; display: inline-flex; align-items: center; gap: .4em; padding: .35em .7em; color: var(--fg, inherit); opacity: .75; }
840
888
  .ds-247420 .cc-toggle:hover { opacity: 1; }
841
889
  .ds-247420 .cc-toggle.cc-open { opacity: 1; font-weight: 600; }
@@ -844,12 +892,12 @@ html.ds-247420 { touch-action: pan-x pan-y; overscroll-behavior: none; -webkit-t
844
892
  .ds-247420 .cc-row { display: flex; gap: .6em; flex-wrap: wrap; }
845
893
  .ds-247420 .cc-row > .cc-field { flex: 1 1 140px; min-width: 0; }
846
894
  .ds-247420 .cc-field { display: flex; flex-direction: column; gap: .2em; }
847
- .ds-247420 .cc-field-label { font-size: 11px; opacity: .65; text-transform: lowercase; }
895
+ .ds-247420 .cc-field-label { font-size: var(--fs-nano); opacity: .65; text-transform: lowercase; }
848
896
  .ds-247420 .cc-strip select,
849
- .ds-247420 .cc-strip input { font: inherit; font-size: 12px; padding: .3em .4em; width: 100%; box-sizing: border-box; background: var(--panel-1, transparent); color: var(--fg, inherit); border: 1px solid color-mix(in oklab, var(--fg) 18%, transparent); border-radius: var(--r-0); }
897
+ .ds-247420 .cc-strip input { font: inherit; font-size: var(--fs-micro); padding: .3em .4em; width: 100%; box-sizing: border-box; background: var(--panel-1, transparent); color: var(--fg, inherit); border: 1px solid color-mix(in oklab, var(--fg) 18%, transparent); border-radius: var(--r-0); }
850
898
  .ds-247420 .cc-acp-mode-wrap { display: flex; align-items: center; gap: .4em; }
851
899
  .ds-247420 .cc-acp-mode-wrap select { flex: 1; }
852
- .ds-247420 .cc-acp-status { opacity: .5; font-size: 13px; }
900
+ .ds-247420 .cc-acp-status { opacity: .5; font-size: var(--fs-tiny); }
853
901
  .ds-247420 .cc-acp-status.cc-reachable { opacity: 1; color: var(--os-accent, #247420); }
854
902
  .ds-247420 .cc-details > summary { cursor: pointer; opacity: .7; padding: .2em 0; }
855
903
  .ds-247420 .cc-skills,
@@ -859,7 +907,7 @@ html.ds-247420 { touch-action: pan-x pan-y; overscroll-behavior: none; -webkit-t
859
907
  .ds-247420 .cc-empty { opacity: .5; font-style: italic; }
860
908
 
861
909
  /* ---- fsbrowse files app (was: docs/fsbrowse-app.js ensureStyles) ---- */
862
- .ds-247420 .fsb-root { position: absolute; inset: 0; display: flex; flex-direction: column; min-height: 0; font-size: 13px; color: var(--fg, inherit); }
910
+ .ds-247420 .fsb-root { position: absolute; inset: 0; display: flex; flex-direction: column; min-height: 0; font-size: var(--fs-tiny); color: var(--fg, inherit); }
863
911
  .ds-247420 .fsb-bar { flex: 0 0 auto; display: flex; align-items: center; gap: .4em; padding: .45em .6em; border-bottom: 1px solid color-mix(in oklab, var(--fg) 16%, transparent); flex-wrap: wrap; }
864
912
  .ds-247420 .fsb-crumbs { flex: 1; display: flex; align-items: center; gap: .2em; min-width: 0; overflow: auto; white-space: nowrap; }
865
913
  .ds-247420 .fsb-crumb { cursor: pointer; opacity: .75; text-decoration: none; color: inherit; }
@@ -873,17 +921,17 @@ html.ds-247420 { touch-action: pan-x pan-y; overscroll-behavior: none; -webkit-t
873
921
  .ds-247420 .fsb-row:focus-visible { outline: 2px solid var(--os-accent); outline-offset: -2px; background: color-mix(in oklab, var(--fg) 6%, transparent); }
874
922
  .ds-247420 .fsb-icon { width: 1.3em; text-align: center; flex: 0 0 auto; }
875
923
  .ds-247420 .fsb-name { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
876
- .ds-247420 .fsb-size { opacity: .55; font-size: 11px; font-variant-numeric: tabular-nums; flex: 0 0 auto; }
924
+ .ds-247420 .fsb-size { opacity: .55; font-size: var(--fs-nano); font-variant-numeric: tabular-nums; flex: 0 0 auto; }
877
925
  .ds-247420 .fsb-actions { display: flex; gap: .3em; flex: 0 0 auto; opacity: 0; }
878
926
  /* Reveal row actions on hover OR keyboard focus-within OR coarse-pointer (touch),
879
927
  * so they aren't hover-only dead controls for keyboard/touch users. */
880
928
  .ds-247420 .fsb-row:hover .fsb-actions,
881
929
  .ds-247420 .fsb-row:focus-within .fsb-actions { opacity: 1; }
882
930
  @media (hover: none) { .ds-247420 .fsb-actions { opacity: 1; } }
883
- .ds-247420 .fsb-act { all: unset; cursor: pointer; padding: .1em .35em; border-radius: var(--r-0); opacity: .7; font-size: 12px; }
931
+ .ds-247420 .fsb-act { all: unset; cursor: pointer; padding: .1em .35em; border-radius: var(--r-0); opacity: .7; font-size: var(--fs-micro); }
884
932
  .ds-247420 .fsb-act:hover { opacity: 1; background: color-mix(in oklab, var(--fg) 12%, transparent); }
885
933
  .ds-247420 .fsb-empty { opacity: .5; padding: 1.5em; text-align: center; font-style: italic; }
886
- .ds-247420 .fsb-view { flex: 1; min-height: 0; overflow: auto; margin: 0; padding: .7em; white-space: pre-wrap; word-break: break-word; font: 12px/1.5 var(--os-mono, ui-monospace, monospace); background: var(--panel-1, transparent); }
934
+ .ds-247420 .fsb-view { flex: 1; min-height: 0; overflow: auto; margin: 0; padding: .7em; white-space: pre-wrap; word-break: break-word; font: var(--fs-micro)/1.5 var(--os-mono, ui-monospace, monospace); background: var(--panel-1, transparent); }
887
935
  .ds-247420 .fsb-dropping { outline: 2px dashed var(--os-accent, #247420); outline-offset: -6px; }
888
936
 
889
937
  /* ---- wm canvas (infinite zoom/pan surface — was: docs/desktop-camera.js canvas.style.cssText) ----
@@ -893,33 +941,37 @@ html.ds-247420 { touch-action: pan-x pan-y; overscroll-behavior: none; -webkit-t
893
941
  .ds-247420 .wm-canvas { position: absolute; inset: 0; transform-origin: 0 0; will-change: transform; }
894
942
 
895
943
  /* ---- wm context menu (was: docs/wm.js showWindowMenu cssText) ---- */
896
- .ds-247420 .wm-context-menu { position: fixed; background: var(--panel-2, #1a1a1a); border: 1px solid color-mix(in oklab, var(--fg) 18%, transparent); border-radius: var(--r-0); z-index: 9700; font-family: var(--ff-ui); color: var(--fg, #fff); min-width: 140px; box-shadow: 0 8px 32px rgba(0, 0, 0, .35); padding: 4px; }
897
- .ds-247420 .wm-context-menu-item { display: block; width: 100%; padding: 7px 10px; border: none; border-radius: var(--r-0); background: none; color: inherit; font-family: inherit; text-align: left; cursor: pointer; font-size: 13px; }
944
+ /* No var() fallbacks here: colors_and_type.css is guaranteed loaded first for
945
+ * every .ds-247420 consumer (see the file header), and the old `#1a1a1a` /
946
+ * `#fff` fallbacks were baked DARK values that would have rendered white text
947
+ * on a near-white panel in paper mode had they ever fired. */
948
+ .ds-247420 .wm-context-menu { position: fixed; background: var(--panel-2); border: 1px solid color-mix(in oklab, var(--fg) 18%, transparent); border-radius: var(--r-0); z-index: var(--z-dropdown); font-family: var(--ff-ui); color: var(--fg); min-width: 140px; box-shadow: 0 var(--space-2) var(--space-5) rgba(0, 0, 0, .35); padding: var(--space-1); }
949
+ .ds-247420 .wm-context-menu-item { display: block; width: 100%; padding: 7px var(--space-2-5); border: none; border-radius: var(--r-0); background: none; color: inherit; font-family: inherit; text-align: left; cursor: pointer; font-size: var(--fs-tiny); }
898
950
  .ds-247420 .wm-context-menu-item:hover { background: color-mix(in oklab, var(--fg) 8%, transparent); }
899
951
 
900
952
  /* ---- todo app (was: docs/apps.js todo-app cssText) ---- */
901
- .ds-247420 .tb-todo-bar { display: flex; gap: 6px; margin-bottom: 8px; }
902
- .ds-247420 .tb-todo-input { flex: 1; padding: 5px 8px; border: 1px solid color-mix(in oklab, var(--fg) 18%, transparent); border-radius: var(--r-0); font: inherit; background: var(--panel-1, transparent); color: var(--fg, inherit); }
903
- .ds-247420 .tb-todo-list { list-style: none; padding: 0; margin: 6px 0; }
904
- .ds-247420 .tb-todo-footer { display: flex; gap: 8px; align-items: center; margin-top: 6px; font-size: 11px; }
905
- .ds-247420 .tb-todo-status { margin-top: 10px; font-size: 11px; color: color-mix(in oklab, var(--fg) 55%, transparent); padding: 6px 8px; background: var(--panel-1, transparent); border-radius: var(--r-0); min-height: 14px; }
906
- .ds-247420 .tb-todo-item { display: flex; gap: 8px; align-items: center; padding: 5px 6px; border-bottom: 1px solid color-mix(in oklab, var(--fg) 8%, transparent); }
953
+ .ds-247420 .tb-todo-bar { display: flex; gap: var(--space-1-75); margin-bottom: var(--space-2); }
954
+ .ds-247420 .tb-todo-input { flex: 1; padding: var(--space-1-5) var(--space-2); border: 1px solid color-mix(in oklab, var(--fg) 18%, transparent); border-radius: var(--r-0); font: inherit; background: var(--panel-1, transparent); color: var(--fg, inherit); }
955
+ .ds-247420 .tb-todo-list { list-style: none; padding: 0; margin: var(--space-1-75) 0; }
956
+ .ds-247420 .tb-todo-footer { display: flex; gap: var(--space-2); align-items: center; margin-top: var(--space-1-75); font-size: var(--fs-nano); }
957
+ .ds-247420 .tb-todo-status { margin-top: var(--space-2-5); font-size: var(--fs-nano); color: color-mix(in oklab, var(--fg) 55%, transparent); padding: var(--space-1-75) var(--space-2); background: var(--panel-1, transparent); border-radius: var(--r-0); min-height: 14px; }
958
+ .ds-247420 .tb-todo-item { display: flex; gap: var(--space-2); align-items: center; padding: var(--space-1-5) var(--space-1-75); border-bottom: 1px solid color-mix(in oklab, var(--fg) 8%, transparent); }
907
959
  .ds-247420 .tb-todo-text { flex: 1; }
908
960
  .ds-247420 .tb-todo-text.is-done { text-decoration: line-through; color: color-mix(in oklab, var(--fg) 45%, transparent); }
909
- .ds-247420 .tb-todo-del { padding: 2px 8px; }
961
+ .ds-247420 .tb-todo-del { padding: var(--space-hair) var(--space-2); }
910
962
 
911
963
  /* ---- freddie keys panel (was: docs/freddie-keys.js cssText) ---- */
912
- .ds-247420 .fk-root { padding: 12px; overflow: auto; height: 100%; font-family: var(--os-mono, monospace); font-size: 12px; }
913
- .ds-247420 .fk-status { margin-top: 8px; color: color-mix(in oklab, var(--fg) 60%, transparent); min-height: 1.2em; }
914
- .ds-247420 .fk-row { display: grid; grid-template-columns: 140px 1fr auto auto; gap: 6px; align-items: center; margin: 2px 0; }
915
- .ds-247420 .fk-input { font-family: var(--os-mono, monospace); font-size: 11px; padding: 2px 4px; }
916
- .ds-247420 .fk-title { font-weight: 600; margin-bottom: 8px; }
917
- .ds-247420 .fk-nim-wrap { display: flex; gap: 6px; align-items: center; margin: 4px 0 10px 0; }
918
- .ds-247420 .fk-nim-in { font-family: var(--os-mono, monospace); font-size: 11px; padding: 2px 4px; flex: 1; }
919
- .ds-247420 .fk-badge { font-size: 10px; padding: 2px 6px; border: 1px solid color-mix(in oklab, var(--fg) 18%, transparent); border-radius: var(--r-hair); color: var(--os-accent, #247420); }
964
+ .ds-247420 .fk-root { padding: var(--space-2-75); overflow: auto; height: 100%; font-family: var(--os-mono, monospace); font-size: var(--fs-micro); }
965
+ .ds-247420 .fk-status { margin-top: var(--space-2); color: color-mix(in oklab, var(--fg) 60%, transparent); min-height: 1.2em; }
966
+ .ds-247420 .fk-row { display: grid; grid-template-columns: 140px 1fr auto auto; gap: var(--space-1-75); align-items: center; margin: var(--space-hair) 0; }
967
+ .ds-247420 .fk-input { font-family: var(--os-mono, monospace); font-size: var(--fs-nano); padding: var(--space-hair) var(--space-1); }
968
+ .ds-247420 .fk-title { font-weight: 600; margin-bottom: var(--space-2); }
969
+ .ds-247420 .fk-nim-wrap { display: flex; gap: var(--space-1-75); align-items: center; margin: var(--space-1) 0 var(--space-2-5) 0; }
970
+ .ds-247420 .fk-nim-in { font-family: var(--os-mono, monospace); font-size: var(--fs-nano); padding: var(--space-hair) var(--space-1); flex: 1; }
971
+ .ds-247420 .fk-badge { font-size: var(--fs-pico); padding: var(--space-hair) var(--space-1-75); border: 1px solid color-mix(in oklab, var(--fg) 18%, transparent); border-radius: var(--r-hair); color: var(--os-accent, #247420); }
920
972
  .ds-247420 .fk-agent-title,
921
- .ds-247420 .fk-host-title { margin-top: 14px; font-size: 11px; color: color-mix(in oklab, var(--fg) 60%, transparent); }
922
- .ds-247420 .fk-summary { font-size: 10px; color: color-mix(in oklab, var(--fg) 60%, transparent); margin: 6px 0; }
973
+ .ds-247420 .fk-host-title { margin-top: 14px; font-size: var(--fs-nano); color: color-mix(in oklab, var(--fg) 60%, transparent); }
974
+ .ds-247420 .fk-summary { font-size: var(--fs-pico); color: color-mix(in oklab, var(--fg) 60%, transparent); margin: var(--space-1-75) 0; }
923
975
 
924
976
  /* ============================================================================
925
977
  * Freddie chat redesign (2026-05-30) — extends ds-chat / freddie-chat with
@@ -930,34 +982,34 @@ html.ds-247420 { touch-action: pan-x pan-y; overscroll-behavior: none; -webkit-t
930
982
  * ============================================================================ */
931
983
 
932
984
  /* Centered chrome for system/tool/thinking — full row, no avatar column. */
933
- .ds-247420 .chat-msg.centered { grid-template-columns: 1fr; padding: 4px 12%; }
985
+ .ds-247420 .chat-msg.centered { grid-template-columns: 1fr; padding: var(--space-1) 12%; }
934
986
  .ds-247420 .chat-msg.centered .chat-stack { align-items: center; }
935
- .ds-247420 .chat-msg.system .chat-bubble { background: transparent; border: 0; font-style: italic; opacity: 0.65; font-size: 12px; padding: 4px 8px; text-align: center; max-width: 100%; }
987
+ .ds-247420 .chat-msg.system .chat-bubble { background: transparent; border: 0; font-style: italic; opacity: 0.65; font-size: var(--fs-micro); padding: var(--space-1) var(--space-2); text-align: center; max-width: 100%; }
936
988
 
937
989
  /* Tool-call card — collapsible details with status icon + name + label. */
938
- .ds-247420 .chat-tool { display: block; background: var(--panel-1, color-mix(in oklab, var(--fg) 4%, transparent)); border: 1px solid color-mix(in oklab, var(--fg) 14%, transparent); border-radius: var(--r-0); padding: 0; max-width: min(640px, 92%); overflow: hidden; font-size: 12px; }
990
+ .ds-247420 .chat-tool { display: block; background: var(--panel-1, color-mix(in oklab, var(--fg) 4%, transparent)); border: 1px solid color-mix(in oklab, var(--fg) 14%, transparent); border-radius: var(--r-0); padding: 0; max-width: min(640px, 92%); overflow: hidden; font-size: var(--fs-micro); }
939
991
  .ds-247420 .chat-tool[open] { background: var(--panel-1, color-mix(in oklab, var(--fg) 6%, transparent)); }
940
992
  .ds-247420 .chat-tool.tool-error { border-color: color-mix(in oklab, var(--danger, #c0392b) 60%, transparent); }
941
993
  .ds-247420 .chat-tool.tool-done { border-color: color-mix(in oklab, var(--os-accent, #247420) 35%, transparent); }
942
- .ds-247420 .chat-tool-head { display: flex; align-items: center; gap: 8px; padding: 6px 10px; cursor: pointer; list-style: none; user-select: none; }
994
+ .ds-247420 .chat-tool-head { display: flex; align-items: center; gap: var(--space-2); padding: var(--space-1-75) var(--space-2-5); cursor: pointer; list-style: none; user-select: none; }
943
995
  .ds-247420 .chat-tool-head::-webkit-details-marker { display: none; }
944
- .ds-247420 .chat-tool-icon { display: inline-flex; width: 14px; height: 14px; align-items: center; justify-content: center; font-family: var(--os-mono, monospace); font-size: 12px; opacity: 0.7; }
996
+ .ds-247420 .chat-tool-icon { display: inline-flex; width: 14px; height: 14px; align-items: center; justify-content: center; font-family: var(--os-mono, monospace); font-size: var(--fs-micro); opacity: 0.7; }
945
997
  .ds-247420 .chat-tool.tool-error .chat-tool-icon { color: var(--danger, #c0392b); opacity: 1; }
946
998
  .ds-247420 .chat-tool.tool-done .chat-tool-icon { color: var(--os-accent, #247420); opacity: 1; }
947
999
  .ds-247420 .chat-tool.tool-running .chat-tool-icon { animation: chat-spin 1.4s linear infinite; }
948
1000
  @keyframes chat-spin { to { transform: rotate(360deg); } }
949
- .ds-247420 .chat-tool-name { font-family: var(--os-mono, monospace); font-weight: 600; font-size: 12px; }
950
- .ds-247420 .chat-tool-label { opacity: 0.7; font-size: 11px; flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
951
- .ds-247420 .chat-tool-status { font-size: 10px; opacity: 0.55; text-transform: uppercase; letter-spacing: 0.05em; margin-left: auto; }
952
- .ds-247420 .chat-tool-body { padding: 4px 10px 10px; display: flex; flex-direction: column; gap: 8px; border-top: 1px solid color-mix(in oklab, var(--fg) 8%, transparent); }
953
- .ds-247420 .chat-tool-section { display: flex; flex-direction: column; gap: 3px; }
954
- .ds-247420 .chat-tool-section-label { font-size: 10px; opacity: 0.5; text-transform: lowercase; letter-spacing: 0.05em; }
955
- .ds-247420 .chat-tool-pre { margin: 0; padding: 6px 8px; background: color-mix(in oklab, var(--fg) 4%, transparent); border-radius: var(--r-0); max-height: 200px; overflow: auto; font: 11px/1.45 var(--os-mono, ui-monospace, monospace); white-space: pre-wrap; word-break: break-word; }
1001
+ .ds-247420 .chat-tool-name { font-family: var(--os-mono, monospace); font-weight: 600; font-size: var(--fs-micro); }
1002
+ .ds-247420 .chat-tool-label { opacity: 0.7; font-size: var(--fs-nano); flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
1003
+ .ds-247420 .chat-tool-status { font-size: var(--fs-pico); opacity: 0.55; text-transform: uppercase; letter-spacing: 0.05em; margin-left: auto; }
1004
+ .ds-247420 .chat-tool-body { padding: var(--space-1) var(--space-2-5) var(--space-2-5); display: flex; flex-direction: column; gap: var(--space-2); border-top: 1px solid color-mix(in oklab, var(--fg) 8%, transparent); }
1005
+ .ds-247420 .chat-tool-section { display: flex; flex-direction: column; gap: var(--space-half); }
1006
+ .ds-247420 .chat-tool-section-label { font-size: var(--fs-pico); opacity: 0.5; text-transform: lowercase; letter-spacing: 0.05em; }
1007
+ .ds-247420 .chat-tool-pre { margin: 0; padding: var(--space-1-75) var(--space-2); background: color-mix(in oklab, var(--fg) 4%, transparent); border-radius: var(--r-0); max-height: 200px; overflow: auto; font: var(--fs-nano)/1.45 var(--os-mono, ui-monospace, monospace); white-space: pre-wrap; word-break: break-word; }
956
1008
  .ds-247420 .chat-tool-pre.is-error { color: var(--danger, #c0392b); }
957
1009
 
958
1010
  /* Thinking indicator — typing dots + label, transient (assistant-side). */
959
- .ds-247420 .chat-thinking { display: inline-flex; align-items: center; gap: 8px; background: transparent; border: 0; padding: 4px 8px; opacity: 0.7; font-size: 12px; }
960
- .ds-247420 .chat-thinking-dots { display: inline-flex; gap: 3px; }
1011
+ .ds-247420 .chat-thinking { display: inline-flex; align-items: center; gap: var(--space-2); background: transparent; border: 0; padding: var(--space-1) var(--space-2); opacity: 0.7; font-size: var(--fs-micro); }
1012
+ .ds-247420 .chat-thinking-dots { display: inline-flex; gap: var(--space-half); }
961
1013
  .ds-247420 .chat-thinking-dots span { width: 5px; height: 5px; border-radius: 50%; background: var(--fg); opacity: 0.4; animation: chat-thinking-bounce 1.2s infinite ease-in-out; }
962
1014
  .ds-247420 .chat-thinking-dots span:nth-child(2) { animation-delay: 0.15s; }
963
1015
  .ds-247420 .chat-thinking-dots span:nth-child(3) { animation-delay: 0.3s; }
@@ -968,13 +1020,13 @@ html.ds-247420 { touch-action: pan-x pan-y; overscroll-behavior: none; -webkit-t
968
1020
  }
969
1021
 
970
1022
  /* Empty-state suggestion chips — clickable prompts. */
971
- .ds-247420 .chat-empty-suggestions { display: flex; flex-wrap: wrap; gap: 6px; justify-content: center; margin-top: 12px; max-width: 480px; }
972
- .ds-247420 .chat-empty-suggestion { all: unset; cursor: pointer; font-size: 12px; padding: 6px 10px; border: 1px solid color-mix(in oklab, var(--fg) 18%, transparent); border-radius: var(--r-pill, 999px); background: var(--panel-1, transparent); transition: background 120ms ease, border-color 120ms ease; }
1023
+ .ds-247420 .chat-empty-suggestions { display: flex; flex-wrap: wrap; gap: var(--space-1-75); justify-content: center; margin-top: var(--space-2-75); max-width: 480px; }
1024
+ .ds-247420 .chat-empty-suggestion { all: unset; cursor: pointer; font-size: var(--fs-micro); padding: var(--space-1-75) var(--space-2-5); border: 1px solid color-mix(in oklab, var(--fg) 18%, transparent); border-radius: var(--r-pill, 999px); background: var(--panel-1, transparent); transition: background 120ms ease, border-color 120ms ease; }
973
1025
  .ds-247420 .chat-empty-suggestion:hover { background: color-mix(in oklab, var(--os-accent, #247420) 10%, transparent); border-color: var(--os-accent, #247420); }
974
1026
  .ds-247420 .chat-empty-suggestion:focus-visible { outline: 2px solid var(--os-accent, #247420); outline-offset: 2px; }
975
1027
 
976
1028
  /* Cancel-while-generating button replaces send. */
977
- .ds-247420 .chat-composer .send.cancel { background: var(--danger, #c0392b); color: var(--on-color, #fff); }
1029
+ .ds-247420 .chat-composer .send.cancel { background: var(--danger); color: var(--on-color); }
978
1030
  .ds-247420 .chat-composer .send.cancel:hover { background: color-mix(in oklab, var(--danger, #c0392b) 80%, black); }
979
1031
 
980
1032
  /* ============================================================================
@@ -1025,16 +1077,18 @@ html.ds-247420 { touch-action: pan-x pan-y; overscroll-behavior: none; -webkit-t
1025
1077
  min-height: 0;
1026
1078
  height: 100%;
1027
1079
  overflow: hidden;
1028
- /* zero legacy .ds-247420 .chat + .chat (app-shell) token leak — host
1029
- carries `.chat` class so the legacy full-page chat-card rule
1030
- (margin:12px 0; max-width:820; min-height:480; padding-bottom:50)
1031
- applies. Bump specificity with the doubled-class selector. */
1032
- margin: 0 !important;
1033
- padding: 0 !important;
1034
- gap: 0 !important;
1035
- max-width: none !important;
1036
- background: transparent !important;
1037
- border-radius: 0 !important;
1080
+ /* zero the legacy `.chat` card treatment (app-shell.css chat-polish.css,
1081
+ which the bundle scopes to `.ds-247420 .chat` = (0,2,0)) leaking onto the
1082
+ host element, which also carries the `.chat` class. The
1083
+ `freddie-chat.chat` / `ds-chat.chat` compound selectors here are (0,2,1) —
1084
+ strictly higher — so these win on SPECIFICITY alone, independent of which
1085
+ sheet loads first. That is why no !important is needed. */
1086
+ margin: 0;
1087
+ padding: 0;
1088
+ gap: 0;
1089
+ max-width: none;
1090
+ background: transparent;
1091
+ border-radius: 0;
1038
1092
  }
1039
1093
  .ds-247420 freddie-chat > .chat,
1040
1094
  .ds-247420 ds-chat > .chat {
@@ -1051,8 +1105,8 @@ html.ds-247420 { touch-action: pan-x pan-y; overscroll-behavior: none; -webkit-t
1051
1105
  .ds-247420 .chat-head {
1052
1106
  display: flex;
1053
1107
  align-items: center;
1054
- gap: 8px;
1055
- padding: 8px 12px;
1108
+ gap: var(--space-2);
1109
+ padding: var(--space-2) var(--space-2-75);
1056
1110
  border-bottom: 1px solid color-mix(in oklab, var(--fg) 10%, transparent);
1057
1111
  min-height: 38px;
1058
1112
  flex: 0 0 auto;
@@ -1066,7 +1120,7 @@ html.ds-247420 { touch-action: pan-x pan-y; overscroll-behavior: none; -webkit-t
1066
1120
  flex-shrink: 0;
1067
1121
  }
1068
1122
  .ds-247420 .chat-head .ds-chat-title {
1069
- font-size: 13px;
1123
+ font-size: var(--fs-tiny);
1070
1124
  font-weight: 600;
1071
1125
  margin: 0;
1072
1126
  white-space: nowrap;
@@ -1075,7 +1129,7 @@ html.ds-247420 { touch-action: pan-x pan-y; overscroll-behavior: none; -webkit-t
1075
1129
  flex-shrink: 0;
1076
1130
  }
1077
1131
  .ds-247420 .chat-head .sub {
1078
- font-size: 12px;
1132
+ font-size: var(--fs-micro);
1079
1133
  opacity: 0.7;
1080
1134
  white-space: nowrap;
1081
1135
  overflow: hidden;
@@ -1090,10 +1144,10 @@ html.ds-247420 { touch-action: pan-x pan-y; overscroll-behavior: none; -webkit-t
1090
1144
  min-height: 0;
1091
1145
  overflow-y: auto;
1092
1146
  overflow-x: hidden;
1093
- padding: 12px;
1147
+ padding: var(--space-2-75);
1094
1148
  display: flex;
1095
1149
  flex-direction: column;
1096
- gap: 6px;
1150
+ gap: var(--space-1-75);
1097
1151
  scrollbar-width: thin;
1098
1152
  scrollbar-color: color-mix(in oklab, var(--fg) 22%, transparent) transparent;
1099
1153
  scroll-behavior: smooth;
@@ -1115,7 +1169,7 @@ html.ds-247420 { touch-action: pan-x pan-y; overscroll-behavior: none; -webkit-t
1115
1169
  .ds-247420 .chat-msg {
1116
1170
  display: grid;
1117
1171
  grid-template-columns: 28px 1fr;
1118
- gap: 8px;
1172
+ gap: var(--space-2);
1119
1173
  align-items: start;
1120
1174
  }
1121
1175
  .ds-247420 .chat-msg.you {
@@ -1126,7 +1180,7 @@ html.ds-247420 { touch-action: pan-x pan-y; overscroll-behavior: none; -webkit-t
1126
1180
  .ds-247420 .chat-msg.centered {
1127
1181
  grid-template-columns: 1fr;
1128
1182
  justify-items: center;
1129
- padding: 2px 12%;
1183
+ padding: var(--space-hair) 12%;
1130
1184
  }
1131
1185
 
1132
1186
  .ds-247420 .chat-avatar {
@@ -1138,7 +1192,7 @@ html.ds-247420 { touch-action: pan-x pan-y; overscroll-behavior: none; -webkit-t
1138
1192
  display: inline-flex;
1139
1193
  align-items: center;
1140
1194
  justify-content: center;
1141
- font-size: 12px;
1195
+ font-size: var(--fs-micro);
1142
1196
  font-weight: 600;
1143
1197
  text-transform: lowercase;
1144
1198
  flex-shrink: 0;
@@ -1146,13 +1200,13 @@ html.ds-247420 { touch-action: pan-x pan-y; overscroll-behavior: none; -webkit-t
1146
1200
  }
1147
1201
  .ds-247420 .chat-msg.you .chat-avatar {
1148
1202
  background: var(--os-accent, #247420);
1149
- color: var(--on-color, #fff);
1203
+ color: var(--on-color);
1150
1204
  }
1151
1205
 
1152
1206
  .ds-247420 .chat-stack {
1153
1207
  display: flex;
1154
1208
  flex-direction: column;
1155
- gap: 3px;
1209
+ gap: var(--space-half);
1156
1210
  min-width: 0;
1157
1211
  align-items: flex-start;
1158
1212
  }
@@ -1162,8 +1216,8 @@ html.ds-247420 { touch-action: pan-x pan-y; overscroll-behavior: none; -webkit-t
1162
1216
  color: var(--fg);
1163
1217
  border: 1px solid color-mix(in oklab, var(--fg) 8%, transparent);
1164
1218
  border-radius: var(--r-1);
1165
- padding: 8px 12px;
1166
- font-size: 14px;
1219
+ padding: var(--space-2) var(--space-2-75);
1220
+ font-size: var(--fs-xs);
1167
1221
  line-height: 1.5;
1168
1222
  max-width: min(720px, 86%);
1169
1223
  overflow-wrap: anywhere;
@@ -1171,19 +1225,19 @@ html.ds-247420 { touch-action: pan-x pan-y; overscroll-behavior: none; -webkit-t
1171
1225
  }
1172
1226
  .ds-247420 .chat-msg.you .chat-bubble {
1173
1227
  background: var(--os-accent, #247420);
1174
- color: var(--on-color, #fff);
1228
+ color: var(--on-color);
1175
1229
  border-color: color-mix(in oklab, var(--os-accent, #247420) 60%, black);
1176
1230
  border-bottom-right-radius: 4px;
1177
1231
  }
1178
1232
  .ds-247420 .chat-msg.them .chat-bubble {
1179
1233
  border-bottom-left-radius: 4px;
1180
1234
  }
1181
- .ds-247420 .chat-bubble + .chat-bubble { margin-top: 4px; }
1235
+ .ds-247420 .chat-bubble + .chat-bubble { margin-top: var(--space-1); }
1182
1236
  .ds-247420 .chat-bubble pre,
1183
- .ds-247420 .chat-bubble code { font-family: var(--os-mono, ui-monospace, monospace); font-size: 12.5px; }
1237
+ .ds-247420 .chat-bubble code { font-family: var(--os-mono, ui-monospace, monospace); font-size: var(--fs-micro); }
1184
1238
  .ds-247420 .chat-bubble pre {
1185
- margin: 6px 0 0;
1186
- padding: 8px 10px;
1239
+ margin: var(--space-1-75) 0 0;
1240
+ padding: var(--space-2) var(--space-2-5);
1187
1241
  background: color-mix(in oklab, var(--fg) 6%, transparent);
1188
1242
  border-radius: var(--r-0);
1189
1243
  max-height: 320px;
@@ -1193,7 +1247,7 @@ html.ds-247420 { touch-action: pan-x pan-y; overscroll-behavior: none; -webkit-t
1193
1247
  }
1194
1248
  .ds-247420 .chat-msg.you .chat-bubble pre {
1195
1249
  background: color-mix(in oklab, black 25%, transparent);
1196
- color: var(--on-color, #fff);
1250
+ color: var(--on-color);
1197
1251
  }
1198
1252
  .ds-247420 .chat-bubble a {
1199
1253
  color: inherit;
@@ -1204,12 +1258,12 @@ html.ds-247420 { touch-action: pan-x pan-y; overscroll-behavior: none; -webkit-t
1204
1258
  }
1205
1259
 
1206
1260
  .ds-247420 .chat-meta {
1207
- font-size: 11px;
1261
+ font-size: var(--fs-nano);
1208
1262
  opacity: 0.55;
1209
1263
  display: inline-flex;
1210
1264
  align-items: center;
1211
- gap: 6px;
1212
- padding: 0 4px;
1265
+ gap: var(--space-1-75);
1266
+ padding: 0 var(--space-1);
1213
1267
  }
1214
1268
  .ds-247420 .chat-msg.you .chat-meta { flex-direction: row-reverse; }
1215
1269
 
@@ -1220,18 +1274,18 @@ html.ds-247420 { touch-action: pan-x pan-y; overscroll-behavior: none; -webkit-t
1220
1274
  align-items: center;
1221
1275
  justify-content: center;
1222
1276
  text-align: center;
1223
- padding: 32px 24px;
1277
+ padding: var(--space-5) var(--space-4);
1224
1278
  color: var(--fg);
1225
- gap: 4px;
1279
+ gap: var(--space-1);
1226
1280
  }
1227
1281
  .ds-247420 .chat-empty-title {
1228
- font-size: 18px;
1282
+ font-size: var(--fs-lg);
1229
1283
  font-weight: 600;
1230
1284
  margin: 0;
1231
1285
  letter-spacing: -0.01em;
1232
1286
  }
1233
1287
  .ds-247420 .chat-empty-sub {
1234
- font-size: 13px;
1288
+ font-size: var(--fs-tiny);
1235
1289
  opacity: 0.65;
1236
1290
  margin: 0;
1237
1291
  max-width: 420px;
@@ -1241,19 +1295,19 @@ html.ds-247420 { touch-action: pan-x pan-y; overscroll-behavior: none; -webkit-t
1241
1295
  .ds-247420 .chat-composer {
1242
1296
  display: flex;
1243
1297
  flex-direction: column;
1244
- gap: 6px;
1245
- padding: 8px 10px;
1298
+ gap: var(--space-1-75);
1299
+ padding: var(--space-2) var(--space-2-5);
1246
1300
  border-top: 1px solid color-mix(in oklab, var(--fg) 10%, transparent);
1247
1301
  background: var(--panel-0, transparent);
1248
1302
  flex: 0 0 auto;
1249
1303
  }
1250
1304
  .ds-247420 .chat-composer textarea {
1251
- font: 14px/1.45 var(--os-ui, system-ui), sans-serif;
1305
+ font: var(--fs-xs)/1.45 var(--os-ui, system-ui), sans-serif;
1252
1306
  background: var(--panel-1, color-mix(in oklab, var(--fg) 5%, transparent));
1253
1307
  color: var(--fg);
1254
1308
  border: 1px solid color-mix(in oklab, var(--fg) 14%, transparent);
1255
1309
  border-radius: var(--r-0);
1256
- padding: 8px 10px;
1310
+ padding: var(--space-2) var(--space-2-5);
1257
1311
  resize: none;
1258
1312
  outline: none;
1259
1313
  width: 100%;
@@ -1273,7 +1327,7 @@ html.ds-247420 { touch-action: pan-x pan-y; overscroll-behavior: none; -webkit-t
1273
1327
  .ds-247420 .chat-composer-toolbar {
1274
1328
  display: flex;
1275
1329
  align-items: center;
1276
- gap: 4px;
1330
+ gap: var(--space-1);
1277
1331
  }
1278
1332
  .ds-247420 .composer-btn {
1279
1333
  all: unset;
@@ -1305,7 +1359,7 @@ html.ds-247420 { touch-action: pan-x pan-y; overscroll-behavior: none; -webkit-t
1305
1359
  height: 32px;
1306
1360
  border-radius: var(--r-0);
1307
1361
  background: var(--os-accent, #247420);
1308
- color: var(--on-color, #fff);
1362
+ color: var(--on-color);
1309
1363
  display: inline-flex;
1310
1364
  align-items: center;
1311
1365
  justify-content: center;
@@ -1334,7 +1388,7 @@ html.ds-247420 { touch-action: pan-x pan-y; overscroll-behavior: none; -webkit-t
1334
1388
 
1335
1389
  .ds-247420 .aicat-face {
1336
1390
  font-family: var(--os-mono, ui-monospace, monospace);
1337
- font-size: 11px;
1391
+ font-size: var(--fs-nano);
1338
1392
  line-height: 1.2;
1339
1393
  margin: 0;
1340
1394
  }
@@ -1344,13 +1398,13 @@ html.ds-247420 { touch-action: pan-x pan-y; overscroll-behavior: none; -webkit-t
1344
1398
  .ds-247420 .gm-recall-hits {
1345
1399
  display: flex;
1346
1400
  flex-direction: column;
1347
- gap: 6px;
1348
- margin: 8px 0;
1401
+ gap: var(--space-1-75);
1402
+ margin: var(--space-2) 0;
1349
1403
  }
1350
1404
  .ds-247420 .gm-recall-hit {
1351
1405
  border: 1px solid color-mix(in oklab, var(--fg) 14%, transparent);
1352
1406
  border-radius: var(--r-0);
1353
- padding: 8px 10px;
1407
+ padding: var(--space-2) var(--space-2-5);
1354
1408
  background: color-mix(in oklab, var(--bg) 92%, var(--fg) 2%);
1355
1409
  }
1356
1410
  .ds-247420 .gm-recall-hit.is-pruned {
@@ -1359,12 +1413,12 @@ html.ds-247420 { touch-action: pan-x pan-y; overscroll-behavior: none; -webkit-t
1359
1413
  }
1360
1414
  .ds-247420 .gm-recall-meta {
1361
1415
  font-family: var(--os-mono, ui-monospace, monospace);
1362
- font-size: 11px;
1416
+ font-size: var(--fs-nano);
1363
1417
  color: color-mix(in oklab, var(--fg) 60%, transparent);
1364
- margin-bottom: 4px;
1418
+ margin-bottom: var(--space-1);
1365
1419
  }
1366
1420
  .ds-247420 .gm-recall-text {
1367
- font-size: 13px;
1421
+ font-size: var(--fs-tiny);
1368
1422
  line-height: 1.4;
1369
1423
  white-space: pre-wrap;
1370
1424
  word-break: break-word;
@@ -1372,21 +1426,26 @@ html.ds-247420 { touch-action: pan-x pan-y; overscroll-behavior: none; -webkit-t
1372
1426
  .ds-247420 .gm-recall-acts {
1373
1427
  display: flex;
1374
1428
  justify-content: flex-end;
1375
- margin-top: 6px;
1429
+ margin-top: var(--space-1-75);
1376
1430
  }
1377
1431
  .ds-247420 .gm-recall-forget {
1378
- font-size: 11px;
1379
- padding: 2px 8px;
1432
+ font-size: var(--fs-nano);
1433
+ padding: var(--space-hair) var(--space-2);
1380
1434
  }
1381
1435
 
1382
1436
  /* ============================================================
1383
1437
  * thebird RESPONSIVE PERFECTION layer (desk / tablet / mobile).
1384
- * Appended LAST so .ds-247420-scoped rules here win source order over the
1385
- * earlier brand overrides (.ds-247420 .wm-root{inset:0!important} at the
1386
- * "bars overlay" block, .ds-247420 .wm-bar{height:34px!important}, the
1387
- * unconditional .ds-247420 .os-instances{display:flex}) that were silently
1388
- * defeating the @media(max-width:767px)/(768-1023px) contracts. Every rule
1389
- * below is a measured fix for a confirmed responsive-audit finding.
1438
+ * Appended LAST so the .ds-247420-scoped rules here win by SOURCE ORDER at
1439
+ * equal (0,2,0) specificity over the earlier brand overrides
1440
+ * (.ds-247420 .wm-root{inset:0} at the "bars overlay" block,
1441
+ * .ds-247420 .wm-bar{height:34px}, the unconditional
1442
+ * .ds-247420 .os-instances{display:flex}) that were silently defeating the
1443
+ * @media(max-width:767px)/(768-1023px) contracts. Every rule below is a
1444
+ * measured fix for a confirmed responsive-audit finding.
1445
+ *
1446
+ * Because every competing rule is now equally scoped, source order alone
1447
+ * decides — so this layer needs no !important except where it must beat
1448
+ * wm.css's own !important declarations or wm.js's inline styles.
1390
1449
  *
1391
1450
  * View classes: desktop >1023px (free-float windows, full menubar);
1392
1451
  * tablet 768..1023px (side-rail, wm-root left-offset); mobile <=767px AND
@@ -1399,6 +1458,9 @@ html.ds-247420 { touch-action: pan-x pan-y; overscroll-behavior: none; -webkit-t
1399
1458
  * layer pinned --os-bar-h-mobile to 34px which left no room for 44px tap
1400
1459
  * targets in the bar. Restore 52px on mobile/touch. --- */
1401
1460
  @media (max-width: 767px), (max-height: 500px) and (orientation: landscape) {
1461
+ /* LOAD-BEARING !important: same reason as the brand block's --os-bar-h —
1462
+ * `:root[data-density="…"]` redefines --os-bar-h at (0,2,0), higher than
1463
+ * this (0,1,0) class rule on the same <html> element. */
1402
1464
  .ds-247420 { --os-bar-h-mobile: 52px !important; --os-bar-h: 52px !important; }
1403
1465
  }
1404
1466
 
@@ -1409,55 +1471,68 @@ html.ds-247420 { touch-action: pan-x pan-y; overscroll-behavior: none; -webkit-t
1409
1471
  * specificity so windows sit BETWEEN the bars. --- */
1410
1472
  @media (max-width: 767px), (max-height: 500px) and (orientation: landscape) {
1411
1473
  .ds-247420 .wm-root {
1412
- top: calc(var(--os-bar-h) + env(safe-area-inset-top, 0px)) !important;
1413
- bottom: calc(var(--os-bar-h) + env(safe-area-inset-bottom, 0px)) !important;
1414
1474
  inset: calc(var(--os-bar-h) + env(safe-area-inset-top, 0px)) 0
1415
- calc(var(--os-bar-h) + env(safe-area-inset-bottom, 0px)) 0 !important;
1475
+ calc(var(--os-bar-h) + env(safe-area-inset-bottom, 0px)) 0;
1416
1476
  }
1477
+ /* LOAD-BEARING !important on the geometry four: wm.css's mobile band
1478
+ * (wm.css:157-165) declares left/top/width/height with !important, and
1479
+ * wm.js writes left/top/width/height as INLINE styles during drag/resize.
1480
+ * Neither can be beaten by specificity — only by !important. The remaining
1481
+ * properties here need no flag. */
1417
1482
  .ds-247420 .wm-win {
1418
- position: absolute !important;
1483
+ position: absolute;
1419
1484
  left: 0 !important; top: 0 !important;
1420
1485
  width: 100% !important; height: 100% !important;
1421
- border: none !important; border-radius: 0 !important; box-shadow: none !important;
1486
+ border: none;
1487
+ /* bare 0: full-screen window has square corners (not --r-0's 4px) */
1488
+ border-radius: 0;
1489
+ box-shadow: none;
1422
1490
  }
1423
- /* titlebar must host a 44px close button -> 44px bar (beats the 34px brand clamp) */
1491
+ /* titlebar must host a 44px close button -> 44px bar (beats the 34px brand
1492
+ * clamp by later source order at equal specificity) */
1424
1493
  .ds-247420 .wm-bar {
1425
- height: 44px !important; min-height: 44px !important;
1426
- padding: 0 10px !important; align-items: center !important;
1494
+ height: 44px; min-height: 44px;
1495
+ padding: 0 var(--space-2-5); align-items: center;
1427
1496
  pointer-events: none;
1428
1497
  }
1429
1498
  .ds-247420 .wm-bar .wm-title { pointer-events: auto; }
1430
1499
  .ds-247420 .wm-bar .wm-btns { pointer-events: auto; }
1431
1500
  /* hide min+max on mobile full-screen; keep close at 44x44 fully inside the bar */
1432
1501
  .ds-247420 .wm-btns .wm-btn:nth-child(1),
1433
- .ds-247420 .wm-btns .wm-btn:nth-child(2) { display: none !important; }
1502
+ .ds-247420 .wm-btns .wm-btn:nth-child(2) { display: none; }
1503
+ /* LOAD-BEARING !important on width/height: wm.css's `@media (pointer:coarse)`
1504
+ * sets `.wm-btn{min-width:44px;min-height:44px}` and this must also beat the
1505
+ * (0,3,0) `.ds-247420 .wm-btns .wm-btn` coarse-pointer rule below, which is
1506
+ * later in source order. Colors/radius need no flag. */
1434
1507
  .ds-247420 .wm-btns .wm-btn:nth-child(3) {
1435
1508
  width: 44px !important; height: 44px !important;
1436
- border-radius: var(--r-1, 6px) !important;
1437
- background: var(--os-bg-3) !important; color: var(--os-fg) !important;
1509
+ border-radius: var(--r-1);
1510
+ background: var(--os-bg-3); color: var(--os-fg);
1438
1511
  }
1439
- .ds-247420 .wm-resize, .ds-247420 .wm-edge { display: none !important; }
1440
- /* collapse the menubar workspace cluster on mobile (the unconditional
1441
- * .ds-247420 .os-instances{display:flex} otherwise leaves it visible) */
1512
+ .ds-247420 .wm-resize, .ds-247420 .wm-edge { display: none; }
1513
+ /* collapse the menubar workspace cluster on mobile. `.os-menubar
1514
+ * .os-instances` is (0,3,0) here, beating the unconditional (0,2,0)
1515
+ * `.ds-247420 .os-instances{display:flex}` on specificity. */
1442
1516
  .ds-247420 .os-menubar .os-instances,
1443
- .ds-247420 .os-instances { display: none !important; }
1517
+ .ds-247420 .os-instances { display: none; }
1444
1518
  .ds-247420 .os-menubar [data-role="add"],
1445
- .ds-247420 .tb-sess-add { display: none !important; }
1519
+ .ds-247420 .tb-sess-add { display: none; }
1446
1520
  }
1447
1521
 
1448
1522
  /* --- landscape-phone (short + wide + touch): also hide the side-rail that the
1449
1523
  * 768-1023 tablet band would otherwise show, and force the mobile menubar. --- */
1450
1524
  @media (max-height: 500px) and (orientation: landscape) and (pointer: coarse) {
1451
- .ds-247420 .os-side-rail { display: none !important; }
1525
+ .ds-247420 .os-side-rail { display: none; }
1452
1526
  }
1453
1527
 
1454
1528
  /* --- tablet (768..1023): the side-rail offset for .wm-root was defeated by
1455
- * the scoped inset:0; re-assert it at scoped specificity using the inset
1456
- * shorthand so it actually wins. --- */
1529
+ * the scoped inset:0; re-asserted here at equal (0,2,0) specificity but later
1530
+ * source order, which is enough now that the earlier rule is also scoped.
1531
+ * `inset` alone carries the left offset — the separate `left` declaration it
1532
+ * used to be paired with was redundant with this shorthand. --- */
1457
1533
  @media (min-width: 768px) and (max-width: 1023px) {
1458
1534
  .ds-247420 .wm-root {
1459
- left: var(--os-rail-w) !important;
1460
- inset: 0 0 0 var(--os-rail-w) !important;
1535
+ inset: 0 0 0 var(--os-rail-w);
1461
1536
  }
1462
1537
  }
1463
1538
 
@@ -1471,7 +1546,7 @@ html.ds-247420 { touch-action: pan-x pan-y; overscroll-behavior: none; -webkit-t
1471
1546
  /* taskbar tasks (also widen and snap on the whole touch band, not mobile-only) */
1472
1547
  .ds-247420 .os-task {
1473
1548
  min-height: var(--os-tap, 44px); min-width: 120px;
1474
- padding: 10px 14px; scroll-snap-align: start;
1549
+ padding: var(--space-2-5) 14px; scroll-snap-align: start;
1475
1550
  }
1476
1551
  .ds-247420 .os-taskbar { scroll-snap-type: x proximity; }
1477
1552
  /* menubar workspace controls (when shown on tablet) */
@@ -1513,4 +1588,5 @@ html.ds-247420 { touch-action: pan-x pan-y; overscroll-behavior: none; -webkit-t
1513
1588
 
1514
1589
  /* --- browser-pane: the generic .app-pane 16px prose padding stranded the
1515
1590
  * iframe 16px on every side; the browser pane is full-bleed. --- */
1516
- .ds-247420 .app-pane.browser-app { padding: 0 !important; }
1591
+ /* (0,3,0) beats the generic `.app-pane` (0,1,0) prose padding on specificity. */
1592
+ .ds-247420 .app-pane.browser-app { padding: 0; }