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