@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/dist/desk.css CHANGED
@@ -1,3 +1,4 @@
1
+ /* @liberation-data/desk — tokens.css */
1
2
  /*
2
3
  * desk — the stage and its windows. Every value reads a --desk-* token, so an
3
4
  * app restyles the desk by redefining tokens, never by overriding selectors.
@@ -12,6 +13,7 @@
12
13
  --desk-accent: #5b57f5;
13
14
  --desk-close: #ef6b63;
14
15
  --desk-mode: #34c47a;
16
+ --desk-info: #34c47a;
15
17
  --desk-radius: 12px;
16
18
  --desk-gap: 12px;
17
19
  --desk-padding: 12px;
@@ -62,6 +64,7 @@
62
64
  --desk-dock-glass: rgb(11 18 32 / 62%);
63
65
  --desk-dock-icon: linear-gradient(160deg, #1a2338, #0e1526);
64
66
  --desk-ok: #3ecf8e;
67
+ --desk-info: #3ecf8e;
65
68
  --desk-warn: #fbbf24;
66
69
  --desk-bad: #f87171;
67
70
  --desk-field-bg: rgb(0 0 0 / 35%);
@@ -80,11 +83,13 @@
80
83
  --desk-dock-glass: rgb(11 18 32 / 62%);
81
84
  --desk-dock-icon: linear-gradient(160deg, #1a2338, #0e1526);
82
85
  --desk-ok: #3ecf8e;
86
+ --desk-info: #3ecf8e;
83
87
  --desk-warn: #fbbf24;
84
88
  --desk-bad: #f87171;
85
89
  --desk-field-bg: rgb(0 0 0 / 35%);
86
90
  }
87
91
 
92
+ /* @liberation-data/desk — windows.css */
88
93
  .desk-stage {
89
94
  position: relative;
90
95
  box-sizing: border-box;
@@ -229,6 +234,20 @@
229
234
  color: var(--desk-muted);
230
235
  }
231
236
 
237
+ /* The note gives up the spare room; the (i) keeps its place at the end of the bar. */
238
+ .desk-window-note + .desk-window-info {
239
+ margin-left: var(--desk-space-2);
240
+ }
241
+
242
+ .desk-window-info {
243
+ margin-left: auto;
244
+ }
245
+
246
+ .desk-window-note ~ .desk-window-info {
247
+ margin-left: var(--desk-space-2);
248
+ }
249
+
250
+ .desk-window-info + .desk-window-actions,
232
251
  .desk-window-note + .desk-window-actions {
233
252
  margin-left: var(--desk-space-1);
234
253
  }
@@ -333,6 +352,66 @@
333
352
  right: var(--desk-padding);
334
353
  }
335
354
 
355
+ /* ── The inside of a window: controls that stay, content that scrolls ── */
356
+
357
+ .desk-pane {
358
+ display: flex;
359
+ flex-direction: column;
360
+ height: 100%;
361
+ min-height: 0;
362
+ }
363
+
364
+ .desk-pane-header,
365
+ .desk-pane-footer {
366
+ flex: none;
367
+ }
368
+
369
+ /* The only part that scrolls, so the toolbar never leaves with the content. */
370
+ .desk-pane-body {
371
+ flex: 1;
372
+ min-height: 0;
373
+ overflow: auto;
374
+ }
375
+
376
+ .desk-pane-body:focus-visible {
377
+ outline: 2px solid var(--desk-accent);
378
+ outline-offset: -2px;
379
+ }
380
+
381
+ /* A window whose whole content is a pane does not scroll itself: the pane's middle does. */
382
+ .desk-body:has(> .desk-pane) {
383
+ overflow: hidden;
384
+ }
385
+
386
+ .desk-toolbar {
387
+ display: flex;
388
+ align-items: center;
389
+ flex-wrap: wrap;
390
+ gap: var(--desk-space-2);
391
+ /* One centre line for everything in the row, whatever each control's own height is. */
392
+ min-height: calc(var(--desk-control-height) + var(--desk-space-2) * 2);
393
+ padding: var(--desk-space-2) var(--desk-space-3);
394
+ border-bottom: 1px solid var(--desk-rule);
395
+ }
396
+
397
+ .desk-toolbar > *,
398
+ .desk-toolbar-trailing > * {
399
+ flex: none;
400
+ }
401
+
402
+ .desk-toolbar .desk-grow {
403
+ flex: 1 1 140px;
404
+ min-width: 0;
405
+ }
406
+
407
+ .desk-toolbar-trailing {
408
+ margin-left: auto;
409
+ display: flex;
410
+ align-items: center;
411
+ gap: var(--desk-space-2);
412
+ }
413
+
414
+ /* @liberation-data/desk — dock.css */
336
415
  /* ── Dock ── */
337
416
 
338
417
  .desk-dock {
@@ -595,6 +674,17 @@
595
674
  color: var(--desk-muted);
596
675
  }
597
676
 
677
+ /* Something carried to the dock: the dock lights up, and a kept item shows where it would go in front. */
678
+ .desk-dock-item[data-desk-drop][data-ready] {
679
+ outline: none;
680
+ background: var(--desk-dock-icon);
681
+ }
682
+
683
+ .desk-dock-item[data-desk-drop][data-over] {
684
+ box-shadow: -6px 0 0 -2px var(--desk-accent);
685
+ }
686
+
687
+ /* @liberation-data/desk — menus.css */
598
688
  /* ── Menu bar ── */
599
689
 
600
690
  .desk-menubar {
@@ -799,6 +889,7 @@
799
889
  }
800
890
  }
801
891
 
892
+ /* @liberation-data/desk — controls.css */
802
893
  /* ── Controls ── */
803
894
 
804
895
  .desk-button {
@@ -1070,486 +1161,519 @@
1070
1161
  }
1071
1162
  }
1072
1163
 
1073
- /* ── Overlays ── */
1164
+ /* ── Checkbox and slider ── */
1074
1165
 
