clay-server 5.0.0-beta.2 → 5.0.0-beta.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. package/lib/daemon.js +9 -0
  2. package/lib/new-session-default.js +45 -0
  3. package/lib/project-connection.js +4 -2
  4. package/lib/project-session-creation.js +107 -0
  5. package/lib/project-session-delete.js +21 -3
  6. package/lib/project-session-folder-delete.js +169 -0
  7. package/lib/project-session-folders.js +272 -0
  8. package/lib/project-sessions.js +46 -26
  9. package/lib/project.js +2 -0
  10. package/lib/public/app.js +10 -0
  11. package/lib/public/css/filebrowser.css +3 -3
  12. package/lib/public/css/mates.css +1 -1
  13. package/lib/public/css/mobile-nav.css +0 -128
  14. package/lib/public/css/session-folders.css +383 -0
  15. package/lib/public/css/sidebar.css +28 -545
  16. package/lib/public/index.html +3 -21
  17. package/lib/public/modules/app-favicon.js +5 -4
  18. package/lib/public/modules/app-messages.js +13 -0
  19. package/lib/public/modules/input.js +3 -0
  20. package/lib/public/modules/project-switcher.js +4 -4
  21. package/lib/public/modules/session-create-form.js +428 -0
  22. package/lib/public/modules/session-create.js +338 -0
  23. package/lib/public/modules/session-folder-collapse.js +192 -0
  24. package/lib/public/modules/session-folder-context.js +215 -0
  25. package/lib/public/modules/session-folder-delete.js +313 -0
  26. package/lib/public/modules/session-folder-dialogs.js +173 -0
  27. package/lib/public/modules/session-folder-dnd.js +214 -0
  28. package/lib/public/modules/session-folder-draft.js +184 -0
  29. package/lib/public/modules/session-folder-layout.js +133 -0
  30. package/lib/public/modules/session-folder-toolbar.js +185 -0
  31. package/lib/public/modules/session-folder-view-menu.js +187 -0
  32. package/lib/public/modules/session-folders.js +95 -0
  33. package/lib/public/modules/session-list-search.js +108 -0
  34. package/lib/public/modules/session-presence-ui.js +44 -0
  35. package/lib/public/modules/sidebar-mobile.js +38 -182
  36. package/lib/public/modules/sidebar-session-folders-ui.js +382 -0
  37. package/lib/public/modules/sidebar-sessions.js +141 -718
  38. package/lib/public/modules/sidebar.js +10 -2
  39. package/lib/public/modules/terminal.js +2 -2
  40. package/lib/public/modules/tool-palette.js +37 -219
  41. package/lib/public/style.css +1 -0
  42. package/lib/server.js +4 -0
  43. package/lib/session-folders.js +414 -0
  44. package/lib/sessions.js +7 -5
  45. package/lib/users-session-folder-preferences.js +69 -0
  46. package/lib/users.js +6 -0
  47. package/lib/ws-schema.js +11 -0
  48. package/package.json +1 -1
  49. package/lib/public/modules/session-creation-cta.js +0 -46
  50. package/lib/public/modules/tool-palette-overlays.js +0 -159
@@ -282,117 +282,29 @@
282
282
  padding: 4px 12px 2px;
283
283
  }
284
284
 
