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