rin
Public Open-source lightweight git hosting.
app.css · 1346 lines · 31.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 .nav-section-label {
377 display: flex;
378 align-items: center;
379 justify-content: space-between;
380 padding: 0.45rem 0.55rem 0.25rem;
381 font-size: 0.7rem;
382 font-weight: 600;
383 text-transform: uppercase;
384 letter-spacing: 0.04em;
385 color: hsl(var(--muted-foreground));
386 }
387
388 /* Segmented Theme Control in Sidebar */
389 .segmented {
390 display: grid;
391 grid-template-columns: repeat(3, minmax(0, 1fr));
392 gap: 2px;
393 padding: 2px;
394 width: 100%;
395 background-color: hsl(var(--muted));
396 border: 1px solid hsl(var(--border));
397 border-radius: var(--radius);
398 }
399 .segmented-btn {
400 display: inline-flex;
401 align-items: center;
402 justify-content: center;
403 gap: 0.25rem;
404 height: 1.65rem;
405 padding: 0 0.2rem;
406 border: 0;
407 border-radius: calc(var(--radius) - 2px);
408 background: transparent;
409 color: hsl(var(--muted-foreground));
410 font-size: 0.72rem;
411 font-weight: 500;
412 cursor: pointer;
413 overflow: hidden;
414 text-overflow: ellipsis;
415 white-space: nowrap;
416 transition: background-color 150ms cubic-bezier(0.16, 1, 0.3, 1), color 150ms ease, box-shadow 150ms ease, transform 120ms ease;
417 }
418 .segmented-btn:hover {
419 color: hsl(var(--foreground));
420 }
421 .segmented-btn:active {
422 transform: scale(0.96);
423 }
424 .segmented-btn.active {
425 background-color: hsl(var(--background));
426 color: hsl(var(--foreground));
427 box-shadow: 0 1px 2px rgba(0, 0, 0, 0.08);
428 }
429
430 /* Icons */
431 .icon {
432 display: inline-block;
433 vertical-align: middle;
434 flex-shrink: 0;
435 stroke: currentColor;
436 }
437 .size-3 { width: 0.75rem; height: 0.75rem; }
438 .size-3\.5 { width: 0.875rem; height: 0.875rem; }
439 .size-4 { width: 1rem; height: 1rem; }
440 .size-5 { width: 1.25rem; height: 1.25rem; }
441 .size-6 { width: 1.5rem; height: 1.5rem; }
442
443 /* Buttons */
444 .btn {
445 display: inline-flex;
446 align-items: center;
447 justify-content: center;
448 gap: 0.4rem;
449 white-space: nowrap;
450 border-radius: var(--radius);
451 font-size: 0.85rem;
452 font-weight: 500;
453 line-height: 1;
454 height: 1.95rem;
455 padding: 0 0.7rem;
456 border: 1px solid transparent;
457 cursor: pointer;
458 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);
459 user-select: none;
460 }
461 .btn:active:not(:disabled) {
462 transform: scale(0.97);
463 }
464 .btn:disabled {
465 opacity: 0.5;
466 pointer-events: none;
467 }
468 .btn-sm {
469 height: 1.7rem;
470 padding: 0 0.5rem;
471 font-size: 0.78rem;
472 }
473 .btn-lg {
474 height: 2.3rem;
475 padding: 0 1rem;
476 font-size: 0.92rem;
477 }
478 .btn-icon {
479 width: 1.9rem;
480 height: 1.9rem;
481 padding: 0;
482 }
483 .btn-default, .btn-primary {
484 background-color: hsl(var(--primary));
485 color: hsl(var(--primary-foreground));
486 }
487 .btn-default:hover, .btn-primary:hover {
488 opacity: 0.9;
489 }
490 .btn-secondary {
491 background-color: hsl(var(--secondary));
492 color: hsl(var(--secondary-foreground));
493 border-color: hsl(var(--border));
494 }
495 .btn-secondary:hover {
496 background-color: hsl(var(--accent));
497 }
498 .btn-outline {
499 background-color: transparent;
500 color: hsl(var(--foreground));
501 border-color: hsl(var(--border));
502 }
503 .btn-outline:hover {
504 background-color: hsl(var(--accent));
505 color: hsl(var(--accent-foreground));
506 }
507 .btn-ghost {
508 background-color: transparent;
509 color: hsl(var(--muted-foreground));
510 }
511 .btn-ghost:hover {
512 background-color: hsl(var(--accent));
513 color: hsl(var(--foreground));
514 }
515 .btn-destructive {
516 background-color: hsl(var(--destructive));
517 color: hsl(var(--destructive-foreground));
518 }
519 .btn-destructive:hover {
520 opacity: 0.9;
521 }
522
523 /* Inputs, Selects, Textareas */
524 .input, .select, .textarea {
525 display: block;
526 width: 100%;
527 border-radius: var(--radius);
528 border: 1px solid hsl(var(--input));
529 background-color: hsl(var(--background));
530 color: hsl(var(--foreground));
531 font-size: 0.85rem;
532 padding: 0.35rem 0.6rem;
533 transition: border-color 100ms ease;
534 }
535 .input, .select {
536 height: 2.05rem;
537 }
538 .textarea {
539 min-height: 4rem;
540 resize: vertical;
541 }
542 .input:focus, .select:focus, .textarea:focus {
543 outline: none;
544 border-color: hsl(var(--ring));
545 }
546 .input::placeholder, .textarea::placeholder {
547 color: hsl(var(--muted-foreground));
548 }
549 .label {
550 display: block;
551 font-size: 0.8rem;
552 font-weight: 500;
553 margin-bottom: 0.3rem;
554 color: hsl(var(--foreground));
555 }
556 .field-hint {
557 font-size: 0.74rem;
558 color: hsl(var(--muted-foreground));
559 margin-top: 0.25rem;
560 }
561
562 /* Switch */
563 .switch {
564 position: relative;
565 display: inline-flex;
566 width: 2.1rem;
567 height: 1.2rem;
568 flex-shrink: 0;
569 cursor: pointer;
570 align-items: center;
571 border-radius: 9999px;
572 border: 1px solid hsl(var(--border));
573 background-color: hsl(var(--muted));
574 }
575 .switch input {
576 opacity: 0;
577 width: 0;
578 height: 0;
579 position: absolute;
580 }
581 .switch-thumb {
582 pointer-events: none;
583 display: block;
584 width: 0.85rem;
585 height: 0.85rem;
586 border-radius: 9999px;
587 background-color: hsl(var(--foreground));
588 transform: translateX(0.15rem);
589 transition: transform 100ms ease;
590 }
591 .switch input:checked ~ .switch-thumb {
592 transform: translateX(0.95rem);
593 }
594
595 /* Cards */
596 .card {
597 border-radius: var(--radius);
598 border: 1px solid hsl(var(--border));
599 background-color: hsl(var(--card));
600 color: hsl(var(--card-foreground));
601 }
602 .card-header {
603 padding: 0.7rem 0.9rem;
604 border-bottom: 1px solid hsl(var(--border));
605 display: flex;
606 align-items: center;
607 justify-content: space-between;
608 gap: 0.75rem;
609 }
610 .card-body {
611 padding: 0.9rem;
612 }
613 .card-footer {
614 padding: 0.65rem 0.9rem;
615 border-top: 1px solid hsl(var(--border));
616 background-color: hsl(var(--muted) / 0.3);
617 }
618
619 /* Badges */
620 .badge {
621 display: inline-flex;
622 align-items: center;
623 gap: 0.25rem;
624 border-radius: 9999px;
625 border: 1px solid hsl(var(--border));
626 padding: 0.08rem 0.45rem;
627 font-size: 0.72rem;
628 font-weight: 500;
629 line-height: 1.3;
630 color: hsl(var(--foreground));
631 background-color: hsl(var(--secondary));
632 }
633 .badge-outline {
634 background-color: transparent;
635 color: hsl(var(--muted-foreground));
636 }
637 .badge-primary {
638 background-color: hsl(var(--primary));
639 color: hsl(var(--primary-foreground));
640 border-color: transparent;
641 }
642 .badge-destructive {
643 background-color: hsl(var(--destructive) / 0.12);
644 color: hsl(var(--destructive));
645 border-color: hsl(var(--destructive) / 0.3);
646 }
647
648 /* Kbd */
649 kbd, .kbd {
650 display: inline-flex;
651 align-items: center;
652 justify-content: center;
653 min-width: 1.25rem;
654 height: 1.15rem;
655 padding: 0 0.28rem;
656 font-size: 0.68rem;
657 font-weight: 500;
658 line-height: 1;
659 color: hsl(var(--muted-foreground));
660 background-color: hsl(var(--muted));
661 border: 1px solid hsl(var(--border));
662 border-radius: 0.25rem;
663 }
664
665 /* Avatar */
666 .avatar {
667 display: inline-flex;
668 align-items: center;
669 justify-content: center;
670 width: 1.45rem;
671 height: 1.45rem;
672 border-radius: 9999px;
673 background-color: hsl(var(--secondary));
674 border: 1px solid hsl(var(--border));
675 font-size: 0.7rem;
676 font-weight: 600;
677 color: hsl(var(--foreground));
678 text-transform: uppercase;
679 flex-shrink: 0;
680 overflow: hidden;
681 }
682 .avatar-img {
683 width: 100%;
684 height: 100%;
685 object-fit: cover;
686 display: block;
687 }
688 .avatar-lg {
689 width: 2.3rem;
690 height: 2.3rem;
691 font-size: 0.9rem;
692 }
693 .avatar-xl {
694 width: 4.25rem;
695 height: 4.25rem;
696 font-size: 1.5rem;
697 }
698 .avatar-xxl {
699 width: 8.5rem;
700 height: 8.5rem;
701 font-size: 2.75rem;
702 box-shadow: 0 0 0 3px hsl(var(--background)), 0 0 0 4px hsl(var(--border));
703 }
704 .profile-chip {
705 display: inline-flex;
706 align-items: center;
707 gap: 0.35rem;
708 padding: 0.28rem 0.65rem;
709 border: 1px solid hsl(var(--border));
710 border-radius: 9999px;
711 background: hsl(var(--muted) / 0.25);
712 font-size: 0.75rem;
713 color: hsl(var(--muted-foreground));
714 text-decoration: none;
715 }
716 .profile-chip a {
717 color: inherit;
718 text-decoration: none;
719 }
720 .profile-chip a:hover {
721 color: hsl(var(--foreground));
722 }
723 .repo-card {
724 transition: border-color 0.15s ease;
725 }
726 .repo-card:hover {
727 border-color: hsl(var(--foreground) / 0.3);
728 }
729 @media (max-width: 640px) {
730 .avatar-xxl {
731 width: 6rem;
732 height: 6rem;
733 font-size: 2rem;
734 }
735 }
736
737
738 /* Separator */
739 .separator {
740 height: 1px;
741 width: 100%;
742 background-color: hsl(var(--border));
743 margin: 0.85rem 0;
744 border: 0;
745 }
746
747 /* Tabs */
748 .tabs-nav {
749 display: flex;
750 align-items: center;
751 gap: 0.15rem;
752 padding: 0.2rem;
753 border: 1px solid hsl(var(--border));
754 border-radius: 999px;
755 background: hsl(var(--muted) / 0.25);
756 margin-bottom: 1rem;
757 overflow-x: auto;
758 }
759 .tab-link {
760 display: inline-flex;
761 align-items: center;
762 gap: 0.35rem;
763 padding: 0.38rem 0.8rem;
764 font-size: 0.82rem;
765 font-weight: 500;
766 color: hsl(var(--muted-foreground));
767 border-radius: 999px;
768 white-space: nowrap;
769 transition: color 100ms ease, background-color 100ms ease;
770 }
771 .tab-link:hover {
772 color: hsl(var(--foreground));
773 }
774 .tab-link.active {
775 color: hsl(var(--foreground));
776 background: hsl(var(--card));
777 box-shadow: 0 1px 2px hsl(0 0% 0% / 0.08);
778 }
779
780 /* Dense File List & Tables */
781 .dense-list {
782 width: 100%;
783 }
784 .dense-row {
785 display: flex;
786 align-items: center;
787 justify-content: space-between;
788 gap: 0.75rem;
789 min-height: 2.05rem;
790 padding: 0.25rem 0.75rem;
791 border-bottom: 1px solid hsl(var(--border));
792 font-size: 0.85rem;
793 transition: background-color 80ms ease;
794 }
795 .dense-row:last-child {
796 border-bottom: none;
797 }
798 .dense-row:hover {
799 background-color: hsl(var(--accent) / 0.5);
800 }
801
802 .table-wrap {
803 width: 100%;
804 overflow-x: auto;
805 border: 1px solid hsl(var(--border));
806 border-radius: var(--radius);
807 background-color: hsl(var(--card));
808 }
809 .table {
810 width: 100%;
811 border-collapse: collapse;
812 font-size: 0.85rem;
813 }
814 .table th {
815 text-align: left;
816 font-weight: 500;
817 color: hsl(var(--muted-foreground));
818 padding: 0.5rem 0.75rem;
819 border-bottom: 1px solid hsl(var(--border));
820 background-color: hsl(var(--muted) / 0.35);
821 font-size: 0.75rem;
822 }
823 .table td {
824 padding: 0.5rem 0.75rem;
825 border-bottom: 1px solid hsl(var(--border));
826 vertical-align: middle;
827 }
828 .table tr:last-child td {
829 border-bottom: none;
830 }
831
832 /* Breadcrumb */
833 .breadcrumb {
834 display: flex;
835 align-items: center;
836 flex-wrap: wrap;
837 gap: 0.25rem;
838 font-size: 0.85rem;
839 }
840 .breadcrumb-sep {
841 color: hsl(var(--muted-foreground));
842 }
843
844 /* Dropdown Menu */
845 @keyframes dropdownIn {
846 from {
847 opacity: 0;
848 transform: translateY(-4px) scale(0.98);
849 }
850 to {
851 opacity: 1;
852 transform: translateY(0) scale(1);
853 }
854 }
855 .dropdown {
856 position: relative;
857 display: inline-block;
858 }
859 .dropdown-menu {
860 position: absolute;
861 left: 0;
862 top: calc(100% + 0.3rem);
863 min-width: 11rem;
864 background-color: hsl(var(--popover));
865 color: hsl(var(--popover-foreground));
866 border: 1px solid hsl(var(--border));
867 border-radius: var(--radius);
868 padding: 0.25rem;
869 box-shadow: 0 8px 24px -4px rgba(0, 0, 0, 0.22);
870 z-index: 60;
871 display: none;
872 transform-origin: top left;
873 }
874 .dropdown-menu.open {
875 display: block;
876 animation: dropdownIn 140ms cubic-bezier(0.16, 1, 0.3, 1);
877 }
878 .dropdown-item {
879 display: flex;
880 width: 100%;
881 align-items: center;
882 justify-content: space-between;
883 gap: 0.5rem;
884 padding: 0.35rem 0.55rem;
885 font-size: 0.8rem;
886 border-radius: calc(var(--radius) - 2px);
887 color: hsl(var(--popover-foreground));
888 background: transparent;
889 border: 0;
890 cursor: pointer;
891 text-align: left;
892 transition: background-color 120ms ease, color 120ms ease;
893 }
894 .dropdown-item:hover, .dropdown-item.active {
895 background-color: hsl(var(--accent));
896 color: hsl(var(--accent-foreground));
897 }
898
899 /* Modal / Dialog & Command Palette */
900 @keyframes backdropIn {
901 from { opacity: 0; }
902 to { opacity: 1; }
903 }
904 @keyframes dialogIn {
905 from {
906 opacity: 0;
907 transform: translateY(-6px) scale(0.97);
908 }
909 to {
910 opacity: 1;
911 transform: translateY(0) scale(1);
912 }
913 }
914 .backdrop {
915 position: fixed;
916 inset: 0;
917 background-color: rgba(0, 0, 0, 0.55);
918 backdrop-filter: blur(2px);
919 z-index: 80;
920 display: none;
921 align-items: flex-start;
922 justify-content: center;
923 padding: 10vh 1rem 2rem;
924 }
925 .backdrop.open {
926 display: flex;
927 animation: backdropIn 140ms ease;
928 }
929 .dialog-box {
930 width: 100%;
931 max-width: 28rem;
932 background-color: hsl(var(--popover));
933 color: hsl(var(--popover-foreground));
934 border: 1px solid hsl(var(--border));
935 border-radius: var(--radius);
936 box-shadow: 0 16px 40px -8px rgba(0, 0, 0, 0.35);
937 overflow: hidden;
938 animation: dialogIn 170ms cubic-bezier(0.16, 1, 0.3, 1);
939 }
940 .palette-box {
941 width: 100%;
942 max-width: 34rem;
943 background-color: hsl(var(--popover));
944 color: hsl(var(--popover-foreground));
945 border: 1px solid hsl(var(--border));
946 border-radius: var(--radius);
947 box-shadow: 0 16px 48px -8px rgba(0, 0, 0, 0.4);
948 overflow: hidden;
949 animation: dialogIn 170ms cubic-bezier(0.16, 1, 0.3, 1);
950 }
951 .palette-input-wrap {
952 display: flex;
953 align-items: center;
954 gap: 0.6rem;
955 padding: 0.6rem 0.8rem;
956 border-bottom: 1px solid hsl(var(--border));
957 }
958 .palette-input {
959 width: 100%;
960 border: 0;
961 background: transparent;
962 color: hsl(var(--foreground));
963 font-size: 0.9rem;
964 outline: none;
965 }
966 .palette-list {
967 max-height: 20rem;
968 overflow-y: auto;
969 padding: 0.3rem;
970 }
971 .palette-group-title {
972 padding: 0.3rem 0.5rem 0.15rem;
973 font-size: 0.68rem;
974 font-weight: 600;
975 text-transform: uppercase;
976 letter-spacing: 0.04em;
977 color: hsl(var(--muted-foreground));
978 }
979 .palette-item {
980 display: flex;
981 width: 100%;
982 align-items: center;
983 justify-content: space-between;
984 gap: 0.5rem;
985 padding: 0.4rem 0.55rem;
986 border-radius: calc(var(--radius) - 2px);
987 font-size: 0.85rem;
988 color: hsl(var(--foreground));
989 cursor: pointer;
990 border: 0;
991 background: transparent;
992 text-align: left;
993 transition: background-color 100ms ease, color 100ms ease;
994 }
995 .palette-item:hover, .palette-item.selected {
996 background-color: hsl(var(--accent));
997 color: hsl(var(--accent-foreground));
998 }
999
1000 /* Toast */
1001 @keyframes toastIn {
1002 from {
1003 opacity: 0;
1004 transform: translateY(8px) scale(0.97);
1005 }
1006 to {
1007 opacity: 1;
1008 transform: translateY(0) scale(1);
1009 }
1010 }
1011 .toast-container {
1012 position: fixed;
1013 bottom: 1rem;
1014 right: 1rem;
1015 z-index: 90;
1016 display: flex;
1017 flex-direction: column;
1018 gap: 0.4rem;
1019 max-width: 20rem;
1020 }
1021 .toast {
1022 display: flex;
1023 align-items: center;
1024 justify-content: space-between;
1025 gap: 0.65rem;
1026 padding: 0.5rem 0.75rem;
1027 border-radius: var(--radius);
1028 border: 1px solid hsl(var(--border));
1029 background-color: hsl(var(--popover));
1030 color: hsl(var(--popover-foreground));
1031 box-shadow: 0 8px 24px -4px rgba(0, 0, 0, 0.25);
1032 font-size: 0.8rem;
1033 animation: toastIn 180ms cubic-bezier(0.16, 1, 0.3, 1);
1034 }
1035
1036 /* Skeleton */
1037 @keyframes pulse {
1038 0%, 100% { opacity: 1; }
1039 50% { opacity: 0.45; }
1040 }
1041 .skeleton {
1042 background-color: hsl(var(--muted));
1043 border-radius: calc(var(--radius) - 2px);
1044 animation: pulse 1.6s ease-in-out infinite;
1045 }
1046
1047 /* Empty State */
1048 .empty-state {
1049 text-align: center;
1050 padding: 2rem 1rem;
1051 border: 1px dashed hsl(var(--border));
1052 border-radius: var(--radius);
1053 color: hsl(var(--muted-foreground));
1054 }
1055
1056 /* Code Viewer & Chroma */
1057 .code-table {
1058 width: 100%;
1059 border-collapse: collapse;
1060 font-family: 'JetBrains Mono', monospace;
1061 font-size: 0.8rem;
1062 line-height: 1.5;
1063 }
1064 .code-ln {
1065 width: 1%;
1066 min-width: 2.75rem;
1067 padding: 0 0.65rem;
1068 text-align: right;
1069 color: hsl(var(--muted-foreground) / 0.6);
1070 user-select: none;
1071 vertical-align: top;
1072 border-right: 1px solid hsl(var(--border));
1073 }
1074 .code-line {
1075 padding: 0 0.75rem;
1076 white-space: pre;
1077 overflow-x: auto;
1078 }
1079 .chroma .k, .chroma .kc, .chroma .kd, .chroma .kn, .chroma .kp, .chroma .kr { color: hsl(var(--syntax-kw)); font-weight: 500; }
1080 .chroma .kt { color: hsl(var(--syntax-type)); }
1081 .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)); }
1082 .chroma .c, .chroma .ch, .chroma .cm, .chroma .c1, .chroma .cs, .chroma .cp, .chroma .cpf { color: hsl(var(--syntax-cmt)); font-style: italic; }
1083 .chroma .nf, .chroma .fm, .chroma .nx { color: hsl(var(--syntax-fn)); }
1084 .chroma .m, .chroma .mb, .chroma .mf, .chroma .mh, .chroma .mi, .chroma .il, .chroma .mo { color: hsl(var(--syntax-num)); }
1085 .chroma .o, .chroma .ow { color: hsl(var(--syntax-op)); }
1086
1087 /* Diff Viewer */
1088 .diff-table {
1089 width: 100%;
1090 border-collapse: collapse;
1091 font-family: 'JetBrains Mono', monospace;
1092 font-size: 0.78rem;
1093 line-height: 1.5;
1094 }
1095 .diff-row-add {
1096 background-color: hsl(var(--diff-add-bg));
1097 color: hsl(var(--diff-add-fg));
1098 }
1099 .diff-row-del {
1100 background-color: hsl(var(--diff-del-bg));
1101 color: hsl(var(--diff-del-fg));
1102 }
1103 .diff-row-hunk {
1104 background-color: hsl(var(--muted));
1105 color: hsl(var(--muted-foreground));
1106 }
1107 .diff-num {
1108 width: 2.75rem;
1109 padding: 0 0.45rem;
1110 text-align: right;
1111 user-select: none;
1112 opacity: 0.65;
1113 border-right: 1px solid hsl(var(--border));
1114 }
1115 .diff-code {
1116 padding: 0 0.65rem;
1117 white-space: pre-wrap;
1118 word-break: break-all;
1119 }
1120
1121 /* Markdown Body */
1122 .markdown-body {
1123 font-size: 0.9rem;
1124 line-height: 1.6;
1125 color: hsl(var(--foreground));
1126 }
1127 .markdown-body h1, .markdown-body h2, .markdown-body h3, .markdown-body h4 {
1128 margin-top: 1.25em;
1129 margin-bottom: 0.45em;
1130 font-weight: 600;
1131 line-height: 1.25;
1132 }
1133 .markdown-body h1 { font-size: 1.35rem; padding-bottom: 0.25rem; border-bottom: 1px solid hsl(var(--border)); }
1134 .markdown-body h2 { font-size: 1.15rem; padding-bottom: 0.2rem; border-bottom: 1px solid hsl(var(--border)); }
1135 .markdown-body h3 { font-size: 1rem; }
1136 .markdown-body h1:first-child, .markdown-body h2:first-child { margin-top: 0; }
1137 .markdown-body p, .markdown-body ul, .markdown-body ol, .markdown-body pre, .markdown-body blockquote {
1138 margin-top: 0;
1139 margin-bottom: 0.8rem;
1140 }
1141 .markdown-body code {
1142 background-color: hsl(var(--muted));
1143 padding: 0.12rem 0.3rem;
1144 border-radius: 0.25rem;
1145 font-size: 0.84em;
1146 }
1147 .markdown-body pre {
1148 background-color: hsl(var(--muted) / 0.6);
1149 border: 1px solid hsl(var(--border));
1150 border-radius: var(--radius);
1151 padding: 0.75rem 0.9rem;
1152 overflow-x: auto;
1153 }
1154 .markdown-body pre code {
1155 background: transparent;
1156 padding: 0;
1157 }
1158 .markdown-body a {
1159 text-decoration: underline;
1160 text-underline-offset: 3px;
1161 }
1162
1163 /* Utility Helpers */
1164 .flex { display: flex; }
1165 .block { display: block; }
1166 .inline-flex { display: inline-flex; }
1167 .grid { display: grid; }
1168 .hidden { display: none; }
1169 .items-center { align-items: center; }
1170 .items-start { align-items: flex-start; }
1171 .items-baseline { align-items: baseline; }
1172 .justify-between { justify-content: space-between; }
1173 .justify-center { justify-content: center; }
1174 .justify-end { justify-content: flex-end; }
1175 .flex-col { flex-direction: column; }
1176 .flex-wrap { flex-wrap: wrap; }
1177 .flex-1 { flex: 1 1 0%; }
1178 .flex-shrink-0 { flex-shrink: 0; }
1179 .min-w-0 { min-width: 0; }
1180 .gap-0\.5 { gap: 0.125rem; }
1181 .gap-1 { gap: 0.25rem; }
1182 .gap-1\.5 { gap: 0.375rem; }
1183 .gap-2 { gap: 0.5rem; }
1184 .gap-2\.5 { gap: 0.625rem; }
1185 .gap-3 { gap: 0.75rem; }
1186 .gap-4 { gap: 1rem; }
1187 .gap-6 { gap: 1.5rem; }
1188 .w-full { width: 100%; }
1189 .text-xs { font-size: 0.75rem; }
1190 .text-sm { font-size: 0.85rem; }
1191 .text-base { font-size: 0.96rem; }
1192 .text-lg { font-size: 1.1rem; }
1193 .text-xl { font-size: 1.25rem; }
1194 .text-2xl { font-size: 1.5rem; }
1195 .font-medium { font-weight: 500; }
1196 .font-semibold { font-weight: 600; }
1197 .font-bold { font-weight: 700; }
1198 .uppercase { text-transform: uppercase; }
1199 .tracking-tight { letter-spacing: -0.015em; }
1200 .text-muted { color: hsl(var(--muted-foreground)); }
1201 .text-destructive { color: hsl(var(--destructive)); }
1202 .text-foreground { color: hsl(var(--foreground)); }
1203 .text-center { text-align: center; }
1204 .truncate { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
1205 .hover\:underline:hover { text-decoration: underline; }
1206 .select-all { user-select: all; }
1207 .cursor-pointer { cursor: pointer; }
1208 .mt-0\.5 { margin-top: 0.125rem; }
1209 .mt-1 { margin-top: 0.25rem; }
1210 .mt-2 { margin-top: 0.5rem; }
1211 .mt-3 { margin-top: 0.75rem; }
1212 .mt-4 { margin-top: 1rem; }
1213 .mt-6 { margin-top: 1.5rem; }
1214 .mr-2 { margin-right: 0.5rem; }
1215 .mb-1 { margin-bottom: 0.25rem; }
1216 .mb-1\.5 { margin-bottom: 0.375rem; }
1217 .mb-2 { margin-bottom: 0.5rem; }
1218 .mb-3 { margin-bottom: 0.75rem; }
1219 .mb-4 { margin-bottom: 1rem; }
1220 .mb-6 { margin-bottom: 1.5rem; }
1221 .p-2 { padding: 0.5rem; }
1222 .p-3 { padding: 0.75rem; }
1223 .p-4 { padding: 1rem; }
1224 .px-3 { padding-left: 0.75rem; padding-right: 0.75rem; }
1225 .py-2 { padding-top: 0.5rem; padding-bottom: 0.5rem; }
1226 .pt-2 { padding-top: 0.5rem; }
1227 .pt-3 { padding-top: 0.75rem; }
1228 .pb-3 { padding-bottom: 0.75rem; }
1229
1230 .grid-2 { display: grid; grid-template-columns: repeat(1, minmax(0, 1fr)); gap: 0.85rem; }
1231 .grid-3 { display: grid; grid-template-columns: repeat(1, minmax(0, 1fr)); gap: 0.85rem; }
1232 .grid-4 { display: grid; grid-template-columns: repeat(1, minmax(0, 1fr)); gap: 0.85rem; }
1233
1234 @media (min-width: 768px) {
1235 .grid-2 { grid-template-columns: repeat(2, minmax(0, 1fr)); }
1236 .grid-3 { grid-template-columns: repeat(3, minmax(0, 1fr)); }
1237 .grid-4 { grid-template-columns: repeat(2, minmax(0, 1fr)); }
1238 .md-flex { display: flex !important; }
1239 .md-hidden { display: none !important; }
1240 }
1241
1242 /* Mobile Drawer */
1243 .mobile-drawer {
1244 position: fixed;
1245 inset: 0;
1246 z-index: 75;
1247 background-color: rgba(0, 0, 0, 0.5);
1248 display: none;
1249 }
1250 .mobile-drawer.open {
1251 display: block;
1252 }
1253 .mobile-drawer-panel {
1254 width: 224px;
1255 max-width: 85vw;
1256 height: 100%;
1257 background-color: hsl(var(--card));
1258 border-right: 1px solid hsl(var(--border));
1259 padding: 0.75rem 0.65rem;
1260 display: flex;
1261 flex-direction: column;
1262 justify-content: space-between;
1263 }
1264
1265 @media (min-width: 1024px) {
1266 .grid-4 { grid-template-columns: repeat(4, minmax(0, 1fr)); }
1267 }
1268
1269 /* ── Polar repository shell ─────────────────────────────────────────── */
1270 .repo-banner {
1271 position: relative;
1272 display: flex;
1273 align-items: flex-start;
1274 justify-content: space-between;
1275 gap: 1rem;
1276 flex-wrap: wrap;
1277 padding: 0.9rem 1rem 0.95rem;
1278 background: hsl(var(--card));
1279 border: 1px solid hsl(var(--border));
1280 border-radius: calc(var(--radius) * 1.6);
1281 overflow: hidden;
1282 }
1283
1284 .repo-banner-main {
1285 display: flex;
1286 align-items: center;
1287 gap: 0.7rem;
1288 min-width: 0;
1289 flex: 1 1 20rem;
1290 }
1291 .repo-banner-actions {
1292 display: flex;
1293 align-items: center;
1294 gap: 0.4rem;
1295 flex-wrap: wrap;
1296 }
1297
1298
1299
1300 .clone-box {
1301 display: flex;
1302 align-items: center;
1303 gap: 0.35rem;
1304 border: 1px solid hsl(var(--border));
1305 border-radius: var(--radius);
1306 background: hsl(var(--muted) / 0.25);
1307 padding: 0.15rem 0.25rem 0.15rem 0.6rem;
1308 min-width: 0;
1309 }
1310 .clone-box code {
1311 flex: 1;
1312 min-width: 0;
1313 overflow: hidden;
1314 text-overflow: ellipsis;
1315 white-space: nowrap;
1316 font-size: 0.72rem;
1317 }
1318 .upload-drop {
1319 display: flex;
1320 flex-direction: column;
1321 align-items: center;
1322 gap: 0.35rem;
1323 text-align: center;
1324 padding: 1.6rem 1rem;
1325 border: 1.5px dashed hsl(var(--border));
1326 border-radius: calc(var(--radius) * 1.3);
1327 background: hsl(var(--muted) / 0.2);
1328 color: hsl(var(--muted-foreground));
1329 cursor: pointer;
1330 transition: border-color 0.15s ease, background 0.15s ease, color 0.15s ease;
1331 }
1332 .upload-drop:hover {
1333 border-color: hsl(var(--foreground) / 0.4);
1334 color: hsl(var(--foreground));
1335 }
1336 .upload-drop.drag {
1337 border-color: hsl(var(--foreground) / 0.6);
1338 background: hsl(var(--muted) / 0.5);
1339 color: hsl(var(--foreground));
1340 }
1341 /* Utility completion (classes used in templates but absent from the build) */
1342 .relative { position: relative; }
1343 .gap-1\.5 { gap: 0.375rem; }
1344 .gap-5 { gap: 1.25rem; }
1345 .mb-1\.5 { margin-bottom: 0.375rem; }
1346 .pt-1 { padding-top: 0.25rem; }