@starlove/orbit 1.0.6 → 1.1.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 (58) hide show
  1. package/README.md +22 -7
  2. package/SKILL-ORBIT.md +28 -1
  3. package/build.mjs +2 -2
  4. package/dist/full/index.html +2 -2
  5. package/dist/full/js/app.a4f045fc.js +676 -0
  6. package/dist/full/js/app.a4f045fc.js.map +7 -0
  7. package/dist/full/{styles.c2e3d20a.css → styles.836872e7.css} +1117 -47
  8. package/dist/full/version.json +2 -2
  9. package/docs/AGENT_PROTOCOL.md +27 -5
  10. package/docs/MCP_SETUP.md +7 -3
  11. package/docs/ORBIT_DISPATCH.md +185 -0
  12. package/docs/setup/orbit-init-wizard.md +174 -0
  13. package/package.json +2 -2
  14. package/public/js/actor-labels.js +65 -0
  15. package/public/js/api.js +5 -1
  16. package/public/js/app.js +8 -1
  17. package/public/js/card-actions.js +526 -0
  18. package/public/js/config.js +2 -1
  19. package/public/js/drawer.js +2 -0
  20. package/public/js/format.js +336 -0
  21. package/public/js/kanban.js +25 -2
  22. package/public/js/local-backend.js +24 -8
  23. package/public/js/main.js +14 -6
  24. package/public/js/motion-preference.js +53 -0
  25. package/public/js/router.js +78 -58
  26. package/public/js/search.js +6 -3
  27. package/public/js/settings-tabs.js +1 -1
  28. package/public/js/settings.js +192 -29
  29. package/public/js/starscape.js +25 -18
  30. package/public/js/state.js +61 -2
  31. package/public/js/theme-preference.js +88 -0
  32. package/public/js/ticket-detail.js +432 -126
  33. package/public/js/url-routes.js +94 -0
  34. package/public/styles.css +1117 -47
  35. package/src/cli/orbit.js +217 -32
  36. package/src/core/agent.js +1 -18
  37. package/src/core/agents-md.js +16 -10
  38. package/src/core/attachments.js +238 -0
  39. package/src/core/auth.js +36 -0
  40. package/src/core/backups.js +9 -3
  41. package/src/core/board.js +32 -1
  42. package/src/core/boards.js +1 -1
  43. package/src/core/bootstrap.js +9 -1
  44. package/src/core/db.js +42 -2
  45. package/src/core/delete-board.js +87 -21
  46. package/src/core/dispatch.js +532 -0
  47. package/src/core/http.js +31 -11
  48. package/src/core/migrate.js +198 -0
  49. package/src/core/paths.js +6 -0
  50. package/src/core/registry.js +12 -9
  51. package/src/core/router.js +62 -6
  52. package/src/core/search.js +56 -22
  53. package/src/core/snapshots.js +14 -2
  54. package/src/mcp/orbit-client.js +223 -0
  55. package/src/mcp-server.js +89 -129
  56. package/src/server.js +20 -0
  57. package/dist/full/js/app.aedc1bfe.js +0 -554
  58. package/dist/full/js/app.aedc1bfe.js.map +0 -7