1075
- .desk-popover-anchor {
1076
- position: relative;
1077
- display: inline-flex;
1166
+ .desk-check-row {
1167
+ display: flex;
1168
+ align-items: flex-start;
1169
+ gap: var(--desk-space-2);
1170
+ padding: var(--desk-space-1) 0;
1078
1171
  }
1079
1172
 
1080
- .desk-popover {
1081
- position: absolute;
1082
- z-index: 1200;
1083
- min-width: 220px;
1084
- max-width: min(360px, calc(100vw - 24px));
1173
+ .desk-checkbox {
1174
+ width: 16px;
1175
+ height: 16px;
1176
+ margin: 2px 0 0;
1177
+ accent-color: var(--desk-accent);
1178
+ flex: none;
1179
+ }
1180
+
1181
+ .desk-check-text {
1182
+ display: flex;
1183
+ flex-direction: column;
1184
+ gap: 2px;
1185
+ }
1186
+
1187
+ .desk-check-label {
1188
+ font-size: 13px;
1189
+ }
1190
+
1191
+ .desk-checkbox:focus-visible,
1192
+ .desk-slider-track:focus-visible {
1193
+ outline: 2px solid var(--desk-accent);
1194
+ outline-offset: 2px;
1195
+ }
1196
+
1197
+ .desk-choices {
1198
+ margin: 0;
1199
+ padding: 0;
1200
+ border: 0;
1201
+ display: flex;
1202
+ flex-direction: column;
1203
+ gap: var(--desk-space-2);
1204
+ }
1205
+
1206
+ .desk-choice {
1207
+ display: flex;
1208
+ align-items: flex-start;
1209
+ gap: var(--desk-space-3);
1085
1210
  padding: var(--desk-space-3);
1086
1211
  border: 1px solid var(--desk-rule);
1087
1212
  border-radius: 12px;
1088
1213
  background: var(--desk-surface);
1089
- box-shadow: var(--desk-shadow-floating);
1090
- animation: desk-menu-in .14s var(--desk-ease);
1214
+ cursor: pointer;
1091
1215
  }
1092
1216
 
1093
- .desk-popover[data-placement="below"] {
1094
- top: calc(100% + 6px);
1217
+ .desk-choice:hover:not([data-disabled]) {
1218
+ border-color: color-mix(in srgb, var(--desk-accent) 50%, var(--desk-rule));
1095
1219
  }
1096
1220
 
1097
- .desk-popover[data-placement="above"] {
1098
- bottom: calc(100% + 6px);
1221
+ .desk-choice[data-chosen] {
1222
+ border-color: var(--desk-accent);
1223
+ box-shadow: 0 0 0 1px var(--desk-accent);
1099
1224
  }
1100
1225
 
1101
- .desk-popover[data-align="start"] {
1102
- left: 0;
1226
+ .desk-choice[data-disabled] {
1227
+ opacity: .45;
1228
+ cursor: not-allowed;
1103
1229
  }
1104
1230
 
1105
- .desk-popover[data-align="end"] {
1106
- right: 0;
1231
+ .desk-choice:has(:focus-visible) {
1232
+ outline: 2px solid var(--desk-accent);
1233
+ outline-offset: 2px;
1107
1234
  }
1108
1235
 
1109
- /* A sheet belongs to its window: the scrim covers that window and nothing else. */
1110
- .desk-sheet-scrim,
1111
- .desk-alert-scrim {
1236
+ .desk-choice-input {
1112
1237
  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);
1238
+ opacity: 0;
1239
+ pointer-events: none;
1123
1240
  }
1124
1241
 
1125
- .desk-alert-scrim {
1126
- position: fixed;
1127
- z-index: 1400;
1242
+ .desk-choice-mark {
1243
+ flex: none;
1244
+ display: grid;
1128
1245
  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
- }
1246
+ width: 16px;
1247
+ height: 16px;
1248
+ margin-top: 2px;
1249
+ border: 1.5px solid var(--desk-rule);
1250
+ border-radius: 50%;
1137
1251
  }
1138
1252
 
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);
1253
+ .desk-choice[data-chosen] .desk-choice-mark {
1254
+ border-color: var(--desk-accent);
1150
1255
  }
1151
1256
 
1152
- .desk-sheet {
1153
- animation: desk-sheet-in .22s var(--desk-ease);
1257
+ .desk-choice[data-chosen] .desk-choice-mark::after {
1258
+ content: "";
1259
+ width: 8px;
1260
+ height: 8px;
1261
+ border-radius: 50%;
1262
+ background: var(--desk-accent);
1154
1263
  }
1155
1264
 
1156
- .desk-alert {
1157
- width: min(380px, 100%);
1158
- text-align: center;
1159
- animation: desk-alert-in .16s var(--desk-ease);
1265
+ .desk-choice-icon {
1266
+ flex: none;
1267
+ display: grid;
1268
+ place-items: center;
1269
+ width: 36px;
1270
+ height: 36px;
1271
+ border: 1px solid var(--desk-rule);
1272
+ border-radius: 10px;
1273
+ color: var(--desk-muted);
1160
1274
  }
1161
1275
 
1162
- @keyframes desk-sheet-in {
1163
- from {
1164
- transform: translateY(-12px);
1165
- opacity: 0;
1166
- }
1276
+ .desk-choice-icon svg {
1277
+ width: 18px;
1278
+ height: 18px;
1167
1279
  }
1168
1280
 
1169
- @keyframes desk-alert-in {
1170
- from {
1171
- transform: scale(.97);
1172
- opacity: 0;
1173
- }
1281
+ .desk-choice-text {
1282
+ flex: 1;
1283
+ min-width: 0;
1284
+ display: flex;
1285
+ flex-direction: column;
1286
+ gap: 2px;
1174
1287
  }
1175
1288
 
1176
- .desk-sheet-title,
1177
- .desk-alert-title {
1178
- margin: 0 0 var(--desk-space-1);
1179
- font-size: 15px;
1289
+ .desk-choice-label {
1180
1290
  font-weight: 600;
1181
1291
  }
1182
1292
 
1183
- .desk-sheet-description,
1184
- .desk-alert-message {
1185
- margin: 0 0 var(--desk-space-3);
1293
+ .desk-choice-tag {
1294
+ margin-left: var(--desk-space-2);
1295
+ font-weight: 400;
1186
1296
  color: var(--desk-muted);
1187
- font-size: 13px;
1188
- line-height: 1.5;
1189
1297
  }
1190
1298
 
1191
- .desk-sheet-actions,
1192
- .desk-alert-actions {
1299
+ .desk-checklist {
1193
1300
  display: flex;
1194
- justify-content: flex-end;
1195
- gap: var(--desk-space-2);
1196
- margin-top: var(--desk-space-4);
1301
+ flex-direction: column;
1302
+ gap: var(--desk-space-3);
1197
1303
  }
1198
1304
 
1199
- .desk-alert-actions {
1200
- justify-content: center;
1305
+ .desk-progress {
1306
+ height: 5px;
1307
+ border-radius: 3px;
1308
+ background: var(--desk-rule);
1309
+ overflow: hidden;
1201
1310
  }
1202
1311
 
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));
1312
+ .desk-progress i {
1313
+ display: block;
1314
+ height: 100%;
1315
+ background: var(--desk-accent);
1316
+ transition: width .4s var(--desk-ease);
1212
1317
  }
1213
1318
 
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);
1319
+ .desk-tasks {
1320
+ margin: 0;
1321
+ padding: 0;
1322
+ list-style: none;
1219
1323
  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);
1324
+ border-radius: 12px;
1226
1325
  }
1227
1326
 
1228
- @keyframes desk-toast-in {
1229
- from {
1230
- transform: translateY(8px);
1231
- opacity: 0;
1232
- }
1327
+ .desk-task {
1328
+ display: flex;
1329
+ align-items: center;
1330
+ gap: var(--desk-space-3);
1331
+ padding: var(--desk-space-2) var(--desk-space-3);
1233
1332
  }
1234
1333
 
1235
- .desk-toast[data-tone="ok"] {
1236
- border-color: color-mix(in srgb, var(--desk-ok) 45%, var(--desk-rule));
1334
+ .desk-task + .desk-task {
1335
+ border-top: 1px solid var(--desk-rule);
1237
1336
  }
1238
1337
 
1239
- .desk-toast[data-tone="bad"] {
1240
- border-color: color-mix(in srgb, var(--desk-bad) 45%, var(--desk-rule));
1338
+ .desk-task-mark {
1339
+ flex: none;
1340
+ display: grid;
1341
+ place-items: center;
1342
+ box-sizing: border-box;
1343
+ width: 20px;
1344
+ height: 20px;
1345
+ border-radius: 50%;
1346
+ font-size: 12px;
1347
+ border: 1.5px dashed var(--desk-rule);
1241
1348
  }
1242
1349
 
1243
- .desk-toast-message {
1244
- flex: 1;
1245
- min-width: 0;
1350
+ .desk-task[data-state="working"] .desk-task-mark {
1351
+ border: 2px solid var(--desk-rule);
1352
+ border-top-color: var(--desk-accent);
1353
+ animation: desk-spin .8s linear infinite;
1246
1354
  }
1247
1355
 
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
- }
1356
+ .desk-task[data-state="done"] .desk-task-mark {
1357
+ border: 0;
1358
+ background: color-mix(in srgb, var(--desk-ok) 18%, transparent);
1359
+ color: var(--desk-ok);
1259
1360
  }
1260
1361
 
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);
1362
+ .desk-task[data-state="failed"] .desk-task-mark {
1363
+ border: 0;
1364
+ background: color-mix(in srgb, var(--desk-bad) 18%, transparent);
1365
+ color: var(--desk-bad);
1366
+ font-weight: 700;
1270
1367
  }
1271
1368
 
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);
1369
+ @keyframes desk-spin {
1370
+ to {
1371
+ transform: rotate(360deg);
1372
+ }
1280
1373
  }
1281
1374
 
1282
- .desk-message {
1375
+ .desk-task-text {
1376
+ flex: 1;
1377
+ min-width: 0;
1283
1378
  display: flex;
1284
1379
  flex-direction: column;
1285
- align-items: flex-start;
1286
- max-width: min(80%, 60ch);
1287
1380
  }
1288
1381
 
1289
- .desk-message[data-mine] {
1290
- align-self: flex-end;
1291
- align-items: flex-end;
1382
+ .desk-task-name {
1383
+ font-size: 13px;
1384
+ font-weight: 600;
1292
1385
  }
1293
1386
 
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);
1387
+ .desk-task-detail,
1388
+ .desk-task-error {
1389
+ font-size: 12px;
1390
+ color: var(--desk-muted);
1297
1391
  }
1298
1392
 
1299
- .desk-message:first-child {
1300
- margin-top: 0;
1393
+ .desk-task-error {
1394
+ color: var(--desk-bad);
1301
1395
  }
1302
1396
 
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);
1397
+ @media (prefers-reduced-motion: reduce) {
1398
+ .desk-task[data-state="working"] .desk-task-mark {
1399
+ animation: none;
1400
+ }
1309
1401
  }
1310
1402
 
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;
1403
+ .desk-radiogroup {
1404
+ margin: 0;
1405
+ padding: 0;
1406
+ border: 0;
1407
+ display: flex;
1408
+ flex-direction: column;
1409
+ gap: var(--desk-space-1);
1320
1410
  }
1321
1411
 
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;
1412
+ .desk-radiogroup legend {
1413
+ padding: 0;
1414
+ margin-bottom: var(--desk-space-1);
1327
1415
  }
1328
1416
 
1329
- .desk-message:not([data-mine]) .desk-bubble {
1330
- border-bottom-left-radius: 5px;
1417
+ .desk-radio {
1418
+ width: 16px;
1419
+ height: 16px;
1420
+ margin: 2px 0 0;
1421
+ accent-color: var(--desk-accent);
1422
+ flex: none;
1331
1423
  }
1332
1424
 
1333
- .desk-message[data-state="sending"] .desk-bubble {
1334
- opacity: .6;
1425
+ .desk-radio:focus-visible {
1426
+ outline: 2px solid var(--desk-accent);
1427
+ outline-offset: 2px;
1335
1428
  }
1336
1429
 
1337
- .desk-message[data-state="failed"] .desk-bubble {
1338
- border-color: var(--desk-bad);
1430
+ .desk-slider {
1431
+ display: flex;
1432
+ flex-direction: column;
1433
+ gap: var(--desk-space-1);
1339
1434
  }
1340
1435
 
1341
- .desk-message-foot {
1436
+ .desk-slider-head {
1342
1437
  display: flex;
1343
- align-items: center;
1438
+ align-items: baseline;
1439
+ justify-content: space-between;
1344
1440
  gap: var(--desk-space-2);
1345
- padding: 2px var(--desk-space-1) 0;
1346
- font-size: 11px;
1347
- color: var(--desk-muted);
1348
1441
  }
1349
1442
 
1350
- .desk-message-foot:empty {
1351
- display: none;
1443
+ .desk-slider-value {
1444
+ font-size: 12px;
1445
+ font-variant-numeric: tabular-nums;
1446
+ color: var(--desk-ink);
1352
1447
  }
1353
1448
 
1354
- .desk-message-failed {
1355
- color: var(--desk-bad);
1449
+ .desk-slider-track {
1450
+ width: 100%;
1451
+ accent-color: var(--desk-accent);
1356
1452
  }
1357
1453
 
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);
1454
+ /* ── Pop-up button ── */
1455
+
1456
+ .desk-popup-anchor {
1457
+ position: relative;
1366
1458
  }
1367
1459
 
1368
- .desk-typing-dots {
1460
+ .desk-popup-button {
1369
1461
  display: flex;
1370
- gap: 4px;
1462
+ align-items: center;
1463
+ gap: var(--desk-space-2);
1464
+ width: 100%;
1465
+ min-height: var(--desk-control-height);
1466
+ padding: 0 var(--desk-space-2) 0 var(--desk-space-3);
1467
+ border: 1px solid var(--desk-rule);
1468
+ border-radius: var(--desk-control-radius);
1469
+ background: var(--desk-field-bg);
1470
+ color: var(--desk-ink);
1471
+ font-family: var(--desk-font);
1472
+ font-size: 13px;
1473
+ text-align: left;
1474
+ cursor: pointer;
1371
1475
  }
1372
1476
 
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;
1477
+ .desk-popup-button[data-size="small"] {
1478
+ min-height: var(--desk-control-height-small);
1479
+ font-size: 12px;
1379
1480
  }
1380
1481
 
1381
- .desk-typing-dots i:nth-child(2) {
1382
- animation-delay: .15s;
1482
+ .desk-popup-button:focus-visible {
1483
+ outline: 2px solid var(--desk-accent);
1484
+ outline-offset: 2px;
1383
1485
  }
1384
1486
 
1385
- .desk-typing-dots i:nth-child(3) {
1386
- animation-delay: .3s;
1387
- }
1487
+ .desk-popup-button:disabled {
1488
+ opacity: .45;
1489
+ cursor: not-allowed;
1490
+ }
1388
1491
 
1389
- @keyframes desk-typing {
1390
- 0%, 60%, 100% {
1391
- opacity: .3;
1392
- }
1393
- 30% {
1394
- opacity: 1;
1395
- }
1492
+ .desk-popup-value {
1493
+ flex: 1;
1494
+ min-width: 0;
1495
+ overflow: hidden;
1496
+ text-overflow: ellipsis;
1497
+ white-space: nowrap;
1396
1498
  }
1397
1499
 
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);
1500
+ .desk-popup-value[data-placeholder] {
1501
+ color: var(--desk-muted);
1404
1502
  }
1405
1503
 
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);
1504
+ .desk-popup-icon {
1505
+ display: grid;
1506
+ place-items: center;
1507
+ width: 16px;
1508
+ height: 16px;
1413
1509
  }
1414
1510
 
1415
- .desk-composer-field {
1416
- flex: 1;
1417
- min-width: 0;
1418
- min-height: var(--desk-control-height);
1511
+ .desk-popup-chevron {
1512
+ color: var(--desk-muted);
1513
+ line-height: 1;
1514
+ }
1515
+
1516
+ .desk-popup-list {
1517
+ position: absolute;
1518
+ z-index: 1200;
1519
+ top: calc(100% + 4px);
1520
+ left: 0;
1521
+ min-width: 100%;
1419
1522
  max-height: 40vh;
1420
- padding: var(--desk-space-2) var(--desk-space-3);
1523
+ margin: 0;
1524
+ padding: 4px;
1525
+ list-style: none;
1526
+ overflow-y: auto;
1421
1527
  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;
1528
+ border-radius: 10px;
1529
+ background: var(--desk-surface);
1530
+ box-shadow: var(--desk-shadow-floating);
1531
+ animation: desk-menu-in .12s var(--desk-ease);
1429
1532
  }
1430
1533
 
1431
- .desk-composer-field:focus-visible {
1432
- outline: 2px solid var(--desk-accent);
1433
- outline-offset: 2px;
1534
+ .desk-popup-list:focus {
1535
+ outline: none;
1434
1536
  }
1435
1537
 
1436
- .desk-composer-field::placeholder {
1437
- color: var(--desk-muted);
1538
+ .desk-popup-option {
1539
+ display: flex;
1540
+ align-items: flex-start;
1541
+ gap: var(--desk-space-1);
1542
+ padding: var(--desk-space-1) var(--desk-space-2);
1543
+ border-radius: 6px;
1544
+ font-size: 13px;
1545
+ cursor: default;
1438
1546
  }
1439
1547
 
1440
- @media (prefers-reduced-motion: reduce) {
1441
- .desk-typing-dots i {
1442
- animation: none;
1443
- }
1548
+ .desk-popup-option[data-active] {
1549
+ background: var(--desk-accent);
1550
+ color: var(--desk-on-accent);
1444
1551
  }
1445
1552
 
1446
- /* ── Input bar: one place to type, which reaches the key window ── */
1553
+ .desk-popup-option[data-active] .desk-help {
1554
+ color: rgb(255 255 255 / 80%);
1555
+ }
1447
1556
 
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);
1557
+ .desk-popup-option[aria-disabled] {
1558
+ opacity: .5;
1458
1559
  }
1459
1560
 
1460
- .desk-inputbar[data-mode="summoned"] {
1461
- animation: desk-alert-in .16s var(--desk-ease);
1561
+ .desk-popup-check {
1562
+ width: 14px;
1563
+ flex: none;
1564
+ text-align: center;
1462
1565
  }
1463
1566
 
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);
1567
+ .desk-popup-text {
1568
+ display: flex;
1569
+ flex-direction: column;
1473
1570
  }
1474
1571
 
1475
- .desk-inputbar .desk-composer {
1476
- border-top: 0;
1477
- padding: var(--desk-space-2);
1572
+ /* ── Table ── */
1573
+
1574
+ .desk-table-wrap {
1575
+ overflow: auto;
1478
1576
  }
1479
1577
 
1480
- .desk-inputbar-target {
1481
- display: block;
1482
- padding: 0 var(--desk-space-3) var(--desk-space-2);
1578
+ .desk-table {
1579
+ width: 100%;
1580
+ border-collapse: collapse;
1483
1581
  font-family: var(--desk-font);
1582
+ font-size: 13px;
1583
+ }
1584
+
1585
+ .desk-table th {
1586
+ position: sticky;
1587
+ top: 0;
1588
+ z-index: 1;
1589
+ padding: var(--desk-space-1) var(--desk-space-2);
1590
+ border-bottom: 1px solid var(--desk-rule);
1591
+ background: var(--desk-surface);
1484
1592
  font-size: 11px;
1593
+ font-weight: 600;
1594
+ letter-spacing: .06em;
1595
+ text-transform: uppercase;
1485
1596
  color: var(--desk-muted);
1597
+ text-align: left;
1598
+ white-space: nowrap;
1486
1599
  }
1487
1600
 
1488
- .desk-inputbar-target b {
1489
- font-weight: 600;
1601
+ .desk-table th[data-align="end"],
1602
+ .desk-table td[data-align="end"] {
1603
+ text-align: right;
1604
+ }
1605
+
1606
+ .desk-table-sort {
1607
+ display: inline-flex;
1608
+ align-items: center;
1609
+ gap: 4px;
1610
+ padding: 0;
1611
+ border: 0;
1612
+ background: none;
1613
+ color: inherit;
1614
+ font: inherit;
1615
+ letter-spacing: inherit;
1616
+ text-transform: inherit;
1617
+ cursor: pointer;
1618
+ }
1619
+
1620
+ .desk-table-sort:hover {
1490
1621
  color: var(--desk-ink);
1491
1622
  }
1492
1623
 
1493
- /* ── Search ── */
1624
+ .desk-table td {
1625
+ padding: var(--desk-space-2);
1626
+ border-bottom: 1px solid var(--desk-rule);
1627
+ }
1494
1628
 
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);
1629
+ .desk-table td[data-numeric] {
1630
+ font-variant-numeric: tabular-nums;
1505
1631
  }
1506
1632
 
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);
1633
+ .desk-table tbody tr {
1634
+ cursor: default;
1520
1635
  }
1521
1636
 
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);
1637
+ .desk-table tbody tr:hover {
1638
+ background: color-mix(in srgb, var(--desk-ink) 5%, transparent);
1526
1639
  }
1527
1640
 
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;
1641
+ .desk-table tbody tr[data-selected] {
1642
+ background: color-mix(in srgb, var(--desk-accent) 16%, transparent);
1536
1643
  }
1537
1644
 
1538
- .desk-search-field::placeholder {
1645
+ .desk-table tbody tr:focus-visible {
1646
+ outline: 2px solid var(--desk-accent);
1647
+ outline-offset: -2px;
1648
+ }
1649
+
1650
+ .desk-table-empty {
1651
+ padding: var(--desk-space-6) var(--desk-space-4);
1652
+ text-align: center;
1539
1653
  color: var(--desk-muted);
1654
+ font-family: var(--desk-font);
1655
+ font-size: 13px;
1540
1656
  }
1541
1657
 
1542
- .desk-search-results {
1543
- flex: 1;
1544
- min-height: 0;
1658
+ /* ── Sidebar ── */
1659
+
1660
+ .desk-sidebar {
1661
+ display: flex;
1662
+ flex-direction: column;
1663
+ gap: var(--desk-space-3);
1664
+ padding: var(--desk-space-2);
1665
+ font-family: var(--desk-font);
1666
+ overflow-y: auto;
1667
+ }
1668
+
1669
+ .desk-sidebar ul {
1545
1670
  margin: 0;
1546
- padding: var(--desk-space-1);
1671
+ padding: 0;
1547
1672
  list-style: none;
1548
- overflow-y: auto;
1549
1673
  }
1550
1674
 
1551
- .desk-search-group {
1552
- margin: var(--desk-space-2) 0 2px;
1675
+ .desk-sidebar-heading {
1676
+ margin: 0 0 var(--desk-space-1);
1553
1677
  padding: 0 var(--desk-space-2);
1554
1678
  font-size: 11px;
1555
1679
  font-weight: 700;
@@ -1558,782 +1682,912 @@
1558
1682
  color: var(--desk-muted);
1559
1683
  }
1560
1684
 
1561
- .desk-search-row {
1685
+ .desk-sidebar-item {
1562
1686
  display: flex;
1563
1687
  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);
1688
+ gap: var(--desk-space-2);
1689
+ width: 100%;
1690
+ padding: var(--desk-space-1) var(--desk-space-2);
1691
+ border: 0;
1582
1692
  border-radius: 7px;
1693
+ background: none;
1694
+ color: var(--desk-ink);
1695
+ font-family: inherit;
1696
+ font-size: 13px;
1697
+ text-align: left;
1698
+ cursor: pointer;
1583
1699
  }
1584
1700
 
1585
- .desk-search-icon svg {
1586
- width: 15px;
1587
- height: 15px;
1701
+ .desk-sidebar-item:hover:not(:disabled) {
1702
+ background: color-mix(in srgb, var(--desk-ink) 7%, transparent);
1588
1703
  }
1589
1704
 
1590
- .desk-search-row[data-active] .desk-search-icon {
1591
- border-color: transparent;
1592
- background: rgb(255 255 255 / 18%);
1705
+ .desk-sidebar-item[data-current] {
1706
+ background: color-mix(in srgb, var(--desk-accent) 18%, transparent);
1707
+ font-weight: 500;
1593
1708
  }
1594
1709
 
1595
- .desk-search-text {
1596
- flex: 1;
1597
- min-width: 0;
1710
+ .desk-sidebar-item:focus-visible {
1711
+ outline: 2px solid var(--desk-accent);
1712
+ outline-offset: -2px;
1598
1713
  }
1599
1714
 
1600
- .desk-search-title {
1601
- display: block;
1602
- font-size: 13.5px;
1603
- font-weight: 500;
1715
+ .desk-sidebar-item:disabled {
1716
+ opacity: .45;
1717
+ cursor: not-allowed;
1604
1718
  }
1605
1719
 
1606
- .desk-search-subtitle,
1607
- .desk-search-kind {
1608
- font-size: 11.5px;
1720
+ .desk-sidebar-icon {
1721
+ display: grid;
1722
+ place-items: center;
1723
+ width: 16px;
1724
+ height: 16px;
1725
+ flex: none;
1609
1726
  color: var(--desk-muted);
1610
1727
  }
1611
1728
 
1612
- .desk-search-subtitle {
1613
- display: block;
1729
+ .desk-sidebar-item[data-current] .desk-sidebar-icon {
1730
+ color: var(--desk-accent);
1614
1731
  }
1615
1732
 
1616
- .desk-search-kind {
1733
+ .desk-sidebar-label {
1734
+ flex: 1;
1735
+ min-width: 0;
1736
+ overflow: hidden;
1737
+ text-overflow: ellipsis;
1738
+ white-space: nowrap;
1739
+ }
1740
+
1741
+ .desk-sidebar-badge {
1617
1742
  flex: none;
1618
- font-family: var(--desk-font-mono);
1619
- font-size: 10.5px;
1743
+ min-width: 18px;
1744
+ padding: 0 5px;
1745
+ border-radius: 9px;
1746
+ background: color-mix(in srgb, var(--desk-ink) 12%, transparent);
1747
+ font-size: 11px;
1748
+ font-variant-numeric: tabular-nums;
1749
+ text-align: center;
1620
1750
  }
1621
1751
 
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%);
1752
+ .desk-sidebar-footer {
1753
+ margin-top: auto;
1754
+ padding: var(--desk-space-2);
1755
+ border-top: 1px solid var(--desk-rule);
1625
1756
  }
1626
1757
 
1627
- .desk-search-empty {
1758
+ /* Icon view: a Finder's icons, in rows that follow the window's width. */
1759
+ .desk-icon-view {
1760
+ list-style: none;
1628
1761
  margin: 0;
1629
- padding: var(--desk-space-5) var(--desk-space-4);
1762
+ padding: 12px;
1763
+ display: grid;
1764
+ grid-template-columns: repeat(auto-fill, minmax(104px, 1fr));
1765
+ align-content: start;
1766
+ gap: 8px;
1767
+ }
1768
+
1769
+ .desk-icon-cell {
1770
+ display: grid;
1771
+ justify-items: center;
1772
+ align-content: start;
1773
+ gap: 4px;
1774
+ padding: 10px 6px;
1775
+ border-radius: 10px;
1630
1776
  text-align: center;
1631
- color: var(--desk-muted);
1632
- font-size: 13px;
1777
+ cursor: default;
1778
+ user-select: none;
1779
+ outline: none;
1633
1780
  }
1634
1781
 
1635
- @media (prefers-reduced-motion: reduce) {
1636
- .desk-search,
1637
- .desk-search-scrim {
1638
- animation: none;
1639
- }
1782
+ .desk-icon-cell[aria-disabled="true"] {
1783
+ opacity: .45;
1640
1784
  }
1641
1785
 
1642
- /* ── Tour ── */
1786
+ .desk-icon-cell:focus-visible {
1787
+ box-shadow: 0 0 0 2px var(--desk-accent);
1788
+ }
1643
1789
 
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));
1790
+ .desk-icon-glyph {
1791
+ position: relative;
1792
+ display: grid;
1793
+ place-items: center;
1794
+ width: 56px;
1795
+ height: 56px;
1649
1796
  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);
1797
+ border: 1px solid var(--desk-rule);
1798
+ background: var(--desk-dock-icon);
1655
1799
  color: var(--desk-ink);
1656
1800
  }
1657
1801
 
1658
- .desk-tour-head {
1659
- display: flex;
1660
- align-items: center;
1661
- gap: var(--desk-space-2);
1662
- font-size: 13px;
1802
+ .desk-icon-glyph > svg,
1803
+ .desk-icon-glyph > img {
1804
+ width: 55%;
1805
+ height: 55%;
1806
+ object-fit: contain;
1663
1807
  }
1664
1808
 
1665
- .desk-tour-count {
1666
- color: var(--desk-muted);
1667
- font-size: 11.5px;
1668
- font-variant-numeric: tabular-nums;
1809
+ .desk-icon-badge {
1810
+ position: absolute;
1811
+ top: -5px;
1812
+ right: -5px;
1813
+ min-width: 18px;
1814
+ padding: 0 5px;
1815
+ border-radius: 9px;
1816
+ background: var(--desk-accent);
1817
+ color: #fff;
1818
+ font-size: 11px;
1819
+ line-height: 18px;
1669
1820
  }
1670
1821
 
1671
- .desk-tour-head .desk-button {
1672
- margin-left: auto;
1822
+ .desk-icon-label {
1823
+ max-width: 100%;
1824
+ padding: 1px 6px;
1825
+ border-radius: 5px;
1826
+ font-size: 12.5px;
1827
+ line-height: 1.3;
1828
+ overflow-wrap: anywhere;
1829
+ display: -webkit-box;
1830
+ -webkit-line-clamp: 2;
1831
+ -webkit-box-orient: vertical;
1832
+ overflow: hidden;
1673
1833
  }
1674
1834
 
1675
- .desk-tour-progress {
1676
- height: 3px;
1677
- margin: var(--desk-space-2) 0;
1678
- border-radius: 2px;
1679
- background: var(--desk-rule);
1835
+ .desk-icon-subtitle {
1836
+ max-width: 100%;
1837
+ font-size: 11px;
1838
+ color: var(--desk-muted);
1680
1839
  overflow: hidden;
1840
+ text-overflow: ellipsis;
1841
+ white-space: nowrap;
1681
1842
  }
1682
1843
 
1683
- .desk-tour-progress i {
1684
- display: block;
1685
- height: 100%;
1844
+ .desk-icon-cell[aria-selected="true"] .desk-icon-glyph {
1845
+ background: color-mix(in srgb, var(--desk-accent) 16%, transparent);
1846
+ }
1847
+
1848
+ .desk-icon-cell[aria-selected="true"] .desk-icon-label {
1686
1849
  background: var(--desk-accent);
1687
- transition: width .3s var(--desk-ease);
1850
+ color: #fff;
1688
1851
  }
1689
1852
 
1690
- .desk-tour-caption {
1691
- margin: 0 0 var(--desk-space-2);
1692
- font-size: 13.5px;
1693
- line-height: 1.45;
1853
+ .desk-icon-view-empty {
1854
+ display: grid;
1855
+ place-items: center;
1856
+ padding: 32px 16px;
1857
+ color: var(--desk-muted);
1858
+ text-align: center;
1694
1859
  }
1695
1860
 
1696
- .desk-tour-turn {
1697
- margin-right: var(--desk-space-1);
1698
- color: var(--desk-warn);
1699
- font-weight: 700;
1861
+ .desk-icon-drag {
1862
+ display: grid;
1863
+ place-items: center;
1864
+ width: 40px;
1865
+ height: 40px;
1700
1866
  }
1701
1867
 
1702
- .desk-tour-turn::after {
1703
- content: " ·";
1868
+ /* @liberation-data/desk — overlays.css */
1869
+ /* ── Overlays ── */
1870
+
1871
+ .desk-popover-anchor {
1872
+ position: relative;
1873
+ display: inline-flex;
1704
1874
  }
1705
1875
 
1706
- .desk-tour-actions {
1707
- display: flex;
1708
- align-items: center;
1709
- gap: var(--desk-space-2);
1876
+ .desk-popover {
1877
+ position: absolute;
1878
+ z-index: 1200;
1879
+ min-width: 220px;
1880
+ max-width: min(360px, calc(100vw - 24px));
1881
+ padding: var(--desk-space-3);
1882
+ border: 1px solid var(--desk-rule);
1883
+ border-radius: 12px;
1884
+ background: var(--desk-surface);
1885
+ box-shadow: var(--desk-shadow-floating);
1886
+ animation: desk-menu-in .14s var(--desk-ease);
1710
1887
  }
1711
1888
 
1712
- .desk-tour-spacer {
1713
- flex: 1;
1889
+ .desk-popover[data-placement="below"] {
1890
+ top: calc(100% + 6px);
1714
1891
  }
1715
1892
 
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;
1893
+ .desk-popover[data-placement="above"] {
1894
+ bottom: calc(100% + 6px);
1724
1895
  }
1725
1896
 
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
- }
1897
+ .desk-popover[data-align="start"] {
1898
+ left: 0;
1733
1899
  }
1734
1900
 
1735
- @media (prefers-reduced-motion: reduce) {
1736
- .desk-tour-progress i {
1737
- transition: none;
1738
- }
1901
+ .desk-popover[data-align="end"] {
1902
+ right: 0;
1903
+ }
1739
1904
 
1740
- [data-desk-tour-pointed] {
1741
- animation: none;
1905
+ /* A sheet belongs to its window: the scrim covers that window and nothing else. */
1906
+ .desk-sheet-scrim,
1907
+ .desk-alert-scrim {
1908
+ position: absolute;
1909
+ inset: 0;
1910
+ z-index: 1300;
1911
+ display: grid;
1912
+ background: rgb(0 0 0 / 35%);
1913
+ animation: desk-fade .16s var(--desk-ease);
1914
+ }
1915
+
1916
+ .desk-sheet-scrim {
1917
+ place-items: start center;
1918
+ padding: var(--desk-space-4);
1919
+ }
1920
+
1921
+ .desk-alert-scrim {
1922
+ position: fixed;
1923
+ z-index: 1400;
1924
+ place-items: center;
1925
+ padding: var(--desk-space-4);
1926
+ background: rgb(0 0 0 / 45%);
1927
+ }
1928
+
1929
+ @keyframes desk-fade {
1930
+ from {
1931
+ opacity: 0;
1742
1932
  }
1743
1933
  }
1744
1934
 
1745
- /* ── Checkbox and slider ── */
1935
+ .desk-sheet,
1936
+ .desk-alert {
1937
+ box-sizing: border-box;
1938
+ width: min(440px, 100%);
1939
+ padding: var(--desk-space-4);
1940
+ border: 1px solid var(--desk-rule);
1941
+ border-radius: 14px;
1942
+ background: var(--desk-surface);
1943
+ color: var(--desk-ink);
1944
+ box-shadow: var(--desk-shadow-floating);
1945
+ font-family: var(--desk-font);
1946
+ }
1746
1947
 
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;
1948
+ .desk-sheet {
1949
+ animation: desk-sheet-in .22s var(--desk-ease);
1752
1950
  }
1753
1951
 
1754
- .desk-checkbox {
1755
- width: 16px;
1756
- height: 16px;
1757
- margin: 2px 0 0;
1758
- accent-color: var(--desk-accent);
1759
- flex: none;
1952
+ .desk-alert {
1953
+ width: min(380px, 100%);
1954
+ text-align: center;
1955
+ animation: desk-alert-in .16s var(--desk-ease);
1956
+ }
1957
+
1958
+ @keyframes desk-sheet-in {
1959
+ from {
1960
+ transform: translateY(-12px);
1961
+ opacity: 0;
1962
+ }
1963
+ }
1964
+
1965
+ @keyframes desk-alert-in {
1966
+ from {
1967
+ transform: scale(.97);
1968
+ opacity: 0;
1969
+ }
1760
1970
  }
1761
1971
 
1762
- .desk-check-text {
1763
- display: flex;
1764
- flex-direction: column;
1765
- gap: 2px;
1972
+ .desk-sheet-title,
1973
+ .desk-alert-title {
1974
+ margin: 0 0 var(--desk-space-1);
1975
+ font-size: 15px;
1976
+ font-weight: 600;
1766
1977
  }
1767
1978
 
1768
- .desk-check-label {
1979
+ .desk-sheet-description,
1980
+ .desk-alert-message {
1981
+ margin: 0 0 var(--desk-space-3);
1982
+ color: var(--desk-muted);
1769
1983
  font-size: 13px;
1984
+ line-height: 1.5;
1770
1985
  }
1771
1986
 
1772
- .desk-checkbox:focus-visible,
1773
- .desk-slider-track:focus-visible {
1774
- outline: 2px solid var(--desk-accent);
1775
- outline-offset: 2px;
1987
+ .desk-sheet-actions,
1988
+ .desk-alert-actions {
1989
+ display: flex;
1990
+ justify-content: flex-end;
1991
+ gap: var(--desk-space-2);
1992
+ margin-top: var(--desk-space-4);
1776
1993
  }
1777
1994
 
1778
- .desk-choices {
1779
- margin: 0;
1780
- padding: 0;
1781
- border: 0;
1995
+ .desk-alert-actions {
1996
+ justify-content: center;
1997
+ }
1998
+
1999
+ .desk-toasts {
2000
+ position: fixed;
2001
+ z-index: 1500;
2002
+ right: var(--desk-space-4);
2003
+ bottom: var(--desk-space-4);
1782
2004
  display: flex;
1783
2005
  flex-direction: column;
1784
2006
  gap: var(--desk-space-2);
2007
+ max-width: min(420px, calc(100vw - 32px));
1785
2008
  }
1786
2009
 
1787
- .desk-choice {
2010
+ .desk-toast {
1788
2011
  display: flex;
1789
- align-items: flex-start;
1790
- gap: var(--desk-space-3);
1791
- padding: var(--desk-space-3);
2012
+ align-items: center;
2013
+ gap: var(--desk-space-2);
2014
+ padding: var(--desk-space-2) var(--desk-space-2) var(--desk-space-2) var(--desk-space-3);
1792
2015
  border: 1px solid var(--desk-rule);
1793
- border-radius: 12px;
2016
+ border-radius: 10px;
1794
2017
  background: var(--desk-surface);
1795
- cursor: pointer;
2018
+ box-shadow: var(--desk-shadow-floating);
2019
+ font-family: var(--desk-font);
2020
+ font-size: 13px;
2021
+ animation: desk-toast-in .2s var(--desk-ease);
1796
2022
  }
1797
2023
 
1798
- .desk-choice:hover:not([data-disabled]) {
1799
- border-color: color-mix(in srgb, var(--desk-accent) 50%, var(--desk-rule));
2024
+ @keyframes desk-toast-in {
2025
+ from {
2026
+ transform: translateY(8px);
2027
+ opacity: 0;
2028
+ }
1800
2029
  }
1801
2030
 
1802
- .desk-choice[data-chosen] {
1803
- border-color: var(--desk-accent);
1804
- box-shadow: 0 0 0 1px var(--desk-accent);
2031
+ .desk-toast[data-tone="ok"] {
2032
+ border-color: color-mix(in srgb, var(--desk-ok) 45%, var(--desk-rule));
1805
2033
  }
1806
2034
 
1807
- .desk-choice[data-disabled] {
1808
- opacity: .45;
1809
- cursor: not-allowed;
2035
+ .desk-toast[data-tone="bad"] {
2036
+ border-color: color-mix(in srgb, var(--desk-bad) 45%, var(--desk-rule));
1810
2037
  }
1811
2038
 
1812
- .desk-choice:has(:focus-visible) {
1813
- outline: 2px solid var(--desk-accent);
1814
- outline-offset: 2px;
2039
+ .desk-toast-message {
2040
+ flex: 1;
2041
+ min-width: 0;
1815
2042
  }
1816
2043
 
1817
- .desk-choice-input {
1818
- position: absolute;
1819
- opacity: 0;
1820
- pointer-events: none;
2044
+ @media (prefers-reduced-motion: reduce) {
2045
+ .desk-inputbar,
2046
+ .desk-inputbar-scrim,
2047
+ .desk-popover,
2048
+ .desk-sheet,
2049
+ .desk-alert,
2050
+ .desk-toast,
2051
+ .desk-sheet-scrim,
2052
+ .desk-alert-scrim {
2053
+ animation: none;
2054
+ }
1821
2055
  }
1822
2056
 
1823
- .desk-choice-mark {
2057
+ /* ── An (i): what a view would explain if asked ── */
2058
+
2059
+ .desk-infotip {
1824
2060
  flex: none;
1825
- display: grid;
2061
+ display: inline-grid;
1826
2062
  place-items: center;
1827
- width: 16px;
1828
- height: 16px;
1829
- margin-top: 2px;
1830
- border: 1.5px solid var(--desk-rule);
2063
+ width: 18px;
2064
+ height: 18px;
2065
+ padding: 0;
2066
+ /* The title bar's own green, the one the zoom control wears: a muted grey (i) sat in a muted
2067
+ trailing edge and went unseen, which defeats the point of having one place to ask. */
2068
+ border: 1px solid color-mix(in srgb, var(--desk-info) 55%, transparent);
1831
2069
  border-radius: 50%;
2070
+ background: color-mix(in srgb, var(--desk-info) 14%, transparent);
2071
+ color: var(--desk-info);
2072
+ font-family: var(--desk-font);
2073
+ font-size: 11px;
2074
+ font-style: italic;
2075
+ font-weight: 700;
2076
+ line-height: 1;
2077
+ cursor: pointer;
1832
2078
  }
1833
2079
 
1834
- .desk-choice[data-chosen] .desk-choice-mark {
1835
- border-color: var(--desk-accent);
2080
+ .desk-infotip:hover,
2081
+ .desk-infotip[data-open] {
2082
+ border-color: var(--desk-info);
2083
+ background: color-mix(in srgb, var(--desk-info) 26%, transparent);
1836
2084
  }
1837
2085
 
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);
2086
+ .desk-infotip:focus-visible {
2087
+ outline: 2px solid var(--desk-info);
2088
+ outline-offset: 2px;
1844
2089
  }
1845
2090
 
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;
2091
+ .desk-infotip-body {
2092
+ max-width: 34ch;
2093
+ font-size: 12.5px;
2094
+ line-height: 1.45;
1854
2095
  color: var(--desk-muted);
1855
2096
  }
1856
2097
 
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;
2098
+ .desk-infotip-body > :first-child {
2099
+ margin-top: 0;
1868
2100
  }
1869
2101
 
1870
- .desk-choice-label {
1871
- font-weight: 600;
2102
+ .desk-infotip-body > :last-child {
2103
+ margin-bottom: 0;
1872
2104
  }
1873
2105
 
1874
- .desk-choice-tag {
1875
- margin-left: var(--desk-space-2);
1876
- font-weight: 400;
1877
- color: var(--desk-muted);
1878
- }
2106
+ /* @liberation-data/desk — conversation.css */
2107
+ /* ── Conversation ── */
1879
2108
 
1880
- .desk-checklist {
2109
+ .desk-thread {
2110
+ position: relative;
1881
2111
  display: flex;
1882
2112
  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;
2113
+ min-height: 0;
1895
2114
  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;
2115
+ font-family: var(--desk-font);
1906
2116
  }
1907
2117
 
1908
- .desk-task {
2118
+ .desk-thread-scroll {
2119
+ flex: 1;
2120
+ min-height: 0;
2121
+ overflow-y: auto;
1909
2122
  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);
2123
+ flex-direction: column;
2124
+ gap: var(--desk-space-1);
2125
+ padding: var(--desk-space-4);
1929
2126
  }
1930
2127
 
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;
2128
+ .desk-message {
2129
+ display: flex;
2130
+ flex-direction: column;
2131
+ align-items: flex-start;
2132
+ max-width: min(80%, 60ch);
1935
2133
  }
1936
2134
 
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);
2135
+ .desk-message[data-mine] {
2136
+ align-self: flex-end;
2137
+ align-items: flex-end;
1941
2138
  }
1942
2139
 
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;
2140
+ /* A new run of messages from the same person gets air; the rest stay close. */
2141
+ .desk-message[data-run-start] {
2142
+ margin-top: var(--desk-space-3);
1948
2143
  }
1949
2144
 
1950
- @keyframes desk-spin {
1951
- to {
1952
- transform: rotate(360deg);
1953
- }
2145
+ .desk-message:first-child {
2146
+ margin-top: 0;
1954
2147
  }
1955
2148
 
1956
- .desk-task-text {
1957
- flex: 1;
1958
- min-width: 0;
1959
- display: flex;
1960
- flex-direction: column;
2149
+ .desk-message-author {
2150
+ margin-bottom: 2px;
2151
+ padding: 0 var(--desk-space-1);
2152
+ font-size: 11.5px;
2153
+ font-weight: 600;
2154
+ color: var(--desk-muted);
1961
2155
  }
1962
2156
 
1963
- .desk-task-name {
1964
- font-size: 13px;
1965
- font-weight: 600;
2157
+ .desk-bubble {
2158
+ padding: var(--desk-space-2) var(--desk-space-3);
2159
+ border: 1px solid var(--desk-rule);
2160
+ border-radius: 14px;
2161
+ background: var(--desk-surface);
2162
+ font-size: 13.5px;
2163
+ line-height: 1.5;
2164
+ white-space: pre-wrap;
2165
+ overflow-wrap: anywhere;
1966
2166
  }
1967
2167
 
1968
- .desk-task-detail,
1969
- .desk-task-error {
1970
- font-size: 12px;
1971
- color: var(--desk-muted);
2168
+ .desk-message[data-mine] .desk-bubble {
2169
+ border-color: transparent;
2170
+ background: var(--desk-accent);
2171
+ color: var(--desk-on-accent);
2172
+ border-bottom-right-radius: 5px;
1972
2173
  }
1973
2174
 
1974
- .desk-task-error {
1975
- color: var(--desk-bad);
2175
+ .desk-message:not([data-mine]) .desk-bubble {
2176
+ border-bottom-left-radius: 5px;
1976
2177
  }
1977
2178
 
1978
- @media (prefers-reduced-motion: reduce) {
1979
- .desk-task[data-state="working"] .desk-task-mark {
1980
- animation: none;
1981
- }
2179
+ .desk-message[data-state="sending"] .desk-bubble {
2180
+ opacity: .6;
1982
2181
  }
1983
2182
 
1984
- .desk-radiogroup {
1985
- margin: 0;
1986
- padding: 0;
1987
- border: 0;
2183
+ .desk-message[data-state="failed"] .desk-bubble {
2184
+ border-color: var(--desk-bad);
2185
+ }
2186
+
2187
+ .desk-message-foot {
1988
2188
  display: flex;
1989
- flex-direction: column;
1990
- gap: var(--desk-space-1);
2189
+ align-items: center;
2190
+ gap: var(--desk-space-2);
2191
+ padding: 2px var(--desk-space-1) 0;
2192
+ font-size: 11px;
2193
+ color: var(--desk-muted);
1991
2194
  }
1992
2195
 
1993
- .desk-radiogroup legend {
1994
- padding: 0;
1995
- margin-bottom: var(--desk-space-1);
2196
+ .desk-message-foot:empty {
2197
+ display: none;
1996
2198
  }
1997
2199
 
1998
- .desk-radio {
1999
- width: 16px;
2000
- height: 16px;
2001
- margin: 2px 0 0;
2002
- accent-color: var(--desk-accent);
2003
- flex: none;
2200
+ .desk-message-failed {
2201
+ color: var(--desk-bad);
2004
2202
  }
2005
2203
 
2006
- .desk-radio:focus-visible {
2007
- outline: 2px solid var(--desk-accent);
2008
- outline-offset: 2px;
2204
+ .desk-typing {
2205
+ align-self: flex-start;
2206
+ margin-top: var(--desk-space-2);
2207
+ padding: var(--desk-space-2) var(--desk-space-3);
2208
+ border: 1px solid var(--desk-rule);
2209
+ border-radius: 14px;
2210
+ border-bottom-left-radius: 5px;
2211
+ background: var(--desk-surface);
2009
2212
  }
2010
2213
 
2011
- .desk-slider {
2214
+ .desk-typing-dots {
2012
2215
  display: flex;
2013
- flex-direction: column;
2014
- gap: var(--desk-space-1);
2216
+ gap: 4px;
2015
2217
  }
2016
2218
 
2017
- .desk-slider-head {
2018
- display: flex;
2019
- align-items: baseline;
2020
- justify-content: space-between;
2021
- gap: var(--desk-space-2);
2219
+ .desk-typing-dots i {
2220
+ width: 5px;
2221
+ height: 5px;
2222
+ border-radius: 50%;
2223
+ background: var(--desk-muted);
2224
+ animation: desk-typing 1.2s var(--desk-ease) infinite;
2022
2225
  }
2023
2226
 
2024
- .desk-slider-value {
2025
- font-size: 12px;
2026
- font-variant-numeric: tabular-nums;
2027
- color: var(--desk-ink);
2227
+ .desk-typing-dots i:nth-child(2) {
2228
+ animation-delay: .15s;
2028
2229
  }
2029
2230
 
2030
- .desk-slider-track {
2031
- width: 100%;
2032
- accent-color: var(--desk-accent);
2231
+ .desk-typing-dots i:nth-child(3) {
2232
+ animation-delay: .3s;
2033
2233
  }
2034
2234
 
2035
- /* ── Pop-up button ── */
2235
+ @keyframes desk-typing {
2236
+ 0%, 60%, 100% {
2237
+ opacity: .3;
2238
+ }
2239
+ 30% {
2240
+ opacity: 1;
2241
+ }
2242
+ }
2036
2243
 
2037
- .desk-popup-anchor {
2038
- position: relative;
2244
+ .desk-thread-jump {
2245
+ position: absolute;
2246
+ left: 50%;
2247
+ bottom: var(--desk-space-3);
2248
+ transform: translateX(-50%);
2249
+ box-shadow: var(--desk-shadow);
2039
2250
  }
2040
2251
 
2041
- .desk-popup-button {
2252
+ .desk-composer {
2253
+ flex: none;
2042
2254
  display: flex;
2043
- align-items: center;
2255
+ align-items: flex-end;
2044
2256
  gap: var(--desk-space-2);
2045
- width: 100%;
2257
+ padding: var(--desk-space-3) var(--desk-space-4);
2258
+ border-top: 1px solid var(--desk-rule);
2259
+ }
2260
+
2261
+ .desk-composer-field {
2262
+ flex: 1;
2263
+ min-width: 0;
2046
2264
  min-height: var(--desk-control-height);
2047
- padding: 0 var(--desk-space-2) 0 var(--desk-space-3);
2265
+ max-height: 40vh;
2266
+ padding: var(--desk-space-2) var(--desk-space-3);
2048
2267
  border: 1px solid var(--desk-rule);
2049
2268
  border-radius: var(--desk-control-radius);
2050
2269
  background: var(--desk-field-bg);
2051
2270
  color: var(--desk-ink);
2052
2271
  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;
2272
+ font-size: 13.5px;
2273
+ line-height: 20px;
2274
+ resize: none;
2061
2275
  }
2062
2276
 
2063
- .desk-popup-button:focus-visible {
2277
+ .desk-composer-field:focus-visible {
2064
2278
  outline: 2px solid var(--desk-accent);
2065
2279
  outline-offset: 2px;
2066
2280
  }
2067
2281
 
2068
- .desk-popup-button:disabled {
2069
- opacity: .45;
2070
- cursor: not-allowed;
2282
+ .desk-composer-field::placeholder {
2283
+ color: var(--desk-muted);
2071
2284
  }
2072
2285
 
2073
- .desk-popup-value {
2074
- flex: 1;
2075
- min-width: 0;
2076
- overflow: hidden;
2077
- text-overflow: ellipsis;
2078
- white-space: nowrap;
2286
+ @media (prefers-reduced-motion: reduce) {
2287
+ .desk-typing-dots i {
2288
+ animation: none;
2289
+ }
2079
2290
  }
2080
2291
 
2081
- .desk-popup-value[data-placeholder] {
2082
- color: var(--desk-muted);
2083
- }
2292
+ /* ── Input bar: one place to type, which reaches the key window ── */
2084
2293
 
2085
- .desk-popup-icon {
2294
+ .desk-inputbar-scrim {
2295
+ position: fixed;
2296
+ inset: 0;
2297
+ z-index: 1450;
2086
2298
  display: grid;
2087
- place-items: center;
2088
- width: 16px;
2089
- height: 16px;
2299
+ justify-items: center;
2300
+ align-content: center;
2301
+ padding: var(--desk-space-4);
2302
+ background: rgb(0 0 0 / 30%);
2303
+ animation: desk-fade .14s var(--desk-ease);
2090
2304
  }
2091
2305
 
2092
- .desk-popup-chevron {
2093
- color: var(--desk-muted);
2094
- line-height: 1;
2306
+ .desk-inputbar[data-mode="summoned"] {
2307
+ animation: desk-alert-in .16s var(--desk-ease);
2095
2308
  }
2096
2309
 
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;
2310
+ .desk-inputbar {
2311
+ box-sizing: border-box;
2312
+ width: min(720px, 100%);
2108
2313
  border: 1px solid var(--desk-rule);
2109
- border-radius: 10px;
2110
- background: var(--desk-surface);
2314
+ border-radius: 14px;
2315
+ background: var(--desk-dock-glass);
2316
+ backdrop-filter: blur(28px) saturate(170%);
2317
+ -webkit-backdrop-filter: blur(28px) saturate(170%);
2111
2318
  box-shadow: var(--desk-shadow-floating);
2112
- animation: desk-menu-in .12s var(--desk-ease);
2113
2319
  }
2114
2320
 
2115
- .desk-popup-list:focus {
2116
- outline: none;
2321
+ .desk-inputbar .desk-composer {
2322
+ border-top: 0;
2323
+ padding: var(--desk-space-2);
2117
2324
  }
2118
2325
 
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;
2326
+ .desk-inputbar-target {
2327
+ display: block;
2328
+ padding: 0 var(--desk-space-3) var(--desk-space-2);
2329
+ font-family: var(--desk-font);
2330
+ font-size: 11px;
2331
+ color: var(--desk-muted);
2127
2332
  }
2128
2333
 
2129
- .desk-popup-option[data-active] {
2130
- background: var(--desk-accent);
2131
- color: var(--desk-on-accent);
2334
+ .desk-inputbar-target b {
2335
+ font-weight: 600;
2336
+ color: var(--desk-ink);
2132
2337
  }
2133
2338
 
2134
- .desk-popup-option[data-active] .desk-help {
2135
- color: rgb(255 255 255 / 80%);
2339
+ /* @liberation-data/desk — search.css */
2340
+ /* ── Search ── */
2341
+
2342
+ .desk-search-scrim {
2343
+ position: fixed;
2344
+ inset: 0;
2345
+ z-index: 1450;
2346
+ display: grid;
2347
+ justify-items: center;
2348
+ align-content: start;
2349
+ padding: 12vh var(--desk-space-4) var(--desk-space-4);
2350
+ background: rgb(0 0 0 / 35%);
2351
+ animation: desk-fade .14s var(--desk-ease);
2136
2352
  }
2137
2353
 
2138
- .desk-popup-option[aria-disabled] {
2139
- opacity: .5;
2354
+ .desk-search {
2355
+ box-sizing: border-box;
2356
+ width: min(620px, 100%);
2357
+ max-height: 70vh;
2358
+ display: flex;
2359
+ flex-direction: column;
2360
+ border: 1px solid var(--desk-rule);
2361
+ border-radius: 14px;
2362
+ background: var(--desk-surface);
2363
+ box-shadow: var(--desk-shadow-floating);
2364
+ font-family: var(--desk-font);
2365
+ overflow: hidden;
2366
+ animation: desk-alert-in .16s var(--desk-ease);
2140
2367
  }
2141
2368
 
2142
- .desk-popup-check {
2143
- width: 14px;
2369
+ .desk-search-bar {
2144
2370
  flex: none;
2145
- text-align: center;
2371
+ padding: var(--desk-space-3) var(--desk-space-4);
2372
+ border-bottom: 1px solid var(--desk-rule);
2146
2373
  }
2147
2374
 
2148
- .desk-popup-text {
2149
- display: flex;
2150
- flex-direction: column;
2375
+ .desk-search-field {
2376
+ width: 100%;
2377
+ border: 0;
2378
+ background: none;
2379
+ color: var(--desk-ink);
2380
+ font-family: var(--desk-font);
2381
+ font-size: 17px;
2382
+ outline: none;
2151
2383
  }
2152
2384
 
2153
- /* ── Table ── */
2154
-
2155
- .desk-table-wrap {
2156
- overflow: auto;
2385
+ .desk-search-field::placeholder {
2386
+ color: var(--desk-muted);
2157
2387
  }
2158
2388
 
2159
- .desk-table {
2160
- width: 100%;
2161
- border-collapse: collapse;
2162
- font-family: var(--desk-font);
2163
- font-size: 13px;
2389
+ .desk-search-results {
2390
+ flex: 1;
2391
+ min-height: 0;
2392
+ margin: 0;
2393
+ padding: var(--desk-space-1);
2394
+ list-style: none;
2395
+ overflow-y: auto;
2164
2396
  }
2165
2397
 
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);
2398
+ .desk-search-group {
2399
+ margin: var(--desk-space-2) 0 2px;
2400
+ padding: 0 var(--desk-space-2);
2173
2401
  font-size: 11px;
2174
- font-weight: 600;
2175
- letter-spacing: .06em;
2402
+ font-weight: 700;
2403
+ letter-spacing: .08em;
2176
2404
  text-transform: uppercase;
2177
2405
  color: var(--desk-muted);
2178
- text-align: left;
2179
- white-space: nowrap;
2180
2406
  }
2181
2407
 
2182
- .desk-table th[data-align="end"],
2183
- .desk-table td[data-align="end"] {
2184
- text-align: right;
2408
+ .desk-search-row {
2409
+ display: flex;
2410
+ align-items: center;
2411
+ gap: var(--desk-space-3);
2412
+ padding: var(--desk-space-2);
2413
+ border-radius: 8px;
2414
+ cursor: default;
2185
2415
  }
2186
2416
 
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;
2417
+ .desk-search-row[data-active] {
2418
+ background: var(--desk-accent);
2419
+ color: var(--desk-on-accent);
2199
2420
  }
2200
2421
 
2201
- .desk-table-sort:hover {
2202
- color: var(--desk-ink);
2422
+ .desk-search-icon {
2423
+ display: grid;
2424
+ place-items: center;
2425
+ width: 28px;
2426
+ height: 28px;
2427
+ flex: none;
2428
+ border: 1px solid var(--desk-rule);
2429
+ border-radius: 7px;
2203
2430
  }
2204
2431
 
2205
- .desk-table td {
2206
- padding: var(--desk-space-2);
2207
- border-bottom: 1px solid var(--desk-rule);
2432
+ .desk-search-icon svg {
2433
+ width: 15px;
2434
+ height: 15px;
2208
2435
  }
2209
2436
 
2210
- .desk-table td[data-numeric] {
2211
- font-variant-numeric: tabular-nums;
2437
+ .desk-search-row[data-active] .desk-search-icon {
2438
+ border-color: transparent;
2439
+ background: rgb(255 255 255 / 18%);
2212
2440
  }
2213
2441
 
2214
- .desk-table tbody tr {
2215
- cursor: default;
2442
+ .desk-search-text {
2443
+ flex: 1;
2444
+ min-width: 0;
2216
2445
  }
2217
2446
 
2218
- .desk-table tbody tr:hover {
2219
- background: color-mix(in srgb, var(--desk-ink) 5%, transparent);
2447
+ .desk-search-title {
2448
+ display: block;
2449
+ font-size: 13.5px;
2450
+ font-weight: 500;
2220
2451
  }
2221
2452
 
2222
- .desk-table tbody tr[data-selected] {
2223
- background: color-mix(in srgb, var(--desk-accent) 16%, transparent);
2453
+ .desk-search-subtitle,
2454
+ .desk-search-kind {
2455
+ font-size: 11.5px;
2456
+ color: var(--desk-muted);
2224
2457
  }
2225
2458
 
2226
- .desk-table tbody tr:focus-visible {
2227
- outline: 2px solid var(--desk-accent);
2228
- outline-offset: -2px;
2459
+ .desk-search-subtitle {
2460
+ display: block;
2229
2461
  }
2230
2462
 
2231
- .desk-table-empty {
2232
- padding: var(--desk-space-6) var(--desk-space-4);
2463
+ .desk-search-kind {
2464
+ flex: none;
2465
+ font-family: var(--desk-font-mono);
2466
+ font-size: 10.5px;
2467
+ }
2468
+
2469
+ .desk-search-row[data-active] .desk-search-subtitle,
2470
+ .desk-search-row[data-active] .desk-search-kind {
2471
+ color: rgb(255 255 255 / 80%);
2472
+ }
2473
+
2474
+ .desk-search-empty {
2475
+ margin: 0;
2476
+ padding: var(--desk-space-5) var(--desk-space-4);
2233
2477
  text-align: center;
2234
2478
  color: var(--desk-muted);
2235
- font-family: var(--desk-font);
2236
2479
  font-size: 13px;
2237
2480
  }
2238
2481
 
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;
2482
+ @media (prefers-reduced-motion: reduce) {
2483
+ .desk-search,
2484
+ .desk-search-scrim {
2485
+ animation: none;
2486
+ }
2248
2487
  }
2249
2488
 
2250
- .desk-sidebar ul {
2251
- margin: 0;
2252
- padding: 0;
2253
- list-style: none;
2254
- }
2489
+ /* @liberation-data/desk setup.css */
2490
+ /* ── Tour ── */
2255
2491
 
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);
2492
+ .desk-tour {
2493
+ box-sizing: border-box;
2494
+ width: min(620px, 100%);
2495
+ padding: var(--desk-space-3);
2496
+ border: 1px solid color-mix(in srgb, var(--desk-accent) 45%, var(--desk-rule));
2497
+ border-radius: 14px;
2498
+ background: var(--desk-dock-glass);
2499
+ backdrop-filter: blur(28px) saturate(170%);
2500
+ -webkit-backdrop-filter: blur(28px) saturate(170%);
2501
+ box-shadow: var(--desk-shadow-floating), 0 0 30px color-mix(in srgb, var(--desk-accent) 20%, transparent);
2502
+ font-family: var(--desk-font);
2503
+ color: var(--desk-ink);
2264
2504
  }
2265
2505
 
2266
- .desk-sidebar-item {
2506
+ .desk-tour-head {
2267
2507
  display: flex;
2268
2508
  align-items: center;
2269
2509
  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
2510
  font-size: 13px;
2278
- text-align: left;
2279
- cursor: pointer;
2280
2511
  }
2281
2512
 
2282
- .desk-sidebar-item:hover:not(:disabled) {
2283
- background: color-mix(in srgb, var(--desk-ink) 7%, transparent);
2513
+ .desk-tour-count {
2514
+ color: var(--desk-muted);
2515
+ font-size: 11.5px;
2516
+ font-variant-numeric: tabular-nums;
2284
2517
  }
2285
2518
 
2286
- .desk-sidebar-item[data-current] {
2287
- background: color-mix(in srgb, var(--desk-accent) 18%, transparent);
2288
- font-weight: 500;
2519
+ .desk-tour-head .desk-button {
2520
+ margin-left: auto;
2289
2521
  }
2290
2522
 
2291
- .desk-sidebar-item:focus-visible {
2292
- outline: 2px solid var(--desk-accent);
2293
- outline-offset: -2px;
2523
+ .desk-tour-progress {
2524
+ height: 3px;
2525
+ margin: var(--desk-space-2) 0;
2526
+ border-radius: 2px;
2527
+ background: var(--desk-rule);
2528
+ overflow: hidden;
2294
2529
  }
2295
2530
 
2296
- .desk-sidebar-item:disabled {
2297
- opacity: .45;
2298
- cursor: not-allowed;
2531
+ .desk-tour-progress i {
2532
+ display: block;
2533
+ height: 100%;
2534
+ background: var(--desk-accent);
2535
+ transition: width .3s var(--desk-ease);
2299
2536
  }
2300
2537
 
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);
2538
+ .desk-tour-caption {
2539
+ margin: 0 0 var(--desk-space-2);
2540
+ font-size: 13.5px;
2541
+ line-height: 1.45;
2308
2542
  }
2309
2543
 
2310
- .desk-sidebar-item[data-current] .desk-sidebar-icon {
2311
- color: var(--desk-accent);
2544
+ .desk-tour-turn {
2545
+ margin-right: var(--desk-space-1);
2546
+ color: var(--desk-warn);
2547
+ font-weight: 700;
2312
2548
  }
2313
2549
 
2314
- .desk-sidebar-label {
2550
+ .desk-tour-turn::after {
2551
+ content: " ·";
2552
+ }
2553
+
2554
+ .desk-tour-actions {
2555
+ display: flex;
2556
+ align-items: center;
2557
+ gap: var(--desk-space-2);
2558
+ }
2559
+
2560
+ .desk-tour-spacer {
2315
2561
  flex: 1;
2316
- min-width: 0;
2317
- overflow: hidden;
2318
- text-overflow: ellipsis;
2319
- white-space: nowrap;
2320
2562
  }
2321
2563
 
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;
2564
+ /* What the tour is pointing at. */
2565
+ [data-desk-tour-pointed] {
2566
+ position: relative;
2567
+ z-index: 3;
2568
+ outline: 2px solid var(--desk-accent);
2569
+ outline-offset: 3px;
2570
+ border-radius: 6px;
2571
+ animation: desk-tour-pulse 1.6s var(--desk-ease) 2;
2572
+ }
2573
+
2574
+ @keyframes desk-tour-pulse {
2575
+ 0%, 100% {
2576
+ box-shadow: 0 0 0 0 color-mix(in srgb, var(--desk-accent) 0%, transparent);
2577
+ }
2578
+ 40% {
2579
+ box-shadow: 0 0 0 4px color-mix(in srgb, var(--desk-accent) 45%, transparent);
2580
+ }
2331
2581
  }
2332
2582
 
2333
- .desk-sidebar-footer {
2334
- margin-top: auto;
2335
- padding: var(--desk-space-2);
2336
- border-top: 1px solid var(--desk-rule);
2583
+ @media (prefers-reduced-motion: reduce) {
2584
+ .desk-tour-progress i {
2585
+ transition: none;
2586
+ }
2587
+
2588
+ [data-desk-tour-pointed] {
2589
+ animation: none;
2590
+ }
2337
2591
  }
2338
2592
 
2339
2593
  /* ── Wizard ── */
@@ -2517,6 +2771,7 @@
2517
2771
  }
2518
2772
  }
2519
2773
 
2774
+ /* @liberation-data/desk — apps.css */
2520
2775
  /* ── Dragging between windows ── */
2521
2776
 
2522
2777
  .desk-drag-preview {
@@ -2573,229 +2828,3 @@
2573
2828
  border: 0;
2574
2829
  background: var(--desk-surface);
2575
2830
  }
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
- }