@liberation-data/desk 0.4.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.
@@ -88,6 +89,7 @@
88
89
  --desk-field-bg: rgb(0 0 0 / 35%);
89
90
  }
90
91
 
92
+ /* @liberation-data/desk — windows.css */
91
93
  .desk-stage {
92
94
  position: relative;
93
95
  box-sizing: border-box;
@@ -350,6 +352,66 @@
350
352
  right: var(--desk-padding);
351
353
  }
352
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 */
353
415
  /* ── Dock ── */
354
416
 
355
417
  .desk-dock {
@@ -612,6 +674,17 @@
612
674
  color: var(--desk-muted);
613
675
  }
614
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 */
615
688
  /* ── Menu bar ── */
616
689
 
617
690
  .desk-menubar {
@@ -816,6 +889,7 @@
816
889
  }
817
890
  }
818
891
 
892
+ /* @liberation-data/desk — controls.css */
819
893
  /* ── Controls ── */
820
894
 
821
895
  .desk-button {
@@ -1087,486 +1161,519 @@
1087
1161
  }
1088
1162
  }
1089
1163
 
1090
- /* ── Overlays ── */
1164
+ /* ── Checkbox and slider ── */
1091
1165
 
1092
- .desk-popover-anchor {
1093
- position: relative;
1094
- 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;
1095
1171
  }
1096
1172
 
1097
- .desk-popover {
1098
- position: absolute;
1099
- z-index: 1200;
1100
- min-width: 220px;
1101
- 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);
1102
1210
  padding: var(--desk-space-3);
1103
1211
  border: 1px solid var(--desk-rule);
1104
1212
  border-radius: 12px;
1105
1213
  background: var(--desk-surface);
1106
- box-shadow: var(--desk-shadow-floating);
1107
- animation: desk-menu-in .14s var(--desk-ease);
1214
+ cursor: pointer;
1108
1215
  }
1109
1216
 
1110
- .desk-popover[data-placement="below"] {
1111
- 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));
1112
1219
  }
1113
1220
 
1114
- .desk-popover[data-placement="above"] {
1115
- 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);
1116
1224
  }
1117
1225
 