package/public/styles.css CHANGED
@@ -76,9 +76,13 @@ input[type="file"] {
76
76
  --orbit-add-border: rgba(29, 37, 40, 0.12);
77
77
  --orbit-phantom-border: rgba(29, 37, 40, 0.14);
78
78
  --orbit-phantom-bg: rgba(29, 37, 40, 0.03);
79
+ --kanban-column-width: 22rem;
79
80
  --scrollbar-thumb: rgba(var(--accent-rgb),0.45);
80
81
  --scrollbar-thumb-hover: rgba(var(--accent-rgb),0.65);
81
82
  --scrollbar-track: transparent;
83
+ /* Default text-control interior spacing; component-specific fields override this. */
84
+ --field-padding-y: 0.62rem;
85
+ --field-padding-x: 0.8rem;
82
86
  /* RGB channels — use as rgba(var(--name), alpha) for arbitrary-opacity tints */
83
87
  --paper-rgb: 255, 252, 246; /* warm cream paper — light-mode surface/inset base */
84
88
  --warmth-rgb: 53, 43, 28; /* warm parchment brown — light-mode shadow tint */
@@ -96,10 +100,16 @@ input[type="file"] {
96
100
  --indigo-rgb: 139, 92, 246; /* dark-mode epic gradient tint 2 / orbit-accent-2 */
97
101
  --coral-rgb: 248, 113, 113; /* dark-mode bug card bezel (brighter than --red-rgb) */
98
102
  /* Native <select> chevron: same horizontal inset for value text (left) and glyph (right). */
99
- --select-chevron-pad-x: 0.55rem;
103
+ --select-chevron-pad-x: var(--field-padding-x);
100
104
  --select-chevron-size: 12px;
101
105
  }
102
106
 
107
+ @media (max-width: 720px) {
108
+ :root {
109
+ --kanban-column-width: 18rem;
110
+ }
111
+ }
112
+
103
113
  * {
104
114
  box-sizing: border-box;
105
115
  }
@@ -248,6 +258,24 @@ textarea {
248
258
  outline: none;
249
259
  }
250
260
 
261
+ input:not([type]),
262
+ input[type="date"],
263
+ input[type="datetime-local"],
264
+ input[type="email"],
265
+ input[type="month"],
266
+ input[type="number"],
267
+ input[type="password"],
268
+ input[type="search"],
269
+ input[type="tel"],
270
+ input[type="text"],
271
+ input[type="time"],
272
+ input[type="url"],
273
+ input[type="week"],
274
+ select,
275
+ textarea {
276
+ padding: var(--field-padding-y) var(--field-padding-x);
277
+ }
278
+
251
279
  input:focus,
252
280
  select:focus,
253
281
  textarea:focus {
@@ -529,6 +557,12 @@ h1 {
529
557
  scrollbar-color: var(--scrollbar-thumb) var(--scrollbar-track);
530
558
  }
531
559
 
560
+ #boardFlyout {
561
+ min-width: 20.25rem;
562
+ max-width: min(30rem, calc(100vw - 1.5rem));
563
+ max-height: min(36rem, calc(100vh - 4rem));
564
+ }
565
+
532
566
  .menu-flyout--align-end {
533
567
  right: 0;
534
568
  left: auto;
@@ -641,7 +675,7 @@ h1 {
641
675
 
642
676
  .menu-flyout-form input {
643
677
  width: 100%;
644
- padding: 0.42rem 0.55rem;
678
+ padding: var(--field-padding-y) var(--field-padding-x);
645
679
  border: 1px solid var(--line);
646
680
  border-radius: 8px;
647
681
  font: inherit;
@@ -940,7 +974,7 @@ h1 {
940
974
  .create-flyout-form input[type="text"],
941
975
  .create-flyout-form textarea {
942
976
  width: 100%;
943
- padding: 0.62rem 0.8rem;
977
+ padding: var(--field-padding-y) var(--field-padding-x);
944
978
  border: 1px solid var(--line);
945
979
  border-radius: 10px;
946
980
  font: inherit;
@@ -950,7 +984,7 @@ h1 {
950
984
 
951
985
  .create-flyout-form select.select-chevron-field {
952
986
  width: 100%;
953
- padding: 0.62rem var(--select-chevron-pad-x);
987
+ padding: var(--field-padding-y) var(--select-chevron-pad-x);
954
988
  padding-right: calc(var(--select-chevron-pad-x) * 2 + var(--select-chevron-size));
955
989
  border: 1px solid var(--line);
956
990
  border-radius: 10px;
@@ -1030,7 +1064,7 @@ h1 {
1030
1064
 
1031
1065
  .topbar-search input {
1032
1066
  width: 100%;
1033
- padding: 0.42rem 0.65rem;
1067
+ padding: var(--field-padding-y) var(--field-padding-x);
1034
1068
  border: 1px solid var(--line);
1035
1069
  border-radius: 10px;
1036
1070
  background: var(--surface-input);
@@ -1050,7 +1084,7 @@ h1 {
1050
1084
  .drawer-composer textarea,
1051
1085
  .composer input,
1052
1086
  .composer textarea {
1053
- padding: 0.82rem 0.95rem;
1087
+ padding: var(--field-padding-y) var(--field-padding-x);
1054
1088
  }
1055
1089
 
1056
1090
  .drawer-composer textarea,
@@ -1067,11 +1101,11 @@ h1 {
1067
1101
 
1068
1102
  .composer-row select,
1069
1103
  .composer-row input {
1070
- padding: 0.7rem 0.8rem;
1104
+ padding: var(--field-padding-y) var(--field-padding-x);
1071
1105
  }
1072
1106
 
1073
1107
  .composer-row select.select-chevron-field {
1074
- padding: 0.7rem var(--select-chevron-pad-x);
1108
+ padding: var(--field-padding-y) var(--select-chevron-pad-x);
1075
1109
  padding-right: calc(var(--select-chevron-pad-x) * 2 + var(--select-chevron-size));
1076
1110
  }
1077
1111
 
@@ -1090,11 +1124,45 @@ h1 {
1090
1124
  }
1091
1125
 
1092
1126
  .search-hit {
1127
+ display: flex;
1128
+ align-items: center;
1129
+ gap: 0.65rem;
1093
1130
  padding: 0.85rem;
1094
1131
  border-bottom: 1px solid var(--line);
1095
1132
  cursor: url('cursors/live_link.cur'), pointer;
1096
1133
  }
1097
1134
 
1135
+ .search-hit-main {
1136
+ display: flex;
1137
+ flex: 1 1 auto;
1138
+ min-width: 0;
1139
+ gap: 0.35rem;
1140
+ align-items: baseline;
1141
+ }
1142
+
1143
+ .search-hit-title {
1144
+ flex: 1 1 auto;
1145
+ min-width: 0;
1146
+ overflow: hidden;
1147
+ text-overflow: ellipsis;
1148
+ white-space: nowrap;
1149
+ }
1150
+
1151
+ .search-hit-state {
1152
+ flex: 0 0 auto;
1153
+ margin-left: auto;
1154
+ padding: 0.1rem 0.5rem;
1155
+ border: 1px solid rgba(96, 165, 250, 0.28);
1156
+ border-radius: 999px;
1157
+ color: #3657c8;
1158
+ background-color: rgba(96, 165, 250, 0.12);
1159
+ font-size: 0.72rem;
1160
+ font-weight: 600;
1161
+ letter-spacing: 0.02em;
1162
+ line-height: 1.35;
1163
+ white-space: nowrap;
1164
+ }
1165
+
1098
1166
  .search-hit:hover {
1099
1167
  background: var(--accent-hover);
1100
1168
  }
@@ -1109,7 +1177,7 @@ h1 {
1109
1177
  /* Horizontal scroll: styled thumb/track (Firefox + WebKit). */
1110
1178
  .kanban {
1111
1179
  display: grid;
1112
- grid-auto-columns: minmax(17rem, 1fr);
1180
+ grid-auto-columns: minmax(var(--kanban-column-width), 1fr);
1113
1181
  grid-auto-flow: column;
1114
1182
  grid-template-rows: minmax(0, 1fr);
1115
1183
  flex: 1 1 auto;
@@ -1636,6 +1704,120 @@ h1 {
1636
1704
  outline-offset: -1px;
1637
1705
  }
1638
1706
 
1707
+ .card-action-menu {
1708
+ position: fixed;
1709
+ z-index: 1200;
1710
+ min-width: 13rem;
1711
+ max-height: calc(100vh - 16px);
1712
+ overflow: visible;
1713
+ color: var(--orbit-text);
1714
+ background: rgba(var(--paper-rgb), 0.98);
1715
+ border: 1px solid rgba(var(--warmth-rgb), 0.14);
1716
+ border-radius: 14px;
1717
+ box-shadow: 0 18px 48px rgba(var(--warmth-rgb), 0.2), 0 4px 14px rgba(0, 0, 0, 0.12);
1718
+ padding: 0.35rem;
1719
+ backdrop-filter: blur(18px);
1720
+ -webkit-backdrop-filter: blur(18px);
1721
+ }
1722
+
1723
+ .card-action-menu-list {
1724
+ list-style: none;
1725
+ margin: 0;
1726
+ padding: 0;
1727
+ }
1728
+
1729
+ .card-action-menu-item {
1730
+ position: relative;
1731
+ }
1732
+
1733
+ .card-action-button {
1734
+ width: 100%;
1735
+ min-width: 11.5rem;
1736
+ display: grid;
1737
+ grid-template-columns: 1.2rem 1fr auto;
1738
+ align-items: center;
1739
+ gap: 0.45rem;
1740
+ padding: 0.52rem 0.58rem;
1741
+ border: 0;
1742
+ border-radius: 10px;
1743
+ color: inherit;
1744
+ background: transparent;
1745
+ font: inherit;
1746
+ font-size: 0.88rem;
1747
+ text-align: left;
1748
+ cursor: url('cursors/live_link.cur'), pointer;
1749
+ }
1750
+
1751
+ .card-action-menu-item.has-submenu > .card-action-button {
1752
+ grid-template-columns: 1fr auto;
1753
+ }
1754
+
1755
+ .card-action-button:hover,
1756
+ .card-action-button:focus-visible,
1757
+ .card-action-menu-item.is-open > .card-action-button {
1758
+ outline: none;
1759
+ background: rgba(var(--accent-rgb), 0.12);
1760
+ }
1761
+
1762
+ .card-action-button:disabled {
1763
+ cursor: default;
1764
+ color: var(--orbit-text-muted);
1765
+ opacity: 0.82;
1766
+ }
1767
+
1768
+ .card-action-check,
1769
+ .card-action-arrow {
1770
+ color: var(--orbit-text-muted);
1771
+ }
1772
+
1773
+ .card-action-label {
1774
+ min-width: 0;
1775
+ overflow: hidden;
1776
+ text-overflow: ellipsis;
1777
+ white-space: nowrap;
1778
+ }
1779
+
1780
+ .card-action-menu-item.is-danger > .card-action-button {
1781
+ color: #b42318;
1782
+ }
1783
+
1784
+ .card-action-menu-item.is-danger > .card-action-button:hover,
1785
+ .card-action-menu-item.is-danger > .card-action-button:focus-visible {
1786
+ background: rgba(var(--red-rgb), 0.12);
1787
+ }
1788
+
1789
+ .card-action-submenu {
1790
+ position: fixed;
1791
+ top: 0;
1792
+ left: 0;
1793
+ z-index: 1201;
1794
+ display: none;
1795
+ min-width: 12rem;
1796
+ max-height: calc(100vh - 16px);
1797
+ overflow-y: auto;
1798
+ padding: 0.35rem;
1799
+ border: 1px solid rgba(var(--warmth-rgb), 0.14);
1800
+ border-radius: 14px;
1801
+ background: rgba(var(--paper-rgb), 0.98);
1802
+ box-shadow: 0 18px 48px rgba(var(--warmth-rgb), 0.18), 0 4px 14px rgba(0, 0, 0, 0.12);
1803
+ }
1804
+
1805
+ .card-action-submenu.is-open {
1806
+ display: block;
1807
+ }
1808
+
1809
+ [data-theme="dark"] .card-action-menu,
1810
+ [data-theme="dark"] .card-action-submenu {
1811
+ color: var(--starlight);
1812
+ background: rgba(var(--cosmos-rgb), 0.96);
1813
+ border-color: rgba(var(--starlight-rgb), 0.16);
1814
+ box-shadow: 0 18px 48px rgba(var(--void-rgb), 0.55), 0 0 0 1px rgba(var(--starlight-rgb), 0.04);
1815
+ }
1816
+
1817
+ [data-theme="dark"] .card-action-menu-item.is-danger > .card-action-button {
1818
+ color: #fca5a5;
1819
+ }
1820
+
1639
1821
  /* Dark card glass — starscape palette. Hover uses filter+drop-shadow only
1640
1822
  so per-type bezels survive. Selected uses outline so bezel box-shadow stays intact. */
1641
1823
  [data-theme="dark"] .card {
@@ -1704,8 +1886,8 @@ h1 {
1704
1886
  /* Epic-aware grouping inside a column.
1705
1887
  `.epic-children` is a flex item nested in `.column` (which is itself flex-column,
1706
1888
  gap 0.7rem). Right-aligning + narrowing it makes its cards read as indented
1707
- children of the epic card or `.epic-mini-header` directly above. The negative
1708
- margin-top tightens the visual link by halving the column gap. */
1889
+ children of the epic card or full-width `.epic-mini-header` directly above.
1890
+ The negative margin-top tightens the visual link by halving the column gap. */
1709
1891
  .epic-children {
1710
1892
  display: flex;
1711
1893
  flex-direction: column;
@@ -1744,15 +1926,14 @@ h1 {
1744
1926
  0 8px 20px rgba(0, 0, 0, 0.25);
1745
1927
  }
1746
1928
 
1747
- /* Thin "header" that stands in for the epic when its children sit in a different
1748
- column. Visually pairs with the `.epic-children` block right below it: same
1749
- width and right-alignment, slim purple bar shape. */
1929
+ /* Thin full-width "header" that stands in for the epic when its children sit in
1930
+ a different column. Children remain narrowed underneath so the hierarchy is
1931
+ visible without cutting the lane width at the epic anchor. */
1750
1932
  .epic-mini-header {
1751
1933
  display: flex;
1752
1934
  align-items: center;
1753
1935
  gap: 0.4rem;
1754
- width: 92%;
1755
- align-self: flex-end;
1936
+ width: 100%;
1756
1937
  padding: 0.45rem 0.6rem;
1757
1938
  border-radius: 10px 10px 4px 4px;
1758
1939
  background: rgba(var(--purple-rgb), 0.10);
@@ -2144,7 +2325,13 @@ h1 {
2144
2325
  background: var(--drawer-bg);
2145
2326
  box-shadow: 0 24px 60px rgba(12, 18, 26, 0.28);
2146
2327
  transform: translateX(calc(100% + 1.5rem));
2147
- transition: transform 320ms cubic-bezier(0.4, 0, 0.2, 1);
2328
+ transition:
2329
+ transform 320ms cubic-bezier(0.4, 0, 0.2, 1),
2330
+ width 180ms ease;
2331
+ }
2332
+
2333
+ .drawer.is-wide {
2334
+ width: min(58rem, calc(100vw - 1rem));
2148
2335
  }
2149
2336
 
2150
2337
  .drawer.is-open {
@@ -2205,6 +2392,7 @@ h1 {
2205
2392
  the second line of cards in the lanes for visual consistency. */
2206
2393
  .drawer-subtitle {
2207
2394
  display: flex;
2395
+ flex-wrap: wrap;
2208
2396
  align-items: center;
2209
2397
  gap: 0.55rem;
2210
2398
  margin-top: 0.45rem;
@@ -2223,6 +2411,280 @@ h1 {
2223
2411
  font-variant-numeric: tabular-nums;
2224
2412
  }
2225
2413
 
2414
+ .detail-meta-badge-row {
2415
+ display: inline-flex;
2416
+ flex-wrap: wrap;
2417
+ flex: 0 1 auto;
2418
+ align-items: center;
2419
+ gap: 0.42rem;
2420
+ max-width: 100%;
2421
+ min-width: 0;
2422
+ }
2423
+
2424
+ .detail-meta-badge {
2425
+ --badge-ring: rgba(var(--starlight-rgb), 0.2);
2426
+ flex: 0 1 auto;
2427
+ max-width: min(12rem, 100%);
2428
+ min-width: 0;
2429
+ min-height: 1.85rem;
2430
+ margin: 0;
2431
+ padding: 0.28rem 1.55rem 0.28rem 0.62rem;
2432
+ border: 1px solid var(--badge-ring);
2433
+ border-radius: 999px;
2434
+ color: var(--orbit-text-muted);
2435
+ background-color: rgba(var(--starlight-rgb), 0.08);
2436
+ font: inherit;
2437
+ font-size: 0.68rem;
2438
+ font-weight: 900;
2439
+ letter-spacing: 0.055em;
2440
+ line-height: 1;
2441
+ text-transform: uppercase;
2442
+ cursor: url('cursors/live_link.cur'), pointer;
2443
+ box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.24), 0 8px 20px rgba(12, 18, 26, 0.06);
2444
+ transition:
2445
+ transform 140ms ease,
2446
+ background-color 140ms ease,
2447
+ border-color 140ms ease,
2448
+ box-shadow 140ms ease,
2449
+ color 140ms ease;
2450
+ }
2451
+
2452
+ select.detail-meta-badge {
2453
+ appearance: none;
2454
+ -webkit-appearance: none;
2455
+ -moz-appearance: none;
2456
+ background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%2364758b' stroke-width='2.4' stroke-linecap='round' stroke-linejoin='round'><polyline points='6 9 12 15 18 9'/></svg>");
2457
+ background-repeat: no-repeat;
2458
+ background-position: right 0.48rem center;
2459
+ background-size: 0.78rem 0.78rem;
2460
+ }
2461
+
2462
+ select.detail-meta-badge::-ms-expand {
2463
+ display: none;
2464
+ }
2465
+
2466
+ .detail-meta-badge:hover:not(:disabled) {
2467
+ transform: translateY(-1px);
2468
+ border-color: rgba(var(--starlight-rgb), 0.36);
2469
+ box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.28), 0 10px 24px rgba(12, 18, 26, 0.1);
2470
+ }
2471
+
2472
+ .detail-meta-badge:focus {
2473
+ outline: none;
2474
+ border-color: var(--accent-focus-border);
2475
+ box-shadow: var(--accent-ring), inset 0 1px 0 rgba(255, 255, 255, 0.28);
2476
+ }
2477
+
2478
+ .detail-state-badge {
2479
+ width: clamp(7.25rem, 28vw, 9.75rem);
2480
+ color: #3657c8;
2481
+ background-color: rgba(96, 165, 250, 0.12);
2482
+ border-color: rgba(96, 165, 250, 0.28);
2483
+ }
2484
+
2485
+ .detail-type-badge {
2486
+ width: 7rem;
2487
+ }
2488
+
2489
+ .detail-priority-badge {
2490
+ width: 6.55rem;
2491
+ }
2492
+
2493
+ .detail-state-badge.state-pill-ai-ready,
2494
+ .search-hit-state.state-pill-ai-ready,
2495
+ .detail-card-state.state-pill-ai-ready {
2496
+ color: #7c3aed;
2497
+ background-color: rgba(var(--purple-rgb), 0.12);
2498
+ border-color: rgba(var(--purple-rgb), 0.28);
2499
+ }
2500
+
2501
+ .detail-state-badge.state-pill-in-progress,
2502
+ .search-hit-state.state-pill-in-progress,
2503
+ .detail-card-state.state-pill-in-progress {
2504
+ color: #0369a1;
2505
+ background-color: rgba(14, 165, 233, 0.13);
2506
+ border-color: rgba(14, 165, 233, 0.28);
2507
+ }
2508
+
2509
+ .detail-state-badge.state-pill-review,
2510
+ .search-hit-state.state-pill-review,
2511
+ .detail-card-state.state-pill-review {
2512
+ color: #a4550f;
2513
+ background-color: rgba(var(--amber-rgb), 0.16);
2514
+ border-color: rgba(var(--amber-rgb), 0.32);
2515
+ }
2516
+
2517
+ .detail-state-badge.state-pill-done,
2518
+ .search-hit-state.state-pill-done,
2519
+ .detail-card-state.state-pill-done {
2520
+ color: #1e6f5c;
2521
+ background-color: rgba(var(--accent-rgb), 0.14);
2522
+ border-color: rgba(var(--accent-rgb), 0.28);
2523
+ }
2524
+
2525
+ .detail-type-badge.type-pill-epic {
2526
+ color: #8b5cf6;
2527
+ background-color: rgba(var(--purple-rgb),0.12);
2528
+ border-color: rgba(var(--purple-rgb),0.28);
2529
+ }
2530
+
2531
+ .detail-type-badge.type-pill-feature {
2532
+ color: #15803d;
2533
+ background-color: rgba(74, 222, 128, 0.12);
2534
+ border-color: rgba(74, 222, 128, 0.26);
2535
+ }
2536
+
2537
+ .detail-type-badge.type-pill-task {
2538
+ color: #2563eb;
2539
+ background-color: rgba(96, 165, 250, 0.12);
2540
+ border-color: rgba(96, 165, 250, 0.26);
2541
+ }
2542
+
2543
+ .detail-type-badge.type-pill-bug {
2544
+ color: #dc2626;
2545
+ background-color: rgba(var(--coral-rgb),0.13);
2546
+ border-color: rgba(var(--coral-rgb),0.3);
2547
+ }
2548
+
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 {
2554
+ border-color: currentColor;
2555
+ }
2556
+
2557
+ .detail-priority-badge.priority-pill-maybe {
2558
+ color: #6b7280;
2559
+ background-color: rgba(100, 116, 139, 0.14);
2560
+ }
2561
+
2562
+ .detail-priority-badge.priority-pill-low {
2563
+ color: #1e6f5c;
2564
+ background-color: rgba(var(--accent-rgb), 0.14);
2565
+ }
2566
+
2567
+ .detail-priority-badge.priority-pill-med {
2568
+ color: #a4550f;
2569
+ background-color: rgba(var(--amber-rgb), 0.16);
2570
+ }
2571
+
2572
+ .detail-priority-badge.priority-pill-high {
2573
+ color: #b53a1a;
2574
+ background-color: rgba(214, 86, 46, 0.2);
2575
+ }
2576
+
2577
+ .detail-priority-badge.priority-pill-urgent {
2578
+ color: #fff;
2579
+ background-color: #b91c1c;
2580
+ }
2581
+
2582
+ [data-theme="dark"] select.detail-meta-badge {
2583
+ background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23c4d3ff' stroke-width='2.4' stroke-linecap='round' stroke-linejoin='round'><polyline points='6 9 12 15 18 9'/></svg>");
2584
+ background-repeat: no-repeat;
2585
+ background-position: right 0.48rem center;
2586
+ background-size: 0.78rem 0.78rem;
2587
+ }
2588
+
2589
+ [data-theme="dark"] .detail-meta-badge {
2590
+ box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.06), 0 8px 20px rgba(0, 0, 0, 0.2);
2591
+ }
2592
+
2593
+ [data-theme="dark"] .detail-state-badge,
2594
+ [data-theme="dark"] .search-hit-state,
2595
+ [data-theme="dark"] .detail-card-state {
2596
+ color: #93c5fd;
2597
+ background-color: rgba(96, 165, 250, 0.15);
2598
+ border-color: rgba(147, 197, 253, 0.3);
2599
+ }
2600
+
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 {
2604
+ color: #c084fc;
2605
+ background-color: rgba(var(--purple-rgb), 0.16);
2606
+ border-color: rgba(var(--purple-rgb), 0.35);
2607
+ }
2608
+
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 {
2612
+ color: #67e8f9;
2613
+ background-color: rgba(14, 165, 233, 0.16);
2614
+ border-color: rgba(103, 232, 249, 0.32);
2615
+ }
2616
+
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 {
2620
+ color: #fbbf24;
2621
+ background-color: rgba(251, 191, 36, 0.18);
2622
+ border-color: rgba(251, 191, 36, 0.35);
2623
+ }
2624
+
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 {
2628
+ color: #4ade80;
2629
+ background-color: rgba(74, 222, 128, 0.15);
2630
+ border-color: rgba(74, 222, 128, 0.32);
2631
+ }
2632
+
2633
+ [data-theme="dark"] .detail-type-badge.type-pill-feature {
2634
+ color: #4ade80;
2635
+ }
2636
+
2637
+ [data-theme="dark"] .detail-type-badge.type-pill-task {
2638
+ color: #60a5fa;
2639
+ }
2640
+
2641
+ [data-theme="dark"] .detail-type-badge.type-pill-bug {
2642
+ color: #f87171;
2643
+ }
2644
+
2645
+ [data-theme="dark"] .detail-priority-badge.priority-pill-maybe {
2646
+ color: rgba(255, 255, 255, 0.62);
2647
+ background-color: rgba(255, 255, 255, 0.1);
2648
+ }
2649
+
2650
+ [data-theme="dark"] .detail-priority-badge.priority-pill-low {
2651
+ color: #4ade80;
2652
+ background-color: rgba(74, 222, 128, 0.15);
2653
+ }
2654
+
2655
+ [data-theme="dark"] .detail-priority-badge.priority-pill-med {
2656
+ color: #fbbf24;
2657
+ background-color: rgba(251, 191, 36, 0.18);
2658
+ }
2659
+
2660
+ [data-theme="dark"] .detail-priority-badge.priority-pill-high {
2661
+ color: #f87171;
2662
+ background-color: rgba(var(--coral-rgb), 0.2);
2663
+ }
2664
+
2665
+ [data-theme="dark"] .detail-priority-badge.priority-pill-urgent {
2666
+ color: #fff;
2667
+ background-color: #991b1b;
2668
+ }
2669
+
2670
+ @media (max-width: 640px) {
2671
+ .detail-meta-badge-row {
2672
+ width: 100%;
2673
+ }
2674
+
2675
+ .detail-state-badge {
2676
+ width: clamp(6.75rem, 38vw, 8.5rem);
2677
+ }
2678
+
2679
+ .detail-type-badge {
2680
+ width: 6.6rem;
2681
+ }
2682
+
2683
+ .detail-priority-badge {
2684
+ width: 6.2rem;
2685
+ }
2686
+ }
2687
+
2226
2688
  .drawer-title-text {
2227
2689
  margin: 0;
2228
2690
  font-size: 1.2rem;
@@ -2286,8 +2748,8 @@ h1 {
2286
2748
  border-color: var(--accent-border);
2287
2749
  }
2288
2750
 
2289
- .drawer-close {
2290
- grid-area: close;
2751
+ .drawer-close,
2752
+ .drawer-archive {
2291
2753
  display: inline-grid;
2292
2754
  place-items: center;
2293
2755
  width: 2rem;
@@ -2297,10 +2759,14 @@ h1 {
2297
2759
  border-radius: 10px;
2298
2760
  background: var(--surface);
2299
2761
  color: var(--ink);
2762
+ cursor: url('cursors/live_link.cur'), pointer;
2763
+ }
2764
+
2765
+ .drawer-close {
2766
+ grid-area: close;
2300
2767
  font-size: 1.35rem;
2301
2768
  font-weight: 400;
2302
2769
  line-height: 1;
2303
- cursor: url('cursors/live_link.cur'), pointer;
2304
2770
  }
2305
2771
 
2306
2772
  .drawer-close:hover {
@@ -2310,16 +2776,6 @@ h1 {
2310
2776
 
2311
2777
  .drawer-archive {
2312
2778
  grid-area: archive;
2313
- display: inline-grid;
2314
- place-items: center;
2315
- width: 2rem;
2316
- height: 2rem;
2317
- padding: 0;
2318
- border: 1px solid var(--line);
2319
- border-radius: 10px;
2320
- background: var(--surface);
2321
- color: var(--ink);
2322
- cursor: url('cursors/live_link.cur'), pointer;
2323
2779
  }
2324
2780
 
2325
2781
  .drawer-archive:hover {
@@ -2440,7 +2896,7 @@ h1 {
2440
2896
 
2441
2897
  .inline-title-editor {
2442
2898
  margin-inline: -0.35rem;
2443
- padding: 0.3rem 0.5rem;
2899
+ padding: var(--field-padding-y) var(--field-padding-x);
2444
2900
  font-size: 1.35rem;
2445
2901
  font-weight: inherit;
2446
2902
  letter-spacing: -0.04em;
@@ -2449,7 +2905,7 @@ h1 {
2449
2905
 
2450
2906
  .inline-desc-editor {
2451
2907
  margin-top: 0.5rem;
2452
- padding: 0.65rem 0.75rem;
2908
+ padding: var(--field-padding-y) var(--field-padding-x);
2453
2909
  min-height: 5rem;
2454
2910
  font-size: 1rem;
2455
2911
  line-height: 1.45;
@@ -2463,6 +2919,181 @@ h1 {
2463
2919
  white-space: pre-wrap;
2464
2920
  }
2465
2921
 
2922
+ .markdown-body {
2923
+ white-space: normal;
2924
+ overflow-wrap: anywhere;
2925
+ tab-size: 4;
2926
+ }
2927
+
2928
+ .markdown-body p,
2929
+ .markdown-body ul,
2930
+ .markdown-body ol,
2931
+ .markdown-body pre,
2932
+ .markdown-body blockquote,
2933
+ .markdown-body h1,
2934
+ .markdown-body h2,
2935
+ .markdown-body h3,
2936
+ .markdown-body h4,
2937
+ .markdown-body h5,
2938
+ .markdown-body h6 {
2939
+ margin: 0;
2940
+ }
2941
+
2942
+ /* Every adjacent block-element pair in markdown content gets the same gap.
2943
+ Listing each pair was the old approach; this universal sibling rule keeps
2944
+ headers, blockquotes, and hr in step with paragraphs/lists/code blocks
2945
+ without repeating the matrix. */
2946
+ .markdown-body > * + * {
2947
+ margin-top: 0.55rem;
2948
+ }
2949
+
2950
+ .markdown-body p {
2951
+ white-space: break-spaces;
2952
+ }
2953
+
2954
+ .preserved-text-body {
2955
+ overflow-x: auto;
2956
+ white-space: break-spaces;
2957
+ overflow-wrap: normal;
2958
+ tab-size: 4;
2959
+ font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", monospace;
2960
+ font-size: 0.92rem;
2961
+ line-height: 1.45;
2962
+ }
2963
+
2964
+ /* Headers carry more weight than body paragraphs and need a bit more breathing
2965
+ room above when they follow other content. Slightly tighter below so the
2966
+ header visually pairs with its first paragraph. */
2967
+ .markdown-body h1,
2968
+ .markdown-body h2,
2969
+ .markdown-body h3,
2970
+ .markdown-body h4,
2971
+ .markdown-body h5,
2972
+ .markdown-body h6 {
2973
+ font-weight: 700;
2974
+ line-height: 1.25;
2975
+ letter-spacing: -0.01em;
2976
+ }
2977
+
2978
+ .markdown-body > * + h1,
2979
+ .markdown-body > * + h2,
2980
+ .markdown-body > * + h3,
2981
+ .markdown-body > * + h4,
2982
+ .markdown-body > * + h5,
2983
+ .markdown-body > * + h6 {
2984
+ margin-top: 1rem;
2985
+ }
2986
+
2987
+ .markdown-body h1 { font-size: 1.35rem; }
2988
+ .markdown-body h2 { font-size: 1.2rem; }
2989
+ .markdown-body h3 { font-size: 1.05rem; }
2990
+ .markdown-body h4 { font-size: 0.95rem; }
2991
+ .markdown-body h5 { font-size: 0.88rem; text-transform: uppercase; letter-spacing: 0.04em; }
2992
+ .markdown-body h6 { font-size: 0.82rem; color: var(--muted); text-transform: uppercase; letter-spacing: 0.06em; }
2993
+
2994
+ .markdown-body blockquote {
2995
+ border-left: 3px solid var(--accent-border);
2996
+ padding: 0.15rem 0.75rem;
2997
+ color: var(--muted);
2998
+ background: rgba(var(--blue-rgb), 0.04);
2999
+ border-radius: 0 8px 8px 0;
3000
+ }
3001
+
3002
+ .markdown-body blockquote > * + * {
3003
+ margin-top: 0.4rem;
3004
+ }
3005
+
3006
+ .markdown-body hr {
3007
+ height: 1px;
3008
+ border: 0;
3009
+ background: var(--line);
3010
+ margin: 0.85rem 0;
3011
+ }
3012
+
3013
+ .markdown-body ul.task-list {
3014
+ list-style: none;
3015
+ padding-left: 0.1rem;
3016
+ }
3017
+
3018
+ .markdown-body ul.task-list li.task-item {
3019
+ display: flex;
3020
+ align-items: baseline;
3021
+ gap: 0.45rem;
3022
+ }
3023
+
3024
+ .markdown-body ul.task-list li.task-item input[type="checkbox"] {
3025
+ margin: 0;
3026
+ transform: translateY(1px);
3027
+ cursor: default;
3028
+ }
3029
+
3030
+ .markdown-body ul.task-list li.task-item-done {
3031
+ color: var(--muted);
3032
+ text-decoration: line-through;
3033
+ text-decoration-color: rgba(var(--blue-rgb), 0.4);
3034
+ }
3035
+
3036
+ .markdown-body ul,
3037
+ .markdown-body ol {
3038
+ padding-left: 1.25rem;
3039
+ }
3040
+
3041
+ .markdown-body li + li {
3042
+ margin-top: 0.2rem;
3043
+ }
3044
+
3045
+ .markdown-body code {
3046
+ border: 1px solid rgba(var(--blue-rgb), 0.18);
3047
+ border-radius: 0.35rem;
3048
+ padding: 0.05rem 0.25rem;
3049
+ color: var(--ink);
3050
+ background: rgba(var(--blue-rgb), 0.08);
3051
+ font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", monospace;
3052
+ font-size: 0.9em;
3053
+ }
3054
+
3055
+ .markdown-body pre {
3056
+ padding: 0.65rem 0.75rem;
3057
+ overflow: auto;
3058
+ border: 1px solid var(--line);
3059
+ border-radius: 10px;
3060
+ background: var(--surface-card);
3061
+ }
3062
+
3063
+ .markdown-body pre code {
3064
+ display: block;
3065
+ border: 0;
3066
+ padding: 0;
3067
+ background: transparent;
3068
+ white-space: pre;
3069
+ }
3070
+
3071
+ .markdown-body a {
3072
+ color: var(--blue);
3073
+ font-weight: 700;
3074
+ text-decoration: underline;
3075
+ text-decoration-thickness: 0.08em;
3076
+ text-underline-offset: 0.15em;
3077
+ }
3078
+
3079
+ .card-description {
3080
+ margin-top: 0.45rem;
3081
+ color: var(--muted);
3082
+ font-size: 0.82rem;
3083
+ line-height: 1.45;
3084
+ }
3085
+
3086
+ .card .markdown-body p {
3087
+ display: block;
3088
+ overflow: visible;
3089
+ -webkit-line-clamp: unset;
3090
+ -webkit-box-orient: initial;
3091
+ }
3092
+
3093
+ .card .markdown-body pre {
3094
+ max-height: 8rem;
3095
+ }
3096
+
2466
3097
  /* The detail pane's lede description is body copy, not a card excerpt — give
2467
3098
  it more presence than the universal muted .description rule. */
2468
3099
  .detail-head > .description {
@@ -2473,6 +3104,16 @@ h1 {
2473
3104
  line-height: 1.55;
2474
3105
  }
2475
3106
 
3107
+ .detail-head > .preserved-text-body {
3108
+ overflow-x: auto;
3109
+ white-space: break-spaces;
3110
+ overflow-wrap: normal;
3111
+ tab-size: 4;
3112
+ font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", monospace;
3113
+ font-size: 0.92rem;
3114
+ line-height: 1.45;
3115
+ }
3116
+
2476
3117
  /* Project Repository tab metadata grid for read-only repository details. */
2477
3118
  .meta-grid {
2478
3119
  display: grid;
@@ -2577,7 +3218,7 @@ h1 {
2577
3218
  .meta-inline {
2578
3219
  width: 100%;
2579
3220
  margin: 0;
2580
- padding: 0.42rem 0.55rem;
3221
+ padding: var(--field-padding-y) var(--field-padding-x);
2581
3222
  border: 1px solid transparent;
2582
3223
  border-radius: 10px;
2583
3224
  /* Use background-color only — `background` shorthand resets background-image
@@ -2762,7 +3403,7 @@ input.meta-inline {
2762
3403
  .label-add-input {
2763
3404
  flex: 1;
2764
3405
  min-width: 8rem;
2765
- padding: 0.62rem 0.8rem;
3406
+ padding: var(--field-padding-y) var(--field-padding-x);
2766
3407
  font-size: 0.86rem;
2767
3408
  }
2768
3409
 
@@ -2936,10 +3577,14 @@ details.section > summary .mcp-title-row {
2936
3577
 
2937
3578
  .comment-body {
2938
3579
  margin-top: 0.35rem;
2939
- white-space: pre-wrap;
2940
3580
  line-height: 1.4;
2941
3581
  }
2942
3582
 
3583
+ /* Comments use the literal preserved renderer so pasted logs/plans keep spacing. */
3584
+ .comment-body.preserved-text-body {
3585
+ white-space: break-spaces;
3586
+ }
3587
+
2943
3588
  .comment-form {
2944
3589
  display: grid;
2945
3590
  gap: 0.5rem;
@@ -2948,7 +3593,7 @@ details.section > summary .mcp-title-row {
2948
3593
 
2949
3594
  .comment-form textarea {
2950
3595
  min-height: 5rem;
2951
- padding: 0.8rem;
3596
+ padding: var(--field-padding-y) var(--field-padding-x);
2952
3597
  resize: vertical;
2953
3598
  }
2954
3599
 
@@ -2972,7 +3617,7 @@ details.section > summary .mcp-title-row {
2972
3617
 
2973
3618
  .field-form textarea {
2974
3619
  min-height: 6rem;
2975
- padding: 0.62rem 0.8rem;
3620
+ padding: var(--field-padding-y) var(--field-padding-x);
2976
3621
  resize: vertical;
2977
3622
  }
2978
3623
 
@@ -2994,8 +3639,42 @@ details.section > summary .mcp-title-row {
2994
3639
  margin-top: 0.65rem;
2995
3640
  }
2996
3641
 
2997
- .field-form textarea[name="implementation_updates"] {
2998
- min-height: 8rem;
3642
+ /* Click-to-edit field shared by AI plan/impl/review and board Notes. The
3643
+ label/body pairing replaces the old <label><span>…</span><textarea>…</textarea></label>
3644
+ form-row pattern; the body div is rendered markdown and the editable-field
3645
+ hover affordance signals it accepts clicks. */
3646
+ .ai-fields-grid {
3647
+ display: grid;
3648
+ gap: 1.1rem;
3649
+ }
3650
+
3651
+ .inline-md-field {
3652
+ display: grid;
3653
+ gap: 0.42rem;
3654
+ }
3655
+
3656
+ .inline-md-field-label {
3657
+ color: var(--muted);
3658
+ font-size: 0.76rem;
3659
+ font-weight: 800;
3660
+ letter-spacing: 0.06em;
3661
+ text-transform: uppercase;
3662
+ }
3663
+
3664
+ .inline-md-field-body {
3665
+ min-height: 2.4rem;
3666
+ padding: 0.45rem 0.6rem;
3667
+ margin-inline: -0.35rem;
3668
+ }
3669
+
3670
+ .inline-md-field-body.is-placeholder {
3671
+ min-height: 2rem;
3672
+ }
3673
+
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 {
3677
+ min-height: 11rem;
2999
3678
  }
3000
3679
 
3001
3680
  .ai-context-setup textarea[name="agent_instructions"] {
@@ -3111,7 +3790,7 @@ details.section > summary .mcp-title-row {
3111
3790
 
3112
3791
  .repository-confirm-field input {
3113
3792
  width: 100%;
3114
- padding: 0.62rem 0.8rem;
3793
+ padding: var(--field-padding-y) var(--field-padding-x);
3115
3794
  }
3116
3795
 
3117
3796
  [data-theme="dark"] .repository-danger-zone {
@@ -3137,11 +3816,11 @@ details.section > summary .mcp-title-row {
3137
3816
  }
3138
3817
 
3139
3818
  .project-entry-form input {
3140
- padding: 0.62rem 0.8rem;
3819
+ padding: var(--field-padding-y) var(--field-padding-x);
3141
3820
  }
3142
3821
 
3143
3822
  .project-entry-form select.select-chevron-field {
3144
- padding: 0.62rem var(--select-chevron-pad-x);
3823
+ padding: var(--field-padding-y) var(--select-chevron-pad-x);
3145
3824
  padding-right: calc(var(--select-chevron-pad-x) * 2 + var(--select-chevron-size));
3146
3825
  }
3147
3826
 
@@ -3194,6 +3873,157 @@ details.section > summary .mcp-title-row {
3194
3873
  margin-bottom: 0.85rem;
3195
3874
  }
3196
3875
 
3876
+ .appearance-theme-section {
3877
+ margin-top: 0.4rem;
3878
+ }
3879
+
3880
+ .appearance-theme-section + .section:has(> .orbit-check:first-child) {
3881
+ margin-top: 1.25rem;
3882
+ }
3883
+
3884
+ .appearance-theme-field {
3885
+ display: grid;
3886
+ gap: 0.55rem;
3887
+ min-width: 0;
3888
+ margin: 0;
3889
+ padding: 0;
3890
+ border: 0;
3891
+ }
3892
+
3893
+ .appearance-theme-field legend {
3894
+ margin-bottom: 0.55rem;
3895
+ color: var(--ink);
3896
+ font-size: 0.88rem;
3897
+ font-weight: 800;
3898
+ }
3899
+
3900
+ .appearance-theme-options {
3901
+ display: grid;
3902
+ grid-template-columns: repeat(2, minmax(0, 1fr));
3903
+ gap: 0.5rem;
3904
+ }
3905
+
3906
+ .appearance-theme-option {
3907
+ position: relative;
3908
+ display: inline-flex;
3909
+ min-width: 0;
3910
+ min-height: 2.5rem;
3911
+ align-items: center;
3912
+ justify-content: center;
3913
+ gap: 0.45rem;
3914
+ padding: 0.5rem 0.72rem;
3915
+ border: 1px solid var(--line);
3916
+ border-radius: 10px;
3917
+ background: var(--surface-dim);
3918
+ color: var(--ink);
3919
+ font-size: 0.86rem;
3920
+ font-weight: 700;
3921
+ cursor: url('cursors/live_link.cur'), pointer;
3922
+ transition:
3923
+ border-color 160ms ease,
3924
+ background 160ms ease,
3925
+ box-shadow 160ms ease,
3926
+ color 160ms ease;
3927
+ }
3928
+
3929
+ .appearance-theme-option:hover {
3930
+ border-color: var(--accent-border);
3931
+ background: var(--accent-hover);
3932
+ }
3933
+
3934
+ .appearance-theme-option input[type="radio"] {
3935
+ position: absolute;
3936
+ width: 1px;
3937
+ height: 1px;
3938
+ padding: 0;
3939
+ margin: -1px;
3940
+ overflow: hidden;
3941
+ clip: rect(0, 0, 0, 0);
3942
+ white-space: nowrap;
3943
+ border: 0;
3944
+ }
3945
+
3946
+ .appearance-theme-option-mark {
3947
+ display: grid;
3948
+ width: 1.35rem;
3949
+ height: 1.35rem;
3950
+ flex: 0 0 auto;
3951
+ place-items: center;
3952
+ border: 1px solid var(--accent-border);
3953
+ border-radius: 999px;
3954
+ background: var(--surface-input);
3955
+ transition:
3956
+ background 160ms ease,
3957
+ border-color 160ms ease,
3958
+ box-shadow 160ms ease;
3959
+ }
3960
+
3961
+ .appearance-theme-option-icon {
3962
+ width: 0.9rem;
3963
+ height: 0.9rem;
3964
+ }
3965
+
3966
+ .appearance-theme-option-label {
3967
+ min-width: 0;
3968
+ overflow: hidden;
3969
+ text-overflow: ellipsis;
3970
+ white-space: nowrap;
3971
+ }
3972
+
3973
+ .appearance-theme-option:has(input[type="radio"]:checked) {
3974
+ border-color: var(--accent);
3975
+ background:
3976
+ linear-gradient(135deg, rgba(var(--accent-rgb),0.12), rgba(var(--blue-rgb),0.08)),
3977
+ var(--surface-dim);
3978
+ box-shadow:
3979
+ inset 0 0 0 1px rgba(var(--accent-rgb),0.18),
3980
+ 0 4px 10px rgba(var(--accent-rgb),0.12);
3981
+ }
3982
+
3983
+ .appearance-theme-option:has(input[type="radio"]:checked) .appearance-theme-option-mark {
3984
+ border-color: var(--accent);
3985
+ color: #fff;
3986
+ background:
3987
+ linear-gradient(135deg, rgba(var(--accent-rgb),0.95), rgba(var(--blue-rgb),0.95));
3988
+ }
3989
+
3990
+ .appearance-theme-option input[type="radio"]:focus-visible ~ .appearance-theme-option-mark {
3991
+ box-shadow: var(--accent-ring);
3992
+ }
3993
+
3994
+ [data-theme="dark"] .appearance-theme-option {
3995
+ background: rgba(15, 25, 50, 0.55);
3996
+ border-color: rgba(var(--starlight-rgb),0.16);
3997
+ }
3998
+
3999
+ [data-theme="dark"] .appearance-theme-option:hover {
4000
+ border-color: rgba(var(--starlight-rgb),0.4);
4001
+ background: rgba(var(--starlight-rgb),0.08);
4002
+ }
4003
+
4004
+ [data-theme="dark"] .appearance-theme-option-mark {
4005
+ border-color: rgba(var(--starlight-rgb),0.35);
4006
+ background:
4007
+ linear-gradient(135deg, rgba(var(--starlight-rgb),0.06), rgba(var(--cosmos-rgb),0) 65%),
4008
+ rgba(15, 25, 50, 0.7);
4009
+ }
4010
+
4011
+ [data-theme="dark"] .appearance-theme-option:has(input[type="radio"]:checked) {
4012
+ border-color: rgba(var(--starlight-rgb),0.55);
4013
+ background:
4014
+ linear-gradient(135deg, rgba(var(--starlight-rgb),0.13), rgba(var(--violet-rgb),0.08)),
4015
+ rgba(15, 25, 50, 0.65);
4016
+ box-shadow:
4017
+ inset 0 0 0 1px rgba(var(--starlight-rgb),0.18),
4018
+ 0 4px 14px rgba(var(--starlight-rgb),0.16);
4019
+ }
4020
+
4021
+ [data-theme="dark"] .appearance-theme-option:has(input[type="radio"]:checked) .appearance-theme-option-mark {
4022
+ border-color: rgba(var(--starlight-rgb),0.7);
4023
+ color: #0a1024;
4024
+ background: linear-gradient(135deg, #d6e6ff, #a8c0ff);
4025
+ }
4026
+
3197
4027
  /* Lanes tab opens directly with the checkbox — drop the default .section
3198
4028
  top margin so it sits flush under the drawer tabs. */
3199
4029
  .section:has(> .orbit-check:first-child) {
@@ -3483,7 +4313,7 @@ details.section > summary .mcp-title-row {
3483
4313
  }
3484
4314
 
3485
4315
  .mcp-flow select.select-chevron-field {
3486
- padding: 0.62rem var(--select-chevron-pad-x);
4316
+ padding: var(--field-padding-y) var(--select-chevron-pad-x);
3487
4317
  padding-right: calc(var(--select-chevron-pad-x) * 2 + var(--select-chevron-size));
3488
4318
  font-size: 0.88rem;
3489
4319
  }
@@ -3564,7 +4394,7 @@ details.section > summary .mcp-title-row {
3564
4394
 
3565
4395
  .mcp-path-grid input {
3566
4396
  min-width: 0;
3567
- padding: 0.55rem 0.65rem;
4397
+ padding: var(--field-padding-y) var(--field-padding-x);
3568
4398
  font-size: 0.82rem;
3569
4399
  }
3570
4400
 
@@ -3819,13 +4649,13 @@ details.section > summary .mcp-title-row {
3819
4649
  .lane-row select,
3820
4650
  .lane-create-form input,
3821
4651
  .lane-create-form select {
3822
- padding: 0.5rem 0.65rem;
4652
+ padding: var(--field-padding-y) var(--field-padding-x);
3823
4653
  font-size: 0.86rem;
3824
4654
  }
3825
4655
 
3826
4656
  .lane-row select.select-chevron-field,
3827
4657
  .lane-create-form select.select-chevron-field {
3828
- padding: 0.5rem var(--select-chevron-pad-x);
4658
+ padding: var(--field-padding-y) var(--select-chevron-pad-x);
3829
4659
  padding-right: calc(var(--select-chevron-pad-x) * 2 + var(--select-chevron-size));
3830
4660
  }
3831
4661
 
@@ -4044,6 +4874,30 @@ button:disabled,
4044
4874
  margin-top: auto;
4045
4875
  }
4046
4876
 
4877
+ .card--detail .card-expand-trigger--static {
4878
+ flex-wrap: wrap;
4879
+ row-gap: 0.4rem;
4880
+ }
4881
+
4882
+ .detail-card-state {
4883
+ display: inline-block;
4884
+ flex: 0 0 auto;
4885
+ max-width: min(9rem, 100%);
4886
+ overflow: hidden;
4887
+ padding: 0.14rem 0.48rem;
4888
+ border: 1px solid rgba(96, 165, 250, 0.28);
4889
+ border-radius: 999px;
4890
+ color: #3657c8;
4891
+ background-color: rgba(96, 165, 250, 0.12);
4892
+ font-size: 0.68rem;
4893
+ font-weight: 800;
4894
+ letter-spacing: 0.035em;
4895
+ line-height: 1.2;
4896
+ text-overflow: ellipsis;
4897
+ text-transform: uppercase;
4898
+ white-space: nowrap;
4899
+ }
4900
+
4047
4901
  .card-eyebrow {
4048
4902
  display: block;
4049
4903
  margin-bottom: 0.3rem;
@@ -4141,7 +4995,7 @@ button:disabled,
4141
4995
  .related-add-input {
4142
4996
  flex: 1;
4143
4997
  width: 100%;
4144
- padding: 0.62rem 2rem 0.62rem 0.8rem;
4998
+ padding: var(--field-padding-y) var(--field-padding-x);
4145
4999
  font-size: 0.86rem;
4146
5000
  }
4147
5001
 
@@ -4828,6 +5682,27 @@ button:disabled,
4828
5682
  }
4829
5683
  }
4830
5684
 
5685
+ [data-reduced-motion="reduce"] *,
5686
+ [data-reduced-motion="reduce"] *::before,
5687
+ [data-reduced-motion="reduce"] *::after {
5688
+ scroll-behavior: auto !important;
5689
+ transition-duration: 0.01ms !important;
5690
+ animation-duration: 0.01ms !important;
5691
+ animation-iteration-count: 1 !important;
5692
+ }
5693
+
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 {
5699
+ animation: none;
5700
+ }
5701
+
5702
+ [data-reduced-motion="reduce"][data-theme="dark"] .meteor {
5703
+ display: none;
5704
+ }
5705
+
4831
5706
  [data-theme="dark"] {
4832
5707
  /* Tells the browser to render native widgets (dropdowns, scrollbars,
4833
5708
  date pickers, etc.) in their dark variant so option popups match. */
@@ -4890,3 +5765,198 @@ button:disabled,
4890
5765
  --scrollbar-thumb: rgba(var(--starlight-rgb),0.3);
4891
5766
  --scrollbar-thumb-hover: rgba(var(--starlight-rgb),0.5);
4892
5767
  }
5768
+
5769
+ .attachment-heading-row {
5770
+ display: flex;
5771
+ align-items: center;
5772
+ justify-content: space-between;
5773
+ gap: 0.75rem;
5774
+ margin-bottom: 0.7rem;
5775
+ }
5776
+
5777
+ .attachment-heading-row h3 {
5778
+ margin-bottom: 0;
5779
+ }
5780
+
5781
+ .attachment-upload-button {
5782
+ position: relative;
5783
+ display: inline-flex;
5784
+ align-items: center;
5785
+ justify-content: center;
5786
+ padding: 0.45rem 0.75rem;
5787
+ border: 1px solid var(--line);
5788
+ border-radius: 999px;
5789
+ cursor: url('cursors/live_link.cur'), pointer;
5790
+ font-size: 0.8rem;
5791
+ font-weight: 800;
5792
+ }
5793
+
5794
+ .attachment-upload-button input {
5795
+ position: absolute;
5796
+ inset: 0;
5797
+ opacity: 0;
5798
+ cursor: inherit;
5799
+ }
5800
+
5801
+ .attachment-dropzone {
5802
+ display: grid;
5803
+ gap: 0.18rem;
5804
+ padding: 0.9rem;
5805
+ border: 1px dashed var(--accent-border);
5806
+ border-radius: 14px;
5807
+ background: var(--surface-dim);
5808
+ color: var(--muted);
5809
+ outline: none;
5810
+ transition: background 140ms ease, border-color 140ms ease, box-shadow 140ms ease;
5811
+ }
5812
+
5813
+ .attachment-dropzone strong {
5814
+ color: var(--ink);
5815
+ }
5816
+
5817
+ .attachment-dropzone span {
5818
+ font-size: 0.82rem;
5819
+ }
5820
+
5821
+ .attachment-dropzone:focus-visible,
5822
+ .attachment-dropzone.is-dragover {
5823
+ border-color: var(--accent-focus-border);
5824
+ background: var(--accent-hover);
5825
+ box-shadow: var(--accent-ring);
5826
+ }
5827
+
5828
+ .attachment-grid {
5829
+ display: grid;
5830
+ grid-template-columns: repeat(auto-fill, minmax(9.5rem, 1fr));
5831
+ gap: 0.65rem;
5832
+ margin-top: 0.75rem;
5833
+ }
5834
+
5835
+ .attachment-card {
5836
+ position: relative;
5837
+ overflow: hidden;
5838
+ border: 1px solid var(--line);
5839
+ border-radius: 14px;
5840
+ background: var(--surface-card);
5841
+ }
5842
+
5843
+ .attachment-thumb-button {
5844
+ display: block;
5845
+ width: 100%;
5846
+ padding: 0;
5847
+ border: 0;
5848
+ background: var(--surface-dim);
5849
+ cursor: url('cursors/live_link.cur'), pointer;
5850
+ }
5851
+
5852
+ .attachment-thumb-button img,
5853
+ .attachment-missing-thumb {
5854
+ display: block;
5855
+ width: 100%;
5856
+ aspect-ratio: 4 / 3;
5857
+ object-fit: cover;
5858
+ }
5859
+
5860
+ .attachment-missing-thumb {
5861
+ display: grid;
5862
+ place-items: center;
5863
+ color: var(--muted);
5864
+ background: repeating-linear-gradient(45deg, var(--surface-dim), var(--surface-dim) 10px, var(--subtle-bg) 10px, var(--subtle-bg) 20px);
5865
+ font-size: 0.78rem;
5866
+ font-weight: 800;
5867
+ text-transform: uppercase;
5868
+ }
5869
+
5870
+ .attachment-card-meta {
5871
+ display: grid;
5872
+ gap: 0.15rem;
5873
+ min-width: 0;
5874
+ padding: 0.55rem 2rem 0.55rem 0.65rem;
5875
+ }
5876
+
5877
+ .attachment-card-meta strong,
5878
+ .attachment-card-meta span {
5879
+ overflow: hidden;
5880
+ text-overflow: ellipsis;
5881
+ white-space: nowrap;
5882
+ }
5883
+
5884
+ .attachment-card-meta strong {
5885
+ font-size: 0.82rem;
5886
+ }
5887
+
5888
+ .attachment-card-meta span {
5889
+ color: var(--muted);
5890
+ font-size: 0.72rem;
5891
+ }
5892
+
5893
+ .attachment-delete {
5894
+ position: absolute;
5895
+ right: 0.45rem;
5896
+ bottom: 0.45rem;
5897
+ display: inline-grid;
5898
+ width: 1.45rem;
5899
+ height: 1.45rem;
5900
+ place-items: center;
5901
+ padding: 0;
5902
+ border: 1px solid var(--line);
5903
+ border-radius: 999px;
5904
+ background: var(--surface);
5905
+ color: var(--muted);
5906
+ cursor: url('cursors/live_link.cur'), pointer;
5907
+ }
5908
+
5909
+ .attachment-delete:hover {
5910
+ color: var(--danger, #d44);
5911
+ border-color: rgba(var(--red-rgb),0.35);
5912
+ background: rgba(var(--red-rgb),0.08);
5913
+ }
5914
+
5915
+ .attachment-lightbox {
5916
+ position: fixed;
5917
+ inset: 0;
5918
+ z-index: 1200;
5919
+ display: grid;
5920
+ place-items: center;
5921
+ padding: 1rem;
5922
+ background: rgba(2, 6, 23, 0.82);
5923
+ }
5924
+
5925
+ .attachment-lightbox-panel {
5926
+ position: relative;
5927
+ display: grid;
5928
+ gap: 0.6rem;
5929
+ max-width: min(92vw, 72rem);
5930
+ max-height: 92vh;
5931
+ color: white;
5932
+ }
5933
+
5934
+ .attachment-lightbox-panel img {
5935
+ max-width: 100%;
5936
+ max-height: 82vh;
5937
+ border-radius: 16px;
5938
+ object-fit: contain;
5939
+ box-shadow: 0 24px 80px rgba(0,0,0,0.45);
5940
+ }
5941
+
5942
+ .attachment-lightbox-panel p {
5943
+ margin: 0;
5944
+ color: rgba(255,255,255,0.82);
5945
+ text-align: center;
5946
+ }
5947
+
5948
+ .attachment-lightbox-close {
5949
+ position: absolute;
5950
+ top: -0.75rem;
5951
+ right: -0.75rem;
5952
+ display: inline-grid;
5953
+ width: 2.2rem;
5954
+ height: 2.2rem;
5955
+ place-items: center;
5956
+ border: 1px solid rgba(255,255,255,0.25);
5957
+ border-radius: 999px;
5958
+ background: rgba(15, 23, 42, 0.92);
5959
+ color: white;
5960
+ font-size: 1.4rem;
5961
+ cursor: url('cursors/live_link.cur'), pointer;
5962
+ }