285
- /* --- Tools section --- */
286
- #sidebar-tools {
287
- flex-shrink: 0;
288
- padding-bottom: 6px;
289
- }
290
-
291
- /* Section header: "Tools" label on the left, a dim keyboard-hint next
292
- to it explaining the Cmd+O shortcut, and a small pencil icon edit
293
- button right-aligned. Three elements but each does just one thing,
294
- so nothing reads as pushy. */
295
- .sidebar-tools-header {
296
- display: flex;
297
- align-items: center;
298
- gap: 8px;
299
- padding: 4px 8px 2px 12px;
300
- }
301
- .sidebar-tools-header .sidebar-section-label {
302
- padding: 0;
303
- color: var(--text-muted);
304
- }
305
-
306
- /* Small shortcut-pill for the Cmd/Ctrl+O hotkey overlay. Mirrors the
307
- icon-strip hotkey hints so keyboard shortcuts look the same across
308
- the sidebar surface. */
309
- .sidebar-tools-hint {
310
- display: inline-flex;
311
- align-items: center;
312
- justify-content: center;
313
- min-width: 28px;
314
- padding: 2px 4px;
315
- border: 1px solid var(--border-subtle);
316
- background: var(--bg-alt);
317
- color: var(--text-dimmer);
318
- font-size: 10px;
319
- font-weight: 600;
320
- font-family: inherit;
321
- border-radius: 6px;
322
- cursor: pointer;
323
- opacity: 0.7;
324
- transition: opacity 0.15s, color 0.15s, background 0.15s;
325
- }
326
- .sidebar-tools-hint:hover {
327
- opacity: 1;
328
- color: var(--text-muted);
329
- background: var(--bg);
285
+ /* Section labels that duplicate what the content already says stay in the DOM
286
+ for assistive technology but are not shown. */
287
+ .sidebar-label-sr {
288
+ position: absolute !important;
289
+ width: 1px;
290
+ height: 1px;
291
+ margin: -1px;
292
+ padding: 0 !important;
293
+ overflow: hidden;
294
+ clip: rect(0 0 0 0);
295
+ white-space: nowrap;
296
+ border: 0;
330
297
  }
331
298
 
332
- /* Pencil-icon edit button, far-right of the header. Dim by default so
333
- it doesn't pull attention; on hover it brightens to signal that
334
- it's a real affordance. */
335
- .tool-palette-edit-btn {
336
- margin-left: auto;
337
- display: inline-flex;
338
- align-items: center;
339
- justify-content: center;
340
- width: 22px;
341
- height: 22px;
342
- background: none;
343
- border: none;
344
- cursor: pointer;
345
- color: var(--text-dimmer);
346
- opacity: 0.45;
347
- border-radius: 6px;
348
- transition: background 0.15s, color 0.15s, opacity 0.15s;
349
- }
350
- .tool-palette-edit-btn .lucide,
351
- .tool-palette-edit-btn svg {
352
- width: 13px;
353
- height: 13px;
354
- }
355
- .tool-palette-edit-btn:hover {
356
- background: var(--sidebar-hover);
357
- color: var(--text-muted);
358
- opacity: 1;
359
- }
360
- .tool-palette-edit-btn.active {
361
- background: var(--accent);
362
- color: #fff;
363
- opacity: 1;
364
- }
365
- .tool-palette-edit-btn.active:hover {
366
- background: var(--accent);
367
- color: #fff;
368
- opacity: 1;
369
- filter: brightness(1.1);
370
- }
299
+ body:not(.home-active) #icon-strip-hint-mate { display: none; }
371
300
 
372
- /* Hidden-tools section appears only in edit mode when items are hidden. */
373
- .tool-palette-hidden-section {
374
- padding: 4px 8px 8px;
375
- border-top: 1px dashed var(--border-subtle);
376
- margin-top: 4px;
377
- }
378
- .tool-palette-hidden-section.hidden {
379
- display: none;
380
- }
381
- .tool-palette-hidden-label {
382
- font-size: 10px;
383
- font-weight: 600;
384
- color: var(--text-dimmer);
385
- text-transform: uppercase;
386
- letter-spacing: 0.5px;
387
- padding: 2px 4px 6px;
388
- }
389
- .tool-palette-hidden-grid {
390
- display: grid;
391
- grid-template-columns: repeat(4, 1fr);
392
- gap: 4px;
301
+ /* --- Tools section --- */
302
+ #sidebar-tools {
303
+ flex-shrink: 0;
304
+ padding-bottom: 12px;
393
305
  }
394
306
 
395
- /* --- Shared tile style (applies in both active and hidden grids) --- */
307
+ /* --- Shared tile style (session and Mate tool grids) --- */
396
308
  .palette-tile {
397
309
  position: relative;
398
310
  display: flex;
@@ -458,77 +370,21 @@
458
370
  word-break: break-word;
459
371
  }
460
372
 
461
- /* --- Edit mode affordances (shared across session + mate palettes) --- */
462
-
463
- /* × remove badge on each tile. Hidden in normal mode; shown in edit. */
464
- .tool-palette-remove {
465
- position: absolute;
466
- top: -4px;
467
- right: -4px;
468
- width: 16px;
469
- height: 16px;
470
- border-radius: 50%;
471
- background: var(--accent);
472
- color: #fff;
473
- font-size: 13px;
474
- font-weight: 700;
475
- line-height: 1;
476
- display: flex;
477
- align-items: center;
478
- justify-content: center;
479
- cursor: pointer;
480
- opacity: 0;
481
- transform: scale(0.6);
482
- pointer-events: none;
483
- transition: opacity 0.15s, transform 0.15s;
484
- z-index: 2;
485
- user-select: none;
486
- }
487
- .edit-mode .tool-palette-remove {
488
- opacity: 1;
489
- transform: scale(1);
490
- pointer-events: auto;
491
- }
492
- .edit-mode .tool-palette-remove:hover {
493
- filter: brightness(1.15);
494
- }
495
-
496
373
  /* Drag-reorder feedback. Tiles are draggable at all times (macOS dock
497
374
  pattern) so users can rearrange without entering a separate mode.
498
375
  -webkit-user-drag is explicit for Safari, which otherwise sometimes
499
- ignores draggable when user-select is none on an ancestor. Edit mode
500
- adds the outline so the tiles read as mutable during an edit. */
376
+ ignores draggable when user-select is none on an ancestor. */
501
377
  #session-actions [data-tool-id],
502
378
  #mate-sidebar-tools [data-tool-id] {
503
379
  -webkit-user-drag: element;
504
380
  }
