main.css
⎇
Raw
1/* View Transitions */
2@view-transition {
3 navigation: auto;
4}
5
6.site-nav { view-transition-name: site-nav; }
7.repo-header { view-transition-name: repo-header; }
8.breadcrumb { view-transition-name: breadcrumb; }
9
10/* ============================================================
11 @layer reset
12 ============================================================ */
13@layer reset {
14 *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
15 html { -webkit-text-size-adjust: 100%; }
16 body { min-height: 100dvh; min-width: 500px; }
17 img, video { max-width: 100%; height: auto; }
18 button, input, textarea, select { font: inherit; }
19 a { color: inherit; }
20 ul, ol { list-style: none; }
21 h1, h2, h3, h4, h5, h6 { font-weight: 600; line-height: 1.2; }
22 pre, code { font-family: var(--font-mono); }
23}
24
25/* ============================================================
26 @layer tokens
27 ============================================================ */
28@layer tokens {
29 :root {
30 /* Colors — light */
31 --color-bg: #ffffff;
32 --color-bg-subtle: #f6f8fa;
33 --color-bg-inset: #eef0f2;
34 --color-border: #d0d7de;
35 --color-border-muted: #e4e7eb;
36 --color-text: #1f2328;
37 --color-text-muted: #656d76;
38 --color-link: #0969da;
39 --color-link-hover: #0550ae;
40
41 --color-accent: #fd7e14;
42 --color-accent-bg: #fff3cd;
43
44 --color-success: #1a7f37;
45 --color-success-bg: #dafbe1;
46 --color-danger: #cf222e;
47 --color-danger-bg: #ffebe9;
48 --color-warning: #9a6700;
49 --color-warning-bg: #fff8c5;
50 --color-merged: #8250df;
51 --color-merged-bg: #fbefff;
52
53 /* Typography */
54 --font-sans: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
55 --font-mono: ui-monospace, 'Cascadia Code', 'Source Code Pro', monospace;
56
57 --text-xs: 0.75rem;
58 --text-sm: 0.875rem;
59 --text-base: 1rem;
60 --text-lg: 1.125rem;
61 --text-xl: 1.25rem;
62 --text-2xl: 1.5rem;
63 --text-3xl: 1.875rem;
64
65 /* Spacing */
66 --space-1: 0.25rem;
67 --space-2: 0.5rem;
68 --space-3: 0.75rem;
69 --space-4: 1rem;
70 --space-5: 1.25rem;
71 --space-6: 1.5rem;
72 --space-8: 2rem;
73 --space-10: 2.5rem;
74 --space-12: 3rem;
75 --space-16: 4rem;
76
77 /* Border radius */
78 --radius-sm: 4px;
79 --radius-md: 6px;
80 --radius-lg: 8px;
81 --radius-full: 9999px;
82
83 /* Shadows */
84 --shadow-sm: 0 1px 0 rgba(27,31,36,0.04);
85 --shadow-md: 0 3px 6px rgba(140,149,159,0.15);
86 --shadow-lg: 0 8px 24px rgba(140,149,159,0.2);
87 }
88
89 @media (prefers-color-scheme: dark) {
90 :root {
91 --color-bg: #0d1117;
92 --color-bg-subtle: #161b22;
93 --color-bg-inset: #1c2128;
94 --color-border: #30363d;
95 --color-border-muted: #21262d;
96 --color-text: #e6edf3;
97 --color-text-muted: #7d8590;
98 --color-link: #58a6ff;
99 --color-link-hover: #79c0ff;
100
101 --color-accent: #f0883e;
102 --color-accent-bg: #3d2f00;
103
104 --color-success: #3fb950;
105 --color-success-bg: #0d2b19;
106 --color-danger: #f85149;
107 --color-danger-bg: #2d1419;
108 --color-warning: #d29922;
109 --color-warning-bg: #2c2000;
110 --color-merged: #bc8cff;
111 --color-merged-bg: #1e0b3e;
112 }
113 }
114
115 /* Explicit theme overrides — applied via data-theme attribute set by cookie */
116 :root[data-theme="dark"] {
117 --color-bg: #0d1117;
118 --color-bg-subtle: #161b22;
119 --color-bg-inset: #1c2128;
120 --color-border: #30363d;
121 --color-border-muted: #21262d;
122 --color-text: #e6edf3;
123 --color-text-muted: #7d8590;
124 --color-link: #58a6ff;
125 --color-link-hover: #79c0ff;
126 --color-accent: #f0883e;
127 --color-accent-bg: #3d2f00;
128 --color-success: #3fb950;
129 --color-success-bg: #0d2b19;
130 --color-danger: #f85149;
131 --color-danger-bg: #2d1419;
132 --color-warning: #d29922;
133 --color-warning-bg: #2c2000;
134 --color-merged: #bc8cff;
135 --color-merged-bg: #1e0b3e;
136 }
137 :root[data-theme="light"] {
138 --color-bg: #ffffff;
139 --color-bg-subtle: #f6f8fa;
140 --color-bg-inset: #eef0f2;
141 --color-border: #d0d7de;
142 --color-border-muted: #e4e7eb;
143 --color-text: #1f2328;
144 --color-text-muted: #656d76;
145 --color-link: #0969da;
146 --color-link-hover: #0550ae;
147 --color-accent: #fd7e14;
148 --color-accent-bg: #fff3cd;
149 --color-success: #1a7f37;
150 --color-success-bg: #dafbe1;
151 --color-danger: #cf222e;
152 --color-danger-bg: #ffebe9;
153 --color-warning: #9a6700;
154 --color-warning-bg: #fff8c5;
155 --color-merged: #8250df;
156 --color-merged-bg: #fbefff;
157 }
158}
159
160/* ============================================================
161 @layer layout
162 ============================================================ */
163@layer layout {
164 body {
165 font-family: var(--font-sans);
166 font-size: var(--text-base);
167 color: var(--color-text);
168 background: var(--color-bg);
169 display: grid;
170 grid-template-rows: auto 1fr auto;
171 min-height: 100dvh;
172 }
173
174 .site-header {
175 background: var(--color-bg-subtle);
176 border-bottom: 1px solid var(--color-border);
177 position: sticky;
178 top: 0;
179 z-index: 100;
180 }
181
182 .site-nav {
183 max-width: 1200px;
184 margin: 0 auto;
185 padding: var(--space-3) var(--space-4);
186 display: flex;
187 align-items: center;
188 gap: var(--space-4);
189 }
190
191 .site-logo {
192 display: flex;
193 align-items: center;
194 gap: var(--space-2);
195 text-decoration: none;
196 font-weight: 700;
197 font-size: var(--text-lg);
198 color: var(--color-text);
199 }
200
201 .logo-icon { width: 1.6em; height: 1.6em; display: block; flex-shrink: 0; }
202
203 .nav-links {
204 margin-left: auto;
205 display: flex;
206 align-items: center;
207 gap: var(--space-3);
208 }
209
210 .nav-user {
211 font-size: var(--text-sm);
212 color: var(--color-text-muted);
213 }
214
215 .site-main {
216 padding: var(--space-8) var(--space-4);
217 min-width: 0;
218 }
219
220 .site-footer {
221 text-align: center;
222 padding: var(--space-6) var(--space-4);
223 font-size: var(--text-sm);
224 color: var(--color-text-muted);
225 border-top: 1px solid var(--color-border);
226 }
227
228 .container {
229 max-width: 1000px;
230 margin: 0 auto;
231 overflow-x: clip;
232 }
233
234 .container-narrow {
235 max-width: 680px;
236 }
237
238 .inline-form {
239 display: inline;
240 }
241
242 /* --- Two-step delete confirmation --- */
243 .confirm-details { position: relative; display: inline-block; }
244 .confirm-details > summary { list-style: none; }
245 .confirm-details > summary::-webkit-details-marker { display: none; }
246 .confirm-popup {
247 position: absolute;
248 right: 0;
249 top: calc(100% + var(--space-1));
250 background: var(--color-bg);
251 border: 1px solid var(--color-border);
252 border-radius: var(--radius-md);
253 padding: var(--space-3) var(--space-4);
254 display: flex;
255 align-items: center;
256 gap: var(--space-3);
257 white-space: nowrap;
258 z-index: 100;
259 font-size: var(--text-sm);
260 color: var(--color-text-muted);
261 }
262}
263
264/* ============================================================
265 @layer components
266 ============================================================ */
267@layer components {
268
269 /* --- Buttons --- */
270 .btn {
271 display: inline-flex;
272 align-items: center;
273 gap: var(--space-2);
274 padding: var(--space-2) var(--space-4);
275 border: 1px solid var(--color-border);
276 border-radius: var(--radius-md);
277 font-size: var(--text-sm);
278 font-weight: 500;
279 text-decoration: none;
280 cursor: pointer;
281 background: var(--color-bg-subtle);
282 color: var(--color-text);
283 transition: background 0.1s, border-color 0.1s;
284 white-space: nowrap;
285 }
286 .btn:hover { background: var(--color-bg-inset); border-color: var(--color-border); }
287 .btn:disabled { opacity: 0.5; cursor: not-allowed; }
288 .btn-primary {
289 background: var(--color-accent);
290 border-color: transparent;
291 color: #fff;
292 }
293 .btn-primary:hover { background: color-mix(in srgb, var(--color-accent) 82%, #000); }
294 .btn-secondary {
295 background: var(--color-bg-subtle);
296 border-color: var(--color-border);
297 }
298 .btn-ghost {
299 background: transparent;
300 border-color: transparent;
301 }
302 .btn-ghost:hover { background: var(--color-bg-inset); }
303 /* Keep ghost transparent even when combined with size variants */
304 .btn-ghost.btn-xs,
305 .btn-ghost.btn-sm { background: transparent; border-color: transparent; }
306 .btn-ghost.btn-xs:hover,
307 .btn-ghost.btn-sm:hover { background: var(--color-bg-inset); }
308 .btn-sm { padding: var(--space-1) var(--space-3); font-size: var(--text-xs); }
309 .btn-block { width: 100%; justify-content: center; }
310
311 /* --- Forms --- */
312 .form-group {
313 display: flex;
314 flex-direction: column;
315 gap: var(--space-2);
316 margin-bottom: var(--space-4);
317 }
318 .form-group label {
319 font-size: var(--text-sm);
320 font-weight: 500;
321 color: var(--color-text);
322 }
323 .form-group input:not([type="file"]):not([type="checkbox"]),
324 .form-group textarea,
325 .form-group select {
326 padding: var(--space-2) var(--space-3);
327 border: 1px solid var(--color-border);
328 border-radius: var(--radius-md);
329 background: var(--color-bg);
330 color: var(--color-text);
331 font-size: var(--text-sm);
332 }
333 .form-group input:not([type="file"]):not([type="checkbox"]):focus,
334 .form-group textarea:focus {
335 outline: 2px solid var(--color-accent);
336 outline-offset: -1px;
337 border-color: var(--color-accent);
338 }
339 .form-group input[type="file"] {
340 font-size: var(--text-sm);
341 color: var(--color-text);
342 padding: 0;
343 border: none;
344 background: none;
345 }
346 .form-group textarea { resize: vertical; min-height: 120px; }
347 .form-success {
348 background: var(--color-success-bg);
349 color: var(--color-success);
350 border: 1px solid var(--color-success);
351 border-radius: var(--radius-md);
352 padding: var(--space-3) var(--space-4);
353 font-size: var(--text-sm);
354 margin-bottom: var(--space-4);
355 }
356 .form-hint {
357 font-size: var(--text-sm);
358 color: var(--color-text-muted);
359 margin: 0;
360 }
361 .form-error {
362 background: var(--color-danger-bg);
363 color: var(--color-danger);
364 border: 1px solid var(--color-danger);
365 border-radius: var(--radius-md);
366 padding: var(--space-3) var(--space-4);
367 font-size: var(--text-sm);
368 margin-bottom: var(--space-4);
369 }
370 .form-actions {
371 display: flex;
372 gap: var(--space-3);
373 align-items: center;
374 flex-wrap: wrap;
375 }
376 .form-card {
377 background: var(--color-bg-subtle);
378 border: 1px solid var(--color-border);
379 border-radius: var(--radius-lg);
380 padding: var(--space-6);
381 margin-top: var(--space-4);
382 }
383 .checkbox-label {
384 display: flex;
385 align-items: center;
386 gap: var(--space-2);
387 cursor: pointer;
388 }
389
390 /* --- Auth --- */
391 .auth-container {
392 max-width: 400px;
393 margin: var(--space-12) auto;
394 }
395 .auth-container .page-title { margin-bottom: var(--space-6); }
396 .auth-form { margin-bottom: var(--space-4); }
397 .auth-footer {
398 text-align: center;
399 font-size: var(--text-sm);
400 color: var(--color-text-muted);
401 margin-top: var(--space-4);
402 }
403 .passkey-btn { display: none; margin-top: var(--space-3); }
404
405 /* --- Page header --- */
406 .page-header {
407 display: flex;
408 align-items: center;
409 justify-content: space-between;
410 margin-bottom: var(--space-6);
411 gap: var(--space-4);
412 }
413 .page-title {
414 font-size: var(--text-2xl);
415 color: var(--color-text);
416 margin-bottom: var(--space-4);
417 }
418 .page-title a { text-decoration: none; color: var(--color-link); }
419 .page-title a:hover { text-decoration: underline; }
420 .section-title {
421 font-size: var(--text-lg);
422 margin-bottom: var(--space-4);
423 padding-bottom: var(--space-2);
424 border-bottom: 1px solid var(--color-border);
425 }
426
427 /* --- Repo header --- */
428 .repo-header {
429 margin-bottom: var(--space-2);
430 }
431 .repo-title-row {
432 display: flex;
433 align-items: center;
434 gap: var(--space-3);
435 flex-wrap: wrap;
436 }
437 .repo-title-row .page-title { margin-bottom: 0; }
438 .repo-header-title {
439 display: flex;
440 align-items: center;
441 gap: var(--space-3);
442 flex-wrap: wrap;
443 }
444 .repo-description {
445 color: var(--color-text-muted);
446 margin-top: var(--space-2);
447 }
448 .repo-header-meta {
449 display: flex;
450 align-items: center;
451 gap: var(--space-4);
452 margin-bottom: var(--space-3);
453 font-size: var(--text-sm);
454 color: var(--color-text-muted);
455 }
456 .icon { font-style: normal; }
457
458 /* --- Branch selector --- */
459 .branch-selector {
460 display: inline-flex;
461 align-items: center;
462 gap: var(--space-2);
463 }
464 .branch-selector-icon {
465 color: var(--color-text-muted);
466 font-size: var(--text-sm);
467 user-select: none;
468 }
469 .branch-select {
470 padding: var(--space-1) var(--space-2);
471 padding-right: var(--space-5);
472 border: 1px solid var(--color-border);
473 border-radius: var(--radius-md);
474 background: var(--color-bg-subtle);
475 font-size: var(--text-sm);
476 font-family: var(--font-mono);
477 color: var(--color-text);
478 cursor: pointer;
479 appearance: auto;
480 max-width: 180px;
481 }
482 .branch-select:hover { border-color: var(--color-text-muted); }
483 .branch-select:focus { outline: 2px solid var(--color-accent); outline-offset: -1px; }
484
485 /* toolbar row above file tree */
486 .tree-toolbar {
487 display: flex;
488 align-items: center;
489 justify-content: space-between;
490 margin-bottom: var(--space-3);
491 }
492
493 /* commits-header flex row */
494 .commits-header {
495 display: flex;
496 align-items: center;
497 gap: var(--space-4);
498 margin-bottom: var(--space-4);
499 flex-wrap: wrap;
500 }
501 .commits-header .section-title { margin-bottom: 0; }
502
503 /* --- Repo nav bar (tabs + private badge) --- */
504 .repo-nav-bar {
505 display: flex;
506 align-items: center;
507 justify-content: space-between;
508 border-bottom: 1px solid var(--color-border);
509 margin-bottom: var(--space-6);
510 gap: var(--space-4);
511 }
512
513
514 /* --- Repo tabs --- */
515 .repo-tabs {
516 display: flex;
517 gap: 0;
518 flex: 1;
519 overflow-x: auto;
520 overflow-y: hidden;
521 }
522 .repo-tab {
523 padding: var(--space-3) var(--space-4);
524 font-size: var(--text-sm);
525 text-decoration: none;
526 color: var(--color-text-muted);
527 border-bottom: 2px solid transparent;
528 margin-bottom: -1px;
529 transition: color 0.1s;
530 }
531 .repo-tab:hover { color: var(--color-text); }
532 .repo-tab.active {
533 color: var(--color-text);
534 font-weight: 600;
535 border-bottom-color: var(--color-accent);
536 }
537 /* Align active indicator with nav-bar border */
538 .repo-tab { margin-bottom: -1px; }
539
540 /* --- Repo list --- */
541 .repo-list { display: flex; flex-direction: column; gap: var(--space-2); }
542 .repo-card {
543 display: flex;
544 align-items: flex-start;
545 justify-content: space-between;
546 padding: var(--space-4) var(--space-5);
547 border: 1px solid var(--color-border);
548 border-radius: var(--radius-lg);
549 background: var(--color-bg);
550 gap: var(--space-4);
551 transition: border-color 0.15s;
552 }
553 .repo-card:hover { border-color: var(--color-accent); }
554 .repo-card-main { flex: 1; min-width: 0; }
555 .repo-card-title {
556 display: flex;
557 align-items: center;
558 gap: var(--space-2);
559 flex-wrap: wrap;
560 margin-bottom: var(--space-1);
561 }
562 .repo-name {
563 font-size: var(--text-lg);
564 font-weight: 600;
565 color: var(--color-link);
566 text-decoration: none;
567 }
568 .repo-name:hover { text-decoration: underline; }
569 .repo-card-meta {
570 display: flex;
571 flex-direction: column;
572 align-items: flex-end;
573 gap: var(--space-1);
574 font-size: var(--text-xs);
575 color: var(--color-text-muted);
576 white-space: nowrap;
577 }
578 .repo-date { color: var(--color-text-muted); }
579
580 /* --- Badges --- */
581 .badge {
582 display: inline-flex;
583 align-items: center;
584 padding: 1px var(--space-2);
585 border-radius: var(--radius-full);
586 font-size: var(--text-xs);
587 font-weight: 500;
588 border: 1px solid;
589 }
590 .badge-private {
591 color: var(--color-warning);
592 border-color: var(--color-warning);
593 background: var(--color-warning-bg);
594 }
595 .issue-badge, .patch-badge {
596 display: inline-flex;
597 align-items: center;
598 padding: var(--space-1) var(--space-3);
599 border-radius: var(--radius-full);
600 font-size: var(--text-xs);
601 font-weight: 500;
602 text-transform: capitalize;
603 }
604 .issue-badge.open, .patch-badge.open {
605 background: var(--color-success-bg);
606 color: var(--color-success);
607 }
608 .issue-badge.closed, .patch-badge.closed {
609 background: var(--color-danger-bg);
610 color: var(--color-danger);
611 }
612 .patch-badge.merged {
613 background: var(--color-merged-bg);
614 color: var(--color-merged);
615 }
616
617 /* --- Empty state --- */
618 .empty-state {
619 text-align: center;
620 padding: var(--space-16) var(--space-4);
621 color: var(--color-text-muted);
622 }
623 .empty-state p { margin-bottom: var(--space-4); font-size: var(--text-lg); }
624
625 /* --- Breadcrumb --- */
626 .breadcrumb {
627 display: flex;
628 align-items: center;
629 flex-wrap: wrap;
630 gap: var(--space-1);
631 font-size: var(--text-sm);
632 margin-bottom: var(--space-4);
633 }
634 .breadcrumb a { color: var(--color-link); text-decoration: none; }
635 .breadcrumb a:hover { text-decoration: underline; }
636 .breadcrumb-sep { color: var(--color-text-muted); }
637 .breadcrumb-current { color: var(--color-text-muted); }
638
639 /* --- File tree --- */
640 .file-tree {
641 width: 100%;
642 border: 1px solid var(--color-border);
643 border-radius: var(--radius-lg);
644 border-collapse: collapse;
645 overflow: hidden;
646 margin-bottom: var(--space-6);
647 }
648 .file-tree-row {
649 border-bottom: 1px solid var(--color-border-muted);
650 }
651 .file-tree-row:last-child { border-bottom: none; }
652 .file-tree-row:hover { background: var(--color-bg-subtle); }
653 .file-icon, .file-name, .file-size {
654 padding: var(--space-2) var(--space-3);
655 font-size: var(--text-sm);
656 vertical-align: middle;
657 }
658 .file-icon {
659 width: 36px;
660 padding-right: var(--space-1);
661 text-align: center;
662 line-height: 0;
663 }
664 .file-name { width: 100%; }
665 .file-name a { color: var(--color-link); text-decoration: none; }
666 .file-name a:hover { text-decoration: underline; }
667 .file-name a.file-name-dir { font-weight: 500; }
668 .file-size {
669 text-align: right;
670 color: var(--color-text-muted);
671 font-size: var(--text-xs);
672 white-space: nowrap;
673 padding-right: var(--space-4);
674 }
675 .file-icon-dir { color: var(--color-link); }
676 .file-icon-file { color: var(--color-text-muted); }
677 .tree-icon { display: inline-block; vertical-align: text-bottom; }
678 .file-tree-row-up .file-name a { color: var(--color-text-muted); }
679 .file-tree-row-up .file-name a:hover { color: var(--color-link); }
680
681 /* --- File blob --- */
682 .file-blob-header {
683 display: flex;
684 align-items: center;
685 justify-content: space-between;
686 padding: var(--space-3) var(--space-4);
687 background: var(--color-bg-subtle);
688 border: 1px solid var(--color-border);
689 border-radius: var(--radius-lg) var(--radius-lg) 0 0;
690 }
691 .file-blob-name { font-size: var(--text-sm); font-weight: 500; }
692 .file-blob-body {
693 border: 1px solid var(--color-border);
694 border-top: none;
695 border-radius: 0 0 var(--radius-lg) var(--radius-lg);
696 overflow: auto;
697 }
698 .file-blob-body .shiki-wrapper pre {
699 margin: 0;
700 padding: var(--space-4);
701 font-size: var(--text-sm);
702 line-height: 1.6;
703 min-width: max-content;
704 }
705 .file-download-notice {
706 padding: var(--space-8);
707 text-align: center;
708 color: var(--color-text-muted);
709 }
710 .file-download-notice p { margin-bottom: var(--space-4); }
711
712 /* --- Commit list --- */
713 .commit-list { display: flex; flex-direction: column; }
714 .commit-item {
715 display: flex;
716 align-items: flex-start;
717 justify-content: space-between;
718 padding: var(--space-3) 0;
719 border-bottom: 1px solid var(--color-border-muted);
720 gap: var(--space-4);
721 flex-wrap: wrap;
722 }
723 .commit-item:last-child { border-bottom: none; }
724 .commit-main { flex: 1; min-width: 0; }
725 .commit-subject {
726 color: var(--color-text);
727 text-decoration: none;
728 font-size: var(--text-sm);
729 font-weight: 500;
730 }
731 .commit-subject:hover { color: var(--color-link); }
732 .commit-meta {
733 display: flex;
734 align-items: center;
735 gap: var(--space-3);
736 font-size: var(--text-xs);
737 color: var(--color-text-muted);
738 white-space: nowrap;
739 }
740 .commit-hash {
741 font-family: var(--font-mono);
742 color: var(--color-link);
743 text-decoration: none;
744 background: var(--color-bg-inset);
745 padding: 1px var(--space-2);
746 border-radius: var(--radius-sm);
747 }
748 .commit-hash:hover { text-decoration: underline; }
749 .mono { font-family: var(--font-mono); }
750
751 /* --- Commit detail viewer --- */
752 .commit-page-top {
753 display: flex;
754 align-items: center;
755 justify-content: space-between;
756 margin-bottom: var(--space-4);
757 }
758 .commit-card {
759 border: 1px solid var(--color-border);
760 border-radius: var(--radius-lg);
761 margin-bottom: var(--space-4);
762 overflow: hidden;
763 }
764 .commit-card-subject {
765 font-size: var(--text-xl);
766 font-weight: 600;
767 padding: var(--space-5) var(--space-6);
768 border-bottom: 1px solid var(--color-border);
769 line-height: 1.3;
770 }
771 .commit-card-body {
772 padding: var(--space-4) var(--space-6);
773 font-family: inherit;
774 font-size: var(--text-sm);
775 color: var(--color-text-muted);
776 border-bottom: 1px solid var(--color-border);
777 overflow-x: auto;
778 }
779 .commit-card-meta {
780 padding: var(--space-4) var(--space-6);
781 display: flex;
782 flex-direction: column;
783 gap: var(--space-2);
784 background: var(--color-bg-subtle);
785 }
786 .commit-card-meta-row {
787 display: flex;
788 align-items: baseline;
789 gap: var(--space-3);
790 font-size: var(--text-sm);
791 flex-wrap: wrap;
792 }
793 .commit-meta-label {
794 font-weight: 600;
795 color: var(--color-text-muted);
796 min-width: 5rem;
797 font-size: var(--text-xs);
798 text-transform: uppercase;
799 letter-spacing: 0.04em;
800 }
801 .commit-sha-full {
802 font-size: var(--text-xs);
803 background: var(--color-bg-inset);
804 padding: 2px var(--space-2);
805 border-radius: var(--radius-sm);
806 word-break: break-all;
807 }
808 .commit-stats-bar {
809 font-size: var(--text-sm);
810 color: var(--color-text-muted);
811 margin-bottom: var(--space-4);
812 }
813
814 /* --- Commit layout (sidebar + diffs) --- */
815 .commit-layout {
816 display: grid;
817 grid-template-columns: 1fr;
818 gap: var(--space-5);
819 align-items: start;
820 }
821 .commit-diffs { min-width: 0; }
822 @media (min-width: 900px) {
823 .commit-layout { grid-template-columns: 220px 1fr; }
824 .commit-layout:has(.file-nav-details:not([open])) { grid-template-columns: auto 1fr; }
825 }
826
827 /* --- File nav sidebar --- */
828 .commit-file-nav {
829 position: sticky;
830 top: calc(56px + var(--space-4));
831 max-height: calc(100vh - 140px);
832 overflow-y: auto;
833 }
834 .file-nav-details {
835 border: 1px solid var(--color-border);
836 border-radius: var(--radius-lg);
837 background: var(--color-bg-subtle);
838 overflow: hidden;
839 }
840 .file-nav-toggle {
841 display: flex;
842 align-items: center;
843 gap: var(--space-2);
844 padding: var(--space-3) var(--space-4);
845 font-size: var(--text-sm);
846 font-weight: 500;
847 cursor: pointer;
848 list-style: none;
849 user-select: none;
850 border-bottom: 1px solid var(--color-border);
851 }
852 .file-nav-toggle::-webkit-details-marker { display: none; }
853 .file-nav-details:not([open]) .file-nav-toggle { border-bottom: none; }
854 .file-nav-toggle-icon {
855 font-size: 1em;
856 transition: transform 0.15s;
857 }
858 .file-nav-details:not([open]) .file-nav-toggle-icon { transform: rotate(-90deg); }
859 .file-nav-list {
860 padding: var(--space-1) 0;
861 list-style: none;
862 }
863 .file-nav-item {
864 display: flex;
865 align-items: center;
866 gap: var(--space-2);
867 padding: var(--space-1) var(--space-3);
868 font-size: var(--text-xs);
869 text-decoration: none;
870 color: var(--color-text);
871 border-radius: 0;
872 overflow: hidden;
873 }
874 .file-nav-item:hover { background: var(--color-bg-inset); }
875 .file-nav-status {
876 flex-shrink: 0;
877 width: 16px;
878 height: 16px;
879 display: inline-flex;
880 align-items: center;
881 justify-content: center;
882 border-radius: var(--radius-sm);
883 font-size: 9px;
884 font-weight: 700;
885 font-family: var(--font-mono);
886 }
887 .file-status-added { background: var(--color-success-bg); color: var(--color-success); }
888 .file-status-deleted { background: var(--color-danger-bg); color: var(--color-danger); }
889 .file-status-modified { background: var(--color-accent-bg); color: var(--color-accent); }
890 .file-status-renamed { background: var(--color-merged-bg); color: var(--color-merged); }
891 .file-status-copied { background: var(--color-merged-bg); color: var(--color-merged); }
892 .file-nav-name {
893 flex: 1;
894 overflow: hidden;
895 text-overflow: ellipsis;
896 white-space: nowrap;
897 font-family: var(--font-mono);
898 }
899 .file-nav-stat {
900 flex-shrink: 0;
901 display: flex;
902 gap: var(--space-1);
903 font-size: var(--text-xs);
904 font-family: var(--font-mono);
905 }
906 .nav-add { color: var(--color-success); }
907 .nav-del { color: var(--color-danger); }
908 .file-nav-dir > details > .file-nav-list { padding-left: var(--space-4); }
909 .file-nav-dir-toggle {
910 display: flex;
911 align-items: center;
912 gap: var(--space-1);
913 padding: var(--space-1) var(--space-3);
914 font-size: var(--text-xs);
915 font-family: var(--font-mono);
916 color: var(--color-text-muted);
917 cursor: pointer;
918 list-style: none;
919 user-select: none;
920 }
921 .file-nav-dir-toggle::-webkit-details-marker { display: none; }
922 .file-nav-dir > details:not([open]) .file-nav-toggle-icon { transform: rotate(-90deg); }
923
924 /* --- Diff file cards --- */
925 .diff-file {
926 border: 1px solid var(--color-border);
927 border-radius: var(--radius-lg);
928 margin-bottom: var(--space-4);
929 overflow: hidden;
930 }
931 .diff-file-header {
932 display: flex;
933 align-items: center;
934 justify-content: space-between;
935 gap: var(--space-3);
936 padding: var(--space-3) var(--space-4);
937 background: var(--color-bg-subtle);
938 cursor: pointer;
939 list-style: none;
940 user-select: none;
941 flex-wrap: wrap;
942 }
943 .diff-file-header::-webkit-details-marker { display: none; }
944 .diff-file-header-left {
945 display: flex;
946 align-items: center;
947 gap: var(--space-2);
948 min-width: 0;
949 flex: 1;
950 }
951 .diff-file-header-right {
952 display: flex;
953 align-items: center;
954 gap: var(--space-2);
955 flex-shrink: 0;
956 flex-wrap: wrap;
957 }
958 .diff-file-toggle-icon {
959 font-size: 0.7em;
960 flex-shrink: 0;
961 transition: transform 0.15s;
962 }
963 .diff-file:not([open]) .diff-file-toggle-icon { transform: rotate(-90deg); }
964 .diff-status-badge {
965 flex-shrink: 0;
966 width: 18px;
967 height: 18px;
968 display: inline-flex;
969 align-items: center;
970 justify-content: center;
971 border-radius: var(--radius-sm);
972 font-size: 10px;
973 font-weight: 700;
974 font-family: var(--font-mono);
975 }
976 .diff-status-added { background: var(--color-success-bg); color: var(--color-success); }
977 .diff-status-deleted { background: var(--color-danger-bg); color: var(--color-danger); }
978 .diff-status-modified { background: var(--color-accent-bg); color: var(--color-accent); }
979 .diff-status-renamed { background: var(--color-merged-bg); color: var(--color-merged); }
980 .diff-status-copied { background: var(--color-merged-bg); color: var(--color-merged); }
981 .diff-file-path {
982 font-size: var(--text-sm);
983 font-weight: 500;
984 overflow: hidden;
985 text-overflow: ellipsis;
986 white-space: nowrap;
987 }
988 .diff-rename-arrow {
989 font-size: var(--text-xs);
990 color: var(--color-text-muted);
991 white-space: nowrap;
992 overflow: hidden;
993 text-overflow: ellipsis;
994 }
995 .diff-stat-add { color: var(--color-success); font-size: var(--text-sm); font-family: var(--font-mono); font-weight: 600; }
996 .diff-stat-del { color: var(--color-danger); font-size: var(--text-sm); font-family: var(--font-mono); font-weight: 600; }
997 .btn-xs {
998 padding: 1px var(--space-2);
999 font-size: var(--text-xs);
1000 border: 1px solid var(--color-border);
1001 border-radius: var(--radius-sm);
1002 background: var(--color-bg);
1003 color: var(--color-text);
1004 text-decoration: none;
1005 cursor: pointer;
1006 white-space: nowrap;
1007 font-family: var(--font-mono);
1008 display: inline-flex;
1009 align-items: center;
1010 transition: background 0.1s;
1011 }
1012 .btn-xs:hover { background: var(--color-bg-inset); }
1013
1014 /* --- Diff file body --- */
1015 .diff-file-body { }
1016 .diff-binary-notice {
1017 padding: var(--space-4) var(--space-6);
1018 font-size: var(--text-sm);
1019 color: var(--color-text-muted);
1020 font-style: italic;
1021 }
1022 .diff-hunk { border-top: 1px solid var(--color-border-muted); overflow-x: auto; }
1023 .diff-hunk:first-child { border-top: none; }
1024 .diff-hunk-header {
1025 padding: var(--space-1) var(--space-4);
1026 font-family: var(--font-mono);
1027 font-size: var(--text-xs);
1028 font-weight: normal;
1029 text-align: left;
1030 background: color-mix(in srgb, var(--color-merged-bg) 50%, var(--color-bg));
1031 color: var(--color-merged);
1032 border-bottom: 1px solid var(--color-border-muted);
1033 white-space: pre;
1034 }
1035
1036 /* --- Diff table --- */
1037 .diff-table {
1038 min-width: 100%;
1039 border-collapse: collapse;
1040 font-family: var(--font-mono);
1041 font-size: var(--text-xs);
1042 line-height: 1.5;
1043 }
1044 .diff-ln {
1045 width: 44px;
1046 min-width: 44px;
1047 text-align: right;
1048 padding: 0 var(--space-2);
1049 color: var(--color-text-muted);
1050 border-right: 1px solid var(--color-border-muted);
1051 user-select: none;
1052 vertical-align: top;
1053 white-space: nowrap;
1054 }
1055 .diff-sign {
1056 width: 18px;
1057 min-width: 18px;
1058 text-align: center;
1059 padding: 0 var(--space-1);
1060 user-select: none;
1061 vertical-align: top;
1062 }
1063 .diff-code {
1064 padding: 0 var(--space-3);
1065 white-space: pre;
1066 overflow: visible;
1067 vertical-align: top;
1068 word-break: normal;
1069 }
1070 /* Row type backgrounds */
1071 .diff-row-add { background: color-mix(in srgb, var(--color-success-bg) 70%, transparent); }
1072 .diff-row-del { background: color-mix(in srgb, var(--color-danger-bg) 70%, transparent); }
1073 .diff-row-add .diff-ln,
1074 .diff-row-add .diff-sign { background: color-mix(in srgb, var(--color-success-bg) 90%, transparent); }
1075 .diff-row-del .diff-ln,
1076 .diff-row-del .diff-sign { background: color-mix(in srgb, var(--color-danger-bg) 90%, transparent); }
1077 .diff-row-add .diff-sign { color: var(--color-success); font-weight: 700; }
1078 .diff-row-del .diff-sign { color: var(--color-danger); font-weight: 700; }
1079
1080 /* Shiki dark-mode support in diff code cells */
1081 @media (prefers-color-scheme: dark) {
1082 .diff-code span[style] { color: var(--shiki-dark) !important; }
1083 }
1084
1085 /* Shiki dark-mode support in file blob view */
1086 @media (prefers-color-scheme: dark) {
1087 .shiki-wrapper .shiki { background-color: var(--shiki-dark-bg) !important; color: var(--shiki-dark) !important; }
1088 .shiki-wrapper .shiki span { color: var(--shiki-dark) !important; }
1089 }
1090
1091 /* --- Issue / Patch list --- */
1092 .list-header {
1093 display: flex;
1094 align-items: center;
1095 justify-content: space-between;
1096 padding: var(--space-3) var(--space-4);
1097 background: var(--color-bg-subtle);
1098 border: 1px solid var(--color-border);
1099 border-radius: var(--radius-lg) var(--radius-lg) 0 0;
1100 gap: var(--space-4);
1101 }
1102 .list-header-tabs { display: flex; gap: var(--space-2); }
1103 .list-tab {
1104 padding: var(--space-1) var(--space-3);
1105 border-radius: var(--radius-md);
1106 font-size: var(--text-sm);
1107 text-decoration: none;
1108 color: var(--color-text-muted);
1109 }
1110 .list-tab:hover { background: var(--color-bg-inset); color: var(--color-text); }
1111 .list-tab.active {
1112 background: var(--color-bg-inset);
1113 color: var(--color-text);
1114 font-weight: 600;
1115 }
1116 .issue-list { border: 1px solid var(--color-border); border-top: none; border-radius: 0 0 var(--radius-lg) var(--radius-lg); }
1117 .issue-item {
1118 padding: var(--space-4) var(--space-4);
1119 border-bottom: 1px solid var(--color-border-muted);
1120 }
1121 .issue-item:last-child { border-bottom: none; }
1122 .issue-main {
1123 display: flex;
1124 align-items: center;
1125 gap: var(--space-2);
1126 margin-bottom: var(--space-1);
1127 flex-wrap: wrap;
1128 }
1129 .issue-title {
1130 font-weight: 500;
1131 text-decoration: none;
1132 color: var(--color-text);
1133 flex: 1;
1134 }
1135 .issue-title:hover { color: var(--color-link); }
1136 .issue-meta {
1137 font-size: var(--text-xs);
1138 color: var(--color-text-muted);
1139 display: flex;
1140 gap: var(--space-3);
1141 }
1142 .issue-status-dot, .patch-status-dot {
1143 width: 8px;
1144 height: 8px;
1145 border-radius: 50%;
1146 flex-shrink: 0;
1147 }
1148 .issue-status-dot.open, .patch-status-dot.open { background: var(--color-success); }
1149 .issue-status-dot.closed, .patch-status-dot.closed { background: var(--color-danger); }
1150 .patch-status-dot.merged { background: var(--color-merged); }
1151
1152 /* --- Issue detail / Timeline --- */
1153 .issue-detail-header {
1154 display: flex;
1155 align-items: center;
1156 gap: var(--space-3);
1157 margin-bottom: var(--space-6);
1158 flex-wrap: wrap;
1159 }
1160 .issue-number {
1161 font-size: var(--text-2xl);
1162 font-weight: 600;
1163 color: var(--color-text-muted);
1164 white-space: nowrap;
1165 }
1166 .issue-detail-title {
1167 font-size: var(--text-2xl);
1168 font-weight: 600;
1169 flex: 1;
1170 }
1171 .issue-detail-meta-actions { margin-left: auto; display: flex; gap: var(--space-2); }
1172 .timeline-item {
1173 border: 1px solid var(--color-border);
1174 border-radius: var(--radius-lg);
1175 margin-bottom: var(--space-4);
1176 overflow: hidden;
1177 }
1178 .timeline-author {
1179 background: var(--color-bg-subtle);
1180 padding: var(--space-3) var(--space-4);
1181 font-size: var(--text-sm);
1182 display: flex;
1183 align-items: center;
1184 justify-content: space-between;
1185 flex-wrap: wrap;
1186 gap: var(--space-3);
1187 border-bottom: 1px solid var(--color-border);
1188 }
1189 .timeline-author time { color: var(--color-text-muted); font-size: var(--text-xs); }
1190 .timeline-author-right { margin-left: auto; display: flex; align-items: center; gap: var(--space-2); }
1191 .edited-indicator { color: var(--color-text-muted); font-size: var(--text-xs); cursor: default; }
1192
1193 /* --- Avatars --- */
1194 .avatar {
1195 display: inline-flex;
1196 border-radius: 4px;
1197 overflow: hidden;
1198 flex-shrink: 0;
1199 vertical-align: middle;
1200 }
1201 .avatar-img {
1202 width: 100%;
1203 height: 100%;
1204 object-fit: cover;
1205 display: block;
1206 color: transparent;
1207 }
1208 .avatar-placeholder {
1209 display: inline-flex;
1210 align-items: center;
1211 justify-content: center;
1212 border-radius: 4px;
1213 background: var(--color-bg-inset);
1214 color: var(--color-text-muted);
1215 font-weight: 600;
1216 flex-shrink: 0;
1217 vertical-align: middle;
1218 }
1219 .avatar-settings {
1220 display: flex;
1221 align-items: flex-start;
1222 gap: var(--space-5);
1223 }
1224 .avatar-actions {
1225 display: flex;
1226 flex-direction: column;
1227 gap: var(--space-3);
1228 }
1229 .nav-user {
1230 display: inline-flex;
1231 align-items: center;
1232 gap: var(--space-2);
1233 }
1234 .timeline-body { padding: var(--space-4); }
1235 .timeline-item-new { padding: var(--space-4); }
1236 .timeline-item-new .section-title { font-size: var(--text-base); border: none; padding-bottom: 0; }
1237 /* Edit <details> (summary only) in .timeline-author; form is a sibling shown via :has() */
1238 .timeline-author-right .inline-edit-details { border: none; }
1239 .timeline-author-right .inline-edit-details > summary { padding: 0; list-style: none; }
1240 .timeline-author-right .inline-edit-details > summary::-webkit-details-marker { display: none; }
1241 .inline-edit-details .when-open { display: none; }
1242 .inline-edit-details[open] .when-closed { display: none; }
1243 .inline-edit-details[open] .when-open { display: inline; }
1244 .inline-edit-form-area { display: none; border-top: 1px solid var(--color-border-muted); }
1245 .timeline-item:has(.inline-edit-details[open]) .inline-edit-form-area { display: block; }
1246 .inline-edit-form { padding: var(--space-4); display: flex; flex-direction: column; gap: var(--space-3); }
1247
1248 /* --- Reactions --- */
1249 .reaction-bar {
1250 display: flex;
1251 flex-wrap: wrap;
1252 gap: var(--space-2);
1253 padding: var(--space-2) var(--space-4);
1254 border-top: 1px solid var(--color-border-muted);
1255 }
1256 .reaction-form { display: inline; }
1257 .reaction-btn {
1258 display: inline-flex;
1259 align-items: center;
1260 gap: var(--space-1);
1261 padding: var(--space-1) var(--space-3);
1262 border: 1px solid var(--color-border);
1263 border-radius: var(--radius-full);
1264 background: var(--color-bg-subtle);
1265 color: var(--color-text);
1266 font-size: var(--text-sm);
1267 cursor: pointer;
1268 transition: background 0.1s;
1269 }
1270 .reaction-btn:hover { background: var(--color-bg-inset); }
1271 .reaction-btn.reacted {
1272 background: var(--color-accent-bg);
1273 border-color: var(--color-accent);
1274 }
1275 .reaction-picker {
1276 position: relative;
1277 }
1278 .reaction-add-btn {
1279 display: inline-flex;
1280 align-items: center;
1281 justify-content: center;
1282 width: 28px;
1283 height: 28px;
1284 border: 1px dashed var(--color-border);
1285 border-radius: var(--radius-full);
1286 background: transparent;
1287 cursor: pointer;
1288 font-size: var(--text-base);
1289 color: var(--color-text-muted);
1290 list-style: none;
1291 }
1292 .reaction-add-btn::-webkit-details-marker { display: none; }
1293 .reaction-picker-dropdown {
1294 position: absolute;
1295 bottom: calc(100% + var(--space-2));
1296 left: 0;
1297 background: var(--color-bg);
1298 border: 1px solid var(--color-border);
1299 border-radius: var(--radius-lg);
1300 padding: var(--space-2);
1301 display: flex;
1302 gap: var(--space-1);
1303 z-index: 10;
1304 }
1305 .reaction-picker-btn {
1306 background: none;
1307 border: none;
1308 font-size: 1.25rem;
1309 cursor: pointer;
1310 padding: var(--space-1);
1311 border-radius: var(--radius-sm);
1312 }
1313 .reaction-picker-btn:hover { background: var(--color-bg-inset); }
1314
1315 /* --- Patch subview tabs --- */
1316 .patch-tab-nav {
1317 display: flex;
1318 border-bottom: 1px solid var(--color-border);
1319 margin-bottom: var(--space-6);
1320 }
1321 .tab-count {
1322 display: inline-flex;
1323 align-items: center;
1324 justify-content: center;
1325 min-width: 1.4em;
1326 padding: 0 var(--space-1);
1327 margin-left: var(--space-1);
1328 font-size: var(--text-xs);
1329 font-weight: 500;
1330 background: var(--color-bg-inset);
1331 border-radius: 999px;
1332 color: var(--color-text-muted);
1333 }
1334
1335 /* --- Patch apply status --- */
1336 .apply-status {
1337 margin: var(--space-4) 0;
1338 }
1339 .apply-result {
1340 display: flex;
1341 align-items: flex-start;
1342 gap: var(--space-2);
1343 padding: var(--space-3) var(--space-4);
1344 border-radius: var(--radius-md);
1345 font-size: var(--text-sm);
1346 flex-direction: column;
1347 }
1348 .apply-result > div { display: flex; gap: var(--space-2); align-items: center; }
1349 .apply-clean {
1350 background: var(--color-success-bg);
1351 color: var(--color-success);
1352 border: 1px solid var(--color-success);
1353 }
1354 .apply-conflict {
1355 background: var(--color-danger-bg);
1356 color: var(--color-danger);
1357 border: 1px solid var(--color-danger);
1358 }
1359 .apply-checking, .apply-unknown {
1360 color: var(--color-text-muted);
1361 font-style: italic;
1362 font-size: var(--text-sm);
1363 }
1364 .apply-output {
1365 font-family: var(--font-mono);
1366 font-size: var(--text-xs);
1367 white-space: pre-wrap;
1368 margin-top: var(--space-2);
1369 padding: var(--space-2);
1370 background: rgba(0,0,0,0.05);
1371 border-radius: var(--radius-sm);
1372 width: 100%;
1373 }
1374 .patch-actions {
1375 display: flex;
1376 gap: var(--space-3);
1377 margin: var(--space-4) 0;
1378 flex-wrap: wrap;
1379 }
1380 .patch-card-title-row {
1381 display: flex;
1382 align-items: flex-start;
1383 gap: var(--space-3);
1384 justify-content: space-between;
1385 margin-bottom: var(--space-3);
1386 }
1387 .patch-card-title-row .commit-card-subject { margin-bottom: 0; }
1388 .patch-card-description {
1389 margin-top: var(--space-4);
1390 padding-top: var(--space-4);
1391 border-top: 1px solid var(--color-border-muted);
1392 }
1393
1394 /* --- Repo home layout --- */
1395 .repo-home-layout {
1396 display: grid;
1397 gap: var(--space-8);
1398 }
1399 @media (min-width: 768px) {
1400 .repo-home-layout {
1401 grid-template-columns: 1fr 1fr;
1402 }
1403 }
1404 .readme-section {
1405 border: 1px solid var(--color-border);
1406 border-radius: var(--radius-lg);
1407 overflow: hidden;
1408 }
1409 .readme-header {
1410 background: var(--color-bg-subtle);
1411 padding: var(--space-3) var(--space-4);
1412 font-size: var(--text-sm);
1413 font-weight: 500;
1414 border-bottom: 1px solid var(--color-border);
1415 }
1416 .readme-section .markdown-body {
1417 padding: var(--space-4);
1418 }
1419
1420 /* --- Code setup block --- */
1421 .code-setup {
1422 background: var(--color-bg-subtle);
1423 border: 1px solid var(--color-border);
1424 border-radius: var(--radius-lg);
1425 padding: var(--space-4);
1426 font-size: var(--text-sm);
1427 margin-top: var(--space-4);
1428 overflow: auto;
1429 text-align: left;
1430 }
1431 .code-plain {
1432 background: var(--color-bg-subtle);
1433 padding: var(--space-4);
1434 overflow: auto;
1435 font-size: var(--text-sm);
1436 line-height: 1.6;
1437 }
1438
1439 /* --- Markdown body --- */
1440 .markdown-body {
1441 font-size: var(--text-sm);
1442 line-height: 1.6;
1443 color: var(--color-text);
1444 }
1445 .markdown-body h1, .markdown-body h2, .markdown-body h3,
1446 .markdown-body h4, .markdown-body h5, .markdown-body h6 {
1447 margin-top: var(--space-6);
1448 margin-bottom: var(--space-3);
1449 }
1450 .markdown-body p { margin-bottom: var(--space-4); }
1451 .markdown-body a { color: var(--color-link); }
1452 .markdown-body code {
1453 background: var(--color-bg-inset);
1454 padding: 0.1em 0.3em;
1455 border-radius: var(--radius-sm);
1456 font-size: 0.9em;
1457 }
1458 .markdown-body pre {
1459 background: var(--color-bg-subtle);
1460 border: 1px solid var(--color-border);
1461 border-radius: var(--radius-md);
1462 padding: var(--space-4);
1463 overflow: auto;
1464 margin-bottom: var(--space-4);
1465 }
1466 .markdown-body pre code { background: none; padding: 0; }
1467 .markdown-body ul, .markdown-body ol {
1468 padding-left: var(--space-6);
1469 margin-bottom: var(--space-4);
1470 }
1471 .markdown-body ul { list-style: disc; }
1472 .markdown-body ol { list-style: decimal; }
1473 .markdown-body li { margin-bottom: var(--space-1); }
1474 .markdown-body blockquote {
1475 border-left: 3px solid var(--color-border);
1476 padding-left: var(--space-4);
1477 color: var(--color-text-muted);
1478 margin: var(--space-4) 0;
1479 }
1480 .markdown-body table {
1481 width: 100%;
1482 border-collapse: collapse;
1483 margin-bottom: var(--space-4);
1484 }
1485 .markdown-body th, .markdown-body td {
1486 padding: var(--space-2) var(--space-3);
1487 border: 1px solid var(--color-border);
1488 }
1489 .markdown-body th { background: var(--color-bg-subtle); font-weight: 600; }
1490 .markdown-body hr {
1491 border: none;
1492 border-top: 1px solid var(--color-border);
1493 margin: var(--space-6) 0;
1494 }
1495 .markdown-body img { max-width: 100%; border-radius: var(--radius-md); }
1496 .markdown-body details { margin-bottom: var(--space-4); }
1497 .markdown-body summary { cursor: pointer; font-weight: 500; }
1498
1499 /* --- Search form --- */
1500 .search-form { margin-bottom: var(--space-5); }
1501 .search-input-wrap {
1502 display: flex;
1503 gap: var(--space-2);
1504 max-width: 480px;
1505 }
1506 .search-input {
1507 flex: 1;
1508 padding: var(--space-2) var(--space-3);
1509 border: 1px solid var(--color-border);
1510 border-radius: var(--radius-md);
1511 background: var(--color-bg);
1512 color: var(--color-text);
1513 font-size: var(--text-sm);
1514 }
1515 .search-input:focus {
1516 outline: 2px solid var(--color-accent);
1517 outline-offset: -1px;
1518 border-color: var(--color-accent);
1519 }
1520
1521 /* --- Issue close bar --- */
1522 .issue-close-bar {
1523 display: flex;
1524 justify-content: flex-end;
1525 padding: var(--space-3) 0;
1526 border-top: 1px solid var(--color-border-muted);
1527 margin-top: var(--space-2);
1528 }
1529
1530 /* --- Auth divider --- */
1531 .auth-divider {
1532 display: flex;
1533 align-items: center;
1534 gap: var(--space-3);
1535 margin: var(--space-4) 0;
1536 color: var(--color-text-muted);
1537 font-size: var(--text-sm);
1538 }
1539 .auth-divider::before,
1540 .auth-divider::after {
1541 content: '';
1542 flex: 1;
1543 height: 1px;
1544 background: var(--color-border);
1545 }
1546
1547 /* --- Passkey UI in settings --- */
1548 .passkey-actions {
1549 display: flex;
1550 flex-direction: column;
1551 gap: var(--space-3);
1552 align-items: flex-start;
1553 margin-top: var(--space-3);
1554 }
1555 .passkey-status { font-size: var(--text-sm); }
1556
1557 /* --- Danger zone --- */
1558 .danger-zone { margin-top: var(--space-8); }
1559 .danger-title { color: var(--color-danger); border-bottom-color: var(--color-danger); }
1560 .danger-card {
1561 border-color: var(--color-danger);
1562 background: var(--color-danger-bg);
1563 }
1564 .danger-item {
1565 display: flex;
1566 align-items: center;
1567 justify-content: space-between;
1568 gap: var(--space-4);
1569 flex-wrap: wrap;
1570 }
1571 .danger-item p { margin: var(--space-1) 0 0; }
1572 .btn-danger {
1573 background: var(--color-danger);
1574 border-color: transparent;
1575 color: #fff;
1576 }
1577 .btn-danger:hover { filter: brightness(0.9); }
1578
1579 /* --- Release list items --- */
1580 .release-item-header {
1581 display: flex;
1582 gap: var(--space-3);
1583 align-items: flex-start;
1584 }
1585 .release-item-main { flex: 1; min-width: 0; }
1586 .release-item-title {
1587 font-size: var(--text-lg);
1588 font-weight: 700;
1589 text-decoration: none;
1590 color: var(--color-text);
1591 display: block;
1592 margin-bottom: var(--space-1);
1593 }
1594 .release-item-title:hover { color: var(--color-link); }
1595 .release-item-meta {
1596 display: flex;
1597 flex-wrap: wrap;
1598 gap: var(--space-3);
1599 align-items: center;
1600 font-size: var(--text-xs);
1601 color: var(--color-text-muted);
1602 }
1603 .release-item-date {
1604 display: flex;
1605 flex-direction: column;
1606 align-items: flex-end;
1607 gap: var(--space-2);
1608 font-size: var(--text-xs);
1609 color: var(--color-text-muted);
1610 white-space: nowrap;
1611 flex-shrink: 0;
1612 }
1613
1614 /* --- Release notes preview in list --- */
1615 .release-notes-section { margin-top: var(--space-3); }
1616 .release-notes-label {
1617 font-size: var(--text-xs);
1618 font-weight: 600;
1619 color: var(--color-text-muted);
1620 text-transform: uppercase;
1621 letter-spacing: 0.05em;
1622 margin-bottom: var(--space-2);
1623 }
1624 .notes-expand > summary { list-style: none; cursor: pointer; outline: none; }
1625 .notes-expand > summary::-webkit-details-marker { display: none; }
1626 .notes-preview {
1627 max-height: calc(5 * 1.6em);
1628 overflow: hidden;
1629 position: relative;
1630 white-space: pre-wrap;
1631 font-size: var(--text-sm);
1632 color: var(--color-text);
1633 line-height: 1.6;
1634 word-break: break-word;
1635 margin-bottom: var(--space-1);
1636 }
1637 .notes-preview::after {
1638 content: "";
1639 position: absolute;
1640 bottom: 0;
1641 left: 0;
1642 right: 0;
1643 height: 2.5em;
1644 background: linear-gradient(transparent, var(--color-bg));
1645 pointer-events: none;
1646 }
1647 .notes-expand[open] .notes-preview { display: none; }
1648 .notes-expand[open] { display: flex; flex-direction: column; }
1649 .notes-expand[open] > summary { order: 1; }
1650 .notes-expand[open] > .notes-full { order: 0; }
1651 .notes-toggle-label {
1652 display: inline-block;
1653 font-size: var(--text-xs);
1654 color: var(--color-link);
1655 margin-top: var(--space-1);
1656 }
1657 .notes-toggle-label:hover { text-decoration: underline; }
1658 .notes-toggle-label::before { content: "Show more ↓"; }
1659 .notes-expand[open] .notes-toggle-label::before { content: "Show less ↑"; }
1660 .notes-full { padding-top: var(--space-3); padding-bottom: var(--space-1); }
1661
1662 /* --- Release detail --- */
1663 .release-detail { padding: var(--space-6) 0; }
1664 .release-header { margin-bottom: var(--space-6); }
1665 .release-notes { margin-bottom: var(--space-6); }
1666 .release-assets { margin-bottom: var(--space-6); }
1667 .release-assets-heading {
1668 font-size: var(--text-base);
1669 font-weight: 600;
1670 margin-bottom: var(--space-3);
1671 }
1672 .asset-list {
1673 border: 1px solid var(--color-border);
1674 border-radius: var(--radius-lg);
1675 overflow: hidden;
1676 }
1677 .asset-item {
1678 display: flex;
1679 align-items: center;
1680 gap: var(--space-4);
1681 padding: var(--space-3) var(--space-4);
1682 border-bottom: 1px solid var(--color-border-muted);
1683 font-size: var(--text-sm);
1684 }
1685 .asset-item:last-child { border-bottom: none; }
1686 .asset-name {
1687 flex: 1;
1688 color: var(--color-link);
1689 text-decoration: none;
1690 font-family: var(--font-mono);
1691 font-size: var(--text-xs);
1692 }
1693 .asset-name:hover { text-decoration: underline; }
1694 .asset-name-pending {
1695 color: var(--color-text-muted);
1696 cursor: default;
1697 }
1698 .asset-item-pending { opacity: 0.6; }
1699 .asset-size, .asset-meta {
1700 color: var(--color-text-muted);
1701 font-size: var(--text-xs);
1702 white-space: nowrap;
1703 }
1704 .release-back { margin-top: var(--space-4); display: flex; gap: var(--space-3); align-items: center; justify-content: space-between; }
1705}
1706
1707/* ============================================================
1708 @layer utilities
1709 ============================================================ */
1710@layer utilities {
1711 .text-muted { color: var(--color-text-muted); }
1712 .text-sm { font-size: var(--text-sm); }
1713 .text-xs { font-size: var(--text-xs); }
1714 .font-mono { font-family: var(--font-mono); }
1715 .mt-1 { margin-top: var(--space-1); }
1716 .mt-2 { margin-top: var(--space-2); }
1717 .mt-4 { margin-top: var(--space-4); }
1718 .mt-6 { margin-top: var(--space-6); }
1719 .mb-4 { margin-bottom: var(--space-4); }
1720 .flex { display: flex; }
1721 .gap-2 { gap: var(--space-2); }
1722 .gap-4 { gap: var(--space-4); }
1723 .items-center { align-items: center; }
1724 .justify-between { justify-content: space-between; }
1725 .hidden { display: none; }
1726}
1727
1728/* ============================================================
1729 Pagination
1730 ============================================================ */
1731.commit-cursor-nav {
1732 display: flex;
1733 justify-content: space-between;
1734 border-top: 1px solid var(--color-border);
1735 margin-top: var(--space-2);
1736 padding: var(--space-4) 0 var(--space-2);
1737}
1738
1739.commit-cursor-prev { flex: 1; }
1740.commit-cursor-next { flex: 1; text-align: right; }
1741
1742.pagination {
1743 display: grid;
1744 grid-template-columns: 1fr auto 1fr;
1745 align-items: center;
1746 border-top: 1px solid var(--color-border);
1747 margin-top: var(--space-2);
1748 padding: var(--space-4) 0 var(--space-2);
1749}
1750
1751.pagination-prev { justify-self: start; }
1752.pagination-next { justify-self: end; }
1753
1754.pagination-info {
1755 justify-self: center;
1756 font-size: var(--text-sm);
1757 color: var(--color-text-muted);
1758}
1759
1760.pagination-btn {
1761 display: inline-flex;
1762 align-items: center;
1763 gap: var(--space-1);
1764 padding: var(--space-1) var(--space-3);
1765 border: 1px solid var(--color-border);
1766 border-radius: var(--radius-md);
1767 font-size: var(--text-sm);
1768 font-weight: 500;
1769 text-decoration: none;
1770 color: var(--color-text);
1771 background: var(--color-bg-subtle);
1772 transition: background 0.1s, border-color 0.1s;
1773 white-space: nowrap;
1774}
1775
1776.pagination-btn:hover {
1777 background: var(--color-bg-inset);
1778 border-color: var(--color-border);
1779 color: var(--color-text);
1780 text-decoration: none;
1781}
1782
1783 /* Settings */
1784 .theme-options { display: flex; gap: var(--space-4); margin-bottom: var(--space-4); flex-wrap: wrap; }
1785 .theme-option { display: flex; align-items: center; gap: var(--space-2); cursor: pointer; font-size: var(--text-sm); }
1786 .settings-form { display: flex; flex-direction: column; gap: var(--space-4); }
1787 .passkey-list { display: flex; flex-direction: column; gap: var(--space-2); margin-bottom: var(--space-4); }
1788 .passkey-item { display: flex; align-items: center; gap: var(--space-3); padding: var(--space-2) 0; border-bottom: 1px solid var(--color-border-muted); font-size: var(--text-sm); }
1789 .passkey-item:last-child { border-bottom: none; }
1790 .passkey-date { flex: 1; color: var(--color-text-muted); }
1791 .ssh-key-info { flex: 1; display: flex; flex-direction: column; gap: var(--space-1); min-width: 0; }
1792 .ssh-key-name { font-weight: 500; }
1793 .ssh-key-fingerprint { font-family: var(--font-mono); font-size: var(--text-xs); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
1794 .form-textarea { resize: vertical; min-height: 4.5rem; font-family: var(--font-mono); font-size: var(--text-sm); }
1795 /* Clone popup */
1796 .clone-popup-details { position: relative; display: inline-block; }
1797 .clone-popup-details > summary { list-style: none; }
1798 .clone-popup-details > summary::-webkit-details-marker { display: none; }
1799 .clone-popup { position: absolute; right: 1rem; top: calc(100% + var(--space-2)); background: var(--color-bg); border: 1px solid var(--color-border); border-radius: var(--radius-lg); padding: var(--space-3); min-width: 22rem; z-index: 100; box-shadow: 0 4px 20px rgba(0,0,0,0.15); display: flex; flex-direction: column; gap: var(--space-2); }
1800 .clone-url-row { display: flex; align-items: center; gap: var(--space-2); }
1801 .clone-url-label { font-size: var(--text-xs); font-weight: 600; color: var(--color-text-muted); text-transform: uppercase; letter-spacing: 0.05em; min-width: 2.75rem; }
1802 .clone-url-input { flex: 1; font-family: var(--font-mono); font-size: var(--text-sm); background: var(--color-bg-subtle); border: 1px solid var(--color-border-muted); border-radius: var(--radius-md); padding: var(--space-1) var(--space-2); color: var(--color-text); cursor: text; min-width: 0; }
1803 .user-list { display: flex; flex-direction: column; gap: var(--space-2); margin-bottom: var(--space-6); }
1804 .user-item { display: flex; align-items: center; gap: var(--space-3); padding: var(--space-2) 0; border-bottom: 1px solid var(--color-border-muted); font-size: var(--text-sm); }
1805 .user-item:last-child { border-bottom: none; }
1806 .user-name { font-weight: 500; flex: 1; }
1807 .user-date { color: var(--color-text-muted); font-size: var(--text-xs); }
1808