Knot server viewer.
knotview.srv.rbrt.fr
knot
tangled
1* {
2 margin: 0;
3 padding: 0;
4 box-sizing: border-box;
5}
6
7:root {
8 /* Light theme colors */
9 --bg-primary: #f9fafb;
10 --bg-secondary: #ffffff;
11 --bg-tertiary: #f3f4f6;
12 --bg-hover: #f3f4f6;
13 --bg-active: #dbeafe;
14
15 --text-primary: #111827;
16 --text-secondary: #4b5563;
17 --text-tertiary: #6b7280;
18 --text-heading: #111827;
19
20 --border-primary: #e5e7eb;
21 --border-secondary: #d1d5db;
22 --border-light: #f3f4f6;
23
24 --accent-primary: #3b82f6;
25 --accent-hover: #2563eb;
26 --accent-light: #dbeafe;
27
28 --success-bg: #dcfce7;
29 --success-text: #166534;
30 --success-border: #bbf7d0;
31
32 --error-bg: #fee2e2;
33 --error-text: #991b1b;
34 --error-border: #fecaca;
35
36 --code-bg: #f3f4f6;
37 --code-text: #111827;
38 --code-block-bg: #1f2937;
39 --code-block-text: #e5e7eb;
40 --code-block-border: #374151;
41 --code-block-line-numbers: #9ca3af;
42
43 --shadow-sm: 0 1px 2px 0 rgb(0 0 0 / 0.05);
44 --shadow-md:
45 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);
46}
47
48body.dark-theme {
49 /* Dark theme colors */
50 --bg-primary: #111827;
51 --bg-secondary: #1f2937;
52 --bg-tertiary: #374151;
53 --bg-hover: #374151;
54 --bg-active: #1e3a8a;
55
56 --text-primary: #f3f4f6;
57 --text-secondary: #d1d5db;
58 --text-tertiary: #9ca3af;
59 --text-heading: #ffffff;
60
61 --border-primary: #374151;
62 --border-secondary: #4b5563;
63 --border-light: #374151;
64
65 --accent-primary: #3b82f6;
66 --accent-hover: #60a5fa;
67 --accent-light: #1e3a8a;
68
69 --success-bg: #14532d;
70 --success-text: #86efac;
71 --success-border: #166534;
72
73 --error-bg: #7f1d1d;
74 --error-text: #fecaca;
75 --error-border: #991b1b;
76
77 --code-bg: #374151;
78 --code-text: #d1d5db;
79 --code-block-bg: #1f2937;
80 --code-block-text: #e5e7eb;
81 --code-block-border: #4b5563;
82 --code-block-line-numbers: #9ca3af;
83
84 --shadow-sm: 0 1px 2px 0 rgb(0 0 0 / 0.3);
85 --shadow-md:
86 0 4px 6px -1px rgb(0 0 0 / 0.4), 0 2px 4px -2px rgb(0 0 0 / 0.4);
87}
88
89body {
90 font-family: InterVariable, system-ui, sans-serif, ui-sans-serif;
91 background: var(--bg-primary);
92 color: var(--text-primary);
93 font-size: 14px;
94 line-height: 1.5;
95 transition:
96 background-color 0.3s ease,
97 color 0.3s ease;
98}
99
100.container {
101 max-width: 1400px;
102 margin: 0 auto;
103 padding: 20px;
104}
105
106header {
107 background: var(--bg-secondary);
108 padding: 24px;
109 border-radius: 8px;
110 box-shadow: var(--shadow-md);
111 margin-bottom: 20px;
112 border: 1px solid var(--border-primary);
113}
114
115.header-top {
116 display: flex;
117 justify-content: space-between;
118 align-items: center;
119 margin-bottom: 20px;
120}
121
122h1 {
123 font-size: 24px;
124 margin: 0;
125 color: var(--text-heading);
126 font-weight: 600;
127}
128
129.theme-toggle {
130 background: var(--bg-tertiary);
131 border: 1px solid var(--border-primary);
132 color: var(--text-primary);
133 padding: 8px 16px;
134 border-radius: 6px;
135 cursor: pointer;
136 font-size: 14px;
137 display: flex;
138 align-items: center;
139 gap: 8px;
140 transition: all 0.15s;
141}
142
143.theme-toggle:hover {
144 background: var(--bg-hover);
145 border-color: var(--border-secondary);
146}
147
148.connection-panel {
149 display: flex;
150 gap: 12px;
151 margin-bottom: 12px;
152 flex-wrap: wrap;
153}
154
155.connection-panel input {
156 flex: 1;
157 min-width: 300px;
158 padding: 10px 14px;
159 border: 1px solid var(--border-secondary);
160 border-radius: 6px;
161 font-size: 14px;
162 background: var(--bg-secondary);
163 color: var(--text-primary);
164 transition: all 0.15s;
165}
166
167.connection-panel input:focus {
168 outline: none;
169 border-color: var(--accent-primary);
170 box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1);
171}
172
173button {
174 padding: 10px 20px;
175 background: var(--accent-primary);
176 color: white;
177 border: none;
178 border-radius: 6px;
179 cursor: pointer;
180 font-size: 14px;
181 font-weight: 500;
182 transition: all 0.15s;
183 box-shadow: var(--shadow-sm);
184}
185
186button:hover {
187 background: var(--accent-hover);
188}
189
190button:active {
191 transform: translateY(1px);
192}
193
194button:disabled {
195 background: var(--text-tertiary);
196 cursor: not-allowed;
197 transform: none;
198}
199
200button.secondary {
201 background: var(--bg-secondary);
202 color: var(--text-secondary);
203 border: 1px solid var(--border-secondary);
204}
205
206button.secondary:hover {
207 background: var(--bg-hover);
208}
209
210.status {
211 padding: 12px 16px;
212 border-radius: 6px;
213 font-size: 13px;
214 border: 1px solid transparent;
215 margin-top: 12px;
216 font-weight: 500;
217 line-height: 1.5;
218}
219
220.status:empty {
221 display: none;
222}
223
224.status.success {
225 background: var(--success-bg);
226 color: var(--success-text);
227 border-color: var(--success-border);
228}
229
230.status.error {
231 background: var(--error-bg);
232 color: var(--error-text);
233 border-color: var(--error-border);
234 font-weight: 600;
235}
236
237.status.error::before {
238 content: "⚠️ ";
239 margin-right: 4px;
240}
241
242.status.success::before {
243 content: "✓ ";
244 margin-right: 4px;
245}
246
247.main-content {
248 display: flex;
249 gap: 20px;
250 align-items: flex-start;
251}
252
253.sidebar {
254 width: 300px;
255 background: var(--bg-secondary);
256 border-radius: 8px;
257 border: 1px solid var(--border-primary);
258 box-shadow: var(--shadow-md);
259 flex-shrink: 0;
260}
261
262.sidebar h2 {
263 font-size: 16px;
264 font-weight: 600;
265 padding: 16px 20px;
266 border-bottom: 1px solid var(--border-primary);
267 color: var(--text-heading);
268 display: flex;
269 align-items: center;
270 justify-content: space-between;
271}
272
273.repo-info {
274 padding: 20px;
275}
276
277.repo-info h3 {
278 font-size: 14px;
279 font-weight: 600;
280 margin-bottom: 12px;
281 color: var(--text-tertiary);
282}
283
284.repo-info .label {
285 font-size: 12px;
286 color: var(--text-tertiary);
287 margin-bottom: 4px;
288 font-weight: 500;
289 text-transform: uppercase;
290 letter-spacing: 0.5px;
291}
292
293.repo-info .value {
294 font-size: 13px;
295 color: var(--text-primary);
296 margin-bottom: 12px;
297 font-family: IBMPlexMono, ui-monospace, monospace;
298}
299
300.clone-url {
301 display: flex;
302 align-items: center;
303 gap: 8px;
304 background: var(--bg-tertiary);
305 padding: 8px 12px;
306 border-radius: 6px;
307 border: 1px solid var(--border-primary);
308 margin-bottom: 12px;
309}
310
311.clone-url code {
312 flex: 1;
313 font-size: 12px;
314 color: var(--text-secondary);
315 overflow: hidden;
316 text-overflow: ellipsis;
317}
318
319.copy-btn {
320 padding: 4px 8px;
321 font-size: 11px;
322 min-width: 50px;
323}
324
325.copy-btn:hover {
326 background: var(--accent-hover);
327}
328
329.branches-section {
330 border-top: 1px solid var(--border-primary);
331}
332
333.branch-list {
334 max-height: 300px;
335 overflow-y: auto;
336}
337
338.branch-item {
339 padding: 10px 20px;
340 cursor: pointer;
341 transition: background 0.15s;
342 border-bottom: 1px solid var(--border-light);
343 font-size: 13px;
344 color: var(--text-secondary);
345 display: flex;
346 align-items: center;
347 gap: 8px;
348}
349
350.branch-item:hover {
351 background: var(--bg-hover);
352}
353
354.branch-item.active {
355 background: var(--accent-light);
356 color: var(--accent-primary);
357 font-weight: 500;
358}
359
360.viewer {
361 flex: 1;
362 background: var(--bg-secondary);
363 border-radius: 8px;
364 border: 1px solid var(--border-primary);
365 box-shadow: var(--shadow-md);
366 overflow: hidden;
367}
368
369.breadcrumb {
370 padding: 16px 20px;
371 border-bottom: 1px solid var(--border-primary);
372 font-size: 13px;
373 color: var(--text-tertiary);
374 background: var(--bg-tertiary);
375 display: flex;
376 align-items: center;
377 flex-wrap: wrap;
378}
379
380.breadcrumb a {
381 color: var(--accent-primary);
382 text-decoration: none;
383 transition: color 0.15s;
384 cursor: pointer;
385}
386
387.breadcrumb a:hover {
388 color: var(--accent-hover);
389 text-decoration: underline;
390}
391
392.breadcrumb span {
393 margin: 0 8px;
394}
395
396.breadcrumb .current {
397 color: var(--text-primary);
398 font-weight: 500;
399}
400
401.file-list {
402 padding: 0;
403 list-style: none;
404 margin: 0;
405}
406
407.file-item {
408 padding: 12px 20px;
409 display: flex;
410 align-items: center;
411 gap: 12px;
412 border-bottom: 1px solid var(--border-light);
413 cursor: pointer !important;
414}
415
416.file-item:last-child {
417 border-bottom: none;
418}
419
420.file-item:hover {
421 background: var(--bg-hover);
422}
423
424.file-icon {
425 width: 20px;
426 height: 20px;
427 flex-shrink: 0;
428 color: var(--text-tertiary);
429 cursor: pointer;
430}
431
432.file-name {
433 flex: 1;
434 color: var(--text-primary);
435 font-size: 14px;
436 cursor: pointer;
437}
438
439.file-size {
440 color: var(--text-tertiary);
441 font-size: 12px;
442 cursor: pointer;
443}
444
445.file-content {
446 padding: 0;
447 overflow-x: auto;
448 background: var(--code-block-bg);
449 font-family: IBMPlexMono, Monaco, Menlo, monospace;
450 font-size: 13px;
451}
452
453.file-content pre {
454 margin: 0;
455 white-space: pre;
456 background: transparent;
457 padding: 20px;
458}
459
460.file-content code {
461 background: transparent;
462}
463
464.file-content code.hljs {
465 padding: 0;
466 background: transparent;
467}
468
469.line-numbers {
470 display: flex;
471 gap: 0;
472 background: var(--code-block-bg);
473}
474
475.line-numbers .numbers {
476 color: var(--code-block-line-numbers);
477 text-align: right;
478 user-select: none;
479 min-width: 50px;
480 padding: 20px 16px 20px 20px;
481 border-right: 1px solid var(--code-block-border);
482 background: var(--code-block-bg);
483 line-height: 1.5;
484}
485
486.line-numbers pre:not(.numbers) {
487 flex: 1;
488 padding-left: 20px;
489}
490
491.loading {
492 padding: 40px;
493 text-align: center;
494 color: var(--text-tertiary);
495}
496
497.spinner {
498 width: 40px;
499 height: 40px;
500 margin: 0 auto 16px;
501 border: 3px solid var(--border-primary);
502 border-top-color: var(--accent-primary);
503 border-radius: 50%;
504 animation: spin 0.8s linear infinite;
505}
506
507@keyframes spin {
508 to {
509 transform: rotate(360deg);
510 }
511}
512
513.empty-state {
514 padding: 60px 40px;
515 text-align: center;
516}
517
518.empty-state svg {
519 width: 64px;
520 height: 64px;
521 margin: 0 auto 20px;
522 color: var(--text-tertiary);
523 display: block;
524}
525
526.empty-state h3 {
527 font-size: 18px;
528 color: var(--text-secondary);
529 margin-bottom: 8px;
530}
531
532.empty-state p {
533 color: var(--text-tertiary);
534 font-size: 14px;
535}
536
537.welcome-hero {
538 padding: 80px 40px;
539 text-align: center;
540 max-width: 700px;
541 margin: 0 auto;
542}
543
544.welcome-hero svg {
545 width: 96px;
546 height: 96px;
547 margin: 0 auto 32px;
548 color: var(--accent-primary);
549 display: block;
550}
551
552.welcome-hero h2 {
553 font-size: 32px;
554 color: var(--text-heading);
555 margin-bottom: 16px;
556 font-weight: 700;
557}
558
559.welcome-hero .subtitle {
560 font-size: 18px;
561 color: var(--text-secondary);
562 margin-bottom: 48px;
563 line-height: 1.6;
564}
565
566.feature-list {
567 display: grid;
568 grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
569 gap: 24px;
570 margin-top: 48px;
571 text-align: left;
572}
573
574.feature-item {
575 padding: 20px;
576 background: var(--bg-tertiary);
577 border-radius: 8px;
578 border: 1px solid var(--border-primary);
579}
580
581.feature-item h4 {
582 font-size: 16px;
583 color: var(--text-heading);
584 margin-bottom: 8px;
585 display: flex;
586 align-items: center;
587 gap: 8px;
588}
589
590.feature-item p {
591 font-size: 14px;
592 color: var(--text-tertiary);
593 line-height: 1.5;
594 margin: 0;
595}
596
597.getting-started {
598 margin-top: 48px;
599 padding: 24px;
600 background: var(--bg-tertiary);
601 border-radius: 8px;
602 border: 1px solid var(--border-primary);
603 text-align: left;
604}
605
606.getting-started h3 {
607 font-size: 18px;
608 color: var(--text-heading);
609 margin-bottom: 16px;
610}
611
612.getting-started ol {
613 margin-left: 20px;
614 color: var(--text-secondary);
615}
616
617.getting-started li {
618 margin-bottom: 8px;
619 line-height: 1.6;
620}
621
622.error-message {
623 padding: 40px;
624 text-align: center;
625 color: var(--error-text);
626 background: var(--error-bg);
627 margin: 20px;
628 border-radius: 8px;
629 border: 1px solid var(--error-border);
630}
631
632.file-header {
633 padding: 16px 20px;
634 border-bottom: 1px solid var(--border-primary);
635 background: var(--bg-tertiary);
636 display: flex;
637 justify-content: space-between;
638 align-items: center;
639}
640
641.file-header h3 {
642 font-size: 15px;
643 color: var(--text-primary);
644 font-weight: 600;
645}
646
647.file-actions {
648 display: flex;
649 gap: 8px;
650}
651
652.file-actions button {
653 padding: 6px 12px;
654 font-size: 12px;
655}
656
657.user-item {
658 margin-bottom: 24px;
659}
660
661.user-header {
662 font-size: 16px;
663 font-weight: 600;
664 color: var(--text-heading);
665 margin-bottom: 12px;
666 padding: 12px;
667 background: var(--bg-tertiary);
668 border-radius: 6px;
669}
670
671.repo-item {
672 padding: 12px;
673 margin-bottom: 8px;
674 background: var(--bg-secondary);
675 border: 1px solid var(--border-primary);
676 border-radius: 6px;
677 cursor: pointer;
678 transition: all 0.15s;
679}
680
681.repo-item:hover {
682 border-color: var(--accent-primary);
683 box-shadow: 0 2px 4px rgba(59, 130, 246, 0.1);
684}
685
686.repo-item strong {
687 display: block;
688 font-size: 14px;
689 color: var(--text-primary);
690 margin-bottom: 4px;
691}
692
693.repo-item small {
694 font-size: 12px;
695 color: var(--text-tertiary);
696 font-family: IBMPlexMono, monospace;
697}
698
699.markdown-content {
700 padding: 20px 40px;
701 background: var(--bg-secondary);
702 font-family: InterVariable, system-ui, sans-serif;
703 font-size: 15px;
704 line-height: 1.6;
705 color: var(--text-primary);
706}
707
708.markdown-content h1,
709.markdown-content h2,
710.markdown-content h3,
711.markdown-content h4,
712.markdown-content h5,
713.markdown-content h6 {
714 margin-top: 24px;
715 margin-bottom: 16px;
716 font-weight: 600;
717 line-height: 1.25;
718 color: var(--text-heading);
719}
720
721.markdown-content h1 {
722 font-size: 2em;
723 padding-bottom: 0.3em;
724 border-bottom: 1px solid var(--border-primary);
725}
726
727.markdown-content h2 {
728 font-size: 1.5em;
729 padding-bottom: 0.3em;
730 border-bottom: 1px solid var(--border-primary);
731}
732
733.markdown-content h3 {
734 font-size: 1.25em;
735}
736
737.markdown-content h4 {
738 font-size: 1em;
739}
740
741.markdown-content h5 {
742 font-size: 0.875em;
743}
744
745.markdown-content h6 {
746 font-size: 0.85em;
747 color: var(--text-tertiary);
748}
749
750.markdown-content p {
751 margin-top: 0;
752 margin-bottom: 16px;
753}
754
755.markdown-content ul,
756.markdown-content ol {
757 margin-top: 0;
758 margin-bottom: 16px;
759 padding-left: 2em;
760}
761
762.markdown-content li + li {
763 margin-top: 0.25em;
764}
765
766.markdown-content code {
767 padding: 0.2em 0.4em;
768 margin: 0;
769 font-size: 85%;
770 background: var(--code-bg);
771 border-radius: 6px;
772 font-family: IBMPlexMono, Monaco, Menlo, monospace;
773 color: var(--code-text);
774}
775
776.markdown-content pre {
777 padding: 16px;
778 overflow: auto;
779 font-size: 85%;
780 line-height: 1.45;
781 background: var(--code-block-bg);
782 border-radius: 6px;
783 margin-bottom: 16px;
784}
785
786.markdown-content pre code {
787 display: block;
788 padding: 0;
789 margin: 0;
790 overflow: visible;
791 line-height: inherit;
792 word-wrap: normal;
793 background: transparent;
794 border: 0;
795 color: var(--code-block-text);
796}
797
798.markdown-content pre code.hljs {
799 background: transparent;
800}
801
802.markdown-content blockquote {
803 padding: 0 1em;
804 color: var(--text-tertiary);
805 border-left: 0.25em solid var(--border-secondary);
806 margin: 0 0 16px 0;
807}
808
809.markdown-content blockquote > :first-child {
810 margin-top: 0;
811}
812
813.markdown-content blockquote > :last-child {
814 margin-bottom: 0;
815}
816
817.markdown-content table {
818 border-spacing: 0;
819 border-collapse: collapse;
820 margin-bottom: 16px;
821 width: 100%;
822 overflow: auto;
823}
824
825.markdown-content table th,
826.markdown-content table td {
827 padding: 6px 13px;
828 border: 1px solid var(--border-primary);
829}
830
831.markdown-content table th {
832 font-weight: 600;
833 background: var(--bg-tertiary);
834}
835
836.markdown-content table tr {
837 background: var(--bg-secondary);
838 border-top: 1px solid var(--border-primary);
839}
840
841.markdown-content table tr:nth-child(2n) {
842 background: var(--bg-tertiary);
843}
844
845.markdown-content img {
846 max-width: 100%;
847 box-sizing: border-box;
848 border-radius: 6px;
849}
850
851.markdown-content a {
852 color: var(--accent-primary);
853 text-decoration: none;
854}
855
856.markdown-content a:hover {
857 text-decoration: underline;
858}
859
860.markdown-content hr {
861 height: 0.25em;
862 padding: 0;
863 margin: 24px 0;
864 background-color: var(--border-primary);
865 border: 0;
866}
867
868footer {
869 padding: 20px;
870 text-align: center;
871 border-top: 1px solid var(--border-primary);
872 margin-top: 40px;
873}
874
875footer p {
876 margin: 0;
877 color: var(--text-secondary);
878 font-size: 0.9rem;
879}
880
881footer a {
882 color: var(--accent-primary);
883 text-decoration: none;
884 font-weight: 500;
885}
886
887footer a:hover {
888 text-decoration: underline;
889 color: var(--accent-hover);
890}
891
892@media (max-width: 768px) {
893 .main-content {
894 flex-direction: column;
895 }
896
897 .sidebar {
898 width: 100%;
899 }
900
901 .connection-panel {
902 flex-direction: column;
903 }
904
905 .connection-panel input {
906 min-width: 100%;
907 }
908
909 .markdown-content {
910 padding: 20px;
911 }
912
913 .welcome-hero {
914 padding: 40px 20px;
915 }
916}