505
- .edit-mode [data-tool-id] {
506
- box-shadow: inset 0 0 0 1px var(--border-subtle);
507
- animation: tile-wiggle 0.22s ease-in-out infinite;
508
- transform-origin: 50% 50%;
509
- }
510
- /* Desync the wiggle across tiles so they don't swing in lockstep. */
511
- .edit-mode [data-tool-id]:nth-child(2n) {
512
- animation-delay: -0.11s;
513
- }
514
- .edit-mode [data-tool-id]:nth-child(3n) {
515
- animation-duration: 0.26s;
516
- }
517
- @keyframes tile-wiggle {
518
- 0% { transform: rotate(-1.2deg); }
519
- 50% { transform: rotate(1.2deg); }
520
- 100% { transform: rotate(-1.2deg); }
521
- }
522
- /* The dragged tile shouldn't wiggle while under the cursor. */
523
381
  [data-tool-id].dragging {
524
382
  opacity: 0.4;
525
383
  cursor: grabbing;
526
- animation: none;
527
384
  }
528
385
  /* Children shouldn't swallow drag events — the browser starts drag on
529
386
  the element under the pointer, and we want that to always be the
530
- draggable button, not the inner icon/label/badge. The × affordance
531
- stays interactive (it needs clicks in edit mode). */
387
+ draggable button, not the inner icon/label/badge. */
532
388
  [data-tool-id] > i,
533
389
  [data-tool-id] > svg,
534
390
  [data-tool-id] > .tool-btn-label,
@@ -536,208 +392,19 @@
536
392
  pointer-events: none;
537
393
  }
538
394
 
539
- /* Hidden-section tiles are dimmed to signal "not active" and get a small
540
- + glyph on hover to suggest they can be restored. */
541
- .tool-palette-hidden-grid [data-tool-id] {
542
- opacity: 0.55;
543
- cursor: pointer;
544
- transition: opacity 0.15s, background 0.15s, color 0.15s;
545
- }
546
- .tool-palette-hidden-grid [data-tool-id]:hover {
547
- opacity: 1;
548
- }
549
- .tool-palette-hidden-grid .tool-palette-remove {
550
- display: none;
551
- }
552
- .tool-palette-hidden-grid .sidebar-badge {
553
- display: none;
554
- }
555
-
556
- /* Hotkey badge shown on each active palette tile while Cmd/Ctrl+O pick
557
- mode is active. Top-left so it doesn't collide with the × (top-right)
558
- or count badges. High-contrast accent so the keystroke is obvious. */
559
- .tool-palette-hotkey-badge {
560
- position: absolute;
561
- top: -4px;
562
- left: -4px;
563
- min-width: 16px;
564
- height: 16px;
565
- padding: 0 4px;
566
- border-radius: 4px;
567
- background: var(--accent);
568
- color: #fff;
569
- font-size: 10px;
570
- font-weight: 700;
571
- line-height: 16px;
572
- text-align: center;
573
- pointer-events: none;
574
- z-index: 3;
575
- box-shadow: 0 1px 2px rgba(0, 0, 0, 0.25);
576
- animation: tool-palette-hotkey-in 0.12s ease-out;
577
- }
578
- @keyframes tool-palette-hotkey-in {
579
- from { opacity: 0; transform: scale(0.7); }
580
- to { opacity: 1; transform: scale(1); }
581
- }
582
-
583
- /* Right-click context menu on palette tiles. Mirrors .session-ctx-menu. */
584
- .tool-palette-ctx-menu {
585
- position: fixed;
586
- background: var(--sidebar-bg);
587
- border: 1px solid var(--border);
588
- border-radius: 10px;
589
- padding: 4px 0;
590
- min-width: 180px;
591
- box-shadow: 0 4px 16px rgba(var(--shadow-rgb), 0.4);
592
- z-index: 9999;
593
- font-family: inherit;
594
- }
595
- .tool-palette-ctx-item {
596
- display: flex;
597
- align-items: center;
598
- width: 100%;
599
- padding: 8px 12px;
600
- font-size: 13px;
601
- color: var(--text-secondary);
602
- background: none;
603
- border: none;
604
- font-family: inherit;
605
- cursor: pointer;
606
- text-align: left;
607
- transition: background 0.15s;
608
- }
609
- .tool-palette-ctx-item:hover {
610
- background: rgba(var(--overlay-rgb), 0.05);
611
- }
612
- /* --- Sessions header (pinned above scroll) --- */
395
+ /* --- Sessions header (pinned above scroll): New session --- */
613
396
  #sidebar-sessions-header {
