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