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