@liberation-data/desk 0.4.0 → 0.7.0

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 (46) hide show
  1. package/README.md +63 -2
  2. package/dist/core/desk.d.ts +13 -0
  3. package/dist/core/desk.d.ts.map +1 -1
  4. package/dist/core/desk.js +55 -1
  5. package/dist/core/desk.js.map +1 -1
  6. package/dist/core/index.d.ts +2 -2
  7. package/dist/core/index.d.ts.map +1 -1
  8. package/dist/core/types.d.ts +7 -0
  9. package/dist/core/types.d.ts.map +1 -1
  10. package/dist/css/apps.css +57 -0
  11. package/dist/css/controls.css +975 -0
  12. package/dist/css/conversation.css +232 -0
  13. package/dist/css/dock.css +272 -0
  14. package/dist/css/menus.css +204 -0
  15. package/dist/css/overlays.css +237 -0
  16. package/dist/css/search.css +149 -0
  17. package/dist/css/setup.css +284 -0
  18. package/dist/css/tokens.css +90 -0
  19. package/dist/css/windows.css +321 -0
  20. package/dist/desk.css +1080 -1070
  21. package/dist/react/Desktop.d.ts +9 -2
  22. package/dist/react/Desktop.d.ts.map +1 -1
  23. package/dist/react/Desktop.js +85 -23
  24. package/dist/react/Desktop.js.map +1 -1
  25. package/dist/react/appFrame.d.ts +9 -2
  26. package/dist/react/appFrame.d.ts.map +1 -1
  27. package/dist/react/appFrame.js +26 -5
  28. package/dist/react/appFrame.js.map +1 -1
  29. package/llms.txt +12 -1
  30. package/package.json +4 -3
  31. package/src/core/desk.ts +67 -1
  32. package/src/core/index.ts +2 -1
  33. package/src/core/types.ts +8 -0
  34. package/src/css/apps.css +56 -0
  35. package/src/css/controls.css +974 -0
  36. package/src/css/conversation.css +231 -0
  37. package/src/css/dock.css +271 -0
  38. package/src/css/menus.css +203 -0
  39. package/src/css/overlays.css +236 -0
  40. package/src/css/search.css +148 -0
  41. package/src/css/setup.css +283 -0
  42. package/src/css/tokens.css +89 -0
  43. package/src/css/windows.css +320 -0
  44. package/src/react/Desktop.tsx +97 -26
  45. package/src/react/appFrame.tsx +48 -5
  46. package/src/desk.css +0 -2820
