@starlove/orbit 1.0.7 → 1.1.1

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 (48) hide show
  1. package/README.md +22 -7
  2. package/SKILL-ORBIT.md +26 -1
  3. package/dist/full/index.html +2 -2
  4. package/dist/full/js/app.a4f045fc.js +676 -0
  5. package/dist/full/js/app.a4f045fc.js.map +7 -0
  6. package/dist/full/{styles.14e9dbbd.css → styles.836872e7.css} +836 -39
  7. package/dist/full/version.json +2 -2
  8. package/docs/AGENT_PROTOCOL.md +23 -5
  9. package/docs/MCP_SETUP.md +5 -3
  10. package/docs/ORBIT_DISPATCH.md +185 -0
  11. package/docs/setup/orbit-init-wizard.md +174 -0
  12. package/package.json +2 -2
  13. package/public/js/actor-labels.js +65 -0
  14. package/public/js/app.js +8 -1
  15. package/public/js/card-actions.js +526 -0
  16. package/public/js/config.js +2 -1
  17. package/public/js/format.js +204 -10
  18. package/public/js/kanban.js +15 -0
  19. package/public/js/local-backend.js +24 -8
  20. package/public/js/router.js +3 -2
  21. package/public/js/search.js +6 -3
  22. package/public/js/settings.js +96 -26
  23. package/public/js/state.js +50 -0
  24. package/public/js/ticket-detail.js +428 -125
  25. package/public/styles.css +836 -39
  26. package/src/cli/orbit.js +217 -32
  27. package/src/core/agent.js +114 -24
  28. package/src/core/agents-md.js +15 -10
  29. package/src/core/attachments.js +238 -0
  30. package/src/core/auth.js +36 -0
  31. package/src/core/backups.js +9 -3
  32. package/src/core/board.js +32 -1
  33. package/src/core/boards.js +1 -1
  34. package/src/core/db.js +42 -2
  35. package/src/core/delete-board.js +87 -21
  36. package/src/core/dispatch.js +532 -0
  37. package/src/core/http.js +31 -11
  38. package/src/core/migrate.js +198 -0
  39. package/src/core/paths.js +6 -0
  40. package/src/core/registry.js +12 -9
  41. package/src/core/router.js +81 -7
  42. package/src/core/search.js +83 -10
  43. package/src/core/snapshots.js +14 -2
  44. package/src/mcp/orbit-client.js +109 -46
  45. package/src/mcp-server.js +238 -12
  46. package/src/server.js +20 -0
  47. package/dist/full/js/app.f4fd5e94.js +0 -604
  48. package/dist/full/js/app.f4fd5e94.js.map +0 -7
