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