beads-enhanced-ui 0.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.
package/app/styles.css ADDED
@@ -0,0 +1,2342 @@
1
+ :root {
2
+ --fg: #222;
3
+ --bg: #fff;
4
+ --muted: #666;
5
+ --border: #e5e7eb;
6
+ --panel-bg: #fafafa;
7
+
8
+ /* Badges: base + derived via color-mix */
9
+ --badge-radius: 999px;
10
+
11
+ /* Status base colors */
12
+ --status-open-base: #51cb4e; /* open */
13
+ --status-in-progress-base: #666666; /* in_progress */
14
+ --status-closed-base: #5f26c9; /* closed */
15
+
16
+ /* Type base colors */
17
+ --type-bug-base: #9f2011;
18
+ --type-task-base: #cd9e33;
19
+ --type-epic-base: #f69842;
20
+ --type-feature-base: #51cb43;
21
+ --type-chore-base: #666666;
22
+
23
+ /* Neutral badge */
24
+ --badge-bg-neutral: color-mix(in srgb, var(--panel-bg) 85%, #6b7280);
25
+ --badge-fg-neutral: color-mix(in srgb, #6b7280 85%, #000);
26
+
27
+ /* Derived Type badge colors (light) */
28
+ --badge-bg-bug: color-mix(in srgb, var(--panel-bg) 85%, var(--type-bug-base));
29
+ --badge-fg-bug: color-mix(in srgb, var(--type-bug-base) 90%, #000);
30
+ --badge-bg-feature: color-mix(
31
+ in srgb,
32
+ var(--panel-bg) 85%,
33
+ var(--type-feature-base)
34
+ );
35
+ --badge-fg-feature: color-mix(in srgb, var(--type-feature-base) 90%, #000);
36
+ --badge-bg-task: color-mix(
37
+ in srgb,
38
+ var(--panel-bg) 85%,
39
+ var(--type-task-base)
40
+ );
41
+ --badge-fg-task: color-mix(in srgb, var(--type-task-base) 90%, #000);
42
+ --badge-bg-epic: color-mix(
43
+ in srgb,
44
+ var(--panel-bg) 85%,
45
+ var(--type-epic-base)
46
+ );
47
+ --badge-fg-epic: color-mix(in srgb, var(--type-epic-base) 90%, #000);
48
+ --badge-bg-chore: color-mix(
49
+ in srgb,
50
+ var(--panel-bg) 85%,
51
+ var(--type-chore-base)
52
+ );
53
+ --badge-fg-chore: color-mix(in srgb, var(--type-chore-base) 90%, #000);
54
+
55
+ /* Links */
56
+ --link: #1d4ed8;
57
+ --link-hover: #1e40af;
58
+ --link-visited: #6d28d9;
59
+
60
+ /* Markdown code/pre */
61
+ --code-bg: #f3f4f6;
62
+ --code-fg: #111827;
63
+ --pre-bg: #0b1021;
64
+ --pre-fg: #e5e7eb;
65
+
66
+ /* focus ring */
67
+ --outline-offset-l: 6px;
68
+ --outline-offset-m: 2px;
69
+ --outline-offset-s: 0px;
70
+
71
+ /* New design tokens (light fallbacks) */
72
+ --surface-raised: var(--bg);
73
+ --control-bg: #ffffff;
74
+ --button-bg: #f3f4f6;
75
+ --border-row: var(--border);
76
+ --border-tab: var(--border);
77
+ --button-border: #d1d5db;
78
+ --fg-strong: var(--fg);
79
+ --fg-mid: var(--muted);
80
+ --fg-dim: #888888;
81
+ --progress-track: #e5e7eb;
82
+
83
+ /* Spacing scale (2px baseline) */
84
+ --space-0: 0;
85
+ --space-1: 2px;
86
+ --space-2: 4px;
87
+ --space-3: 6px;
88
+ --space-4: 8px;
89
+ --space-5: 10px;
90
+ --space-6: 12px;
91
+ --space-7: 14px;
92
+ --space-8: 16px;
93
+ --space-9: 18px;
94
+ --space-10: 20px;
95
+ }
96
+
97
+ html,
98
+ body {
99
+ height: 100%;
100
+ margin: 0;
101
+ }
102
+
103
+ /* Ensure the HTML hidden attribute wins over any display rules we set on routes */
104
+ [hidden] {
105
+ display: none !important;
106
+ }
107
+
108
+ body {
109
+ color: var(--fg);
110
+ background: var(--bg);
111
+ font-family:
112
+ -apple-system,
113
+ system-ui,
114
+ Segoe UI,
115
+ Roboto,
116
+ Ubuntu,
117
+ Cantarell,
118
+ Noto Sans,
119
+ sans-serif;
120
+ -webkit-font-smoothing: antialiased;
121
+ -moz-osx-font-smoothing: grayscale;
122
+ text-rendering: optimizeLegibility;
123
+ letter-spacing: 0.01em;
124
+ }
125
+
126
+ a {
127
+ color: var(--link);
128
+
129
+ &:visited {
130
+ color: var(--link-visited);
131
+ }
132
+ &:hover,
133
+ &:focus {
134
+ color: var(--link-hover);
135
+ }
136
+ }
137
+
138
+ .app-header {
139
+ position: sticky;
140
+ top: 0;
141
+ z-index: 50;
142
+ padding: var(--space-6) var(--space-9) 0 var(--space-9);
143
+ border-bottom: 1px solid var(--border);
144
+ display: flex;
145
+ align-items: start;
146
+ justify-content: space-between;
147
+ background: var(--panel-bg);
148
+ }
149
+ .app-title {
150
+ font-size: 18px;
151
+ margin: 0;
152
+ letter-spacing: 0.02em;
153
+ color: var(--fg-strong);
154
+ }
155
+
156
+ /* Header layout: group title + tabs on the left */
157
+ .header-left {
158
+ display: flex;
159
+ align-items: baseline;
160
+ gap: var(--space-6);
161
+ }
162
+
163
+ /* Workspace picker in header */
164
+ .header-workspace {
165
+ display: flex;
166
+ align-items: center;
167
+ color: var(--fg-dim);
168
+ }
169
+
170
+ .workspace-picker {
171
+ display: inline-flex;
172
+ align-items: center;
173
+ gap: var(--space-2);
174
+ }
175
+
176
+ .workspace-picker--single {
177
+ /* Single workspace: just show a label */
178
+ }
179
+
180
+ .workspace-picker__label {
181
+ font-size: 13px;
182
+ font-weight: 500;
183
+ color: var(--muted);
184
+ padding: var(--space-2) var(--space-3);
185
+ background: color-mix(in srgb, var(--control-bg) 60%, transparent);
186
+ border-radius: 6px;
187
+ max-width: 180px;
188
+ overflow: hidden;
189
+ text-overflow: ellipsis;
190
+ white-space: nowrap;
191
+ }
192
+
193
+ .workspace-picker__select {
194
+ font-size: 13px;
195
+ font-weight: 500;
196
+ padding: var(--space-2) var(--space-6) var(--space-2) var(--space-3);
197
+ border: 1px solid var(--border);
198
+ border-radius: 6px;
199
+ background: var(--control-bg);
200
+ color: var(--fg);
201
+ cursor: pointer;
202
+ min-width: 100px;
203
+ max-width: 180px;
204
+ appearance: none;
205
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='none'%3E%3Cpath d='M5 7l5 5 5-5H5z' fill='%23666'/%3E%3C/svg%3E");
206
+ background-repeat: no-repeat;
207
+ background-position: right 6px center;
208
+ background-size: 14px 14px;
209
+
210
+ &:hover {
211
+ border-color: color-mix(in srgb, var(--link) 50%, var(--border));
212
+ }
213
+
214
+ &:focus {
215
+ outline: none;
216
+ border-color: var(--link);
217
+ box-shadow: 0 0 0 2px color-mix(in srgb, var(--link) 20%, transparent);
218
+ }
219
+
220
+ &:disabled {
221
+ opacity: 0.6;
222
+ cursor: wait;
223
+ }
224
+ }
225
+
226
+ .workspace-picker__loading {
227
+ display: inline-block;
228
+ width: 14px;
229
+ height: 14px;
230
+ border-radius: 999px;
231
+ border: 2px solid color-mix(in srgb, var(--muted) 40%, transparent);
232
+ border-top-color: var(--link);
233
+ animation: header-spin 700ms linear infinite;
234
+ }
235
+
236
+ /* Header navigation tabs (sit next to title) */
237
+ .header-nav {
238
+ display: flex;
239
+ align-items: flex-end;
240
+ gap: var(--space-3);
241
+
242
+ .tab {
243
+ display: inline-block;
244
+ padding: var(--space-4) var(--space-6) 9px;
245
+ color: var(--fg-mid);
246
+ text-decoration: none;
247
+ font-weight: 600;
248
+ border: 1px solid transparent;
249
+ border-top-left-radius: 8px;
250
+ border-top-right-radius: 8px;
251
+ border-bottom-left-radius: 0;
252
+ border-bottom-right-radius: 0;
253
+ line-height: 1.2;
254
+
255
+ &:hover,
256
+ &:focus {
257
+ color: var(--fg);
258
+ outline-offset: var(--outline-offset-s);
259
+ }
260
+
261
+ &.active {
262
+ color: var(--fg-strong);
263
+ font-weight: 800;
264
+ background: var(--surface-raised);
265
+ border: 1px solid var(--border-tab);
266
+ border-bottom: none;
267
+ margin-bottom: -1px; /* overlap header bottom border */
268
+ padding-bottom: 10px;
269
+ position: relative;
270
+ z-index: 1;
271
+ }
272
+ }
273
+ }
274
+
275
+ .header-actions {
276
+ display: flex;
277
+ align-items: center;
278
+ gap: var(--space-5);
279
+ }
280
+ .header-loading {
281
+ display: inline-flex;
282
+ align-items: center;
283
+ justify-content: center;
284
+ width: 22px;
285
+ height: 22px;
286
+ color: var(--muted);
287
+ }
288
+ .header-loading__spinner {
289
+ width: 16px;
290
+ height: 16px;
291
+ border-radius: 999px;
292
+ border: 2px solid color-mix(in srgb, var(--muted) 55%, transparent);
293
+ border-top-color: var(--fg);
294
+ animation: header-spin 880ms linear infinite;
295
+ }
296
+
297
+ @keyframes header-spin {
298
+ to {
299
+ transform: rotate(360deg);
300
+ }
301
+ }
302
+ #new-issue-btn {
303
+ background: var(--button-bg);
304
+ border: 1px solid var(--button-border);
305
+ color: var(--fg-strong);
306
+ font-weight: 800;
307
+ font-size: 13px;
308
+ border-radius: 6px;
309
+ }
310
+
311
+ .theme-toggle {
312
+ display: inline-flex;
313
+ align-items: center;
314
+ gap: var(--space-3);
315
+ font-size: 12px;
316
+ color: var(--fg-mid);
317
+
318
+ input[type='checkbox'] {
319
+ --switch-h: 22px;
320
+ appearance: none;
321
+ position: relative;
322
+ width: 44px;
323
+ height: var(--switch-h);
324
+ border-radius: var(--switch-h);
325
+ border: 1px solid var(--button-border);
326
+ background: var(--control-bg);
327
+ transition:
328
+ background 160ms ease,
329
+ border-color 160ms ease;
330
+ cursor: pointer;
331
+
332
+ &::after {
333
+ content: '';
334
+ position: absolute;
335
+ top: 50%;
336
+ left: 2px;
337
+ width: calc(var(--switch-h) - 6px);
338
+ height: calc(var(--switch-h) - 6px);
339
+ border-radius: 999px;
340
+ background: var(--button-bg);
341
+ box-shadow: 0 1px 2px rgba(0, 0, 0, 0.2);
342
+ transform: translate(0, -50%);
343
+ transition: transform 180ms ease;
344
+ }
345
+
346
+ &:checked::after {
347
+ left: auto;
348
+ right: 2px;
349
+ transform: translate(0, -50%);
350
+ }
351
+ }
352
+ }
353
+
354
+ .app-shell {
355
+ /* Fill remaining viewport height below sticky header */
356
+ height: calc(100% - 53px);
357
+ }
358
+
359
+ /* Route shells */
360
+ .route {
361
+ min-height: 0; /* allow children to scroll */
362
+ }
363
+
364
+ /* Board route: fill height and let columns scroll */
365
+ .route {
366
+ &.board {
367
+ display: flex;
368
+ flex-direction: column;
369
+ min-height: 0;
370
+ height: 100%;
371
+ max-height: 100%;
372
+
373
+ .panel__body {
374
+ flex: 1;
375
+ min-height: 0;
376
+ overflow-x: auto; /* scroll columns horizontal */
377
+ }
378
+ }
379
+ }
380
+
381
+ .panel {
382
+ min-height: 0;
383
+ overflow: visible;
384
+ }
385
+
386
+ .panel__body {
387
+ overflow: auto;
388
+ }
389
+ .panel + .panel {
390
+ border-left: 1px solid var(--border);
391
+ }
392
+
393
+ .panel__header {
394
+ position: sticky;
395
+ top: 0;
396
+ background: inherit;
397
+ display: flex;
398
+ align-items: center;
399
+ justify-content: flex-start;
400
+ gap: var(--space-2);
401
+ min-height: 44px;
402
+ padding: var(--space-2) var(--space-3);
403
+ overflow: visible;
404
+ }
405
+
406
+ #detail-panel .panel__header {
407
+ padding-left: var(--space-9);
408
+ }
409
+
410
+ .muted {
411
+ color: var(--muted);
412
+ }
413
+
414
+ .text-truncate {
415
+ overflow: hidden;
416
+ white-space: nowrap;
417
+ text-overflow: ellipsis;
418
+ }
419
+
420
+ /* Details view */
421
+ .editable {
422
+ position: relative;
423
+ border-radius: 4px;
424
+ }
425
+ .editable:hover {
426
+ outline: 2px solid var(--control-border, var(--border));
427
+ outline-offset: var(--outline-offset-l);
428
+ }
429
+ .editable:focus-within {
430
+ outline: 2px solid color-mix(in srgb, var(--link) 60%, transparent);
431
+ outline-offset: var(--outline-offset-l);
432
+ cursor: text;
433
+ }
434
+ .editable-actions {
435
+ margin-top: var(--space-3);
436
+ display: flex;
437
+ gap: var(--space-4);
438
+ }
439
+
440
+ /* Minimal markdown styles */
441
+ .md {
442
+ h1 {
443
+ font-size: 20px;
444
+ margin: var(--space-6) 0 var(--space-3);
445
+ }
446
+ h2 {
447
+ font-size: 18px;
448
+ margin: var(--space-6) 0 var(--space-3);
449
+ }
450
+ h3 {
451
+ font-size: 16px;
452
+ margin: var(--space-5) 0 var(--space-3);
453
+ }
454
+ h4 {
455
+ font-size: 15px;
456
+ margin: var(--space-4) 0 var(--space-2);
457
+ }
458
+ h5,
459
+ h6 {
460
+ font-size: 14px;
461
+ margin: var(--space-3) 0 var(--space-2);
462
+ }
463
+ p {
464
+ margin: var(--space-3) 0;
465
+ }
466
+ ul,
467
+ ol {
468
+ margin: var(--space-3) 0 var(--space-3) var(--space-7);
469
+ padding-left: var(--space-7);
470
+ }
471
+ code {
472
+ background: var(--code-bg);
473
+ color: var(--code-fg);
474
+ padding: 3px var(--space-2);
475
+ border-radius: 3px;
476
+ }
477
+ pre {
478
+ background: var(--pre-bg);
479
+ color: var(--pre-fg);
480
+ padding: var(--space-5);
481
+ overflow: auto;
482
+ border-radius: 6px;
483
+ }
484
+ }
485
+
486
+ /* Form controls */
487
+ input[type='text'],
488
+ input[type='search'],
489
+ input[type='number'],
490
+ select,
491
+ textarea {
492
+ background: var(--control-bg, #fff);
493
+ color: var(--control-fg, var(--fg));
494
+ border: 1px solid var(--control-border, var(--border));
495
+ border-radius: 4px;
496
+ padding: var(--space-2) var(--space-3);
497
+ line-height: 2;
498
+ transition:
499
+ border-color 160ms ease,
500
+ box-shadow 160ms ease,
501
+ background 160ms ease;
502
+ }
503
+ input::placeholder,
504
+ textarea::placeholder {
505
+ color: var(--control-placeholder);
506
+ }
507
+ input:focus,
508
+ select:focus,
509
+ textarea:focus {
510
+ outline: none;
511
+ border-color: color-mix(in srgb, var(--link) 60%, var(--control-border));
512
+ box-shadow: 0 0 0 3px color-mix(in srgb, var(--link) 24%, transparent);
513
+ }
514
+ select {
515
+ appearance: none;
516
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='none'%3E%3Cpath d='M5 7l5 5 5-5H5z' fill='%23666'/%3E%3C/svg%3E");
517
+ background-repeat: no-repeat;
518
+ background-position: right 4px center;
519
+ background-size: 12px 12px;
520
+ padding-right: 24px;
521
+ }
522
+ button {
523
+ background: var(--button-bg, #f3f4f6);
524
+ color: var(--button-fg, var(--fg));
525
+ border: 1px solid var(--button-border, var(--border));
526
+ padding: var(--space-2) var(--space-4);
527
+ border-radius: 4px;
528
+ cursor: pointer;
529
+ transition:
530
+ background 140ms ease,
531
+ color 140ms ease,
532
+ border-color 140ms ease,
533
+ transform 60ms ease;
534
+ }
535
+ /* Inline issue ID renderer: looks like plain text */
536
+ button.id-copy {
537
+ display: inline-block;
538
+ background: transparent;
539
+ color: inherit;
540
+ border: none;
541
+ padding: 0;
542
+ margin: 0;
543
+ line-height: inherit;
544
+ font: inherit;
545
+ white-space: nowrap;
546
+ max-width: 100%;
547
+ overflow: hidden;
548
+ text-overflow: ellipsis;
549
+ vertical-align: bottom;
550
+ }
551
+ button.id-copy:hover {
552
+ text-decoration: underline;
553
+ }
554
+ button:hover {
555
+ filter: brightness(1.02);
556
+ }
557
+ button:active {
558
+ transform: translateY(1px);
559
+ }
560
+ button:disabled {
561
+ opacity: 0.6;
562
+ cursor: default;
563
+ }
564
+
565
+ /* Type badge */
566
+ .type-badge {
567
+ display: inline-block;
568
+ padding: 0 6px;
569
+ line-height: 18px;
570
+ height: 18px;
571
+ border-radius: var(--badge-radius);
572
+ font-size: 11px;
573
+ font-weight: 600;
574
+ vertical-align: middle;
575
+ user-select: none;
576
+ border: 1px solid color-mix(in srgb, currentColor 35%, transparent);
577
+ }
578
+ .type-badge[title] {
579
+ cursor: default;
580
+ }
581
+ .type-badge + .type-badge {
582
+ margin-left: var(--space-2);
583
+ }
584
+ .type-badge--neutral {
585
+ background: var(--badge-bg-neutral);
586
+ color: var(--badge-fg-neutral);
587
+ }
588
+ .type-badge--bug {
589
+ background: var(--badge-bg-bug);
590
+ color: var(--badge-fg-bug);
591
+ }
592
+ .type-badge--feature {
593
+ background: var(--badge-bg-feature);
594
+ color: var(--badge-fg-feature);
595
+ }
596
+ .type-badge--task {
597
+ background: var(--badge-bg-task);
598
+ color: var(--badge-fg-task);
599
+ }
600
+ .type-badge--epic {
601
+ background: var(--badge-bg-epic);
602
+ color: var(--badge-fg-epic);
603
+ }
604
+ .type-badge--chore {
605
+ background: var(--badge-bg-chore);
606
+ color: var(--badge-fg-chore);
607
+ }
608
+
609
+ /* Generic badge base (shared look) */
610
+ .badge,
611
+ .status-badge,
612
+ .priority-badge,
613
+ .badge-select {
614
+ display: inline-block;
615
+ padding: 0 8px;
616
+ line-height: 18px;
617
+ height: 18px;
618
+ border-radius: var(--badge-radius);
619
+ font-size: 11px;
620
+ font-weight: 600;
621
+ vertical-align: middle;
622
+ user-select: none;
623
+ border: 1px solid color-mix(in srgb, currentColor 35%, transparent);
624
+ text-wrap: nowrap;
625
+ overflow: hidden;
626
+ text-overflow: ellipsis;
627
+ }
628
+ .badge + .badge,
629
+ .status-badge + .status-badge,
630
+ .priority-badge + .priority-badge,
631
+ .badge-select + .badge-select {
632
+ margin-left: var(--space-2);
633
+ }
634
+
635
+ /* Status + Priority palette (light) derived from base */
636
+ :root {
637
+ /* Status badges */
638
+ --badge-bg-open: color-mix(
639
+ in srgb,
640
+ var(--panel-bg) 72%,
641
+ var(--status-open-base)
642
+ );
643
+ --badge-fg-open: color-mix(in srgb, var(--status-open-base) 90%, #000);
644
+ --badge-bg-in-progress: color-mix(
645
+ in srgb,
646
+ var(--panel-bg) 85%,
647
+ var(--status-in-progress-base)
648
+ );
649
+ --badge-fg-in-progress: color-mix(
650
+ in srgb,
651
+ var(--status-in-progress-base) 90%,
652
+ #000
653
+ );
654
+ --badge-bg-closed: color-mix(
655
+ in srgb,
656
+ var(--panel-bg) 85%,
657
+ var(--status-closed-base)
658
+ );
659
+ --badge-fg-closed: color-mix(in srgb, var(--status-closed-base) 90%, #000);
660
+
661
+ /* Priority palette mapped to provided colors */
662
+ /* p0 -> bug, p1 -> epic, p2 -> task, p3 -> feature, p4 -> chore */
663
+ --badge-bg-p0: color-mix(in srgb, var(--panel-bg) 85%, var(--type-bug-base));
664
+ --badge-fg-p0: color-mix(in srgb, var(--type-bug-base) 90%, #000);
665
+ --badge-bg-p1: color-mix(in srgb, var(--panel-bg) 72%, var(--type-epic-base));
666
+ --badge-fg-p1: color-mix(in srgb, var(--type-epic-base) 90%, #000);
667
+ --badge-bg-p2: color-mix(in srgb, var(--panel-bg) 72%, var(--type-task-base));
668
+ --badge-fg-p2: color-mix(in srgb, var(--type-task-base) 90%, #000);
669
+ --badge-bg-p3: color-mix(
670
+ in srgb,
671
+ var(--panel-bg) 72%,
672
+ var(--type-feature-base)
673
+ );
674
+ --badge-fg-p3: color-mix(in srgb, var(--type-feature-base) 90%, #000);
675
+ --badge-bg-p4: color-mix(
676
+ in srgb,
677
+ var(--panel-bg) 85%,
678
+ var(--type-chore-base)
679
+ );
680
+ --badge-fg-p4: color-mix(in srgb, var(--type-chore-base) 90%, #000);
681
+ }
682
+
683
+ @media (prefers-color-scheme: dark) {
684
+ :root {
685
+ --badge-bg-open: color-mix(
686
+ in srgb,
687
+ var(--panel-bg) 80%,
688
+ var(--status-open-base)
689
+ );
690
+ --badge-fg-open: color-mix(in srgb, var(--status-open-base) 75%, #fff);
691
+ --badge-bg-in-progress: color-mix(
692
+ in srgb,
693
+ var(--panel-bg) 80%,
694
+ var(--status-in-progress-base)
695
+ );
696
+ --badge-fg-in-progress: color-mix(
697
+ in srgb,
698
+ var(--status-in-progress-base) 75%,
699
+ #fff
700
+ );
701
+ --badge-bg-closed: color-mix(
702
+ in srgb,
703
+ var(--panel-bg) 80%,
704
+ var(--status-closed-base)
705
+ );
706
+ --badge-fg-closed: color-mix(in srgb, var(--status-closed-base) 75%, #fff);
707
+
708
+ --badge-bg-p0: color-mix(
709
+ in srgb,
710
+ var(--panel-bg) 80%,
711
+ var(--type-bug-base)
712
+ );
713
+ --badge-fg-p0: color-mix(in srgb, var(--type-bug-base) 75%, #fff);
714
+ --badge-bg-p1: color-mix(
715
+ in srgb,
716
+ var(--panel-bg) 80%,
717
+ var(--type-epic-base)
718
+ );
719
+ --badge-fg-p1: color-mix(in srgb, var(--type-epic-base) 75%, #fff);
720
+ --badge-bg-p2: color-mix(
721
+ in srgb,
722
+ var(--panel-bg) 80%,
723
+ var(--type-task-base)
724
+ );
725
+ --badge-fg-p2: color-mix(in srgb, var(--type-task-base) 75%, #fff);
726
+ --badge-bg-p3: color-mix(
727
+ in srgb,
728
+ var(--panel-bg) 80%,
729
+ var(--type-feature-base)
730
+ );
731
+ --badge-fg-p3: color-mix(in srgb, var(--type-feature-base) 75%, #fff);
732
+ --badge-bg-p4: color-mix(
733
+ in srgb,
734
+ var(--panel-bg) 80%,
735
+ var(--type-chore-base)
736
+ );
737
+ --badge-fg-p4: color-mix(in srgb, var(--type-chore-base) 75%, #fff);
738
+ }
739
+ }
740
+
741
+ html[data-theme='dark'] {
742
+ --badge-bg-open: color-mix(
743
+ in srgb,
744
+ var(--panel-bg) 80%,
745
+ var(--status-open-base)
746
+ );
747
+ --badge-fg-open: color-mix(in srgb, var(--status-open-base) 75%, #fff);
748
+ --badge-bg-in-progress: color-mix(
749
+ in srgb,
750
+ var(--panel-bg) 80%,
751
+ var(--status-in-progress-base)
752
+ );
753
+ --badge-fg-in-progress: color-mix(
754
+ in srgb,
755
+ var(--status-in-progress-base) 75%,
756
+ #fff
757
+ );
758
+ --badge-bg-closed: color-mix(
759
+ in srgb,
760
+ var(--panel-bg) 80%,
761
+ var(--status-closed-base)
762
+ );
763
+ --badge-fg-closed: color-mix(in srgb, var(--status-closed-base) 75%, #fff);
764
+
765
+ --badge-bg-p0: color-mix(in srgb, var(--panel-bg) 80%, var(--type-bug-base));
766
+ --badge-fg-p0: color-mix(in srgb, var(--type-bug-base) 75%, #fff);
767
+ --badge-bg-p1: color-mix(in srgb, var(--panel-bg) 80%, var(--type-epic-base));
768
+ --badge-fg-p1: color-mix(in srgb, var(--type-epic-base) 75%, #fff);
769
+ --badge-bg-p2: color-mix(in srgb, var(--panel-bg) 80%, var(--type-task-base));
770
+ --badge-fg-p2: color-mix(in srgb, var(--type-task-base) 75%, #fff);
771
+ --badge-bg-p3: color-mix(
772
+ in srgb,
773
+ var(--panel-bg) 80%,
774
+ var(--type-feature-base)
775
+ );
776
+ --badge-fg-p3: color-mix(in srgb, var(--type-feature-base) 75%, #fff);
777
+ --badge-bg-p4: color-mix(
778
+ in srgb,
779
+ var(--panel-bg) 80%,
780
+ var(--type-chore-base)
781
+ );
782
+ --badge-fg-p4: color-mix(in srgb, var(--type-chore-base) 75%, #fff);
783
+ }
784
+
785
+ .status-badge.is-open,
786
+ .badge-select.badge--status.is-open {
787
+ background: var(--badge-bg-open);
788
+ color: var(--badge-fg-open);
789
+ }
790
+ .status-badge.is-in_progress,
791
+ .badge-select.badge--status.is-in_progress {
792
+ background: var(--badge-bg-in-progress);
793
+ color: var(--badge-fg-in-progress);
794
+ }
795
+ .status-badge.is-closed,
796
+ .badge-select.badge--status.is-closed {
797
+ background: var(--badge-bg-closed);
798
+ color: var(--badge-fg-closed);
799
+ }
800
+
801
+ .priority-badge.is-p0,
802
+ .badge-select.badge--priority.is-p0 {
803
+ background: var(--badge-bg-p0);
804
+ color: var(--badge-fg-p0);
805
+ }
806
+ .priority-badge.is-p1,
807
+ .badge-select.badge--priority.is-p1 {
808
+ background: var(--badge-bg-p1);
809
+ color: var(--badge-fg-p1);
810
+ }
811
+ .priority-badge.is-p2,
812
+ .badge-select.badge--priority.is-p2 {
813
+ background: var(--badge-bg-p2);
814
+ color: var(--badge-fg-p2);
815
+ }
816
+ .priority-badge.is-p3,
817
+ .badge-select.badge--priority.is-p3 {
818
+ background: var(--badge-bg-p3);
819
+ color: var(--badge-fg-p3);
820
+ }
821
+ .priority-badge.is-p4,
822
+ .badge-select.badge--priority.is-p4 {
823
+ background: var(--badge-bg-p4);
824
+ color: var(--badge-fg-p4);
825
+ }
826
+
827
+ /* Make selects look like badges while keeping the native arrow */
828
+ .badge-select {
829
+ appearance: none;
830
+ border: none;
831
+ padding: 0 26px 0 8px; /* room for caret */
832
+ height: 20px;
833
+ line-height: 18px;
834
+ background-clip: padding-box;
835
+ cursor: pointer;
836
+ background-image: none;
837
+ }
838
+ .badge-select:focus {
839
+ outline: 2px solid color-mix(in srgb, var(--link) 50%, transparent);
840
+ outline-offset: var(--outline-offset-m);
841
+ box-shadow: none;
842
+ }
843
+ .badge-select-wrap {
844
+ position: relative;
845
+ display: inline-flex;
846
+ align-items: center;
847
+ max-width: 100%;
848
+ }
849
+ .badge-select-wrap .badge-select {
850
+ width: 100%;
851
+ }
852
+ .badge-select__caret {
853
+ position: absolute;
854
+ right: 8px;
855
+ display: inline-flex;
856
+ align-items: center;
857
+ justify-content: center;
858
+ width: 12px;
859
+ height: 12px;
860
+ color: currentColor;
861
+ opacity: 0.78;
862
+ pointer-events: none;
863
+ }
864
+ .badge-select__caret svg {
865
+ width: 12px;
866
+ height: 12px;
867
+ fill: none;
868
+ stroke: currentColor;
869
+ stroke-width: 1.7;
870
+ stroke-linecap: round;
871
+ stroke-linejoin: round;
872
+ }
873
+
874
+ /* Filter chip toggles */
875
+ .filter-bar {
876
+ display: flex;
877
+ flex-wrap: wrap;
878
+ gap: var(--space-2);
879
+ align-items: center;
880
+ }
881
+
882
+ .filter-group {
883
+ display: flex;
884
+ gap: var(--space-1);
885
+ align-items: center;
886
+ }
887
+
888
+ .filter-group__label {
889
+ font-size: 11px;
890
+ color: var(--muted);
891
+ margin-right: var(--space-1);
892
+ }
893
+
894
+ .filter-chip {
895
+ display: inline-block;
896
+ padding: 0 8px;
897
+ line-height: 20px;
898
+ height: 20px;
899
+ border-radius: var(--badge-radius);
900
+ font-size: 11px;
901
+ font-weight: 600;
902
+ cursor: pointer;
903
+ user-select: none;
904
+ border: none;
905
+ transition: opacity 0.15s ease;
906
+ }
907
+
908
+ .filter-chip:not(.is-active) {
909
+ opacity: 0.35;
910
+ }
911
+
912
+ .filter-chip:hover:not(.is-active) {
913
+ opacity: 0.6;
914
+ }
915
+
916
+ .filter-chip.is-active {
917
+ opacity: 1;
918
+ }
919
+
920
+ .filter-chip:focus {
921
+ outline: 2px solid color-mix(in srgb, var(--link) 50%, transparent);
922
+ outline-offset: var(--outline-offset-m);
923
+ }
924
+
925
+ /* Status filter chips */
926
+ .filter-chip--ready {
927
+ background: var(--badge-bg-open);
928
+ color: var(--badge-fg-open);
929
+ }
930
+
931
+ .filter-chip--open {
932
+ background: var(--badge-bg-open);
933
+ color: var(--badge-fg-open);
934
+ }
935
+
936
+ .filter-chip--in_progress {
937
+ background: var(--badge-bg-in-progress);
938
+ color: var(--badge-fg-in-progress);
939
+ }
940
+
941
+ .filter-chip--closed {
942
+ background: var(--badge-bg-closed);
943
+ color: var(--badge-fg-closed);
944
+ }
945
+
946
+ /* Type filter chips */
947
+ .filter-chip--bug {
948
+ background: var(--badge-bg-bug);
949
+ color: var(--badge-fg-bug);
950
+ }
951
+
952
+ .filter-chip--feature {
953
+ background: var(--badge-bg-feature);
954
+ color: var(--badge-fg-feature);
955
+ }
956
+
957
+ .filter-chip--task {
958
+ background: var(--badge-bg-task);
959
+ color: var(--badge-fg-task);
960
+ }
961
+
962
+ .filter-chip--epic {
963
+ background: var(--badge-bg-epic);
964
+ color: var(--badge-fg-epic);
965
+ }
966
+
967
+ .filter-chip--chore {
968
+ background: var(--badge-bg-chore);
969
+ color: var(--badge-fg-chore);
970
+ }
971
+
972
+ /* Dropdown multi-select filter */
973
+ .filter-dropdown {
974
+ position: relative;
975
+ display: inline-block;
976
+ }
977
+
978
+ .filter-dropdown__trigger {
979
+ display: inline-flex;
980
+ align-items: center;
981
+ gap: var(--space-1);
982
+ padding: 4px 8px;
983
+ font-size: 12px;
984
+ background: var(--panel-bg);
985
+ border: 1px solid var(--border);
986
+ border-radius: var(--badge-radius);
987
+ cursor: pointer;
988
+ }
989
+
990
+ .filter-dropdown__trigger:hover {
991
+ border-color: var(--link);
992
+ }
993
+
994
+ .filter-dropdown__trigger:focus {
995
+ outline: 2px solid color-mix(in srgb, var(--link) 50%, transparent);
996
+ outline-offset: var(--outline-offset-m);
997
+ }
998
+
999
+ .filter-dropdown__arrow {
1000
+ font-size: 10px;
1001
+ opacity: 0.6;
1002
+ }
1003
+
1004
+ .filter-dropdown__menu {
1005
+ display: none;
1006
+ position: absolute;
1007
+ top: 100%;
1008
+ left: 0;
1009
+ margin-top: 4px;
1010
+ min-width: 140px;
1011
+ background: var(--panel-bg);
1012
+ border: 1px solid var(--border);
1013
+ border-radius: 6px;
1014
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
1015
+ z-index: 1000;
1016
+ padding: 4px 0;
1017
+ }
1018
+
1019
+ .filter-dropdown.is-open .filter-dropdown__menu {
1020
+ display: block;
1021
+ }
1022
+
1023
+ .filter-dropdown__option {
1024
+ display: flex;
1025
+ align-items: center;
1026
+ gap: var(--space-2);
1027
+ padding: 6px 10px;
1028
+ cursor: pointer;
1029
+ font-size: 12px;
1030
+ }
1031
+
1032
+ .filter-dropdown__option:hover {
1033
+ background: color-mix(in srgb, var(--link) 10%, transparent);
1034
+ }
1035
+
1036
+ .filter-dropdown__option input[type='checkbox'] {
1037
+ margin: 0;
1038
+ }
1039
+
1040
+ /* Inline, minimal text input for table editing */
1041
+ input.inline-edit {
1042
+ border: none;
1043
+ background: transparent;
1044
+ padding: 0;
1045
+ margin: 0;
1046
+ line-height: inherit;
1047
+ font: inherit;
1048
+ outline: 2px solid var(--control-border, var(--border));
1049
+ outline-offset: var(--outline-offset);
1050
+ }
1051
+ input.inline-edit:focus {
1052
+ outline: 2px solid color-mix(in srgb, var(--link) 50%, transparent);
1053
+ outline-offset: var(--outline-offset-l);
1054
+ box-shadow: none;
1055
+ }
1056
+
1057
+ #list-panel .panel__header input[type='search'] {
1058
+ flex: 1;
1059
+ }
1060
+
1061
+ /* Issues list polish */
1062
+ #list-panel .panel__body ul {
1063
+ list-style: none;
1064
+ padding: 0;
1065
+ margin: 0;
1066
+ }
1067
+ #list-panel .panel__body li {
1068
+ display: grid;
1069
+ grid-template-columns: auto 1fr auto;
1070
+ align-items: center;
1071
+ gap: 8px 10px;
1072
+ padding: 10px 18px;
1073
+ margin: 0;
1074
+ border-radius: 8px;
1075
+ transition:
1076
+ background 140ms ease,
1077
+ transform 80ms ease,
1078
+ box-shadow 140ms ease;
1079
+ }
1080
+ #list-panel .panel__body li:hover {
1081
+ background: color-mix(in srgb, var(--control-bg) 60%, transparent);
1082
+ }
1083
+ #list-panel .panel__body li.selected {
1084
+ background: color-mix(in srgb, var(--link) 10%, transparent);
1085
+ box-shadow: 0 0 0 1px color-mix(in srgb, var(--link) 35%, var(--border)) inset;
1086
+ }
1087
+ #list-panel .panel__body li .muted {
1088
+ font-size: 12px;
1089
+ }
1090
+
1091
+ /* Details typography */
1092
+ #detail-panel .panel__body {
1093
+ line-height: 1.5;
1094
+ }
1095
+ #detail-panel .panel__body h1,
1096
+ #detail-panel .panel__body h2,
1097
+ #detail-panel .panel__body h3 {
1098
+ letter-spacing: 0.01em;
1099
+ }
1100
+
1101
+ /* Keyboard focus ring helper */
1102
+ :focus-visible {
1103
+ outline: 2px solid color-mix(in srgb, var(--link) 60%, transparent);
1104
+ outline-offset: var(--outline-offset-m);
1105
+ }
1106
+
1107
+ /* Subtle scrollbars (WebKit/Blink) */
1108
+ * {
1109
+ scrollbar-color: color-mix(in srgb, var(--muted) 35%, transparent) transparent;
1110
+ scrollbar-width: thin;
1111
+ }
1112
+ *::-webkit-scrollbar {
1113
+ width: 10px;
1114
+ height: 10px;
1115
+ }
1116
+ *::-webkit-scrollbar-thumb {
1117
+ background: color-mix(in srgb, var(--muted) 35%, transparent);
1118
+ border-radius: 10px;
1119
+ border: 2px solid transparent;
1120
+ background-clip: padding-box;
1121
+ }
1122
+ *::-webkit-scrollbar-track {
1123
+ background: transparent;
1124
+ }
1125
+
1126
+ /* Responsive: stack panels on narrow screens */
1127
+ @media (max-width: 900px) {
1128
+ .app-shell {
1129
+ height: auto;
1130
+ }
1131
+ .panel + .panel {
1132
+ border-left: none;
1133
+ border-top: 1px solid var(--border);
1134
+ }
1135
+ }
1136
+
1137
+ /* Detail content paddings */
1138
+ #detail-root {
1139
+ padding: 18px;
1140
+ }
1141
+
1142
+ /* Spacing for acceptance and notes sections in details */
1143
+ #detail-root .acceptance,
1144
+ #detail-root .design,
1145
+ #detail-root .notes {
1146
+ margin-top: 32px;
1147
+ }
1148
+ /* Keep editor font sizes consistent with read mode */
1149
+ #detail-root input[type='text'],
1150
+ #detail-root textarea {
1151
+ font-size: inherit;
1152
+ font-family: inherit;
1153
+ font-weight: inherit;
1154
+ line-height: inherit;
1155
+ }
1156
+ /* Title input fills available width and stays inline with buttons */
1157
+ #detail-root .detail-title h2 {
1158
+ display: flex;
1159
+ align-items: center;
1160
+ }
1161
+ #detail-root .detail-title h2 input[type='text'] {
1162
+ flex: 1;
1163
+ padding: 0;
1164
+ min-width: 10px;
1165
+ font-size: inherit;
1166
+ line-height: inherit;
1167
+ margin-right: 8px;
1168
+ }
1169
+ /* Remove borders in detail view; rely on global :focus-visible outline */
1170
+ #detail-root input[type='text'],
1171
+ #detail-root textarea {
1172
+ border: none;
1173
+ background: transparent;
1174
+ outline: 2px solid var(--control-border, var(--border));
1175
+ outline-offset: var(--outline-offset-l);
1176
+ }
1177
+ #detail-root input[type='text']:focus,
1178
+ #detail-root textarea:focus {
1179
+ border: none;
1180
+ box-shadow: none;
1181
+ outline: 2px solid color-mix(in srgb, var(--link) 60%, transparent);
1182
+ }
1183
+
1184
+ /* Epics view styles */
1185
+ .epics-table-wrap {
1186
+ padding: 0 12px 12px;
1187
+ overflow-x: auto;
1188
+ }
1189
+ .epics-table {
1190
+ width: 100%;
1191
+ min-width: 720px;
1192
+ border-collapse: separate;
1193
+ border-spacing: 0 10px;
1194
+ table-layout: fixed;
1195
+ }
1196
+ .epics-table__col--id {
1197
+ width: clamp(100px, 18vw, 200px);
1198
+ }
1199
+ .epics-table__col--type {
1200
+ width: 120px;
1201
+ }
1202
+ .epics-table__col--status {
1203
+ width: 120px;
1204
+ }
1205
+ .epics-table__col--assignee {
1206
+ width: 160px;
1207
+ }
1208
+ .epics-table__col--priority {
1209
+ width: 130px;
1210
+ }
1211
+ .epics-list-header th {
1212
+ height: 42px;
1213
+ padding: 0 var(--space-6);
1214
+ text-align: left;
1215
+ vertical-align: middle;
1216
+ }
1217
+ .epics-list-header__meta {
1218
+ color: var(--fg-mid);
1219
+ font-size: 11px;
1220
+ font-weight: 700;
1221
+ letter-spacing: 0.05em;
1222
+ text-transform: uppercase;
1223
+ }
1224
+ .epics-sort-button {
1225
+ display: inline-flex;
1226
+ align-items: center;
1227
+ gap: var(--space-2);
1228
+ padding: 0;
1229
+ border: none;
1230
+ background: transparent;
1231
+ color: var(--fg-mid);
1232
+ font-size: 11px;
1233
+ font-weight: 700;
1234
+ letter-spacing: 0.05em;
1235
+ text-transform: uppercase;
1236
+ cursor: pointer;
1237
+ }
1238
+ .epics-sort-button:hover,
1239
+ .epics-sort-button:focus-visible {
1240
+ color: var(--fg);
1241
+ }
1242
+ .epics-sort-button.is-active {
1243
+ color: var(--fg-mid);
1244
+ }
1245
+ .epics-sort-button svg {
1246
+ flex-shrink: 0;
1247
+ opacity: 0.7;
1248
+ }
1249
+ .epics-sort-button.is-active svg {
1250
+ opacity: 1;
1251
+ }
1252
+
1253
+ /* UI-83: Issues table container aligns with epics/cards */
1254
+ .issues-block {
1255
+ border: 1px solid var(--border);
1256
+ border-radius: 6px;
1257
+ margin: 0px 12px;
1258
+ overflow: hidden;
1259
+ background: var(--bg);
1260
+ }
1261
+ .epic-header-row {
1262
+ cursor: pointer;
1263
+ }
1264
+ .epic-header-row__cell {
1265
+ height: 40px;
1266
+ padding: 0 var(--space-6);
1267
+ background: var(--panel-bg);
1268
+ border-top: 1px solid var(--border-row);
1269
+ border-bottom: 1px solid var(--border-row);
1270
+ vertical-align: middle;
1271
+ min-width: 0;
1272
+ }
1273
+ .epic-header-row__cell:first-child {
1274
+ border-left: 1px solid var(--border-row);
1275
+ border-top-left-radius: 6px;
1276
+ border-bottom-left-radius: 6px;
1277
+ }
1278
+ .epic-header-row__cell:last-child {
1279
+ border-right: 1px solid var(--border-row);
1280
+ border-top-right-radius: 6px;
1281
+ border-bottom-right-radius: 6px;
1282
+ }
1283
+ .epic-header-row:hover .epic-header-row__cell,
1284
+ .epic-header-row:focus-visible .epic-header-row__cell {
1285
+ background: color-mix(in srgb, var(--panel-bg) 90%, var(--fg));
1286
+ }
1287
+ .epic-group.is-open .epic-header-row__cell:first-child {
1288
+ border-bottom-left-radius: 0;
1289
+ }
1290
+ .epic-group.is-open .epic-header-row__cell:last-child {
1291
+ border-bottom-right-radius: 0;
1292
+ }
1293
+ .epic-header-name {
1294
+ display: flex;
1295
+ align-items: center;
1296
+ gap: var(--space-3);
1297
+ min-width: 0;
1298
+ overflow: hidden;
1299
+ }
1300
+ .epic-header-row__cell--status {
1301
+ white-space: nowrap;
1302
+ }
1303
+ .epic-chevron {
1304
+ flex-shrink: 0;
1305
+ color: var(--muted);
1306
+ }
1307
+ .epic-progress {
1308
+ display: flex;
1309
+ align-items: center;
1310
+ justify-content: flex-start;
1311
+ gap: 8px;
1312
+ }
1313
+ .epic-progress span {
1314
+ color: var(--fg-mid);
1315
+ white-space: nowrap;
1316
+ text-align: right;
1317
+ width: 45px;
1318
+ flex: 0 0 45px;
1319
+ padding-right: var(--space-4);
1320
+ }
1321
+ .epic-progress progress {
1322
+ width: 200px;
1323
+ flex: 0 0 200px;
1324
+ height: 8px;
1325
+ accent-color: var(--status-closed-base);
1326
+ color-scheme: light dark;
1327
+ }
1328
+ .epic-progress progress::-webkit-progress-bar {
1329
+ background: var(--progress-track);
1330
+ border-radius: 4px;
1331
+ }
1332
+ .epic-progress progress::-webkit-progress-value {
1333
+ background: var(--status-closed-base);
1334
+ border-radius: 4px;
1335
+ }
1336
+ .epic-progress progress::-moz-progress-bar {
1337
+ background: var(--status-closed-base);
1338
+ border-radius: 4px;
1339
+ }
1340
+ .epic-children {
1341
+ padding: 0;
1342
+ background: var(--bg);
1343
+ border-top: 1px solid var(--border-row);
1344
+ border-right: 1px solid var(--border-row);
1345
+ border-bottom: 1px solid var(--border-row);
1346
+ border-left: 1px solid var(--border-row);
1347
+ border-bottom-left-radius: 6px;
1348
+ border-bottom-right-radius: 6px;
1349
+ overflow-x: auto;
1350
+ }
1351
+ .epic-children .table {
1352
+ min-width: 100%;
1353
+ }
1354
+ .epic-children .muted {
1355
+ display: block;
1356
+ }
1357
+
1358
+ @media (max-width: 900px) {
1359
+ .epics-table {
1360
+ min-width: 640px;
1361
+ }
1362
+ }
1363
+
1364
+ .table {
1365
+ width: 100%;
1366
+ border-collapse: collapse;
1367
+ table-layout: fixed; /* keep column proportions stable while editing */
1368
+
1369
+ th,
1370
+ td {
1371
+ text-align: left;
1372
+ padding: var(--space-6) var(--space-8);
1373
+ border-bottom: 1px solid color-mix(in srgb, var(--border) 70%, transparent);
1374
+ }
1375
+ /* Ensure form controls fill the cell */
1376
+ td {
1377
+ input[type='text'],
1378
+ select {
1379
+ width: 100%;
1380
+ box-sizing: border-box;
1381
+ }
1382
+ .editable {
1383
+ display: block;
1384
+ width: 100%;
1385
+ }
1386
+ }
1387
+ th {
1388
+ font-size: 12px;
1389
+ color: var(--muted);
1390
+ font-weight: 600;
1391
+ }
1392
+ }
1393
+ .epic-row td {
1394
+ box-sizing: border-box;
1395
+ height: 40px;
1396
+ padding-top: 0;
1397
+ padding-bottom: 0;
1398
+ vertical-align: middle;
1399
+ }
1400
+
1401
+ .epic-row:hover {
1402
+ background: color-mix(in srgb, var(--control-bg) 55%, transparent);
1403
+ }
1404
+
1405
+ /* Board view styles */
1406
+ .board-root {
1407
+ display: grid;
1408
+ grid-template-columns: repeat(4, 1fr);
1409
+ gap: var(--space-8);
1410
+ padding: var(--space-6);
1411
+ }
1412
+ .board-column {
1413
+ display: flex;
1414
+ flex-direction: column;
1415
+ min-height: 0;
1416
+ min-width: 380px;
1417
+ overflow: auto;
1418
+ border: 1px solid var(--border);
1419
+ border-radius: 6px;
1420
+ background: color-mix(in srgb, var(--panel-bg) 92%, transparent);
1421
+ }
1422
+ .board-column__header {
1423
+ display: flex;
1424
+ align-items: center;
1425
+ justify-content: space-between;
1426
+ gap: 8px;
1427
+ position: sticky;
1428
+ top: 0;
1429
+ z-index: 1;
1430
+ padding: 10px 12px;
1431
+ font-weight: 700;
1432
+ border-bottom: 1px solid var(--border);
1433
+ background: inherit;
1434
+ backdrop-filter: saturate(140%) blur(4px);
1435
+ }
1436
+ .board-column__title {
1437
+ display: inline-flex;
1438
+ align-items: center;
1439
+ gap: var(--space-3);
1440
+ }
1441
+ .board-column__title-text {
1442
+ font-weight: inherit;
1443
+ }
1444
+ .board-column__count {
1445
+ background: color-mix(in srgb, var(--panel-bg) 88%, var(--muted));
1446
+ color: color-mix(in srgb, var(--muted) 82%, #000);
1447
+ border-color: color-mix(in srgb, var(--muted) 28%, transparent);
1448
+ min-width: 28px;
1449
+ text-align: center;
1450
+ letter-spacing: 0.02em;
1451
+ font-variant-numeric: tabular-nums;
1452
+ }
1453
+ /* Small, unobtrusive select for closed filter */
1454
+ .board-closed-filter {
1455
+ margin: calc(var(--space-4) * -1) 0;
1456
+
1457
+ select {
1458
+ font-size: 13px;
1459
+ border-radius: 999px;
1460
+ border-color: var(--border);
1461
+ padding: 2px 18px 2px 12px;
1462
+ }
1463
+ }
1464
+ .board-column__body {
1465
+ padding: var(--space-5);
1466
+ overflow: visible;
1467
+ display: flex;
1468
+ flex-direction: column;
1469
+ /* UI-77: increase vertical spacing between card rows */
1470
+ gap: var(--space-7);
1471
+ }
1472
+ .board-card {
1473
+ /* UI-76: remove borders and match page body background */
1474
+ border: none;
1475
+ border-radius: 6px;
1476
+ /* UI-77: increase internal padding for readability */
1477
+ padding: var(--space-6) var(--space-7);
1478
+ /* Match the body background so cards feel integrated */
1479
+ background: var(--bg);
1480
+ cursor: pointer;
1481
+ transition:
1482
+ box-shadow 140ms ease,
1483
+ transform 140ms ease;
1484
+ /* UI-76: subtle elevation without borders */
1485
+ box-shadow:
1486
+ 0 1px 2px color-mix(in srgb, #000 10%, transparent),
1487
+ 0 2px 6px color-mix(in srgb, #000 8%, transparent);
1488
+ }
1489
+ .board-card:hover {
1490
+ /* Keep background; emphasize elevation slightly on hover */
1491
+ box-shadow:
1492
+ 0 2px 8px color-mix(in srgb, #000 16%, transparent),
1493
+ 0 4px 16px color-mix(in srgb, #000 12%, transparent);
1494
+ }
1495
+ .board-card:focus {
1496
+ outline: 2px solid color-mix(in srgb, var(--link) 50%, transparent);
1497
+ outline-offset: var(--outline-offset-s);
1498
+ }
1499
+ .board-card__title {
1500
+ font-weight: 600;
1501
+ margin-bottom: var(--space-2);
1502
+ }
1503
+ .board-card__meta {
1504
+ margin-top: var(--space-4);
1505
+ font-size: 12px;
1506
+ color: var(--muted);
1507
+ display: flex;
1508
+ align-items: center;
1509
+ gap: var(--space-4);
1510
+ }
1511
+
1512
+ /* Drag and drop styles */
1513
+ .board-card--dragging {
1514
+ opacity: 0.5;
1515
+ transform: rotate(2deg);
1516
+ box-shadow:
1517
+ 0 4px 16px color-mix(in srgb, #000 24%, transparent),
1518
+ 0 8px 32px color-mix(in srgb, #000 16%, transparent);
1519
+ }
1520
+
1521
+ .board-column--drag-over {
1522
+ background: color-mix(in srgb, var(--link) 8%, var(--panel-bg));
1523
+ border-color: color-mix(in srgb, var(--link) 40%, var(--border));
1524
+ }
1525
+
1526
+ .board-column--drag-over .board-column__body {
1527
+ min-height: 100px;
1528
+ }
1529
+
1530
+ @media (max-width: 1100px) {
1531
+ .board-root {
1532
+ grid-template-columns: 1fr;
1533
+ }
1534
+ }
1535
+
1536
+ /* a11y helper */
1537
+ .visually-hidden {
1538
+ position: absolute !important;
1539
+ height: 1px;
1540
+ width: 1px;
1541
+ overflow: hidden;
1542
+ clip: rect(1px, 1px, 1px, 1px);
1543
+ white-space: nowrap;
1544
+ }
1545
+
1546
+ @media (prefers-color-scheme: dark) {
1547
+ :root {
1548
+ --fg: #e5e7eb;
1549
+ --bg: #0b1021;
1550
+ --muted: #9ca3af;
1551
+ --panel-bg: #0f172a;
1552
+ --border: #1f2937;
1553
+
1554
+ /* Dark variants derived via color-mix for contrast */
1555
+ --badge-bg-neutral: color-mix(in srgb, var(--panel-bg) 80%, #9ca3af);
1556
+ --badge-fg-neutral: color-mix(in srgb, #9ca3af 75%, #fff);
1557
+ --badge-bg-bug: color-mix(
1558
+ in srgb,
1559
+ var(--panel-bg) 80%,
1560
+ var(--type-bug-base)
1561
+ );
1562
+ --badge-fg-bug: color-mix(in srgb, var(--type-bug-base) 75%, #fff);
1563
+ --badge-bg-feature: color-mix(
1564
+ in srgb,
1565
+ var(--panel-bg) 80%,
1566
+ var(--type-feature-base)
1567
+ );
1568
+ --badge-fg-feature: color-mix(in srgb, var(--type-feature-base) 75%, #fff);
1569
+ --badge-bg-task: color-mix(
1570
+ in srgb,
1571
+ var(--panel-bg) 80%,
1572
+ var(--type-task-base)
1573
+ );
1574
+ --badge-fg-task: color-mix(in srgb, var(--type-task-base) 75%, #fff);
1575
+ --badge-bg-epic: color-mix(
1576
+ in srgb,
1577
+ var(--panel-bg) 80%,
1578
+ var(--type-epic-base)
1579
+ );
1580
+ --badge-fg-epic: color-mix(in srgb, var(--type-epic-base) 75%, #fff);
1581
+ --badge-bg-chore: color-mix(
1582
+ in srgb,
1583
+ var(--panel-bg) 80%,
1584
+ var(--type-chore-base)
1585
+ );
1586
+ --badge-fg-chore: color-mix(in srgb, var(--type-chore-base) 75%, #fff);
1587
+
1588
+ --link: #93c5fd;
1589
+ --link-hover: #bfdbfe;
1590
+ --link-visited: #c4b5fd;
1591
+
1592
+ --code-bg: #1f2937;
1593
+ --code-fg: #e5e7eb;
1594
+ --pre-bg: #0a0f1f;
1595
+ --pre-fg: #e5e7eb;
1596
+ }
1597
+ }
1598
+
1599
+ /* Manual theme override */
1600
+ html[data-theme='dark'] {
1601
+ --fg: #d9e0ea;
1602
+ --bg: #0d1426;
1603
+ --muted: #6b7b99;
1604
+ --panel-bg: #111a2f;
1605
+ --border: #25304a;
1606
+ --surface-raised: #141f38;
1607
+ --control-bg: #151f35;
1608
+ --button-bg: #2b364a;
1609
+ --border-row: #28334d;
1610
+ --border-tab: #2f3a55;
1611
+ --button-border: #3b4860;
1612
+ --fg-strong: #f4f7fc;
1613
+ --fg-mid: #a8b0c0;
1614
+ --fg-dim: #8794ad;
1615
+ --progress-track: #f4f4f1;
1616
+ --status-open-base: #51cb4e;
1617
+
1618
+ --badge-bg-neutral: #374151;
1619
+ --badge-fg-neutral: #f3f4f6;
1620
+ --badge-bg-bug: color-mix(in srgb, var(--panel-bg) 80%, var(--type-bug-base));
1621
+ --badge-fg-bug: color-mix(in srgb, var(--type-bug-base) 75%, #fff);
1622
+ --badge-bg-feature: color-mix(
1623
+ in srgb,
1624
+ var(--panel-bg) 80%,
1625
+ var(--type-feature-base)
1626
+ );
1627
+ --badge-fg-feature: color-mix(in srgb, var(--type-feature-base) 75%, #fff);
1628
+ --badge-bg-task: color-mix(
1629
+ in srgb,
1630
+ var(--panel-bg) 80%,
1631
+ var(--type-task-base)
1632
+ );
1633
+ --badge-fg-task: color-mix(in srgb, var(--type-task-base) 75%, #fff);
1634
+ --badge-bg-epic: color-mix(
1635
+ in srgb,
1636
+ var(--panel-bg) 80%,
1637
+ var(--type-epic-base)
1638
+ );
1639
+ --badge-fg-epic: color-mix(in srgb, var(--type-epic-base) 75%, #fff);
1640
+ --badge-bg-chore: color-mix(
1641
+ in srgb,
1642
+ var(--panel-bg) 80%,
1643
+ var(--type-chore-base)
1644
+ );
1645
+ --badge-fg-chore: color-mix(in srgb, var(--type-chore-base) 75%, #fff);
1646
+
1647
+ --link: #93c5fd;
1648
+ --link-hover: #bfdbfe;
1649
+ --link-visited: #c4b5fd;
1650
+
1651
+ --code-bg: #1f2937;
1652
+ --code-fg: #e5e7eb;
1653
+ --pre-bg: #0a0f1f;
1654
+ --pre-fg: #e5e7eb;
1655
+ }
1656
+
1657
+ /* Force light theme when OS prefers dark */
1658
+ html[data-theme='light'] {
1659
+ --fg: #222;
1660
+ --bg: #fff;
1661
+ --muted: #666;
1662
+ --panel-bg: #fafafa;
1663
+ --border: #e5e7eb;
1664
+
1665
+ --badge-bg-neutral: #e5e7eb;
1666
+ --badge-fg-neutral: #374151;
1667
+ --badge-bg-bug: color-mix(in srgb, var(--panel-bg) 85%, var(--type-bug-base));
1668
+ --badge-fg-bug: color-mix(in srgb, var(--type-bug-base) 90%, #000);
1669
+ --badge-bg-feature: color-mix(
1670
+ in srgb,
1671
+ var(--panel-bg) 85%,
1672
+ var(--type-feature-base)
1673
+ );
1674
+ --badge-fg-feature: color-mix(in srgb, var(--type-feature-base) 90%, #000);
1675
+ --badge-bg-task: color-mix(
1676
+ in srgb,
1677
+ var(--panel-bg) 85%,
1678
+ var(--type-task-base)
1679
+ );
1680
+ --badge-fg-task: color-mix(in srgb, var(--type-task-base) 90%, #000);
1681
+ --badge-bg-epic: color-mix(
1682
+ in srgb,
1683
+ var(--panel-bg) 85%,
1684
+ var(--type-epic-base)
1685
+ );
1686
+ --badge-fg-epic: color-mix(in srgb, var(--type-epic-base) 90%, #000);
1687
+ --badge-bg-chore: color-mix(
1688
+ in srgb,
1689
+ var(--panel-bg) 85%,
1690
+ var(--type-chore-base)
1691
+ );
1692
+ --badge-fg-chore: color-mix(in srgb, var(--type-chore-base) 90%, #000);
1693
+
1694
+ --link: #1d4ed8;
1695
+ --link-hover: #1e40af;
1696
+ --link-visited: #6d28d9;
1697
+
1698
+ --code-bg: #f3f4f6;
1699
+ --code-fg: #1f2937;
1700
+ --pre-bg: #0b1021;
1701
+ --pre-fg: #e5e7eb;
1702
+
1703
+ /* Light controls override to prevent dark OS bleed-through */
1704
+ --control-bg: #fff;
1705
+ --control-fg: #111827;
1706
+ --control-border: #d1d5db;
1707
+ --control-placeholder: #9ca3af;
1708
+ --button-bg: #f3f4f6;
1709
+ --button-fg: #111827;
1710
+ --button-border: #d1d5db;
1711
+ }
1712
+
1713
+ /* Controls palette (light defaults) */
1714
+ :root {
1715
+ --control-bg: #fff;
1716
+ --control-fg: #111827;
1717
+ --control-border: #d1d5db;
1718
+ --control-placeholder: #9ca3af;
1719
+ --button-bg: #f3f4f6;
1720
+ --button-fg: #111827;
1721
+ --button-border: #d1d5db;
1722
+ }
1723
+ @media (prefers-color-scheme: dark) {
1724
+ :root {
1725
+ --control-bg: #111827;
1726
+ --control-fg: #e5e7eb;
1727
+ --control-border: #374151;
1728
+ --control-placeholder: #9ca3af;
1729
+ --button-bg: #1f2937;
1730
+ --button-fg: #e5e7eb;
1731
+ --button-border: #374151;
1732
+ }
1733
+ }
1734
+ html[data-theme='dark'] {
1735
+ --control-bg: #151f35;
1736
+ --control-fg: #d9e0ea;
1737
+ --control-border: #3b4860;
1738
+ --control-placeholder: #6b7b99;
1739
+ --button-fg: #f4f7fc;
1740
+ }
1741
+
1742
+ /* --- Design polish additions --- */
1743
+ /* Detail two-column layout with a properties card */
1744
+ .detail-layout {
1745
+ display: grid;
1746
+ grid-template-columns: 1fr 320px;
1747
+ gap: 32px;
1748
+ align-items: start;
1749
+ }
1750
+ .detail-side {
1751
+ position: sticky;
1752
+ top: 18px;
1753
+ }
1754
+ .detail-main h2 {
1755
+ font-size: 28px;
1756
+ line-height: 1.25;
1757
+ margin: 0 0 32px;
1758
+ }
1759
+ /* Title line: title left (flex:1), ID right-aligned */
1760
+ .detail-title {
1761
+ display: flex;
1762
+ align-items: baseline;
1763
+ justify-content: space-between;
1764
+ gap: 16px;
1765
+ }
1766
+ .detail-title h2 {
1767
+ flex: 1 1 auto;
1768
+ display: flex;
1769
+ align-items: baseline;
1770
+ flex-wrap: nowrap;
1771
+ gap: 8px;
1772
+ }
1773
+ .detail-title .detail-id {
1774
+ color: var(--muted);
1775
+ }
1776
+ .detail-toolbar {
1777
+ display: flex;
1778
+ align-items: center;
1779
+ justify-content: space-between;
1780
+ gap: 12px;
1781
+ padding: 6px 0 10px;
1782
+ border-bottom: 1px solid var(--border);
1783
+ margin-bottom: 14px;
1784
+ }
1785
+ .detail-breadcrumb {
1786
+ color: var(--muted);
1787
+ font-size: 13px;
1788
+ }
1789
+ .btn-bar {
1790
+ display: flex;
1791
+ gap: 8px;
1792
+ flex-wrap: wrap;
1793
+ }
1794
+ .btn {
1795
+ background: var(--button-bg);
1796
+ color: var(--button-fg);
1797
+ border: 1px solid var(--button-border);
1798
+ border-radius: 6px;
1799
+ padding: 6px 10px;
1800
+ font-size: 12px;
1801
+ }
1802
+ .btn.primary {
1803
+ background: color-mix(in srgb, var(--link) 18%, var(--button-bg));
1804
+ border-color: color-mix(in srgb, var(--link) 32%, var(--button-border));
1805
+ }
1806
+ .props-card {
1807
+ background: color-mix(in srgb, var(--panel-bg) 92%, transparent);
1808
+ border: 1px solid var(--border);
1809
+ border-radius: 0;
1810
+ padding: 10px;
1811
+ }
1812
+ .props-card:not(:last-child) {
1813
+ border-bottom: none;
1814
+ }
1815
+ .props-card ul {
1816
+ list-style: none;
1817
+ padding: 0;
1818
+ margin: 0 0 8px;
1819
+ }
1820
+ .props-card ul li {
1821
+ display: grid;
1822
+ grid-template-columns: auto auto 1fr auto;
1823
+ gap: 6px;
1824
+ align-items: center;
1825
+ padding: 2px 0;
1826
+ cursor: pointer;
1827
+ }
1828
+ .props-card__header {
1829
+ display: flex;
1830
+ align-items: center;
1831
+ justify-content: space-between;
1832
+ margin-bottom: 8px;
1833
+ }
1834
+ .props-card__title {
1835
+ font-weight: 700;
1836
+ font-size: 13px;
1837
+ margin: 0;
1838
+ }
1839
+ .prop {
1840
+ display: grid;
1841
+ grid-template-columns: 1fr 1fr;
1842
+ align-items: center;
1843
+ gap: 10px;
1844
+ padding: 8px 0;
1845
+ border-top: 1px solid color-mix(in srgb, var(--border) 70%, transparent);
1846
+ &:first-of-type {
1847
+ border-top: none;
1848
+ }
1849
+ & .label {
1850
+ color: var(--muted);
1851
+ font-size: 12px;
1852
+ min-width: 80px;
1853
+ }
1854
+ & .value {
1855
+ font-size: 13px;
1856
+ display: flex;
1857
+ align-items: center;
1858
+ gap: 8px;
1859
+ }
1860
+ }
1861
+
1862
+ /* --- Issue Details Dialog (UI-104) --- */
1863
+ #issue-dialog {
1864
+ padding: 0;
1865
+ border: 1px solid var(--border);
1866
+ border-radius: 8px;
1867
+ background: var(--bg);
1868
+ color: var(--fg);
1869
+ width: min(96vw, 1200px);
1870
+ max-height: 96vh;
1871
+ margin: 2vh auto;
1872
+ overflow: hidden;
1873
+ }
1874
+ #issue-dialog::backdrop {
1875
+ background: color-mix(in srgb, #000 45%, transparent);
1876
+ backdrop-filter: blur(1px);
1877
+ }
1878
+ .issue-dialog__header {
1879
+ display: flex;
1880
+ align-items: center;
1881
+ justify-content: space-between;
1882
+ gap: 10px;
1883
+ padding: 8px 12px;
1884
+ border-bottom: 1px solid var(--border);
1885
+ }
1886
+ .issue-dialog__title {
1887
+ font-weight: 700;
1888
+ }
1889
+ .issue-dialog__close {
1890
+ border-radius: 4px;
1891
+ padding: 4px 8px;
1892
+ min-width: 28px;
1893
+ line-height: 1.2;
1894
+ }
1895
+ .issue-dialog__body {
1896
+ min-height: 200px;
1897
+ max-height: calc(96vh - 44px);
1898
+ overflow: auto;
1899
+ }
1900
+
1901
+ .new-issue__body {
1902
+ padding: 12px;
1903
+ }
1904
+ .new-issue__form {
1905
+ display: grid;
1906
+ grid-template-columns: 120px 1fr;
1907
+ gap: 10px 12px;
1908
+ align-items: center;
1909
+ }
1910
+ .new-issue__form label {
1911
+ color: var(--muted);
1912
+ font-size: 12px;
1913
+ }
1914
+ .new-issue__actions {
1915
+ display: flex;
1916
+ justify-content: flex-end;
1917
+ gap: 8px;
1918
+ margin-top: 8px;
1919
+ }
1920
+ .new-issue__error {
1921
+ color: var(--danger, #b00020);
1922
+ font-size: 12px;
1923
+ }
1924
+
1925
+ /* --- New Issue Dialog (UI-106) --- */
1926
+ #new-issue-dialog {
1927
+ padding: 0;
1928
+ border: 1px solid var(--border);
1929
+ border-radius: 8px;
1930
+ background: var(--bg);
1931
+ color: var(--fg);
1932
+ width: min(640px, 96vw);
1933
+ max-height: 96vh;
1934
+ margin: 2vh auto;
1935
+ overflow: hidden;
1936
+ }
1937
+ #new-issue-dialog::backdrop {
1938
+ background: color-mix(in srgb, #000 45%, transparent);
1939
+ backdrop-filter: blur(1px);
1940
+ }
1941
+ .new-issue__header {
1942
+ display: flex;
1943
+ align-items: center;
1944
+ justify-content: space-between;
1945
+ gap: 10px;
1946
+ padding: 8px 12px;
1947
+ border-bottom: 1px solid var(--border);
1948
+ }
1949
+ .new-issue__title {
1950
+ font-weight: 700;
1951
+ }
1952
+ .new-issue__close {
1953
+ border-radius: 4px;
1954
+ padding: 4px 8px;
1955
+ min-width: 28px;
1956
+ line-height: 1.2;
1957
+ }
1958
+
1959
+ /* --- Fatal Error Dialog --- */
1960
+ #fatal-error-dialog {
1961
+ padding: 0;
1962
+ border: 1px solid var(--border);
1963
+ border-radius: 12px;
1964
+ background:
1965
+ linear-gradient(
1966
+ 180deg,
1967
+ color-mix(in srgb, var(--panel-bg) 82%, transparent),
1968
+ var(--panel-bg)
1969
+ ),
1970
+ radial-gradient(
1971
+ circle at 20% 0%,
1972
+ color-mix(in srgb, #fca5a5 48%, transparent) 0%,
1973
+ transparent 42%
1974
+ );
1975
+ color: var(--fg);
1976
+ width: min(640px, 94vw);
1977
+ max-height: 90vh;
1978
+ margin: 4vh auto;
1979
+ overflow: hidden;
1980
+ box-shadow: 0 18px 48px -16px rgba(17, 24, 39, 0.35);
1981
+ }
1982
+ #fatal-error-dialog::backdrop {
1983
+ background: color-mix(in srgb, #0f172a 55%, transparent);
1984
+ backdrop-filter: blur(1px);
1985
+ }
1986
+ .fatal-error {
1987
+ display: flex;
1988
+ align-items: flex-start;
1989
+ gap: 16px;
1990
+ padding: 18px 20px 20px;
1991
+ }
1992
+ .fatal-error__icon {
1993
+ width: 40px;
1994
+ height: 40px;
1995
+ border-radius: 12px;
1996
+ display: inline-flex;
1997
+ align-items: center;
1998
+ justify-content: center;
1999
+ font-weight: 800;
2000
+ font-size: 20px;
2001
+ color: #fff;
2002
+ background: linear-gradient(
2003
+ 135deg,
2004
+ color-mix(in srgb, var(--type-bug-base) 78%, #000),
2005
+ color-mix(in srgb, var(--type-bug-base) 58%, #111)
2006
+ );
2007
+ box-shadow: 0 10px 24px -12px rgba(159, 32, 17, 0.6);
2008
+ }
2009
+ .fatal-error__body {
2010
+ flex: 1;
2011
+ display: flex;
2012
+ flex-direction: column;
2013
+ gap: 6px;
2014
+ }
2015
+ .fatal-error__eyebrow {
2016
+ margin: 0;
2017
+ text-transform: uppercase;
2018
+ letter-spacing: 0.08em;
2019
+ font-size: 11px;
2020
+ color: color-mix(in srgb, var(--type-bug-base) 64%, #111);
2021
+ font-weight: 700;
2022
+ }
2023
+ .fatal-error__title {
2024
+ margin: 0;
2025
+ font-size: 20px;
2026
+ letter-spacing: 0.01em;
2027
+ }
2028
+ .fatal-error__message {
2029
+ margin: 0;
2030
+ color: color-mix(in srgb, var(--fg) 92%, #111);
2031
+ font-size: 14px;
2032
+ line-height: 1.5;
2033
+ }
2034
+ .fatal-error__detail {
2035
+ margin: 6px 0 0;
2036
+ background: var(--pre-bg);
2037
+ color: var(--pre-fg);
2038
+ border-radius: 8px;
2039
+ padding: 10px 12px;
2040
+ max-height: 220px;
2041
+ overflow: auto;
2042
+ font-size: 12px;
2043
+ border: 1px solid color-mix(in srgb, var(--pre-bg) 45%, #1f2937);
2044
+ white-space: pre-wrap;
2045
+ word-break: break-word;
2046
+ }
2047
+ .fatal-error__actions {
2048
+ display: flex;
2049
+ align-items: center;
2050
+ gap: 10px;
2051
+ margin-top: 10px;
2052
+ flex-wrap: wrap;
2053
+ }
2054
+
2055
+ /* Sidebar control aesthetics */
2056
+ #detail-root .props-card input[type='text'] {
2057
+ border: 1px solid var(--control-border);
2058
+ outline: none;
2059
+ border-radius: 4px;
2060
+ padding: 2px 8px;
2061
+ }
2062
+
2063
+ /* Compact icon button (used in label chips) */
2064
+ #detail-root .props-card .icon-button {
2065
+ text-align: center;
2066
+ border-radius: var(--badge-radius);
2067
+ border: 1px solid color-mix(in srgb, currentColor 35%, transparent);
2068
+ padding: 0 6px;
2069
+ height: 18px;
2070
+ margin-right: -8px;
2071
+ background: transparent;
2072
+ color: inherit;
2073
+ }
2074
+
2075
+ .props-card__footer {
2076
+ display: flex;
2077
+ justify-content: stretch;
2078
+ gap: 8px;
2079
+ padding: 8px 0;
2080
+ }
2081
+ .props-card__footer input {
2082
+ flex: 1;
2083
+ }
2084
+
2085
+ /* List row layout closer to mock */
2086
+ #list-panel .panel__body li.issue-item {
2087
+ display: grid;
2088
+ grid-template-columns: 1fr auto;
2089
+ align-items: center;
2090
+ gap: 6px 12px;
2091
+ padding: 12px 18px;
2092
+ border-bottom: 1px solid color-mix(in srgb, var(--border) 65%, transparent);
2093
+ border-radius: 0;
2094
+ cursor: pointer;
2095
+ transition:
2096
+ background 140ms ease,
2097
+ box-shadow 140ms ease;
2098
+ }
2099
+ #list-panel .panel__body li.issue-item:hover {
2100
+ background: color-mix(in srgb, var(--control-bg) 55%, transparent);
2101
+ }
2102
+ #list-panel .panel__body li.issue-item.selected {
2103
+ background: color-mix(in srgb, var(--link) 10%, transparent);
2104
+ box-shadow: 0 0 0 1px color-mix(in srgb, var(--link) 35%, var(--border)) inset;
2105
+ }
2106
+ #list-panel .issue-title {
2107
+ font-weight: 600;
2108
+ }
2109
+ #list-panel .issue-meta {
2110
+ color: var(--muted);
2111
+ font-size: 12px;
2112
+ margin-top: 2px;
2113
+ }
2114
+ #list-panel .issue-right {
2115
+ display: grid;
2116
+ grid-template-rows: auto auto;
2117
+ justify-items: end;
2118
+ gap: 4px;
2119
+ }
2120
+ #list-panel .issue-id {
2121
+ color: var(--muted);
2122
+ font-weight: 600;
2123
+ }
2124
+ .mono {
2125
+ font-family:
2126
+ ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono',
2127
+ 'Courier New', monospace;
2128
+ font-variant-ligatures: none;
2129
+ }
2130
+
2131
+ .issue-row__id-cell {
2132
+ width: clamp(100px, 18vw, 200px);
2133
+ min-width: 100px;
2134
+ max-width: 200px;
2135
+ }
2136
+ .issue-row__id-cell .id-copy {
2137
+ display: block;
2138
+ max-width: 100%;
2139
+ white-space: normal;
2140
+ overflow: visible;
2141
+ text-overflow: clip;
2142
+ overflow-wrap: anywhere;
2143
+ }
2144
+
2145
+ @media (max-width: 1100px) {
2146
+ .detail-layout {
2147
+ grid-template-columns: 1fr;
2148
+ }
2149
+ }
2150
+
2151
+ /* Comments section */
2152
+ .comments {
2153
+ margin-top: 24px;
2154
+ padding-top: 16px;
2155
+ border-top: 1px solid var(--border);
2156
+ }
2157
+
2158
+ .comment-item {
2159
+ padding: 12px;
2160
+ margin-bottom: 8px;
2161
+ background: color-mix(in srgb, var(--panel-bg) 95%, transparent);
2162
+ border: 1px solid var(--border);
2163
+ border-radius: 4px;
2164
+ }
2165
+
2166
+ .comment-header {
2167
+ display: flex;
2168
+ justify-content: space-between;
2169
+ align-items: center;
2170
+ margin-bottom: 6px;
2171
+ font-size: 12px;
2172
+ }
2173
+
2174
+ .comment-author {
2175
+ font-weight: 600;
2176
+ color: var(--fg);
2177
+ }
2178
+
2179
+ .comment-date {
2180
+ color: var(--muted);
2181
+ }
2182
+
2183
+ .comment-text {
2184
+ font-size: 14px;
2185
+ line-height: 1.5;
2186
+ white-space: pre-wrap;
2187
+ }
2188
+
2189
+ .comment-input {
2190
+ margin-top: 12px;
2191
+ }
2192
+
2193
+ .comment-input textarea {
2194
+ width: 100%;
2195
+ min-height: 60px;
2196
+ padding: 8px;
2197
+ border: 1px solid var(--control-border);
2198
+ border-radius: 4px;
2199
+ background: var(--control-bg);
2200
+ color: var(--fg);
2201
+ font-family: inherit;
2202
+ font-size: 14px;
2203
+ resize: vertical;
2204
+ }
2205
+
2206
+ .comment-input textarea:focus {
2207
+ outline: none;
2208
+ border-color: var(--link);
2209
+ }
2210
+
2211
+ .comment-input button {
2212
+ margin-top: 8px;
2213
+ }
2214
+
2215
+ /* --- Delete Issue Button --- */
2216
+ .delete-issue-btn {
2217
+ position: relative;
2218
+ background: transparent;
2219
+ border: 1px solid transparent;
2220
+ border-radius: 4px;
2221
+ padding: 4px 6px;
2222
+ cursor: pointer;
2223
+ color: #c62828;
2224
+ transition:
2225
+ background 0.15s,
2226
+ border-color 0.15s;
2227
+ }
2228
+ .delete-issue-btn:hover {
2229
+ background: rgba(198, 40, 40, 0.1);
2230
+ border-color: rgba(198, 40, 40, 0.3);
2231
+ }
2232
+ .delete-issue-btn:focus-visible {
2233
+ outline: 2px solid #c62828;
2234
+ outline-offset: 2px;
2235
+ }
2236
+ .delete-issue-btn svg {
2237
+ width: 16px;
2238
+ height: 16px;
2239
+ display: block;
2240
+ }
2241
+ .delete-issue-btn .tooltip {
2242
+ position: absolute;
2243
+ top: 100%;
2244
+ left: 50%;
2245
+ transform: translateX(-50%);
2246
+ margin-top: 6px;
2247
+ padding: 4px 8px;
2248
+ font-size: 12px;
2249
+ font-weight: 500;
2250
+ white-space: nowrap;
2251
+ background: var(--fg);
2252
+ color: var(--bg);
2253
+ border-radius: 4px;
2254
+ opacity: 0;
2255
+ visibility: hidden;
2256
+ transition:
2257
+ opacity 0.1s,
2258
+ visibility 0.1s;
2259
+ pointer-events: none;
2260
+ z-index: 100;
2261
+ }
2262
+ .delete-issue-btn .tooltip::before {
2263
+ content: '';
2264
+ position: absolute;
2265
+ bottom: 100%;
2266
+ left: 50%;
2267
+ transform: translateX(-50%);
2268
+ border: 5px solid transparent;
2269
+ border-bottom-color: var(--fg);
2270
+ }
2271
+ .delete-issue-btn:hover .tooltip {
2272
+ opacity: 1;
2273
+ visibility: visible;
2274
+ }
2275
+
2276
+ /* --- Delete Confirmation Dialog --- */
2277
+ #delete-confirm-dialog {
2278
+ padding: 0;
2279
+ border: 1px solid var(--border);
2280
+ border-radius: 8px;
2281
+ background: var(--bg);
2282
+ color: var(--fg);
2283
+ width: min(400px, 90vw);
2284
+ margin: auto;
2285
+ }
2286
+ #delete-confirm-dialog::backdrop {
2287
+ background: color-mix(in srgb, #000 45%, transparent);
2288
+ backdrop-filter: blur(1px);
2289
+ }
2290
+ .delete-confirm {
2291
+ padding: 20px;
2292
+ }
2293
+ .delete-confirm__title {
2294
+ margin: 0 0 12px;
2295
+ font-size: 18px;
2296
+ font-weight: 600;
2297
+ }
2298
+ .delete-confirm__message {
2299
+ margin: 0 0 20px;
2300
+ line-height: 1.5;
2301
+ color: var(--fg);
2302
+ }
2303
+ .delete-confirm__message strong {
2304
+ font-weight: 600;
2305
+ }
2306
+ .delete-confirm__actions {
2307
+ display: flex;
2308
+ justify-content: flex-end;
2309
+ gap: 10px;
2310
+ }
2311
+ .btn.danger {
2312
+ background: var(--danger, #b00020);
2313
+ color: #fff;
2314
+ border-color: var(--danger, #b00020);
2315
+ }
2316
+ .btn.danger:hover {
2317
+ background: color-mix(in srgb, var(--danger, #b00020) 85%, #000);
2318
+ }
2319
+
2320
+ /* Dependency indicators column */
2321
+ .deps-col {
2322
+ text-align: center;
2323
+ font-size: 13px;
2324
+ white-space: nowrap;
2325
+ }
2326
+ .deps-indicator {
2327
+ display: inline-flex;
2328
+ gap: var(--space-3);
2329
+ align-items: center;
2330
+ font-variant-numeric: tabular-nums;
2331
+ }
2332
+ .dep-count,
2333
+ .dependent-count {
2334
+ color: var(--muted);
2335
+ font-family:
2336
+ ui-monospace, 'SF Mono', Monaco, 'Cascadia Mono', 'Segoe UI Mono',
2337
+ 'Roboto Mono', Menlo, Consolas, 'Courier New', monospace;
2338
+ }
2339
+ .dep-count:hover,
2340
+ .dependent-count:hover {
2341
+ color: var(--fg);
2342
+ }