@@ -80,6 +80,9 @@ input[type="file"] {
80
80
  --scrollbar-thumb: rgba(var(--accent-rgb),0.45);
81
81
  --scrollbar-thumb-hover: rgba(var(--accent-rgb),0.65);
82
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;
83
86
  /* RGB channels — use as rgba(var(--name), alpha) for arbitrary-opacity tints */
84
87
  --paper-rgb: 255, 252, 246; /* warm cream paper — light-mode surface/inset base */
85
88
  --warmth-rgb: 53, 43, 28; /* warm parchment brown — light-mode shadow tint */
@@ -97,7 +100,7 @@ input[type="file"] {
97
100
  --indigo-rgb: 139, 92, 246; /* dark-mode epic gradient tint 2 / orbit-accent-2 */
98
101
  --coral-rgb: 248, 113, 113; /* dark-mode bug card bezel (brighter than --red-rgb) */
99
102
  /* Native <select> chevron: same horizontal inset for value text (left) and glyph (right). */
100
- --select-chevron-pad-x: 0.55rem;
103
+ --select-chevron-pad-x: var(--field-padding-x);
101
104
  --select-chevron-size: 12px;
102
105
  }
103
106
 
@@ -255,6 +258,24 @@ textarea {
255
258
  outline: none;
256
259
  }
257
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
+
258
279
  input:focus,
259
280
  select:focus,
260
281
  textarea:focus {
@@ -654,7 +675,7 @@ h1 {
654
675
 
655
676
  .menu-flyout-form input {
656
677
  width: 100%;
657
- padding: 0.42rem 0.55rem;
678
+ padding: var(--field-padding-y) var(--field-padding-x);
658
679
  border: 1px solid var(--line);
659
680
  border-radius: 8px;
660
681
  font: inherit;
@@ -953,7 +974,7 @@ h1 {
953
974
  .create-flyout-form input[type="text"],
954
975
  .create-flyout-form textarea {
955
976
  width: 100%;
956
- padding: 0.62rem 0.8rem;
977
+ padding: var(--field-padding-y) var(--field-padding-x);
957
978
  border: 1px solid var(--line);
958
979
  border-radius: 10px;
959
980
  font: inherit;
@@ -963,7 +984,7 @@ h1 {
963
984
 
964
985
  .create-flyout-form select.select-chevron-field {
965
986
  width: 100%;
966
- padding: 0.62rem var(--select-chevron-pad-x);
987
+ padding: var(--field-padding-y) var(--select-chevron-pad-x);
967
988
  padding-right: calc(var(--select-chevron-pad-x) * 2 + var(--select-chevron-size));
968
989
  border: 1px solid var(--line);
969
990
  border-radius: 10px;
@@ -1043,7 +1064,7 @@ h1 {
1043
1064
 
1044
1065
  .topbar-search input {
1045
1066
  width: 100%;
1046
- padding: 0.42rem 0.65rem;
1067
+ padding: var(--field-padding-y) var(--field-padding-x);
1047
1068
  border: 1px solid var(--line);
1048
1069
  border-radius: 10px;
1049
1070
  background: var(--surface-input);
@@ -1063,7 +1084,7 @@ h1 {
1063
1084
  .drawer-composer textarea,
1064
1085
  .composer input,
1065
1086
  .composer textarea {
1066
- padding: 0.82rem 0.95rem;
1087
+ padding: var(--field-padding-y) var(--field-padding-x);
1067
1088
  }
1068
1089
 
1069
1090
  .drawer-composer textarea,
@@ -1080,11 +1101,11 @@ h1 {
1080
1101
 
1081
1102
  .composer-row select,
1082
1103
  .composer-row input {
1083
- padding: 0.7rem 0.8rem;
1104
+ padding: var(--field-padding-y) var(--field-padding-x);
1084
1105
  }
1085
1106
 
1086
1107
  .composer-row select.select-chevron-field {
1087
- padding: 0.7rem var(--select-chevron-pad-x);
1108
+ padding: var(--field-padding-y) var(--select-chevron-pad-x);
1088
1109
  padding-right: calc(var(--select-chevron-pad-x) * 2 + var(--select-chevron-size));
1089
1110
  }
1090
1111
 
@@ -1103,11 +1124,45 @@ h1 {
1103
1124
  }
1104
1125
 
1105
1126
  .search-hit {
1127
+ display: flex;
1128
+ align-items: center;
1129
+ gap: 0.65rem;
1106
1130
  padding: 0.85rem;
1107
1131
  border-bottom: 1px solid var(--line);
1108
1132
  cursor: url('cursors/live_link.cur'), pointer;
1109
1133
  }
1110
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
+
1111
1166
  .search-hit:hover {
1112
1167
  background: var(--accent-hover);
1113
1168
  }
@@ -1649,6 +1704,120 @@ h1 {
1649
1704
  outline-offset: -1px;
1650
1705
  }
1651
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
+
1652
1821
  /* Dark card glass — starscape palette. Hover uses filter+drop-shadow only
1653
1822
  so per-type bezels survive. Selected uses outline so bezel box-shadow stays intact. */
1654
1823
  [data-theme="dark"] .card {
@@ -2223,6 +2392,7 @@ h1 {
2223
2392
  the second line of cards in the lanes for visual consistency. */
2224
2393
  .drawer-subtitle {
2225
2394
  display: flex;
2395
+ flex-wrap: wrap;
2226
2396
  align-items: center;
2227
2397
  gap: 0.55rem;
2228
2398
  margin-top: 0.45rem;
@@ -2241,6 +2411,280 @@ h1 {
2241
2411
  font-variant-numeric: tabular-nums;
2242
2412
  }
2243
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
+
2244
2688
  .drawer-title-text {
2245
2689
  margin: 0;
2246
2690
  font-size: 1.2rem;
@@ -2452,7 +2896,7 @@ h1 {
2452
2896
 
2453
2897
  .inline-title-editor {
2454
2898
  margin-inline: -0.35rem;
2455
- padding: 0.3rem 0.5rem;
2899
+ padding: var(--field-padding-y) var(--field-padding-x);
2456
2900
  font-size: 1.35rem;
2457
2901
  font-weight: inherit;
2458
2902
  letter-spacing: -0.04em;
@@ -2461,7 +2905,7 @@ h1 {
2461
2905
 
2462
2906
  .inline-desc-editor {
2463
2907
  margin-top: 0.5rem;
2464
- padding: 0.65rem 0.75rem;
2908
+ padding: var(--field-padding-y) var(--field-padding-x);
2465
2909
  min-height: 5rem;
2466
2910
  font-size: 1rem;
2467
2911
  line-height: 1.45;
@@ -2478,31 +2922,117 @@ h1 {
2478
2922
  .markdown-body {
2479
2923
  white-space: normal;
2480
2924
  overflow-wrap: anywhere;
2925
+ tab-size: 4;
2481
2926
  }
2482
2927
 
2483
2928
  .markdown-body p,
2484
2929
  .markdown-body ul,
2485
2930
  .markdown-body ol,
2486
- .markdown-body pre {
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 {
2487
2939
  margin: 0;
2488
2940
  }
2489
2941
 
2490
- .markdown-body p + p,
2491
- .markdown-body p + ul,
2492
- .markdown-body p + ol,
2493
- .markdown-body p + pre,
2494
- .markdown-body ul + p,
2495
- .markdown-body ul + ol,
2496
- .markdown-body ul + pre,
2497
- .markdown-body ol + p,
2498
- .markdown-body ol + ul,
2499
- .markdown-body ol + pre,
2500
- .markdown-body pre + p,
2501
- .markdown-body pre + ul,
2502
- .markdown-body pre + ol {
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 > * + * {
2503
2947
  margin-top: 0.55rem;
2504
2948
  }
2505
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
+
2506
3036
  .markdown-body ul,
2507
3037
  .markdown-body ol {
2508
3038
  padding-left: 1.25rem;
@@ -2574,6 +3104,16 @@ h1 {
2574
3104
  line-height: 1.55;
2575
3105
  }
2576
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
+
2577
3117
  /* Project Repository tab metadata grid for read-only repository details. */
2578
3118
  .meta-grid {
2579
3119
  display: grid;
@@ -2678,7 +3218,7 @@ h1 {
2678
3218
  .meta-inline {
2679
3219
  width: 100%;
2680
3220
  margin: 0;
2681
- padding: 0.42rem 0.55rem;
3221
+ padding: var(--field-padding-y) var(--field-padding-x);
2682
3222
  border: 1px solid transparent;
2683
3223
  border-radius: 10px;
2684
3224
  /* Use background-color only — `background` shorthand resets background-image
@@ -2863,7 +3403,7 @@ input.meta-inline {
2863
3403
  .label-add-input {
2864
3404
  flex: 1;
2865
3405
  min-width: 8rem;
2866
- padding: 0.62rem 0.8rem;
3406
+ padding: var(--field-padding-y) var(--field-padding-x);
2867
3407
  font-size: 0.86rem;
2868
3408
  }
2869
3409
 
@@ -3037,10 +3577,14 @@ details.section > summary .mcp-title-row {
3037
3577
 
3038
3578
  .comment-body {
3039
3579
  margin-top: 0.35rem;
3040
- white-space: pre-wrap;
3041
3580
  line-height: 1.4;
3042
3581
  }
3043
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
+
3044
3588
  .comment-form {
3045
3589
  display: grid;
3046
3590
  gap: 0.5rem;
@@ -3049,7 +3593,7 @@ details.section > summary .mcp-title-row {
3049
3593
 
3050
3594
  .comment-form textarea {
3051
3595
  min-height: 5rem;
3052
- padding: 0.8rem;
3596
+ padding: var(--field-padding-y) var(--field-padding-x);
3053
3597
  resize: vertical;
3054
3598
  }
3055
3599
 
@@ -3073,7 +3617,7 @@ details.section > summary .mcp-title-row {
3073
3617
 
3074
3618
  .field-form textarea {
3075
3619
  min-height: 6rem;
3076
- padding: 0.62rem 0.8rem;
3620
+ padding: var(--field-padding-y) var(--field-padding-x);
3077
3621
  resize: vertical;
3078
3622
  }
3079
3623
 
@@ -3095,8 +3639,42 @@ details.section > summary .mcp-title-row {
3095
3639
  margin-top: 0.65rem;
3096
3640
  }
3097
3641
 
3098
- .field-form textarea[name="implementation_updates"] {
3099
- 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;
3100
3678
  }
3101
3679
 
3102
3680
  .ai-context-setup textarea[name="agent_instructions"] {
@@ -3212,7 +3790,7 @@ details.section > summary .mcp-title-row {
3212
3790
 
3213
3791
  .repository-confirm-field input {
3214
3792
  width: 100%;
3215
- padding: 0.62rem 0.8rem;
3793
+ padding: var(--field-padding-y) var(--field-padding-x);
3216
3794
  }
3217
3795
 
3218
3796
  [data-theme="dark"] .repository-danger-zone {
@@ -3238,11 +3816,11 @@ details.section > summary .mcp-title-row {
3238
3816
  }
3239
3817
 
3240
3818
  .project-entry-form input {
3241
- padding: 0.62rem 0.8rem;
3819
+ padding: var(--field-padding-y) var(--field-padding-x);
3242
3820
  }
3243
3821
 
3244
3822
  .project-entry-form select.select-chevron-field {
3245
- padding: 0.62rem var(--select-chevron-pad-x);
3823
+ padding: var(--field-padding-y) var(--select-chevron-pad-x);
3246
3824
  padding-right: calc(var(--select-chevron-pad-x) * 2 + var(--select-chevron-size));
3247
3825
  }
3248
3826
 
@@ -3735,7 +4313,7 @@ details.section > summary .mcp-title-row {
3735
4313
  }
3736
4314
 
3737
4315
  .mcp-flow select.select-chevron-field {
3738
- padding: 0.62rem var(--select-chevron-pad-x);
4316
+ padding: var(--field-padding-y) var(--select-chevron-pad-x);
3739
4317
  padding-right: calc(var(--select-chevron-pad-x) * 2 + var(--select-chevron-size));
3740
4318
  font-size: 0.88rem;
3741
4319
  }
@@ -3816,7 +4394,7 @@ details.section > summary .mcp-title-row {
3816
4394
 
3817
4395
  .mcp-path-grid input {
3818
4396
  min-width: 0;
3819
- padding: 0.55rem 0.65rem;
4397
+ padding: var(--field-padding-y) var(--field-padding-x);
3820
4398
  font-size: 0.82rem;
3821
4399
  }
3822
4400
 
@@ -4071,13 +4649,13 @@ details.section > summary .mcp-title-row {
4071
4649
  .lane-row select,
4072
4650
  .lane-create-form input,
4073
4651
  .lane-create-form select {
4074
- padding: 0.5rem 0.65rem;
4652
+ padding: var(--field-padding-y) var(--field-padding-x);
4075
4653
  font-size: 0.86rem;
4076
4654
  }
4077
4655
 
4078
4656
  .lane-row select.select-chevron-field,
4079
4657
  .lane-create-form select.select-chevron-field {
4080
- padding: 0.5rem var(--select-chevron-pad-x);
4658
+ padding: var(--field-padding-y) var(--select-chevron-pad-x);
4081
4659
  padding-right: calc(var(--select-chevron-pad-x) * 2 + var(--select-chevron-size));
4082
4660
  }
4083
4661
 
@@ -4296,6 +4874,30 @@ button:disabled,
4296
4874
  margin-top: auto;
4297
4875
  }
4298
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
+
4299
4901
  .card-eyebrow {
4300
4902
  display: block;
4301
4903
  margin-bottom: 0.3rem;
@@ -4393,7 +4995,7 @@ button:disabled,
4393
4995
  .related-add-input {
4394
4996
  flex: 1;
4395
4997
  width: 100%;
4396
- padding: 0.62rem 2rem 0.62rem 0.8rem;
4998
+ padding: var(--field-padding-y) var(--field-padding-x);
4397
4999
  font-size: 0.86rem;
4398
5000
  }
4399
5001
 
@@ -5163,3 +5765,198 @@ button:disabled,
5163
5765
  --scrollbar-thumb: rgba(var(--starlight-rgb),0.3);
5164
5766
  --scrollbar-thumb-hover: rgba(var(--starlight-rgb),0.5);
5165
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
+ }