1118
- .desk-popover[data-align="start"] {
1119
- left: 0;
1226
+ .desk-choice[data-disabled] {
1227
+ opacity: .45;
1228
+ cursor: not-allowed;
1120
1229
  }
1121
1230
 
1122
- .desk-popover[data-align="end"] {
1123
- right: 0;
1231
+ .desk-choice:has(:focus-visible) {
1232
+ outline: 2px solid var(--desk-accent);
1233
+ outline-offset: 2px;
1124
1234
  }
1125
1235
 
1126
- /* A sheet belongs to its window: the scrim covers that window and nothing else. */
1127
- .desk-sheet-scrim,
1128
- .desk-alert-scrim {
1236
+ .desk-choice-input {
1129
1237
  position: absolute;
1130
- inset: 0;
1131
- z-index: 1300;
1132
- display: grid;
1133
- background: rgb(0 0 0 / 35%);
1134
- animation: desk-fade .16s var(--desk-ease);
1135
- }
1136
-
1137
- .desk-sheet-scrim {
1138
- place-items: start center;
1139
- padding: var(--desk-space-4);
1238
+ opacity: 0;
1239
+ pointer-events: none;
1140
1240
  }
1141
1241
 
1142
- .desk-alert-scrim {
1143
- position: fixed;
1144
- z-index: 1400;
1242
+ .desk-choice-mark {
1243
+ flex: none;
1244
+ display: grid;
1145
1245
  place-items: center;
1146
- padding: var(--desk-space-4);
1147
- background: rgb(0 0 0 / 45%);
1148
- }
1149
-
1150
- @keyframes desk-fade {
1151
- from {
1152
- opacity: 0;
1153
- }
1246
+ width: 16px;
1247
+ height: 16px;
1248
+ margin-top: 2px;
1249
+ border: 1.5px solid var(--desk-rule);
1250
+ border-radius: 50%;
1154
1251
  }
1155
1252
 
1156
- .desk-sheet,
1157
- .desk-alert {
1158
- box-sizing: border-box;
1159
- width: min(440px, 100%);
1160
- padding: var(--desk-space-4);
1161
- border: 1px solid var(--desk-rule);
1162
- border-radius: 14px;
1163
- background: var(--desk-surface);
1164
- color: var(--desk-ink);
1165
- box-shadow: var(--desk-shadow-floating);
1166
- font-family: var(--desk-font);
1253
+ .desk-choice[data-chosen] .desk-choice-mark {
1254
+ border-color: var(--desk-accent);
1167
1255
  }
1168
1256
 
1169
- .desk-sheet {
1170
- 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);
1171
1263
  }
1172
1264
 
1173
- .desk-alert {
1174
- width: min(380px, 100%);
1175
- text-align: center;
1176
- 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);
1177
1274
  }
1178
1275
 
1179
- @keyframes desk-sheet-in {
1180
- from {
1181
- transform: translateY(-12px);
1182
- opacity: 0;
1183
- }
1276
+ .desk-choice-icon svg {
1277
+ width: 18px;
1278
+ height: 18px;
1184
1279
  }
1185
1280
 
1186
- @keyframes desk-alert-in {
1187
- from {
1188
- transform: scale(.97);
1189
- opacity: 0;
1190
- }
1281
+ .desk-choice-text {
1282
+ flex: 1;
1283
+ min-width: 0;
1284
+ display: flex;
1285
+ flex-direction: column;
1286
+ gap: 2px;
1191
1287
  }
1192
1288
 
1193
- .desk-sheet-title,
1194
- .desk-alert-title {
1195
- margin: 0 0 var(--desk-space-1);
1196
- font-size: 15px;
1289
+ .desk-choice-label {
1197
1290
  font-weight: 600;
1198
1291
  }
1199
1292
 
1200
- .desk-sheet-description,
1201
- .desk-alert-message {
1202
- margin: 0 0 var(--desk-space-3);
1293
+ .desk-choice-tag {
1294
+ margin-left: var(--desk-space-2);
1295
+ font-weight: 400;
1203
1296
  color: var(--desk-muted);
1204
- font-size: 13px;
1205
- line-height: 1.5;
1206
1297
  }
1207
1298
 
1208
- .desk-sheet-actions,
1209
- .desk-alert-actions {
1299
+ .desk-checklist {
1210
1300
  display: flex;
1211
- justify-content: flex-end;
1212
- gap: var(--desk-space-2);
1213
- margin-top: var(--desk-space-4);
1214
- }
1215
-
1216
- .desk-alert-actions {
1217
- justify-content: center;
1301
+ flex-direction: column;
1302
+ gap: var(--desk-space-3);
1218
1303
  }
1219
1304
 
1220
- .desk-toasts {
1221
- position: fixed;
1222
- z-index: 1500;
1223
- right: var(--desk-space-4);
1224
- bottom: var(--desk-space-4);
1225
- display: flex;
1226
- flex-direction: column;
1227
- gap: var(--desk-space-2);
1228
- max-width: min(420px, calc(100vw - 32px));
1305
+ .desk-progress {
1306
+ height: 5px;
1307
+ border-radius: 3px;
1308
+ background: var(--desk-rule);
1309
+ overflow: hidden;
1229
1310
  }
1230
1311
 
1231
- .desk-toast {
1232
- display: flex;
1233
- align-items: center;
1234
- gap: var(--desk-space-2);
1235
- padding: var(--desk-space-2) var(--desk-space-2) var(--desk-space-2) var(--desk-space-3);
1236
- border: 1px solid var(--desk-rule);
1237
- border-radius: 10px;
1238
- background: var(--desk-surface);
1239
- box-shadow: var(--desk-shadow-floating);
1240
- font-family: var(--desk-font);
1241
- font-size: 13px;
1242
- animation: desk-toast-in .2s var(--desk-ease);
1312
+ .desk-progress i {
1313
+ display: block;
1314
+ height: 100%;
1315
+ background: var(--desk-accent);
1316
+ transition: width .4s var(--desk-ease);
1243
1317
  }
1244
1318
 
1245
- @keyframes desk-toast-in {
1246
- from {
1247
- transform: translateY(8px);
1248
- opacity: 0;
1249
- }
1319
+ .desk-tasks {
1320
+ margin: 0;
1321
+ padding: 0;
1322
+ list-style: none;
1323
+ border: 1px solid var(--desk-rule);
1324
+ border-radius: 12px;
1250
1325
  }
1251
1326
 
1252
- .desk-toast[data-tone="ok"] {
1253
- border-color: color-mix(in srgb, var(--desk-ok) 45%, var(--desk-rule));
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);
1254
1332
  }
1255
1333
 
1256
- .desk-toast[data-tone="bad"] {
1257
- border-color: color-mix(in srgb, var(--desk-bad) 45%, var(--desk-rule));
1334
+ .desk-task + .desk-task {
1335
+ border-top: 1px solid var(--desk-rule);
1258
1336
  }
1259
1337
 
1260
- .desk-toast-message {
1261
- flex: 1;
1262
- min-width: 0;
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);
1263
1348
  }
1264
1349
 
1265
- @media (prefers-reduced-motion: reduce) {
1266
- .desk-inputbar,
1267
- .desk-inputbar-scrim,
1268
- .desk-popover,
1269
- .desk-sheet,
1270
- .desk-alert,
1271
- .desk-toast,
1272
- .desk-sheet-scrim,
1273
- .desk-alert-scrim {
1274
- animation: none;
1275
- }
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;
1276
1354
  }
1277
1355
 
1278
- /* ── Conversation ── */
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);
1360
+ }
1279
1361
 
1280
- .desk-thread {
1281
- position: relative;
1282
- display: flex;
1283
- flex-direction: column;
1284
- min-height: 0;
1285
- height: 100%;
1286
- font-family: var(--desk-font);
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;
1287
1367
  }
1288
1368
 
1289
- .desk-thread-scroll {
1290
- flex: 1;
1291
- min-height: 0;
1292
- overflow-y: auto;
1293
- display: flex;
1294
- flex-direction: column;
1295
- gap: var(--desk-space-1);
1296
- padding: var(--desk-space-4);
1369
+ @keyframes desk-spin {
1370
+ to {
1371
+ transform: rotate(360deg);
1372
+ }
1297
1373
  }
1298
1374
 
1299
- .desk-message {
1375
+ .desk-task-text {
1376
+ flex: 1;
1377
+ min-width: 0;
1300
1378
  display: flex;
1301
1379
  flex-direction: column;
1302
- align-items: flex-start;
1303
- max-width: min(80%, 60ch);
1304
1380
  }
1305
1381
 
1306
- .desk-message[data-mine] {
1307
- align-self: flex-end;
1308
- align-items: flex-end;
1382
+ .desk-task-name {
1383
+ font-size: 13px;
1384
+ font-weight: 600;
1309
1385
  }
1310
1386
 
1311
- /* A new run of messages from the same person gets air; the rest stay close. */
1312
- .desk-message[data-run-start] {
1313
- margin-top: var(--desk-space-3);
1387
+ .desk-task-detail,
1388
+ .desk-task-error {
1389
+ font-size: 12px;
1390
+ color: var(--desk-muted);
1314
1391
  }
1315
1392
 
1316
- .desk-message:first-child {
1317
- margin-top: 0;
1393
+ .desk-task-error {
1394
+ color: var(--desk-bad);
1318
1395
  }
1319
1396
 
1320
- .desk-message-author {
1321
- margin-bottom: 2px;
1322
- padding: 0 var(--desk-space-1);
1323
- font-size: 11.5px;
1324
- font-weight: 600;
1325
- color: var(--desk-muted);
1397
+ @media (prefers-reduced-motion: reduce) {
1398
+ .desk-task[data-state="working"] .desk-task-mark {
1399
+ animation: none;
1400
+ }
1326
1401
  }
1327
1402
 
1328
- .desk-bubble {
1329
- padding: var(--desk-space-2) var(--desk-space-3);
1330
- border: 1px solid var(--desk-rule);
1331
- border-radius: 14px;
1332
- background: var(--desk-surface);
1333
- font-size: 13.5px;
1334
- line-height: 1.5;
1335
- white-space: pre-wrap;
1336
- overflow-wrap: anywhere;
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);
1337
1410
  }
1338
1411
 
1339
- .desk-message[data-mine] .desk-bubble {
1340
- border-color: transparent;
1341
- background: var(--desk-accent);
1342
- color: var(--desk-on-accent);
1343
- border-bottom-right-radius: 5px;
1412
+ .desk-radiogroup legend {
1413
+ padding: 0;
1414
+ margin-bottom: var(--desk-space-1);
1344
1415
  }
1345
1416
 
1346
- .desk-message:not([data-mine]) .desk-bubble {
1347
- 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;
1348
1423
  }
1349
1424
 
1350
- .desk-message[data-state="sending"] .desk-bubble {
1351
- opacity: .6;
1425
+ .desk-radio:focus-visible {
1426
+ outline: 2px solid var(--desk-accent);
1427
+ outline-offset: 2px;
1352
1428
  }
1353
1429
 
1354
- .desk-message[data-state="failed"] .desk-bubble {
1355
- border-color: var(--desk-bad);
1430
+ .desk-slider {
1431
+ display: flex;
1432
+ flex-direction: column;
1433
+ gap: var(--desk-space-1);
1356
1434
  }
1357
1435
 
1358
- .desk-message-foot {
1436
+ .desk-slider-head {
1359
1437
  display: flex;
1360
- align-items: center;
1438
+ align-items: baseline;
1439
+ justify-content: space-between;
1361
1440
  gap: var(--desk-space-2);
1362
- padding: 2px var(--desk-space-1) 0;
1363
- font-size: 11px;
1364
- color: var(--desk-muted);
1365
1441
  }
1366
1442
 
1367
- .desk-message-foot:empty {
1368
- display: none;
1443
+ .desk-slider-value {
1444
+ font-size: 12px;
1445
+ font-variant-numeric: tabular-nums;
1446
+ color: var(--desk-ink);
1369
1447
  }
1370
1448
 
1371
- .desk-message-failed {
1372
- color: var(--desk-bad);
1449
+ .desk-slider-track {
1450
+ width: 100%;
1451
+ accent-color: var(--desk-accent);
1373
1452
  }
1374
1453
 
1375
- .desk-typing {
1376
- align-self: flex-start;
1377
- margin-top: var(--desk-space-2);
1378
- padding: var(--desk-space-2) var(--desk-space-3);
1379
- border: 1px solid var(--desk-rule);
1380
- border-radius: 14px;
1381
- border-bottom-left-radius: 5px;
1382
- background: var(--desk-surface);
1454
+ /* ── Pop-up button ── */
1455
+
1456
+ .desk-popup-anchor {
1457
+ position: relative;
1383
1458
  }
1384
1459
 
1385
- .desk-typing-dots {
1460
+ .desk-popup-button {
1386
1461
  display: flex;
1387
- 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;
1388
1475
  }
1389
1476
 
1390
- .desk-typing-dots i {
1391
- width: 5px;
1392
- height: 5px;
1393
- border-radius: 50%;
1394
- background: var(--desk-muted);
1395
- animation: desk-typing 1.2s var(--desk-ease) infinite;
1477
+ .desk-popup-button[data-size="small"] {
1478
+ min-height: var(--desk-control-height-small);
1479
+ font-size: 12px;
1396
1480
  }
1397
1481
 
1398
- .desk-typing-dots i:nth-child(2) {
1399
- animation-delay: .15s;
1482
+ .desk-popup-button:focus-visible {
1483
+ outline: 2px solid var(--desk-accent);
1484
+ outline-offset: 2px;
1400
1485
  }
1401
1486
 
1402
- .desk-typing-dots i:nth-child(3) {
1403
- animation-delay: .3s;
1487
+ .desk-popup-button:disabled {
1488
+ opacity: .45;
1489
+ cursor: not-allowed;
1404
1490
  }
1405
1491
 
1406
- @keyframes desk-typing {
1407
- 0%, 60%, 100% {
1408
- opacity: .3;
1409
- }
1410
- 30% {
1411
- opacity: 1;
1412
- }
1492
+ .desk-popup-value {
1493
+ flex: 1;
1494
+ min-width: 0;
1495
+ overflow: hidden;
1496
+ text-overflow: ellipsis;
1497
+ white-space: nowrap;
1413
1498
  }
1414
1499
 
1415
- .desk-thread-jump {
1416
- position: absolute;
1417
- left: 50%;
1418
- bottom: var(--desk-space-3);
1419
- transform: translateX(-50%);
1420
- box-shadow: var(--desk-shadow);
1500
+ .desk-popup-value[data-placeholder] {
1501
+ color: var(--desk-muted);
1421
1502
  }
1422
1503
 
1423
- .desk-composer {
1424
- flex: none;
1425
- display: flex;
1426
- align-items: flex-end;
1427
- gap: var(--desk-space-2);
1428
- padding: var(--desk-space-3) var(--desk-space-4);
1429
- border-top: 1px solid var(--desk-rule);
1504
+ .desk-popup-icon {
1505
+ display: grid;
1506
+ place-items: center;
1507
+ width: 16px;
1508
+ height: 16px;
1430
1509
  }
1431
1510
 
1432
- .desk-composer-field {
1433
- flex: 1;
1434
- min-width: 0;
1435
- 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%;
1436
1522
  max-height: 40vh;
1437
- padding: var(--desk-space-2) var(--desk-space-3);
1523
+ margin: 0;
1524
+ padding: 4px;
1525
+ list-style: none;
1526
+ overflow-y: auto;
1438
1527
  border: 1px solid var(--desk-rule);
1439
- border-radius: var(--desk-control-radius);
1440
- background: var(--desk-field-bg);
1441
- color: var(--desk-ink);
1442
- font-family: var(--desk-font);
1443
- font-size: 13.5px;
1444
- line-height: 20px;
1445
- resize: none;
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);
1446
1532
  }
1447
1533
 
1448
- .desk-composer-field:focus-visible {
1449
- outline: 2px solid var(--desk-accent);
1450
- outline-offset: 2px;
1534
+ .desk-popup-list:focus {
1535
+ outline: none;
1451
1536
  }
1452
1537
 
1453
- .desk-composer-field::placeholder {
1454
- 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;
1455
1546
  }
1456
1547
 
1457
- @media (prefers-reduced-motion: reduce) {
1458
- .desk-typing-dots i {
1459
- animation: none;
1460
- }
1548
+ .desk-popup-option[data-active] {
1549
+ background: var(--desk-accent);
1550
+ color: var(--desk-on-accent);
1461
1551
  }
1462
1552
 
1463
- /* ── 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
+ }
1464
1556
 
1465
- .desk-inputbar-scrim {
1466
- position: fixed;
1467
- inset: 0;
1468
- z-index: 1450;
1469
- display: grid;
1470
- justify-items: center;
1471
- align-content: center;
1472
- padding: var(--desk-space-4);
1473
- background: rgb(0 0 0 / 30%);
1474
- animation: desk-fade .14s var(--desk-ease);
1557
+ .desk-popup-option[aria-disabled] {
1558
+ opacity: .5;
1475
1559
  }
1476
1560
 
1477
- .desk-inputbar[data-mode="summoned"] {
1478
- animation: desk-alert-in .16s var(--desk-ease);
1561
+ .desk-popup-check {
1562
+ width: 14px;
1563
+ flex: none;
1564
+ text-align: center;
1479
1565
  }
1480
1566
 
1481
- .desk-inputbar {
1482
- box-sizing: border-box;
1483
- width: min(720px, 100%);
1484
- border: 1px solid var(--desk-rule);
1485
- border-radius: 14px;
1486
- background: var(--desk-dock-glass);
1487
- backdrop-filter: blur(28px) saturate(170%);
1488
- -webkit-backdrop-filter: blur(28px) saturate(170%);
1489
- box-shadow: var(--desk-shadow-floating);
1567
+ .desk-popup-text {
1568
+ display: flex;
1569
+ flex-direction: column;
1490
1570
  }
1491
1571
 
1492
- .desk-inputbar .desk-composer {
1493
- border-top: 0;
1494
- padding: var(--desk-space-2);
1572
+ /* ── Table ── */
1573
+
1574
+ .desk-table-wrap {
1575
+ overflow: auto;
1495
1576
  }
1496
1577
 
1497
- .desk-inputbar-target {
1498
- display: block;
1499
- padding: 0 var(--desk-space-3) var(--desk-space-2);
1578
+ .desk-table {
1579
+ width: 100%;
1580
+ border-collapse: collapse;
1500
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);
1501
1592
  font-size: 11px;
1593
+ font-weight: 600;
1594
+ letter-spacing: .06em;
1595
+ text-transform: uppercase;
1502
1596
  color: var(--desk-muted);
1597
+ text-align: left;
1598
+ white-space: nowrap;
1503
1599
  }
1504
1600
 
1505
- .desk-inputbar-target b {
1506
- 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 {
1507
1621
  color: var(--desk-ink);
1508
1622
  }
1509
1623
 
1510
- /* ── Search ── */
1624
+ .desk-table td {
1625
+ padding: var(--desk-space-2);
1626
+ border-bottom: 1px solid var(--desk-rule);
1627
+ }
1511
1628
 
1512
- .desk-search-scrim {
1513
- position: fixed;
1514
- inset: 0;
1515
- z-index: 1450;
1516
- display: grid;
1517
- justify-items: center;
1518
- align-content: start;
1519
- padding: 12vh var(--desk-space-4) var(--desk-space-4);
1520
- background: rgb(0 0 0 / 35%);
1521
- animation: desk-fade .14s var(--desk-ease);
1629
+ .desk-table td[data-numeric] {
1630
+ font-variant-numeric: tabular-nums;
1522
1631
  }
1523
1632
 
1524
- .desk-search {
1525
- box-sizing: border-box;
1526
- width: min(620px, 100%);
1527
- max-height: 70vh;
1528
- display: flex;
1529
- flex-direction: column;
1530
- border: 1px solid var(--desk-rule);
1531
- border-radius: 14px;
1532
- background: var(--desk-surface);
1533
- box-shadow: var(--desk-shadow-floating);
1534
- font-family: var(--desk-font);
1535
- overflow: hidden;
1536
- animation: desk-alert-in .16s var(--desk-ease);
1633
+ .desk-table tbody tr {
1634
+ cursor: default;
1537
1635
  }
1538
1636
 
1539
- .desk-search-bar {
1540
- flex: none;
1541
- padding: var(--desk-space-3) var(--desk-space-4);
1542
- border-bottom: 1px solid var(--desk-rule);
1637
+ .desk-table tbody tr:hover {
1638
+ background: color-mix(in srgb, var(--desk-ink) 5%, transparent);
1543
1639
  }
1544
1640
 
1545
- .desk-search-field {
1546
- width: 100%;
1547
- border: 0;
1548
- background: none;
1549
- color: var(--desk-ink);
1550
- font-family: var(--desk-font);
1551
- font-size: 17px;
1552
- outline: none;
1641
+ .desk-table tbody tr[data-selected] {
1642
+ background: color-mix(in srgb, var(--desk-accent) 16%, transparent);
1553
1643
  }
1554
1644
 
1555
- .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;
1556
1653
  color: var(--desk-muted);
1654
+ font-family: var(--desk-font);
1655
+ font-size: 13px;
1557
1656
  }
1558
1657
 
1559
- .desk-search-results {
1560
- flex: 1;
1561
- 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 {
1562
1670
  margin: 0;
1563
- padding: var(--desk-space-1);
1671
+ padding: 0;
1564
1672
  list-style: none;
1565
- overflow-y: auto;
1566
1673
  }
1567
1674
 
1568
- .desk-search-group {
1569
- margin: var(--desk-space-2) 0 2px;
1675
+ .desk-sidebar-heading {
1676
+ margin: 0 0 var(--desk-space-1);
1570
1677
  padding: 0 var(--desk-space-2);
1571
1678
  font-size: 11px;
1572
1679
  font-weight: 700;
@@ -1575,782 +1682,912 @@
1575
1682
  color: var(--desk-muted);
1576
1683
  }
1577
1684
 
1578
- .desk-search-row {
1685
+ .desk-sidebar-item {
1579
1686
  display: flex;
1580
1687
  align-items: center;
1581
- gap: var(--desk-space-3);
1582
- padding: var(--desk-space-2);
1583
- border-radius: 8px;
1584
- cursor: default;
1585
- }
1586
-
1587
- .desk-search-row[data-active] {
1588
- background: var(--desk-accent);
1589
- color: var(--desk-on-accent);
1590
- }
1591
-
1592
- .desk-search-icon {
1593
- display: grid;
1594
- place-items: center;
1595
- width: 28px;
1596
- height: 28px;
1597
- flex: none;
1598
- border: 1px solid var(--desk-rule);
1688
+ gap: var(--desk-space-2);
1689
+ width: 100%;
1690
+ padding: var(--desk-space-1) var(--desk-space-2);
1691
+ border: 0;
1599
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;
1600
1699
  }
1601
1700
 
1602
- .desk-search-icon svg {
1603
- width: 15px;
1604
- height: 15px;
1701
+ .desk-sidebar-item:hover:not(:disabled) {
1702
+ background: color-mix(in srgb, var(--desk-ink) 7%, transparent);
1605
1703
  }
1606
1704
 
1607
- .desk-search-row[data-active] .desk-search-icon {
1608
- border-color: transparent;
1609
- 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;
1610
1708
  }
1611
1709
 
1612
- .desk-search-text {
1613
- flex: 1;
1614
- min-width: 0;
1710
+ .desk-sidebar-item:focus-visible {
1711
+ outline: 2px solid var(--desk-accent);
1712
+ outline-offset: -2px;
1615
1713
  }
1616
1714
 
1617
- .desk-search-title {
1618
- display: block;
1619
- font-size: 13.5px;
1620
- font-weight: 500;
1715
+ .desk-sidebar-item:disabled {
1716
+ opacity: .45;
1717
+ cursor: not-allowed;
1621
1718
  }
1622
1719
 
1623
- .desk-search-subtitle,
1624
- .desk-search-kind {
1625
- font-size: 11.5px;
1720
+ .desk-sidebar-icon {
1721
+ display: grid;
1722
+ place-items: center;
1723
+ width: 16px;
1724
+ height: 16px;
1725
+ flex: none;
1626
1726
  color: var(--desk-muted);
1627
1727
  }
1628
1728
 
1629
- .desk-search-subtitle {
1630
- display: block;
1729
+ .desk-sidebar-item[data-current] .desk-sidebar-icon {
1730
+ color: var(--desk-accent);
1631
1731
  }
1632
1732
 
1633
- .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 {
1634
1742
  flex: none;
1635
- font-family: var(--desk-font-mono);
1636
- 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;
1637
1750
  }
1638
1751
 
1639
- .desk-search-row[data-active] .desk-search-subtitle,
1640
- .desk-search-row[data-active] .desk-search-kind {
1641
- color: rgb(255 255 255 / 80%);
1752
+ .desk-sidebar-footer {
1753
+ margin-top: auto;
1754
+ padding: var(--desk-space-2);
1755
+ border-top: 1px solid var(--desk-rule);
1642
1756
  }
1643
1757
 
1644
- .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;
1645
1761
  margin: 0;
1646
- 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;
1647
1776
  text-align: center;
1648
- color: var(--desk-muted);
1649
- font-size: 13px;
1777
+ cursor: default;
1778
+ user-select: none;
1779
+ outline: none;
1650
1780
  }
1651
1781
 
1652
- @media (prefers-reduced-motion: reduce) {
1653
- .desk-search,
1654
- .desk-search-scrim {
1655
- animation: none;
1656
- }
1782
+ .desk-icon-cell[aria-disabled="true"] {
1783
+ opacity: .45;
1657
1784
  }
1658
1785
 
1659
- /* ── Tour ── */
1786
+ .desk-icon-cell:focus-visible {
1787
+ box-shadow: 0 0 0 2px var(--desk-accent);
1788
+ }
1660
1789
 
1661
- .desk-tour {
1662
- box-sizing: border-box;
1663
- width: min(620px, 100%);
1664
- padding: var(--desk-space-3);
1665
- border: 1px solid color-mix(in srgb, var(--desk-accent) 45%, var(--desk-rule));
1790
+ .desk-icon-glyph {
1791
+ position: relative;
1792
+ display: grid;
1793
+ place-items: center;
1794
+ width: 56px;
1795
+ height: 56px;
1666
1796
  border-radius: 14px;
1667
- background: var(--desk-dock-glass);
1668
- backdrop-filter: blur(28px) saturate(170%);
1669
- -webkit-backdrop-filter: blur(28px) saturate(170%);
1670
- box-shadow: var(--desk-shadow-floating), 0 0 30px color-mix(in srgb, var(--desk-accent) 20%, transparent);
1671
- font-family: var(--desk-font);
1797
+ border: 1px solid var(--desk-rule);
1798
+ background: var(--desk-dock-icon);
1672
1799
  color: var(--desk-ink);
1673
1800
  }
1674
1801
 
1675
- .desk-tour-head {
1676
- display: flex;
1677
- align-items: center;
1678
- gap: var(--desk-space-2);
1679
- font-size: 13px;
1802
+ .desk-icon-glyph > svg,
1803
+ .desk-icon-glyph > img {
1804
+ width: 55%;
1805
+ height: 55%;
1806
+ object-fit: contain;
1680
1807
  }
1681
1808
 
1682
- .desk-tour-count {
1683
- color: var(--desk-muted);
1684
- font-size: 11.5px;
1685
- 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;
1686
1820
  }
1687
1821
 
1688
- .desk-tour-head .desk-button {
1689
- 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;
1690
1833
  }
1691
1834
 
1692
- .desk-tour-progress {
1693
- height: 3px;
1694
- margin: var(--desk-space-2) 0;
1695
- border-radius: 2px;
1696
- background: var(--desk-rule);
1835
+ .desk-icon-subtitle {
1836
+ max-width: 100%;
1837
+ font-size: 11px;
1838
+ color: var(--desk-muted);
1697
1839
  overflow: hidden;
1840
+ text-overflow: ellipsis;
1841
+ white-space: nowrap;
1698
1842
  }
1699
1843
 
1700
- .desk-tour-progress i {
1701
- display: block;
1702
- 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 {
1703
1849
  background: var(--desk-accent);
1704
- transition: width .3s var(--desk-ease);
1850
+ color: #fff;
1705
1851
  }
1706
1852
 
1707
- .desk-tour-caption {
1708
- margin: 0 0 var(--desk-space-2);
1709
- font-size: 13.5px;
1710
- 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;
1711
1859
  }
1712
1860
 
1713
- .desk-tour-turn {
1714
- margin-right: var(--desk-space-1);
1715
- color: var(--desk-warn);
1716
- font-weight: 700;
1861
+ .desk-icon-drag {
1862
+ display: grid;
1863
+ place-items: center;
1864
+ width: 40px;
1865
+ height: 40px;
1717
1866
  }
1718
1867
 
1719
- .desk-tour-turn::after {
1720
- content: " ·";
1868
+ /* @liberation-data/desk — overlays.css */
1869
+ /* ── Overlays ── */
1870
+
1871
+ .desk-popover-anchor {
1872
+ position: relative;
1873
+ display: inline-flex;
1721
1874
  }
1722
1875
 
1723
- .desk-tour-actions {
1724
- display: flex;
1725
- align-items: center;
1726
- 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);
1727
1887
  }
1728
1888
 
1729
- .desk-tour-spacer {
1730
- flex: 1;
1889
+ .desk-popover[data-placement="below"] {
1890
+ top: calc(100% + 6px);
1731
1891
  }
1732
1892
 
1733
- /* What the tour is pointing at. */
1734
- [data-desk-tour-pointed] {
1735
- position: relative;
1736
- z-index: 3;
1737
- outline: 2px solid var(--desk-accent);
1738
- outline-offset: 3px;
1739
- border-radius: 6px;
1740
- animation: desk-tour-pulse 1.6s var(--desk-ease) 2;
1893
+ .desk-popover[data-placement="above"] {
1894
+ bottom: calc(100% + 6px);
1741
1895
  }
1742
1896
 
1743
- @keyframes desk-tour-pulse {
1744
- 0%, 100% {
1745
- box-shadow: 0 0 0 0 color-mix(in srgb, var(--desk-accent) 0%, transparent);
1746
- }
1747
- 40% {
1748
- box-shadow: 0 0 0 4px color-mix(in srgb, var(--desk-accent) 45%, transparent);
1749
- }
1897
+ .desk-popover[data-align="start"] {
1898
+ left: 0;
1750
1899
  }
1751
1900
 
1752
- @media (prefers-reduced-motion: reduce) {
1753
- .desk-tour-progress i {
1754
- transition: none;
1755
- }
1901
+ .desk-popover[data-align="end"] {
1902
+ right: 0;
1903
+ }
1756
1904
 
1757
- [data-desk-tour-pointed] {
1758
- 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;
1759
1932
  }
1760
1933
  }
1761
1934
 
1762
- /* ── 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
+ }
1763
1947
 
1764
- .desk-check-row {
1765
- display: flex;
1766
- align-items: flex-start;
1767
- gap: var(--desk-space-2);
1768
- padding: var(--desk-space-1) 0;
1948
+ .desk-sheet {
1949
+ animation: desk-sheet-in .22s var(--desk-ease);
1769
1950
  }
1770
1951
 
1771
- .desk-checkbox {
1772
- width: 16px;
1773
- height: 16px;
1774
- margin: 2px 0 0;
1775
- accent-color: var(--desk-accent);
1776
- 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
+ }
1970
+ }
1971
+
1972
+ .desk-sheet-title,
1973
+ .desk-alert-title {
1974
+ margin: 0 0 var(--desk-space-1);
1975
+ font-size: 15px;
1976
+ font-weight: 600;
1777
1977
  }
1778
1978
 
1779
- .desk-check-text {
1780
- display: flex;
1781
- flex-direction: column;
1782
- gap: 2px;
1979
+ .desk-sheet-description,
1980
+ .desk-alert-message {
1981
+ margin: 0 0 var(--desk-space-3);
1982
+ color: var(--desk-muted);
1983
+ font-size: 13px;
1984
+ line-height: 1.5;
1783
1985
  }
1784
1986
 
1785
- .desk-check-label {
1786
- font-size: 13px;
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);
1787
1993
  }
1788
1994
 
1789
- .desk-checkbox:focus-visible,
1790
- .desk-slider-track:focus-visible {
1791
- outline: 2px solid var(--desk-accent);
1792
- outline-offset: 2px;
1995
+ .desk-alert-actions {
1996
+ justify-content: center;
1793
1997
  }
1794
1998
 
1795
- .desk-choices {
1796
- margin: 0;
1797
- padding: 0;
1798
- border: 0;
1999
+ .desk-toasts {
2000
+ position: fixed;
2001
+ z-index: 1500;
2002
+ right: var(--desk-space-4);
2003
+ bottom: var(--desk-space-4);
1799
2004
  display: flex;
1800
2005
  flex-direction: column;
1801
2006
  gap: var(--desk-space-2);
2007
+ max-width: min(420px, calc(100vw - 32px));
1802
2008
  }
1803
2009
 
1804
- .desk-choice {
2010
+ .desk-toast {
1805
2011
  display: flex;
1806
- align-items: flex-start;
1807
- gap: var(--desk-space-3);
1808
- 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);
1809
2015
  border: 1px solid var(--desk-rule);
1810
- border-radius: 12px;
2016
+ border-radius: 10px;
1811
2017
  background: var(--desk-surface);
1812
- 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);
1813
2022
  }
1814
2023
 
1815
- .desk-choice:hover:not([data-disabled]) {
1816
- 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
+ }
1817
2029
  }
1818
2030
 
1819
- .desk-choice[data-chosen] {
1820
- border-color: var(--desk-accent);
1821
- 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));
1822
2033
  }
1823
2034
 
1824
- .desk-choice[data-disabled] {
1825
- opacity: .45;
1826
- cursor: not-allowed;
2035
+ .desk-toast[data-tone="bad"] {
2036
+ border-color: color-mix(in srgb, var(--desk-bad) 45%, var(--desk-rule));
1827
2037
  }
1828
2038
 
1829
- .desk-choice:has(:focus-visible) {
1830
- outline: 2px solid var(--desk-accent);
1831
- outline-offset: 2px;
2039
+ .desk-toast-message {
2040
+ flex: 1;
2041
+ min-width: 0;
1832
2042
  }
1833
2043
 
1834
- .desk-choice-input {
1835
- position: absolute;
1836
- opacity: 0;
1837
- 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
+ }
1838
2055
  }
1839
2056
 
1840
- .desk-choice-mark {
2057
+ /* ── An (i): what a view would explain if asked ── */
2058
+
2059
+ .desk-infotip {
1841
2060
  flex: none;
1842
- display: grid;
2061
+ display: inline-grid;
1843
2062
  place-items: center;
1844
- width: 16px;
1845
- height: 16px;
1846
- margin-top: 2px;
1847
- 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);
1848
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;
1849
2078
  }
1850
2079
 
1851
- .desk-choice[data-chosen] .desk-choice-mark {
1852
- 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);
1853
2084
  }
1854
2085
 
1855
- .desk-choice[data-chosen] .desk-choice-mark::after {
1856
- content: "";
1857
- width: 8px;
1858
- height: 8px;
1859
- border-radius: 50%;
1860
- background: var(--desk-accent);
2086
+ .desk-infotip:focus-visible {
2087
+ outline: 2px solid var(--desk-info);
2088
+ outline-offset: 2px;
1861
2089
  }
1862
2090
 
1863
- .desk-choice-icon {
1864
- flex: none;
1865
- display: grid;
1866
- place-items: center;
1867
- width: 36px;
1868
- height: 36px;
1869
- border: 1px solid var(--desk-rule);
1870
- border-radius: 10px;
2091
+ .desk-infotip-body {
2092
+ max-width: 34ch;
2093
+ font-size: 12.5px;
2094
+ line-height: 1.45;
1871
2095
  color: var(--desk-muted);
1872
2096
  }
1873
2097
 
1874
- .desk-choice-icon svg {
1875
- width: 18px;
1876
- height: 18px;
1877
- }
1878
-
1879
- .desk-choice-text {
1880
- flex: 1;
1881
- min-width: 0;
1882
- display: flex;
1883
- flex-direction: column;
1884
- gap: 2px;
2098
+ .desk-infotip-body > :first-child {
2099
+ margin-top: 0;
1885
2100
  }
1886
2101
 
1887
- .desk-choice-label {
1888
- font-weight: 600;
2102
+ .desk-infotip-body > :last-child {
2103
+ margin-bottom: 0;
1889
2104
  }
1890
2105
 
1891
- .desk-choice-tag {
1892
- margin-left: var(--desk-space-2);
1893
- font-weight: 400;
1894
- color: var(--desk-muted);
1895
- }
2106
+ /* @liberation-data/desk — conversation.css */
2107
+ /* ── Conversation ── */
1896
2108
 
1897
- .desk-checklist {
2109
+ .desk-thread {
2110
+ position: relative;
1898
2111
  display: flex;
1899
2112
  flex-direction: column;
1900
- gap: var(--desk-space-3);
1901
- }
1902
-
1903
- .desk-progress {
1904
- height: 5px;
1905
- border-radius: 3px;
1906
- background: var(--desk-rule);
1907
- overflow: hidden;
1908
- }
1909
-
1910
- .desk-progress i {
1911
- display: block;
2113
+ min-height: 0;
1912
2114
  height: 100%;
1913
- background: var(--desk-accent);
1914
- transition: width .4s var(--desk-ease);
1915
- }
1916
-
1917
- .desk-tasks {
1918
- margin: 0;
1919
- padding: 0;
1920
- list-style: none;
1921
- border: 1px solid var(--desk-rule);
1922
- border-radius: 12px;
2115
+ font-family: var(--desk-font);
1923
2116
  }
1924
2117
 
1925
- .desk-task {
2118
+ .desk-thread-scroll {
2119
+ flex: 1;
2120
+ min-height: 0;
2121
+ overflow-y: auto;
1926
2122
  display: flex;
1927
- align-items: center;
1928
- gap: var(--desk-space-3);
1929
- padding: var(--desk-space-2) var(--desk-space-3);
1930
- }
1931
-
1932
- .desk-task + .desk-task {
1933
- border-top: 1px solid var(--desk-rule);
2123
+ flex-direction: column;
2124
+ gap: var(--desk-space-1);
2125
+ padding: var(--desk-space-4);
1934
2126
  }
1935
2127
 
1936
- .desk-task-mark {
1937
- flex: none;
1938
- display: grid;
1939
- place-items: center;
1940
- box-sizing: border-box;
1941
- width: 20px;
1942
- height: 20px;
1943
- border-radius: 50%;
1944
- font-size: 12px;
1945
- border: 1.5px dashed var(--desk-rule);
2128
+ .desk-message {
2129
+ display: flex;
2130
+ flex-direction: column;
2131
+ align-items: flex-start;
2132
+ max-width: min(80%, 60ch);
1946
2133
  }
1947
2134
 
1948
- .desk-task[data-state="working"] .desk-task-mark {
1949
- border: 2px solid var(--desk-rule);
1950
- border-top-color: var(--desk-accent);
1951
- animation: desk-spin .8s linear infinite;
2135
+ .desk-message[data-mine] {
2136
+ align-self: flex-end;
2137
+ align-items: flex-end;
1952
2138
  }
1953
2139
 
1954
- .desk-task[data-state="done"] .desk-task-mark {
1955
- border: 0;
1956
- background: color-mix(in srgb, var(--desk-ok) 18%, transparent);
1957
- color: var(--desk-ok);
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);
1958
2143
  }
1959
2144
 
1960
- .desk-task[data-state="failed"] .desk-task-mark {
1961
- border: 0;
1962
- background: color-mix(in srgb, var(--desk-bad) 18%, transparent);
1963
- color: var(--desk-bad);
1964
- font-weight: 700;
2145
+ .desk-message:first-child {
2146
+ margin-top: 0;
1965
2147
  }
1966
2148
 
1967
- @keyframes desk-spin {
1968
- to {
1969
- transform: rotate(360deg);
1970
- }
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);
1971
2155
  }
1972
2156
 
1973
- .desk-task-text {
1974
- flex: 1;
1975
- min-width: 0;
1976
- display: flex;
1977
- flex-direction: column;
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;
1978
2166
  }
1979
2167
 
1980
- .desk-task-name {
1981
- font-size: 13px;
1982
- font-weight: 600;
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;
1983
2173
  }
1984
2174
 
1985
- .desk-task-detail,
1986
- .desk-task-error {
1987
- font-size: 12px;
1988
- color: var(--desk-muted);
2175
+ .desk-message:not([data-mine]) .desk-bubble {
2176
+ border-bottom-left-radius: 5px;
1989
2177
  }
1990
2178
 
1991
- .desk-task-error {
1992
- color: var(--desk-bad);
2179
+ .desk-message[data-state="sending"] .desk-bubble {
2180
+ opacity: .6;
1993
2181
  }
1994
2182
 
1995
- @media (prefers-reduced-motion: reduce) {
1996
- .desk-task[data-state="working"] .desk-task-mark {
1997
- animation: none;
1998
- }
2183
+ .desk-message[data-state="failed"] .desk-bubble {
2184
+ border-color: var(--desk-bad);
1999
2185
  }
2000
2186
 
2001
- .desk-radiogroup {
2002
- margin: 0;
2003
- padding: 0;
2004
- border: 0;
2187
+ .desk-message-foot {
2005
2188
  display: flex;
2006
- flex-direction: column;
2007
- 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);
2008
2194
  }
2009
2195
 
2010
- .desk-radiogroup legend {
2011
- padding: 0;
2012
- margin-bottom: var(--desk-space-1);
2196
+ .desk-message-foot:empty {
2197
+ display: none;
2013
2198
  }
2014
2199
 
2015
- .desk-radio {
2016
- width: 16px;
2017
- height: 16px;
2018
- margin: 2px 0 0;
2019
- accent-color: var(--desk-accent);
2020
- flex: none;
2200
+ .desk-message-failed {
2201
+ color: var(--desk-bad);
2021
2202
  }
2022
2203
 
2023
- .desk-radio:focus-visible {
2024
- outline: 2px solid var(--desk-accent);
2025
- 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);
2026
2212
  }
2027
2213
 
2028
- .desk-slider {
2214
+ .desk-typing-dots {
2029
2215
  display: flex;
2030
- flex-direction: column;
2031
- gap: var(--desk-space-1);
2216
+ gap: 4px;
2032
2217
  }
2033
2218
 
2034
- .desk-slider-head {
2035
- display: flex;
2036
- align-items: baseline;
2037
- justify-content: space-between;
2038
- 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;
2039
2225
  }
2040
2226
 
2041
- .desk-slider-value {
2042
- font-size: 12px;
2043
- font-variant-numeric: tabular-nums;
2044
- color: var(--desk-ink);
2227
+ .desk-typing-dots i:nth-child(2) {
2228
+ animation-delay: .15s;
2045
2229
  }
2046
2230
 
2047
- .desk-slider-track {
2048
- width: 100%;
2049
- accent-color: var(--desk-accent);
2231
+ .desk-typing-dots i:nth-child(3) {
2232
+ animation-delay: .3s;
2050
2233
  }
2051
2234
 
2052
- /* ── Pop-up button ── */
2235
+ @keyframes desk-typing {
2236
+ 0%, 60%, 100% {
2237
+ opacity: .3;
2238
+ }
2239
+ 30% {
2240
+ opacity: 1;
2241
+ }
2242
+ }
2053
2243
 
2054
- .desk-popup-anchor {
2055
- 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);
2056
2250
  }
2057
2251
 
2058
- .desk-popup-button {
2252
+ .desk-composer {
2253
+ flex: none;
2059
2254
  display: flex;
2060
- align-items: center;
2255
+ align-items: flex-end;
2061
2256
  gap: var(--desk-space-2);
2062
- 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;
2063
2264
  min-height: var(--desk-control-height);
2064
- 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);
2065
2267
  border: 1px solid var(--desk-rule);
2066
2268
  border-radius: var(--desk-control-radius);
2067
2269
  background: var(--desk-field-bg);
2068
2270
  color: var(--desk-ink);
2069
2271
  font-family: var(--desk-font);
2070
- font-size: 13px;
2071
- text-align: left;
2072
- cursor: pointer;
2073
- }
2074
-
2075
- .desk-popup-button[data-size="small"] {
2076
- min-height: var(--desk-control-height-small);
2077
- font-size: 12px;
2272
+ font-size: 13.5px;
2273
+ line-height: 20px;
2274
+ resize: none;
2078
2275
  }
2079
2276
 
2080
- .desk-popup-button:focus-visible {
2277
+ .desk-composer-field:focus-visible {
2081
2278
  outline: 2px solid var(--desk-accent);
2082
2279
  outline-offset: 2px;
2083
2280
  }
2084
2281
 
2085
- .desk-popup-button:disabled {
2086
- opacity: .45;
2087
- cursor: not-allowed;
2282
+ .desk-composer-field::placeholder {
2283
+ color: var(--desk-muted);
2088
2284
  }
2089
2285
 
2090
- .desk-popup-value {
2091
- flex: 1;
2092
- min-width: 0;
2093
- overflow: hidden;
2094
- text-overflow: ellipsis;
2095
- white-space: nowrap;
2286
+ @media (prefers-reduced-motion: reduce) {
2287
+ .desk-typing-dots i {
2288
+ animation: none;
2289
+ }
2096
2290
  }
2097
2291
 
2098
- .desk-popup-value[data-placeholder] {
2099
- color: var(--desk-muted);
2100
- }
2292
+ /* ── Input bar: one place to type, which reaches the key window ── */
2101
2293
 
2102
- .desk-popup-icon {
2294
+ .desk-inputbar-scrim {
2295
+ position: fixed;
2296
+ inset: 0;
2297
+ z-index: 1450;
2103
2298
  display: grid;
2104
- place-items: center;
2105
- width: 16px;
2106
- 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);
2107
2304
  }
2108
2305
 
2109
- .desk-popup-chevron {
2110
- color: var(--desk-muted);
2111
- line-height: 1;
2306
+ .desk-inputbar[data-mode="summoned"] {
2307
+ animation: desk-alert-in .16s var(--desk-ease);
2112
2308
  }
2113
2309
 
2114
- .desk-popup-list {
2115
- position: absolute;
2116
- z-index: 1200;
2117
- top: calc(100% + 4px);
2118
- left: 0;
2119
- min-width: 100%;
2120
- max-height: 40vh;
2121
- margin: 0;
2122
- padding: 4px;
2123
- list-style: none;
2124
- overflow-y: auto;
2310
+ .desk-inputbar {
2311
+ box-sizing: border-box;
2312
+ width: min(720px, 100%);
2125
2313
  border: 1px solid var(--desk-rule);
2126
- border-radius: 10px;
2127
- 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%);
2128
2318
  box-shadow: var(--desk-shadow-floating);
2129
- animation: desk-menu-in .12s var(--desk-ease);
2130
2319
  }
2131
2320
 
2132
- .desk-popup-list:focus {
2133
- outline: none;
2321
+ .desk-inputbar .desk-composer {
2322
+ border-top: 0;
2323
+ padding: var(--desk-space-2);
2134
2324
  }
2135
2325
 
2136
- .desk-popup-option {
2137
- display: flex;
2138
- align-items: flex-start;
2139
- gap: var(--desk-space-1);
2140
- padding: var(--desk-space-1) var(--desk-space-2);
2141
- border-radius: 6px;
2142
- font-size: 13px;
2143
- cursor: default;
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);
2144
2332
  }
2145
2333
 
2146
- .desk-popup-option[data-active] {
2147
- background: var(--desk-accent);
2148
- color: var(--desk-on-accent);
2334
+ .desk-inputbar-target b {
2335
+ font-weight: 600;
2336
+ color: var(--desk-ink);
2149
2337
  }
2150
2338
 
2151
- .desk-popup-option[data-active] .desk-help {
2152
- color: rgb(255 255 255 / 80%);
2153
- }
2339
+ /* @liberation-data/desk — search.css */
2340
+ /* ── Search ── */
2154
2341
 
2155
- .desk-popup-option[aria-disabled] {
2156
- opacity: .5;
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);
2157
2352
  }
2158
2353
 
2159
- .desk-popup-check {
2160
- width: 14px;
2161
- flex: none;
2162
- text-align: center;
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);
2163
2367
  }
2164
2368
 
2165
- .desk-popup-text {
2166
- display: flex;
2167
- flex-direction: column;
2369
+ .desk-search-bar {
2370
+ flex: none;
2371
+ padding: var(--desk-space-3) var(--desk-space-4);
2372
+ border-bottom: 1px solid var(--desk-rule);
2168
2373
  }
2169
2374
 
2170
- /* ── Table ── */
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;
2383
+ }
2171
2384
 
2172
- .desk-table-wrap {
2173
- overflow: auto;
2385
+ .desk-search-field::placeholder {
2386
+ color: var(--desk-muted);
2174
2387
  }
2175
2388
 
2176
- .desk-table {
2177
- width: 100%;
2178
- border-collapse: collapse;
2179
- font-family: var(--desk-font);
2180
- 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;
2181
2396
  }
2182
2397
 
2183
- .desk-table th {
2184
- position: sticky;
2185
- top: 0;
2186
- z-index: 1;
2187
- padding: var(--desk-space-1) var(--desk-space-2);
2188
- border-bottom: 1px solid var(--desk-rule);
2189
- background: var(--desk-surface);
2398
+ .desk-search-group {
2399
+ margin: var(--desk-space-2) 0 2px;
2400
+ padding: 0 var(--desk-space-2);
2190
2401
  font-size: 11px;
2191
- font-weight: 600;
2192
- letter-spacing: .06em;
2402
+ font-weight: 700;
2403
+ letter-spacing: .08em;
2193
2404
  text-transform: uppercase;
2194
2405
  color: var(--desk-muted);
2195
- text-align: left;
2196
- white-space: nowrap;
2197
2406
  }
2198
2407
 
2199
- .desk-table th[data-align="end"],
2200
- .desk-table td[data-align="end"] {
2201
- 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;
2202
2415
  }
2203
2416
 
2204
- .desk-table-sort {
2205
- display: inline-flex;
2206
- align-items: center;
2207
- gap: 4px;
2208
- padding: 0;
2209
- border: 0;
2210
- background: none;
2211
- color: inherit;
2212
- font: inherit;
2213
- letter-spacing: inherit;
2214
- text-transform: inherit;
2215
- cursor: pointer;
2417
+ .desk-search-row[data-active] {
2418
+ background: var(--desk-accent);
2419
+ color: var(--desk-on-accent);
2216
2420
  }
2217
2421
 
2218
- .desk-table-sort:hover {
2219
- 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;
2220
2430
  }
2221
2431
 
2222
- .desk-table td {
2223
- padding: var(--desk-space-2);
2224
- border-bottom: 1px solid var(--desk-rule);
2432
+ .desk-search-icon svg {
2433
+ width: 15px;
2434
+ height: 15px;
2225
2435
  }
2226
2436
 
2227
- .desk-table td[data-numeric] {
2228
- 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%);
2229
2440
  }
2230
2441
 
2231
- .desk-table tbody tr {
2232
- cursor: default;
2442
+ .desk-search-text {
2443
+ flex: 1;
2444
+ min-width: 0;
2233
2445
  }
2234
2446
 
2235
- .desk-table tbody tr:hover {
2236
- 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;
2237
2451
  }
2238
2452
 
2239
- .desk-table tbody tr[data-selected] {
2240
- 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);
2241
2457
  }
2242
2458
 
2243
- .desk-table tbody tr:focus-visible {
2244
- outline: 2px solid var(--desk-accent);
2245
- outline-offset: -2px;
2459
+ .desk-search-subtitle {
2460
+ display: block;
2246
2461
  }
2247
2462
 
2248
- .desk-table-empty {
2249
- 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);
2250
2477
  text-align: center;
2251
2478
  color: var(--desk-muted);
2252
- font-family: var(--desk-font);
2253
2479
  font-size: 13px;
2254
2480
  }
2255
2481
 
2256
- /* ── Sidebar ── */
2257
-
2258
- .desk-sidebar {
2259
- display: flex;
2260
- flex-direction: column;
2261
- gap: var(--desk-space-3);
2262
- padding: var(--desk-space-2);
2263
- font-family: var(--desk-font);
2264
- overflow-y: auto;
2482
+ @media (prefers-reduced-motion: reduce) {
2483
+ .desk-search,
2484
+ .desk-search-scrim {
2485
+ animation: none;
2486
+ }
2265
2487
  }
2266
2488
 
2267
- .desk-sidebar ul {
2268
- margin: 0;
2269
- padding: 0;
2270
- list-style: none;
2271
- }
2489
+ /* @liberation-data/desk setup.css */
2490
+ /* ── Tour ── */
2272
2491
 
2273
- .desk-sidebar-heading {
2274
- margin: 0 0 var(--desk-space-1);
2275
- padding: 0 var(--desk-space-2);
2276
- font-size: 11px;
2277
- font-weight: 700;
2278
- letter-spacing: .08em;
2279
- text-transform: uppercase;
2280
- color: var(--desk-muted);
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);
2281
2504
  }
2282
2505
 
2283
- .desk-sidebar-item {
2506
+ .desk-tour-head {
2284
2507
  display: flex;
2285
2508
  align-items: center;
2286
2509
  gap: var(--desk-space-2);
2287
- width: 100%;
2288
- padding: var(--desk-space-1) var(--desk-space-2);
2289
- border: 0;
2290
- border-radius: 7px;
2291
- background: none;
2292
- color: var(--desk-ink);
2293
- font-family: inherit;
2294
2510
  font-size: 13px;
2295
- text-align: left;
2296
- cursor: pointer;
2297
2511
  }
2298
2512
 
2299
- .desk-sidebar-item:hover:not(:disabled) {
2300
- 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;
2301
2517
  }
2302
2518
 
2303
- .desk-sidebar-item[data-current] {
2304
- background: color-mix(in srgb, var(--desk-accent) 18%, transparent);
2305
- font-weight: 500;
2519
+ .desk-tour-head .desk-button {
2520
+ margin-left: auto;
2306
2521
  }
2307
2522
 
2308
- .desk-sidebar-item:focus-visible {
2309
- outline: 2px solid var(--desk-accent);
2310
- 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;
2311
2529
  }
2312
2530
 
2313
- .desk-sidebar-item:disabled {
2314
- opacity: .45;
2315
- 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);
2316
2536
  }
2317
2537
 
2318
- .desk-sidebar-icon {
2319
- display: grid;
2320
- place-items: center;
2321
- width: 16px;
2322
- height: 16px;
2323
- flex: none;
2324
- color: var(--desk-muted);
2538
+ .desk-tour-caption {
2539
+ margin: 0 0 var(--desk-space-2);
2540
+ font-size: 13.5px;
2541
+ line-height: 1.45;
2325
2542
  }
2326
2543
 
2327
- .desk-sidebar-item[data-current] .desk-sidebar-icon {
2328
- color: var(--desk-accent);
2544
+ .desk-tour-turn {
2545
+ margin-right: var(--desk-space-1);
2546
+ color: var(--desk-warn);
2547
+ font-weight: 700;
2329
2548
  }
2330
2549
 
2331
- .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 {
2332
2561
  flex: 1;
2333
- min-width: 0;
2334
- overflow: hidden;
2335
- text-overflow: ellipsis;
2336
- white-space: nowrap;
2337
2562
  }
2338
2563
 
2339
- .desk-sidebar-badge {
2340
- flex: none;
2341
- min-width: 18px;
2342
- padding: 0 5px;
2343
- border-radius: 9px;
2344
- background: color-mix(in srgb, var(--desk-ink) 12%, transparent);
2345
- font-size: 11px;
2346
- font-variant-numeric: tabular-nums;
2347
- text-align: center;
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
+ }
2348
2581
  }
2349
2582
 
2350
- .desk-sidebar-footer {
2351
- margin-top: auto;
2352
- padding: var(--desk-space-2);
2353
- 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
+ }
2354
2591
  }
2355
2592
 
2356
2593
  /* ── Wizard ── */
@@ -2534,6 +2771,7 @@
2534
2771
  }
2535
2772
  }
2536
2773
 
2774
+ /* @liberation-data/desk — apps.css */
2537
2775
  /* ── Dragging between windows ── */
2538
2776
 
2539
2777
  .desk-drag-preview {
@@ -2590,231 +2828,3 @@
2590
2828
  border: 0;
2591
2829
  background: var(--desk-surface);
2592
2830
  }
2593
-
2594
- /* Icon view: a Finder's icons, in rows that follow the window's width. */
2595
- .desk-icon-view {
2596
- list-style: none;
2597
- margin: 0;
2598
- padding: 12px;
2599
- display: grid;
2600
- grid-template-columns: repeat(auto-fill, minmax(104px, 1fr));
2601
- align-content: start;
2602
- gap: 8px;
2603
- }
2604
-
2605
- .desk-icon-cell {
2606
- display: grid;
2607
- justify-items: center;
2608
- align-content: start;
2609
- gap: 4px;
2610
- padding: 10px 6px;
2611
- border-radius: 10px;
2612
- text-align: center;
2613
- cursor: default;
2614
- user-select: none;
2615
- outline: none;
2616
- }
2617
-
2618
- .desk-icon-cell[aria-disabled="true"] {
2619
- opacity: .45;
2620
- }
2621
-
2622
- .desk-icon-cell:focus-visible {
2623
- box-shadow: 0 0 0 2px var(--desk-accent);
2624
- }
2625
-
2626
- .desk-icon-glyph {
2627
- position: relative;
2628
- display: grid;
2629
- place-items: center;
2630
- width: 56px;
2631
- height: 56px;
2632
- border-radius: 14px;
2633
- border: 1px solid var(--desk-rule);
2634
- background: var(--desk-dock-icon);
2635
- color: var(--desk-ink);
2636
- }
2637
-
2638
- .desk-icon-glyph > svg,
2639
- .desk-icon-glyph > img {
2640
- width: 55%;
2641
- height: 55%;
2642
- object-fit: contain;
2643
- }
2644
-
2645
- .desk-icon-badge {
2646
- position: absolute;
2647
- top: -5px;
2648
- right: -5px;
2649
- min-width: 18px;
2650
- padding: 0 5px;
2651
- border-radius: 9px;
2652
- background: var(--desk-accent);
2653
- color: #fff;
2654
- font-size: 11px;
2655
- line-height: 18px;
2656
- }
2657
-
2658
- .desk-icon-label {
2659
- max-width: 100%;
2660
- padding: 1px 6px;
2661
- border-radius: 5px;
2662
- font-size: 12.5px;
2663
- line-height: 1.3;
2664
- overflow-wrap: anywhere;
2665
- display: -webkit-box;
2666
- -webkit-line-clamp: 2;
2667
- -webkit-box-orient: vertical;
2668
- overflow: hidden;
2669
- }
2670
-
2671
- .desk-icon-subtitle {
2672
- max-width: 100%;
2673
- font-size: 11px;
2674
- color: var(--desk-muted);
2675
- overflow: hidden;
2676
- text-overflow: ellipsis;
2677
- white-space: nowrap;
2678
- }
2679
-
2680
- .desk-icon-cell[aria-selected="true"] .desk-icon-glyph {
2681
- background: color-mix(in srgb, var(--desk-accent) 16%, transparent);
2682
- }
2683
-
2684
- .desk-icon-cell[aria-selected="true"] .desk-icon-label {
2685
- background: var(--desk-accent);
2686
- color: #fff;
2687
- }
2688
-
2689
- .desk-icon-view-empty {
2690
- display: grid;
2691
- place-items: center;
2692
- padding: 32px 16px;
2693
- color: var(--desk-muted);
2694
- text-align: center;
2695
- }
2696
-
2697
- .desk-icon-drag {
2698
- display: grid;
2699
- place-items: center;
2700
- width: 40px;
2701
- height: 40px;
2702
- }
2703
-
2704
- /* Something carried to the dock: the dock lights up, and a kept item shows where it would go in front. */
2705
- .desk-dock-item[data-desk-drop][data-ready] {
2706
- outline: none;
2707
- background: var(--desk-dock-icon);
2708
- }
2709
-
2710
- .desk-dock-item[data-desk-drop][data-over] {
2711
- box-shadow: -6px 0 0 -2px var(--desk-accent);
2712
- }
2713
-
2714
- /* ── The inside of a window: controls that stay, content that scrolls ── */
2715
-
2716
- .desk-pane {
2717
- display: flex;
2718
- flex-direction: column;
2719
- height: 100%;
2720
- min-height: 0;
2721
- }
2722
-
2723
- .desk-pane-header,
2724
- .desk-pane-footer {
2725
- flex: none;
2726
- }
2727
-
2728
- /* The only part that scrolls, so the toolbar never leaves with the content. */
2729
- .desk-pane-body {
2730
- flex: 1;
2731
- min-height: 0;
2732
- overflow: auto;
2733
- }
2734
-
2735
- .desk-pane-body:focus-visible {
2736
- outline: 2px solid var(--desk-accent);
2737
- outline-offset: -2px;
2738
- }
2739
-
2740
- /* A window whose whole content is a pane does not scroll itself: the pane's middle does. */
2741
- .desk-body:has(> .desk-pane) {
2742
- overflow: hidden;
2743
- }
2744
-
2745
- .desk-toolbar {
2746
- display: flex;
2747
- align-items: center;
2748
- flex-wrap: wrap;
2749
- gap: var(--desk-space-2);
2750
- /* One centre line for everything in the row, whatever each control's own height is. */
2751
- min-height: calc(var(--desk-control-height) + var(--desk-space-2) * 2);
2752
- padding: var(--desk-space-2) var(--desk-space-3);
2753
- border-bottom: 1px solid var(--desk-rule);
2754
- }
2755
-
2756
- .desk-toolbar > *,
2757
- .desk-toolbar-trailing > * {
2758
- flex: none;
2759
- }
2760
-
2761
- .desk-toolbar .desk-grow {
2762
- flex: 1 1 140px;
2763
- min-width: 0;
2764
- }
2765
-
2766
- .desk-toolbar-trailing {
2767
- margin-left: auto;
2768
- display: flex;
2769
- align-items: center;
2770
- gap: var(--desk-space-2);
2771
- }
2772
-
2773
- /* ── An (i): what a view would explain if asked ── */
2774
-
2775
- .desk-infotip {
2776
- flex: none;
2777
- display: inline-grid;
2778
- place-items: center;
2779
- width: 18px;
2780
- height: 18px;
2781
- padding: 0;
2782
- /* The title bar's own green, the one the zoom control wears: a muted grey (i) sat in a muted
2783
- trailing edge and went unseen, which defeats the point of having one place to ask. */
2784
- border: 1px solid color-mix(in srgb, var(--desk-info) 55%, transparent);
2785
- border-radius: 50%;
2786
- background: color-mix(in srgb, var(--desk-info) 14%, transparent);
2787
- color: var(--desk-info);
2788
- font-family: var(--desk-font);
2789
- font-size: 11px;
2790
- font-style: italic;
2791
- font-weight: 700;
2792
- line-height: 1;
2793
- cursor: pointer;
2794
- }
2795
-
2796
- .desk-infotip:hover,
2797
- .desk-infotip[data-open] {
2798
- border-color: var(--desk-info);
2799
- background: color-mix(in srgb, var(--desk-info) 26%, transparent);
2800
- }
2801
-
2802
- .desk-infotip:focus-visible {
2803
- outline: 2px solid var(--desk-info);
2804
- outline-offset: 2px;
2805
- }
2806
-
2807
- .desk-infotip-body {
2808
- max-width: 34ch;
2809
- font-size: 12.5px;
2810
- line-height: 1.45;
2811
- color: var(--desk-muted);
2812
- }
2813
-
2814
- .desk-infotip-body > :first-child {
2815
- margin-top: 0;
2816
- }
2817
-
2818
- .desk-infotip-body > :last-child {
2819
- margin-bottom: 0;
2820
- }