@starlove/orbit 1.1.2 → 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.
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:
@@ -321,7 +352,7 @@ textarea:focus {
321
352
  }
322
353
 
323
354
  @media (prefers-reduced-motion: reduce) {
324
- [data-theme="dark"] .topbar {
355
+ :root:not([data-motion="full"])[data-theme="dark"] .topbar {
325
356
  transition: none;
326
357
  }
327
358
  }
@@ -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;
@@ -1037,8 +1170,8 @@ h1 {
1037
1170
  }
1038
1171
 
1039
1172
  @media (prefers-reduced-motion: reduce) {
1040
- .create-flyout,
1041
- .create-flyout-backdrop {
1173
+ :root:not([data-motion="full"]) .create-flyout,
1174
+ :root:not([data-motion="full"]) .create-flyout-backdrop {
1042
1175
  transition: none;
1043
1176
  }
1044
1177
  }
@@ -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. */
@@ -1347,7 +1532,7 @@ h1 {
1347
1532
  }
1348
1533
 
1349
1534
  @media (hover: hover) and (pointer: fine) and (prefers-reduced-motion: reduce) {
1350
- .add-card-phantom {
1535
+ :root:not([data-motion="full"]) .add-card-phantom {
1351
1536
  transition:
1352
1537
  color 160ms ease,
1353
1538
  border-color 160ms ease,
@@ -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;
@@ -1402,7 +1588,7 @@ h1 {
1402
1588
  }
1403
1589
 
1404
1590
  @media (prefers-reduced-motion: reduce) {
1405
- .agent-dot {
1591
+ :root:not([data-motion="full"]) .agent-dot {
1406
1592
  animation: none;
1407
1593
  }
1408
1594
  }
@@ -1443,7 +1629,7 @@ h1 {
1443
1629
  }
1444
1630
 
1445
1631
  @media (prefers-reduced-motion: reduce) {
1446
- .card-unread-dot {
1632
+ :root:not([data-motion="full"]) .card-unread-dot {
1447
1633
  animation: none;
1448
1634
  }
1449
1635
  }
@@ -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;
@@ -1691,7 +1882,7 @@ h1 {
1691
1882
  }
1692
1883
 
1693
1884
  @media (prefers-reduced-motion: reduce) {
1694
- .card {
1885
+ :root:not([data-motion="full"]) .card {
1695
1886
  animation: none;
1696
1887
  }
1697
1888
  }
@@ -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
  }
@@ -1823,11 +2015,14 @@ h1 {
1823
2015
  [data-theme="dark"] .card {
1824
2016
  border-color: rgba(var(--starlight-rgb),0.12);
1825
2017
  box-shadow: 0 8px 20px rgba(0, 0, 0, 0.25);
1826
- backdrop-filter: blur(16px);
1827
- -webkit-backdrop-filter: blur(16px);
2018
+ /* No backdrop-filter: --card is 85% opaque so the blur showed through ~15%
2019
+ (near-invisible) yet forced every card to re-blur the animated starfield
2020
+ behind it on every frame — the page's biggest GPU cost. The opaque fill
2021
+ carries the surface; the starfield still animates in the gaps. */
1828
2022
  }
1829
2023
 
1830
- [data-theme="dark"] .card.type-epic {
2024
+ [data-theme="dark"] .card.type-epic,
2025
+ [data-theme="dark"] .card[data-variant="epic"] {
1831
2026
  border: 1.5px solid rgba(var(--starlight-rgb),0.4);
1832
2027
  box-shadow:
1833
2028
  inset 0 0 0 1px rgba(var(--cosmos-rgb),0.85),
@@ -1839,7 +2034,8 @@ h1 {
1839
2034
  rgba(var(--cosmos-rgb),0.92);
1840
2035
  }
1841
2036
 
1842
- [data-theme="dark"] .card.type-feature {
2037
+ [data-theme="dark"] .card.type-feature,
2038
+ [data-theme="dark"] .card[data-variant="feature"] {
1843
2039
  border: 1.5px solid rgba(var(--starlight-rgb),0.32);
1844
2040
  box-shadow:
1845
2041
  inset 0 0 0 1px rgba(var(--cosmos-rgb),0.85),
@@ -1851,7 +2047,8 @@ h1 {
1851
2047
  rgba(var(--cosmos-rgb),0.92);
1852
2048
  }
1853
2049
 
1854
- [data-theme="dark"] .card.type-task {
2050
+ [data-theme="dark"] .card.type-task,
2051
+ [data-theme="dark"] .card[data-variant="task"] {
1855
2052
  border: 1.5px solid rgba(var(--starlight-rgb),0.18);
1856
2053
  box-shadow:
1857
2054
  inset 0 0 0 1px rgba(var(--cosmos-rgb),0.85),
@@ -1863,7 +2060,8 @@ h1 {
1863
2060
  rgba(var(--cosmos-rgb),0.9);
1864
2061
  }
1865
2062
 
1866
- [data-theme="dark"] .card.type-bug {
2063
+ [data-theme="dark"] .card.type-bug,
2064
+ [data-theme="dark"] .card[data-variant="bug"] {
1867
2065
  border: 1.5px solid rgba(var(--coral-rgb),0.4);
1868
2066
  box-shadow:
1869
2067
  inset 0 0 0 1px rgba(var(--cosmos-rgb),0.85),
@@ -1879,7 +2077,8 @@ h1 {
1879
2077
  filter: brightness(1.06) drop-shadow(0 6px 14px rgba(var(--starlight-rgb),0.08));
1880
2078
  }
1881
2079
 
1882
- [data-theme="dark"] .card.selected {
2080
+ [data-theme="dark"] .card.selected,
2081
+ [data-theme="dark"] .card[data-selected] {
1883
2082
  outline-color: rgba(var(--starlight-rgb),0.3);
1884
2083
  }
1885
2084
 
@@ -1981,251 +2180,6 @@ h1 {
1981
2180
  border-color: rgba(var(--violet-rgb), 0.45);
1982
2181
  }
1983
2182
 
1984
- .card-expand-trigger--static {
1985
- cursor: url('cursors/live_arrow.cur'), default;
1986
- }
1987
-
1988
- .card-meta {
1989
- display: flex;
1990
- align-items: center;
1991
- gap: 0.75rem;
1992
- margin-top: 0.5rem;
1993
- }
1994
-
1995
- .ticket-number {
1996
- color: var(--orbit-text-muted);
1997
- font-size: 0.75rem;
1998
- font-weight: 800;
1999
- letter-spacing: 0.02em;
2000
- }
2001
-
2002
- [data-theme="dark"] .ticket-number {
2003
- color: var(--blue);
2004
- }
2005
-
2006
- .card-type-id {
2007
- display: inline-flex;
2008
- align-items: center;
2009
- gap: 0.35rem;
2010
- padding: 0.15rem 0.45rem;
2011
- border-radius: 4px;
2012
- background: rgba(var(--starlight-rgb),0.08);
2013
- border: 1px solid rgba(var(--starlight-rgb),0.12);
2014
- font-size: 0.68rem;
2015
- font-weight: 800;
2016
- color: var(--orbit-text-muted);
2017
- transition:
2018
- background 160ms ease,
2019
- border-color 160ms ease,
2020
- color 160ms ease;
2021
- }
2022
-
2023
- .card-type-id.type-pill-epic {
2024
- background: rgba(var(--purple-rgb),0.12);
2025
- border-color: rgba(var(--purple-rgb),0.25);
2026
- color: #c084fc;
2027
- }
2028
-
2029
- .card-type-id.type-pill-feature {
2030
- background: rgba(74, 222, 128, 0.1);
2031
- border-color: rgba(74, 222, 128, 0.2);
2032
- color: #4ade80;
2033
- }
2034
-
2035
- .card-type-id.type-pill-bug {
2036
- background: rgba(var(--coral-rgb),0.12);
2037
- border-color: rgba(var(--coral-rgb),0.25);
2038
- color: #f87171;
2039
- }
2040
-
2041
- .card-type-id.type-pill-task {
2042
- background: rgba(96, 165, 250, 0.1);
2043
- border-color: rgba(96, 165, 250, 0.2);
2044
- color: #60a5fa;
2045
- }
2046
-
2047
- .card-type-label {
2048
- text-transform: uppercase;
2049
- letter-spacing: 0.04em;
2050
- }
2051
-
2052
- /* Priority pill — same shape/scale as the Type pill so they read as a paired
2053
- set in the kanban card meta line and the detail-pane header subtitle. The
2054
- priority-pill-* classes (already defined for color) provide the fill, while
2055
- this rule pins the box geometry. */
2056
- .card-priority-id {
2057
- display: inline-flex;
2058
- align-items: center;
2059
- padding: 0.15rem 0.45rem;
2060
- border-radius: 4px;
2061
- border: 1px solid transparent;
2062
- font-size: 0.68rem;
2063
- font-weight: 800;
2064
- letter-spacing: 0.04em;
2065
- text-transform: uppercase;
2066
- }
2067
-
2068
- .card-priority-label {
2069
- line-height: 1;
2070
- }
2071
-
2072
- .card-type-icon {
2073
- width: 12px;
2074
- height: 12px;
2075
- stroke: currentColor;
2076
- fill: none;
2077
- stroke-width: 2.5;
2078
- stroke-linecap: round;
2079
- stroke-linejoin: round;
2080
- }
2081
-
2082
- .priority {
2083
- border-radius: 999px;
2084
- padding: 0.18rem 0.5rem;
2085
- background: rgba(var(--amber-rgb),0.12);
2086
- color: var(--accent-2);
2087
- font-weight: 800;
2088
- }
2089
-
2090
- /* --------- Priority pill colors (MAYBE → URGENT) ---------
2091
- Muted greys for MAYBE / LOW so they sit back, rising through amber to red for URGENT. */
2092
- .priority-pill {
2093
- letter-spacing: 0.04em;
2094
- font-size: 0.72rem;
2095
- }
2096
-
2097
- .priority-pill-maybe {
2098
- color: #6b7280;
2099
- background: rgba(100, 116, 139, 0.14);
2100
- }
2101
-
2102
- .priority-pill-low {
2103
- color: #1e6f5c;
2104
- background: rgba(var(--accent-rgb),0.14);
2105
- }
2106
-
2107
- .priority-pill-med {
2108
- color: #a4550f;
2109
- background: rgba(var(--amber-rgb),0.16);
2110
- }
2111
-
2112
- .priority-pill-high {
2113
- color: #b53a1a;
2114
- background: rgba(214, 86, 46, 0.2);
2115
- box-shadow: inset 0 0 0 1px rgba(214, 86, 46, 0.35);
2116
- }
2117
-
2118
- .priority-pill-urgent {
2119
- color: #fff;
2120
- background: linear-gradient(135deg, #c72e1a, #a0281a);
2121
- box-shadow: 0 0 0 1px rgba(var(--red-rgb),0.35), 0 4px 10px rgba(var(--red-rgb),0.3);
2122
- animation: urgentPulse 2.6s ease-in-out infinite;
2123
- }
2124
-
2125
- @keyframes urgentPulse {
2126
- 0%,
2127
- 100% {
2128
- box-shadow: 0 0 0 1px rgba(var(--red-rgb),0.35), 0 4px 10px rgba(var(--red-rgb),0.3);
2129
- }
2130
-
2131
- 50% {
2132
- box-shadow: 0 0 0 1px rgba(var(--red-rgb),0.55), 0 4px 14px rgba(199, 46, 26, 0.45);
2133
- }
2134
- }
2135
-
2136
- @media (prefers-reduced-motion: reduce) {
2137
- .priority-pill-urgent {
2138
- animation: none;
2139
- }
2140
- }
2141
-
2142
- [data-theme="dark"] .priority-pill-maybe {
2143
- color: rgba(255, 255, 255, 0.5);
2144
- background: rgba(255, 255, 255, 0.1);
2145
- }
2146
-
2147
- [data-theme="dark"] .priority-pill-low {
2148
- color: #4ade80;
2149
- background: rgba(74, 222, 128, 0.15);
2150
- }
2151
-
2152
- [data-theme="dark"] .priority-pill-med {
2153
- color: #fbbf24;
2154
- background: rgba(251, 191, 36, 0.18);
2155
- }
2156
-
2157
- [data-theme="dark"] .priority-pill-high {
2158
- color: #f87171;
2159
- background: rgba(var(--coral-rgb),0.2);
2160
- box-shadow: inset 0 0 0 1px rgba(var(--coral-rgb),0.35);
2161
- }
2162
-
2163
- [data-theme="dark"] .priority-pill-urgent {
2164
- background: linear-gradient(135deg, #dc2626, #991b1b);
2165
- }
2166
-
2167
- @media (prefers-reduced-motion: no-preference) {
2168
- [data-theme="dark"] .priority-pill-urgent {
2169
- box-shadow: 0 0 0 1px rgba(var(--coral-rgb),0.35), 0 4px 10px rgba(var(--coral-rgb),0.3);
2170
- }
2171
- }
2172
-
2173
- .card-expand-trigger {
2174
- display: flex;
2175
- align-items: center;
2176
- gap: 0.6rem;
2177
- width: 100%;
2178
- padding: 0.25rem 0.4rem;
2179
- margin: 0 -0.4rem;
2180
- border-radius: 8px;
2181
- border: none;
2182
- background: transparent;
2183
- color: inherit;
2184
- font: inherit;
2185
- cursor: url('cursors/live_link.cur'), pointer;
2186
- transition: background 160ms ease;
2187
- }
2188
-
2189
- .card-expand-trigger:not(.card-expand-trigger--static):hover {
2190
- background: rgba(var(--starlight-rgb),0.08);
2191
- }
2192
-
2193
- [data-theme="dark"] .card-meta,
2194
- [data-theme="dark"] .card-expand-trigger {
2195
- color: var(--orbit-text-muted);
2196
- }
2197
-
2198
- [data-theme="dark"] .card-expand-trigger:not(.card-expand-trigger--static):hover {
2199
- background: rgba(var(--starlight-rgb),0.1);
2200
- color: var(--orbit-text);
2201
- }
2202
-
2203
- .card-expandable {
2204
- display: none;
2205
- margin-top: 0.4rem;
2206
- }
2207
-
2208
- .card.is-expanded .card-expandable {
2209
- display: block;
2210
- }
2211
-
2212
- .card-expand-chevron {
2213
- width: 12px;
2214
- height: 12px;
2215
- margin-left: auto;
2216
- stroke: currentColor;
2217
- fill: none;
2218
- stroke-width: 2.5;
2219
- stroke-linecap: round;
2220
- stroke-linejoin: round;
2221
- transition: transform 180ms ease;
2222
- opacity: 0.6;
2223
- }
2224
-
2225
- .card.is-expanded .card-expand-chevron {
2226
- transform: rotate(180deg);
2227
- }
2228
-
2229
2183
  .card h3 {
2230
2184
  margin: 0 0 0.5rem;
2231
2185
  color: var(--orbit-text);
@@ -2236,25 +2190,6 @@ h1 {
2236
2190
  letter-spacing: -0.01em;
2237
2191
  }
2238
2192
 
2239
- .card p {
2240
- display: -webkit-box;
2241
- margin-top: 0.4rem;
2242
- overflow: hidden;
2243
- color: var(--muted);
2244
- font-size: 0.85rem;
2245
- line-height: 1.4;
2246
- -webkit-box-orient: vertical;
2247
- -webkit-line-clamp: 2;
2248
- }
2249
-
2250
- .parent-line,
2251
- .child-count {
2252
- margin-top: 0.4rem;
2253
- color: var(--blue);
2254
- font-size: 0.75rem;
2255
- font-weight: 800;
2256
- }
2257
-
2258
2193
  .labels {
2259
2194
  display: flex;
2260
2195
  flex-wrap: wrap;
@@ -2321,7 +2256,7 @@ h1 {
2321
2256
  flex-direction: column;
2322
2257
  overflow: hidden;
2323
2258
  border: 1px solid var(--line);
2324
- border-radius: 20px;
2259
+ border-radius: var(--radius-drawer);
2325
2260
  background: var(--drawer-bg);
2326
2261
  box-shadow: 0 24px 60px rgba(12, 18, 26, 0.28);
2327
2262
  transform: translateX(calc(100% + 1.5rem));
@@ -2339,8 +2274,8 @@ h1 {
2339
2274
  }
2340
2275
 
2341
2276
  @media (prefers-reduced-motion: reduce) {
2342
- .drawer,
2343
- .drawer-backdrop {
2277
+ :root:not([data-motion="full"]) .drawer,
2278
+ :root:not([data-motion="full"]) .drawer-backdrop {
2344
2279
  transition: none;
2345
2280
  }
2346
2281
  }
@@ -2490,33 +2425,33 @@ select.detail-meta-badge::-ms-expand {
2490
2425
  width: 6.55rem;
2491
2426
  }
2492
2427
 
2493
- .detail-state-badge.state-pill-ai-ready,
2494
- .search-hit-state.state-pill-ai-ready,
2495
- .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"] {
2496
2431
  color: #7c3aed;
2497
2432
  background-color: rgba(var(--purple-rgb), 0.12);
2498
2433
  border-color: rgba(var(--purple-rgb), 0.28);
2499
2434
  }
2500
2435
 
2501
- .detail-state-badge.state-pill-in-progress,
2502
- .search-hit-state.state-pill-in-progress,
2503
- .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"] {
2504
2439
  color: #0369a1;
2505
2440
  background-color: rgba(14, 165, 233, 0.13);
2506
2441
  border-color: rgba(14, 165, 233, 0.28);
2507
2442
  }
2508
2443
 
2509
- .detail-state-badge.state-pill-review,
2510
- .search-hit-state.state-pill-review,
2511
- .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"] {
2512
2447
  color: #a4550f;
2513
2448
  background-color: rgba(var(--amber-rgb), 0.16);
2514
2449
  border-color: rgba(var(--amber-rgb), 0.32);
2515
2450
  }
2516
2451
 
2517
- .detail-state-badge.state-pill-done,
2518
- .search-hit-state.state-pill-done,
2519
- .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"] {
2520
2455
  color: #1e6f5c;
2521
2456
  background-color: rgba(var(--accent-rgb), 0.14);
2522
2457
  border-color: rgba(var(--accent-rgb), 0.28);
@@ -2546,35 +2481,35 @@ select.detail-meta-badge::-ms-expand {
2546
2481
  border-color: rgba(var(--coral-rgb),0.3);
2547
2482
  }
2548
2483
 
2549
- .detail-priority-badge.priority-pill-maybe,
2550
- .detail-priority-badge.priority-pill-low,
2551
- .detail-priority-badge.priority-pill-med,
2552
- .detail-priority-badge.priority-pill-high,
2553
- .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"] {
2554
2489
  border-color: currentColor;
2555
2490
  }
2556
2491
 
2557
- .detail-priority-badge.priority-pill-maybe {
2492
+ .detail-priority-badge[data-variant="maybe"] {
2558
2493
  color: #6b7280;
2559
2494
  background-color: rgba(100, 116, 139, 0.14);
2560
2495
  }
2561
2496
 
2562
- .detail-priority-badge.priority-pill-low {
2497
+ .detail-priority-badge[data-variant="low"] {
2563
2498
  color: #1e6f5c;
2564
2499
  background-color: rgba(var(--accent-rgb), 0.14);
2565
2500
  }
2566
2501
 
2567
- .detail-priority-badge.priority-pill-med {
2502
+ .detail-priority-badge[data-variant="med"] {
2568
2503
  color: #a4550f;
2569
2504
  background-color: rgba(var(--amber-rgb), 0.16);
2570
2505
  }
2571
2506
 
2572
- .detail-priority-badge.priority-pill-high {
2507
+ .detail-priority-badge[data-variant="high"] {
2573
2508
  color: #b53a1a;
2574
2509
  background-color: rgba(214, 86, 46, 0.2);
2575
2510
  }
2576
2511
 
2577
- .detail-priority-badge.priority-pill-urgent {
2512
+ .detail-priority-badge[data-variant="urgent"] {
2578
2513
  color: #fff;
2579
2514
  background-color: #b91c1c;
2580
2515
  }
@@ -2598,33 +2533,33 @@ select.detail-meta-badge::-ms-expand {
2598
2533
  border-color: rgba(147, 197, 253, 0.3);
2599
2534
  }
2600
2535
 
2601
- [data-theme="dark"] .detail-state-badge.state-pill-ai-ready,
2602
- [data-theme="dark"] .search-hit-state.state-pill-ai-ready,
2603
- [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"] {
2604
2539
  color: #c084fc;
2605
2540
  background-color: rgba(var(--purple-rgb), 0.16);
2606
2541
  border-color: rgba(var(--purple-rgb), 0.35);
2607
2542
  }
2608
2543
 
2609
- [data-theme="dark"] .detail-state-badge.state-pill-in-progress,
2610
- [data-theme="dark"] .search-hit-state.state-pill-in-progress,
2611
- [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"] {
2612
2547
  color: #67e8f9;
2613
2548
  background-color: rgba(14, 165, 233, 0.16);
2614
2549
  border-color: rgba(103, 232, 249, 0.32);
2615
2550
  }
2616
2551
 
2617
- [data-theme="dark"] .detail-state-badge.state-pill-review,
2618
- [data-theme="dark"] .search-hit-state.state-pill-review,
2619
- [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"] {
2620
2555
  color: #fbbf24;
2621
2556
  background-color: rgba(251, 191, 36, 0.18);
2622
2557
  border-color: rgba(251, 191, 36, 0.35);
2623
2558
  }
2624
2559
 
2625
- [data-theme="dark"] .detail-state-badge.state-pill-done,
2626
- [data-theme="dark"] .search-hit-state.state-pill-done,
2627
- [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"] {
2628
2563
  color: #4ade80;
2629
2564
  background-color: rgba(74, 222, 128, 0.15);
2630
2565
  border-color: rgba(74, 222, 128, 0.32);
@@ -2642,27 +2577,27 @@ select.detail-meta-badge::-ms-expand {
2642
2577
  color: #f87171;
2643
2578
  }
2644
2579
 
2645
- [data-theme="dark"] .detail-priority-badge.priority-pill-maybe {
2580
+ [data-theme="dark"] .detail-priority-badge[data-variant="maybe"] {
2646
2581
  color: rgba(255, 255, 255, 0.62);
2647
2582
  background-color: rgba(255, 255, 255, 0.1);
2648
2583
  }
2649
2584
 
2650
- [data-theme="dark"] .detail-priority-badge.priority-pill-low {
2585
+ [data-theme="dark"] .detail-priority-badge[data-variant="low"] {
2651
2586
  color: #4ade80;
2652
2587
  background-color: rgba(74, 222, 128, 0.15);
2653
2588
  }
2654
2589
 
2655
- [data-theme="dark"] .detail-priority-badge.priority-pill-med {
2590
+ [data-theme="dark"] .detail-priority-badge[data-variant="med"] {
2656
2591
  color: #fbbf24;
2657
2592
  background-color: rgba(251, 191, 36, 0.18);
2658
2593
  }
2659
2594
 
2660
- [data-theme="dark"] .detail-priority-badge.priority-pill-high {
2595
+ [data-theme="dark"] .detail-priority-badge[data-variant="high"] {
2661
2596
  color: #f87171;
2662
2597
  background-color: rgba(var(--coral-rgb), 0.2);
2663
2598
  }
2664
2599
 
2665
- [data-theme="dark"] .detail-priority-badge.priority-pill-urgent {
2600
+ [data-theme="dark"] .detail-priority-badge[data-variant="urgent"] {
2666
2601
  color: #fff;
2667
2602
  background-color: #991b1b;
2668
2603
  }
@@ -2719,13 +2654,16 @@ select.detail-meta-badge::-ms-expand {
2719
2654
  display: none;
2720
2655
  }
2721
2656
 
2722
- .drawer-tab {
2657
+ .drawer-tab,
2658
+ button.drawer-tab {
2723
2659
  flex-shrink: 0;
2660
+ min-height: 0;
2724
2661
  padding: 0.38rem 0.78rem;
2725
2662
  border: 1px solid transparent;
2726
- border-radius: 999px;
2663
+ border-radius: var(--radius-control);
2727
2664
  background: transparent;
2728
2665
  color: var(--muted);
2666
+ box-shadow: none;
2729
2667
  font: inherit;
2730
2668
  font-size: 0.78rem;
2731
2669
  font-weight: 700;
@@ -2737,28 +2675,46 @@ select.detail-meta-badge::-ms-expand {
2737
2675
  border-color 140ms ease;
2738
2676
  }
2739
2677
 
2740
- .drawer-tab:hover {
2678
+ .drawer-tab:hover,
2679
+ button.drawer-tab:hover {
2680
+ transform: none;
2681
+ filter: none;
2741
2682
  color: var(--ink);
2742
2683
  background: var(--accent-hover);
2684
+ box-shadow: none;
2743
2685
  }
2744
2686
 
2745
- .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"] {
2746
2691
  color: var(--ink);
2747
2692
  background: var(--accent-active);
2748
2693
  border-color: var(--accent-border);
2694
+ box-shadow: none;
2695
+ }
2696
+
2697
+ button.drawer-tab::after {
2698
+ content: none;
2699
+ display: none;
2749
2700
  }
2750
2701
 
2751
2702
  .drawer-close,
2752
- .drawer-archive {
2703
+ .drawer-archive,
2704
+ button.drawer-close,
2705
+ button.drawer-archive {
2753
2706
  display: inline-grid;
2754
2707
  place-items: center;
2755
2708
  width: 2rem;
2756
2709
  height: 2rem;
2710
+ min-width: 0;
2711
+ min-height: 0;
2757
2712
  padding: 0;
2758
2713
  border: 1px solid var(--line);
2759
- border-radius: 10px;
2714
+ border-radius: var(--radius-control);
2760
2715
  background: var(--surface);
2761
2716
  color: var(--ink);
2717
+ box-shadow: none;
2762
2718
  cursor: url('cursors/live_link.cur'), pointer;
2763
2719
  }
2764
2720
 
@@ -2769,19 +2725,33 @@ select.detail-meta-badge::-ms-expand {
2769
2725
  line-height: 1;
2770
2726
  }
2771
2727
 
2772
- .drawer-close:hover {
2728
+ .drawer-close:hover,
2729
+ button.drawer-close:hover {
2730
+ transform: none;
2731
+ filter: none;
2773
2732
  background: var(--accent-hover);
2774
2733
  border-color: var(--accent-border);
2734
+ box-shadow: none;
2775
2735
  }
2776
2736
 
2777
2737
  .drawer-archive {
2778
2738
  grid-area: archive;
2779
2739
  }
2780
2740
 
2781
- .drawer-archive:hover {
2741
+ .drawer-archive:hover,
2742
+ button.drawer-archive:hover {
2743
+ transform: none;
2744
+ filter: none;
2782
2745
  background: var(--accent-hover);
2783
2746
  border-color: var(--accent-border);
2784
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;
2785
2755
  }
2786
2756
 
2787
2757
  .drawer-archive[hidden] {
@@ -3368,10 +3338,13 @@ input.meta-inline {
3368
3338
  border-color: rgba(var(--starlight-rgb),0.22);
3369
3339
  }
3370
3340
 
3371
- .label-pill-remove {
3341
+ .label-pill-remove,
3342
+ button.label-pill-remove {
3372
3343
  display: inline-grid;
3373
3344
  width: 1.35rem;
3374
3345
  height: 1.35rem;
3346
+ min-width: 0;
3347
+ min-height: 0;
3375
3348
  place-items: center;
3376
3349
  padding: 0;
3377
3350
  border: 0;
@@ -3384,8 +3357,17 @@ input.meta-inline {
3384
3357
  transition: background 120ms ease;
3385
3358
  }
3386
3359
 
3387
- .label-pill-remove:hover {
3360
+ .label-pill-remove:hover,
3361
+ button.label-pill-remove:hover {
3362
+ transform: none;
3363
+ filter: none;
3388
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;
3389
3371
  }
3390
3372
 
3391
3373
  .label-pill-removable .label-pill-remove {
@@ -3671,16 +3653,13 @@ details.section > summary .mcp-title-row {
3671
3653
  min-height: 2rem;
3672
3654
  }
3673
3655
 
3674
- /* Board Notes is the long-form home for project guidance; reserve a textarea
3675
- sized landing area so it doesn't collapse to a one-liner when empty. */
3676
- .settings-notes-body {
3656
+ /* Long-form settings fields reserve textarea-sized landing areas so they don't
3657
+ collapse to one-liners when empty. */
3658
+ .settings-notes-body,
3659
+ .settings-agent-instructions-body {
3677
3660
  min-height: 11rem;
3678
3661
  }
3679
3662
 
3680
- .ai-context-setup textarea[name="agent_instructions"] {
3681
- min-height: 9rem;
3682
- }
3683
-
3684
3663
  .ai-context-setup > .description {
3685
3664
  margin-bottom: 0.7rem;
3686
3665
  }
@@ -3759,7 +3738,7 @@ details.section > summary .mcp-title-row {
3759
3738
  background: var(--danger);
3760
3739
  }
3761
3740
 
3762
- .repository-danger-zone button.ghost.danger-button {
3741
+ .repository-danger-zone button[data-variant="ghost"].danger-button {
3763
3742
  color: var(--danger);
3764
3743
  background: rgba(var(--red-rgb),0.06);
3765
3744
  }
@@ -3798,7 +3777,7 @@ details.section > summary .mcp-title-row {
3798
3777
  }
3799
3778
 
3800
3779
  [data-theme="dark"] .repository-danger-zone h3,
3801
- [data-theme="dark"] .repository-danger-zone button.ghost.danger-button {
3780
+ [data-theme="dark"] .repository-danger-zone button[data-variant="ghost"].danger-button {
3802
3781
  color: #ffb4b4;
3803
3782
  }
3804
3783
 
@@ -3807,7 +3786,7 @@ details.section > summary .mcp-title-row {
3807
3786
  background: linear-gradient(135deg, rgba(127, 29, 29, 0.92), rgba(153, 27, 27, 0.88));
3808
3787
  }
3809
3788
 
3810
- [data-theme="dark"] .repository-danger-zone button.ghost.danger-button {
3789
+ [data-theme="dark"] .repository-danger-zone button[data-variant="ghost"].danger-button {
3811
3790
  background: rgba(var(--coral-rgb),0.1);
3812
3791
  }
3813
3792
 
@@ -4596,39 +4575,10 @@ details.section > summary .mcp-title-row {
4596
4575
  font-size: 0.82rem;
4597
4576
  }
4598
4577
 
4599
- .import-button {
4600
- display: flex;
4601
- }
4602
-
4603
- .import-button input {
4578
+ .import-file-input {
4604
4579
  display: none;
4605
4580
  }
4606
4581
 
4607
- .import-button span {
4608
- display: inline-grid;
4609
- width: 100%;
4610
- place-items: center;
4611
- border: 1px solid var(--line);
4612
- border-radius: 999px;
4613
- padding: 0.72rem 1rem;
4614
- color: var(--ink);
4615
- background: var(--surface);
4616
- cursor: url('cursors/live_link.cur'), pointer;
4617
- transition:
4618
- transform 150ms ease,
4619
- box-shadow 150ms ease,
4620
- background 150ms ease;
4621
- }
4622
-
4623
- .import-button span:hover {
4624
- transform: translateY(-1px);
4625
- box-shadow: var(--btn-hover-shadow);
4626
- }
4627
-
4628
- [data-theme="dark"] .import-button span:hover {
4629
- box-shadow: 0 10px 24px rgba(0, 0, 0, 0.35);
4630
- }
4631
-
4632
4582
  .lane-row {
4633
4583
  display: grid;
4634
4584
  grid-template-columns: 2rem 2rem minmax(6rem, 1fr) minmax(5.5rem, 7rem) 2rem 2rem;
@@ -4661,18 +4611,24 @@ details.section > summary .mcp-title-row {
4661
4611
 
4662
4612
  /* Shared 2rem square chrome for every in-row lane control (up, down, toggle,
4663
4613
  delete) — keeps the row rhythm tight and matches the drawer's X close. */
4664
- .lane-icon-btn,
4665
- .lane-delete-btn,
4666
- .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 {
4667
4620
  display: inline-grid;
4668
4621
  place-items: center;
4669
4622
  width: 2rem;
4670
4623
  height: 2rem;
4624
+ min-width: 0;
4625
+ min-height: 0;
4671
4626
  padding: 0;
4672
4627
  border: 1px solid var(--line);
4673
4628
  border-radius: 10px;
4674
4629
  background: var(--surface);
4675
4630
  color: var(--muted);
4631
+ box-shadow: none;
4676
4632
  font-family: inherit;
4677
4633
  line-height: 1;
4678
4634
  cursor: url('cursors/live_link.cur'), pointer;
@@ -4683,68 +4639,84 @@ details.section > summary .mcp-title-row {
4683
4639
  box-shadow 200ms ease;
4684
4640
  }
4685
4641
 
4686
- .lane-icon-btn {
4642
+ .settings-lane-icon-btn {
4687
4643
  font-size: 1rem;
4688
4644
  }
4689
4645
 
4690
- .lane-icon-btn:hover:not(:disabled),
4691
- .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;
4692
4652
  color: var(--ink);
4693
4653
  border-color: var(--accent-border);
4694
4654
  background: var(--accent-hover);
4655
+ box-shadow: none;
4695
4656
  }
4696
4657
 
4697
- .lane-delete-btn {
4658
+ .settings-lane-delete-btn {
4698
4659
  font-size: 1.2rem;
4699
4660
  }
4700
4661
 
4701
- .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;
4702
4666
  color: var(--danger);
4703
4667
  border-color: rgba(var(--red-rgb),0.38);
4704
4668
  background: rgba(var(--red-rgb),0.08);
4669
+ box-shadow: none;
4705
4670
  }
4706
4671
 
4707
- .lane-icon-btn:disabled,
4708
- .lane-delete-btn:disabled {
4672
+ .settings-lane-icon-btn:disabled,
4673
+ .settings-lane-delete-btn:disabled {
4709
4674
  opacity: 0.38;
4710
4675
  cursor: url('cursors/live_unavail.cur'), not-allowed;
4711
4676
  }
4712
4677
 
4713
- [data-theme="dark"] .lane-icon-btn,
4714
- [data-theme="dark"] .lane-delete-btn,
4715
- [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 {
4716
4681
  background: rgba(var(--starlight-rgb),0.07);
4717
4682
  border-color: rgba(var(--starlight-rgb),0.24);
4718
4683
  color: rgba(226, 236, 255, 0.92);
4719
4684
  }
4720
4685
 
4721
- [data-theme="dark"] .lane-icon-btn:hover:not(:disabled),
4722
- [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) {
4723
4688
  background: rgba(var(--starlight-rgb),0.16);
4724
4689
  border-color: rgba(var(--starlight-rgb),0.6);
4725
4690
  color: #fff;
4726
4691
  box-shadow: 0 0 14px rgba(var(--starlight-rgb),0.3);
4727
4692
  }
4728
4693
 
4729
- [data-theme="dark"] .lane-delete-btn:hover:not(:disabled) {
4694
+ [data-theme="dark"] .settings-lane-delete-btn:hover:not(:disabled) {
4730
4695
  background: rgba(var(--coral-rgb),0.14);
4731
4696
  border-color: rgba(var(--coral-rgb),0.6);
4732
4697
  color: #ffb4b4;
4733
4698
  box-shadow: 0 0 14px rgba(var(--coral-rgb),0.3);
4734
4699
  }
4735
4700
 
4736
- [data-theme="dark"] .lane-icon-btn:disabled,
4737
- [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 {
4738
4703
  color: rgba(226, 236, 255, 0.35);
4739
4704
  background: rgba(var(--starlight-rgb),0.035);
4740
4705
  border-color: rgba(var(--starlight-rgb),0.12);
4741
4706
  box-shadow: none;
4742
4707
  }
4743
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
+
4744
4716
  /* New-cards-default toggle — sun metaphor: a hollow ring when off (like an
4745
4717
  unselected radio button), a glowing warm disc with an amber halo when on.
4746
4718
  Tiny "NEW" caption underneath so the purpose is always readable. */
4747
- .lane-new-toggle {
4719
+ .settings-lane-new-toggle {
4748
4720
  grid-template-rows: auto auto;
4749
4721
  gap: 0.08rem;
4750
4722
  padding: 0.22rem 0;
@@ -4775,7 +4747,7 @@ details.section > summary .mcp-title-row {
4775
4747
  /* "New cards land here" toggle — Epic-card palette to match the .btn-sun CTA.
4776
4748
  Light: teal border + amber inner ring + teal halo, with a teal glowing
4777
4749
  center dot. Dark: starlight-blue + violet inner ring, with a starlight dot. */
4778
- .lane-new-toggle.is-on {
4750
+ .settings-lane-new-toggle.is-on {
4779
4751
  border-color: rgba(var(--accent-rgb),0.55);
4780
4752
  background:
4781
4753
  linear-gradient(135deg, rgba(var(--accent-rgb),0.16), rgba(var(--amber-rgb),0.1) 55%, rgba(var(--paper-rgb),0) 100%),
@@ -4786,7 +4758,7 @@ details.section > summary .mcp-title-row {
4786
4758
  0 4px 12px rgba(var(--accent-rgb),0.2);
4787
4759
  }
4788
4760
 
4789
- .lane-new-toggle.is-on .lane-new-sun {
4761
+ .settings-lane-new-toggle.is-on .lane-new-sun {
4790
4762
  border-color: transparent;
4791
4763
  background: radial-gradient(circle at 38% 38%, #d6efe9 0%, #14a094 50%, var(--teal-deep) 100%);
4792
4764
  box-shadow:
@@ -4794,12 +4766,12 @@ details.section > summary .mcp-title-row {
4794
4766
  0 0 8px rgba(var(--accent-rgb),0.55);
4795
4767
  }
4796
4768
 
4797
- .lane-new-toggle.is-on .lane-new-label {
4769
+ .settings-lane-new-toggle.is-on .lane-new-label {
4798
4770
  color: var(--teal-deep);
4799
4771
  font-weight: 900;
4800
4772
  }
4801
4773
 
4802
- [data-theme="dark"] .lane-new-toggle.is-on {
4774
+ [data-theme="dark"] .settings-lane-new-toggle.is-on {
4803
4775
  border-color: rgba(var(--starlight-rgb),0.5);
4804
4776
  background:
4805
4777
  linear-gradient(135deg, rgba(var(--cyan-rgb),0.14), rgba(var(--indigo-rgb),0.1) 55%, rgba(var(--cosmos-rgb),0) 100%),
@@ -4810,32 +4782,40 @@ details.section > summary .mcp-title-row {
4810
4782
  0 4px 16px rgba(var(--void-rgb),0.42);
4811
4783
  }
4812
4784
 
4813
- [data-theme="dark"] .lane-new-toggle.is-on .lane-new-sun {
4785
+ [data-theme="dark"] .settings-lane-new-toggle.is-on .lane-new-sun {
4814
4786
  background: radial-gradient(circle at 38% 38%, #d8e3ff 0%, #a8c0ff 50%, #5d77b8 100%);
4815
4787
  box-shadow:
4816
4788
  0 0 3px rgba(var(--starlight-rgb),0.95),
4817
4789
  0 0 9px rgba(var(--starlight-rgb),0.6);
4818
4790
  }
4819
4791
 
4820
- [data-theme="dark"] .lane-new-toggle.is-on .lane-new-label {
4792
+ [data-theme="dark"] .settings-lane-new-toggle.is-on .lane-new-label {
4821
4793
  color: #d2deff;
4822
4794
  }
4823
4795
 
4824
- .icon-button {
4796
+ .icon-button,
4797
+ button.icon-button {
4825
4798
  display: inline-grid;
4826
4799
  width: 2.35rem;
4827
4800
  height: 2.35rem;
4801
+ min-width: 0;
4802
+ min-height: 0;
4828
4803
  place-items: center;
4829
4804
  border-radius: 999px;
4830
4805
  padding: 0;
4806
+ box-shadow: none;
4807
+ }
4808
+
4809
+ button.icon-button::after {
4810
+ content: none;
4811
+ display: none;
4831
4812
  }
4832
4813
 
4833
4814
  .danger-button {
4834
4815
  color: var(--danger);
4835
4816
  }
4836
4817
 
4837
- button:disabled,
4838
- .import-button input:disabled + span {
4818
+ button:disabled {
4839
4819
  cursor: url('cursors/live_unavail.cur'), not-allowed;
4840
4820
  opacity: 0.45;
4841
4821
  }
@@ -4908,12 +4888,15 @@ button:disabled,
4908
4888
  text-transform: uppercase;
4909
4889
  }
4910
4890
 
4911
- .card-detach-btn {
4891
+ .card-detach-btn,
4892
+ button.card-detach-btn {
4912
4893
  position: absolute;
4913
4894
  top: 0.35rem;
4914
4895
  right: 0.35rem;
4915
4896
  width: 1.4rem;
4916
4897
  height: 1.4rem;
4898
+ min-width: 0;
4899
+ min-height: 0;
4917
4900
  display: inline-grid;
4918
4901
  place-items: center;
4919
4902
  padding: 0;
@@ -4929,10 +4912,19 @@ button:disabled,
4929
4912
  z-index: 2;
4930
4913
  }
4931
4914
 
4932
- .card-detach-btn:hover {
4915
+ .card-detach-btn:hover,
4916
+ button.card-detach-btn:hover {
4917
+ transform: none;
4918
+ filter: none;
4933
4919
  opacity: 1;
4934
4920
  background: rgba(var(--red-rgb),0.18);
4935
4921
  color: var(--ink);
4922
+ box-shadow: none;
4923
+ }
4924
+
4925
+ button.card-detach-btn::after {
4926
+ content: none;
4927
+ display: none;
4936
4928
  }
4937
4929
 
4938
4930
  .card-archive-actions {
@@ -4944,9 +4936,12 @@ button:disabled,
4944
4936
  z-index: 2;
4945
4937
  }
4946
4938
 
4947
- .card-archive-btn {
4939
+ .card-archive-btn,
4940
+ button.card-archive-btn {
4948
4941
  width: 1.6rem;
4949
4942
  height: 1.6rem;
4943
+ min-width: 0;
4944
+ min-height: 0;
4950
4945
  display: inline-grid;
4951
4946
  place-items: center;
4952
4947
  padding: 0;
@@ -4959,20 +4954,31 @@ button:disabled,
4959
4954
  transition: opacity 120ms ease, background 120ms ease, color 120ms ease;
4960
4955
  }
4961
4956
 
4962
- .card-archive-btn:hover {
4957
+ .card-archive-btn:hover,
4958
+ button.card-archive-btn:hover {
4959
+ transform: none;
4960
+ filter: none;
4963
4961
  opacity: 1;
4962
+ box-shadow: none;
4964
4963
  }
4965
4964
 
4966
- .card-archive-btn--restore:hover {
4965
+ .card-archive-btn--restore:hover,
4966
+ button.card-archive-btn--restore:hover {
4967
4967
  background: rgba(var(--green-rgb, 34, 197, 94), 0.2);
4968
4968
  color: var(--ink);
4969
4969
  }
4970
4970
 
4971
- .card-archive-btn--delete:hover {
4971
+ .card-archive-btn--delete:hover,
4972
+ button.card-archive-btn--delete:hover {
4972
4973
  background: rgba(var(--red-rgb), 0.22);
4973
4974
  color: var(--ink);
4974
4975
  }
4975
4976
 
4977
+ button.card-archive-btn::after {
4978
+ content: none;
4979
+ display: none;
4980
+ }
4981
+
4976
4982
  .archive-list {
4977
4983
  min-height: 4rem;
4978
4984
  }
@@ -5003,7 +5009,8 @@ button:disabled,
5003
5009
  display: none !important;
5004
5010
  }
5005
5011
 
5006
- .related-add-clear {
5012
+ .related-add-clear,
5013
+ button.related-add-clear {
5007
5014
  position: absolute;
5008
5015
  top: 50%;
5009
5016
  right: 0.4rem;
@@ -5011,6 +5018,8 @@ button:disabled,
5011
5018
  display: none;
5012
5019
  width: 1.4rem;
5013
5020
  height: 1.4rem;
5021
+ min-width: 0;
5022
+ min-height: 0;
5014
5023
  padding: 0;
5015
5024
  border: 0;
5016
5025
  border-radius: 999px;
@@ -5022,12 +5031,20 @@ button:disabled,
5022
5031
  cursor: url('cursors/live_link.cur'), pointer;
5023
5032
  }
5024
5033
 
5025
- .related-add-clear:hover {
5034
+ .related-add-clear:hover,
5035
+ button.related-add-clear:hover {
5026
5036
  background: rgba(var(--red-rgb),0.18);
5027
5037
  color: var(--ink);
5038
+ filter: none;
5039
+ box-shadow: none;
5028
5040
  transform: translateY(-50%);
5029
5041
  }
5030
5042
 
5043
+ button.related-add-clear::after {
5044
+ content: none;
5045
+ display: none;
5046
+ }
5047
+
5031
5048
  .related-add-row.has-value .related-add-clear {
5032
5049
  display: inline-grid;
5033
5050
  place-items: center;
@@ -5113,29 +5130,42 @@ button:disabled,
5113
5130
  min-width: 0;
5114
5131
  }
5115
5132
 
5116
- .toast-close {
5133
+ .toast-close,
5134
+ button.toast-close {
5117
5135
  flex-shrink: 0;
5118
5136
  width: 1.25rem;
5119
5137
  height: 1.25rem;
5120
- display: flex;
5121
- align-items: center;
5122
- justify-content: center;
5138
+ min-width: 0;
5139
+ min-height: 0;
5140
+ display: inline-grid;
5141
+ place-items: center;
5123
5142
  padding: 0;
5124
5143
  border: none;
5125
5144
  border-radius: 50%;
5126
5145
  background: transparent;
5127
5146
  color: inherit;
5147
+ box-shadow: none;
5128
5148
  opacity: 0.45;
5129
5149
  cursor: url('cursors/live_link.cur'), pointer;
5150
+ font-family: inherit;
5130
5151
  font-size: 1rem;
5131
5152
  line-height: 1;
5132
5153
  transition: opacity 150ms;
5133
5154
  }
5134
5155
 
5135
- .toast-close:hover {
5156
+ .toast-close:hover,
5157
+ button.toast-close:hover {
5158
+ transform: none;
5159
+ filter: none;
5160
+ box-shadow: none;
5136
5161
  opacity: 0.85;
5137
5162
  }
5138
5163
 
5164
+ button.toast-close::after {
5165
+ content: none;
5166
+ display: none;
5167
+ }
5168
+
5139
5169
  /* Type variants — light mode */
5140
5170
  .toast-info {
5141
5171
  background: #f0f4ff;
@@ -5170,8 +5200,8 @@ button:disabled,
5170
5200
  .toast-error .toast-icon { color: #ef4444; }
5171
5201
 
5172
5202
  @media (prefers-reduced-motion: reduce) {
5173
- .toast-enter { animation: none; opacity: 1; transform: none; }
5174
- .toast-exit { animation: none; }
5203
+ :root:not([data-motion="full"]) .toast-enter { animation: none; opacity: 1; transform: none; }
5204
+ :root:not([data-motion="full"]) .toast-exit { animation: none; }
5175
5205
  }
5176
5206
 
5177
5207
  [data-theme="dark"] .toast {
@@ -5332,8 +5362,8 @@ button:disabled,
5332
5362
  }
5333
5363
 
5334
5364
  @media (prefers-reduced-motion: reduce) {
5335
- .orbit-dialog,
5336
- .orbit-dialog::backdrop {
5365
+ :root:not([data-motion="full"]) .orbit-dialog,
5366
+ :root:not([data-motion="full"]) .orbit-dialog::backdrop {
5337
5367
  animation: none;
5338
5368
  }
5339
5369
  }
@@ -5669,40 +5699,75 @@ button:disabled,
5669
5699
  }
5670
5700
  }
5671
5701
 
5702
+ /* Reduced motion — Starscape v3 `data-motion` contract (migrated from the
5703
+ * legacy `data-reduced-motion="reduce|allow"`):
5704
+ * • OS path: reduce when the OS asks, unless the user forces full motion.
5705
+ * • Explicit path: `data-motion="reduce"` reduces regardless of OS.
5706
+ * • `data-motion="full"` opts out of the OS path (full motion even on OS reduce). */
5672
5707
  @media (prefers-reduced-motion: reduce) {
5673
- [data-theme="dark"] .starfield,
5674
- [data-theme="dark"] .milky-way,
5675
- [data-theme="dark"] .grain::before,
5676
- [data-theme="dark"] .grain::after,
5677
- [data-theme="dark"] .signature-star {
5708
+ :root:not([data-motion="full"]) *,
5709
+ :root:not([data-motion="full"]) *::before,
5710
+ :root:not([data-motion="full"]) *::after {
5711
+ scroll-behavior: auto !important;
5712
+ transition-duration: 0.01ms !important;
5713
+ animation-duration: 0.01ms !important;
5714
+ animation-iteration-count: 1 !important;
5715
+ }
5716
+
5717
+ :root:not([data-motion="full"])[data-theme="dark"] .starfield,
5718
+ :root:not([data-motion="full"])[data-theme="dark"] .milky-way,
5719
+ :root:not([data-motion="full"])[data-theme="dark"] .grain::before,
5720
+ :root:not([data-motion="full"])[data-theme="dark"] .grain::after,
5721
+ :root:not([data-motion="full"])[data-theme="dark"] .signature-star {
5678
5722
  animation: none;
5679
5723
  }
5680
- [data-theme="dark"] .meteor {
5724
+
5725
+ :root:not([data-motion="full"])[data-theme="dark"] .meteor {
5681
5726
  display: none;
5682
5727
  }
5683
5728
  }
5684
5729
 
5685
- [data-reduced-motion="reduce"] *,
5686
- [data-reduced-motion="reduce"] *::before,
5687
- [data-reduced-motion="reduce"] *::after {
5730
+ [data-motion="reduce"] *,
5731
+ [data-motion="reduce"] *::before,
5732
+ [data-motion="reduce"] *::after {
5688
5733
  scroll-behavior: auto !important;
5689
5734
  transition-duration: 0.01ms !important;
5690
5735
  animation-duration: 0.01ms !important;
5691
5736
  animation-iteration-count: 1 !important;
5692
5737
  }
5693
5738
 
5694
- [data-reduced-motion="reduce"][data-theme="dark"] .starfield,
5695
- [data-reduced-motion="reduce"][data-theme="dark"] .milky-way,
5696
- [data-reduced-motion="reduce"][data-theme="dark"] .grain::before,
5697
- [data-reduced-motion="reduce"][data-theme="dark"] .grain::after,
5698
- [data-reduced-motion="reduce"][data-theme="dark"] .signature-star {
5739
+ [data-motion="reduce"][data-theme="dark"] .starfield,
5740
+ [data-motion="reduce"][data-theme="dark"] .milky-way,
5741
+ [data-motion="reduce"][data-theme="dark"] .grain::before,
5742
+ [data-motion="reduce"][data-theme="dark"] .grain::after,
5743
+ [data-motion="reduce"][data-theme="dark"] .signature-star {
5699
5744
  animation: none;
5700
5745
  }
5701
5746
 
5702
- [data-reduced-motion="reduce"][data-theme="dark"] .meteor {
5747
+ [data-motion="reduce"][data-theme="dark"] .meteor {
5703
5748
  display: none;
5704
5749
  }
5705
5750
 
5751
+ /* Empty-lane icon micro-motion — a low-amplitude exception to the OS reduced-
5752
+ * motion reset above. These are small (64px), slow, localized loops, not the
5753
+ * large-area/parallax motion that triggers vestibular discomfort, so they
5754
+ * survive an *OS-level* reduced-motion preference. They are still fully stopped
5755
+ * by an *explicit* in-app choice (data-motion="reduce") — a deliberate "calm it
5756
+ * down" wins over the ambient OS default. The !important + selector specificity
5757
+ * is what overrides the universal `* { animation-duration: 0.01ms !important }`
5758
+ * reset for just these elements. */
5759
+ @media (prefers-reduced-motion: reduce) {
5760
+ :root:not([data-motion="reduce"]) .empty-state-icon.star {
5761
+ animation: star-pulse 4s ease-in-out infinite !important;
5762
+ }
5763
+ :root:not([data-motion="reduce"]) .empty-state-icon.ai-sparkle {
5764
+ animation: ai-float 6s ease-in-out infinite !important;
5765
+ }
5766
+ :root:not([data-motion="reduce"]) .empty-state-icon.orbit .satellite {
5767
+ animation: orbit-rotate 10s linear infinite !important;
5768
+ }
5769
+ }
5770
+
5706
5771
  [data-theme="dark"] {
5707
5772
  /* Tells the browser to render native widgets (dropdowns, scrollbars,
5708
5773
  date pickers, etc.) in their dark variant so option popups match. */
@@ -5890,13 +5955,16 @@ button:disabled,
5890
5955
  font-size: 0.72rem;
5891
5956
  }
5892
5957
 
5893
- .attachment-delete {
5958
+ .attachment-delete,
5959
+ button.attachment-delete {
5894
5960
  position: absolute;
5895
5961
  right: 0.45rem;
5896
5962
  bottom: 0.45rem;
5897
5963
  display: inline-grid;
5898
5964
  width: 1.45rem;
5899
5965
  height: 1.45rem;
5966
+ min-width: 0;
5967
+ min-height: 0;
5900
5968
  place-items: center;
5901
5969
  padding: 0;
5902
5970
  border: 1px solid var(--line);
@@ -5906,10 +5974,19 @@ button:disabled,
5906
5974
  cursor: url('cursors/live_link.cur'), pointer;
5907
5975
  }
5908
5976
 
5909
- .attachment-delete:hover {
5977
+ .attachment-delete:hover,
5978
+ button.attachment-delete:hover {
5979
+ transform: none;
5980
+ filter: none;
5910
5981
  color: var(--danger, #d44);
5911
5982
  border-color: rgba(var(--red-rgb),0.35);
5912
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;
5913
5990
  }
5914
5991
 
5915
5992
  .attachment-lightbox {
@@ -5945,14 +6022,18 @@ button:disabled,
5945
6022
  text-align: center;
5946
6023
  }
5947
6024
 
5948
- .attachment-lightbox-close {
6025
+ .attachment-lightbox-close,
6026
+ button.attachment-lightbox-close {
5949
6027
  position: absolute;
5950
6028
  top: -0.75rem;
5951
6029
  right: -0.75rem;
5952
6030
  display: inline-grid;
5953
6031
  width: 2.2rem;
5954
6032
  height: 2.2rem;
6033
+ min-width: 0;
6034
+ min-height: 0;
5955
6035
  place-items: center;
6036
+ padding: 0;
5956
6037
  border: 1px solid rgba(255,255,255,0.25);
5957
6038
  border-radius: 999px;
5958
6039
  background: rgba(15, 23, 42, 0.92);
@@ -5960,3 +6041,15 @@ button:disabled,
5960
6041
  font-size: 1.4rem;
5961
6042
  cursor: url('cursors/live_link.cur'), pointer;
5962
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
+ }