614
397
  flex-shrink: 0;
615
398
  }
616
399
 
617
400
  .sidebar-sessions-header-row {
618
- display: flex;
619
- align-items: center;
620
- padding: 4px 8px 2px 12px;
621
- gap: 8px;
622
- }
623
-
624
- /* --- Session search --- */
625
- .sidebar-sessions-search-inline {
626
401
  position: relative;
627
- margin-left: auto;
628
- width: 150px;
629
- }
630
-
631
- .sidebar-sessions-search-inline.hidden {
632
- display: none;
633
- }
634
-
635
- .sidebar-sessions-header-row .sidebar-section-label {
636
- padding: 0;
637
- color: var(--text-muted);
638
- }
639
-
640
- .session-filter-count {
641
- display: inline-flex;
642
- align-items: center;
643
- justify-content: center;
644
- min-width: 18px;
645
- height: 18px;
646
- padding: 0 6px;
647
- border-radius: 999px;
648
- background: rgba(var(--overlay-rgb), 0.08);
649
- color: var(--text-dimmer);
650
- font-size: 10px;
651
- font-weight: 600;
652
- line-height: 1;
653
- }
654
-
655
- .session-filter-count.hidden {
656
- display: none;
657
- }
658
-
659
- .sidebar-sessions-header-row > #session-header-search-btn {
660
- margin-left: auto;
661
- display: inline-flex;
662
- align-items: center;
663
- justify-content: center;
664
- width: 22px;
665
- height: 22px;
666
- border: none;
667
- border-radius: 6px;
668
- background: transparent;
669
- color: var(--text-dimmer);
670
- cursor: pointer;
671
- padding: 0;
672
- opacity: 0.45;
673
- transition: color 0.15s, background 0.15s, opacity 0.15s;
674
- }
675
-
676
- .sidebar-sessions-header-row > #session-header-search-btn.active,
677
- .sidebar-sessions-header-row > #session-header-search-btn:hover {
678
- color: var(--text);
679
- background: var(--sidebar-hover);
680
- opacity: 1;
681
- }
682
-
683
- .sidebar-sessions-header-row > #session-header-search-btn .lucide,
684
- .sidebar-sessions-header-row > #session-header-search-btn svg {
685
- width: 14px;
686
- height: 14px;
687
- }
688
-
689
- .sidebar-sessions-search-inline:not(.hidden) + #session-header-search-btn {
690
- margin-left: 0;
691
- }
692
-
693
- .sidebar-sessions-search-inline input {
694
- width: 100%;
695
- padding: 6px 28px 6px 10px;
696
- border-radius: 8px;
697
- border: 1px solid var(--border);
698
- background: var(--input-bg);
699
- color: var(--text);
700
- font-size: 12px;
701
- font-family: inherit;
702
- outline: none;
703
- transition: border-color 0.15s;
704
- box-sizing: border-box;
705
- }
706
-
707
- .sidebar-sessions-search-inline input:focus {
708
- border-color: var(--accent);
709
- }
710
-
711
- .sidebar-sessions-search-inline input::placeholder {
712
- color: var(--text-dimmer);
713
- }
714
-
715
- .sidebar-sessions-search-inline button {
716
- position: absolute;
717
- right: 6px;
718
- top: 50%;
719
- transform: translateY(-50%);
720
402
  display: flex;
721
403
  align-items: center;
722
- justify-content: center;
723
- width: 20px;
724
- height: 20px;
725
- border: none;
726
- background: transparent;
727
- color: var(--text-dimmer);
728
- cursor: pointer;
729
- padding: 0;
730
- border-radius: 4px;
731
- transition: color 0.15s, background 0.15s;
732
- }
733
-
734
- .sidebar-sessions-search-inline button.hidden {
735
- display: none;
404
+ padding: 0 8px 0 8px;
405
+ gap: 4px;
736
406
  }
