@starlove/orbit 1.1.11 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (103) hide show
  1. package/.dockerignore +0 -0
  2. package/Dockerfile +0 -0
  3. package/LICENSE +0 -0
  4. package/README.md +0 -0
  5. package/SKILL-ORBIT.md +0 -0
  6. package/build.mjs +11 -5
  7. package/dist/full/apple-touch-icon.png +0 -0
  8. package/dist/full/cursors/live_arrow.cur +0 -0
  9. package/dist/full/cursors/live_link.cur +0 -0
  10. package/dist/full/cursors/live_move.cur +0 -0
  11. package/dist/full/cursors/live_select.cur +0 -0
  12. package/dist/full/cursors/live_unavail.cur +0 -0
  13. package/dist/full/favicon-32x32.png +0 -0
  14. package/dist/full/index.html +11 -7
  15. package/dist/full/js/{app.55b38e12.js → app.ccc442f7.js} +85 -77
  16. package/dist/full/js/app.ccc442f7.js.map +7 -0
  17. package/dist/full/orbits-favicon.png +0 -0
  18. package/dist/full/orbits-logo-bg.png +0 -0
  19. package/dist/full/orbits-logo.png +0 -0
  20. package/dist/full/styles.baccc8e3.css +1 -0
  21. package/dist/full/version.json +2 -2
  22. package/docs/AGENT_PROTOCOL.md +0 -0
  23. package/docs/MCP_SETUP.md +0 -0
  24. package/docs/ORBIT_DISPATCH.md +0 -0
  25. package/docs/SS-Orbit-Dark.png +0 -0
  26. package/docs/SS-Orbit-Light.png +0 -0
  27. package/docs/mcp-client.example.json +0 -0
  28. package/docs/setup/orbit-init-wizard.md +0 -0
  29. package/package.json +19 -18
  30. package/public/apple-touch-icon.png +0 -0
  31. package/public/cursors/live_arrow.cur +0 -0
  32. package/public/cursors/live_link.cur +0 -0
  33. package/public/cursors/live_move.cur +0 -0
  34. package/public/cursors/live_select.cur +0 -0
  35. package/public/cursors/live_unavail.cur +0 -0
  36. package/public/favicon-32x32.png +0 -0
  37. package/public/index.html +9 -5
  38. package/public/js/actor-labels.js +0 -0
  39. package/public/js/api.js +0 -0
  40. package/public/js/app.js +0 -0
  41. package/public/js/board-menu.js +16 -2
  42. package/public/js/card-actions.js +0 -0
  43. package/public/js/config.js +0 -0
  44. package/public/js/create-card.js +1 -1
  45. package/public/js/dom.js +0 -0
  46. package/public/js/drawer.js +1 -1
  47. package/public/js/format.js +2 -3
  48. package/public/js/kanban.js +10 -9
  49. package/public/js/local-backend.js +0 -0
  50. package/public/js/main.js +0 -0
  51. package/public/js/modal.js +0 -0
  52. package/public/js/motion-preference.js +0 -0
  53. package/public/js/router.js +0 -0
  54. package/public/js/search.js +1 -1
  55. package/public/js/settings-tabs.js +0 -0
  56. package/public/js/settings.js +39 -27
  57. package/public/js/sse.js +0 -0
  58. package/public/js/starscape.js +0 -0
  59. package/public/js/state.js +0 -0
  60. package/public/js/theme-preference.js +0 -0
  61. package/public/js/ticket-detail.js +4 -4
  62. package/public/js/toast.js +0 -0
  63. package/public/js/transport.js +0 -0
  64. package/public/js/unread.js +0 -0
  65. package/public/js/url-routes.js +0 -0
  66. package/public/orbits-favicon.png +0 -0
  67. package/public/orbits-logo-bg.png +0 -0
  68. package/public/orbits-logo.png +0 -0
  69. package/public/styles.css +498 -445
  70. package/src/core/agent.js +0 -0
  71. package/src/core/agents-md.js +0 -0
  72. package/src/core/attachments.js +0 -0
  73. package/src/core/auth.js +0 -0
  74. package/src/core/backups.js +0 -0
  75. package/src/core/board.js +0 -0
  76. package/src/core/boards.js +0 -0
  77. package/src/core/bootstrap.js +0 -0
  78. package/src/core/css-bundle.js +29 -0
  79. package/src/core/db.js +0 -0
  80. package/src/core/delete-board.js +0 -0
  81. package/src/core/dispatch.js +0 -0
  82. package/src/core/events.js +0 -0
  83. package/src/core/http.js +10 -3
  84. package/src/core/migrate.js +0 -0
  85. package/src/core/paths.js +0 -0
  86. package/src/core/provision-repo-board.js +0 -0
  87. package/src/core/queries.js +0 -0
  88. package/src/core/registry.js +0 -0
  89. package/src/core/relations.js +0 -0
  90. package/src/core/review-verdicts.js +0 -0
  91. package/src/core/router.js +0 -0
  92. package/src/core/search.js +0 -0
  93. package/src/core/seed.js +0 -0
  94. package/src/core/snapshots.js +0 -0
  95. package/src/core/states.js +0 -0
  96. package/src/core/system-picker.js +0 -0
  97. package/src/core/tickets.js +0 -0
  98. package/src/core/util.js +0 -0
  99. package/src/mcp/orbit-client.js +0 -0
  100. package/src/mcp-server.js +0 -0
  101. package/src/server.js +0 -0
  102. package/dist/full/js/app.55b38e12.js.map +0 -7
  103. package/dist/full/styles.273fc37a.css +0 -6002
package/public/styles.css CHANGED
@@ -1,3 +1,22 @@
1
+ @import "@starlove/ui/tokens";
2
+ @import "@starlove/ui/components/button";
3
+ @import "@starlove/ui/components/button-arc";
4
+ @import "@starlove/ui/components/input";
5
+ @import "@starlove/ui/components/topbar-btn";
6
+ @import "@starlove/ui/components/topbar-search";
7
+ @import "@starlove/ui/components/topbar-chip";
8
+ @import "@starlove/ui/components/menu-flyout";
9
+ @import "@starlove/ui/components/create-flyout";
10
+ @import "@starlove/ui/components/card";
11
+ @import "@starlove/ui/components/lane";
12
+ @import "@starlove/ui/components/drawer";
13
+ @import "@starlove/ui/components/state-pill";
14
+ @import "@starlove/ui/components/priority-pill";
15
+ @import "@starlove/ui/components/card-accordion";
16
+ @import "@starlove/ui/components/dot";
17
+ @import "@starlove/ui/components/search-results";
18
+ @import "@starlove/ui/components/lightbox";
19
+
1
20
  html, body {
2
21
  cursor: url('cursors/live_arrow.cur'), default;
3
22
  }
