app.css
⎇
Raw
1/* Theme palettes. The base is light; dark is applied either by the OS
2 preference (theme = auto, the default) or forced by the theme toggle,
3 which puts `light`/`dark` on <html> (see web/src/theme.rs). Keep the two
4 dark blocks in sync. */
5:root {
6 color-scheme: light;
7 --bg: #f6f7f9;
8 --panel: #ffffff;
9 --text: #1a1d21;
10 --muted: #6b7280;
11 --accent: #3b82f6;
12 --accent-hover: #2563eb;
13 --accent-border: #1d4ed8;
14 --danger: #ef4444;
15 --danger-border: #dc2626;
16 --border: #e5e7eb;
17 --topbar-h: 48px;
18}
19
20:root.dark {
21 color-scheme: dark;
22 --bg: #0f1115;
23 --panel: #171a20;
24 --text: #e5e7eb;
25 --muted: #9ca3af;
26 --accent: #60a5fa;
27 --accent-hover: #3b82f6;
28 --accent-border: #79b5fc;
29 --danger: #f87171;
30 --danger-border: #fa8b8b;
31 --border: #2a2f3a;
32}
33
34@media (prefers-color-scheme: dark) {
35 :root:not(.light) {
36 color-scheme: dark;
37 --bg: #0f1115;
38 --panel: #171a20;
39 --text: #e5e7eb;
40 --muted: #9ca3af;
41 --accent: #60a5fa;
42 --accent-hover: #3b82f6;
43 --accent-border: #79b5fc;
44 --danger: #f87171;
45 --danger-border: #fa8b8b;
46 --border: #2a2f3a;
47 }
48}
49
50* {
51 box-sizing: border-box;
52 /* The design language is sharp: everything stays square. */
53 border-radius: 0;
54}
55
56body {
57 margin: 0;
58 font-family: system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;
59 background: var(--bg);
60 color: var(--text);
61 font-size: 15px;
62}
63
64.muted {
65 color: var(--muted);
66}
67
68.card {
69 background: var(--panel);
70 border: 1px solid var(--border);
71 padding: 24px;
72}
73
74.center-screen {
75 min-height: 100vh;
76 display: flex;
77 flex-direction: column;
78 align-items: center;
79 justify-content: center;
80 padding: 16px;
81 text-align: center;
82}
83
84.auth-card {
85 width: 100%;
86 max-width: 380px;
87}
88
89.auth-card h1 {
90 margin: 0 0 8px;
91 font-size: 22px;
92}
93
94.auth-logo {
95 width: 44px;
96 height: 44px;
97 margin-bottom: 12px;
98}
99
100.auth-card p {
101 margin: 0 0 20px;
102 font-size: 13px;
103}
104
105.field {
106 display: block;
107 margin-bottom: 14px;
108}
109
110.field span {
111 display: block;
112 font-size: 13px;
113 color: var(--muted);
114 margin-bottom: 4px;
115}
116
117input {
118 width: 100%;
119 padding: 10px 12px;
120 border: 1px solid var(--border);
121 background: var(--bg);
122 color: var(--text);
123 font-size: 14px;
124}
125
126input:focus {
127 outline: 2px solid var(--accent);
128 outline-offset: -1px;
129}
130
131button {
132 font: inherit;
133 cursor: pointer;
134 display: inline-flex;
135 align-items: center;
136 justify-content: center;
137 gap: 6px;
138 border: 1px solid var(--border);
139 background: var(--panel);
140 color: var(--text);
141 padding: 9px 14px;
142}
143
144button:hover {
145 border-color: var(--muted);
146}
147
148button:disabled {
149 opacity: 0.6;
150 cursor: default;
151}
152
153.btn-primary {
154 width: 100%;
155 background: var(--accent);
156 /* One step away from the fill, per theme (see palette above), so the
157 button's edge reads the same as on neutral buttons. */
158 border-color: var(--accent-border);
159 color: #fff;
160 font-weight: 600;
161}
162
163.btn-primary:hover {
164 background: var(--accent-hover);
165 border-color: var(--accent-border);
166}
167
168.error {
169 color: var(--danger);
170 font-size: 13px;
171 min-height: 18px;
172 margin: 0 0 10px;
173}
174
175/* layout (signed-in): full-width topbar, then sidebar + content below */
176
177.layout {
178 min-height: 100vh;
179 display: flex;
180 flex-direction: column;
181}
182
183.topbar {
184 flex: none;
185 position: sticky;
186 top: 0;
187 z-index: 130;
188 height: var(--topbar-h);
189 display: flex;
190 align-items: center;
191 justify-content: space-between;
192 gap: 12px;
193 padding: 0 16px;
194 background: var(--panel);
195 border-bottom: 1px solid var(--border);
196}
197
198.topbar-left {
199 display: flex;
200 align-items: center;
201 gap: 10px;
202 min-width: 0;
203}
204
205.icon-btn.nav-toggle {
206 display: none;
207}
208
209.body-row {
210 flex: 1;
211 display: flex;
212 align-items: stretch;
213}
214
215/* ---- sidebar ---- */
216
217.sidebar {
218 flex: none;
219 width: 224px;
220 display: flex;
221 flex-direction: column;
222 background: var(--panel);
223 border-right: 1px solid var(--border);
224 position: sticky;
225 top: var(--topbar-h);
226 height: calc(100vh - var(--topbar-h));
227}
228
229.brand {
230 display: flex;
231 align-items: center;
232 gap: 10px;
233 font-weight: 700;
234 white-space: nowrap;
235}
236
237.brand-name {
238 overflow: hidden;
239 text-overflow: ellipsis;
240}
241
242.logo {
243 width: 26px;
244 height: 26px;
245 flex: none;
246 display: block;
247}
248
249.nav {
250 flex: 1;
251 overflow-y: auto;
252 padding: 14px 8px 16px;
253 display: flex;
254 flex-direction: column;
255 gap: 20px;
256}
257
258.sidebar-user {
259 padding: 0 10px 2px;
260 font-size: 14px;
261 font-weight: 600;
262 overflow: hidden;
263 text-overflow: ellipsis;
264 white-space: nowrap;
265}
266
267.nav-section-label {
268 font-size: 11px;
269 font-weight: 700;
270 text-transform: uppercase;
271 letter-spacing: 0.08em;
272 color: var(--muted);
273 padding: 0 10px 6px;
274}
275
276/* Section header with a right-aligned action (the Files refresh). */
277.nav-section-head {
278 display: flex;
279 align-items: center;
280 justify-content: space-between;
281 gap: 6px;
282}
283
284.nav-section-head .nav-section-label {
285 flex: 1;
286 padding-bottom: 2px;
287}
288
289.nav-section-refresh {
290 color: var(--muted);
291 background: none;
292 border-color: transparent;
293 padding: 3px 5px;
294}
295
296.nav-section-refresh:hover {
297 color: var(--text);
298 border-color: var(--border);
299}
300
301.nav-tab {
302 display: flex;
303 align-items: center;
304 justify-content: flex-start;
305 gap: 10px;
306 width: 100%;
307 margin-bottom: 2px;
308 padding: 8px 10px;
309 text-align: left;
310 background: none;
311 border: none;
312 color: var(--muted);
313 font-size: 14px;
314}
315
316.nav-tab:hover {
317 background: var(--bg);
318 color: var(--text);
319}
320
321.nav-tab.active {
322 background: var(--accent);
323 border-color: var(--accent);
324 color: #fff;
325}
326
327.ic-tab {
328 width: 18px;
329 height: 18px;
330 flex: none;
331}
332
333.nav-tab.active .icon {
334 color: #fff;
335}
336
337.nav-tab-name {
338 flex: 1;
339 min-width: 0;
340 overflow: hidden;
341 text-overflow: ellipsis;
342 white-space: nowrap;
343}
344
345.nav-tab-note {
346 flex: none;
347 font-size: 10px;
348 font-weight: 700;
349 padding: 1px 5px;
350 background: var(--bg);
351 border: 1px solid var(--border);
352 color: var(--muted);
353}
354
355.nav-tab.active .nav-tab-note {
356 background: rgb(255 255 255 / 18%);
357 border-color: rgb(255 255 255 / 30%);
358 color: #fff;
359}
360
361.nav-backdrop {
362 display: none;
363}
364
365/* Sidebar footer: theme toggle, log out, and the project version.
366 Sits at the bottom of the sidebar, below the manage section. */
367.sidebar-footer {
368 flex: none;
369 border-top: 1px solid var(--border);
370 padding: 8px;
371}
372
373.sidebar-footer .nav-tab {
374 margin-bottom: 0;
375}
376
377.sidebar-action.logout {
378 color: var(--danger);
379}
380
381.sidebar-action.logout:hover {
382 color: var(--danger);
383}
384
385.sidebar-version {
386 margin-top: 8px;
387 padding: 0 10px;
388 font-size: 11.5px;
389 color: var(--muted);
390 white-space: nowrap;
391 overflow: hidden;
392 text-overflow: ellipsis;
393}
394
395.badge {
396 font-size: 11px;
397 padding: 2px 8px;
398 background: var(--bg);
399 border: 1px solid var(--border);
400 color: var(--muted);
401}
402
403.content {
404 flex: 1;
405 min-width: 0;
406 min-height: 0;
407 display: flex;
408 flex-direction: column;
409 padding: 20px;
410}
411
412/* While a file is open the app is a fixed-height frame: the file view
413 * (editor, image, …) scrolls inside, the page itself never grows. */
414.layout.file-mode {
415 height: 100vh;
416 overflow: hidden;
417}
418
419.layout.file-mode .body-row {
420 min-height: 0;
421}
422
423/* Narrow screens: the sidebar becomes an off-canvas drawer that only
424 covers the content, below the (always visible) topbar. */
425@media (max-width: 860px) {
426 .sidebar {
427 position: fixed;
428 top: var(--topbar-h);
429 bottom: 0;
430 left: 0;
431 right: auto;
432 height: auto;
433 z-index: 120;
434 transform: translateX(-100%);
435 transition: transform 0.15s ease;
436 }
437
438 .sidebar.open {
439 transform: translateX(0);
440 box-shadow: 0 0 48px rgb(0 0 0 / 35%);
441 }
442
443 .nav-backdrop {
444 display: block;
445 position: fixed;
446 top: var(--topbar-h);
447 bottom: 0;
448 left: 0;
449 right: 0;
450 z-index: 110;
451 background: rgb(0 0 0 / 40%);
452 }
453
454 .icon-btn.nav-toggle {
455 display: inline-flex;
456 }
457
458 .content {
459 padding: 14px;
460 }
461}
462
463/* ---- file browser ---- */
464
465.browser {
466 width: 100%;
467 max-width: 1200px;
468 margin: 0 auto;
469 flex: 1;
470 display: flex;
471 flex-direction: column;
472 min-height: 0;
473}
474
475.icon {
476 width: 20px;
477 height: 20px;
478 display: inline-block;
479 vertical-align: middle;
480}
481
482.ic-folder {
483 color: var(--accent);
484}
485
486.ic-muted {
487 color: var(--muted);
488}
489
490.crumbs {
491 display: flex;
492 align-items: center;
493 gap: 2px;
494 padding: 6px 0 12px;
495 font-size: 15px;
496 flex-wrap: wrap;
497}
498
499.crumb {
500 cursor: pointer;
501 color: var(--muted);
502 padding: 3px 6px;
503}
504
505.crumb:hover {
506 color: var(--text);
507 background: var(--panel);
508}
509
510.crumb.current {
511 color: var(--text);
512 font-weight: 600;
513 cursor: default;
514 background: none;
515}
516
517.crumb-sep {
518 color: var(--muted);
519 padding: 0 1px;
520}
521
522.toolbar {
523 display: flex;
524 align-items: center;
525 justify-content: space-between;
526 gap: 6px;
527 padding-bottom: 12px;
528}
529
530.toolbar-right {
531 display: flex;
532 gap: 6px;
533}
534
535.icon-btn {
536 padding: 7px 9px;
537 border: 1px solid var(--border);
538 background: var(--panel);
539 color: var(--muted);
540 display: inline-flex;
541 align-items: center;
542}
543
544.icon-btn:hover {
545 border-color: var(--muted);
546}
547
548.icon-btn.active {
549 background: var(--accent);
550 border-color: var(--accent);
551 color: #fff;
552}
553
554.ic-btn {
555 width: 18px;
556 height: 18px;
557 color: inherit;
558}
559
560.entries-area {
561 flex: 1;
562 min-height: 240px;
563}
564
565.center-note {
566 text-align: center;
567 padding: 48px 0;
568}
569
570.error-card {
571 display: flex;
572 align-items: center;
573 justify-content: space-between;
574 gap: 16px;
575 color: var(--danger);
576 font-size: 14px;
577}
578
579/* root tiles were replaced by the sidebar's folder tabs */
580
581/* grid view */
582
583.entries-grid {
584 display: grid;
585 grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));
586 gap: 10px;
587}
588
589.tile {
590 background: var(--panel);
591 border: 1px solid var(--border);
592 padding: 16px 10px 12px;
593 text-align: center;
594 cursor: pointer;
595}
596
597.tile:hover {
598 border-color: var(--muted);
599}
600
601.tile-icon {
602 width: 42px;
603 height: 42px;
604 margin: 0 auto 10px;
605 display: block;
606}
607
608.tile-name {
609 font-size: 13px;
610 line-height: 1.3;
611 word-break: break-word;
612}
613
614/* list view */
615
616.entries-list {
617 background: var(--panel);
618 border: 1px solid var(--border);
619 overflow: hidden;
620}
621
622.row {
623 display: grid;
624 grid-template-columns: 28px minmax(0, 1fr) 90px 150px;
625 gap: 12px;
626 align-items: center;
627 padding: 9px 14px;
628 border-bottom: 1px solid var(--border);
629 cursor: pointer;
630 font-size: 14px;
631}
632
633.row:last-child {
634 border-bottom: none;
635}
636
637.row:hover {
638 background: var(--bg);
639}
640
641.row-icon {
642 width: 20px;
643 height: 20px;
644}
645
646.row-name {
647 overflow: hidden;
648 text-overflow: ellipsis;
649 white-space: nowrap;
650}
651
652.row-size,
653.row-date {
654 font-size: 13px;
655 text-align: right;
656}
657
658@media (max-width: 640px) {
659 .row {
660 grid-template-columns: 28px minmax(0, 1fr) 90px;
661 }
662
663 .row-date {
664 display: none;
665 }
666}
667
668/* context menu */
669
670.ctx-menu {
671 position: fixed;
672 z-index: 100;
673 min-width: 190px;
674 background: var(--panel);
675 border: 1px solid var(--border);
676 padding: 5px;
677 box-shadow: 0 8px 24px rgb(0 0 0 / 18%);
678}
679
680.ctx-item {
681 display: flex;
682 align-items: center;
683 gap: 10px;
684 padding: 8px 12px;
685 font-size: 14px;
686 cursor: pointer;
687}
688
689.ic-ctx {
690 width: 18px;
691 height: 18px;
692 flex: none;
693}
694
695.ctx-item:hover {
696 background: var(--bg);
697}
698
699.ctx-item.disabled {
700 opacity: 0.45;
701 cursor: default;
702}
703
704.ctx-item.disabled:hover {
705 background: none;
706}
707
708/* toast */
709
710.toast {
711 position: fixed;
712 bottom: 20px;
713 right: 20px;
714 z-index: 200;
715 background: var(--panel);
716 color: var(--text);
717 border: 1px solid var(--border);
718 padding: 11px 16px;
719 font-size: 14px;
720 box-shadow: 0 8px 24px rgb(0 0 0 / 18%);
721 max-width: 320px;
722}
723
724
725/* ---- modals ---- */
726
727.modal-overlay {
728 position: fixed;
729 inset: 0;
730 background: rgb(0 0 0 / 45%);
731 display: flex;
732 align-items: center;
733 justify-content: center;
734 z-index: 100;
735}
736
737.modal {
738 width: 440px;
739 max-width: calc(100vw - 32px);
740 padding: 20px;
741 background: var(--panel);
742 border: 1px solid var(--border);
743 box-shadow: 0 12px 44px rgb(0 0 0 / 35%);
744}
745
746.modal.picker {
747 width: 520px;
748}
749
750.modal-title {
751 margin: 0 0 12px;
752 font-size: 16px;
753}
754
755.modal-label {
756 display: block;
757 font-size: 13px;
758 color: var(--muted);
759 margin-bottom: 6px;
760}
761
762.modal .input {
763 width: 100%;
764 box-sizing: border-box;
765 margin-bottom: 16px;
766}
767
768.modal-message {
769 white-space: pre-line;
770 font-size: 14px;
771 margin: 0 0 8px;
772}
773
774.modal-actions {
775 display: flex;
776 justify-content: flex-end;
777 gap: 8px;
778 margin-top: 16px;
779}
780
781.btn-danger {
782 background: var(--danger);
783 /* A visible border (one step away from the fill, per theme) so the
784 button's edge reads the same as on neutral buttons. */
785 border-color: var(--danger-border);
786 color: #fff;
787}
788
789.btn-danger:hover {
790 background: color-mix(in srgb, var(--danger) 85%, black);
791}
792
793.btn:disabled {
794 opacity: 0.5;
795 cursor: not-allowed;
796}
797
798.conflict-list {
799 max-height: 200px;
800 overflow-y: auto;
801 margin: 8px 0;
802 padding-left: 20px;
803 font-size: 13px;
804}
805
806.picker-roots {
807 display: flex;
808 gap: 6px;
809 flex-wrap: wrap;
810 margin-bottom: 12px;
811}
812
813.root-opt {
814 font-size: 13px;
815}
816
817.root-opt.active {
818 background: var(--accent);
819 border-color: var(--accent);
820 color: #fff;
821}
822
823.picker-current {
824 font-size: 13px;
825 margin: 0 0 8px;
826}
827
828.picker-crumbs {
829 margin-bottom: 8px;
830}
831
832.picker-entries {
833 max-height: 240px;
834 overflow-y: auto;
835 border: 1px solid var(--border);
836}
837
838.picker-row {
839 display: flex;
840 align-items: center;
841 gap: 10px;
842 padding: 8px 12px;
843 cursor: pointer;
844}
845
846.picker-row:hover {
847 background: var(--bg);
848}
849
850/* ---------------------------------------------------------------------------
851 * Full-page file view (preview / editor / "no preview"). The top bar carries
852 * the title + actions; the content area below is edge to edge.
853 * ------------------------------------------------------------------------- */
854.content.file-open {
855 padding: 0;
856 overflow: hidden;
857}
858
859/* The browser stays mounted (state, fetch callback) but hidden. */
860.content.file-open .browser {
861 display: none;
862}
863
864.file-view {
865 flex: 1;
866 min-height: 0;
867 display: flex;
868 flex-direction: column;
869}
870
871.file-title {
872 display: flex;
873 align-items: center;
874 gap: 8px;
875 min-width: 0;
876}
877
878.file-title-icon {
879 width: 18px;
880 height: 18px;
881 flex: none;
882 color: var(--muted);
883}
884
885.file-title-name {
886 font-weight: 600;
887 font-size: 14px;
888 white-space: nowrap;
889 overflow: hidden;
890 text-overflow: ellipsis;
891}
892
893.file-actions {
894 display: flex;
895 align-items: center;
896 gap: 10px;
897 flex: none;
898}
899
900.file-close {
901 border: none;
902 background: transparent;
903 color: var(--muted);
904 padding: 6px 8px;
905}
906
907.file-close:hover {
908 color: var(--text);
909 background: var(--bg);
910}
911.preview-body {
912 flex: 1;
913 min-height: 0;
914 overflow: auto;
915 display: flex;
916 background: var(--bg);
917}
918.preview-img {
919 max-width: 100%;
920 max-height: 100%;
921 display: block;
922 margin: auto;
923}
924.preview-pdf {
925 width: 100%;
926 height: 100%;
927 border: none;
928 background: #fff;
929}
930.preview-video {
931 width: 100%;
932 max-height: 100%;
933 background: #000;
934}
935.preview-audio {
936 display: flex;
937 align-items: center;
938 justify-content: center;
939 width: 100%;
940 padding: 24px;
941}
942.preview-audio audio {
943 width: 100%;
944 max-width: 480px;
945}
946
947/* CodeMirror (text editor) */
948.cm-container {
949 height: 100%;
950}
951.cm-container .cm-editor {
952 height: 100%;
953}
954/* Load/save failure: dims the editor and shows the message in a card
955 * (the top-bar Save button stays reachable to retry). */
956.cm-error {
957 position: absolute;
958 inset: 0;
959 z-index: 5;
960 display: flex;
961 align-items: center;
962 justify-content: center;
963 padding: 24px;
964 background: rgb(0 0 0 / 45%);
965}
966
967.cm-error-card {
968 position: relative;
969 max-width: 440px;
970 min-width: 200px;
971 background: var(--panel);
972 border: 1px solid var(--border);
973 box-shadow: 0 12px 44px rgb(0 0 0 / 35%);
974}
975
976.cm-error-close {
977 position: absolute;
978 top: 7px;
979 right: 7px;
980 display: inline-flex;
981 align-items: center;
982 justify-content: center;
983 border: none;
984 background: transparent;
985 color: var(--muted);
986 padding: 3px;
987}
988
989.cm-error-close:hover {
990 color: var(--text);
991 background: var(--bg);
992}
993
994.cm-error-close .ic-btn {
995 width: 16px;
996 height: 16px;
997}
998
999.cm-error-text {
1000 padding: 16px 40px 16px 20px;
1001 font-size: 14px;
1002 text-align: center;
1003 overflow-wrap: anywhere;
1004}
1005
1006/* ---------------------------------------------------------------------------
1007 * Text editor (full page; title/save/close live in the top bar)
1008 * ------------------------------------------------------------------------- */
1009.file-editor {
1010 flex: 1;
1011 min-height: 0;
1012 display: flex;
1013 position: relative;
1014 background: var(--bg);
1015}
1016.file-editor .cm-container {
1017 width: 100%;
1018 height: 100%;
1019}
1020/* "No preview" fallback (binaries, archives). */
1021.file-nopreview {
1022 flex: 1;
1023 display: flex;
1024 align-items: center;
1025 justify-content: center;
1026}
1027.file-nopreview .btn-primary {
1028 width: auto;
1029 margin-top: 14px;
1030}
1031/* Conflict / discard dialogs render above the file view. */
1032.editor-sub-overlay {
1033 z-index: 101;
1034 background: rgb(0 0 0 / 25%);
1035}
1036
1037/* ---------------------------------------------------------------------------
1038 * Download format dialog
1039 * ------------------------------------------------------------------------- */
1040.dl-formats {
1041 display: flex;
1042 flex-direction: column;
1043 gap: 8px;
1044 margin-bottom: 8px;
1045}
1046.dl-fmt {
1047 justify-content: flex-start;
1048}
1049
1050/* ---------------------------------------------------------------------------
1051 * Item info dialog
1052 * ------------------------------------------------------------------------- */
1053.info-list {
1054 margin: 8px 0 16px;
1055 display: grid;
1056 grid-template-columns: 90px 1fr;
1057 row-gap: 8px;
1058 column-gap: 12px;
1059}
1060.info-list dt {
1061 color: var(--muted);
1062}
1063.info-list dd {
1064 margin: 0;
1065 word-break: break-word;
1066}
1067
1068/* ---------------------------------------------------------------------------
1069 Shares (milestone 6)
1070 --------------------------------------------------------------------------- */
1071
1072.share-modal {
1073 width: 480px;
1074}
1075
1076.share-link-row {
1077 display: flex;
1078 gap: 8px;
1079 margin: 12px 0;
1080}
1081
1082.share-link-input {
1083 flex: 1;
1084 font-family: ui-monospace, monospace;
1085 font-size: 12.5px;
1086 padding: 8px 10px;
1087 border: 1px solid var(--border);
1088 background: var(--bg);
1089 color: var(--text);
1090 min-width: 0;
1091}
1092
1093.share-check {
1094 display: flex;
1095 align-items: center;
1096 gap: 8px;
1097 margin: 4px 0 14px;
1098 font-size: 14px;
1099}
1100
1101.share-check input {
1102 width: 16px;
1103 height: 16px;
1104}
1105
1106.share-expiry-row {
1107 display: flex;
1108 align-items: center;
1109 gap: 10px;
1110 margin: 0 0 10px;
1111}
1112
1113.share-expiry-row label {
1114 font-size: 13px;
1115 color: var(--muted);
1116 min-width: 52px;
1117}
1118
1119.share-expiry-row select,
1120.share-expiry-row input {
1121 flex: 1;
1122 padding: 8px 10px;
1123 border: 1px solid var(--border);
1124 background: var(--panel);
1125 color: var(--text);
1126 font: inherit;
1127}
1128
1129.share-expiry-note {
1130 margin: 4px 0 0;
1131 font-size: 12.5px;
1132}
1133
1134.btn-sm {
1135 padding: 5px 10px;
1136 font-size: 12.5px;
1137}
1138
1139.icon-btn-sm {
1140 padding: 4px 6px;
1141}
1142
1143/* "Your shares" manage view */
1144
1145.shares-view {
1146 width: 100%;
1147 max-width: 960px;
1148 margin: 0 auto;
1149}
1150
1151.view-header {
1152 margin-bottom: 16px;
1153}
1154
1155.view-header .admin-section-title {
1156 margin-bottom: 0;
1157}
1158
1159.view-hint {
1160 margin: 4px 0 0;
1161 font-size: 13px;
1162 max-width: 64ch;
1163}
1164
1165.share-list {
1166 display: flex;
1167 flex-direction: column;
1168 gap: 10px;
1169}
1170
1171.share-item {
1172 display: flex;
1173 align-items: center;
1174 justify-content: space-between;
1175 gap: 12px;
1176 padding: 10px 12px;
1177 border: 1px solid var(--border);
1178 background: var(--panel);
1179}
1180
1181.share-item-main {
1182 min-width: 0;
1183}
1184
1185.share-item-name {
1186 display: flex;
1187 align-items: center;
1188 gap: 8px;
1189 font-weight: 600;
1190 font-size: 14px;
1191 overflow: hidden;
1192 text-overflow: ellipsis;
1193 white-space: nowrap;
1194}
1195
1196.ic-row {
1197 width: 18px;
1198 height: 18px;
1199 flex: none;
1200}
1201
1202.share-item-meta {
1203 font-size: 12px;
1204 margin-top: 2px;
1205 overflow: hidden;
1206 text-overflow: ellipsis;
1207 white-space: nowrap;
1208}
1209
1210.share-item-actions {
1211 display: flex;
1212 gap: 6px;
1213 flex-shrink: 0;
1214}
1215
1216/* ------------------------------------------------------------------ */
1217/* Admin (milestone 7) */
1218/* ------------------------------------------------------------------ */
1219
1220.admin-view {
1221 display: flex;
1222 flex-direction: column;
1223 gap: 16px;
1224 width: 100%;
1225 max-width: 960px;
1226 margin: 0 auto;
1227}
1228
1229.admin-section-title {
1230 margin: 0 0 14px;
1231 font-size: 15px;
1232}
1233
1234.users-header {
1235 display: flex;
1236 align-items: center;
1237 justify-content: space-between;
1238 margin-bottom: 4px;
1239}
1240
1241.users-header .admin-section-title {
1242 margin-bottom: 0;
1243}
1244
1245.users-header .btn-primary {
1246 width: auto;
1247}
1248
1249.user-list {
1250 display: flex;
1251 flex-direction: column;
1252 gap: 10px;
1253}
1254
1255.user-row {
1256 display: flex;
1257 align-items: center;
1258 justify-content: space-between;
1259 gap: 12px;
1260 padding: 12px 14px;
1261 border: 1px solid var(--border);
1262}
1263
1264.user-row-main {
1265 min-width: 0;
1266}
1267
1268.user-row-name {
1269 display: flex;
1270 align-items: center;
1271 gap: 6px;
1272 font-weight: 600;
1273 font-size: 14px;
1274 flex-wrap: wrap;
1275}
1276
1277.ic-admin {
1278 width: 16px;
1279 height: 16px;
1280 flex: none;
1281}
1282
1283.user-row-actions {
1284 display: flex;
1285 gap: 6px;
1286 flex-shrink: 0;
1287}
1288
1289.badge-off {
1290 background: color-mix(in srgb, var(--danger) 15%, var(--panel));
1291 border-color: var(--danger);
1292 color: var(--danger);
1293}
1294
1295.setting-row {
1296 display: flex;
1297 align-items: flex-start;
1298 gap: 10px;
1299 padding: 14px;
1300 border: 1px solid var(--border);
1301 cursor: pointer;
1302}
1303
1304.setting-row input {
1305 width: auto;
1306 margin-top: 2px;
1307}
1308
1309.setting-label {
1310 display: block;
1311 font-weight: 600;
1312 font-size: 14px;
1313}
1314
1315.setting-desc {
1316 display: block;
1317 font-size: 12px;
1318 color: var(--muted);
1319 margin-top: 2px;
1320}
1321
1322/* User create/edit form */
1323
1324.user-form {
1325 width: 520px;
1326}
1327
1328.field-input {
1329 width: 100%;
1330 box-sizing: border-box;
1331}
1332
1333.field-hint {
1334 font-size: 12px;
1335 margin: -2px 0 8px;
1336}
1337
1338.check-row {
1339 display: flex;
1340 align-items: center;
1341 gap: 8px;
1342 font-size: 14px;
1343 margin-bottom: 12px;
1344 cursor: pointer;
1345}
1346
1347.check-row input {
1348 width: auto;
1349}
1350
1351.form-error {
1352 color: var(--danger);
1353 font-size: 13px;
1354 margin: 4px 0 8px;
1355}
1356
1357.roots-editor {
1358 display: flex;
1359 flex-direction: column;
1360 gap: 6px;
1361}
1362
1363.root-draft {
1364 display: flex;
1365 align-items: center;
1366 gap: 8px;
1367}
1368
1369.root-draft-path {
1370 flex: 1;
1371 font-size: 13px;
1372 overflow: hidden;
1373 text-overflow: ellipsis;
1374 white-space: nowrap;
1375}
1376
1377.root-draft-mode {
1378 width: auto;
1379 padding: 6px 8px;
1380}
1381
1382.root-add {
1383 display: flex;
1384 gap: 8px;
1385 margin-top: 4px;
1386}
1387
1388/* ------------------------------------------------------------------ */
1389/* Empty state + keyboard focus (milestone 8) */
1390/* ------------------------------------------------------------------ */
1391
1392.empty-state {
1393 display: flex;
1394 flex-direction: column;
1395 align-items: center;
1396 justify-content: center;
1397 gap: 8px;
1398 padding: 64px 20px;
1399 text-align: center;
1400}
1401
1402.empty-glyph {
1403 width: 52px;
1404 height: 52px;
1405}
1406
1407.empty-state h3 {
1408 margin: 0;
1409 font-size: 16px;
1410}
1411
1412/* Visible keyboard focus on selectable file/folder entries. */
1413.tile:focus-visible,
1414.row:focus-visible {
1415 outline: 2px solid var(--accent);
1416 outline-offset: 2px;
1417}
1418