737
407
 
738
- .sidebar-sessions-search-inline button .lucide { width: 14px; height: 14px; }
739
- .sidebar-sessions-search-inline button:hover { color: var(--text); background: var(--sidebar-hover); }
740
-
741
408
  .session-item.search-match {
742
409
  background: color-mix(in srgb, var(--link) 9%, transparent);
743
410
  color: var(--text);
@@ -1133,11 +800,6 @@
1133
800
  padding-right: 0;
1134
801
  }
1135
802
 
1136
- .session-item:has(.session-presence) .session-item-text {
1137
- padding-right: 54px;
1138
- }
1139
-
1140
- .session-item:has(.session-presence) .session-item-age,
1141
803
  .session-item:has(.session-unread-badge.has-unread) .session-item-age,
1142
804
  .session-item:hover .session-item-age,
1143
805
  .session-item:focus-within .session-item-age {
@@ -1213,132 +875,6 @@
1213
875
  pointer-events: none;
1214
876
  }
1215
877
 
1216
- .session-top-actions {
1217
- display: grid;
1218
- grid-template-columns: minmax(0, 1fr);
1219
- gap: 2px;
1220
- padding: 0 0 2px;
1221
- }
1222
-
1223
- .session-top-action {
1224
- display: flex;
1225
- align-items: center;
1226
- gap: 10px;
1227
- width: 100%;
1228
- min-height: 34px;
1229
- padding: 0 12px;
1230
- border: none;
1231
- border-radius: 10px;
1232
- background: transparent;
1233
- color: var(--text-secondary);
1234
- font-family: inherit;
1235
- font-size: 13px;
1236
- font-weight: 500;
1237
- cursor: pointer;
1238
- text-align: left;
1239
- min-width: 0;
1240
- opacity: 1;
1241
- transition: background 0.15s, color 0.15s, opacity 0.15s;
1242
- }
1243
-
1244
- .session-top-action .lucide,
1245
- .session-top-action svg {
1246
- width: 14px;
1247
- height: 14px;
1248
- flex-shrink: 0;
1249
- }
1250
-
1251
- .session-top-action-icon {
1252
- width: 18px;
1253
- height: 18px;
1254
- flex-shrink: 0;
1255
- border-radius: 4px;
1256
- object-fit: cover;
1257
- }
1258
-
1259
- .session-top-action:hover {
1260
- background: var(--sidebar-hover);
1261
- color: var(--text);
1262
- opacity: 1;
1263
- }
1264
-
1265
- .session-top-action:focus-visible {
1266
- outline: 2px solid var(--accent);
1267
- outline-offset: 2px;
1268
- }
1269
-
1270
- /* Primary creation action with an adjacent icon-only provider selector. */
1271
- .session-top-action-split {
1272
- display: flex;
1273
- flex-wrap: nowrap;
1274
- align-items: stretch;
1275
- gap: 0;
1276
- min-width: 0;
1277
- }
1278
-
1279
- .session-top-action-split .split-main {
1280
- flex: 1 1 auto;
1281
- width: auto;
1282
- min-width: 0;
1283
- padding: 0 9px;
1284
- gap: 6px;
1285
- font-size: 12px;
1286
- line-height: 1.2;
1287
- border: 1px solid var(--border-subtle);
1288
- background: color-mix(in srgb, var(--sidebar-hover) 46%, transparent);
1289
- color: var(--text);
1290
- font-weight: 500;
1291
- white-space: normal;
1292
- text-align: left;
1293
- border-radius: 9px 0 0 9px;
1294
- }
1295
-
1296
- .session-top-action-split .split-main:hover {
1297
- border-color: var(--border);
1298
- background: var(--sidebar-hover);
1299
- }
1300
-
1301
- .session-top-action-split .split-provider {
1302
- flex: 0 0 26px;
1303
- width: 26px;
1304
- min-width: 26px;
1305
- padding: 0;
1306
- border: 1px solid var(--border-subtle);
1307
- border-left-color: var(--border);
1308
- background: color-mix(in srgb, var(--sidebar-hover) 46%, transparent);
1309
- border-radius: 0 9px 9px 0;
1310
- display: inline-flex;
1311
- align-items: center;
1312
- gap: 2px;
1313
- justify-content: center;
1314
- }
1315
-
1316
- .session-top-action-split .split-provider:hover {
1317
- background: var(--sidebar-hover);
1318
- }
1319
-
1320
- .session-create-provider-icon {
1321
- width: 16px;
1322
- height: 16px;
1323
- margin-right: 0;
1324
- border-radius: 4px;
1325
- object-fit: cover;
1326
- }
1327
-
1328
- .session-create-provider-chevron {
1329
- display: inline-flex;
1330
- }
1331
-
1332
- .session-create-provider-chevron .lucide,
1333
- .session-create-provider-chevron svg {
1334
- width: 14px;
1335
- height: 14px;
1336
- }
1337
-
1338
- .session-create-provider[aria-expanded="true"] {
1339
- background: var(--sidebar-hover);
1340
- }
1341
-
1342
878
  .session-favorites-section {
1343
879
  min-height: 6px;
1344
880
  margin: 0 8px;
@@ -1366,24 +902,6 @@
1366
902
  background: var(--sidebar-bg);
1367
903
  }