package/src/desk.css DELETED
@@ -1,2820 +0,0 @@
1
- /*
2
- * desk — the stage and its windows. Every value reads a --desk-* token, so an
3
- * app restyles the desk by redefining tokens, never by overriding selectors.
4
- */
5
- :root {
6
- --desk-ground: #eef0f4;
7
- --desk-surface: #ffffff;
8
- --desk-titlebar: #f6f7f9;
9
- --desk-ink: #1b1f27;
10
- --desk-muted: #667085;
11
- --desk-rule: #dde1e8;
12
- --desk-accent: #5b57f5;
13
- --desk-close: #ef6b63;
14
- --desk-mode: #34c47a;
15
- --desk-info: #34c47a;
16
- --desk-radius: 12px;
17
- --desk-gap: 12px;
18
- --desk-padding: 12px;
19
- --desk-shadow: 0 1px 2px rgb(16 24 40 / 6%), 0 12px 32px rgb(16 24 40 / 10%);
20
- --desk-shadow-floating: 0 2px 4px rgb(16 24 40 / 8%), 0 24px 60px rgb(16 24 40 / 22%);
21
- --desk-font: system-ui, -apple-system, "Segoe UI", sans-serif;
22
- --desk-font-mono: ui-monospace, "SF Mono", SFMono-Regular, Menlo, Consolas, monospace;
23
-
24
- /* The spacing scale (HIG.md §2). Nothing between these values. */
25
- --desk-space-1: 4px;
26
- --desk-space-2: 8px;
27
- --desk-space-3: 12px;
28
- --desk-space-4: 16px;
29
- --desk-space-5: 24px;
30
- --desk-space-6: 32px;
31
- --desk-space-7: 48px;
32
-
33
- /* State, kept apart from the accent. */
34
- --desk-ok: #2f9e68;
35
- --desk-warn: #b7791f;
36
- --desk-bad: #c6483f;
37
-
38
- --desk-control-height: 28px;
39
- --desk-control-height-small: 22px;
40
- --desk-control-radius: 7px;
41
- --desk-field-bg: #ffffff;
42
- --desk-on-accent: #ffffff;
43
- --desk-ease: cubic-bezier(.32, .72, 0, 1);
44
- --desk-dock-size: 48px;
45
- --desk-dock-glass: rgb(255 255 255 / 72%);
46
- --desk-dock-icon: linear-gradient(160deg, #ffffff, #eceff5);
47
- --desk-badge: #ef4444;
48
- --desk-badge-ink: #ffffff;
49
- /* Room the stage leaves at the bottom for an overlay dock. */
50
- --desk-inset-bottom: 0px;
51
- }
52
-
53
- @media (prefers-color-scheme: dark) {
54
- :root:not([data-theme="light"]) {
55
- --desk-ground: #07090f;
56
- --desk-surface: #101828;
57
- --desk-titlebar: #0b111d;
58
- --desk-ink: #e6e6e6;
59
- --desk-muted: #99a1af;
60
- --desk-rule: #1e2939;
61
- --desk-shadow: 0 12px 32px rgb(0 0 0 / 45%);
62
- --desk-shadow-floating: 0 30px 80px rgb(0 0 0 / 70%);
63
- --desk-dock-glass: rgb(11 18 32 / 62%);
64
- --desk-dock-icon: linear-gradient(160deg, #1a2338, #0e1526);
65
- --desk-ok: #3ecf8e;
66
- --desk-info: #3ecf8e;
67
- --desk-warn: #fbbf24;
68
- --desk-bad: #f87171;
69
- --desk-field-bg: rgb(0 0 0 / 35%);
70
- }
71
- }
72
-
73
- :root[data-theme="dark"] {
74
- --desk-ground: #07090f;
75
- --desk-surface: #101828;
76
- --desk-titlebar: #0b111d;
77
- --desk-ink: #e6e6e6;
78
- --desk-muted: #99a1af;
79
- --desk-rule: #1e2939;
80
- --desk-shadow: 0 12px 32px rgb(0 0 0 / 45%);
81
- --desk-shadow-floating: 0 30px 80px rgb(0 0 0 / 70%);
82
- --desk-dock-glass: rgb(11 18 32 / 62%);
83
- --desk-dock-icon: linear-gradient(160deg, #1a2338, #0e1526);
84
- --desk-ok: #3ecf8e;
85
- --desk-info: #3ecf8e;
86
- --desk-warn: #fbbf24;
87
- --desk-bad: #f87171;
88
- --desk-field-bg: rgb(0 0 0 / 35%);
89
- }
90
-
91
- .desk-stage {
92
- position: relative;
93
- box-sizing: border-box;
94
- height: 100%;
95
- min-height: 0;
96
- padding: var(--desk-padding);
97
- padding-bottom: calc(var(--desk-padding) + var(--desk-inset-bottom));
98
- display: grid;
99
- grid-template: minmax(0, 1fr) / minmax(0, 1fr);
100
- gap: var(--desk-gap);
101
- overflow: hidden;
102
- background: var(--desk-ground);
103
- color: var(--desk-ink);
104
- font-family: var(--desk-font);
105
- }
106
-
107
- .desk-window {
108
- /* Filled windows fill the stage inside its padding, layered in the order they were used. */
109
- position: absolute;
110
- top: var(--desk-padding);
111
- right: var(--desk-padding);
112
- bottom: calc(var(--desk-padding) + var(--desk-inset-bottom));
113
- left: var(--desk-padding);
114
- box-sizing: border-box;
115
- min-width: 0;
116
- min-height: 0;
117
- display: flex;
118
- flex-direction: column;
119
- background: var(--desk-surface);
120
- border: 1px solid var(--desk-rule);
121
- border-radius: var(--desk-radius);
122
- box-shadow: var(--desk-shadow);
123
- overflow: hidden;
124
- transition: border-color .15s var(--desk-ease), box-shadow .15s var(--desk-ease);
125
- }
126
-
127
- .desk-window:focus {
128
- /* The key window is already marked by its border; a ring on the whole window would be noise. */
129
- outline: none;
130
- }
131
-
132
- .desk-window[data-focused] {
133
- border-color: color-mix(in srgb, var(--desk-accent) 45%, var(--desk-rule));
134
- }
135
-
136
- .desk-window[data-hidden] {
137
- display: none;
138
- }
139
-
140
- /* One window at a time: it fills the stage, and the zoom control is not offered. */
141
- .desk-stage[data-layout="fullscreen"] .desk-window {
142
- position: static;
143
- inset: auto;
144
- grid-area: 1 / 1;
145
- }
146
-
147
- .desk-window[data-mode="floating"] {
148
- right: auto;
149
- bottom: auto;
150
- box-shadow: var(--desk-shadow-floating);
151
- }
152
-
153
- .desk-window[data-dragging] {
154
- transition: none;
155
- user-select: none;
156
- }
157
-
158
- .desk-titlebar {
159
- flex: none;
160
- display: flex;
161
- align-items: center;
162
- gap: 10px;
163
- padding: 8px 12px;
164
- background: var(--desk-titlebar);
165
- border-bottom: 1px solid var(--desk-rule);
166
- user-select: none;
167
- }
168
-
169
- .desk-titlebar[data-draggable] {
170
- cursor: grab;
171
- touch-action: none;
172
- }
173
-
174
- .desk-window[data-dragging] .desk-titlebar {
175
- cursor: grabbing;
176
- }
177
-
178
- .desk-controls {
179
- display: flex;
180
- gap: 7px;
181
- }
182
-
183
- .desk-control {
184
- width: 12px;
185
- height: 12px;
186
- padding: 0;
187
- border: 0;
188
- border-radius: 50%;
189
- cursor: pointer;
190
- background: var(--desk-rule);
191
- }
192
-
193
- .desk-window[data-focused] .desk-control[data-control="close"],
194
- .desk-control[data-control="close"]:hover {
195
- background: var(--desk-close);
196
- }
197
-
198
- .desk-window[data-focused] .desk-control[data-control="mode"],
199
- .desk-control[data-control="mode"]:hover {
200
- background: var(--desk-mode);
201
- }
202
-
203
- .desk-control:focus-visible {
204
- outline: 2px solid var(--desk-accent);
205
- outline-offset: 2px;
206
- }
207
-
208
- .desk-title {
209
- margin: 0;
210
- min-width: 0;
211
- overflow: hidden;
212
- text-overflow: ellipsis;
213
- white-space: nowrap;
214
- font-size: 13px;
215
- font-weight: 600;
216
- }
217
-
218
- .desk-window:not([data-focused]) .desk-title {
219
- color: var(--desk-muted);
220
- }
221
-
222
- .desk-window-note {
223
- margin: 0 0 0 auto;
224
- min-width: 0;
225
- /* The title is what the window IS; the note is what it is looking at. In a narrow window the note
226
- gives up its room first, and is cut before the title is. */
227
- flex: 0 999 auto;
228
- overflow: hidden;
229
- text-overflow: ellipsis;
230
- white-space: nowrap;
231
- font-size: 11.5px;
232
- color: var(--desk-muted);
233
- }
234
-
235
- /* The note gives up the spare room; the (i) keeps its place at the end of the bar. */
236
- .desk-window-note + .desk-window-info {
237
- margin-left: var(--desk-space-2);
238
- }
239
-
240
- .desk-window-info {
241
- margin-left: auto;
242
- }
243
-
244
- .desk-window-note ~ .desk-window-info {
245
- margin-left: var(--desk-space-2);
246
- }
247
-
248
- .desk-window-info + .desk-window-actions,
249
- .desk-window-note + .desk-window-actions {
250
- margin-left: var(--desk-space-1);
251
- }
252
-
253
- .desk-window-actions {
254
- margin-left: auto;
255
- display: flex;
256
- align-items: center;
257
- gap: var(--desk-space-1);
258
- }
259
-
260
- .desk-body {
261
- flex: 1;
262
- min-height: 0;
263
- overflow: auto;
264
- }
265
-
266
- .desk-window-status {
267
- box-sizing: border-box;
268
- height: 100%;
269
- min-height: 120px;
270
- display: flex;
271
- flex-direction: column;
272
- align-items: center;
273
- justify-content: center;
274
- gap: var(--desk-space-2);
275
- padding: var(--desk-space-4);
276
- text-align: center;
277
- color: var(--desk-muted);
278
- font-size: 13px;
279
- }
280
-
281
- .desk-window-status b {
282
- color: var(--desk-ink);
283
- font-weight: 600;
284
- }
285
-
286
- .desk-window-status-detail {
287
- max-width: 40ch;
288
- font-size: 12px;
289
- }
290
-
291
- /* Edges a window resizes from. Inside the window, so nothing clips them. */
292
- .desk-edge {
293
- position: absolute;
294
- touch-action: none;
295
- }
296
-
297
- .desk-edge[data-edge="left"],
298
- .desk-edge[data-edge="right"] {
299
- top: 0;
300
- bottom: 0;
301
- width: 5px;
302
- cursor: ew-resize;
303
- }
304
-
305
- .desk-edge[data-edge="left"] {
306
- left: 0;
307
- }
308
-
309
- .desk-edge[data-edge="right"] {
310
- right: 0;
311
- }
312
-
313
- .desk-edge[data-edge="bottom"] {
314
- left: 0;
315
- right: 0;
316
- bottom: 0;
317
- height: 5px;
318
- cursor: ns-resize;
319
- }
320
-
321
- .desk-grip {
322
- position: absolute;
323
- right: 0;
324
- bottom: 0;
325
- width: 16px;
326
- height: 16px;
327
- cursor: nwse-resize;
328
- touch-action: none;
329
- }
330
-
331
- /* Where a dragged window would land if it were dropped now. */
332
- .desk-stage[data-snap]::after {
333
- content: "";
334
- position: absolute;
335
- top: var(--desk-padding);
336
- bottom: calc(var(--desk-padding) + var(--desk-inset-bottom));
337
- width: calc(50% - var(--desk-padding) - var(--desk-gap) / 2);
338
- border: 2px solid var(--desk-accent);
339
- border-radius: var(--desk-radius);
340
- background: color-mix(in srgb, var(--desk-accent) 14%, transparent);
341
- pointer-events: none;
342
- z-index: 5;
343
- }
344
-
345
- .desk-stage[data-snap="start"]::after {
346
- left: var(--desk-padding);
347
- }
348
-
349
- .desk-stage[data-snap="end"]::after {
350
- right: var(--desk-padding);
351
- }
352
-
353
- /* ── Dock ── */
354
-
355
- .desk-dock {
356
- box-sizing: border-box;
357
- display: flex;
358
- align-items: flex-end;
359
- gap: 6px;
360
- padding: 7px 9px;
361
- max-width: calc(100% - 24px);
362
- border-radius: 20px;
363
- background: var(--desk-dock-glass);
364
- backdrop-filter: blur(28px) saturate(170%);
365
- -webkit-backdrop-filter: blur(28px) saturate(170%);
366
- border: 1px solid var(--desk-rule);
367
- box-shadow: var(--desk-shadow-floating);
368
- font-family: var(--desk-font);
369
- color: var(--desk-ink);
370
- }
371
-
372
- .desk-dock[data-placement="overlay"] {
373
- position: absolute;
374
- left: 50%;
375
- bottom: 12px;
376
- z-index: 1000;
377
- transform: translateX(-50%);
378
- }
379
-
380
- .desk-dock-separator {
381
- flex: none;
382
- align-self: stretch;
383
- width: 1px;
384
- margin: 6px 4px;
385
- background: var(--desk-rule);
386
- }
387
-
388
- .desk-dock-slot {
389
- position: relative;
390
- display: flex;
391
- }
392
-
393
- .desk-dock-item {
394
- position: relative;
395
- flex: none;
396
- width: var(--desk-dock-size);
397
- height: var(--desk-dock-size);
398
- padding: 0;
399
- display: grid;
400
- place-items: center;
401
- border: 1px solid var(--desk-rule);
402
- border-radius: calc(var(--desk-dock-size) / 4);
403
- background: var(--desk-dock-icon);
404
- color: var(--desk-ink);
405
- cursor: pointer;
406
- transition: transform .18s var(--desk-ease), margin .18s var(--desk-ease);
407
- }
408
-
409
- .desk-dock-item:disabled,
410
- .desk-dock-item[aria-disabled="true"] {
411
- opacity: .45;
412
- cursor: not-allowed;
413
- }
414
-
415
- .desk-dock-item:focus-visible,
416
- .desk-stack-item:focus-visible {
417
- outline: 2px solid var(--desk-accent);
418
- outline-offset: 2px;
419
- }
420
-
421
- @media (hover: hover) and (pointer: fine) {
422
- .desk-dock-item:hover:not(:disabled) {
423
- transform: translateY(-8px) scale(1.14);
424
- margin: 0 5px;
425
- }
426
- }
427
-
428
- .desk-dock-icon {
429
- position: relative;
430
- display: grid;
431
- place-items: center;
432
- width: 46%;
433
- height: 46%;
434
- }
435
-
436
- .desk-dock-icon > svg {
437
- width: 100%;
438
- height: 100%;
439
- }
440
-
441
- .desk-dock-item[data-stack] .desk-dock-icon {
442
- width: 72%;
443
- height: 72%;
444
- }
445
-
446
- .desk-dock-preview {
447
- width: 100%;
448
- height: 100%;
449
- display: grid;
450
- grid-template-columns: 1fr 1fr;
451
- gap: 3px;
452
- }
453
-
454
- .desk-dock-preview > span {
455
- display: grid;
456
- place-items: center;
457
- padding: 3px;
458
- border-radius: 4px;
459
- background: color-mix(in srgb, var(--desk-ink) 10%, transparent);
460
- color: var(--desk-muted);
461
- }
462
-
463
- .desk-dock-preview svg {
464
- width: 100%;
465
- height: 100%;
466
- }
467
-
468
- /* A dot for "a window is open", brighter when it has focus. */
469
- .desk-dock-item[data-running]::after {
470
- content: "";
471
- position: absolute;
472
- left: 50%;
473
- bottom: -6px;
474
- width: 4px;
475
- height: 4px;
476
- margin-left: -2px;
477
- border-radius: 50%;
478
- background: var(--desk-muted);
479
- }
480
-
481
- .desk-dock-item[data-focused]::after {
482
- background: var(--desk-accent);
483
- }
484
-
485
- .desk-dock-badge {
486
- position: absolute;
487
- top: -5px;
488
- right: -5px;
489
- min-width: 18px;
490
- height: 18px;
491
- padding: 0 5px;
492
- box-sizing: border-box;
493
- display: grid;
494
- place-items: center;
495
- border-radius: 9px;
496
- border: 2px solid var(--desk-surface);
497
- background: var(--desk-badge);
498
- color: var(--desk-badge-ink);
499
- font-size: 10px;
500
- font-weight: 700;
501
- font-variant-numeric: tabular-nums;
502
- line-height: 1;
503
- }
504
-
505
- .desk-dock-tip {
506
- position: absolute;
507
- bottom: calc(100% + 14px);
508
- left: 50%;
509
- transform: translateX(-50%);
510
- padding: 3px 9px;
511
- border-radius: 6px;
512
- border: 1px solid var(--desk-rule);
513
- background: var(--desk-surface);
514
- color: var(--desk-ink);
515
- font-size: 12px;
516
- white-space: nowrap;
517
- pointer-events: none;
518
- opacity: 0;
519
- transition: opacity .12s;
520
- }
521
-
522
- .desk-dock-item:hover .desk-dock-tip,
523
- .desk-dock-item:focus-visible .desk-dock-tip {
524
- opacity: 1;
525
- }
526
-
527
- .desk-dock-item[aria-expanded="true"] .desk-dock-tip {
528
- opacity: 0;
529
- }
530
-
531
- /* ── Stack: a dock folder, fanned out ── */
532
-
533
- .desk-stack {
534
- position: absolute;
535
- bottom: calc(100% + 18px);
536
- left: 50%;
537
- transform: translateX(-50%);
538
- box-sizing: border-box;
539
- width: max-content;
540
- max-width: min(420px, calc(100vw - 32px));
541
- padding: 12px;
542
- border-radius: 18px;
543
- border: 1px solid var(--desk-rule);
544
- /* It carries labels, so it needs a surface behind them: glass alone let the window under it read through. */
545
- background: var(--desk-surface);
546
- backdrop-filter: blur(30px) saturate(160%);
547
- -webkit-backdrop-filter: blur(30px) saturate(160%);
548
- box-shadow: var(--desk-shadow-floating);
549
- animation: desk-pop .18s var(--desk-ease);
550
- }
551
-
552
- @keyframes desk-pop {
553
- from {
554
- opacity: 0;
555
- transform: translateX(-50%) translateY(6px) scale(.98);
556
- }
557
- }
558
-
559
- .desk-stack-title {
560
- margin: 0 0 8px 4px;
561
- font-size: 11px;
562
- font-weight: 700;
563
- letter-spacing: .08em;
564
- text-transform: uppercase;
565
- color: var(--desk-muted);
566
- }
567
-
568
- .desk-stack-grid {
569
- display: grid;
570
- grid-template-columns: repeat(auto-fill, minmax(92px, 1fr));
571
- width: min(380px, calc(100vw - 56px));
572
- gap: 6px;
573
- }
574
-
575
- .desk-stack-item {
576
- display: flex;
577
- flex-direction: column;
578
- align-items: center;
579
- gap: 5px;
580
- padding: 8px 4px;
581
- border: 0;
582
- border-radius: 11px;
583
- background: none;
584
- color: inherit;
585
- font: inherit;
586
- text-align: center;
587
- cursor: pointer;
588
- }
589
-
590
- .desk-stack-item:hover:not(:disabled) {
591
- background: color-mix(in srgb, var(--desk-ink) 7%, transparent);
592
- }
593
-
594
- .desk-stack-item .desk-dock-icon {
595
- width: 40px;
596
- height: 40px;
597
- padding: 10px;
598
- box-sizing: border-box;
599
- border-radius: 10px;
600
- border: 1px solid var(--desk-rule);
601
- background: var(--desk-dock-icon);
602
- }
603
-
604
- .desk-stack-label {
605
- font-size: 12px;
606
- font-weight: 560;
607
- }
608
-
609
- .desk-stack-description {
610
- font-size: 10.5px;
611
- line-height: 1.3;
612
- color: var(--desk-muted);
613
- }
614
-
615
- /* ── Menu bar ── */
616
-
617
- .desk-menubar {
618
- position: relative;
619
- z-index: 1100;
620
- box-sizing: border-box;
621
- display: flex;
622
- align-items: center;
623
- gap: 2px;
624
- height: 30px;
625
- padding: 0 10px;
626
- background: var(--desk-dock-glass);
627
- backdrop-filter: blur(24px) saturate(160%);
628
- -webkit-backdrop-filter: blur(24px) saturate(160%);
629
- border-bottom: 1px solid var(--desk-rule);
630
- color: var(--desk-ink);
631
- font-family: var(--desk-font);
632
- font-size: 13px;
633
- user-select: none;
634
- }
635
-
636
- .desk-menubar-leading,
637
- .desk-menubar-trailing {
638
- display: flex;
639
- align-items: center;
640
- gap: 8px;
641
- padding: 0 6px;
642
- }
643
-
644
- .desk-menubar-leading {
645
- font-weight: 700;
646
- }
647
-
648
- .desk-menubar-trailing {
649
- color: var(--desk-muted);
650
- font-size: 12px;
651
- font-variant-numeric: tabular-nums;
652
- }
653
-
654
- .desk-menubar-spacer {
655
- flex: 1;
656
- }
657
-
658
- .desk-menubar-slot {
659
- position: relative;
660
- }
661
-
662
- .desk-menubar-title {
663
- display: flex;
664
- align-items: center;
665
- gap: 6px;
666
- height: 22px;
667
- padding: 0 9px;
668
- border: 0;
669
- border-radius: 6px;
670
- background: none;
671
- color: inherit;
672
- font: inherit;
673
- white-space: nowrap;
674
- cursor: default;
675
- }
676
-
677
- .desk-menubar-title[data-emphasis] {
678
- font-weight: 700;
679
- }
680
-
681
- .desk-menubar-title:hover,
682
- .desk-menubar-title[aria-expanded="true"] {
683
- background: color-mix(in srgb, var(--desk-ink) 12%, transparent);
684
- }
685
-
686
- .desk-menubar-title:focus-visible {
687
- outline: 2px solid var(--desk-accent);
688
- outline-offset: -2px;
689
- }
690
-
691
- .desk-menubar-title svg {
692
- width: 15px;
693
- height: 15px;
694
- }
695
-
696
- /* A context menu is the same menu, opened where the pointer is rather than under a title. */
697
- .desk-context-menu {
698
- position: fixed;
699
- z-index: 1300;
700
- outline: none;
701
- }
702
-
703
- .desk-menubar-slot[data-align="end"] .desk-menu {
704
- left: auto;
705
- right: 0;
706
- }
707
-
708
- .desk-menu {
709
- position: absolute;
710
- top: calc(100% + 4px);
711
- left: 0;
712
- box-sizing: border-box;
713
- min-width: 220px;
714
- max-width: min(360px, calc(100vw - 24px));
715
- padding: 5px;
716
- border-radius: 10px;
717
- border: 1px solid var(--desk-rule);
718
- /* Opaque, like every other popup. A menu sits inside the menu bar's own backdrop blur, and a nested
719
- backdrop-filter does not blur what is behind the bar, so a translucent menu let window text read through. */
720
- background: var(--desk-surface);
721
- box-shadow: var(--desk-shadow-floating);
722
- animation: desk-menu-in .12s var(--desk-ease);
723
- }
724
-
725
- @keyframes desk-menu-in {
726
- from {
727
- opacity: 0;
728
- transform: translateY(-3px);
729
- }
730
- }
731
-
732
- .desk-menu-item {
733
- display: flex;
734
- align-items: center;
735
- gap: 6px;
736
- min-height: 24px;
737
- padding: 2px 10px 2px 4px;
738
- border-radius: 5px;
739
- cursor: default;
740
- }
741
-
742
- .desk-menu-item[data-active] {
743
- background: var(--desk-accent);
744
- color: #fff;
745
- }
746
-
747
- .desk-menu-item[aria-disabled="true"] {
748
- color: var(--desk-muted);
749
- opacity: .55;
750
- }
751
-
752
- .desk-menu-check {
753
- flex: none;
754
- width: 14px;
755
- text-align: center;
756
- font-size: 12px;
757
- }
758
-
759
- .desk-menu-label {
760
- flex: 1;
761
- min-width: 0;
762
- white-space: nowrap;
763
- overflow: hidden;
764
- text-overflow: ellipsis;
765
- }
766
-
767
- .desk-menu-detail,
768
- .desk-menu-shortcut {
769
- flex: none;
770
- color: var(--desk-muted);
771
- font-size: 12px;
772
- }
773
-
774
- .desk-menu-shortcut {
775
- margin-left: 18px;
776
- font-family: var(--desk-font);
777
- letter-spacing: .04em;
778
- }
779
-
780
- .desk-menu-item[data-active] .desk-menu-detail,
781
- .desk-menu-item[data-active] .desk-menu-shortcut {
782
- color: rgb(255 255 255 / 80%);
783
- }
784
-
785
- .desk-menu-separator {
786
- height: 1px;
787
- margin: 5px 8px;
788
- background: var(--desk-rule);
789
- }
790
-
791
- .desk-menu-header {
792
- padding: 5px 10px 2px 24px;
793
- font-size: 11px;
794
- font-weight: 600;
795
- color: var(--desk-muted);
796
- }
797
-
798
- @media (max-width: 640px) {
799
- .desk-stage {
800
- grid-template-columns: minmax(0, 1fr);
801
- grid-auto-rows: minmax(320px, auto);
802
- overflow-y: auto;
803
- }
804
- }
805
-
806
- @media (prefers-reduced-motion: reduce) {
807
- .desk-window,
808
- .desk-dock-item,
809
- .desk-dock-tip {
810
- transition: none;
811
- }
812
-
813
- .desk-stack,
814
- .desk-menu {
815
- animation: none;
816
- }
817
- }
818
-
819
- /* ── Controls ── */
820
-
821
- .desk-button {
822
- position: relative;
823
- display: inline-flex;
824
- align-items: center;
825
- justify-content: center;
826
- gap: var(--desk-space-2);
827
- min-height: var(--desk-control-height);
828
- padding: 0 var(--desk-space-3);
829
- border: 1px solid var(--desk-rule);
830
- border-radius: var(--desk-control-radius);
831
- background: var(--desk-surface);
832
- color: var(--desk-ink);
833
- font-family: var(--desk-font);
834
- font-size: 13px;
835
- font-weight: 500;
836
- white-space: nowrap;
837
- cursor: pointer;
838
- transition: background .12s var(--desk-ease), border-color .12s var(--desk-ease);
839
- }
840
-
841
- .desk-button[data-size="small"] {
842
- min-height: var(--desk-control-height-small);
843
- padding: 0 var(--desk-space-2);
844
- font-size: 12px;
845
- }
846
-
847
- .desk-button[data-icon-only] {
848
- padding: 0;
849
- width: var(--desk-control-height);
850
- }
851
-
852
- /* A finger needs 44px even when the drawn control is smaller (HIG.md §9). */
853
- @media (pointer: coarse) {
854
- .desk-button::after,
855
- .desk-toggle::after {
856
- content: "";
857
- position: absolute;
858
- top: 50%;
859
- left: 50%;
860
- width: max(100%, 44px);
861
- height: max(100%, 44px);
862
- transform: translate(-50%, -50%);
863
- }
864
- }
865
-
866
- .desk-button:hover:not(:disabled) {
867
- border-color: color-mix(in srgb, var(--desk-ink) 28%, var(--desk-rule));
868
- }
869
-
870
- .desk-button:active:not(:disabled) {
871
- background: color-mix(in srgb, var(--desk-ink) 8%, var(--desk-surface));
872
- }
873
-
874
- .desk-button[data-intent="default"] {
875
- border-color: var(--desk-accent);
876
- background: var(--desk-accent);
877
- color: var(--desk-on-accent);
878
- font-weight: 600;
879
- }
880
-
881
- .desk-button[data-intent="default"]:hover:not(:disabled) {
882
- background: color-mix(in srgb, #fff 12%, var(--desk-accent));
883
- }
884
-
885
- .desk-button[data-intent="quiet"] {
886
- border-color: transparent;
887
- background: none;
888
- }
889
-
890
- .desk-button[data-intent="quiet"]:hover:not(:disabled) {
891
- background: color-mix(in srgb, var(--desk-ink) 8%, transparent);
892
- }
893
-
894
- .desk-button[data-intent="destructive"] {
895
- border-color: color-mix(in srgb, var(--desk-bad) 50%, var(--desk-rule));
896
- color: var(--desk-bad);
897
- }
898
-
899
- .desk-button[data-intent="destructive"]:hover:not(:disabled) {
900
- background: color-mix(in srgb, var(--desk-bad) 12%, transparent);
901
- }
902
-
903
- .desk-button:disabled,
904
- .desk-segment:disabled,
905
- .desk-toggle:disabled {
906
- opacity: .45;
907
- cursor: not-allowed;
908
- }
909
-
910
- .desk-button:focus-visible,
911
- .desk-segment:focus-visible,
912
- .desk-toggle:focus-visible,
913
- .desk-input:focus-visible {
914
- outline: 2px solid var(--desk-accent);
915
- outline-offset: 2px;
916
- }
917
-
918
- .desk-button-icon,
919
- .desk-segment-icon {
920
- display: grid;
921
- place-items: center;
922
- width: 15px;
923
- height: 15px;
924
- }
925
-
926
- .desk-button-icon svg,
927
- .desk-segment-icon svg {
928
- width: 100%;
929
- height: 100%;
930
- }
931
-
932
- .desk-segmented {
933
- display: inline-flex;
934
- gap: 2px;
935
- padding: 2px;
936
- border: 1px solid var(--desk-rule);
937
- border-radius: calc(var(--desk-control-radius) + 2px);
938
- background: color-mix(in srgb, var(--desk-ink) 5%, transparent);
939
- }
940
-
941
- .desk-segment {
942
- display: inline-flex;
943
- align-items: center;
944
- gap: var(--desk-space-1);
945
- min-height: calc(var(--desk-control-height) - 6px);
946
- padding: 0 var(--desk-space-3);
947
- border: 0;
948
- border-radius: calc(var(--desk-control-radius) - 1px);
949
- background: none;
950
- color: var(--desk-muted);
951
- font-family: var(--desk-font);
952
- font-size: 12.5px;
953
- white-space: nowrap;
954
- cursor: pointer;
955
- }
956
-
957
- .desk-segmented[data-size="small"] .desk-segment {
958
- min-height: calc(var(--desk-control-height-small) - 4px);
959
- padding: 0 var(--desk-space-2);
960
- font-size: 11.5px;
961
- }
962
-
963
- .desk-segment[aria-checked="true"] {
964
- background: var(--desk-surface);
965
- border: 1px solid var(--desk-rule);
966
- color: var(--desk-ink);
967
- font-weight: 500;
968
- }
969
-
970
- .desk-segment:hover:not(:disabled):not([aria-checked="true"]) {
971
- color: var(--desk-ink);
972
- }
973
-
974
- .desk-toggle {
975
- position: relative;
976
- flex: none;
977
- width: 40px;
978
- height: 24px;
979
- padding: 0;
980
- border: 1px solid var(--desk-rule);
981
- border-radius: 12px;
982
- background: color-mix(in srgb, var(--desk-ink) 12%, transparent);
983
- cursor: pointer;
984
- transition: background .16s var(--desk-ease), border-color .16s var(--desk-ease);
985
- }
986
-
987
- .desk-toggle[aria-checked="true"] {
988
- border-color: var(--desk-accent);
989
- background: var(--desk-accent);
990
- }
991
-
992
- .desk-toggle-knob {
993
- position: absolute;
994
- top: 2px;
995
- left: 2px;
996
- width: 18px;
997
- height: 18px;
998
- border-radius: 50%;
999
- background: var(--desk-field-bg);
1000
- box-shadow: 0 1px 2px rgb(0 0 0 / 35%);
1001
- transition: transform .16s var(--desk-ease);
1002
- }
1003
-
1004
- .desk-toggle[aria-checked="true"] .desk-toggle-knob {
1005
- transform: translateX(16px);
1006
- background: var(--desk-on-accent);
1007
- }
1008
-
1009
- .desk-toggle-row {
1010
- display: flex;
1011
- align-items: center;
1012
- gap: var(--desk-space-3);
1013
- padding: var(--desk-space-2) 0;
1014
- }
1015
-
1016
- .desk-toggle-text {
1017
- flex: 1;
1018
- min-width: 0;
1019
- display: flex;
1020
- flex-direction: column;
1021
- gap: 2px;
1022
- }
1023
-
1024
- .desk-field {
1025
- display: flex;
1026
- flex-direction: column;
1027
- gap: var(--desk-space-1);
1028
- }
1029
-
1030
- .desk-label {
1031
- font-size: 12px;
1032
- font-weight: 500;
1033
- color: var(--desk-muted);
1034
- }
1035
-
1036
- .desk-label[data-hidden] {
1037
- position: absolute;
1038
- width: 1px;
1039
- height: 1px;
1040
- margin: -1px;
1041
- padding: 0;
1042
- overflow: hidden;
1043
- clip-path: inset(50%);
1044
- white-space: nowrap;
1045
- }
1046
-
1047
- .desk-input {
1048
- box-sizing: border-box;
1049
- width: 100%;
1050
- min-height: var(--desk-control-height);
1051
- padding: 0 var(--desk-space-3);
1052
- border: 1px solid var(--desk-rule);
1053
- border-radius: var(--desk-control-radius);
1054
- background: var(--desk-field-bg);
1055
- color: var(--desk-ink);
1056
- font-family: var(--desk-font);
1057
- font-size: 13px;
1058
- }
1059
-
1060
- .desk-input::placeholder {
1061
- color: var(--desk-muted);
1062
- }
1063
-
1064
- .desk-field[data-invalid] .desk-input {
1065
- border-color: var(--desk-bad);
1066
- }
1067
-
1068
- .desk-help,
1069
- .desk-error {
1070
- font-size: 11.5px;
1071
- line-height: 1.4;
1072
- }
1073
-
1074
- .desk-help {
1075
- color: var(--desk-muted);
1076
- }
1077
-
1078
- .desk-error {
1079
- color: var(--desk-bad);
1080
- }
1081
-
1082
- @media (prefers-reduced-motion: reduce) {
1083
- .desk-button,
1084
- .desk-toggle,
1085
- .desk-toggle-knob {
1086
- transition: none;
1087
- }
1088
- }
1089
-
1090
- /* ── Overlays ── */
1091
-
1092
- .desk-popover-anchor {
1093
- position: relative;
1094
- display: inline-flex;
1095
- }
1096
-
1097
- .desk-popover {
1098
- position: absolute;
1099
- z-index: 1200;
1100
- min-width: 220px;
1101
- max-width: min(360px, calc(100vw - 24px));
1102
- padding: var(--desk-space-3);
1103
- border: 1px solid var(--desk-rule);
1104
- border-radius: 12px;
1105
- background: var(--desk-surface);
1106
- box-shadow: var(--desk-shadow-floating);
1107
- animation: desk-menu-in .14s var(--desk-ease);
1108
- }
1109
-
1110
- .desk-popover[data-placement="below"] {
1111
- top: calc(100% + 6px);
1112
- }
1113
-
1114
- .desk-popover[data-placement="above"] {
1115
- bottom: calc(100% + 6px);
1116
- }
1117
-
1118
- .desk-popover[data-align="start"] {
1119
- left: 0;
1120
- }
1121
-
1122
- .desk-popover[data-align="end"] {
1123
- right: 0;
1124
- }
1125
-
1126
- /* A sheet belongs to its window: the scrim covers that window and nothing else. */
1127
- .desk-sheet-scrim,
1128
- .desk-alert-scrim {
1129
- position: absolute;
1130
- inset: 0;
1131
- z-index: 1300;
1132
- display: grid;
1133
- background: rgb(0 0 0 / 35%);
1134
- animation: desk-fade .16s var(--desk-ease);
1135
- }
1136
-
1137
- .desk-sheet-scrim {
1138
- place-items: start center;
1139
- padding: var(--desk-space-4);
1140
- }
1141
-
1142
- .desk-alert-scrim {
1143
- position: fixed;
1144
- z-index: 1400;
1145
- place-items: center;
1146
- padding: var(--desk-space-4);
1147
- background: rgb(0 0 0 / 45%);
1148
- }
1149
-
1150
- @keyframes desk-fade {
1151
- from {
1152
- opacity: 0;
1153
- }
1154
- }
1155
-
1156
- .desk-sheet,
1157
- .desk-alert {
1158
- box-sizing: border-box;
1159
- width: min(440px, 100%);
1160
- padding: var(--desk-space-4);
1161
- border: 1px solid var(--desk-rule);
1162
- border-radius: 14px;
1163
- background: var(--desk-surface);
1164
- color: var(--desk-ink);
1165
- box-shadow: var(--desk-shadow-floating);
1166
- font-family: var(--desk-font);
1167
- }
1168
-
1169
- .desk-sheet {
1170
- animation: desk-sheet-in .22s var(--desk-ease);
1171
- }
1172
-
1173
- .desk-alert {
1174
- width: min(380px, 100%);
1175
- text-align: center;
1176
- animation: desk-alert-in .16s var(--desk-ease);
1177
- }
1178
-
1179
- @keyframes desk-sheet-in {
1180
- from {
1181
- transform: translateY(-12px);
1182
- opacity: 0;
1183
- }
1184
- }
1185
-
1186
- @keyframes desk-alert-in {
1187
- from {
1188
- transform: scale(.97);
1189
- opacity: 0;
1190
- }
1191
- }
1192
-
1193
- .desk-sheet-title,
1194
- .desk-alert-title {
1195
- margin: 0 0 var(--desk-space-1);
1196
- font-size: 15px;
1197
- font-weight: 600;
1198
- }
1199
-
1200
- .desk-sheet-description,
1201
- .desk-alert-message {
1202
- margin: 0 0 var(--desk-space-3);
1203
- color: var(--desk-muted);
1204
- font-size: 13px;
1205
- line-height: 1.5;
1206
- }
1207
-
1208
- .desk-sheet-actions,
1209
- .desk-alert-actions {
1210
- display: flex;
1211
- justify-content: flex-end;
1212
- gap: var(--desk-space-2);
1213
- margin-top: var(--desk-space-4);
1214
- }
1215
-
1216
- .desk-alert-actions {
1217
- justify-content: center;
1218
- }
1219
-
1220
- .desk-toasts {
1221
- position: fixed;
1222
- z-index: 1500;
1223
- right: var(--desk-space-4);
1224
- bottom: var(--desk-space-4);
1225
- display: flex;
1226
- flex-direction: column;
1227
- gap: var(--desk-space-2);
1228
- max-width: min(420px, calc(100vw - 32px));
1229
- }
1230
-
1231
- .desk-toast {
1232
- display: flex;
1233
- align-items: center;
1234
- gap: var(--desk-space-2);
1235
- padding: var(--desk-space-2) var(--desk-space-2) var(--desk-space-2) var(--desk-space-3);
1236
- border: 1px solid var(--desk-rule);
1237
- border-radius: 10px;
1238
- background: var(--desk-surface);
1239
- box-shadow: var(--desk-shadow-floating);
1240
- font-family: var(--desk-font);
1241
- font-size: 13px;
1242
- animation: desk-toast-in .2s var(--desk-ease);
1243
- }
1244
-
1245
- @keyframes desk-toast-in {
1246
- from {
1247
- transform: translateY(8px);
1248
- opacity: 0;
1249
- }
1250
- }
1251
-
1252
- .desk-toast[data-tone="ok"] {
1253
- border-color: color-mix(in srgb, var(--desk-ok) 45%, var(--desk-rule));
1254
- }
1255
-
1256
- .desk-toast[data-tone="bad"] {
1257
- border-color: color-mix(in srgb, var(--desk-bad) 45%, var(--desk-rule));
1258
- }
1259
-
1260
- .desk-toast-message {
1261
- flex: 1;
1262
- min-width: 0;
1263
- }
1264
-
1265
- @media (prefers-reduced-motion: reduce) {
1266
- .desk-inputbar,
1267
- .desk-inputbar-scrim,
1268
- .desk-popover,
1269
- .desk-sheet,
1270
- .desk-alert,
1271
- .desk-toast,
1272
- .desk-sheet-scrim,
1273
- .desk-alert-scrim {
1274
- animation: none;
1275
- }
1276
- }
1277
-
1278
- /* ── Conversation ── */
1279
-
1280
- .desk-thread {
1281
- position: relative;
1282
- display: flex;
1283
- flex-direction: column;
1284
- min-height: 0;
1285
- height: 100%;
1286
- font-family: var(--desk-font);
1287
- }
1288
-
1289
- .desk-thread-scroll {
1290
- flex: 1;
1291
- min-height: 0;
1292
- overflow-y: auto;
1293
- display: flex;
1294
- flex-direction: column;
1295
- gap: var(--desk-space-1);
1296
- padding: var(--desk-space-4);
1297
- }
1298
-
1299
- .desk-message {
1300
- display: flex;
1301
- flex-direction: column;
1302
- align-items: flex-start;
1303
- max-width: min(80%, 60ch);
1304
- }
1305
-
1306
- .desk-message[data-mine] {
1307
- align-self: flex-end;
1308
- align-items: flex-end;
1309
- }
1310
-
1311
- /* A new run of messages from the same person gets air; the rest stay close. */
1312
- .desk-message[data-run-start] {
1313
- margin-top: var(--desk-space-3);
1314
- }
1315
-
1316
- .desk-message:first-child {
1317
- margin-top: 0;
1318
- }
1319
-
1320
- .desk-message-author {
1321
- margin-bottom: 2px;
1322
- padding: 0 var(--desk-space-1);
1323
- font-size: 11.5px;
1324
- font-weight: 600;
1325
- color: var(--desk-muted);
1326
- }
1327
-
1328
- .desk-bubble {
1329
- padding: var(--desk-space-2) var(--desk-space-3);
1330
- border: 1px solid var(--desk-rule);
1331
- border-radius: 14px;
1332
- background: var(--desk-surface);
1333
- font-size: 13.5px;
1334
- line-height: 1.5;
1335
- white-space: pre-wrap;
1336
- overflow-wrap: anywhere;
1337
- }
1338
-
1339
- .desk-message[data-mine] .desk-bubble {
1340
- border-color: transparent;
1341
- background: var(--desk-accent);
1342
- color: var(--desk-on-accent);
1343
- border-bottom-right-radius: 5px;
1344
- }
1345
-
1346
- .desk-message:not([data-mine]) .desk-bubble {
1347
- border-bottom-left-radius: 5px;
1348
- }
1349
-
1350
- .desk-message[data-state="sending"] .desk-bubble {
1351
- opacity: .6;
1352
- }
1353
-
1354
- .desk-message[data-state="failed"] .desk-bubble {
1355
- border-color: var(--desk-bad);
1356
- }
1357
-
1358
- .desk-message-foot {
1359
- display: flex;
1360
- align-items: center;
1361
- gap: var(--desk-space-2);
1362
- padding: 2px var(--desk-space-1) 0;
1363
- font-size: 11px;
1364
- color: var(--desk-muted);
1365
- }
1366
-
1367
- .desk-message-foot:empty {
1368
- display: none;
1369
- }
1370
-
1371
- .desk-message-failed {
1372
- color: var(--desk-bad);
1373
- }
1374
-
1375
- .desk-typing {
1376
- align-self: flex-start;
1377
- margin-top: var(--desk-space-2);
1378
- padding: var(--desk-space-2) var(--desk-space-3);
1379
- border: 1px solid var(--desk-rule);
1380
- border-radius: 14px;
1381
- border-bottom-left-radius: 5px;
1382
- background: var(--desk-surface);
1383
- }
1384
-
1385
- .desk-typing-dots {
1386
- display: flex;
1387
- gap: 4px;
1388
- }
1389
-
1390
- .desk-typing-dots i {
1391
- width: 5px;
1392
- height: 5px;
1393
- border-radius: 50%;
1394
- background: var(--desk-muted);
1395
- animation: desk-typing 1.2s var(--desk-ease) infinite;
1396
- }
1397
-
1398
- .desk-typing-dots i:nth-child(2) {
1399
- animation-delay: .15s;
1400
- }
1401
-
1402
- .desk-typing-dots i:nth-child(3) {
1403
- animation-delay: .3s;
1404
- }
1405
-
1406
- @keyframes desk-typing {
1407
- 0%, 60%, 100% {
1408
- opacity: .3;
1409
- }
1410
- 30% {
1411
- opacity: 1;
1412
- }
1413
- }
1414
-
1415
- .desk-thread-jump {
1416
- position: absolute;
1417
- left: 50%;
1418
- bottom: var(--desk-space-3);
1419
- transform: translateX(-50%);
1420
- box-shadow: var(--desk-shadow);
1421
- }
1422
-
1423
- .desk-composer {
1424
- flex: none;
1425
- display: flex;
1426
- align-items: flex-end;
1427
- gap: var(--desk-space-2);
1428
- padding: var(--desk-space-3) var(--desk-space-4);
1429
- border-top: 1px solid var(--desk-rule);
1430
- }
1431
-
1432
- .desk-composer-field {
1433
- flex: 1;
1434
- min-width: 0;
1435
- min-height: var(--desk-control-height);
1436
- max-height: 40vh;
1437
- padding: var(--desk-space-2) var(--desk-space-3);
1438
- border: 1px solid var(--desk-rule);
1439
- border-radius: var(--desk-control-radius);
1440
- background: var(--desk-field-bg);
1441
- color: var(--desk-ink);
1442
- font-family: var(--desk-font);
1443
- font-size: 13.5px;
1444
- line-height: 20px;
1445
- resize: none;
1446
- }
1447
-
1448
- .desk-composer-field:focus-visible {
1449
- outline: 2px solid var(--desk-accent);
1450
- outline-offset: 2px;
1451
- }
1452
-
1453
- .desk-composer-field::placeholder {
1454
- color: var(--desk-muted);
1455
- }
1456
-
1457
- @media (prefers-reduced-motion: reduce) {
1458
- .desk-typing-dots i {
1459
- animation: none;
1460
- }
1461
- }
1462
-
1463
- /* ── Input bar: one place to type, which reaches the key window ── */
1464
-
1465
- .desk-inputbar-scrim {
1466
- position: fixed;
1467
- inset: 0;
1468
- z-index: 1450;
1469
- display: grid;
1470
- justify-items: center;
1471
- align-content: center;
1472
- padding: var(--desk-space-4);
1473
- background: rgb(0 0 0 / 30%);
1474
- animation: desk-fade .14s var(--desk-ease);
1475
- }
1476
-
1477
- .desk-inputbar[data-mode="summoned"] {
1478
- animation: desk-alert-in .16s var(--desk-ease);
1479
- }
1480
-
1481
- .desk-inputbar {
1482
- box-sizing: border-box;
1483
- width: min(720px, 100%);
1484
- border: 1px solid var(--desk-rule);
1485
- border-radius: 14px;
1486
- background: var(--desk-dock-glass);
1487
- backdrop-filter: blur(28px) saturate(170%);
1488
- -webkit-backdrop-filter: blur(28px) saturate(170%);
1489
- box-shadow: var(--desk-shadow-floating);
1490
- }
1491
-
1492
- .desk-inputbar .desk-composer {
1493
- border-top: 0;
1494
- padding: var(--desk-space-2);
1495
- }
1496
-
1497
- .desk-inputbar-target {
1498
- display: block;
1499
- padding: 0 var(--desk-space-3) var(--desk-space-2);
1500
- font-family: var(--desk-font);
1501
- font-size: 11px;
1502
- color: var(--desk-muted);
1503
- }
1504
-
1505
- .desk-inputbar-target b {
1506
- font-weight: 600;
1507
- color: var(--desk-ink);
1508
- }
1509
-
1510
- /* ── Search ── */
1511
-
1512
- .desk-search-scrim {
1513
- position: fixed;
1514
- inset: 0;
1515
- z-index: 1450;
1516
- display: grid;
1517
- justify-items: center;
1518
- align-content: start;
1519
- padding: 12vh var(--desk-space-4) var(--desk-space-4);
1520
- background: rgb(0 0 0 / 35%);
1521
- animation: desk-fade .14s var(--desk-ease);
1522
- }
1523
-
1524
- .desk-search {
1525
- box-sizing: border-box;
1526
- width: min(620px, 100%);
1527
- max-height: 70vh;
1528
- display: flex;
1529
- flex-direction: column;
1530
- border: 1px solid var(--desk-rule);
1531
- border-radius: 14px;
1532
- background: var(--desk-surface);
1533
- box-shadow: var(--desk-shadow-floating);
1534
- font-family: var(--desk-font);
1535
- overflow: hidden;
1536
- animation: desk-alert-in .16s var(--desk-ease);
1537
- }
1538
-
1539
- .desk-search-bar {
1540
- flex: none;
1541
- padding: var(--desk-space-3) var(--desk-space-4);
1542
- border-bottom: 1px solid var(--desk-rule);
1543
- }
1544
-
1545
- .desk-search-field {
1546
- width: 100%;
1547
- border: 0;
1548
- background: none;
1549
- color: var(--desk-ink);
1550
- font-family: var(--desk-font);
1551
- font-size: 17px;
1552
- outline: none;
1553
- }
1554
-
1555
- .desk-search-field::placeholder {
1556
- color: var(--desk-muted);
1557
- }
1558
-
1559
- .desk-search-results {
1560
- flex: 1;
1561
- min-height: 0;
1562
- margin: 0;
1563
- padding: var(--desk-space-1);
1564
- list-style: none;
1565
- overflow-y: auto;
1566
- }
1567
-
1568
- .desk-search-group {
1569
- margin: var(--desk-space-2) 0 2px;
1570
- padding: 0 var(--desk-space-2);
1571
- font-size: 11px;
1572
- font-weight: 700;
1573
- letter-spacing: .08em;
1574
- text-transform: uppercase;
1575
- color: var(--desk-muted);
1576
- }
1577
-
1578
- .desk-search-row {
1579
- display: flex;
1580
- align-items: center;
1581
- gap: var(--desk-space-3);
1582
- padding: var(--desk-space-2);
1583
- border-radius: 8px;
1584
- cursor: default;
1585
- }
1586
-
1587
- .desk-search-row[data-active] {
1588
- background: var(--desk-accent);
1589
- color: var(--desk-on-accent);
1590
- }
1591
-
1592
- .desk-search-icon {
1593
- display: grid;
1594
- place-items: center;
1595
- width: 28px;
1596
- height: 28px;
1597
- flex: none;
1598
- border: 1px solid var(--desk-rule);
1599
- border-radius: 7px;
1600
- }
1601
-
1602
- .desk-search-icon svg {
1603
- width: 15px;
1604
- height: 15px;
1605
- }
1606
-
1607
- .desk-search-row[data-active] .desk-search-icon {
1608
- border-color: transparent;
1609
- background: rgb(255 255 255 / 18%);
1610
- }
1611
-
1612
- .desk-search-text {
1613
- flex: 1;
1614
- min-width: 0;
1615
- }
1616
-
1617
- .desk-search-title {
1618
- display: block;
1619
- font-size: 13.5px;
1620
- font-weight: 500;
1621
- }
1622
-
1623
- .desk-search-subtitle,
1624
- .desk-search-kind {
1625
- font-size: 11.5px;
1626
- color: var(--desk-muted);
1627
- }
1628
-
1629
- .desk-search-subtitle {
1630
- display: block;
1631
- }
1632
-
1633
- .desk-search-kind {
1634
- flex: none;
1635
- font-family: var(--desk-font-mono);
1636
- font-size: 10.5px;
1637
- }
1638
-
1639
- .desk-search-row[data-active] .desk-search-subtitle,
1640
- .desk-search-row[data-active] .desk-search-kind {
1641
- color: rgb(255 255 255 / 80%);
1642
- }
1643
-
1644
- .desk-search-empty {
1645
- margin: 0;
1646
- padding: var(--desk-space-5) var(--desk-space-4);
1647
- text-align: center;
1648
- color: var(--desk-muted);
1649
- font-size: 13px;
1650
- }
1651
-
1652
- @media (prefers-reduced-motion: reduce) {
1653
- .desk-search,
1654
- .desk-search-scrim {
1655
- animation: none;
1656
- }
1657
- }
1658
-
1659
- /* ── Tour ── */
1660
-
1661
- .desk-tour {
1662
- box-sizing: border-box;
1663
- width: min(620px, 100%);
1664
- padding: var(--desk-space-3);
1665
- border: 1px solid color-mix(in srgb, var(--desk-accent) 45%, var(--desk-rule));
1666
- border-radius: 14px;
1667
- background: var(--desk-dock-glass);
1668
- backdrop-filter: blur(28px) saturate(170%);
1669
- -webkit-backdrop-filter: blur(28px) saturate(170%);
1670
- box-shadow: var(--desk-shadow-floating), 0 0 30px color-mix(in srgb, var(--desk-accent) 20%, transparent);
1671
- font-family: var(--desk-font);
1672
- color: var(--desk-ink);
1673
- }
1674
-
1675
- .desk-tour-head {
1676
- display: flex;
1677
- align-items: center;
1678
- gap: var(--desk-space-2);
1679
- font-size: 13px;
1680
- }
1681
-
1682
- .desk-tour-count {
1683
- color: var(--desk-muted);
1684
- font-size: 11.5px;
1685
- font-variant-numeric: tabular-nums;
1686
- }
1687
-
1688
- .desk-tour-head .desk-button {
1689
- margin-left: auto;
1690
- }
1691
-
1692
- .desk-tour-progress {
1693
- height: 3px;
1694
- margin: var(--desk-space-2) 0;
1695
- border-radius: 2px;
1696
- background: var(--desk-rule);
1697
- overflow: hidden;
1698
- }
1699
-
1700
- .desk-tour-progress i {
1701
- display: block;
1702
- height: 100%;
1703
- background: var(--desk-accent);
1704
- transition: width .3s var(--desk-ease);
1705
- }
1706
-
1707
- .desk-tour-caption {
1708
- margin: 0 0 var(--desk-space-2);
1709
- font-size: 13.5px;
1710
- line-height: 1.45;
1711
- }
1712
-
1713
- .desk-tour-turn {
1714
- margin-right: var(--desk-space-1);
1715
- color: var(--desk-warn);
1716
- font-weight: 700;
1717
- }
1718
-
1719
- .desk-tour-turn::after {
1720
- content: " ·";
1721
- }
1722
-
1723
- .desk-tour-actions {
1724
- display: flex;
1725
- align-items: center;
1726
- gap: var(--desk-space-2);
1727
- }
1728
-
1729
- .desk-tour-spacer {
1730
- flex: 1;
1731
- }
1732
-
1733
- /* What the tour is pointing at. */
1734
- [data-desk-tour-pointed] {
1735
- position: relative;
1736
- z-index: 3;
1737
- outline: 2px solid var(--desk-accent);
1738
- outline-offset: 3px;
1739
- border-radius: 6px;
1740
- animation: desk-tour-pulse 1.6s var(--desk-ease) 2;
1741
- }
1742
-
1743
- @keyframes desk-tour-pulse {
1744
- 0%, 100% {
1745
- box-shadow: 0 0 0 0 color-mix(in srgb, var(--desk-accent) 0%, transparent);
1746
- }
1747
- 40% {
1748
- box-shadow: 0 0 0 4px color-mix(in srgb, var(--desk-accent) 45%, transparent);
1749
- }
1750
- }
1751
-
1752
- @media (prefers-reduced-motion: reduce) {
1753
- .desk-tour-progress i {
1754
- transition: none;
1755
- }
1756
-
1757
- [data-desk-tour-pointed] {
1758
- animation: none;
1759
- }
1760
- }
1761
-
1762
- /* ── Checkbox and slider ── */
1763
-
1764
- .desk-check-row {
1765
- display: flex;
1766
- align-items: flex-start;
1767
- gap: var(--desk-space-2);
1768
- padding: var(--desk-space-1) 0;
1769
- }
1770
-
1771
- .desk-checkbox {
1772
- width: 16px;
1773
- height: 16px;
1774
- margin: 2px 0 0;
1775
- accent-color: var(--desk-accent);
1776
- flex: none;
1777
- }
1778
-
1779
- .desk-check-text {
1780
- display: flex;
1781
- flex-direction: column;
1782
- gap: 2px;
1783
- }
1784
-
1785
- .desk-check-label {
1786
- font-size: 13px;
1787
- }
1788
-
1789
- .desk-checkbox:focus-visible,
1790
- .desk-slider-track:focus-visible {
1791
- outline: 2px solid var(--desk-accent);
1792
- outline-offset: 2px;
1793
- }
1794
-
1795
- .desk-choices {
1796
- margin: 0;
1797
- padding: 0;
1798
- border: 0;
1799
- display: flex;
1800
- flex-direction: column;
1801
- gap: var(--desk-space-2);
1802
- }
1803
-
1804
- .desk-choice {
1805
- display: flex;
1806
- align-items: flex-start;
1807
- gap: var(--desk-space-3);
1808
- padding: var(--desk-space-3);
1809
- border: 1px solid var(--desk-rule);
1810
- border-radius: 12px;
1811
- background: var(--desk-surface);
1812
- cursor: pointer;
1813
- }
1814
-
1815
- .desk-choice:hover:not([data-disabled]) {
1816
- border-color: color-mix(in srgb, var(--desk-accent) 50%, var(--desk-rule));
1817
- }
1818
-
1819
- .desk-choice[data-chosen] {
1820
- border-color: var(--desk-accent);
1821
- box-shadow: 0 0 0 1px var(--desk-accent);
1822
- }
1823
-
1824
- .desk-choice[data-disabled] {
1825
- opacity: .45;
1826
- cursor: not-allowed;
1827
- }
1828
-
1829
- .desk-choice:has(:focus-visible) {
1830
- outline: 2px solid var(--desk-accent);
1831
- outline-offset: 2px;
1832
- }
1833
-
1834
- .desk-choice-input {
1835
- position: absolute;
1836
- opacity: 0;
1837
- pointer-events: none;
1838
- }
1839
-
1840
- .desk-choice-mark {
1841
- flex: none;
1842
- display: grid;
1843
- place-items: center;
1844
- width: 16px;
1845
- height: 16px;
1846
- margin-top: 2px;
1847
- border: 1.5px solid var(--desk-rule);
1848
- border-radius: 50%;
1849
- }
1850
-
1851
- .desk-choice[data-chosen] .desk-choice-mark {
1852
- border-color: var(--desk-accent);
1853
- }
1854
-
1855
- .desk-choice[data-chosen] .desk-choice-mark::after {
1856
- content: "";
1857
- width: 8px;
1858
- height: 8px;
1859
- border-radius: 50%;
1860
- background: var(--desk-accent);
1861
- }
1862
-
1863
- .desk-choice-icon {
1864
- flex: none;
1865
- display: grid;
1866
- place-items: center;
1867
- width: 36px;
1868
- height: 36px;
1869
- border: 1px solid var(--desk-rule);
1870
- border-radius: 10px;
1871
- color: var(--desk-muted);
1872
- }
1873
-
1874
- .desk-choice-icon svg {
1875
- width: 18px;
1876
- height: 18px;
1877
- }
1878
-
1879
- .desk-choice-text {
1880
- flex: 1;
1881
- min-width: 0;
1882
- display: flex;
1883
- flex-direction: column;
1884
- gap: 2px;
1885
- }
1886
-
1887
- .desk-choice-label {
1888
- font-weight: 600;
1889
- }
1890
-
1891
- .desk-choice-tag {
1892
- margin-left: var(--desk-space-2);
1893
- font-weight: 400;
1894
- color: var(--desk-muted);
1895
- }
1896
-
1897
- .desk-checklist {
1898
- display: flex;
1899
- flex-direction: column;
1900
- gap: var(--desk-space-3);
1901
- }
1902
-
1903
- .desk-progress {
1904
- height: 5px;
1905
- border-radius: 3px;
1906
- background: var(--desk-rule);
1907
- overflow: hidden;
1908
- }
1909
-
1910
- .desk-progress i {
1911
- display: block;
1912
- height: 100%;
1913
- background: var(--desk-accent);
1914
- transition: width .4s var(--desk-ease);
1915
- }
1916
-
1917
- .desk-tasks {
1918
- margin: 0;
1919
- padding: 0;
1920
- list-style: none;
1921
- border: 1px solid var(--desk-rule);
1922
- border-radius: 12px;
1923
- }
1924
-
1925
- .desk-task {
1926
- display: flex;
1927
- align-items: center;
1928
- gap: var(--desk-space-3);
1929
- padding: var(--desk-space-2) var(--desk-space-3);
1930
- }
1931
-
1932
- .desk-task + .desk-task {
1933
- border-top: 1px solid var(--desk-rule);
1934
- }
1935
-
1936
- .desk-task-mark {
1937
- flex: none;
1938
- display: grid;
1939
- place-items: center;
1940
- box-sizing: border-box;
1941
- width: 20px;
1942
- height: 20px;
1943
- border-radius: 50%;
1944
- font-size: 12px;
1945
- border: 1.5px dashed var(--desk-rule);
1946
- }
1947
-
1948
- .desk-task[data-state="working"] .desk-task-mark {
1949
- border: 2px solid var(--desk-rule);
1950
- border-top-color: var(--desk-accent);
1951
- animation: desk-spin .8s linear infinite;
1952
- }
1953
-
1954
- .desk-task[data-state="done"] .desk-task-mark {
1955
- border: 0;
1956
- background: color-mix(in srgb, var(--desk-ok) 18%, transparent);
1957
- color: var(--desk-ok);
1958
- }
1959
-
1960
- .desk-task[data-state="failed"] .desk-task-mark {
1961
- border: 0;
1962
- background: color-mix(in srgb, var(--desk-bad) 18%, transparent);
1963
- color: var(--desk-bad);
1964
- font-weight: 700;
1965
- }
1966
-
1967
- @keyframes desk-spin {
1968
- to {
1969
- transform: rotate(360deg);
1970
- }
1971
- }
1972
-
1973
- .desk-task-text {
1974
- flex: 1;
1975
- min-width: 0;
1976
- display: flex;
1977
- flex-direction: column;
1978
- }
1979
-
1980
- .desk-task-name {
1981
- font-size: 13px;
1982
- font-weight: 600;
1983
- }
1984
-
1985
- .desk-task-detail,
1986
- .desk-task-error {
1987
- font-size: 12px;
1988
- color: var(--desk-muted);
1989
- }
1990
-
1991
- .desk-task-error {
1992
- color: var(--desk-bad);
1993
- }
1994
-
1995
- @media (prefers-reduced-motion: reduce) {
1996
- .desk-task[data-state="working"] .desk-task-mark {
1997
- animation: none;
1998
- }
1999
- }
2000
-
2001
- .desk-radiogroup {
2002
- margin: 0;
2003
- padding: 0;
2004
- border: 0;
2005
- display: flex;
2006
- flex-direction: column;
2007
- gap: var(--desk-space-1);
2008
- }
2009
-
2010
- .desk-radiogroup legend {
2011
- padding: 0;
2012
- margin-bottom: var(--desk-space-1);
2013
- }
2014
-
2015
- .desk-radio {
2016
- width: 16px;
2017
- height: 16px;
2018
- margin: 2px 0 0;
2019
- accent-color: var(--desk-accent);
2020
- flex: none;
2021
- }
2022
-
2023
- .desk-radio:focus-visible {
2024
- outline: 2px solid var(--desk-accent);
2025
- outline-offset: 2px;
2026
- }
2027
-
2028
- .desk-slider {
2029
- display: flex;
2030
- flex-direction: column;
2031
- gap: var(--desk-space-1);
2032
- }
2033
-
2034
- .desk-slider-head {
2035
- display: flex;
2036
- align-items: baseline;
2037
- justify-content: space-between;
2038
- gap: var(--desk-space-2);
2039
- }
2040
-
2041
- .desk-slider-value {
2042
- font-size: 12px;
2043
- font-variant-numeric: tabular-nums;
2044
- color: var(--desk-ink);
2045
- }
2046
-
2047
- .desk-slider-track {
2048
- width: 100%;
2049
- accent-color: var(--desk-accent);
2050
- }
2051
-
2052
- /* ── Pop-up button ── */
2053
-
2054
- .desk-popup-anchor {
2055
- position: relative;
2056
- }
2057
-
2058
- .desk-popup-button {
2059
- display: flex;
2060
- align-items: center;
2061
- gap: var(--desk-space-2);
2062
- width: 100%;
2063
- min-height: var(--desk-control-height);
2064
- padding: 0 var(--desk-space-2) 0 var(--desk-space-3);
2065
- border: 1px solid var(--desk-rule);
2066
- border-radius: var(--desk-control-radius);
2067
- background: var(--desk-field-bg);
2068
- color: var(--desk-ink);
2069
- font-family: var(--desk-font);
2070
- font-size: 13px;
2071
- text-align: left;
2072
- cursor: pointer;
2073
- }
2074
-
2075
- .desk-popup-button[data-size="small"] {
2076
- min-height: var(--desk-control-height-small);
2077
- font-size: 12px;
2078
- }
2079
-
2080
- .desk-popup-button:focus-visible {
2081
- outline: 2px solid var(--desk-accent);
2082
- outline-offset: 2px;
2083
- }
2084
-
2085
- .desk-popup-button:disabled {
2086
- opacity: .45;
2087
- cursor: not-allowed;
2088
- }
2089
-
2090
- .desk-popup-value {
2091
- flex: 1;
2092
- min-width: 0;
2093
- overflow: hidden;
2094
- text-overflow: ellipsis;
2095
- white-space: nowrap;
2096
- }
2097
-
2098
- .desk-popup-value[data-placeholder] {
2099
- color: var(--desk-muted);
2100
- }
2101
-
2102
- .desk-popup-icon {
2103
- display: grid;
2104
- place-items: center;
2105
- width: 16px;
2106
- height: 16px;
2107
- }
2108
-
2109
- .desk-popup-chevron {
2110
- color: var(--desk-muted);
2111
- line-height: 1;
2112
- }
2113
-
2114
- .desk-popup-list {
2115
- position: absolute;
2116
- z-index: 1200;
2117
- top: calc(100% + 4px);
2118
- left: 0;
2119
- min-width: 100%;
2120
- max-height: 40vh;
2121
- margin: 0;
2122
- padding: 4px;
2123
- list-style: none;
2124
- overflow-y: auto;
2125
- border: 1px solid var(--desk-rule);
2126
- border-radius: 10px;
2127
- background: var(--desk-surface);
2128
- box-shadow: var(--desk-shadow-floating);
2129
- animation: desk-menu-in .12s var(--desk-ease);
2130
- }
2131
-
2132
- .desk-popup-list:focus {
2133
- outline: none;
2134
- }
2135
-
2136
- .desk-popup-option {
2137
- display: flex;
2138
- align-items: flex-start;
2139
- gap: var(--desk-space-1);
2140
- padding: var(--desk-space-1) var(--desk-space-2);
2141
- border-radius: 6px;
2142
- font-size: 13px;
2143
- cursor: default;
2144
- }
2145
-
2146
- .desk-popup-option[data-active] {
2147
- background: var(--desk-accent);
2148
- color: var(--desk-on-accent);
2149
- }
2150
-
2151
- .desk-popup-option[data-active] .desk-help {
2152
- color: rgb(255 255 255 / 80%);
2153
- }
2154
-
2155
- .desk-popup-option[aria-disabled] {
2156
- opacity: .5;
2157
- }
2158
-
2159
- .desk-popup-check {
2160
- width: 14px;
2161
- flex: none;
2162
- text-align: center;
2163
- }
2164
-
2165
- .desk-popup-text {
2166
- display: flex;
2167
- flex-direction: column;
2168
- }
2169
-
2170
- /* ── Table ── */
2171
-
2172
- .desk-table-wrap {
2173
- overflow: auto;
2174
- }
2175
-
2176
- .desk-table {
2177
- width: 100%;
2178
- border-collapse: collapse;
2179
- font-family: var(--desk-font);
2180
- font-size: 13px;
2181
- }
2182
-
2183
- .desk-table th {
2184
- position: sticky;
2185
- top: 0;
2186
- z-index: 1;
2187
- padding: var(--desk-space-1) var(--desk-space-2);
2188
- border-bottom: 1px solid var(--desk-rule);
2189
- background: var(--desk-surface);
2190
- font-size: 11px;
2191
- font-weight: 600;
2192
- letter-spacing: .06em;
2193
- text-transform: uppercase;
2194
- color: var(--desk-muted);
2195
- text-align: left;
2196
- white-space: nowrap;
2197
- }
2198
-
2199
- .desk-table th[data-align="end"],
2200
- .desk-table td[data-align="end"] {
2201
- text-align: right;
2202
- }
2203
-
2204
- .desk-table-sort {
2205
- display: inline-flex;
2206
- align-items: center;
2207
- gap: 4px;
2208
- padding: 0;
2209
- border: 0;
2210
- background: none;
2211
- color: inherit;
2212
- font: inherit;
2213
- letter-spacing: inherit;
2214
- text-transform: inherit;
2215
- cursor: pointer;
2216
- }
2217
-
2218
- .desk-table-sort:hover {
2219
- color: var(--desk-ink);
2220
- }
2221
-
2222
- .desk-table td {
2223
- padding: var(--desk-space-2);
2224
- border-bottom: 1px solid var(--desk-rule);
2225
- }
2226
-
2227
- .desk-table td[data-numeric] {
2228
- font-variant-numeric: tabular-nums;
2229
- }
2230
-
2231
- .desk-table tbody tr {
2232
- cursor: default;
2233
- }
2234
-
2235
- .desk-table tbody tr:hover {
2236
- background: color-mix(in srgb, var(--desk-ink) 5%, transparent);
2237
- }
2238
-
2239
- .desk-table tbody tr[data-selected] {
2240
- background: color-mix(in srgb, var(--desk-accent) 16%, transparent);
2241
- }
2242
-
2243
- .desk-table tbody tr:focus-visible {
2244
- outline: 2px solid var(--desk-accent);
2245
- outline-offset: -2px;
2246
- }
2247
-
2248
- .desk-table-empty {
2249
- padding: var(--desk-space-6) var(--desk-space-4);
2250
- text-align: center;
2251
- color: var(--desk-muted);
2252
- font-family: var(--desk-font);
2253
- font-size: 13px;
2254
- }
2255
-
2256
- /* ── Sidebar ── */
2257
-
2258
- .desk-sidebar {
2259
- display: flex;
2260
- flex-direction: column;
2261
- gap: var(--desk-space-3);
2262
- padding: var(--desk-space-2);
2263
- font-family: var(--desk-font);
2264
- overflow-y: auto;
2265
- }
2266
-
2267
- .desk-sidebar ul {
2268
- margin: 0;
2269
- padding: 0;
2270
- list-style: none;
2271
- }
2272
-
2273
- .desk-sidebar-heading {
2274
- margin: 0 0 var(--desk-space-1);
2275
- padding: 0 var(--desk-space-2);
2276
- font-size: 11px;
2277
- font-weight: 700;
2278
- letter-spacing: .08em;
2279
- text-transform: uppercase;
2280
- color: var(--desk-muted);
2281
- }
2282
-
2283
- .desk-sidebar-item {
2284
- display: flex;
2285
- align-items: center;
2286
- gap: var(--desk-space-2);
2287
- width: 100%;
2288
- padding: var(--desk-space-1) var(--desk-space-2);
2289
- border: 0;
2290
- border-radius: 7px;
2291
- background: none;
2292
- color: var(--desk-ink);
2293
- font-family: inherit;
2294
- font-size: 13px;
2295
- text-align: left;
2296
- cursor: pointer;
2297
- }
2298
-
2299
- .desk-sidebar-item:hover:not(:disabled) {
2300
- background: color-mix(in srgb, var(--desk-ink) 7%, transparent);
2301
- }
2302
-
2303
- .desk-sidebar-item[data-current] {
2304
- background: color-mix(in srgb, var(--desk-accent) 18%, transparent);
2305
- font-weight: 500;
2306
- }
2307
-
2308
- .desk-sidebar-item:focus-visible {
2309
- outline: 2px solid var(--desk-accent);
2310
- outline-offset: -2px;
2311
- }
2312
-
2313
- .desk-sidebar-item:disabled {
2314
- opacity: .45;
2315
- cursor: not-allowed;
2316
- }
2317
-
2318
- .desk-sidebar-icon {
2319
- display: grid;
2320
- place-items: center;
2321
- width: 16px;
2322
- height: 16px;
2323
- flex: none;
2324
- color: var(--desk-muted);
2325
- }
2326
-
2327
- .desk-sidebar-item[data-current] .desk-sidebar-icon {
2328
- color: var(--desk-accent);
2329
- }
2330
-
2331
- .desk-sidebar-label {
2332
- flex: 1;
2333
- min-width: 0;
2334
- overflow: hidden;
2335
- text-overflow: ellipsis;
2336
- white-space: nowrap;
2337
- }
2338
-
2339
- .desk-sidebar-badge {
2340
- flex: none;
2341
- min-width: 18px;
2342
- padding: 0 5px;
2343
- border-radius: 9px;
2344
- background: color-mix(in srgb, var(--desk-ink) 12%, transparent);
2345
- font-size: 11px;
2346
- font-variant-numeric: tabular-nums;
2347
- text-align: center;
2348
- }
2349
-
2350
- .desk-sidebar-footer {
2351
- margin-top: auto;
2352
- padding: var(--desk-space-2);
2353
- border-top: 1px solid var(--desk-rule);
2354
- }
2355
-
2356
- /* ── Wizard ── */
2357
-
2358
- .desk-wizard {
2359
- box-sizing: border-box;
2360
- width: min(640px, 100%);
2361
- min-height: 520px;
2362
- display: flex;
2363
- flex-direction: column;
2364
- border: 1px solid var(--desk-rule);
2365
- border-radius: 20px;
2366
- background: var(--desk-surface);
2367
- box-shadow: var(--desk-shadow-floating);
2368
- font-family: var(--desk-font);
2369
- color: var(--desk-ink);
2370
- overflow: hidden;
2371
- }
2372
-
2373
- .desk-wizard-content {
2374
- flex: 1;
2375
- display: flex;
2376
- flex-direction: column;
2377
- align-items: center;
2378
- gap: var(--desk-space-2);
2379
- padding: var(--desk-space-7) var(--desk-space-6) var(--desk-space-5);
2380
- text-align: center;
2381
- animation: desk-wizard-in .32s var(--desk-ease);
2382
- }
2383
-
2384
- .desk-wizard-content[data-direction="back"] {
2385
- animation-name: desk-wizard-back;
2386
- }
2387
-
2388
- @keyframes desk-wizard-in {
2389
- from {
2390
- opacity: 0;
2391
- transform: translateX(22px);
2392
- }
2393
- }
2394
-
2395
- @keyframes desk-wizard-back {
2396
- from {
2397
- opacity: 0;
2398
- transform: translateX(-22px);
2399
- }
2400
- }
2401
-
2402
- .desk-wizard-glyph {
2403
- display: grid;
2404
- place-items: center;
2405
- width: 60px;
2406
- height: 60px;
2407
- margin-bottom: var(--desk-space-2);
2408
- border: 1px solid var(--desk-rule);
2409
- border-radius: 16px;
2410
- color: var(--desk-accent);
2411
- }
2412
-
2413
- .desk-wizard-glyph svg {
2414
- width: 28px;
2415
- height: 28px;
2416
- }
2417
-
2418
- .desk-wizard-title {
2419
- margin: 0;
2420
- font-size: 22px;
2421
- font-weight: 700;
2422
- letter-spacing: -.02em;
2423
- text-wrap: balance;
2424
- }
2425
-
2426
- .desk-wizard-title:focus {
2427
- outline: none;
2428
- }
2429
-
2430
- .desk-wizard-description {
2431
- margin: 0 0 var(--desk-space-4);
2432
- max-width: 46ch;
2433
- color: var(--desk-muted);
2434
- font-size: 13.5px;
2435
- line-height: 1.5;
2436
- text-wrap: pretty;
2437
- }
2438
-
2439
- /* Whatever the step puts in the pane lines up left, even though the pane is centred. */
2440
- .desk-wizard-content > *:not(.desk-wizard-glyph):not(.desk-wizard-title):not(.desk-wizard-description) {
2441
- width: 100%;
2442
- max-width: 420px;
2443
- text-align: left;
2444
- }
2445
-
2446
- .desk-wizard-error {
2447
- margin: var(--desk-space-3) 0 0;
2448
- padding: var(--desk-space-2) var(--desk-space-3);
2449
- border-radius: var(--desk-control-radius);
2450
- background: color-mix(in srgb, var(--desk-bad) 14%, transparent);
2451
- color: var(--desk-ink);
2452
- font-size: 13px;
2453
- }
2454
-
2455
- .desk-wizard-foot {
2456
- flex: none;
2457
- display: flex;
2458
- align-items: center;
2459
- gap: var(--desk-space-3);
2460
- padding: var(--desk-space-3) var(--desk-space-4);
2461
- border-top: 1px solid var(--desk-rule);
2462
- background: var(--desk-titlebar);
2463
- }
2464
-
2465
- .desk-wizard-steps {
2466
- display: flex;
2467
- align-items: center;
2468
- gap: 6px;
2469
- margin: 0;
2470
- padding: 0;
2471
- list-style: none;
2472
- }
2473
-
2474
- .desk-wizard-dot {
2475
- width: 7px;
2476
- height: 7px;
2477
- border-radius: 50%;
2478
- background: color-mix(in srgb, var(--desk-ink) 20%, transparent);
2479
- transition: width .25s var(--desk-ease), background .25s var(--desk-ease);
2480
- }
2481
-
2482
- .desk-wizard-dot[data-state="done"] {
2483
- background: var(--desk-muted);
2484
- }
2485
-
2486
- .desk-wizard-dot[data-state="now"] {
2487
- width: 22px;
2488
- border-radius: 4px;
2489
- background: var(--desk-accent);
2490
- }
2491
-
2492
- .desk-wizard-dot-name {
2493
- position: absolute;
2494
- width: 1px;
2495
- height: 1px;
2496
- overflow: hidden;
2497
- clip-path: inset(50%);
2498
- white-space: nowrap;
2499
- }
2500
-
2501
- .desk-wizard-step-name {
2502
- font-size: 11.5px;
2503
- color: var(--desk-muted);
2504
- }
2505
-
2506
- .desk-wizard-actions {
2507
- margin-left: auto;
2508
- display: flex;
2509
- align-items: center;
2510
- gap: var(--desk-space-2);
2511
- }
2512
-
2513
- @media (max-width: 560px) {
2514
- .desk-wizard {
2515
- min-height: 0;
2516
- }
2517
-
2518
- .desk-wizard-content {
2519
- padding: var(--desk-space-5) var(--desk-space-4) var(--desk-space-4);
2520
- }
2521
-
2522
- .desk-wizard-step-name {
2523
- display: none;
2524
- }
2525
- }
2526
-
2527
- @media (prefers-reduced-motion: reduce) {
2528
- .desk-wizard-content {
2529
- animation: none;
2530
- }
2531
-
2532
- .desk-wizard-dot {
2533
- transition: none;
2534
- }
2535
- }
2536
-
2537
- /* ── Dragging between windows ── */
2538
-
2539
- .desk-drag-preview {
2540
- position: fixed;
2541
- z-index: 1600;
2542
- transform: translate(12px, 12px);
2543
- padding: var(--desk-space-1) var(--desk-space-3);
2544
- border: 1px solid var(--desk-rule);
2545
- border-radius: 8px;
2546
- background: var(--desk-surface);
2547
- box-shadow: var(--desk-shadow-floating);
2548
- color: var(--desk-ink);
2549
- font-family: var(--desk-font);
2550
- font-size: 12.5px;
2551
- pointer-events: none;
2552
- }
2553
-
2554
- [data-desk-draggable] {
2555
- cursor: grab;
2556
- touch-action: none;
2557
- /* Pressing to drag should pick the thing up, not start selecting its text. */
2558
- user-select: none;
2559
- -webkit-user-select: none;
2560
- }
2561
-
2562
- [data-desk-draggable]:active {
2563
- cursor: grabbing;
2564
- }
2565
-
2566
- /* A target says it could take this while something is being carried, and lights up under it. */
2567
- [data-desk-drop][data-ready] {
2568
- outline: 1px dashed color-mix(in srgb, var(--desk-accent) 55%, transparent);
2569
- outline-offset: -3px;
2570
- border-radius: 8px;
2571
- }
2572
-
2573
- [data-desk-drop][data-over] {
2574
- outline: 2px solid var(--desk-accent);
2575
- background: color-mix(in srgb, var(--desk-accent) 12%, transparent);
2576
- }
2577
-
2578
- /* ── A generated app in a window ── */
2579
-
2580
- .desk-app-frame {
2581
- position: relative;
2582
- height: 100%;
2583
- min-height: 0;
2584
- display: flex;
2585
- }
2586
-
2587
- .desk-app-frame-page {
2588
- flex: 1;
2589
- width: 100%;
2590
- border: 0;
2591
- background: var(--desk-surface);
2592
- }
2593
-
2594
- /* Icon view: a Finder's icons, in rows that follow the window's width. */
2595
- .desk-icon-view {
2596
- list-style: none;
2597
- margin: 0;
2598
- padding: 12px;
2599
- display: grid;
2600
- grid-template-columns: repeat(auto-fill, minmax(104px, 1fr));
2601
- align-content: start;
2602
- gap: 8px;
2603
- }
2604
-
2605
- .desk-icon-cell {
2606
- display: grid;
2607
- justify-items: center;
2608
- align-content: start;
2609
- gap: 4px;
2610
- padding: 10px 6px;
2611
- border-radius: 10px;
2612
- text-align: center;
2613
- cursor: default;
2614
- user-select: none;
2615
- outline: none;
2616
- }
2617
-
2618
- .desk-icon-cell[aria-disabled="true"] {
2619
- opacity: .45;
2620
- }
2621
-
2622
- .desk-icon-cell:focus-visible {
2623
- box-shadow: 0 0 0 2px var(--desk-accent);
2624
- }
2625
-
2626
- .desk-icon-glyph {
2627
- position: relative;
2628
- display: grid;
2629
- place-items: center;
2630
- width: 56px;
2631
- height: 56px;
2632
- border-radius: 14px;
2633
- border: 1px solid var(--desk-rule);
2634
- background: var(--desk-dock-icon);
2635
- color: var(--desk-ink);
2636
- }
2637
-
2638
- .desk-icon-glyph > svg,
2639
- .desk-icon-glyph > img {
2640
- width: 55%;
2641
- height: 55%;
2642
- object-fit: contain;
2643
- }
2644
-
2645
- .desk-icon-badge {
2646
- position: absolute;
2647
- top: -5px;
2648
- right: -5px;
2649
- min-width: 18px;
2650
- padding: 0 5px;
2651
- border-radius: 9px;
2652
- background: var(--desk-accent);
2653
- color: #fff;
2654
- font-size: 11px;
2655
- line-height: 18px;
2656
- }
2657
-
2658
- .desk-icon-label {
2659
- max-width: 100%;
2660
- padding: 1px 6px;
2661
- border-radius: 5px;
2662
- font-size: 12.5px;
2663
- line-height: 1.3;
2664
- overflow-wrap: anywhere;
2665
- display: -webkit-box;
2666
- -webkit-line-clamp: 2;
2667
- -webkit-box-orient: vertical;
2668
- overflow: hidden;
2669
- }
2670
-
2671
- .desk-icon-subtitle {
2672
- max-width: 100%;
2673
- font-size: 11px;
2674
- color: var(--desk-muted);
2675
- overflow: hidden;
2676
- text-overflow: ellipsis;
2677
- white-space: nowrap;
2678
- }
2679
-
2680
- .desk-icon-cell[aria-selected="true"] .desk-icon-glyph {
2681
- background: color-mix(in srgb, var(--desk-accent) 16%, transparent);
2682
- }
2683
-
2684
- .desk-icon-cell[aria-selected="true"] .desk-icon-label {
2685
- background: var(--desk-accent);
2686
- color: #fff;
2687
- }
2688
-
2689
- .desk-icon-view-empty {
2690
- display: grid;
2691
- place-items: center;
2692
- padding: 32px 16px;
2693
- color: var(--desk-muted);
2694
- text-align: center;
2695
- }
2696
-
2697
- .desk-icon-drag {
2698
- display: grid;
2699
- place-items: center;
2700
- width: 40px;
2701
- height: 40px;
2702
- }
2703
-
2704
- /* Something carried to the dock: the dock lights up, and a kept item shows where it would go in front. */
2705
- .desk-dock-item[data-desk-drop][data-ready] {
2706
- outline: none;
2707
- background: var(--desk-dock-icon);
2708
- }
2709
-
2710
- .desk-dock-item[data-desk-drop][data-over] {
2711
- box-shadow: -6px 0 0 -2px var(--desk-accent);
2712
- }
2713
-
2714
- /* ── The inside of a window: controls that stay, content that scrolls ── */
2715
-
2716
- .desk-pane {
2717
- display: flex;
2718
- flex-direction: column;
2719
- height: 100%;
2720
- min-height: 0;
2721
- }
2722
-
2723
- .desk-pane-header,
2724
- .desk-pane-footer {
2725
- flex: none;
2726
- }
2727
-
2728
- /* The only part that scrolls, so the toolbar never leaves with the content. */
2729
- .desk-pane-body {
2730
- flex: 1;
2731
- min-height: 0;
2732
- overflow: auto;
2733
- }
2734
-
2735
- .desk-pane-body:focus-visible {
2736
- outline: 2px solid var(--desk-accent);
2737
- outline-offset: -2px;
2738
- }
2739
-
2740
- /* A window whose whole content is a pane does not scroll itself: the pane's middle does. */
2741
- .desk-body:has(> .desk-pane) {
2742
- overflow: hidden;
2743
- }
2744
-
2745
- .desk-toolbar {
2746
- display: flex;
2747
- align-items: center;
2748
- flex-wrap: wrap;
2749
- gap: var(--desk-space-2);
2750
- /* One centre line for everything in the row, whatever each control's own height is. */
2751
- min-height: calc(var(--desk-control-height) + var(--desk-space-2) * 2);
2752
- padding: var(--desk-space-2) var(--desk-space-3);
2753
- border-bottom: 1px solid var(--desk-rule);
2754
- }
2755
-
2756
- .desk-toolbar > *,
2757
- .desk-toolbar-trailing > * {
2758
- flex: none;
2759
- }
2760
-
2761
- .desk-toolbar .desk-grow {
2762
- flex: 1 1 140px;
2763
- min-width: 0;
2764
- }
2765
-
2766
- .desk-toolbar-trailing {
2767
- margin-left: auto;
2768
- display: flex;
2769
- align-items: center;
2770
- gap: var(--desk-space-2);
2771
- }
2772
-
2773
- /* ── An (i): what a view would explain if asked ── */
2774
-
2775
- .desk-infotip {
2776
- flex: none;
2777
- display: inline-grid;
2778
- place-items: center;
2779
- width: 18px;
2780
- height: 18px;
2781
- padding: 0;
2782
- /* The title bar's own green, the one the zoom control wears: a muted grey (i) sat in a muted
2783
- trailing edge and went unseen, which defeats the point of having one place to ask. */
2784
- border: 1px solid color-mix(in srgb, var(--desk-info) 55%, transparent);
2785
- border-radius: 50%;
2786
- background: color-mix(in srgb, var(--desk-info) 14%, transparent);
2787
- color: var(--desk-info);
2788
- font-family: var(--desk-font);
2789
- font-size: 11px;
2790
- font-style: italic;
2791
- font-weight: 700;
2792
- line-height: 1;
2793
- cursor: pointer;
2794
- }
2795
-
2796
- .desk-infotip:hover,
2797
- .desk-infotip[data-open] {
2798
- border-color: var(--desk-info);
2799
- background: color-mix(in srgb, var(--desk-info) 26%, transparent);
2800
- }
2801
-
2802
- .desk-infotip:focus-visible {
2803
- outline: 2px solid var(--desk-info);
2804
- outline-offset: 2px;
2805
- }
2806
-
2807
- .desk-infotip-body {
2808
- max-width: 34ch;
2809
- font-size: 12.5px;
2810
- line-height: 1.45;
2811
- color: var(--desk-muted);
2812
- }
2813
-
2814
- .desk-infotip-body > :first-child {
2815
- margin-top: 0;
2816
- }
2817
-
2818
- .desk-infotip-body > :last-child {
2819
- margin-bottom: 0;
2820
- }