rin
Публичный Open-source lightweight git hosting.
input.css · 1830 строк · 42.5 KB
Raw
1 /* Polar Design System — Minimalist Sidebar Layout, 3 Themes (light, dark, system) */
2
3 @font-face {
4 font-family: 'Inter';
5 font-style: normal;
6 font-weight: 400 600;
7 font-display: swap;
8 src: url('/static/fonts/Inter-Regular.woff2') format('woff2');
9 }
10
11 @font-face {
12 font-family: 'Inter';
13 font-style: normal;
14 font-weight: 400 600;
15 font-display: swap;
16 src: url('/static/fonts/Inter-Cyrillic.woff2') format('woff2');
17 unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
18 }
19
20 @font-face {
21 font-family: 'JetBrains Mono';
22 font-style: normal;
23 font-weight: 400 600;
24 font-display: swap;
25 src: url('/static/fonts/JetBrainsMono-Regular.woff2') format('woff2');
26 }
27
28 :root,
29 html[data-theme="light"] {
30 --background: 0 0% 100%;
31 --foreground: 0 0% 6.7%;
32 --card: 0 0% 98%;
33 --card-foreground: 0 0% 6.7%;
34 --popover: 0 0% 100%;
35 --popover-foreground: 0 0% 6.7%;
36 --primary: 0 0% 6.7%;
37 --primary-foreground: 0 0% 100%;
38 --secondary: 0 0% 95%;
39 --secondary-foreground: 0 0% 6.7%;
40 --muted: 0 0% 95%;
41 --muted-foreground: 0 0% 38%;
42 --accent: 0 0% 93%;
43 --accent-foreground: 0 0% 6.7%;
44 --destructive: 0 72% 46%;
45 --destructive-foreground: 0 0% 100%;
46 --destructive-surface: 0 72% 96%;
47 --border: 0 0% 90%;
48 --input: 0 0% 89%;
49 --ring: 0 0% 6.7%;
50 --radius: 0.45rem;
51
52 --diff-add-bg: 142 70% 94%;
53 --diff-add-fg: 142 76% 22%;
54 --diff-del-bg: 0 86% 95%;
55 --diff-del-fg: 0 72% 35%;
56
57 --syntax-kw: 262 72% 42%;
58 --syntax-str: 142 68% 28%;
59 --syntax-cmt: 0 0% 46%;
60 --syntax-fn: 215 80% 42%;
61 --syntax-num: 24 85% 38%;
62 --syntax-type: 190 78% 32%;
63 --syntax-op: 0 0% 25%;
64 color-scheme: light;
65 }
66
67 html[data-theme="dark"] {
68 --background: 0 0% 6.7%;
69 --foreground: 0 0% 100%;
70 --card: 0 0% 10%;
71 --card-foreground: 0 0% 100%;
72 --popover: 0 0% 11%;
73 --popover-foreground: 0 0% 100%;
74 --primary: 0 0% 100%;
75 --primary-foreground: 0 0% 6.7%;
76 --secondary: 0 0% 15%;
77 --secondary-foreground: 0 0% 100%;
78 --muted: 0 0% 14%;
79 --muted-foreground: 0 0% 74%;
80 --accent: 0 0% 17%;
81 --accent-foreground: 0 0% 100%;
82 --destructive: 0 72% 58%;
83 --destructive-foreground: 0 0% 98%;
84 --destructive-surface: 0 45% 15%;
85 --border: 0 0% 20%;
86 --input: 0 0% 17%;
87 --ring: 0 0% 85%;
88
89 --diff-add-bg: 142 50% 12%;
90 --diff-add-fg: 142 70% 75%;
91 --diff-del-bg: 0 55% 14%;
92 --diff-del-fg: 0 80% 78%;
93
94 --syntax-kw: 265 85% 78%;
95 --syntax-str: 142 65% 70%;
96 --syntax-cmt: 0 0% 54%;
97 --syntax-fn: 210 90% 74%;
98 --syntax-num: 32 90% 72%;
99 --syntax-type: 188 80% 68%;
100 --syntax-op: 0 0% 78%;
101 color-scheme: dark;
102 }
103
104 @media (prefers-color-scheme: dark) {
105 html[data-theme="system"] {
106 --background: 0 0% 6.7%;
107 --foreground: 0 0% 100%;
108 --card: 0 0% 10%;
109 --card-foreground: 0 0% 100%;
110 --popover: 0 0% 11%;
111 --popover-foreground: 0 0% 100%;
112 --primary: 0 0% 100%;
113 --primary-foreground: 0 0% 6.7%;
114 --secondary: 0 0% 15%;
115 --secondary-foreground: 0 0% 100%;
116 --muted: 0 0% 14%;
117 --muted-foreground: 0 0% 74%;
118 --accent: 0 0% 17%;
119 --accent-foreground: 0 0% 100%;
120 --destructive: 0 72% 58%;
121 --destructive-foreground: 0 0% 98%;
122 --destructive-surface: 0 45% 15%;
123 --border: 0 0% 20%;
124 --input: 0 0% 17%;
125 --ring: 0 0% 85%;
126 --diff-add-bg: 142 50% 12%;
127 --diff-add-fg: 142 70% 75%;
128 --diff-del-bg: 0 55% 14%;
129 --diff-del-fg: 0 80% 78%;
130 --syntax-kw: 265 85% 78%;
131 --syntax-str: 142 65% 70%;
132 --syntax-cmt: 0 0% 54%;
133 --syntax-fn: 210 90% 74%;
134 --syntax-num: 32 90% 72%;
135 --syntax-type: 188 80% 68%;
136 --syntax-op: 0 0% 78%;
137 color-scheme: dark;
138 }
139 }
140
141 *, *::before, *::after {
142 box-sizing: border-box;
143 border-color: hsl(var(--border));
144 }
145
146 html {
147 font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
148 font-size: 13.5px;
149 line-height: 1.5;
150 -webkit-font-smoothing: antialiased;
151 background-color: hsl(var(--background));
152 color: hsl(var(--foreground));
153 overflow-y: scroll;
154 }
155
156 body {
157 margin: 0;
158 min-height: 100vh;
159 background-color: hsl(var(--background));
160 color: hsl(var(--foreground));
161 }
162
163 code, pre, kbd, .font-mono {
164 font-family: 'JetBrains Mono', ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
165 }
166
167 a {
168 color: inherit;
169 text-decoration: none;
170 }
171
172 @media (prefers-reduced-motion: reduce) {
173 *, *::before, *::after {
174 animation-duration: 0.01ms !important;
175 transition-duration: 0.01ms !important;
176 }
177 }
178
179 :focus-visible {
180 outline: 2px solid hsl(var(--ring));
181 outline-offset: 2px;
182 }
183
184 /* App Shell: Left Sidebar + Right Main Content */
185 .app-shell {
186 display: flex;
187 flex-direction: row;
188 align-items: stretch;
189 min-height: 100vh;
190 width: 100%;
191 }
192
193 .app-sidebar {
194 width: 232px;
195 min-width: 232px;
196 max-width: 232px;
197 flex: 0 0 232px;
198 border: 1px solid hsl(var(--border));
199 border-radius: calc(var(--radius) * 1.5);
200 background-color: hsl(var(--card));
201 display: none;
202 flex-direction: column;
203 justify-content: space-between;
204 position: sticky;
205 top: 0.75rem;
206 height: calc(100vh - 1.5rem);
207 margin: 0.75rem 0 0.75rem 0.75rem;
208 overflow-y: auto;
209 overflow-x: hidden;
210 padding: 0.85rem 0.7rem;
211 user-select: none;
212 transition:
213 width 200ms cubic-bezier(0.16, 1, 0.3, 1),
214 min-width 200ms cubic-bezier(0.16, 1, 0.3, 1),
215 max-width 200ms cubic-bezier(0.16, 1, 0.3, 1),
216 flex-basis 200ms cubic-bezier(0.16, 1, 0.3, 1),
217 margin 200ms cubic-bezier(0.16, 1, 0.3, 1),
218 padding 200ms cubic-bezier(0.16, 1, 0.3, 1),
219 border-color 200ms cubic-bezier(0.16, 1, 0.3, 1);
220 }
221
222 .sidebar-inner {
223 width: 100%;
224 min-width: 0;
225 height: 100%;
226 display: flex;
227 flex-direction: column;
228 justify-content: space-between;
229 transition:
230 opacity 150ms cubic-bezier(0.16, 1, 0.3, 1),
231 transform 200ms cubic-bezier(0.16, 1, 0.3, 1);
232 }
233
234 html[data-sidebar="collapsed"] .app-sidebar {
235 width: 0;
236 min-width: 0;
237 max-width: 0;
238 flex-basis: 0;
239 margin: 0.75rem 0;
240 padding-left: 0;
241 padding-right: 0;
242 border-color: transparent;
243 }
244
245 html[data-sidebar="collapsed"] .sidebar-inner {
246 opacity: 0;
247 transform: translateX(-8px);
248 pointer-events: none;
249 }
250
251 .sidebar-expand-btn {
252 position: fixed;
253 top: 0.85rem;
254 left: 0.85rem;
255 z-index: 50;
256 display: none;
257 align-items: center;
258 justify-content: center;
259 width: 2rem;
260 height: 2rem;
261 border-radius: var(--radius);
262 border: 1px solid hsl(var(--border));
263 background-color: hsl(var(--card));
264 color: hsl(var(--muted-foreground));
265 box-shadow: 0 2px 8px rgba(0, 0, 0, 0.12);
266 cursor: pointer;
267 opacity: 0;
268 transform: translateX(-6px) scale(0.95);
269 pointer-events: none;
270 transition:
271 opacity 160ms cubic-bezier(0.16, 1, 0.3, 1),
272 transform 160ms cubic-bezier(0.16, 1, 0.3, 1),
273 background-color 120ms ease,
274 color 120ms ease;
275 }
276
277 .sidebar-expand-btn:hover {
278 background-color: hsl(var(--accent));
279 color: hsl(var(--foreground));
280 }
281
282 .mobile-topbar {
283 display: flex;
284 align-items: center;
285 justify-content: space-between;
286 height: 2.75rem;
287 padding: 0 0.85rem;
288 border-bottom: 1px solid hsl(var(--border));
289 background-color: hsl(var(--card));
290 }
291
292 .app-col {
293 flex: 1 1 0%;
294 min-width: 0;
295 width: 100%;
296 display: flex;
297 flex-direction: column;
298 min-height: 100vh;
299 position: relative;
300 isolation: isolate;
301 }
302
303 .page-bg {
304 position: absolute;
305 inset: 0;
306 z-index: 0;
307 left: 0;
308 overflow: hidden;
309 pointer-events: none;
310 background: hsl(var(--background));
311 transition: left 200ms cubic-bezier(0.16, 1, 0.3, 1);
312 }
313 .page-bg img {
314 position: absolute;
315 inset: 0 0 auto;
316 width: 100%;
317 height: clamp(28rem, 92vh, 54rem);
318 object-fit: cover;
319 object-position: center 28%;
320 opacity: 0.9;
321 filter: saturate(0.9) contrast(0.97);
322 -webkit-mask-image: linear-gradient(to bottom, #000 0%, rgba(0, 0, 0, 0.96) 38%, rgba(0, 0, 0, 0.62) 72%, transparent 100%);
323 mask-image: linear-gradient(to bottom, #000 0%, rgba(0, 0, 0, 0.96) 38%, rgba(0, 0, 0, 0.62) 72%, transparent 100%);
324 }
325 .page-bg::after {
326 content: "";
327 position: absolute;
328 inset: 0;
329 background:
330 radial-gradient(118% 86% at 50% 0%, transparent 16%, hsl(var(--background) / 0.36) 52%, hsl(var(--background) / 0.9) 86%, hsl(var(--background)) 100%),
331 linear-gradient(to bottom,
332 hsl(var(--background) / 0.5) 0%,
333 hsl(var(--background) / 0.6) 32%,
334 hsl(var(--background) / 0.88) 68%,
335 hsl(var(--background)) 100%);
336 }
337 .app-col > .mobile-topbar,
338 .app-col > .app-main {
339 position: relative;
340 z-index: 1;
341 }
342
343 .app-main {
344 flex: 1 1 auto;
345 width: 100%;
346 padding: 1.5rem 1.25rem 3rem;
347 }
348
349 @keyframes pageFadeIn {
350 from {
351 opacity: 0;
352 transform: translateY(4px);
353 }
354 to {
355 opacity: 1;
356 transform: translateY(0);
357 }
358 }
359
360 .app-main > .container,
361 .app-main > .container-narrow {
362 animation: pageFadeIn 160ms cubic-bezier(0.16, 1, 0.3, 1);
363 }
364
365 @media (min-width: 640px) {
366 .app-sidebar {
367 display: flex;
368 }
369 .page-bg {
370 left: 0.75rem;
371 }
372 html[data-sidebar="collapsed"] .page-bg {
373 left: 0;
374 }
375 .sidebar-expand-btn {
376 display: inline-flex;
377 }
378 html[data-sidebar="collapsed"] .sidebar-expand-btn {
379 opacity: 1;
380 transform: translateX(0) scale(1);
381 pointer-events: auto;
382 }
383 .mobile-topbar {
384 display: none;
385 }
386 .app-main {
387 padding: 2rem 2.5rem 3.5rem;
388 }
389 }
390
391 /* Unified Container Width — identical across Code, Commits, and Settings */
392 .container,
393 .container-narrow {
394 width: 100%;
395 max-width: 960px;
396 margin-left: auto;
397 margin-right: auto;
398 }
399
400 /* Sidebar Navigation */
401 .nav-item {
402 display: flex;
403 align-items: center;
404 justify-content: space-between;
405 gap: 0.5rem;
406 height: 1.95rem;
407 padding: 0 0.55rem;
408 border-radius: var(--radius);
409 font-size: 0.85rem;
410 color: hsl(var(--muted-foreground));
411 transition: background-color 140ms ease, color 140ms ease, transform 120ms cubic-bezier(0.16, 1, 0.3, 1);
412 cursor: pointer;
413 border: 0;
414 background: transparent;
415 width: 100%;
416 text-align: left;
417 overflow: hidden;
418 }
419 .nav-item:hover,
420 .nav-item.active {
421 background-color: hsl(var(--accent));
422 color: hsl(var(--foreground));
423 }
424 .nav-item:active {
425 transform: scale(0.985);
426 }
427 .muted-link {
428 color: hsl(var(--muted-foreground));
429 transition: color 140ms ease;
430 }
431 .muted-link:hover {
432 color: hsl(var(--foreground));
433 }
434 .nav-section-label {
435 display: flex;
436 align-items: center;
437 justify-content: space-between;
438 padding: 0.45rem 0.55rem 0.25rem;
439 font-size: 0.7rem;
440 font-weight: 600;
441 text-transform: uppercase;
442 letter-spacing: 0.04em;
443 color: hsl(var(--muted-foreground));
444 }
445
446 /* Segmented Theme Control in Sidebar */
447 .segmented {
448 display: grid;
449 grid-template-columns: repeat(3, minmax(0, 1fr));
450 gap: 2px;
451 padding: 2px;
452 width: 100%;
453 background-color: hsl(var(--muted));
454 border: 1px solid hsl(var(--border));
455 border-radius: var(--radius);
456 }
457 .segmented-btn {
458 display: inline-flex;
459 align-items: center;
460 justify-content: center;
461 gap: 0.25rem;
462 height: 1.65rem;
463 padding: 0 0.2rem;
464 border: 0;
465 border-radius: calc(var(--radius) - 2px);
466 background: transparent;
467 color: hsl(var(--muted-foreground));
468 font-size: 0.72rem;
469 font-weight: 500;
470 cursor: pointer;
471 overflow: hidden;
472 text-overflow: ellipsis;
473 white-space: nowrap;
474 transition: background-color 150ms cubic-bezier(0.16, 1, 0.3, 1), color 150ms ease, box-shadow 150ms ease, transform 120ms ease;
475 }
476 .segmented-btn:hover {
477 color: hsl(var(--foreground));
478 }
479 .segmented-btn:active {
480 transform: scale(0.96);
481 }
482 .segmented-btn.active {
483 background-color: hsl(var(--background));
484 color: hsl(var(--foreground));
485 box-shadow: 0 1px 2px rgba(0, 0, 0, 0.08);
486 }
487
488 /* Icons */
489 .icon {
490 display: inline-block;
491 vertical-align: middle;
492 flex-shrink: 0;
493 stroke: currentColor;
494 }
495 .size-3 { width: 0.75rem; height: 0.75rem; }
496 .size-3\.5 { width: 0.875rem; height: 0.875rem; }
497 .size-4 { width: 1rem; height: 1rem; }
498 .size-5 { width: 1.25rem; height: 1.25rem; }
499 .size-6 { width: 1.5rem; height: 1.5rem; }
500
501 /* Buttons */
502 .btn {
503 display: inline-flex;
504 align-items: center;
505 justify-content: center;
506 gap: 0.4rem;
507 white-space: nowrap;
508 border-radius: var(--radius);
509 font-size: 0.85rem;
510 font-weight: 500;
511 line-height: 1;
512 height: 1.95rem;
513 padding: 0 0.7rem;
514 border: 1px solid transparent;
515 cursor: pointer;
516 transition: background-color 140ms ease, border-color 140ms ease, color 140ms ease, opacity 140ms ease, transform 120ms cubic-bezier(0.16, 1, 0.3, 1);
517 user-select: none;
518 }
519 .btn:active:not(:disabled) {
520 transform: scale(0.97);
521 }
522 .btn:disabled {
523 opacity: 0.5;
524 pointer-events: none;
525 }
526 .btn-sm {
527 height: 1.7rem;
528 padding: 0 0.5rem;
529 font-size: 0.78rem;
530 }
531 .btn-lg {
532 height: 2.3rem;
533 padding: 0 1rem;
534 font-size: 0.92rem;
535 }
536 .btn-icon {
537 width: 1.9rem;
538 height: 1.9rem;
539 padding: 0;
540 }
541 .btn-default, .btn-primary {
542 background-color: hsl(var(--primary));
543 color: hsl(var(--primary-foreground));
544 }
545 .btn-default:hover, .btn-primary:hover {
546 filter: brightness(0.92);
547 opacity: 1;
548 }
549 .btn-secondary {
550 background-color: hsl(var(--secondary));
551 color: hsl(var(--secondary-foreground));
552 border-color: hsl(var(--border));
553 }
554 .btn-secondary:hover {
555 background-color: hsl(var(--accent));
556 }
557 .btn-outline {
558 background-color: hsl(var(--card));
559 color: hsl(var(--foreground));
560 border-color: hsl(var(--border));
561 }
562 .btn-outline:hover {
563 background-color: hsl(var(--accent));
564 color: hsl(var(--accent-foreground));
565 }
566 .btn-ghost {
567 background-color: hsl(var(--background));
568 color: hsl(var(--muted-foreground));
569 }
570 .btn-ghost:hover {
571 background-color: hsl(var(--accent));
572 color: hsl(var(--foreground));
573 }
574 .btn-destructive {
575 background-color: hsl(var(--destructive));
576 color: hsl(var(--destructive-foreground));
577 }
578 .btn-destructive:hover {
579 opacity: 0.9;
580 }
581
582 /* Inputs, Selects, Textareas */
583 .input, .select, .textarea {
584 display: block;
585 width: 100%;
586 border-radius: var(--radius);
587 border: 1px solid hsl(var(--input));
588 background-color: hsl(var(--background));
589 color: hsl(var(--foreground));
590 font-size: 0.85rem;
591 padding: 0.35rem 0.6rem;
592 transition: border-color 100ms ease;
593 }
594 .input, .select {
595 height: 2.05rem;
596 }
597 .textarea {
598 min-height: 4rem;
599 resize: vertical;
600 }
601 .input:focus, .select:focus, .textarea:focus {
602 outline: none;
603 border-color: hsl(var(--ring));
604 }
605 .input::placeholder, .textarea::placeholder {
606 color: hsl(var(--muted-foreground));
607 }
608 .label {
609 display: block;
610 font-size: 0.8rem;
611 font-weight: 500;
612 margin-bottom: 0.3rem;
613 color: hsl(var(--foreground));
614 }
615 .field-hint {
616 font-size: 0.74rem;
617 color: hsl(var(--muted-foreground));
618 margin-top: 0.25rem;
619 }
620
621 /* Switch */
622 .switch {
623 position: relative;
624 display: inline-flex;
625 width: 2.1rem;
626 height: 1.2rem;
627 flex-shrink: 0;
628 cursor: pointer;
629 align-items: center;
630 border-radius: 9999px;
631 border: 1px solid hsl(var(--border));
632 background-color: hsl(var(--muted));
633 }
634 .switch input {
635 opacity: 0;
636 width: 0;
637 height: 0;
638 position: absolute;
639 }
640 .switch-thumb {
641 pointer-events: none;
642 display: block;
643 width: 0.85rem;
644 height: 0.85rem;
645 border-radius: 9999px;
646 background-color: hsl(var(--foreground));
647 transform: translateX(0.15rem);
648 transition: transform 100ms ease;
649 }
650 .switch input:checked ~ .switch-thumb {
651 transform: translateX(0.95rem);
652 }
653 /* Toggle applied straight to the <input> (repo settings, release form) */
654 input.switch {
655 appearance: none;
656 -webkit-appearance: none;
657 margin: 0;
658 padding: 0;
659 transition: background-color 0.15s ease, border-color 0.15s ease;
660 }
661 input.switch::after {
662 content: "";
663 position: absolute;
664 top: 50%;
665 left: 0.16rem;
666 width: 0.85rem;
667 height: 0.85rem;
668 border-radius: 9999px;
669 background-color: hsl(var(--muted-foreground));
670 transform: translateY(-50%);
671 transition: left 0.15s ease, background-color 0.15s ease;
672 }
673 input.switch:checked {
674 background-color: hsl(var(--primary));
675 border-color: hsl(var(--primary));
676 }
677 input.switch:checked::after {
678 left: calc(100% - 0.85rem - 0.16rem);
679 background-color: hsl(var(--primary-foreground));
680 }
681 input.switch:focus-visible {
682 outline: 2px solid hsl(var(--ring) / 0.4);
683 outline-offset: 2px;
684 }
685 input.switch:disabled {
686 opacity: 0.5;
687 cursor: not-allowed;
688 }
689 input.switch:disabled::after {
690 opacity: 0.7;
691 }
692
693 /* Radio */
694 input[type="radio"] {
695 appearance: none;
696 -webkit-appearance: none;
697 position: relative;
698 display: inline-block;
699 width: 0.95rem;
700 height: 0.95rem;
701 margin: 0;
702 flex-shrink: 0;
703 cursor: pointer;
704 border: 1px solid hsl(var(--input));
705 border-radius: 9999px;
706 background-color: hsl(var(--background));
707 vertical-align: middle;
708 transition: border-color 0.15s ease, background-color 0.15s ease;
709 }
710 input[type="radio"]::after {
711 content: "";
712 position: absolute;
713 inset: 0;
714 margin: auto;
715 width: 0.42rem;
716 height: 0.42rem;
717 border-radius: 9999px;
718 background-color: hsl(var(--background));
719 transform: scale(0);
720 transition: transform 0.12s ease;
721 }
722 input[type="radio"]:checked {
723 border-color: hsl(var(--foreground));
724 background-color: hsl(var(--foreground));
725 }
726 input[type="radio"]:checked::after {
727 transform: scale(1);
728 }
729 input[type="radio"]:focus-visible {
730 outline: 2px solid hsl(var(--ring) / 0.4);
731 outline-offset: 2px;
732 }
733
734 /* Cards */
735 .card {
736 border-radius: var(--radius);
737 border: 1px solid hsl(var(--border));
738 background-color: hsl(var(--card));
739 color: hsl(var(--card-foreground));
740 }
741 .card-header {
742 padding: 0.7rem 0.9rem;
743 border-bottom: 1px solid hsl(var(--border));
744 display: flex;
745 align-items: center;
746 justify-content: space-between;
747 gap: 0.75rem;
748 }
749 .card-body {
750 padding: 0.9rem;
751 }
752 .card-footer {
753 padding: 0.65rem 0.9rem;
754 border-top: 1px solid hsl(var(--border));
755 background-color: hsl(var(--muted));
756 }
757
758 /* Badges */
759 .badge {
760 display: inline-flex;
761 align-items: center;
762 gap: 0.25rem;
763 border-radius: 9999px;
764 border: 1px solid hsl(var(--border));
765 padding: 0.08rem 0.45rem;
766 font-size: 0.72rem;
767 font-weight: 500;
768 line-height: 1.3;
769 color: hsl(var(--foreground));
770 background-color: hsl(var(--secondary));
771 }
772 .badge-outline {
773 background-color: hsl(var(--background));
774 color: hsl(var(--muted-foreground));
775 }
776 .badge-primary {
777 background-color: hsl(var(--primary));
778 color: hsl(var(--primary-foreground));
779 border-color: transparent;
780 }
781 .badge-destructive {
782 background-color: hsl(var(--destructive-surface));
783 color: hsl(var(--destructive));
784 border-color: hsl(var(--destructive) / 0.3);
785 }
786
787 /* Kbd */
788 kbd, .kbd {
789 display: inline-flex;
790 align-items: center;
791 justify-content: center;
792 min-width: 1.25rem;
793 height: 1.15rem;
794 padding: 0 0.28rem;
795 font-size: 0.68rem;
796 font-weight: 500;
797 line-height: 1;
798 color: hsl(var(--muted-foreground));
799 background-color: hsl(var(--muted));
800 border: 1px solid hsl(var(--border));
801 border-radius: 0.25rem;
802 }
803
804 /* Avatar */
805 .avatar {
806 display: inline-flex;
807 align-items: center;
808 justify-content: center;
809 width: 1.45rem;
810 height: 1.45rem;
811 border-radius: 9999px;
812 background-color: hsl(var(--secondary));
813 border: 1px solid hsl(var(--border));
814 font-size: 0.7rem;
815 font-weight: 600;
816 color: hsl(var(--foreground));
817 text-transform: uppercase;
818 flex-shrink: 0;
819 overflow: hidden;
820 }
821 .avatar-img {
822 width: 100%;
823 height: 100%;
824 object-fit: cover;
825 display: block;
826 }
827 .avatar-lg {
828 width: 2.3rem;
829 height: 2.3rem;
830 font-size: 0.9rem;
831 }
832 .avatar-xl {
833 width: 4.25rem;
834 height: 4.25rem;
835 font-size: 1.5rem;
836 }
837 .avatar-xxl {
838 width: 8.5rem;
839 height: 8.5rem;
840 font-size: 2.75rem;
841 box-shadow: 0 0 0 3px hsl(var(--background)), 0 0 0 4px hsl(var(--border));
842 }
843 .profile-chip {
844 display: inline-flex;
845 align-items: center;
846 gap: 0.35rem;
847 padding: 0.28rem 0.65rem;
848 border: 1px solid hsl(var(--border) / 0.9);
849 border-radius: 9999px;
850 background: hsl(var(--card));
851 font-size: 0.75rem;
852 color: hsl(var(--muted-foreground));
853 text-decoration: none;
854 }
855 .profile-chip a {
856 color: inherit;
857 text-decoration: none;
858 }
859 .profile-chip a:hover {
860 color: hsl(var(--foreground));
861 }
862 .repo-card {
863 transition: border-color 0.15s ease;
864 }
865 .repo-card:hover {
866 border-color: hsl(var(--foreground) / 0.3);
867 }
868 @media (max-width: 640px) {
869 .avatar-xxl {
870 width: 6rem;
871 height: 6rem;
872 font-size: 2rem;
873 }
874 }
875
876
877 /* Separator */
878 .separator {
879 height: 1px;
880 width: 100%;
881 background-color: hsl(var(--border));
882 margin: 0.85rem 0;
883 border: 0;
884 }
885
886 /* Tabs */
887 .tabs-nav {
888 display: flex;
889 align-items: center;
890 gap: 0.15rem;
891 padding: 0.2rem;
892 border: 1px solid hsl(var(--border));
893 border-radius: 999px;
894 background: hsl(var(--muted));
895 margin-bottom: 1rem;
896 overflow-x: auto;
897 }
898 .tab-link {
899 display: inline-flex;
900 align-items: center;
901 gap: 0.35rem;
902 padding: 0.38rem 0.8rem;
903 font-size: 0.82rem;
904 font-weight: 500;
905 color: hsl(var(--muted-foreground));
906 border-radius: 999px;
907 white-space: nowrap;
908 transition: color 100ms ease, background-color 100ms ease;
909 }
910 .tab-link:hover {
911 color: hsl(var(--foreground));
912 }
913 .tab-link.active {
914 color: hsl(var(--foreground));
915 background: hsl(var(--card));
916 box-shadow: 0 1px 2px hsl(0 0% 0% / 0.08);
917 }
918
919 /* Dense File List & Tables */
920 .dense-list {
921 width: 100%;
922 }
923 .dense-row {
924 display: flex;
925 align-items: center;
926 justify-content: space-between;
927 gap: 0.75rem;
928 min-height: 2.05rem;
929 padding: 0.25rem 0.75rem;
930 border-bottom: 1px solid hsl(var(--border));
931 font-size: 0.85rem;
932 transition: background-color 80ms ease;
933 }
934 .dense-row:last-child {
935 border-bottom: none;
936 }
937 .dense-row:hover {
938 background-color: hsl(var(--accent));
939 }
940
941 .table-wrap {
942 width: 100%;
943 overflow-x: auto;
944 border: 1px solid hsl(var(--border));
945 border-radius: var(--radius);
946 background-color: hsl(var(--card));
947 }
948 .table {
949 width: 100%;
950 border-collapse: collapse;
951 font-size: 0.85rem;
952 }
953 .table th {
954 text-align: left;
955 font-weight: 500;
956 color: hsl(var(--muted-foreground));
957 padding: 0.5rem 0.75rem;
958 border-bottom: 1px solid hsl(var(--border));
959 background-color: hsl(var(--muted));
960 font-size: 0.75rem;
961 }
962 .table td {
963 padding: 0.5rem 0.75rem;
964 border-bottom: 1px solid hsl(var(--border));
965 vertical-align: middle;
966 }
967 .table tr:last-child td {
968 border-bottom: none;
969 }
970
971 /* Breadcrumb */
972 .breadcrumb {
973 display: flex;
974 align-items: center;
975 flex-wrap: wrap;
976 gap: 0.25rem;
977 font-size: 0.85rem;
978 }
979 .breadcrumb-sep {
980 color: hsl(var(--muted-foreground));
981 }
982
983 /* Dropdown Menu */
984 @keyframes dropdownIn {
985 from {
986 opacity: 0;
987 transform: translateY(-4px) scale(0.98);
988 }
989 to {
990 opacity: 1;
991 transform: translateY(0) scale(1);
992 }
993 }
994 .dropdown {
995 position: relative;
996 display: inline-block;
997 }
998 .dropdown-menu {
999 position: absolute;
1000 left: 0;
1001 top: calc(100% + 0.3rem);
1002 min-width: 11rem;
1003 background-color: hsl(var(--popover));
1004 color: hsl(var(--popover-foreground));
1005 border: 1px solid hsl(var(--border));
1006 border-radius: var(--radius);
1007 padding: 0.25rem;
1008 box-shadow: 0 8px 24px -4px rgba(0, 0, 0, 0.22);
1009 z-index: 60;
1010 display: none;
1011 transform-origin: top left;
1012 }
1013 .dropdown-menu.open {
1014 display: block;
1015 animation: dropdownIn 140ms cubic-bezier(0.16, 1, 0.3, 1);
1016 }
1017 .dropdown-item {
1018 display: flex;
1019 width: 100%;
1020 align-items: center;
1021 justify-content: space-between;
1022 gap: 0.5rem;
1023 padding: 0.35rem 0.55rem;
1024 font-size: 0.8rem;
1025 border-radius: calc(var(--radius) - 2px);
1026 color: hsl(var(--popover-foreground));
1027 background: transparent;
1028 border: 0;
1029 cursor: pointer;
1030 text-align: left;
1031 transition: background-color 120ms ease, color 120ms ease;
1032 }
1033 .dropdown-item:hover, .dropdown-item.active {
1034 background-color: hsl(var(--accent));
1035 color: hsl(var(--accent-foreground));
1036 }
1037
1038 /* Modal / Dialog & Command Palette */
1039 @keyframes backdropIn {
1040 from { opacity: 0; }
1041 to { opacity: 1; }
1042 }
1043 @keyframes dialogIn {
1044 from {
1045 opacity: 0;
1046 transform: translateY(-6px) scale(0.97);
1047 }
1048 to {
1049 opacity: 1;
1050 transform: translateY(0) scale(1);
1051 }
1052 }
1053 .backdrop {
1054 position: fixed;
1055 inset: 0;
1056 background-color: rgba(0, 0, 0, 0.55);
1057 backdrop-filter: blur(2px);
1058 z-index: 80;
1059 display: none;
1060 align-items: flex-start;
1061 justify-content: center;
1062 padding: 10vh 1rem 2rem;
1063 }
1064 .backdrop.open {
1065 display: flex;
1066 animation: backdropIn 140ms ease;
1067 }
1068 .dialog-box {
1069 width: 100%;
1070 max-width: 28rem;
1071 background-color: hsl(var(--popover));
1072 color: hsl(var(--popover-foreground));
1073 border: 1px solid hsl(var(--border));
1074 border-radius: var(--radius);
1075 box-shadow: 0 16px 40px -8px rgba(0, 0, 0, 0.35);
1076 overflow: hidden;
1077 animation: dialogIn 170ms cubic-bezier(0.16, 1, 0.3, 1);
1078 }
1079 .palette-box {
1080 width: 100%;
1081 max-width: 34rem;
1082 background-color: hsl(var(--popover));
1083 color: hsl(var(--popover-foreground));
1084 border: 1px solid hsl(var(--border));
1085 border-radius: var(--radius);
1086 box-shadow: 0 16px 48px -8px rgba(0, 0, 0, 0.4);
1087 overflow: hidden;
1088 animation: dialogIn 170ms cubic-bezier(0.16, 1, 0.3, 1);
1089 }
1090 .palette-input-wrap {
1091 display: flex;
1092 align-items: center;
1093 gap: 0.6rem;
1094 padding: 0.6rem 0.8rem;
1095 border-bottom: 1px solid hsl(var(--border));
1096 }
1097 .palette-input {
1098 width: 100%;
1099 border: 0;
1100 background: transparent;
1101 color: hsl(var(--foreground));
1102 font-size: 0.9rem;
1103 outline: none;
1104 }
1105 .palette-list {
1106 max-height: 20rem;
1107 overflow-y: auto;
1108 padding: 0.3rem;
1109 }
1110 .palette-group-title {
1111 padding: 0.3rem 0.5rem 0.15rem;
1112 font-size: 0.68rem;
1113 font-weight: 600;
1114 text-transform: uppercase;
1115 letter-spacing: 0.04em;
1116 color: hsl(var(--muted-foreground));
1117 }
1118 .palette-item {
1119 display: flex;
1120 width: 100%;
1121 align-items: center;
1122 justify-content: space-between;
1123 gap: 0.5rem;
1124 padding: 0.4rem 0.55rem;
1125 border-radius: calc(var(--radius) - 2px);
1126 font-size: 0.85rem;
1127 color: hsl(var(--foreground));
1128 cursor: pointer;
1129 border: 0;
1130 background: transparent;
1131 text-align: left;
1132 transition: background-color 100ms ease, color 100ms ease;
1133 }
1134 .palette-item:hover, .palette-item.selected {
1135 background-color: hsl(var(--accent));
1136 color: hsl(var(--accent-foreground));
1137 }
1138
1139 /* Custom context menu */
1140 @keyframes contextMenuIn {
1141 from {
1142 opacity: 0;
1143 transform: translateY(-3px) scale(0.98);
1144 }
1145 to {
1146 opacity: 1;
1147 transform: translateY(0) scale(1);
1148 }
1149 }
1150 .context-menu {
1151 position: fixed;
1152 z-index: 120;
1153 width: max-content;
1154 min-width: 15rem;
1155 max-width: min(20rem, calc(100vw - 1rem));
1156 max-height: min(72vh, 36rem);
1157 overflow-y: auto;
1158 overscroll-behavior: contain;
1159 padding: 0.28rem;
1160 background-color: hsl(var(--popover));
1161 color: hsl(var(--popover-foreground));
1162 border: 1px solid hsl(var(--border));
1163 border-radius: var(--radius);
1164 box-shadow: 0 18px 44px -12px rgba(0, 0, 0, 0.42), 0 2px 8px -2px rgba(0, 0, 0, 0.18);
1165 opacity: 0;
1166 visibility: hidden;
1167 pointer-events: none;
1168 transform: translateY(-3px) scale(0.98);
1169 transform-origin: top left;
1170 transition: opacity 110ms ease, transform 130ms cubic-bezier(0.16, 1, 0.3, 1), visibility 110ms ease;
1171 }
1172 .context-menu.open {
1173 opacity: 1;
1174 visibility: visible;
1175 pointer-events: auto;
1176 transform: translateY(0) scale(1);
1177 animation: contextMenuIn 130ms cubic-bezier(0.16, 1, 0.3, 1);
1178 }
1179 .context-menu-section[hidden],
1180 .context-menu-item[hidden] {
1181 display: none;
1182 }
1183 .context-menu-section + .context-menu-section {
1184 margin-top: 0.24rem;
1185 padding-top: 0.24rem;
1186 border-top: 1px solid hsl(var(--border));
1187 }
1188 .context-menu-label {
1189 display: flex;
1190 align-items: center;
1191 gap: 0.5rem;
1192 padding: 0.22rem 0.5rem 0.14rem;
1193 font-size: 0.64rem;
1194 font-weight: 600;
1195 letter-spacing: 0.055em;
1196 text-transform: uppercase;
1197 color: hsl(var(--muted-foreground));
1198 }
1199 .context-menu-item {
1200 display: flex;
1201 width: 100%;
1202 min-height: 1.95rem;
1203 align-items: center;
1204 gap: 0.55rem;
1205 padding: 0.33rem 0.5rem;
1206 border: 0;
1207 border-radius: calc(var(--radius) - 2px);
1208 background: transparent;
1209 color: hsl(var(--popover-foreground));
1210 font: inherit;
1211 font-size: 0.8rem;
1212 line-height: 1.25;
1213 text-align: left;
1214 text-decoration: none;
1215 cursor: pointer;
1216 user-select: none;
1217 transition: background-color 90ms ease, color 90ms ease;
1218 }
1219 .context-menu-item .icon {
1220 flex: none;
1221 color: hsl(var(--muted-foreground));
1222 transition: color 90ms ease;
1223 }
1224 .context-menu-item > span:not(.context-menu-kbd) {
1225 min-width: 0;
1226 overflow: hidden;
1227 text-overflow: ellipsis;
1228 white-space: nowrap;
1229 }
1230 .context-menu-item:hover,
1231 .context-menu-item:focus-visible,
1232 .context-menu-item.is-active {
1233 background-color: hsl(var(--accent));
1234 color: hsl(var(--accent-foreground));
1235 outline: none;
1236 }
1237 .context-menu-item:hover .icon,
1238 .context-menu-item:focus-visible .icon,
1239 .context-menu-item.is-active .icon {
1240 color: currentColor;
1241 }
1242 .context-menu-kbd {
1243 margin-left: auto;
1244 flex: none;
1245 min-width: auto;
1246 height: 1.05rem;
1247 padding: 0 0.24rem;
1248 font-size: 0.6rem;
1249 color: hsl(var(--muted-foreground));
1250 background-color: hsl(var(--muted));
1251 border: 1px solid hsl(var(--border));
1252 border-radius: 0.22rem;
1253 }
1254
1255 /* Shortcuts dialog */
1256 .shortcuts-list {
1257 display: flex;
1258 max-height: min(70vh, 44rem);
1259 flex-direction: column;
1260 padding-top: 0.45rem;
1261 padding-bottom: 0.55rem;
1262 overflow-y: auto;
1263 overscroll-behavior: contain;
1264 }
1265 .shortcuts-group-label {
1266 padding: 0.65rem 0 0.2rem;
1267 font-size: 0.64rem;
1268 font-weight: 600;
1269 letter-spacing: 0.055em;
1270 text-transform: uppercase;
1271 color: hsl(var(--muted-foreground));
1272 }
1273 .shortcuts-group-label:first-child {
1274 padding-top: 0.15rem;
1275 }
1276 .shortcut-row {
1277 display: flex;
1278 min-height: 2rem;
1279 align-items: center;
1280 justify-content: space-between;
1281 gap: 1rem;
1282 padding: 0.32rem 0;
1283 border-bottom: 1px solid hsl(var(--border));
1284 font-size: 0.82rem;
1285 }
1286 .shortcut-keys {
1287 display: flex;
1288 flex: none;
1289 align-items: center;
1290 gap: 0.2rem;
1291 }
1292
1293 /* Toast */
1294 @keyframes toastIn {
1295 from {
1296 opacity: 0;
1297 transform: translateY(8px) scale(0.97);
1298 }
1299 to {
1300 opacity: 1;
1301 transform: translateY(0) scale(1);
1302 }
1303 }
1304 .toast-container {
1305 position: fixed;
1306 bottom: 1rem;
1307 right: 1rem;
1308 z-index: 90;
1309 display: flex;
1310 flex-direction: column;
1311 gap: 0.4rem;
1312 max-width: 20rem;
1313 }
1314 .toast {
1315 display: flex;
1316 align-items: center;
1317 justify-content: space-between;
1318 gap: 0.65rem;
1319 padding: 0.5rem 0.75rem;
1320 border-radius: var(--radius);
1321 border: 1px solid hsl(var(--border));
1322 background-color: hsl(var(--popover));
1323 color: hsl(var(--popover-foreground));
1324 box-shadow: 0 8px 24px -4px rgba(0, 0, 0, 0.25);
1325 font-size: 0.8rem;
1326 animation: toastIn 180ms cubic-bezier(0.16, 1, 0.3, 1);
1327 }
1328
1329 /* Skeleton */
1330 @keyframes pulse {
1331 0%, 100% { opacity: 1; }
1332 50% { opacity: 0.45; }
1333 }
1334 .skeleton {
1335 background-color: hsl(var(--muted));
1336 border-radius: calc(var(--radius) - 2px);
1337 animation: pulse 1.6s ease-in-out infinite;
1338 }
1339
1340 /* Empty State */
1341 .empty-state {
1342 text-align: center;
1343 padding: 2rem 1rem;
1344 border: 1px dashed hsl(var(--border));
1345 border-radius: var(--radius);
1346 background-color: hsl(var(--card));
1347 color: hsl(var(--muted-foreground));
1348 }
1349
1350 /* Code Viewer & Chroma */
1351 .code-table {
1352 width: 100%;
1353 border-collapse: collapse;
1354 font-family: 'JetBrains Mono', monospace;
1355 font-size: 0.8rem;
1356 line-height: 1.5;
1357 }
1358 .code-ln {
1359 width: 1%;
1360 min-width: 2.75rem;
1361 padding: 0 0.65rem;
1362 text-align: right;
1363 color: hsl(var(--muted-foreground) / 0.6);
1364 user-select: none;
1365 vertical-align: top;
1366 border-right: 1px solid hsl(var(--border));
1367 }
1368 .code-line {
1369 padding: 0 0.75rem;
1370 white-space: pre;
1371 overflow-x: auto;
1372 }
1373 .chroma .k, .chroma .kc, .chroma .kd, .chroma .kn, .chroma .kp, .chroma .kr { color: hsl(var(--syntax-kw)); font-weight: 500; }
1374 .chroma .kt { color: hsl(var(--syntax-type)); }
1375 .chroma .s, .chroma .sa, .chroma .sb, .chroma .sc, .chroma .dl, .chroma .sd, .chroma .s2, .chroma .se, .chroma .sh, .chroma .si, .chroma .sx, .chroma .sr, .chroma .s1, .chroma .ss { color: hsl(var(--syntax-str)); }
1376 .chroma .c, .chroma .ch, .chroma .cm, .chroma .c1, .chroma .cs, .chroma .cp, .chroma .cpf { color: hsl(var(--syntax-cmt)); font-style: italic; }
1377 .chroma .nf, .chroma .fm, .chroma .nx { color: hsl(var(--syntax-fn)); }
1378 .chroma .m, .chroma .mb, .chroma .mf, .chroma .mh, .chroma .mi, .chroma .il, .chroma .mo { color: hsl(var(--syntax-num)); }
1379 .chroma .o, .chroma .ow { color: hsl(var(--syntax-op)); }
1380
1381 /* Diff Viewer */
1382 .diff-table {
1383 width: 100%;
1384 border-collapse: collapse;
1385 font-family: 'JetBrains Mono', monospace;
1386 font-size: 0.78rem;
1387 line-height: 1.5;
1388 }
1389 .diff-row-add {
1390 background-color: hsl(var(--diff-add-bg));
1391 color: hsl(var(--diff-add-fg));
1392 }
1393 .diff-row-del {
1394 background-color: hsl(var(--diff-del-bg));
1395 color: hsl(var(--diff-del-fg));
1396 }
1397 .diff-row-hunk {
1398 background-color: hsl(var(--muted));
1399 color: hsl(var(--muted-foreground));
1400 }
1401 .diff-num {
1402 width: 2.75rem;
1403 padding: 0 0.45rem;
1404 text-align: right;
1405 user-select: none;
1406 opacity: 0.65;
1407 border-right: 1px solid hsl(var(--border));
1408 }
1409 .diff-code {
1410 padding: 0 0.65rem;
1411 white-space: pre-wrap;
1412 word-break: break-all;
1413 }
1414
1415 /* Markdown Body */
1416 .markdown-body {
1417 font-size: 0.9rem;
1418 line-height: 1.6;
1419 color: hsl(var(--foreground));
1420 }
1421 .markdown-body h1, .markdown-body h2, .markdown-body h3, .markdown-body h4 {
1422 margin-top: 1.25em;
1423 margin-bottom: 0.45em;
1424 font-weight: 600;
1425 line-height: 1.25;
1426 }
1427 .markdown-body h1 { font-size: 1.35rem; padding-bottom: 0.25rem; border-bottom: 1px solid hsl(var(--border)); }
1428 .markdown-body h2 { font-size: 1.15rem; padding-bottom: 0.2rem; border-bottom: 1px solid hsl(var(--border)); }
1429 .markdown-body h3 { font-size: 1rem; }
1430 .markdown-body h1:first-child, .markdown-body h2:first-child { margin-top: 0; }
1431 .markdown-body p, .markdown-body ul, .markdown-body ol, .markdown-body pre, .markdown-body blockquote {
1432 margin-top: 0;
1433 margin-bottom: 0.8rem;
1434 }
1435 .markdown-body code {
1436 background-color: hsl(var(--muted));
1437 padding: 0.12rem 0.3rem;
1438 border-radius: 0.25rem;
1439 font-size: 0.84em;
1440 }
1441 .markdown-body pre {
1442 background-color: hsl(var(--muted));
1443 border: 1px solid hsl(var(--border));
1444 border-radius: var(--radius);
1445 padding: 0.75rem 0.9rem;
1446 overflow-x: auto;
1447 }
1448 .markdown-body pre code {
1449 background: transparent;
1450 padding: 0;
1451 }
1452 .markdown-body a {
1453 text-decoration: underline;
1454 text-underline-offset: 3px;
1455 }
1456
1457 /* Utility Helpers */
1458 .flex { display: flex; }
1459 .block { display: block; }
1460 .inline-flex { display: inline-flex; }
1461 .grid { display: grid; }
1462 .hidden { display: none; }
1463 .items-center { align-items: center; }
1464 .items-start { align-items: flex-start; }
1465 .items-baseline { align-items: baseline; }
1466 .justify-between { justify-content: space-between; }
1467 .justify-center { justify-content: center; }
1468 .justify-end { justify-content: flex-end; }
1469 .flex-col { flex-direction: column; }
1470 .flex-wrap { flex-wrap: wrap; }
1471 .flex-1 { flex: 1 1 0%; }
1472 .flex-shrink-0 { flex-shrink: 0; }
1473 .min-w-0 { min-width: 0; }
1474 .gap-0\.5 { gap: 0.125rem; }
1475 .gap-1 { gap: 0.25rem; }
1476 .gap-1\.5 { gap: 0.375rem; }
1477 .gap-2 { gap: 0.5rem; }
1478 .gap-2\.5 { gap: 0.625rem; }
1479 .gap-3 { gap: 0.75rem; }
1480 .gap-4 { gap: 1rem; }
1481 .gap-6 { gap: 1.5rem; }
1482 .w-full { width: 100%; }
1483 .text-xs { font-size: 0.75rem; }
1484 .text-sm { font-size: 0.85rem; }
1485 .text-base { font-size: 0.96rem; }
1486 .text-lg { font-size: 1.1rem; }
1487 .text-xl { font-size: 1.25rem; }
1488 .text-2xl { font-size: 1.5rem; }
1489 .font-medium { font-weight: 500; }
1490 .font-semibold { font-weight: 600; }
1491 .font-bold { font-weight: 700; }
1492 .uppercase { text-transform: uppercase; }
1493 .tracking-tight { letter-spacing: -0.015em; }
1494 .text-muted { color: hsl(var(--muted-foreground)); }
1495 .text-destructive { color: hsl(var(--destructive)); }
1496 .text-foreground { color: hsl(var(--foreground)); }
1497 .text-center { text-align: center; }
1498 .truncate { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
1499 .hover\:underline:hover { text-decoration: underline; }
1500 .select-all { user-select: all; }
1501 .cursor-pointer { cursor: pointer; }
1502 .mt-0\.5 { margin-top: 0.125rem; }
1503 .mt-1 { margin-top: 0.25rem; }
1504 .mt-2 { margin-top: 0.5rem; }
1505 .mt-3 { margin-top: 0.75rem; }
1506 .mt-4 { margin-top: 1rem; }
1507 .mt-6 { margin-top: 1.5rem; }
1508 .mr-2 { margin-right: 0.5rem; }
1509 .mb-1 { margin-bottom: 0.25rem; }
1510 .mb-1\.5 { margin-bottom: 0.375rem; }
1511 .mb-2 { margin-bottom: 0.5rem; }
1512 .mb-3 { margin-bottom: 0.75rem; }
1513 .mb-4 { margin-bottom: 1rem; }
1514 .mb-6 { margin-bottom: 1.5rem; }
1515 .p-2 { padding: 0.5rem; }
1516 .p-3 { padding: 0.75rem; }
1517 .p-4 { padding: 1rem; }
1518 .px-3 { padding-left: 0.75rem; padding-right: 0.75rem; }
1519 .py-2 { padding-top: 0.5rem; padding-bottom: 0.5rem; }
1520 .pt-2 { padding-top: 0.5rem; }
1521 .pt-3 { padding-top: 0.75rem; }
1522 .pb-3 { padding-bottom: 0.75rem; }
1523
1524 .grid-2 { display: grid; grid-template-columns: repeat(1, minmax(0, 1fr)); gap: 0.85rem; }
1525 .grid-3 { display: grid; grid-template-columns: repeat(1, minmax(0, 1fr)); gap: 0.85rem; }
1526 .grid-4 { display: grid; grid-template-columns: repeat(1, minmax(0, 1fr)); gap: 0.85rem; }
1527
1528 @media (min-width: 768px) {
1529 .grid-2 { grid-template-columns: repeat(2, minmax(0, 1fr)); }
1530 .grid-3 { grid-template-columns: repeat(3, minmax(0, 1fr)); }
1531 .grid-4 { grid-template-columns: repeat(2, minmax(0, 1fr)); }
1532 .md-flex { display: flex !important; }
1533 .md-hidden { display: none !important; }
1534 }
1535
1536 /* Mobile Drawer */
1537 .mobile-drawer {
1538 position: fixed;
1539 inset: 0;
1540 z-index: 75;
1541 background-color: rgba(0, 0, 0, 0.5);
1542 display: none;
1543 }
1544 .mobile-drawer.open {
1545 display: block;
1546 }
1547 .mobile-drawer-panel {
1548 width: 224px;
1549 max-width: 85vw;
1550 height: 100%;
1551 background-color: hsl(var(--card));
1552 border-right: 1px solid hsl(var(--border));
1553 padding: 0.75rem 0.65rem;
1554 display: flex;
1555 flex-direction: column;
1556 justify-content: space-between;
1557 }
1558
1559 @media (min-width: 1024px) {
1560 .grid-4 { grid-template-columns: repeat(4, minmax(0, 1fr)); }
1561 }
1562
1563 /* ── Polar repository shell ─────────────────────────────────────────── */
1564 .repo-banner {
1565 position: relative;
1566 display: flex;
1567 align-items: flex-start;
1568 justify-content: space-between;
1569 gap: 1rem;
1570 flex-wrap: wrap;
1571 padding: 0.65rem 1rem;
1572 background: hsl(var(--card));
1573 border: 1px solid hsl(var(--border));
1574 border-radius: calc(var(--radius) * 1.6);
1575 overflow: hidden;
1576 }
1577
1578 .repo-banner-main {
1579 display: flex;
1580 align-items: flex-start;
1581 gap: 0.7rem;
1582 min-width: 0;
1583 flex: 1 1 20rem;
1584 }
1585 .repo-banner-actions {
1586 display: flex;
1587 align-items: center;
1588 gap: 0.4rem;
1589 flex-wrap: wrap;
1590 }
1591 .repo-head-block {
1592 min-width: 0;
1593 flex: 1 1 auto;
1594 }
1595 .repo-head-row {
1596 display: flex;
1597 align-items: center;
1598 gap: 0.55rem;
1599 flex-wrap: wrap;
1600 min-width: 0;
1601 }
1602 .repo-desc {
1603 flex: 1 1 6rem;
1604 min-width: 0;
1605 max-width: 36rem;
1606 overflow: hidden;
1607 text-overflow: ellipsis;
1608 white-space: nowrap;
1609 font-size: 0.8rem;
1610 line-height: 1.35;
1611 color: hsl(var(--muted-foreground));
1612 transition: color 0.15s ease;
1613 }
1614 .repo-desc.truncated {
1615 cursor: pointer;
1616 }
1617 .repo-desc.truncated:hover {
1618 color: hsl(var(--foreground));
1619 }
1620 .repo-banner.desc-open .repo-desc {
1621 flex-basis: 100%;
1622 max-width: 100%;
1623 white-space: normal;
1624 overflow: visible;
1625 overflow-wrap: anywhere;
1626 }
1627 .repo-avatar-link {
1628 display: flex;
1629 align-items: center;
1630 flex-shrink: 0;
1631 }
1632 .repo-avatar {
1633 width: 1.65rem;
1634 height: 1.65rem;
1635 font-size: 0.68rem;
1636 transition: width 0.2s ease, height 0.2s ease, font-size 0.2s ease;
1637 }
1638
1639
1640
1641 .clone-box {
1642 display: flex;
1643 align-items: center;
1644 gap: 0.35rem;
1645 border: 1px solid hsl(var(--border));
1646 border-radius: var(--radius);
1647 background: hsl(var(--muted));
1648 padding: 0.15rem 0.25rem 0.15rem 0.6rem;
1649 min-width: 0;
1650 }
1651 .clone-box code {
1652 flex: 1;
1653 min-width: 0;
1654 overflow: hidden;
1655 text-overflow: ellipsis;
1656 white-space: nowrap;
1657 font-size: 0.72rem;
1658 }
1659 .upload-drop {
1660 display: flex;
1661 flex-direction: column;
1662 align-items: center;
1663 gap: 0.35rem;
1664 text-align: center;
1665 padding: 1.6rem 1rem;
1666 border: 1.5px dashed hsl(var(--border));
1667 border-radius: calc(var(--radius) * 1.3);
1668 background: hsl(var(--muted));
1669 color: hsl(var(--muted-foreground));
1670 cursor: pointer;
1671 transition: border-color 0.15s ease, background 0.15s ease, color 0.15s ease;
1672 }
1673 .upload-drop:hover {
1674 border-color: hsl(var(--foreground) / 0.4);
1675 color: hsl(var(--foreground));
1676 }
1677 .upload-drop.drag {
1678 border-color: hsl(var(--foreground) / 0.6);
1679 background: hsl(var(--accent));
1680 color: hsl(var(--foreground));
1681 }
1682 /* Utility completion (classes used in templates but absent from the build) */
1683 .relative { position: relative; }
1684 .gap-1\.5 { gap: 0.375rem; }
1685 .gap-5 { gap: 1.25rem; }
1686 .mb-1\.5 { margin-bottom: 0.375rem; }
1687 .pt-1 { padding-top: 0.25rem; }
1688
1689 /* Profile header sits directly on the page backdrop. */
1690 .profile-hero {
1691 position: relative;
1692 padding: 0.6rem 0 0;
1693 border: 0;
1694 border-radius: 0;
1695 background: transparent;
1696 }
1697 .profile-hero-content {
1698 position: relative;
1699 }
1700 .has-page-bg .profile-hero h1,
1701 .has-page-bg .profile-hero p,
1702 .has-page-bg .profile-hero .text-muted {
1703 text-shadow: 0 1px 16px hsl(var(--background) / 0.95);
1704 }
1705
1706 /* Media settings */
1707 .background-preview {
1708 position: relative;
1709 width: 100%;
1710 aspect-ratio: 16 / 6;
1711 min-height: 7rem;
1712 overflow: hidden;
1713 border: 1px solid hsl(var(--border));
1714 border-radius: calc(var(--radius) * 1.3);
1715 background:
1716 radial-gradient(100% 130% at 50% 30%, hsl(var(--muted)) 0%, hsl(var(--card)) 72%);
1717 }
1718 .background-preview img {
1719 width: 100%;
1720 height: 100%;
1721 object-fit: cover;
1722 object-position: center;
1723 display: block;
1724 -webkit-mask-image: radial-gradient(120% 145% at 50% 25%, #000 38%, rgba(0,0,0,0.86) 58%, transparent 100%);
1725 mask-image: radial-gradient(120% 145% at 50% 25%, #000 38%, rgba(0,0,0,0.86) 58%, transparent 100%);
1726 }
1727 .background-preview::after {
1728 content: "";
1729 position: absolute;
1730 inset: 0;
1731 background: linear-gradient(to top, hsl(var(--background) / 0.75), hsl(var(--background) / 0.05));
1732 pointer-events: none;
1733 }
1734 .background-preview.is-empty {
1735 display: flex;
1736 align-items: center;
1737 justify-content: center;
1738 }
1739 .background-preview-placeholder {
1740 color: hsl(var(--muted-foreground) / 0.7);
1741 }
1742
1743 /* Registration policy selector */
1744 .registration-options {
1745 display: grid;
1746 grid-template-columns: repeat(3, minmax(0, 1fr));
1747 gap: 0.55rem;
1748 }
1749 .registration-option {
1750 display: flex;
1751 align-items: flex-start;
1752 gap: 0.6rem;
1753 padding: 0.75rem;
1754 border: 1px solid hsl(var(--border));
1755 border-radius: calc(var(--radius) * 1.2);
1756 background: hsl(var(--card));
1757 cursor: pointer;
1758 transition: border-color 0.15s ease, background-color 0.15s ease;
1759 }
1760 .registration-option:hover {
1761 border-color: hsl(var(--foreground) / 0.28);
1762 background: hsl(var(--accent));
1763 }
1764 .registration-option:has(input:checked) {
1765 border-color: hsl(var(--foreground) / 0.72);
1766 background: hsl(var(--secondary));
1767 }
1768 .registration-option input {
1769 margin-top: 0.14rem;
1770 flex-shrink: 0;
1771 }
1772 .registration-option strong,
1773 .registration-option small {
1774 display: block;
1775 }
1776 .registration-option strong {
1777 font-size: 0.8rem;
1778 line-height: 1.3;
1779 }
1780 .registration-option small {
1781 margin-top: 0.18rem;
1782 color: hsl(var(--muted-foreground));
1783 font-size: 0.7rem;
1784 line-height: 1.4;
1785 }
1786
1787 /* Admin actions */
1788 .admin-row-actions {
1789 display: flex;
1790 align-items: center;
1791 justify-content: flex-end;
1792 gap: 0.25rem;
1793 flex-wrap: wrap;
1794 }
1795 .admin-row-actions form {
1796 margin: 0;
1797 display: inline-flex;
1798 }
1799 .admin-repo-row {
1800 gap: 0.75rem;
1801 }
1802 .admin-repo-link {
1803 display: flex;
1804 align-items: center;
1805 gap: 0.6rem;
1806 min-width: 0;
1807 flex: 1;
1808 color: inherit;
1809 text-decoration: none;
1810 }
1811 .admin-repo-link:hover strong {
1812 text-decoration: underline;
1813 text-underline-offset: 2px;
1814 }
1815
1816 .segmented-btn {
1817 text-decoration: none;
1818 }
1819
1820 @media (max-width: 760px) {
1821 .registration-options {
1822 grid-template-columns: 1fr;
1823 }
1824 .profile-hero {
1825 padding: 0.35rem 0 0;
1826 }
1827 .background-preview {
1828 aspect-ratio: 16 / 7;
1829 }
1830 }