1368
904
 
1369
- .session-favorites-divider {
1370
- position: relative;
1371
- margin: 0 12px 2px;
1372
- height: 18px;
1373
- border-radius: 999px;
1374
- }
1375
-
1376
- .session-favorites-divider::before {
1377
- content: "";
1378
- position: absolute;
1379
- left: 0;
1380
- right: 0;
1381
- top: 50%;
1382
- height: 1px;
1383
- background: var(--border-subtle, var(--border));
1384
- transform: translateY(-50%);
1385
- }
1386
-
1387
905
  .session-favorites-section.drag-hover,
1388
906
  .session-regular-drop.drag-hover {
1389
907
  background: color-mix(in srgb, var(--accent) 10%, transparent);
@@ -1398,11 +916,6 @@
1398
916
  color: var(--text);
1399
917
  }
1400
918
 
1401
- .session-favorites-divider.drag-hover::before {
1402
- background: var(--accent);
1403
- height: 2px;
1404
- }
1405
-
1406
919
  .session-regular-drop {
1407
920
  min-height: 12px;
1408
921
  border-radius: 12px;
@@ -1449,18 +962,11 @@
1449
962
 
1450
963
  /* --- Session presence avatars (multi-user) --- */
1451
964
  .session-presence {
1452
- display: flex;
965
+ display: inline-flex;
1453
966
  align-items: center;
1454
- flex-shrink: 0;
1455
- margin-right: 2px;
1456
- }
1457
-
1458
- .session-item .session-presence {
1459
- position: absolute;
1460
- right: 30px;
1461
- top: 50%;
1462
- transform: translateY(-50%);
1463
- margin-right: 0;
967
+ flex: 0 0 auto;
968
+ min-width: 0;
969
+ margin-left: 1px;
1464
970
  }
1465
971
 
1466
972
  .session-presence-avatar {
@@ -1472,6 +978,7 @@
1472
978
  object-fit: cover;
1473
979
  transition: filter 0.15s;
1474
980
  }
981
+ .session-presence-avatar + .session-presence-avatar { margin-left: -6px; }
1475
982
 
1476
983
  .session-presence-avatar:hover {
1477
984
  filter: brightness(1.3);
@@ -1517,36 +1024,12 @@
1517
1024
  .session-ctx-item.session-ctx-delete { color: var(--error); }
1518
1025
  .session-ctx-item.session-ctx-delete:hover { background: var(--error-8); }
1519
1026
 
1520
- /* --- New-session vendor picker --- */
1521
- .session-new-menu { min-width: 200px; }
1522
- .session-new-vendor-row { display: flex; align-items: stretch; }
1523
- .session-new-vendor-row .session-new-vendor { flex: 1 1 auto; min-width: 0; }
1524
- .session-new-set-default { border: 0; background: transparent; color: var(--text-dimmer); padding: 0 8px; font-size: 10px; cursor: pointer; }
1525
- .session-new-set-default:hover { color: var(--text); background: rgba(var(--overlay-rgb), 0.05); }
1526
- .session-new-set-default:disabled { opacity: 0.55; cursor: wait; }
1527
- .session-new-preference-status { padding: 6px 10px; color: var(--error); font-size: 11px; }
1528
- .session-new-fallback-note { color: var(--text-muted); border-bottom: 1px solid var(--border); }
1529
-
1530
1027
  .session-ctx-sep {
1531
1028
  height: 1px;
1532
1029
  margin: 4px 0;
1533
1030
  background: var(--border);
1534
1031
  }
1535
1032
 
1536
- .session-new-vendor .session-new-vendor-name { flex: 1 1 auto; min-width: 0; }
1537
- .session-new-vendor.active { color: var(--text); font-weight: 600; }
1538
-
1539
- /* Uninstalled vendors stay clickable on purpose: the click opens the
1540
- vendor's homepage instead of creating a session. */
1541
- .session-new-vendor.disabled { opacity: 0.45; }
1542
- .session-new-vendor.disabled:hover { opacity: 0.7; }
1543
-
1544
- .session-new-vendor-note {
1545
- font-size: 11px;
1546
- color: var(--text-dimmer);
1547
- white-space: nowrap;
1548
- }
1549
-
1550
1033
  /* --- Session inline rename --- */
1551
1034
  .session-rename-input {
1552
1035
  width: 100%;
@@ -208,13 +208,7 @@
208
208
  </div>
209
209
  <div id="sidebar">
210
210
  <div id="sidebar-tools">
211
- <div class="sidebar-tools-header">
212
- <span class="sidebar-section-label">Tools</span>
213
- <span class="sidebar-tools-hint" data-palette="session" title="Show keyboard hotkeys"></span>
214
- <button type="button" class="tool-palette-edit-btn" data-palette="session" aria-label="Edit tool palette" title="Edit palette"><i data-lucide="pencil"></i></button>
215
- </div>
216
- <div id="session-actions"></div>
217
- <div id="session-actions-hidden" class="tool-palette-hidden-section hidden"></div>
211
+ <div id="session-actions" role="group" aria-label="Tools"></div>
218
212
  <!-- Repository placard. Hidden until a real Git repository is
219
213
  confirmed, so non-Git projects and pending detection show
220
214
  nothing rather than an empty block. -->
@@ -228,13 +222,7 @@
228
222
  <div id="sidebar-sessions-header">
229
223
  <div id="sessions-header-content">
230
224
  <div class="sidebar-sessions-header-row">
231
- <span class="sidebar-section-label">Sessions</span>
232
- <span id="session-filter-count" class="session-filter-count hidden"></span>
233
- <div id="session-header-search-inline" class="sidebar-sessions-search-inline hidden">
234
- <input id="session-header-search-input" type="text" placeholder="Search sessions..." autocomplete="off" spellcheck="false" />
235
- <button id="session-header-search-clear" type="button" aria-label="Clear search"><i data-lucide="x"></i></button>
236
- </div>
237
- <button id="session-header-search-btn" type="button" aria-label="Search sessions" title="Search sessions"><i data-lucide="search"></i></button>
225
+ <span class="sidebar-section-label sidebar-label-sr">Sessions</span>
238
226
  </div>
239
227
  </div>
240
228
  <div id="files-header-content" class="hidden"></div>
@@ -294,13 +282,7 @@
294
282
  <button id="mate-sidebar-toggle-btn" class="sidebar-collapse-btn" title="Collapse sidebar"><i data-lucide="panel-left-close"></i></button>
295
283
  </div>
296
284
  <div id="mate-sidebar-tools-wrap">
297
- <div class="sidebar-tools-header">
298
- <span class="sidebar-section-label">Tools</span>
299
- <span class="sidebar-tools-hint" data-palette="mate" title="Show keyboard hotkeys"></span>
300
- <button type="button" class="tool-palette-edit-btn" data-palette="mate" aria-label="Edit tool palette" title="Edit palette"><i data-lucide="pencil"></i></button>
301
- </div>
302
- <div id="mate-sidebar-tools"></div>
303
- <div id="mate-sidebar-tools-hidden" class="tool-palette-hidden-section hidden"></div>
285
+ <div id="mate-sidebar-tools" role="group" aria-label="Tools"></div>
304
286
  </div>
305
287
  <div id="mate-sidebar-conversations">
306
288
  <div class="mate-sidebar-sessions-header">