@@ -43,6 +62,10 @@ input[type="file"] {
43
62
  --drawer-head-bg: rgba(246, 240, 229, 0.92);
44
63
  /* Buttons */
45
64
  --btn-gradient: linear-gradient(135deg, rgba(var(--accent-rgb),0.92), rgba(var(--blue-rgb),0.88));
65
+ /* Orbit's primary fill is a near-opaque dark teal→blue even in light mode, so
66
+ * the label must be light — the package default --btn-color (--teal-deep) would
67
+ * be dark-on-dark. */
68
+ --btn-color: #e8efff;
46
69
  --btn-border: rgba(var(--accent-rgb),0.4);
47
70
  --btn-hover-shadow: 0 10px 24px rgba(29, 37, 40, 0.18);
48
71
  --mark-gradient: linear-gradient(135deg, rgba(var(--accent-rgb),0.95), rgba(var(--blue-rgb),0.95));
@@ -80,9 +103,17 @@ input[type="file"] {
80
103
  --scrollbar-thumb: rgba(var(--accent-rgb),0.45);
81
104
  --scrollbar-thumb-hover: rgba(var(--accent-rgb),0.65);
82
105
  --scrollbar-track: transparent;
83
- /* Default text-control interior spacing; component-specific fields override this. */
106
+ /* Starscape UI shape/density tokens — same names as @starlove/ui tokens/shape.css.
107
+ Legacy --field-padding-* aliases remain so existing Orbit selectors keep working. */
108
+ --radius-control: 10px;
109
+ --radius-surface: 14px;
110
+ --radius-drawer: 20px;
111
+ --radius-pill: 999px;
84
112
  --field-padding-y: 0.62rem;
85
113
  --field-padding-x: 0.8rem;
114
+ --field-pad-y: var(--field-padding-y);
115
+ --field-pad-x: var(--field-padding-x);
116
+ --row-gap: 0.4rem;
86
117
  /* RGB channels — use as rgba(var(--name), alpha) for arbitrary-opacity tints */
87
118
  --paper-rgb: 255, 252, 246; /* warm cream paper — light-mode surface/inset base */
88
119
  --warmth-rgb: 53, 43, 28; /* warm parchment brown — light-mode shadow tint */
@@ -183,7 +214,7 @@ textarea {
183
214
  font: inherit;
184
215
  }
185
216
 
186
- button {
217
+ button:not([data-variant]) {
187
218
  border: 0;
188
219
  border-radius: 999px;
189
220
  padding: 0.72rem 1rem;
@@ -196,7 +227,7 @@ button {
196
227
  background 150ms ease;
197
228
  }
198
229
 
199
- button:hover {
230
+ button:not([data-variant]):hover {
200
231
  filter: brightness(1.04);
201
232
  }
202
233
 
@@ -210,7 +241,7 @@ button.ghost {
210
241
  override, since var(--ink) remaps to near-white in dark mode. Scoped to
211
242
  button[type="submit"] so topbar chips, icon buttons, and .btn-sun are
212
243
  left alone. */
213
- [data-theme="dark"] button[type="submit"] {
244
+ [data-theme="dark"] button[type="submit"]:not([data-variant]) {
214
245
  color: #e8efff;
215
246
  border: 1px solid rgba(var(--starlight-rgb),0.32);
216
247
  background:
@@ -222,7 +253,7 @@ button.ghost {
222
253
  letter-spacing: 0.01em;
223
254
  }
224
255
 
225
- [data-theme="dark"] button[type="submit"]:hover {
256
+ [data-theme="dark"] button[type="submit"]:not([data-variant]):hover {
226
257
  filter: brightness(1.08);
227
258
  border-color: rgba(var(--starlight-rgb),0.6);
228
259
  box-shadow:
@@ -403,8 +434,43 @@ h1 {
403
434
  .topbar-icon {
404
435
  display: block;
405
436
  flex-shrink: 0;
406
- width: 1rem;
407
- height: 1rem;
437
+ width: 1.1rem;
438
+ height: 1.1rem;
439
+ }
440
+
441
+ /* @starlove/ui topbar control rail: every top-right control shares one height. */
442
+ .controls {
443
+ --topbar-ctl-h: 2.35rem;
444
+ }
445
+
446
+ .controls .topbar-search input,
447
+ .controls .btn-sun,
448
+ .controls .topbar-chip,
449
+ .controls .segmented,
450
+ .controls .topbar-btn {
451
+ height: var(--topbar-ctl-h);
452
+ min-height: var(--topbar-ctl-h);
453
+ box-sizing: border-box;
454
+ }
455
+
456
+ .controls .btn-sun,
457
+ .controls .topbar-chip,
458
+ .controls .topbar-btn {
459
+ display: inline-flex;
460
+ align-items: center;
461
+ justify-content: center;
462
+ padding-top: 0;
463
+ padding-bottom: 0;
464
+ }
465
+
466
+ .controls .topbar-btn[data-variant="theme"] {
467
+ padding-inline: 0.85rem;
468
+ }
469
+
470
+ .topbar-chip-label {
471
+ overflow: hidden;
472
+ text-overflow: ellipsis;
473
+ white-space: nowrap;
408
474
  }
409
475
 
410
476
  /* Topbar chips: anchored flyouts */
@@ -432,6 +498,8 @@ h1 {
432
498
 
433
499
  .topbar-chip:hover,
434
500
  .menu-flyout-item:hover {
501
+ transform: none;
502
+ filter: none;
435
503
  border-color: rgba(var(--accent-rgb),0.5);
436
504
  background:
437
505
  linear-gradient(135deg, rgba(var(--accent-rgb),0.12), rgba(var(--paper-rgb),0) 65%),
@@ -478,7 +546,7 @@ h1 {
478
546
  gap: 0.4rem;
479
547
  padding: 0.42rem 0.75rem;
480
548
  overflow: hidden;
481
- border-radius: 10px;
549
+ border-radius: var(--radius-control);
482
550
  font-family: inherit;
483
551
  font-size: 0.82rem;
484
552
  font-weight: 700;
@@ -496,6 +564,7 @@ h1 {
496
564
  Dark mode wears the original low-chroma navy→indigo→steel-blue wash;
497
565
  light mode wears a high-lightness translation of the same hues so the
498
566
  sleek lowkey character carries across themes. */
567
+ .topbar-btn[data-variant="theme"],
499
568
  #themeToggle {
500
569
  border: 1px solid rgba(60, 80, 160, 0.18);
501
570
  background: linear-gradient(in oklch 135deg, oklch(0.96 0.02 282.9) 0%, oklch(0.94 0.03 266.7) 50%, oklch(0.92 0.05 255.1) 100%);
@@ -509,6 +578,7 @@ h1 {
509
578
  transform 180ms ease;
510
579
  }
511
580
 
581
+ .topbar-btn[data-variant="theme"]:hover,
512
582
  #themeToggle:hover {
513
583
  border-color: rgba(60, 80, 160, 0.32);
514
584
  background: linear-gradient(in oklch 135deg, oklch(0.97 0.025 276.2) 0%, oklch(0.95 0.04 261.5) 50%, oklch(0.93 0.06 254.3) 100%);
@@ -516,10 +586,12 @@ h1 {
516
586
  transform: translateY(-1px);
517
587
  }
518
588
 
589
+ .topbar-btn[data-variant="theme"] .topbar-icon,
519
590
  #themeToggle .topbar-icon {
520
591
  color: var(--ink);
521
592
  }
522
593
 
594
+ [data-theme="dark"] .topbar-btn[data-variant="theme"],
523
595
  [data-theme="dark"] #themeToggle {
524
596
  border-color: rgba(var(--starlight-rgb),0.15);
525
597
  color: #fff;
@@ -527,17 +599,21 @@ h1 {
527
599
  box-shadow: 0 0.25rem 0.75rem rgba(0, 0, 0, 0.15);
528
600
  }
529
601
 
602
+ [data-theme="dark"] .topbar-btn[data-variant="theme"]:hover,
530
603
  [data-theme="dark"] #themeToggle:hover {
531
604
  border-color: rgba(var(--starlight-rgb),0.3);
532
605
  background: linear-gradient(in oklch 135deg, oklch(0.257 0.0323 276.2) 0%, oklch(0.287 0.0577 261.5) 50%, oklch(0.356 0.0989 254.3) 100%);
533
606
  box-shadow: 0 0.5rem 1.5625rem rgba(var(--void-rgb),0.3);
534
607
  }
535
608
 
609
+ [data-theme="dark"] .topbar-btn[data-variant="theme"] .topbar-icon,
536
610
  [data-theme="dark"] #themeToggle .topbar-icon {
537
611
  color: #fff;
538
612
  }
539
613
 
540
614
  .menu-flyout {
615
+ --menu-flyout-item-radius: var(--radius-surface, 14px);
616
+
541
617
  position: absolute;
542
618
  top: calc(100% + 0.28rem);
543
619
  left: 0;
@@ -550,7 +626,7 @@ h1 {
550
626
  gap: 0;
551
627
  overflow: hidden auto;
552
628
  border: 1px solid var(--line);
553
- border-radius: 12px;
629
+ border-radius: var(--radius-surface);
554
630
  background: var(--surface-raised);
555
631
  box-shadow: var(--flyout-shadow);
556
632
  scrollbar-width: thin;
@@ -594,7 +670,7 @@ h1 {
594
670
  .menu-flyout-list {
595
671
  display: flex;
596
672
  flex-direction: column;
597
- gap: 0.4rem;
673
+ gap: var(--row-gap);
598
674
  padding: 0.55rem 0.55rem 0.65rem;
599
675
  }
600
676
 
@@ -606,7 +682,7 @@ h1 {
606
682
  align-items: flex-start;
607
683
  gap: 0.15rem;
608
684
  padding: 0.55rem 0.7rem;
609
- border-radius: 10px;
685
+ border-radius: var(--menu-flyout-item-radius);
610
686
  color: var(--ink);
611
687
  font: inherit;
612
688
  text-align: left;
@@ -670,14 +746,14 @@ h1 {
670
746
  .menu-flyout-form {
671
747
  display: flex;
672
748
  flex-direction: column;
673
- gap: 0.4rem;
749
+ gap: var(--row-gap);
674
750
  }
675
751
 
676
752
  .menu-flyout-form input {
677
753
  width: 100%;
678
754
  padding: var(--field-padding-y) var(--field-padding-x);
679
755
  border: 1px solid var(--line);
680
- border-radius: 8px;
756
+ border-radius: calc(var(--radius-control) - 2px);
681
757
  font: inherit;
682
758
  font-size: 0.82rem;
683
759
  }
@@ -695,7 +771,7 @@ h1 {
695
771
 
696
772
  .folder-picker-field button[type="button"] {
697
773
  padding: 0.42rem 0.65rem;
698
- border-radius: 8px;
774
+ border-radius: calc(var(--radius-control) - 2px);
699
775
  border: 1px solid var(--btn-border);
700
776
  font: inherit;
701
777
  font-size: 0.82rem;
@@ -713,7 +789,7 @@ h1 {
713
789
 
714
790
  .menu-flyout-form button[type="submit"] {
715
791
  padding: 0.42rem 0.65rem;
716
- border-radius: 8px;
792
+ border-radius: calc(var(--radius-control) - 2px);
717
793
  border: 1px solid var(--btn-border);
718
794
  font: inherit;
719
795
  font-size: 0.82rem;
@@ -748,7 +824,7 @@ h1 {
748
824
  align-items: center;
749
825
  gap: 0.4rem;
750
826
  padding: 0.44rem 0.85rem;
751
- border-radius: 10px;
827
+ border-radius: var(--radius-control);
752
828
  border: 1px solid var(--btn-border);
753
829
  font-family: inherit;
754
830
  font-size: 0.82rem;
@@ -773,18 +849,29 @@ h1 {
773
849
  box-shadow: var(--btn-hover-shadow);
774
850
  }
775
851
 
852
+ .topbar-btn:focus-visible {
853
+ outline: none;
854
+ box-shadow: var(--accent-ring);
855
+ }
856
+
776
857
  .topbar-btn.ghost:hover {
858
+ filter: none;
859
+ transform: none;
777
860
  background: var(--accent-hover);
778
861
  border-color: var(--accent-border);
862
+ box-shadow: none;
779
863
  }
780
864
 
781
- /* ---- Epic-CTA chrome — shared by .btn-sun, .column-add-btn, .add-card-phantom ----
865
+ /* ---- Epic-CTA chrome — shared by .btn-sun, .column-add-btn, and .add-card-phantom ----
782
866
  Teal border + amber inner ring + teal-to-amber gradient wash. In dark mode
783
867
  the palette shifts to cyan + violet (the starscape dual-color signature).
784
868
  Structural properties (size, padding, border-radius, font, display) stay on
785
869
  each component class. */
786
870
  .btn-sun,
871
+ button[data-variant="cta"],
872
+ button.column-add-btn,
787
873
  .column-add-btn,
874
+ button.add-card-phantom,
788
875
  .add-card-phantom {
789
876
  color: var(--teal-deep);
790
877
  border: 1.5px solid rgba(var(--accent-rgb),0.55);
@@ -799,7 +886,10 @@ h1 {
799
886
  }
800
887
 
801
888
  .btn-sun:hover,
889
+ button[data-variant="cta"]:hover,
890
+ button.column-add-btn:hover,
802
891
  .column-add-btn:hover,
892
+ button.add-card-phantom:hover,
803
893
  .add-card-phantom:hover {
804
894
  color: var(--teal-deep);
805
895
  border-color: rgba(var(--accent-rgb),0.7);
@@ -814,7 +904,10 @@ h1 {
814
904
  }
815
905
 
816
906
  [data-theme="dark"] .btn-sun,
907
+ [data-theme="dark"] button[data-variant="cta"],
908
+ [data-theme="dark"] button.column-add-btn,
817
909
  [data-theme="dark"] .column-add-btn,
910
+ [data-theme="dark"] button.add-card-phantom,
818
911
  [data-theme="dark"] .add-card-phantom {
819
912
  color: #e8efff;
820
913
  border: 1.5px solid rgba(var(--starlight-rgb),0.5);
@@ -829,7 +922,10 @@ h1 {
829
922
  }
830
923
 
831
924
  [data-theme="dark"] .btn-sun:hover,
925
+ [data-theme="dark"] button[data-variant="cta"]:hover,
926
+ [data-theme="dark"] button.column-add-btn:hover,
832
927
  [data-theme="dark"] .column-add-btn:hover,
928
+ [data-theme="dark"] button.add-card-phantom:hover,
833
929
  [data-theme="dark"] .add-card-phantom:hover {
834
930
  color: #e8efff;
835
931
  border-color: rgba(var(--starlight-rgb),0.7);
@@ -860,12 +956,27 @@ h1 {
860
956
  place-items: center;
861
957
  width: 0.95rem;
862
958
  height: 0.95rem;
959
+ padding: 0;
960
+ border: 0;
961
+ border-radius: 0;
962
+ background: transparent;
963
+ box-shadow: none;
863
964
  color: var(--teal-deep);
864
965
  font-size: 1.15rem;
865
966
  font-weight: 800;
866
967
  line-height: 1;
867
968
  }
868
969
 
970
+ .btn-sun .btn-plus,
971
+ button[data-variant="cta"] .btn-plus {
972
+ border: 0;
973
+ background: transparent;
974
+ box-shadow: none;
975
+ color: currentColor;
976
+ line-height: 0.95;
977
+ transform: translateY(-0.02em);
978
+ }
979
+
869
980
  .btn-sun .btn-sun-label {
870
981
  display: inline-flex;
871
982
  align-items: center;
@@ -914,7 +1025,7 @@ h1 {
914
1025
  flex-direction: column;
915
1026
  overflow: hidden;
916
1027
  border: 1px solid var(--line);
917
- border-radius: 14px;
1028
+ border-radius: var(--radius-surface);
918
1029
  background: var(--surface-raised);
919
1030
  box-shadow: var(--flyout-shadow);
920
1031
  opacity: 0;
@@ -954,17 +1065,39 @@ h1 {
954
1065
  letter-spacing: -0.03em;
955
1066
  }
956
1067
 
957
- .create-flyout-close {
1068
+ .create-flyout-close,
1069
+ button.create-flyout-close {
958
1070
  display: inline-grid;
959
1071
  place-items: center;
1072
+ width: 2rem;
960
1073
  min-width: 2rem;
961
1074
  height: 2rem;
1075
+ min-height: 0;
962
1076
  padding: 0;
963
- border-radius: 8px;
1077
+ border: 1px solid var(--line);
1078
+ border-radius: calc(var(--radius-control) - 2px);
1079
+ background: var(--surface);
1080
+ color: var(--ink);
1081
+ box-shadow: none;
964
1082
  font-size: 1.25rem;
1083
+ font-weight: 400;
965
1084
  line-height: 1;
966
1085
  }
967
1086
 
1087
+ .create-flyout-close:hover,
1088
+ button.create-flyout-close:hover {
1089
+ transform: none;
1090
+ filter: none;
1091
+ background: var(--accent-hover);
1092
+ border-color: var(--accent-border);
1093
+ box-shadow: none;
1094
+ }
1095
+
1096
+ button.create-flyout-close::after {
1097
+ content: none;
1098
+ display: none;
1099
+ }
1100
+
968
1101
  .create-flyout-form {
969
1102
  display: flex;
970
1103
  flex-direction: column;
@@ -976,7 +1109,7 @@ h1 {
976
1109
  width: 100%;
977
1110
  padding: var(--field-padding-y) var(--field-padding-x);
978
1111
  border: 1px solid var(--line);
979
- border-radius: 10px;
1112
+ border-radius: var(--radius-control);
980
1113
  font: inherit;
981
1114
  font-size: 0.88rem;
982
1115
  background: var(--surface-input);
@@ -987,7 +1120,7 @@ h1 {
987
1120
  padding: var(--field-padding-y) var(--select-chevron-pad-x);
988
1121
  padding-right: calc(var(--select-chevron-pad-x) * 2 + var(--select-chevron-size));
989
1122
  border: 1px solid var(--line);
990
- border-radius: 10px;
1123
+ border-radius: var(--radius-control);
991
1124
  font: inherit;
992
1125
  font-size: 0.88rem;
993
1126
  /* background-color keeps background-image (chevron) intact; see select-chevron-field. */
@@ -1020,7 +1153,7 @@ h1 {
1020
1153
  .create-flyout-form button[type="submit"] {
1021
1154
  margin-top: 0.25rem;
1022
1155
  padding: 0.55rem 1rem;
1023
- border-radius: 10px;
1156
+ border-radius: var(--radius-control);
1024
1157
  border: 1px solid var(--btn-border);
1025
1158
  font: inherit;
1026
1159
  font-weight: 700;
@@ -1120,18 +1253,32 @@ h1 {
1120
1253
  border: 1px solid var(--line);
1121
1254
  border-radius: 16px;
1122
1255
  background: var(--surface-raised);
1123
- box-shadow: var(--shadow);
1256
+ box-shadow: var(--flyout-shadow);
1257
+ }
1258
+
1259
+ .search-results[hidden] {
1260
+ display: none;
1124
1261
  }
1125
1262
 
1126
1263
  .search-hit {
1127
1264
  display: flex;
1128
1265
  align-items: center;
1129
1266
  gap: 0.65rem;
1267
+ width: 100%;
1130
1268
  padding: 0.85rem;
1269
+ border: 0;
1131
1270
  border-bottom: 1px solid var(--line);
1271
+ background: transparent;
1272
+ color: var(--ink);
1273
+ text-align: start;
1274
+ font: inherit;
1132
1275
  cursor: url('cursors/live_link.cur'), pointer;
1133
1276
  }
1134
1277
 
1278
+ .search-hit:last-child {
1279
+ border-bottom: 0;
1280
+ }
1281
+
1135
1282
  .search-hit-main {
1136
1283
  display: flex;
1137
1284
  flex: 1 1 auto;
@@ -1246,7 +1393,8 @@ h1 {
1246
1393
  0 12px 40px rgba(0, 0, 0, 0.3);
1247
1394
  }
1248
1395
 
1249
- .column {
1396
+ .column,
1397
+ .lane[data-flat] {
1250
1398
  display: flex;
1251
1399
  min-height: 0;
1252
1400
  flex-direction: column;
@@ -1272,7 +1420,8 @@ h1 {
1272
1420
  box-shadow: 0 0 0 1px var(--accent-border);
1273
1421
  }
1274
1422
 
1275
- .column-head {
1423
+ .column-head,
1424
+ .lane-head {
1276
1425
  position: sticky;
1277
1426
  top: 0;
1278
1427
  z-index: 2;
@@ -1283,36 +1432,64 @@ h1 {
1283
1432
  padding: 0.25rem 0.2rem 0.4rem;
1284
1433
  }
1285
1434
 
1286
- .column-head-actions {
1435
+ .column-head-actions,
1436
+ .lane-actions {
1287
1437
  display: flex;
1288
1438
  align-items: center;
1289
1439
  gap: 0.35rem;
1290
1440
  }
1291
1441
 
1292
1442
  /* Trello-style: compact add control in the column header next to the count.
1293
- Wears the Epic-card palette to match the topbar "New Card" CTA — primary
1294
- create actions all share the same teal+amber identity in light mode and
1295
- starlight+violet in dark mode. */
1296
- .column-add-btn {
1443
+ It keeps the old epic-card CTA surface, but with square lane-header geometry
1444
+ and no ARC pseudo-element. */
1445
+ button.column-add-btn {
1297
1446
  display: inline-grid;
1298
1447
  place-items: center;
1448
+ width: 1.85rem;
1299
1449
  min-width: 1.85rem;
1300
1450
  height: 1.85rem;
1451
+ min-height: 1.85rem;
1301
1452
  padding: 0;
1302
- border-radius: 10px;
1453
+ border-radius: var(--radius-control);
1303
1454
  font-size: 1.15rem;
1304
1455
  font-weight: 800;
1305
1456
  line-height: 1;
1457
+ letter-spacing: 0;
1458
+ cursor: url('cursors/live_link.cur'), pointer;
1459
+ transition:
1460
+ transform 150ms ease,
1461
+ filter 150ms ease,
1462
+ box-shadow 180ms ease,
1463
+ border-color 150ms ease;
1464
+ }
1465
+
1466
+ button.column-add-btn:hover {
1467
+ transform: translateY(-1px);
1468
+ }
1469
+
1470
+ button.column-add-btn:focus-visible {
1471
+ outline: none;
1472
+ box-shadow: var(--accent-ring);
1473
+ }
1474
+
1475
+ button.column-add-btn::before,
1476
+ button.column-add-btn::after {
1477
+ content: none;
1478
+ display: none;
1306
1479
  }
1307
1480
 
1308
1481
  /* Phantom "+ Add a card" tile at the bottom of each lane — same Epic palette
1309
- as the column-add-btn and topbar New Card CTA. */
1482
+ as the topbar New Card CTA, with the same control radius rather than a pill. */
1483
+ button.add-card-phantom,
1310
1484
  .add-card-phantom {
1311
- display: block;
1485
+ display: flex;
1486
+ align-items: center;
1487
+ justify-content: flex-start;
1312
1488
  width: 100%;
1489
+ min-height: var(--topbar-ctl-h, 2.35rem);
1313
1490
  margin-top: 0.15rem;
1314
- padding: 0.55rem 0.7rem;
1315
- border-radius: 12px;
1491
+ padding: 0.55rem 0.85rem;
1492
+ border-radius: var(--radius-control);
1316
1493
  font: inherit;
1317
1494
  font-size: 0.88rem;
1318
1495
  font-weight: 700;
@@ -1326,6 +1503,14 @@ h1 {
1326
1503
  box-shadow 160ms ease;
1327
1504
  }
1328
1505
 
1506
+ button.add-card-phantom::before,
1507
+ button.add-card-phantom::after,
1508
+ .add-card-phantom::before,
1509
+ .add-card-phantom::after {
1510
+ content: none;
1511
+ display: none;
1512
+ }
1513
+
1329
1514
  /* Desktop / fine pointer: only show lane-add affordances when the column is under
1330
1515
  the cursor or holds keyboard focus. Applies equally to the header "+" and the
1331
1516
  bottom phantom — they're the same action, so they appear and disappear together. */
@@ -1355,7 +1540,8 @@ h1 {
1355
1540
  }
1356
1541
  }
1357
1542
 
1358
- .column h2 {
1543
+ .column h2,
1544
+ .lane-title {
1359
1545
  display: inline-flex;
1360
1546
  align-items: center;
1361
1547
  gap: 0.4rem;
@@ -1619,7 +1805,8 @@ h1 {
1619
1805
  Each type scopes --type-rgb (and optionally alpha/size overrides) on its own selector.
1620
1806
  Task overrides box-shadow + background because its drop-shadow y/blur values are
1621
1807
  shallower than the epic/feature/bug baseline. */
1622
- .card[class*="type-"] {
1808
+ .card[class*="type-"],
1809
+ .card[data-variant] {
1623
1810
  position: relative;
1624
1811
  padding: 0.78rem 0.8rem 0.7rem;
1625
1812
  border: 1.5px solid rgba(var(--type-rgb), var(--type-border-a, 0.4));
@@ -1634,7 +1821,8 @@ h1 {
1634
1821
  }
1635
1822
 
1636
1823
  /* Epic: purple bezel, dual-color gradient wash. */
1637
- .card.type-epic { --type-rgb: var(--purple-rgb); }
1824
+ .card.type-epic,
1825
+ .card[data-variant="epic"] { --type-rgb: var(--purple-rgb); }
1638
1826
 
1639
1827
  .card.type-epic h3 {
1640
1828
  font-size: 0.92rem;
@@ -1643,10 +1831,12 @@ h1 {
1643
1831
  }
1644
1832
 
1645
1833
  /* Feature: teal bezel — confident, second-in-command. */
1646
- .card.type-feature { --type-rgb: var(--accent-rgb); }
1834
+ .card.type-feature,
1835
+ .card[data-variant="feature"] { --type-rgb: var(--accent-rgb); }
1647
1836
 
1648
1837
  /* Task: slate bezel, thinnest ring, shallowest shadow. */
1649
- .card.type-task {
1838
+ .card.type-task,
1839
+ .card[data-variant="task"] {
1650
1840
  --type-rgb: var(--blue-rgb);
1651
1841
  --type-border-a: 0.28;
1652
1842
  --type-ring-w: 1.5px;
@@ -1664,7 +1854,8 @@ h1 {
1664
1854
  }
1665
1855
 
1666
1856
  /* Bug: red bezel, punchier ring — defects feel urgent. */
1667
- .card.type-bug {
1857
+ .card.type-bug,
1858
+ .card[data-variant="bug"] {
1668
1859
  --type-rgb: var(--red-rgb);
1669
1860
  --type-border-a: 0.45;
1670
1861
  --type-ring-a: 0.22;
@@ -1699,7 +1890,8 @@ h1 {
1699
1890
  /* Selected uses outline (which doesn't conflict with box-shadow), so the
1700
1891
  per-type bezel underneath stays intact while a soft accent ring marks
1701
1892
  the active card. */
1702
- .card.selected {
1893
+ .card.selected,
1894
+ .card[data-selected] {
1703
1895
  outline: 4px solid rgba(var(--accent-rgb),0.18);
1704
1896
  outline-offset: -1px;
1705
1897
  }
@@ -1829,7 +2021,8 @@ h1 {
1829
2021
  carries the surface; the starfield still animates in the gaps. */
1830
2022
  }
1831
2023
 
1832
- [data-theme="dark"] .card.type-epic {
2024
+ [data-theme="dark"] .card.type-epic,
2025
+ [data-theme="dark"] .card[data-variant="epic"] {
1833
2026
  border: 1.5px solid rgba(var(--starlight-rgb),0.4);
1834
2027
  box-shadow:
1835
2028
  inset 0 0 0 1px rgba(var(--cosmos-rgb),0.85),
@@ -1841,7 +2034,8 @@ h1 {
1841
2034
  rgba(var(--cosmos-rgb),0.92);
1842
2035
  }
1843
2036
 
1844
- [data-theme="dark"] .card.type-feature {
2037
+ [data-theme="dark"] .card.type-feature,
2038
+ [data-theme="dark"] .card[data-variant="feature"] {
1845
2039
  border: 1.5px solid rgba(var(--starlight-rgb),0.32);
1846
2040
  box-shadow:
1847
2041
  inset 0 0 0 1px rgba(var(--cosmos-rgb),0.85),
@@ -1853,7 +2047,8 @@ h1 {
1853
2047
  rgba(var(--cosmos-rgb),0.92);
1854
2048
  }
1855
2049
 
1856
- [data-theme="dark"] .card.type-task {
2050
+ [data-theme="dark"] .card.type-task,
2051
+ [data-theme="dark"] .card[data-variant="task"] {
1857
2052
  border: 1.5px solid rgba(var(--starlight-rgb),0.18);
1858
2053
  box-shadow:
1859
2054
  inset 0 0 0 1px rgba(var(--cosmos-rgb),0.85),
@@ -1865,7 +2060,8 @@ h1 {
1865
2060
  rgba(var(--cosmos-rgb),0.9);
1866
2061
  }
1867
2062
 
1868
- [data-theme="dark"] .card.type-bug {
2063
+ [data-theme="dark"] .card.type-bug,
2064
+ [data-theme="dark"] .card[data-variant="bug"] {
1869
2065
  border: 1.5px solid rgba(var(--coral-rgb),0.4);
1870
2066
  box-shadow:
1871
2067
  inset 0 0 0 1px rgba(var(--cosmos-rgb),0.85),
@@ -1881,7 +2077,8 @@ h1 {
1881
2077
  filter: brightness(1.06) drop-shadow(0 6px 14px rgba(var(--starlight-rgb),0.08));
1882
2078
  }
1883
2079
 
1884
- [data-theme="dark"] .card.selected {
2080
+ [data-theme="dark"] .card.selected,
2081
+ [data-theme="dark"] .card[data-selected] {
1885
2082
  outline-color: rgba(var(--starlight-rgb),0.3);
1886
2083
  }
1887
2084
 
@@ -1983,257 +2180,6 @@ h1 {
1983
2180
  border-color: rgba(var(--violet-rgb), 0.45);
1984
2181
  }
1985
2182
 
1986
- .card-expand-trigger--static {
1987
- cursor: url('cursors/live_arrow.cur'), default;
1988
- }
1989
-
1990
- .card-meta {
1991
- display: flex;
1992
- align-items: center;
1993
- gap: 0.75rem;
1994
- margin-top: 0.5rem;
1995
- }
1996
-
1997
- .ticket-number {
1998
- color: var(--orbit-text-muted);
1999
- font-size: 0.75rem;
2000
- font-weight: 800;
2001
- letter-spacing: 0.02em;
2002
- }
2003
-
2004
- [data-theme="dark"] .ticket-number {
2005
- color: var(--blue);
2006
- }
2007
-
2008
- .card-type-id {
2009
- display: inline-flex;
2010
- align-items: center;
2011
- gap: 0.35rem;
2012
- padding: 0.15rem 0.45rem;
2013
- border-radius: 4px;
2014
- background: rgba(var(--starlight-rgb),0.08);
2015
- border: 1px solid rgba(var(--starlight-rgb),0.12);
2016
- font-size: 0.68rem;
2017
- font-weight: 800;
2018
- color: var(--orbit-text-muted);
2019
- transition:
2020
- background 160ms ease,
2021
- border-color 160ms ease,
2022
- color 160ms ease;
2023
- }
2024
-
2025
- .card-type-id.type-pill-epic {
2026
- background: rgba(var(--purple-rgb),0.12);
2027
- border-color: rgba(var(--purple-rgb),0.25);
2028
- color: #c084fc;
2029
- }
2030
-
2031
- .card-type-id.type-pill-feature {
2032
- background: rgba(74, 222, 128, 0.1);
2033
- border-color: rgba(74, 222, 128, 0.2);
2034
- color: #4ade80;
2035
- }
2036
-
2037
- .card-type-id.type-pill-bug {
2038
- background: rgba(var(--coral-rgb),0.12);
2039
- border-color: rgba(var(--coral-rgb),0.25);
2040
- color: #f87171;
2041
- }
2042
-
2043
- .card-type-id.type-pill-task {
2044
- background: rgba(96, 165, 250, 0.1);
2045
- border-color: rgba(96, 165, 250, 0.2);
2046
- color: #60a5fa;
2047
- }
2048
-
2049
- .card-type-label {
2050
- text-transform: uppercase;
2051
- letter-spacing: 0.04em;
2052
- }
2053
-
2054
- /* Priority pill — same shape/scale as the Type pill so they read as a paired
2055
- set in the kanban card meta line and the detail-pane header subtitle. The
2056
- priority-pill-* classes (already defined for color) provide the fill, while
2057
- this rule pins the box geometry. */
2058
- .card-priority-id {
2059
- display: inline-flex;
2060
- align-items: center;
2061
- padding: 0.15rem 0.45rem;
2062
- border-radius: 4px;
2063
- border: 1px solid transparent;
2064
- font-size: 0.68rem;
2065
- font-weight: 800;
2066
- letter-spacing: 0.04em;
2067
- text-transform: uppercase;
2068
- }
2069
-
2070
- .card-priority-label {
2071
- line-height: 1;
2072
- }
2073
-
2074
- .card-type-icon {
2075
- width: 12px;
2076
- height: 12px;
2077
- stroke: currentColor;
2078
- fill: none;
2079
- stroke-width: 2.5;
2080
- stroke-linecap: round;
2081
- stroke-linejoin: round;
2082
- }
2083
-
2084
- .priority {
2085
- border-radius: 999px;
2086
- padding: 0.18rem 0.5rem;
2087
- background: rgba(var(--amber-rgb),0.12);
2088
- color: var(--accent-2);
2089
- font-weight: 800;
2090
- }
2091
-
2092
- /* --------- Priority pill colors (MAYBE → URGENT) ---------
2093
- Muted greys for MAYBE / LOW so they sit back, rising through amber to red for URGENT. */
2094
- .priority-pill {
2095
- letter-spacing: 0.04em;
2096
- font-size: 0.72rem;
2097
- }
2098
-
2099
- .priority-pill-maybe {
2100
- color: #6b7280;
2101
- background: rgba(100, 116, 139, 0.14);
2102
- }
2103
-
2104
- .priority-pill-low {
2105
- color: #1e6f5c;
2106
- background: rgba(var(--accent-rgb),0.14);
2107
- }
2108
-
2109
- .priority-pill-med {
2110
- color: #a4550f;
2111
- background: rgba(var(--amber-rgb),0.16);
2112
- }
2113
-
2114
- .priority-pill-high {
2115
- color: #b53a1a;
2116
- background: rgba(214, 86, 46, 0.2);
2117
- box-shadow: inset 0 0 0 1px rgba(214, 86, 46, 0.35);
2118
- }
2119
-
2120
- .priority-pill-urgent {
2121
- color: #fff;
2122
- background: linear-gradient(135deg, #c72e1a, #a0281a);
2123
- box-shadow: 0 0 0 1px rgba(var(--red-rgb),0.35), 0 4px 10px rgba(var(--red-rgb),0.3);
2124
- animation: urgentPulse 2.6s ease-in-out infinite;
2125
- }
2126
-
2127
- @keyframes urgentPulse {
2128
- 0%,
2129
- 100% {
2130
- box-shadow: 0 0 0 1px rgba(var(--red-rgb),0.35), 0 4px 10px rgba(var(--red-rgb),0.3);
2131
- }
2132
-
2133
- 50% {
2134
- box-shadow: 0 0 0 1px rgba(var(--red-rgb),0.55), 0 4px 14px rgba(199, 46, 26, 0.45);
2135
- }
2136
- }
2137
-
2138
- @media (prefers-reduced-motion: reduce) {
2139
- :root:not([data-motion="full"]) .priority-pill-urgent {
2140
- animation: none;
2141
- }
2142
- }
2143
-
2144
- [data-theme="dark"] .priority-pill-maybe {
2145
- color: rgba(255, 255, 255, 0.5);
2146
- background: rgba(255, 255, 255, 0.1);
2147
- }
2148
-
2149
- [data-theme="dark"] .priority-pill-low {
2150
- color: #4ade80;
2151
- background: rgba(74, 222, 128, 0.15);
2152
- }
2153
-
2154
- [data-theme="dark"] .priority-pill-med {
2155
- color: #fbbf24;
2156
- background: rgba(251, 191, 36, 0.18);
2157
- }
2158
-
2159
- [data-theme="dark"] .priority-pill-high {
2160
- color: #f87171;
2161
- background: rgba(var(--coral-rgb),0.2);
2162
- box-shadow: inset 0 0 0 1px rgba(var(--coral-rgb),0.35);
2163
- }
2164
-
2165
- [data-theme="dark"] .priority-pill-urgent {
2166
- background: linear-gradient(135deg, #dc2626, #991b1b);
2167
- }
2168
-
2169
- @media (prefers-reduced-motion: no-preference) {
2170
- :root:not([data-motion="reduce"])[data-theme="dark"] .priority-pill-urgent {
2171
- box-shadow: 0 0 0 1px rgba(var(--coral-rgb),0.35), 0 4px 10px rgba(var(--coral-rgb),0.3);
2172
- }
2173
- }
2174
-
2175
- /* Full-motion escape hatch: show the urgent glow even when the OS prefers
2176
- reduced motion but the user forced full motion. */
2177
- :root[data-motion="full"][data-theme="dark"] .priority-pill-urgent {
2178
- box-shadow: 0 0 0 1px rgba(var(--coral-rgb),0.35), 0 4px 10px rgba(var(--coral-rgb),0.3);
2179
- }
2180
-
2181
- .card-expand-trigger {
2182
- display: flex;
2183
- align-items: center;
2184
- gap: 0.6rem;
2185
- width: 100%;
2186
- padding: 0.25rem 0.4rem;
2187
- margin: 0 -0.4rem;
2188
- border-radius: 8px;
2189
- border: none;
2190
- background: transparent;
2191
- color: inherit;
2192
- font: inherit;
2193
- cursor: url('cursors/live_link.cur'), pointer;
2194
- transition: background 160ms ease;
2195
- }
2196
-
2197
- .card-expand-trigger:not(.card-expand-trigger--static):hover {
2198
- background: rgba(var(--starlight-rgb),0.08);
2199
- }
2200
-
2201
- [data-theme="dark"] .card-meta,
2202
- [data-theme="dark"] .card-expand-trigger {
2203
- color: var(--orbit-text-muted);
2204
- }
2205
-
2206
- [data-theme="dark"] .card-expand-trigger:not(.card-expand-trigger--static):hover {
2207
- background: rgba(var(--starlight-rgb),0.1);
2208
- color: var(--orbit-text);
2209
- }
2210
-
2211
- .card-expandable {
2212
- display: none;
2213
- margin-top: 0.4rem;
2214
- }
2215
-
2216
- .card.is-expanded .card-expandable {
2217
- display: block;
2218
- }
2219
-
2220
- .card-expand-chevron {
2221
- width: 12px;
2222
- height: 12px;
2223
- margin-left: auto;
2224
- stroke: currentColor;
2225
- fill: none;
2226
- stroke-width: 2.5;
2227
- stroke-linecap: round;
2228
- stroke-linejoin: round;
2229
- transition: transform 180ms ease;
2230
- opacity: 0.6;
2231
- }
2232
-
2233
- .card.is-expanded .card-expand-chevron {
2234
- transform: rotate(180deg);
2235
- }
2236
-
2237
2183
  .card h3 {
2238
2184
  margin: 0 0 0.5rem;
2239
2185
  color: var(--orbit-text);
@@ -2244,25 +2190,6 @@ h1 {
2244
2190
  letter-spacing: -0.01em;
2245
2191
  }
2246
2192
 
2247
- .card p {
2248
- display: -webkit-box;
2249
- margin-top: 0.4rem;
2250
- overflow: hidden;
2251
- color: var(--muted);
2252
- font-size: 0.85rem;
2253
- line-height: 1.4;
2254
- -webkit-box-orient: vertical;
2255
- -webkit-line-clamp: 2;
2256
- }
2257
-
2258
- .parent-line,
2259
- .child-count {
2260
- margin-top: 0.4rem;
2261
- color: var(--blue);
2262
- font-size: 0.75rem;
2263
- font-weight: 800;
2264
- }
2265
-
2266
2193
  .labels {
2267
2194
  display: flex;
2268
2195
  flex-wrap: wrap;
@@ -2329,7 +2256,7 @@ h1 {
2329
2256
  flex-direction: column;
2330
2257
  overflow: hidden;
2331
2258
  border: 1px solid var(--line);
2332
- border-radius: 20px;
2259
+ border-radius: var(--radius-drawer);
2333
2260
  background: var(--drawer-bg);
2334
2261
  box-shadow: 0 24px 60px rgba(12, 18, 26, 0.28);
2335
2262
  transform: translateX(calc(100% + 1.5rem));
@@ -2498,33 +2425,33 @@ select.detail-meta-badge::-ms-expand {
2498
2425
  width: 6.55rem;
2499
2426
  }
2500
2427
 
2501
- .detail-state-badge.state-pill-ai-ready,
2502
- .search-hit-state.state-pill-ai-ready,
2503
- .detail-card-state.state-pill-ai-ready {
2428
+ .detail-state-badge[data-variant="ai-ready"],
2429
+ .search-hit-state[data-variant="ai-ready"],
2430
+ .detail-card-state[data-variant="ai-ready"] {
2504
2431
  color: #7c3aed;
2505
2432
  background-color: rgba(var(--purple-rgb), 0.12);
2506
2433
  border-color: rgba(var(--purple-rgb), 0.28);
2507
2434
  }
2508
2435
 
2509
- .detail-state-badge.state-pill-in-progress,
2510
- .search-hit-state.state-pill-in-progress,
2511
- .detail-card-state.state-pill-in-progress {
2436
+ .detail-state-badge[data-variant="in-progress"],
2437
+ .search-hit-state[data-variant="in-progress"],
2438
+ .detail-card-state[data-variant="in-progress"] {
2512
2439
  color: #0369a1;
2513
2440
  background-color: rgba(14, 165, 233, 0.13);
2514
2441
  border-color: rgba(14, 165, 233, 0.28);
2515
2442
  }
2516
2443
 
2517
- .detail-state-badge.state-pill-review,
2518
- .search-hit-state.state-pill-review,
2519
- .detail-card-state.state-pill-review {
2444
+ .detail-state-badge[data-variant="review"],
2445
+ .search-hit-state[data-variant="review"],
2446
+ .detail-card-state[data-variant="review"] {
2520
2447
  color: #a4550f;
2521
2448
  background-color: rgba(var(--amber-rgb), 0.16);
2522
2449
  border-color: rgba(var(--amber-rgb), 0.32);
2523
2450
  }
2524
2451
 
2525
- .detail-state-badge.state-pill-done,
2526
- .search-hit-state.state-pill-done,
2527
- .detail-card-state.state-pill-done {
2452
+ .detail-state-badge[data-variant="done"],
2453
+ .search-hit-state[data-variant="done"],
2454
+ .detail-card-state[data-variant="done"] {
2528
2455
  color: #1e6f5c;
2529
2456
  background-color: rgba(var(--accent-rgb), 0.14);
2530
2457
  border-color: rgba(var(--accent-rgb), 0.28);
@@ -2554,35 +2481,35 @@ select.detail-meta-badge::-ms-expand {
2554
2481
  border-color: rgba(var(--coral-rgb),0.3);
2555
2482
  }
2556
2483
 
2557
- .detail-priority-badge.priority-pill-maybe,
2558
- .detail-priority-badge.priority-pill-low,
2559
- .detail-priority-badge.priority-pill-med,
2560
- .detail-priority-badge.priority-pill-high,
2561
- .detail-priority-badge.priority-pill-urgent {
2484
+ .detail-priority-badge[data-variant="maybe"],
2485
+ .detail-priority-badge[data-variant="low"],
2486
+ .detail-priority-badge[data-variant="med"],
2487
+ .detail-priority-badge[data-variant="high"],
2488
+ .detail-priority-badge[data-variant="urgent"] {
2562
2489
  border-color: currentColor;
2563
2490
  }
2564
2491
 
2565
- .detail-priority-badge.priority-pill-maybe {
2492
+ .detail-priority-badge[data-variant="maybe"] {
2566
2493
  color: #6b7280;
2567
2494
  background-color: rgba(100, 116, 139, 0.14);
2568
2495
  }
2569
2496
 
2570
- .detail-priority-badge.priority-pill-low {
2497
+ .detail-priority-badge[data-variant="low"] {
2571
2498
  color: #1e6f5c;
2572
2499
  background-color: rgba(var(--accent-rgb), 0.14);
2573
2500
  }
2574
2501
 
2575
- .detail-priority-badge.priority-pill-med {
2502
+ .detail-priority-badge[data-variant="med"] {
2576
2503
  color: #a4550f;
2577
2504
  background-color: rgba(var(--amber-rgb), 0.16);
2578
2505
  }
2579
2506
 
2580
- .detail-priority-badge.priority-pill-high {
2507
+ .detail-priority-badge[data-variant="high"] {
2581
2508
  color: #b53a1a;
2582
2509
  background-color: rgba(214, 86, 46, 0.2);
2583
2510
  }
2584
2511
 
2585
- .detail-priority-badge.priority-pill-urgent {
2512
+ .detail-priority-badge[data-variant="urgent"] {
2586
2513
  color: #fff;
2587
2514
  background-color: #b91c1c;
2588
2515
  }
@@ -2606,33 +2533,33 @@ select.detail-meta-badge::-ms-expand {
2606
2533
  border-color: rgba(147, 197, 253, 0.3);
2607
2534
  }
2608
2535
 
2609
- [data-theme="dark"] .detail-state-badge.state-pill-ai-ready,
2610
- [data-theme="dark"] .search-hit-state.state-pill-ai-ready,
2611
- [data-theme="dark"] .detail-card-state.state-pill-ai-ready {
2536
+ [data-theme="dark"] .detail-state-badge[data-variant="ai-ready"],
2537
+ [data-theme="dark"] .search-hit-state[data-variant="ai-ready"],
2538
+ [data-theme="dark"] .detail-card-state[data-variant="ai-ready"] {
2612
2539
  color: #c084fc;
2613
2540
  background-color: rgba(var(--purple-rgb), 0.16);
2614
2541
  border-color: rgba(var(--purple-rgb), 0.35);
2615
2542
  }
2616
2543
 
2617
- [data-theme="dark"] .detail-state-badge.state-pill-in-progress,
2618
- [data-theme="dark"] .search-hit-state.state-pill-in-progress,
2619
- [data-theme="dark"] .detail-card-state.state-pill-in-progress {
2544
+ [data-theme="dark"] .detail-state-badge[data-variant="in-progress"],
2545
+ [data-theme="dark"] .search-hit-state[data-variant="in-progress"],
2546
+ [data-theme="dark"] .detail-card-state[data-variant="in-progress"] {
2620
2547
  color: #67e8f9;
2621
2548
  background-color: rgba(14, 165, 233, 0.16);
2622
2549
  border-color: rgba(103, 232, 249, 0.32);
2623
2550
  }
2624
2551
 
2625
- [data-theme="dark"] .detail-state-badge.state-pill-review,
2626
- [data-theme="dark"] .search-hit-state.state-pill-review,
2627
- [data-theme="dark"] .detail-card-state.state-pill-review {
2552
+ [data-theme="dark"] .detail-state-badge[data-variant="review"],
2553
+ [data-theme="dark"] .search-hit-state[data-variant="review"],
2554
+ [data-theme="dark"] .detail-card-state[data-variant="review"] {
2628
2555
  color: #fbbf24;
2629
2556
  background-color: rgba(251, 191, 36, 0.18);
2630
2557
  border-color: rgba(251, 191, 36, 0.35);
2631
2558
  }
2632
2559
 
2633
- [data-theme="dark"] .detail-state-badge.state-pill-done,
2634
- [data-theme="dark"] .search-hit-state.state-pill-done,
2635
- [data-theme="dark"] .detail-card-state.state-pill-done {
2560
+ [data-theme="dark"] .detail-state-badge[data-variant="done"],
2561
+ [data-theme="dark"] .search-hit-state[data-variant="done"],
2562
+ [data-theme="dark"] .detail-card-state[data-variant="done"] {
2636
2563
  color: #4ade80;
2637
2564
  background-color: rgba(74, 222, 128, 0.15);
2638
2565
  border-color: rgba(74, 222, 128, 0.32);
@@ -2650,27 +2577,27 @@ select.detail-meta-badge::-ms-expand {
2650
2577
  color: #f87171;
2651
2578
  }
2652
2579
 
2653
- [data-theme="dark"] .detail-priority-badge.priority-pill-maybe {
2580
+ [data-theme="dark"] .detail-priority-badge[data-variant="maybe"] {
2654
2581
  color: rgba(255, 255, 255, 0.62);
2655
2582
  background-color: rgba(255, 255, 255, 0.1);
2656
2583
  }
2657
2584
 
2658
- [data-theme="dark"] .detail-priority-badge.priority-pill-low {
2585
+ [data-theme="dark"] .detail-priority-badge[data-variant="low"] {
2659
2586
  color: #4ade80;
2660
2587
  background-color: rgba(74, 222, 128, 0.15);
2661
2588
  }
2662
2589
 
2663
- [data-theme="dark"] .detail-priority-badge.priority-pill-med {
2590
+ [data-theme="dark"] .detail-priority-badge[data-variant="med"] {
2664
2591
  color: #fbbf24;
2665
2592
  background-color: rgba(251, 191, 36, 0.18);
2666
2593
  }
2667
2594
 
2668
- [data-theme="dark"] .detail-priority-badge.priority-pill-high {
2595
+ [data-theme="dark"] .detail-priority-badge[data-variant="high"] {
2669
2596
  color: #f87171;
2670
2597
  background-color: rgba(var(--coral-rgb), 0.2);
2671
2598
  }
2672
2599
 
2673
- [data-theme="dark"] .detail-priority-badge.priority-pill-urgent {
2600
+ [data-theme="dark"] .detail-priority-badge[data-variant="urgent"] {
2674
2601
  color: #fff;
2675
2602
  background-color: #991b1b;
2676
2603
  }
@@ -2727,13 +2654,16 @@ select.detail-meta-badge::-ms-expand {
2727
2654
  display: none;
2728
2655
  }
2729
2656
 
2730
- .drawer-tab {
2657
+ .drawer-tab,
2658
+ button.drawer-tab {
2731
2659
  flex-shrink: 0;
2660
+ min-height: 0;
2732
2661
  padding: 0.38rem 0.78rem;
2733
2662
  border: 1px solid transparent;
2734
- border-radius: 999px;
2663
+ border-radius: var(--radius-control);
2735
2664
  background: transparent;
2736
2665
  color: var(--muted);
2666
+ box-shadow: none;
2737
2667
  font: inherit;
2738
2668
  font-size: 0.78rem;
2739
2669
  font-weight: 700;
@@ -2745,28 +2675,46 @@ select.detail-meta-badge::-ms-expand {
2745
2675
  border-color 140ms ease;
2746
2676
  }
2747
2677
 
2748
- .drawer-tab:hover {
2678
+ .drawer-tab:hover,
2679
+ button.drawer-tab:hover {
2680
+ transform: none;
2681
+ filter: none;
2749
2682
  color: var(--ink);
2750
2683
  background: var(--accent-hover);
2684
+ box-shadow: none;
2751
2685
  }
2752
2686
 
2753
- .drawer-tab.is-active {
2687
+ .drawer-tab.is-active,
2688
+ .drawer-tab[aria-selected="true"],
2689
+ button.drawer-tab.is-active,
2690
+ button.drawer-tab[aria-selected="true"] {
2754
2691
  color: var(--ink);
2755
2692
  background: var(--accent-active);
2756
2693
  border-color: var(--accent-border);
2694
+ box-shadow: none;
2695
+ }
2696
+
2697
+ button.drawer-tab::after {
2698
+ content: none;
2699
+ display: none;
2757
2700
  }
2758
2701
 
2759
2702
  .drawer-close,
2760
- .drawer-archive {
2703
+ .drawer-archive,
2704
+ button.drawer-close,
2705
+ button.drawer-archive {
2761
2706
  display: inline-grid;
2762
2707
  place-items: center;
2763
2708
  width: 2rem;
2764
2709
  height: 2rem;
2710
+ min-width: 0;
2711
+ min-height: 0;
2765
2712
  padding: 0;
2766
2713
  border: 1px solid var(--line);
2767
- border-radius: 10px;
2714
+ border-radius: var(--radius-control);
2768
2715
  background: var(--surface);
2769
2716
  color: var(--ink);
2717
+ box-shadow: none;
2770
2718
  cursor: url('cursors/live_link.cur'), pointer;
2771
2719
  }
2772
2720
 
@@ -2777,19 +2725,33 @@ select.detail-meta-badge::-ms-expand {
2777
2725
  line-height: 1;
2778
2726
  }
2779
2727
 
2780
- .drawer-close:hover {
2728
+ .drawer-close:hover,
2729
+ button.drawer-close:hover {
2730
+ transform: none;
2731
+ filter: none;
2781
2732
  background: var(--accent-hover);
2782
2733
  border-color: var(--accent-border);
2734
+ box-shadow: none;
2783
2735
  }
2784
2736
 
2785
2737
  .drawer-archive {
2786
2738
  grid-area: archive;
2787
2739
  }
2788
2740
 
2789
- .drawer-archive:hover {
2741
+ .drawer-archive:hover,
2742
+ button.drawer-archive:hover {
2743
+ transform: none;
2744
+ filter: none;
2790
2745
  background: var(--accent-hover);
2791
2746
  border-color: var(--accent-border);
2792
2747
  color: var(--danger, #d44);
2748
+ box-shadow: none;
2749
+ }
2750
+
2751
+ button.drawer-close::after,
2752
+ button.drawer-archive::after {
2753
+ content: none;
2754
+ display: none;
2793
2755
  }
2794
2756
 
2795
2757
  .drawer-archive[hidden] {
@@ -3376,10 +3338,13 @@ input.meta-inline {
3376
3338
  border-color: rgba(var(--starlight-rgb),0.22);
3377
3339
  }
3378
3340
 
3379
- .label-pill-remove {
3341
+ .label-pill-remove,
3342
+ button.label-pill-remove {
3380
3343
  display: inline-grid;
3381
3344
  width: 1.35rem;
3382
3345
  height: 1.35rem;
3346
+ min-width: 0;
3347
+ min-height: 0;
3383
3348
  place-items: center;
3384
3349
  padding: 0;
3385
3350
  border: 0;
@@ -3392,8 +3357,17 @@ input.meta-inline {
3392
3357
  transition: background 120ms ease;
3393
3358
  }
3394
3359
 
3395
- .label-pill-remove:hover {
3360
+ .label-pill-remove:hover,
3361
+ button.label-pill-remove:hover {
3362
+ transform: none;
3363
+ filter: none;
3396
3364
  background: rgba(var(--red-rgb),0.18);
3365
+ box-shadow: none;
3366
+ }
3367
+
3368
+ button.label-pill-remove::after {
3369
+ content: none;
3370
+ display: none;
3397
3371
  }
3398
3372
 
3399
3373
  .label-pill-removable .label-pill-remove {
@@ -3764,7 +3738,7 @@ details.section > summary .mcp-title-row {
3764
3738
  background: var(--danger);
3765
3739
  }
3766
3740
 
3767
- .repository-danger-zone button.ghost.danger-button {
3741
+ .repository-danger-zone button[data-variant="ghost"].danger-button {
3768
3742
  color: var(--danger);
3769
3743
  background: rgba(var(--red-rgb),0.06);
3770
3744
  }
@@ -3803,7 +3777,7 @@ details.section > summary .mcp-title-row {
3803
3777
  }
3804
3778
 
3805
3779
  [data-theme="dark"] .repository-danger-zone h3,
3806
- [data-theme="dark"] .repository-danger-zone button.ghost.danger-button {
3780
+ [data-theme="dark"] .repository-danger-zone button[data-variant="ghost"].danger-button {
3807
3781
  color: #ffb4b4;
3808
3782
  }
3809
3783
 
@@ -3812,7 +3786,7 @@ details.section > summary .mcp-title-row {
3812
3786
  background: linear-gradient(135deg, rgba(127, 29, 29, 0.92), rgba(153, 27, 27, 0.88));
3813
3787
  }
3814
3788
 
3815
- [data-theme="dark"] .repository-danger-zone button.ghost.danger-button {
3789
+ [data-theme="dark"] .repository-danger-zone button[data-variant="ghost"].danger-button {
3816
3790
  background: rgba(var(--coral-rgb),0.1);
3817
3791
  }
3818
3792
 
@@ -4601,39 +4575,10 @@ details.section > summary .mcp-title-row {
4601
4575
  font-size: 0.82rem;
4602
4576
  }
4603
4577
 
4604
- .import-button {
4605
- display: flex;
4606
- }
4607
-
4608
- .import-button input {
4578
+ .import-file-input {
4609
4579
  display: none;
4610
4580
  }
4611
4581
 
4612
- .import-button span {
4613
- display: inline-grid;
4614
- width: 100%;
4615
- place-items: center;
4616
- border: 1px solid var(--line);
4617
- border-radius: 999px;
4618
- padding: 0.72rem 1rem;
4619
- color: var(--ink);
4620
- background: var(--surface);
4621
- cursor: url('cursors/live_link.cur'), pointer;
4622
- transition:
4623
- transform 150ms ease,
4624
- box-shadow 150ms ease,
4625
- background 150ms ease;
4626
- }
4627
-
4628
- .import-button span:hover {
4629
- transform: translateY(-1px);
4630
- box-shadow: var(--btn-hover-shadow);
4631
- }
4632
-
4633
- [data-theme="dark"] .import-button span:hover {
4634
- box-shadow: 0 10px 24px rgba(0, 0, 0, 0.35);
4635
- }
4636
-
4637
4582
  .lane-row {
4638
4583
  display: grid;
4639
4584
  grid-template-columns: 2rem 2rem minmax(6rem, 1fr) minmax(5.5rem, 7rem) 2rem 2rem;
@@ -4666,18 +4611,24 @@ details.section > summary .mcp-title-row {
4666
4611
 
4667
4612
  /* Shared 2rem square chrome for every in-row lane control (up, down, toggle,
4668
4613
  delete) — keeps the row rhythm tight and matches the drawer's X close. */
4669
- .lane-icon-btn,
4670
- .lane-delete-btn,
4671
- .lane-new-toggle {
4614
+ .settings-lane-icon-btn,
4615
+ .settings-lane-delete-btn,
4616
+ .settings-lane-new-toggle,
4617
+ button.settings-lane-icon-btn,
4618
+ button.settings-lane-delete-btn,
4619
+ button.settings-lane-new-toggle {
4672
4620
  display: inline-grid;
4673
4621
  place-items: center;
4674
4622
  width: 2rem;
4675
4623
  height: 2rem;
4624
+ min-width: 0;
4625
+ min-height: 0;
4676
4626
  padding: 0;
4677
4627
  border: 1px solid var(--line);
4678
4628
  border-radius: 10px;
4679
4629
  background: var(--surface);
4680
4630
  color: var(--muted);
4631
+ box-shadow: none;
4681
4632
  font-family: inherit;
4682
4633
  line-height: 1;
4683
4634
  cursor: url('cursors/live_link.cur'), pointer;
@@ -4688,68 +4639,84 @@ details.section > summary .mcp-title-row {
4688
4639
  box-shadow 200ms ease;
4689
4640
  }
4690
4641
 
4691
- .lane-icon-btn {
4642
+ .settings-lane-icon-btn {
4692
4643
  font-size: 1rem;
4693
4644
  }
4694
4645
 
4695
- .lane-icon-btn:hover:not(:disabled),
4696
- .lane-new-toggle:hover:not(:disabled) {
4646
+ .settings-lane-icon-btn:hover:not(:disabled),
4647
+ .settings-lane-new-toggle:hover:not(:disabled),
4648
+ button.settings-lane-icon-btn:hover:not(:disabled),
4649
+ button.settings-lane-new-toggle:hover:not(:disabled) {
4650
+ transform: none;
4651
+ filter: none;
4697
4652
  color: var(--ink);
4698
4653
  border-color: var(--accent-border);
4699
4654
  background: var(--accent-hover);
4655
+ box-shadow: none;
4700
4656
  }
4701
4657
 
4702
- .lane-delete-btn {
4658
+ .settings-lane-delete-btn {
4703
4659
  font-size: 1.2rem;
4704
4660
  }
4705
4661
 
4706
- .lane-delete-btn:hover:not(:disabled) {
4662
+ .settings-lane-delete-btn:hover:not(:disabled),
4663
+ button.settings-lane-delete-btn:hover:not(:disabled) {
4664
+ transform: none;
4665
+ filter: none;
4707
4666
  color: var(--danger);
4708
4667
  border-color: rgba(var(--red-rgb),0.38);
4709
4668
  background: rgba(var(--red-rgb),0.08);
4669
+ box-shadow: none;
4710
4670
  }
4711
4671
 
4712
- .lane-icon-btn:disabled,
4713
- .lane-delete-btn:disabled {
4672
+ .settings-lane-icon-btn:disabled,
4673
+ .settings-lane-delete-btn:disabled {
4714
4674
  opacity: 0.38;
4715
4675
  cursor: url('cursors/live_unavail.cur'), not-allowed;
4716
4676
  }
4717
4677
 
4718
- [data-theme="dark"] .lane-icon-btn,
4719
- [data-theme="dark"] .lane-delete-btn,
4720
- [data-theme="dark"] .lane-new-toggle {
4678
+ [data-theme="dark"] .settings-lane-icon-btn,
4679
+ [data-theme="dark"] .settings-lane-delete-btn,
4680
+ [data-theme="dark"] .settings-lane-new-toggle {
4721
4681
  background: rgba(var(--starlight-rgb),0.07);
4722
4682
  border-color: rgba(var(--starlight-rgb),0.24);
4723
4683
  color: rgba(226, 236, 255, 0.92);
4724
4684
  }
4725
4685
 
4726
- [data-theme="dark"] .lane-icon-btn:hover:not(:disabled),
4727
- [data-theme="dark"] .lane-new-toggle:hover:not(:disabled) {
4686
+ [data-theme="dark"] .settings-lane-icon-btn:hover:not(:disabled),
4687
+ [data-theme="dark"] .settings-lane-new-toggle:hover:not(:disabled) {
4728
4688
  background: rgba(var(--starlight-rgb),0.16);
4729
4689
  border-color: rgba(var(--starlight-rgb),0.6);
4730
4690
  color: #fff;
4731
4691
  box-shadow: 0 0 14px rgba(var(--starlight-rgb),0.3);
4732
4692
  }
4733
4693
 
4734
- [data-theme="dark"] .lane-delete-btn:hover:not(:disabled) {
4694
+ [data-theme="dark"] .settings-lane-delete-btn:hover:not(:disabled) {
4735
4695
  background: rgba(var(--coral-rgb),0.14);
4736
4696
  border-color: rgba(var(--coral-rgb),0.6);
4737
4697
  color: #ffb4b4;
4738
4698
  box-shadow: 0 0 14px rgba(var(--coral-rgb),0.3);
4739
4699
  }
4740
4700
 
4741
- [data-theme="dark"] .lane-icon-btn:disabled,
4742
- [data-theme="dark"] .lane-delete-btn:disabled {
4701
+ [data-theme="dark"] .settings-lane-icon-btn:disabled,
4702
+ [data-theme="dark"] .settings-lane-delete-btn:disabled {
4743
4703
  color: rgba(226, 236, 255, 0.35);
4744
4704
  background: rgba(var(--starlight-rgb),0.035);
4745
4705
  border-color: rgba(var(--starlight-rgb),0.12);
4746
4706
  box-shadow: none;
4747
4707
  }
4748
4708
 
4709
+ button.settings-lane-icon-btn::after,
4710
+ button.settings-lane-delete-btn::after,
4711
+ button.settings-lane-new-toggle::after {
4712
+ content: none;
4713
+ display: none;
4714
+ }
4715
+
4749
4716
  /* New-cards-default toggle — sun metaphor: a hollow ring when off (like an
4750
4717
  unselected radio button), a glowing warm disc with an amber halo when on.
4751
4718
  Tiny "NEW" caption underneath so the purpose is always readable. */
4752
- .lane-new-toggle {
4719
+ .settings-lane-new-toggle {
4753
4720
  grid-template-rows: auto auto;
4754
4721
  gap: 0.08rem;
4755
4722
  padding: 0.22rem 0;
@@ -4780,7 +4747,7 @@ details.section > summary .mcp-title-row {
4780
4747
  /* "New cards land here" toggle — Epic-card palette to match the .btn-sun CTA.
4781
4748
  Light: teal border + amber inner ring + teal halo, with a teal glowing
4782
4749
  center dot. Dark: starlight-blue + violet inner ring, with a starlight dot. */
4783
- .lane-new-toggle.is-on {
4750
+ .settings-lane-new-toggle.is-on {
4784
4751
  border-color: rgba(var(--accent-rgb),0.55);
4785
4752
  background:
4786
4753
  linear-gradient(135deg, rgba(var(--accent-rgb),0.16), rgba(var(--amber-rgb),0.1) 55%, rgba(var(--paper-rgb),0) 100%),
@@ -4791,7 +4758,7 @@ details.section > summary .mcp-title-row {
4791
4758
  0 4px 12px rgba(var(--accent-rgb),0.2);
4792
4759
  }
4793
4760
 
4794
- .lane-new-toggle.is-on .lane-new-sun {
4761
+ .settings-lane-new-toggle.is-on .lane-new-sun {
4795
4762
  border-color: transparent;
4796
4763
  background: radial-gradient(circle at 38% 38%, #d6efe9 0%, #14a094 50%, var(--teal-deep) 100%);
4797
4764
  box-shadow:
@@ -4799,12 +4766,12 @@ details.section > summary .mcp-title-row {
4799
4766
  0 0 8px rgba(var(--accent-rgb),0.55);
4800
4767
  }
4801
4768
 
4802
- .lane-new-toggle.is-on .lane-new-label {
4769
+ .settings-lane-new-toggle.is-on .lane-new-label {
4803
4770
  color: var(--teal-deep);
4804
4771
  font-weight: 900;
4805
4772
  }
4806
4773
 
4807
- [data-theme="dark"] .lane-new-toggle.is-on {
4774
+ [data-theme="dark"] .settings-lane-new-toggle.is-on {
4808
4775
  border-color: rgba(var(--starlight-rgb),0.5);
4809
4776
  background:
4810
4777
  linear-gradient(135deg, rgba(var(--cyan-rgb),0.14), rgba(var(--indigo-rgb),0.1) 55%, rgba(var(--cosmos-rgb),0) 100%),
@@ -4815,32 +4782,40 @@ details.section > summary .mcp-title-row {
4815
4782
  0 4px 16px rgba(var(--void-rgb),0.42);
4816
4783
  }
4817
4784
 
4818
- [data-theme="dark"] .lane-new-toggle.is-on .lane-new-sun {
4785
+ [data-theme="dark"] .settings-lane-new-toggle.is-on .lane-new-sun {
4819
4786
  background: radial-gradient(circle at 38% 38%, #d8e3ff 0%, #a8c0ff 50%, #5d77b8 100%);
4820
4787
  box-shadow:
4821
4788
  0 0 3px rgba(var(--starlight-rgb),0.95),
4822
4789
  0 0 9px rgba(var(--starlight-rgb),0.6);
4823
4790
  }
4824
4791
 
4825
- [data-theme="dark"] .lane-new-toggle.is-on .lane-new-label {
4792
+ [data-theme="dark"] .settings-lane-new-toggle.is-on .lane-new-label {
4826
4793
  color: #d2deff;
4827
4794
  }
4828
4795
 
4829
- .icon-button {
4796
+ .icon-button,
4797
+ button.icon-button {
4830
4798
  display: inline-grid;
4831
4799
  width: 2.35rem;
4832
4800
  height: 2.35rem;
4801
+ min-width: 0;
4802
+ min-height: 0;
4833
4803
  place-items: center;
4834
4804
  border-radius: 999px;
4835
4805
  padding: 0;
4806
+ box-shadow: none;
4807
+ }
4808
+
4809
+ button.icon-button::after {
4810
+ content: none;
4811
+ display: none;
4836
4812
  }
4837
4813
 
4838
4814
  .danger-button {
4839
4815
  color: var(--danger);
4840
4816
  }
4841
4817
 
4842
- button:disabled,
4843
- .import-button input:disabled + span {
4818
+ button:disabled {
4844
4819
  cursor: url('cursors/live_unavail.cur'), not-allowed;
4845
4820
  opacity: 0.45;
4846
4821
  }
@@ -4913,12 +4888,15 @@ button:disabled,
4913
4888
  text-transform: uppercase;
4914
4889
  }
4915
4890
 
4916
- .card-detach-btn {
4891
+ .card-detach-btn,
4892
+ button.card-detach-btn {
4917
4893
  position: absolute;
4918
4894
  top: 0.35rem;
4919
4895
  right: 0.35rem;
4920
4896
  width: 1.4rem;
4921
4897
  height: 1.4rem;
4898
+ min-width: 0;
4899
+ min-height: 0;
4922
4900
  display: inline-grid;
4923
4901
  place-items: center;
4924
4902
  padding: 0;
@@ -4934,10 +4912,19 @@ button:disabled,
4934
4912
  z-index: 2;
4935
4913
  }
4936
4914
 
4937
- .card-detach-btn:hover {
4915
+ .card-detach-btn:hover,
4916
+ button.card-detach-btn:hover {
4917
+ transform: none;
4918
+ filter: none;
4938
4919
  opacity: 1;
4939
4920
  background: rgba(var(--red-rgb),0.18);
4940
4921
  color: var(--ink);
4922
+ box-shadow: none;
4923
+ }
4924
+
4925
+ button.card-detach-btn::after {
4926
+ content: none;
4927
+ display: none;
4941
4928
  }
4942
4929
 
4943
4930
  .card-archive-actions {
@@ -4949,9 +4936,12 @@ button:disabled,
4949
4936
  z-index: 2;
4950
4937
  }
4951
4938
 
4952
- .card-archive-btn {
4939
+ .card-archive-btn,
4940
+ button.card-archive-btn {
4953
4941
  width: 1.6rem;
4954
4942
  height: 1.6rem;
4943
+ min-width: 0;
4944
+ min-height: 0;
4955
4945
  display: inline-grid;
4956
4946
  place-items: center;
4957
4947
  padding: 0;
@@ -4964,20 +4954,31 @@ button:disabled,
4964
4954
  transition: opacity 120ms ease, background 120ms ease, color 120ms ease;
4965
4955
  }
4966
4956
 
4967
- .card-archive-btn:hover {
4957
+ .card-archive-btn:hover,
4958
+ button.card-archive-btn:hover {
4959
+ transform: none;
4960
+ filter: none;
4968
4961
  opacity: 1;
4962
+ box-shadow: none;
4969
4963
  }
4970
4964
 
4971
- .card-archive-btn--restore:hover {
4965
+ .card-archive-btn--restore:hover,
4966
+ button.card-archive-btn--restore:hover {
4972
4967
  background: rgba(var(--green-rgb, 34, 197, 94), 0.2);
4973
4968
  color: var(--ink);
4974
4969
  }
4975
4970
 
4976
- .card-archive-btn--delete:hover {
4971
+ .card-archive-btn--delete:hover,
4972
+ button.card-archive-btn--delete:hover {
4977
4973
  background: rgba(var(--red-rgb), 0.22);
4978
4974
  color: var(--ink);
4979
4975
  }
4980
4976
 
4977
+ button.card-archive-btn::after {
4978
+ content: none;
4979
+ display: none;
4980
+ }
4981
+
4981
4982
  .archive-list {
4982
4983
  min-height: 4rem;
4983
4984
  }
@@ -5008,7 +5009,8 @@ button:disabled,
5008
5009
  display: none !important;
5009
5010
  }
5010
5011
 
5011
- .related-add-clear {
5012
+ .related-add-clear,
5013
+ button.related-add-clear {
5012
5014
  position: absolute;
5013
5015
  top: 50%;
5014
5016
  right: 0.4rem;
@@ -5016,6 +5018,8 @@ button:disabled,
5016
5018
  display: none;
5017
5019
  width: 1.4rem;
5018
5020
  height: 1.4rem;
5021
+ min-width: 0;
5022
+ min-height: 0;
5019
5023
  padding: 0;
5020
5024
  border: 0;
5021
5025
  border-radius: 999px;
@@ -5027,12 +5031,20 @@ button:disabled,
5027
5031
  cursor: url('cursors/live_link.cur'), pointer;
5028
5032
  }
5029
5033
 
5030
- .related-add-clear:hover {
5034
+ .related-add-clear:hover,
5035
+ button.related-add-clear:hover {
5031
5036
  background: rgba(var(--red-rgb),0.18);
5032
5037
  color: var(--ink);
5038
+ filter: none;
5039
+ box-shadow: none;
5033
5040
  transform: translateY(-50%);
5034
5041
  }
5035
5042
 
5043
+ button.related-add-clear::after {
5044
+ content: none;
5045
+ display: none;
5046
+ }
5047
+
5036
5048
  .related-add-row.has-value .related-add-clear {
5037
5049
  display: inline-grid;
5038
5050
  place-items: center;
@@ -5118,29 +5130,42 @@ button:disabled,
5118
5130
  min-width: 0;
5119
5131
  }
5120
5132
 
5121
- .toast-close {
5133
+ .toast-close,
5134
+ button.toast-close {
5122
5135
  flex-shrink: 0;
5123
5136
  width: 1.25rem;
5124
5137
  height: 1.25rem;
5125
- display: flex;
5126
- align-items: center;
5127
- justify-content: center;
5138
+ min-width: 0;
5139
+ min-height: 0;
5140
+ display: inline-grid;
5141
+ place-items: center;
5128
5142
  padding: 0;
5129
5143
  border: none;
5130
5144
  border-radius: 50%;
5131
5145
  background: transparent;
5132
5146
  color: inherit;
5147
+ box-shadow: none;
5133
5148
  opacity: 0.45;
5134
5149
  cursor: url('cursors/live_link.cur'), pointer;
5150
+ font-family: inherit;
5135
5151
  font-size: 1rem;
5136
5152
  line-height: 1;
5137
5153
  transition: opacity 150ms;
5138
5154
  }
5139
5155
 
5140
- .toast-close:hover {
5156
+ .toast-close:hover,
5157
+ button.toast-close:hover {
5158
+ transform: none;
5159
+ filter: none;
5160
+ box-shadow: none;
5141
5161
  opacity: 0.85;
5142
5162
  }
5143
5163
 
5164
+ button.toast-close::after {
5165
+ content: none;
5166
+ display: none;
5167
+ }
5168
+
5144
5169
  /* Type variants — light mode */
5145
5170
  .toast-info {
5146
5171
  background: #f0f4ff;
@@ -5930,13 +5955,16 @@ button:disabled,
5930
5955
  font-size: 0.72rem;
5931
5956
  }
5932
5957
 
5933
- .attachment-delete {
5958
+ .attachment-delete,
5959
+ button.attachment-delete {
5934
5960
  position: absolute;
5935
5961
  right: 0.45rem;
5936
5962
  bottom: 0.45rem;
5937
5963
  display: inline-grid;
5938
5964
  width: 1.45rem;
5939
5965
  height: 1.45rem;
5966
+ min-width: 0;
5967
+ min-height: 0;
5940
5968
  place-items: center;
5941
5969
  padding: 0;
5942
5970
  border: 1px solid var(--line);
@@ -5946,10 +5974,19 @@ button:disabled,
5946
5974
  cursor: url('cursors/live_link.cur'), pointer;
5947
5975
  }
5948
5976
 
5949
- .attachment-delete:hover {
5977
+ .attachment-delete:hover,
5978
+ button.attachment-delete:hover {
5979
+ transform: none;
5980
+ filter: none;
5950
5981
  color: var(--danger, #d44);
5951
5982
  border-color: rgba(var(--red-rgb),0.35);
5952
5983
  background: rgba(var(--red-rgb),0.08);
5984
+ box-shadow: none;
5985
+ }
5986
+
5987
+ button.attachment-delete::after {
5988
+ content: none;
5989
+ display: none;
5953
5990
  }
5954
5991
 
5955
5992
  .attachment-lightbox {
@@ -5985,14 +6022,18 @@ button:disabled,
5985
6022
  text-align: center;
5986
6023
  }
5987
6024
 
5988
- .attachment-lightbox-close {
6025
+ .attachment-lightbox-close,
6026
+ button.attachment-lightbox-close {
5989
6027
  position: absolute;
5990
6028
  top: -0.75rem;
5991
6029
  right: -0.75rem;
5992
6030
  display: inline-grid;
5993
6031
  width: 2.2rem;
5994
6032
  height: 2.2rem;
6033
+ min-width: 0;
6034
+ min-height: 0;
5995
6035
  place-items: center;
6036
+ padding: 0;
5996
6037
  border: 1px solid rgba(255,255,255,0.25);
5997
6038
  border-radius: 999px;
5998
6039
  background: rgba(15, 23, 42, 0.92);
@@ -6000,3 +6041,15 @@ button:disabled,
6000
6041
  font-size: 1.4rem;
6001
6042
  cursor: url('cursors/live_link.cur'), pointer;
6002
6043
  }
6044
+
6045
+ .attachment-lightbox-close:hover,
6046
+ button.attachment-lightbox-close:hover {
6047
+ transform: none;
6048
+ filter: none;
6049
+ box-shadow: none;
6050
+ }
6051
+
6052
+ button.attachment-lightbox-close::after {
6053
+ content: none;
6054
+ display: none;
6055
+ }