| 16 |
16 |
margin: 0; |
| 17 |
17 |
background: var(--bg); |
| 18 |
18 |
color: var(--text); |
| 19 |
|
− font: 14px/1.5 var(--font-sans); |
|
19 |
+ font: 14px/1.55 var(--font-sans); |
|
20 |
+ letter-spacing: -0.01em; |
| 20 |
21 |
-webkit-font-smoothing: antialiased; |
| 21 |
|
−} |
| 22 |
|
−a { color: var(--accent); text-decoration: none; } |
|
22 |
+ text-rendering: optimizeLegibility; |
|
23 |
+} |
|
24 |
+/* Signature aurora wash — a whisper of the brand at the top of every page. */ |
|
25 |
+body::before { |
|
26 |
+ content: ''; |
|
27 |
+ position: fixed; inset: 0; z-index: -1; pointer-events: none; |
|
28 |
+ background: |
|
29 |
+ radial-gradient(46rem 24rem at 12% -6%, var(--aurora-a), transparent 60%), |
|
30 |
+ radial-gradient(40rem 22rem at 88% -8%, var(--aurora-b), transparent 60%), |
|
31 |
+ radial-gradient(30rem 18rem at 55% -12%, var(--aurora-c), transparent 65%); |
|
32 |
+} |
|
33 |
+a { color: var(--accent-ink); text-decoration: none; } |
| 23 |
34 |
a:hover { text-decoration: underline; } |
| 24 |
|
−button { font: inherit; color: inherit; } |
|
35 |
+button { font: inherit; color: inherit; letter-spacing: inherit; } |
| 25 |
36 |
::selection { background: var(--accent-soft); } |
| 26 |
37 |
:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; } |
|
38 |
+@media (prefers-reduced-motion: reduce) { |
|
39 |
+ *, *::before, *::after { animation-duration: 0.01ms !important; transition-duration: 0.01ms !important; } |
|
40 |
+} |
| 27 |
41 |
|
| 28 |
42 |
/* ── Primitives ─────────────────────────────────────────────── */ |
| 29 |
43 |
.btn { |
| 30 |
44 |
display: inline-flex; align-items: center; gap: 7px; |
| 31 |
|
− padding: 7px 14px; border-radius: var(--radius-sm); |
| 32 |
|
− border: 1px solid var(--border); background: var(--surface-2); |
| 33 |
|
− cursor: pointer; transition: border-color 150ms var(--ease), background 150ms var(--ease); |
|
45 |
+ padding: 7px 14px; border-radius: 999px; |
|
46 |
+ border: 1px solid var(--border); background: var(--surface); |
|
47 |
+ cursor: pointer; |
|
48 |
+ transition: border-color 150ms var(--ease), background 150ms var(--ease), |
|
49 |
+ box-shadow 150ms var(--ease), transform 150ms var(--spring); |
| 34 |
50 |
white-space: nowrap; user-select: none; |
| 35 |
51 |
} |
| 36 |
|
−.btn:hover { border-color: var(--muted); } |
| 37 |
|
−.btn.primary { background: var(--accent); border-color: var(--accent); color: #fff; font-weight: 600; } |
| 38 |
|
−.btn.primary:hover { filter: brightness(1.08); } |
|
52 |
+.btn:hover { border-color: var(--border-strong); box-shadow: var(--shadow-1); } |
|
53 |
+.btn:active { transform: scale(0.97); } |
|
54 |
+.btn.primary { |
|
55 |
+ background: var(--grad-brand); border-color: transparent; color: #fff; font-weight: 600; |
|
56 |
+ box-shadow: 0 2px 10px rgba(79, 70, 229, 0.28); |
|
57 |
+} |
|
58 |
+.btn.primary:hover { filter: brightness(1.06); box-shadow: 0 4px 16px rgba(79, 70, 229, 0.36); } |
| 39 |
59 |
.btn.danger { color: var(--danger); } |
| 40 |
60 |
.btn.danger:hover { border-color: var(--danger); background: var(--danger-soft); } |
| 41 |
|
−.btn.ghost { background: transparent; border-color: transparent; } |
| 42 |
|
−.btn.ghost:hover { background: var(--surface-2); border-color: transparent; } |
| 43 |
|
−.btn.icon { padding: 7px; } |
|
61 |
+.btn.ghost { background: transparent; border-color: transparent; box-shadow: none; } |
|
62 |
+.btn.ghost:hover { background: var(--surface-2); border-color: transparent; box-shadow: none; } |
|
63 |
+.btn.icon { padding: 7px; border-radius: 11px; } |
| 44 |
64 |
.btn:disabled { opacity: 0.45; cursor: default; pointer-events: none; } |
| 45 |
65 |
.btn svg { width: 16px; height: 16px; flex: none; } |
| 46 |
66 |
|
| 52 |
72 |
transition: border-color 150ms var(--ease); |
| 53 |
73 |
} |
| 54 |
74 |
input:focus, select:focus, textarea:focus { border-color: var(--accent); outline: none; } |
|
75 |
+input[type='range'], input[type='checkbox'], input[type='radio'] { accent-color: var(--accent); } |
| 55 |
76 |
label.field { display: block; margin-bottom: 12px; } |
| 56 |
77 |
label.field > span { display: block; font-size: 12px; color: var(--muted); margin-bottom: 5px; font-weight: 500; } |
| 57 |
78 |
|
| 61 |
82 |
border: 1px solid var(--border); background: var(--surface-2); color: var(--muted); |
| 62 |
83 |
cursor: pointer; user-select: none; |
| 63 |
84 |
} |
| 64 |
|
−.chip.active { border-color: var(--accent); color: var(--accent); background: var(--accent-soft); } |
|
85 |
+.chip.active { border-color: var(--accent); color: var(--accent-ink); background: var(--accent-soft); } |
| 65 |
86 |
.chip .dot { width: 8px; height: 8px; border-radius: 50%; } |
| 66 |
87 |
|
| 67 |
88 |
kbd { |
| 77 |
98 |
/* ── Login ──────────────────────────────────────────────────── */ |
| 78 |
99 |
.login-wrap { min-height: 100%; display: grid; place-items: center; padding: 24px; } |
| 79 |
100 |
.login-card { |
| 80 |
|
− width: 360px; max-width: 100%; background: var(--surface); |
| 81 |
|
− border: 1px solid var(--border); border-radius: var(--radius); |
| 82 |
|
− padding: 36px 32px; |
|
101 |
+ width: 372px; max-width: 100%; background: var(--surface); |
|
102 |
+ border: 1px solid var(--border); border-radius: var(--radius-lg); |
|
103 |
+ padding: 40px 34px; box-shadow: var(--shadow-2); |
| 83 |
104 |
} |
| 84 |
105 |
.login-logo { |
| 85 |
|
− width: 52px; height: 52px; border-radius: 14px; margin: 0 auto 18px; |
| 86 |
|
− background: linear-gradient(135deg, var(--accent), var(--accent-2)); |
|
106 |
+ width: 56px; height: 56px; border-radius: 18px; margin: 0 auto 18px; |
|
107 |
+ background: var(--grad-brand); |
| 87 |
108 |
display: grid; place-items: center; color: #fff; |
| 88 |
109 |
font: 700 19px var(--font-mono); letter-spacing: -0.5px; |
|
110 |
+ box-shadow: 0 6px 20px rgba(79, 70, 229, 0.3); |
| 89 |
111 |
} |
| 90 |
112 |
.login-card h1 { font-size: 19px; text-align: center; margin: 0 0 4px; } |
| 91 |
113 |
.login-card .sub { text-align: center; color: var(--muted); font-size: 13px; margin: 0 0 24px; } |
| 98 |
120 |
.login-card .btn { width: 100%; justify-content: center; padding: 10px; } |
| 99 |
121 |
|
| 100 |
122 |
/* ── App shell ──────────────────────────────────────────────── */ |
| 101 |
|
−.shell { display: grid; grid-template-rows: 56px 1fr; height: 100vh; } |
|
123 |
+.shell { display: grid; grid-template-rows: 60px 1fr; height: 100vh; height: 100dvh; } |
| 102 |
124 |
.topbar { |
| 103 |
125 |
display: flex; align-items: center; gap: 14px; padding: 0 16px; |
| 104 |
|
− background: var(--surface); border-bottom: 1px solid var(--border); |
|
126 |
+ background: var(--surface-glass); |
|
127 |
+ -webkit-backdrop-filter: blur(14px); backdrop-filter: blur(14px); |
|
128 |
+ border-bottom: 1px solid var(--border); |
|
129 |
+ position: relative; z-index: 10; |
| 105 |
130 |
} |
| 106 |
|
−.brand { display: flex; align-items: center; gap: 10px; font-weight: 700; font-size: 15px; white-space: nowrap; } |
|
131 |
+.brand { display: flex; align-items: center; gap: 10px; font-weight: 700; font-size: 15px; white-space: nowrap; letter-spacing: -0.02em; } |
| 107 |
132 |
.brand .mark { |
| 108 |
|
− width: 30px; height: 30px; border-radius: 9px; |
| 109 |
|
− background: linear-gradient(135deg, var(--accent), var(--accent-2)); |
|
133 |
+ width: 32px; height: 32px; border-radius: 10px; |
|
134 |
+ background: var(--grad-brand); |
| 110 |
135 |
display: grid; place-items: center; color: #fff; font: 700 12px var(--font-mono); |
|
136 |
+ box-shadow: 0 3px 10px rgba(79, 70, 229, 0.28); |
| 111 |
137 |
} |
| 112 |
138 |
.searchbox { flex: 1; max-width: 560px; position: relative; } |
| 113 |
|
−.searchbox svg { position: absolute; left: 10px; top: 50%; translate: 0 -50%; width: 15px; height: 15px; color: var(--muted); pointer-events: none; } |
| 114 |
|
−.searchbox input { padding-left: 32px; background: var(--surface-2); border-radius: 8px; } |
|
139 |
+.searchbox svg { position: absolute; left: 13px; top: 50%; translate: 0 -50%; width: 15px; height: 15px; color: var(--muted); pointer-events: none; } |
|
140 |
+.searchbox input { |
|
141 |
+ padding-left: 36px; background: var(--surface-2); border-radius: 999px; |
|
142 |
+ border-color: transparent; |
|
143 |
+} |
|
144 |
+.searchbox input:focus { background: var(--surface); border-color: var(--accent); box-shadow: var(--shadow-1); } |
| 115 |
145 |
.topbar .spacer { flex: 1; } |
| 116 |
146 |
|
| 117 |
147 |
.body { display: grid; grid-template-columns: 248px 1fr; min-height: 0; } |
| 119 |
149 |
|
| 120 |
150 |
/* Sidebar */ |
| 121 |
151 |
.sidebar { |
| 122 |
|
− background: var(--surface); border-right: 1px solid var(--border); |
|
152 |
+ background: transparent; border-right: 1px solid var(--border); |
| 123 |
153 |
padding: 14px 10px; overflow-y: auto; display: flex; flex-direction: column; gap: 4px; |
| 124 |
154 |
} |
| 125 |
|
−.new-btn { margin: 0 4px 12px; justify-content: center; font-weight: 600; } |
|
155 |
+.sidebar-scrim { |
|
156 |
+ position: fixed; inset: 0; z-index: 64; background: var(--scrim); |
|
157 |
+ display: none; -webkit-backdrop-filter: blur(2px); backdrop-filter: blur(2px); |
|
158 |
+} |
|
159 |
+.new-btn { margin: 0 4px 12px; justify-content: center; font-weight: 600; padding: 10px; } |
| 126 |
160 |
.nav-item { |
| 127 |
161 |
display: flex; align-items: center; gap: 10px; padding: 7px 12px; |
| 128 |
162 |
border-radius: var(--radius-sm); color: var(--text); cursor: pointer; |
| 130 |
164 |
} |
| 131 |
165 |
.nav-item svg { width: 16px; height: 16px; color: var(--muted); flex: none; } |
| 132 |
166 |
.nav-item:hover { background: var(--surface-2); } |
| 133 |
|
−.nav-item.active { background: var(--accent-soft); color: var(--accent); } |
| 134 |
|
−.nav-item.active svg { color: var(--accent); } |
|
167 |
+.nav-item.active { background: var(--accent-soft); color: var(--accent-ink); font-weight: 600; } |
|
168 |
+.nav-item.active svg { color: var(--accent-ink); } |
| 135 |
169 |
.nav-item .count { margin-left: auto; font-size: 11px; color: var(--muted); } |
| 136 |
170 |
.nav-section { font-size: 11px; font-weight: 600; text-transform: uppercase; letter-spacing: 0.07em; color: var(--muted); padding: 14px 12px 4px; } |
| 137 |
171 |
|
| 154 |
188 |
.tree-label svg { width: 15px; height: 15px; flex: none; } |
| 155 |
189 |
|
| 156 |
190 |
.storage-meter { margin-top: auto; padding: 14px 12px 6px; border-top: 1px solid var(--border); } |
| 157 |
|
−.storage-meter .bar { height: 5px; border-radius: 3px; background: var(--surface-2); overflow: hidden; display: flex; margin: 8px 0 6px; } |
| 158 |
|
−.storage-meter .bar i { height: 100%; display: block; } |
|
191 |
+/* 2px surface gaps between stacked segments (mark spec) */ |
|
192 |
+.storage-meter .bar { height: 6px; border-radius: 3px; background: var(--surface-2); overflow: hidden; display: flex; gap: 2px; margin: 8px 0 6px; } |
|
193 |
+.storage-meter .bar i { height: 100%; display: block; border-radius: 2px; } |
| 159 |
194 |
.storage-meter .legend { display: flex; flex-wrap: wrap; gap: 4px 12px; font-size: 11px; color: var(--muted); } |
| 160 |
195 |
.storage-meter .legend .dot { width: 7px; height: 7px; border-radius: 50%; display: inline-block; margin-right: 4px; } |
| 161 |
196 |
|
| 176 |
211 |
.crumb-sep { color: var(--muted); opacity: 0.5; } |
| 177 |
212 |
|
| 178 |
213 |
.sel-toolbar { display: flex; align-items: center; gap: 6px; } |
| 179 |
|
−.sel-count { font-size: 13px; color: var(--accent); font-weight: 600; margin-right: 6px; } |
|
214 |
+.sel-count { font-size: 13px; color: var(--accent-ink); font-weight: 600; margin-right: 6px; } |
| 180 |
215 |
|
| 181 |
216 |
.content { flex: 1; overflow-y: auto; padding: 14px 18px 80px; position: relative; } |
| 182 |
217 |
|
| 183 |
218 |
/* Grid view */ |
| 184 |
|
−.grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(var(--card, 168px), 1fr)); gap: 12px; } |
|
219 |
+.grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(var(--card, 168px), 1fr)); gap: 14px; } |
| 185 |
220 |
.card { |
| 186 |
221 |
background: var(--surface); border: 1px solid var(--border); border-radius: var(--radius); |
| 187 |
222 |
overflow: hidden; cursor: default; position: relative; user-select: none; |
| 188 |
|
− transition: border-color 150ms var(--ease), background 150ms var(--ease); |
|
223 |
+ box-shadow: var(--shadow-1); |
|
224 |
+ transition: border-color 150ms var(--ease), background 150ms var(--ease), |
|
225 |
+ box-shadow 180ms var(--ease), transform 180ms var(--spring); |
| 189 |
226 |
} |
| 190 |
|
−.card:hover { border-color: var(--muted); } |
| 191 |
|
−.card.selected { border-color: var(--accent); background: var(--accent-soft); } |
|
227 |
+.card:hover { border-color: var(--border-strong); box-shadow: var(--shadow-2); transform: translateY(-2px); } |
|
228 |
+.card.selected { border-color: transparent; box-shadow: var(--ring), var(--shadow-1); background: var(--accent-soft); } |
| 192 |
229 |
.card.drop-target { outline: 2px dashed var(--accent); outline-offset: -2px; } |
| 193 |
230 |
.card .thumb { |
| 194 |
231 |
aspect-ratio: 4/3; display: grid; place-items: center; background: var(--surface-2); |
| 261 |
298 |
|
| 262 |
299 |
/* ── Context menu ───────────────────────────────────────────── */ |
| 263 |
300 |
.ctx-menu { |
| 264 |
|
− position: fixed; z-index: 80; min-width: 210px; |
| 265 |
|
− background: var(--surface); border: 1px solid var(--border); border-radius: var(--radius); |
| 266 |
|
− box-shadow: var(--shadow-pop); padding: 5px; animation: pop 120ms var(--ease); |
| 267 |
|
−} |
| 268 |
|
−@keyframes pop { from { opacity: 0; transform: scale(0.97); } } |
|
301 |
+ position: fixed; z-index: 80; min-width: 218px; |
|
302 |
+ background: var(--surface-glass); |
|
303 |
+ -webkit-backdrop-filter: blur(16px); backdrop-filter: blur(16px); |
|
304 |
+ border: 1px solid var(--border); border-radius: var(--radius); |
|
305 |
+ box-shadow: var(--shadow-pop); padding: 6px; animation: pop 130ms var(--spring); |
|
306 |
+} |
|
307 |
+@keyframes pop { from { opacity: 0; transform: scale(0.96) translateY(3px); } } |
|
308 |
+/* Mobile: context menu as a bottom sheet */ |
|
309 |
+.ctx-menu.sheet { |
|
310 |
+ left: 0 !important; right: 0; top: auto !important; bottom: 0; |
|
311 |
+ min-width: 0; border-radius: var(--radius-lg) var(--radius-lg) 0 0; |
|
312 |
+ padding: 10px 12px calc(14px + env(safe-area-inset-bottom)); |
|
313 |
+ animation: sheet-up 220ms var(--spring); |
|
314 |
+ max-height: 70vh; overflow-y: auto; |
|
315 |
+} |
|
316 |
+.ctx-menu.sheet::before { |
|
317 |
+ content: ''; display: block; width: 40px; height: 4px; border-radius: 2px; |
|
318 |
+ background: var(--border-strong); margin: 0 auto 10px; |
|
319 |
+} |
|
320 |
+.ctx-menu.sheet .ctx-item { padding: 13px 14px; font-size: 15px; border-radius: var(--radius-sm); } |
|
321 |
+.ctx-menu.sheet .ctx-item svg { width: 18px; height: 18px; } |
|
322 |
+@keyframes sheet-up { from { transform: translateY(40%); opacity: 0.4; } } |
| 269 |
323 |
.ctx-item { |
| 270 |
324 |
display: flex; align-items: center; gap: 10px; width: 100%; |
| 271 |
325 |
padding: 7px 11px; border: none; background: none; border-radius: var(--radius-sm); |
| 281 |
335 |
.ctx-colors button { width: 18px; height: 18px; border-radius: 50%; border: 2px solid transparent; cursor: pointer; } |
| 282 |
336 |
.ctx-colors button:hover { border-color: var(--text); } |
| 283 |
337 |
|
| 284 |
|
−/* ── Toasts ─────────────────────────────────────────────────── */ |
| 285 |
|
−.toasts { position: fixed; bottom: 20px; left: 50%; translate: -50% 0; z-index: 95; display: flex; flex-direction: column; gap: 8px; align-items: center; } |
|
338 |
+/* ── Toasts — inverted pills, readable over any content ─────── */ |
|
339 |
+.toasts { |
|
340 |
+ position: fixed; bottom: calc(20px + env(safe-area-inset-bottom)); |
|
341 |
+ left: 50%; translate: -50% 0; z-index: 95; |
|
342 |
+ display: flex; flex-direction: column; gap: 8px; align-items: center; |
|
343 |
+} |
| 286 |
344 |
.toast { |
| 287 |
345 |
display: flex; align-items: center; gap: 12px; |
| 288 |
|
− background: var(--surface); border: 1px solid var(--border); border-radius: var(--radius); |
| 289 |
|
− box-shadow: var(--shadow-pop); padding: 10px 16px; font-size: 13px; |
| 290 |
|
− animation: toast-in 200ms var(--ease); |
|
346 |
+ background: var(--text); color: var(--bg); border: none; border-radius: 999px; |
|
347 |
+ box-shadow: var(--shadow-pop); padding: 11px 20px; font-size: 13px; font-weight: 500; |
|
348 |
+ animation: toast-in 240ms var(--spring); |
| 291 |
349 |
} |
| 292 |
|
−@keyframes toast-in { from { translate: 0 12px; opacity: 0; } } |
| 293 |
|
−.toast button { background: none; border: none; color: var(--accent); font-weight: 600; cursor: pointer; padding: 0; } |
| 294 |
|
−.toast.error { border-color: var(--danger); } |
|
350 |
+@keyframes toast-in { from { translate: 0 16px; opacity: 0; } } |
|
351 |
+.toast button { background: none; border: none; color: var(--accent-2); font-weight: 700; cursor: pointer; padding: 0; } |
|
352 |
+.toast.error { box-shadow: 0 0 0 2px var(--danger), var(--shadow-pop); } |
| 295 |
353 |
|
| 296 |
354 |
/* ── Modals ─────────────────────────────────────────────────── */ |
| 297 |
|
−.modal-scrim { position: fixed; inset: 0; background: var(--scrim); z-index: 70; display: grid; place-items: center; animation: fade 150ms var(--ease); } |
|
355 |
+.modal-scrim { |
|
356 |
+ position: fixed; inset: 0; background: var(--scrim); z-index: 70; |
|
357 |
+ display: grid; place-items: center; animation: fade 150ms var(--ease); |
|
358 |
+ -webkit-backdrop-filter: blur(4px); backdrop-filter: blur(4px); |
|
359 |
+} |
| 298 |
360 |
@keyframes fade { from { opacity: 0; } } |
| 299 |
361 |
.modal { |
| 300 |
|
− width: 440px; max-width: calc(100vw - 32px); max-height: 86vh; overflow-y: auto; |
| 301 |
|
− background: var(--surface); border: 1px solid var(--border); border-radius: var(--radius); |
| 302 |
|
− box-shadow: var(--shadow-pop); padding: 22px; animation: pop 150ms var(--ease); |
|
362 |
+ width: 448px; max-width: calc(100vw - 32px); max-height: 86vh; overflow-y: auto; |
|
363 |
+ background: var(--surface); border: 1px solid var(--border); border-radius: var(--radius-lg); |
|
364 |
+ box-shadow: var(--shadow-pop); padding: 24px; animation: pop 160ms var(--spring); |
| 303 |
365 |
} |
| 304 |
|
−.modal h2 { font-size: 16px; margin: 0 0 16px; } |
|
366 |
+.modal h2 { font-size: 16px; margin: 0 0 16px; letter-spacing: -0.02em; } |
| 305 |
367 |
.modal .actions { display: flex; justify-content: flex-end; gap: 8px; margin-top: 20px; } |
| 306 |
368 |
.modal.wide { width: 620px; } |
| 307 |
369 |
|
| 316 |
378 |
|
| 317 |
379 |
/* ── Upload panel ───────────────────────────────────────────── */ |
| 318 |
380 |
.upload-panel { |
| 319 |
|
− position: fixed; right: 18px; bottom: 18px; width: 360px; z-index: 60; |
|
381 |
+ position: fixed; right: 18px; bottom: calc(18px + env(safe-area-inset-bottom)); |
|
382 |
+ width: 360px; z-index: 60; |
| 320 |
383 |
background: var(--surface); border: 1px solid var(--border); border-radius: var(--radius); |
| 321 |
384 |
box-shadow: var(--shadow-pop); overflow: hidden; display: none; |
| 322 |
385 |
} |
| 350 |
413 |
.drop-overlay svg { width: 44px; height: 44px; } |
| 351 |
414 |
|
| 352 |
415 |
/* ── Preview overlay ────────────────────────────────────────── */ |
| 353 |
|
−.preview-overlay { position: fixed; inset: 0; z-index: 85; background: var(--scrim); display: flex; flex-direction: column; animation: fade 150ms var(--ease); } |
|
416 |
+.preview-overlay { position: fixed; inset: 0; z-index: 85; background: var(--scrim-heavy); display: flex; flex-direction: column; animation: fade 150ms var(--ease); } |
| 354 |
417 |
.preview-head { display: flex; align-items: center; gap: 12px; padding: 12px 18px; color: #fff; } |
| 355 |
418 |
.preview-head .title { font-weight: 600; font-size: 14px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } |
| 356 |
419 |
.preview-head .size { color: rgba(255,255,255,0.6); font-size: 12px; white-space: nowrap; } |
| 495 |
558 |
@keyframes indeterminate { from { margin-left: -40%; } to { margin-left: 100%; } } |
| 496 |
559 |
|
| 497 |
560 |
/* ── Share pages (public) ───────────────────────────────────── */ |
| 498 |
|
−.share-page { min-height: 100vh; display: flex; flex-direction: column; } |
| 499 |
|
−.share-topbar { display: flex; align-items: center; gap: 12px; padding: 14px 22px; border-bottom: 1px solid var(--border); background: var(--surface); } |
|
561 |
+.share-page { min-height: 100vh; min-height: 100dvh; display: flex; flex-direction: column; } |
|
562 |
+.share-topbar { |
|
563 |
+ display: flex; align-items: center; gap: 12px; |
|
564 |
+ padding: calc(14px + env(safe-area-inset-top)) 22px 14px; |
|
565 |
+ border-bottom: 1px solid var(--border); |
|
566 |
+ background: var(--surface-glass); |
|
567 |
+ -webkit-backdrop-filter: blur(14px); backdrop-filter: blur(14px); |
|
568 |
+ position: sticky; top: 0; z-index: 5; |
|
569 |
+} |
| 500 |
570 |
.share-main { flex: 1; display: flex; flex-direction: column; padding: 26px 22px; max-width: 1080px; margin: 0 auto; width: 100%; } |
| 501 |
571 |
.share-main.wide { max-width: 1280px; } |
| 502 |
572 |
.share-file-head { display: flex; align-items: center; gap: 14px; margin-bottom: 20px; flex-wrap: wrap; } |
| 599 |
669 |
.request-card .upload-list { margin-top: 14px; max-height: 320px; } |
| 600 |
670 |
.request-card .upload-item { border-top: 1px solid var(--border); padding: 9px 4px; } |
| 601 |
671 |
|
|
672 |
+/* ── Bottom navigation (mobile app bar) ─────────────────────── */ |
|
673 |
+.bottomnav { |
|
674 |
+ position: fixed; left: 0; right: 0; bottom: 0; z-index: 62; |
|
675 |
+ display: none; align-items: center; justify-content: space-around; |
|
676 |
+ padding: 8px 10px calc(8px + env(safe-area-inset-bottom)); |
|
677 |
+ background: var(--surface-glass); |
|
678 |
+ -webkit-backdrop-filter: blur(16px); backdrop-filter: blur(16px); |
|
679 |
+ border-top: 1px solid var(--border); |
|
680 |
+} |
|
681 |
+.bottomnav button { |
|
682 |
+ background: none; border: none; cursor: pointer; color: var(--muted); |
|
683 |
+ width: 52px; height: 42px; border-radius: 13px; |
|
684 |
+ display: grid; place-items: center; |
|
685 |
+ transition: color 150ms var(--ease), background 150ms var(--ease), transform 150ms var(--spring); |
|
686 |
+} |
|
687 |
+.bottomnav button svg { width: 21px; height: 21px; } |
|
688 |
+.bottomnav button:active { transform: scale(0.92); } |
|
689 |
+.bottomnav button.active { color: var(--accent-ink); background: var(--accent-soft); } |
|
690 |
+.bottomnav .bn-fab { |
|
691 |
+ width: 54px; height: 54px; border-radius: 18px; margin-top: -22px; |
|
692 |
+ background: var(--grad-brand); color: #fff; |
|
693 |
+ box-shadow: 0 6px 20px rgba(79, 70, 229, 0.4); |
|
694 |
+} |
|
695 |
+.bottomnav .bn-fab svg { width: 24px; height: 24px; } |
|
696 |
+.bottomnav .bn-fab.active { color: #fff; } |
|
697 |
+ |
| 602 |
698 |
/* ── Responsive ─────────────────────────────────────────────── */ |
| 603 |
699 |
.sidebar-toggle { display: none; } |
|
700 |
+ |
| 604 |
701 |
@media (max-width: 900px) { |
| 605 |
702 |
.body, .body.info-open { grid-template-columns: 1fr; } |
| 606 |
703 |
.sidebar { |
| 607 |
|
− position: fixed; z-index: 65; top: 56px; bottom: 0; left: 0; width: 264px; |
| 608 |
|
− translate: -100% 0; transition: translate 200ms var(--ease); box-shadow: var(--shadow-pop); |
|
704 |
+ position: fixed; z-index: 65; top: 0; bottom: 0; left: 0; |
|
705 |
+ width: min(300px, 84vw); padding-top: calc(14px + env(safe-area-inset-top)); |
|
706 |
+ background: var(--surface); |
|
707 |
+ border-radius: 0 var(--radius-lg) var(--radius-lg) 0; |
|
708 |
+ translate: -102% 0; transition: translate 240ms var(--spring); |
|
709 |
+ box-shadow: var(--shadow-pop); |
| 609 |
710 |
} |
| 610 |
711 |
.sidebar.open { translate: 0 0; } |
|
712 |
+ .sidebar-scrim.active { display: block; animation: fade 180ms var(--ease); } |
| 611 |
713 |
.sidebar-toggle { display: inline-flex; } |
| 612 |
|
− .info-panel { position: fixed; z-index: 65; top: 56px; bottom: 0; right: 0; width: min(320px, 88vw); box-shadow: var(--shadow-pop); } |
| 613 |
|
− .body.info-open .info-panel { display: block; } |
|
714 |
+ |
|
715 |
+ /* Info panel becomes a bottom sheet */ |
|
716 |
+ .info-panel { |
|
717 |
+ position: fixed; z-index: 66; left: 0; right: 0; bottom: 0; top: auto; |
|
718 |
+ width: auto; max-height: 72vh; border-left: none; border-top: 1px solid var(--border); |
|
719 |
+ border-radius: var(--radius-lg) var(--radius-lg) 0 0; |
|
720 |
+ box-shadow: var(--shadow-pop); |
|
721 |
+ padding-bottom: calc(18px + env(safe-area-inset-bottom)); |
|
722 |
+ } |
|
723 |
+ .body.info-open .info-panel { display: block; animation: sheet-up 240ms var(--spring); } |
|
724 |
+ .info-panel::before { |
|
725 |
+ content: ''; display: block; width: 40px; height: 4px; border-radius: 2px; |
|
726 |
+ background: var(--border-strong); margin: 0 auto 12px; |
|
727 |
+ } |
|
728 |
+ |
| 614 |
729 |
.searchbox { max-width: none; } |
| 615 |
730 |
.brand span { display: none; } |
| 616 |
|
− .preview-body { padding: 0 8px 12px; } |
| 617 |
|
− .preview-nav.prev { left: 4px; } .preview-nav.next { right: 4px; } |
| 618 |
|
− .list-header, .row { grid-template-columns: 30px 1fr 80px; } |
|
731 |
+ .topbar { gap: 8px; } |
|
732 |
+ /* The FAB owns "new/upload" on phones */ |
|
733 |
+ #uploadBtn { display: none; } |
|
734 |
+ .bottomnav { display: flex; } |
|
735 |
+ .content { padding: 12px 12px calc(120px + env(safe-area-inset-bottom)); } |
|
736 |
+ .toasts { bottom: calc(84px + env(safe-area-inset-bottom)); } |
|
737 |
+ .upload-panel { width: calc(100vw - 20px); right: 10px; bottom: calc(78px + env(safe-area-inset-bottom)); } |
|
738 |
+ |
|
739 |
+ /* Bigger touch targets everywhere */ |
|
740 |
+ .nav-item { padding: 11px 12px; font-size: 14.5px; } |
|
741 |
+ .tree-toggle { height: 34px; } |
|
742 |
+ .tree-label { padding: 8px 6px 8px 0; font-size: 14px; } |
|
743 |
+ .btn { padding: 9px 16px; } |
|
744 |
+ .btn.icon { padding: 9px; } |
|
745 |
+ .grid { grid-template-columns: repeat(auto-fill, minmax(min(var(--card, 150px), 44vw), 1fr)); gap: 10px; } |
|
746 |
+ .card .meta { padding: 10px 12px; } |
|
747 |
+ .toolbar { padding: 8px 12px; min-height: 48px; overflow-x: auto; flex-wrap: nowrap; scrollbar-width: none; } |
|
748 |
+ .toolbar::-webkit-scrollbar { display: none; } |
|
749 |
+ .toolbar input[type='range'] { display: none; } /* card-size slider is pointless on touch */ |
|
750 |
+ .crumbs { flex: none; max-width: 60vw; overflow-x: auto; scrollbar-width: none; } |
|
751 |
+ |
|
752 |
+ .list-header, .row { grid-template-columns: 26px 1fr 78px; } |
| 619 |
753 |
.list-header > :nth-child(n+4), .row > :nth-child(n+4) { display: none; } |
| 620 |
|
− .upload-panel { width: calc(100vw - 24px); right: 12px; } |
|
754 |
+ .row { padding: 9px 10px; } |
|
755 |
+ |
|
756 |
+ .preview-body { padding: 0 6px calc(10px + env(safe-area-inset-bottom)); } |
|
757 |
+ .preview-nav { width: 40px; height: 40px; } |
|
758 |
+ .preview-nav.prev { left: 4px; } .preview-nav.next { right: 4px; } |
|
759 |
+ .preview-head { padding: calc(10px + env(safe-area-inset-top)) 12px 10px; } |
| 621 |
760 |
.pdf-rail { display: none; } |
|
761 |
+ .pv-toolbar { bottom: calc(14px + env(safe-area-inset-bottom)); max-width: 96vw; overflow-x: auto; } |
|
762 |
+ .editor-body { padding: 0 10px calc(10px + env(safe-area-inset-bottom)); } |
|
763 |
+ .editor-text { padding: 14px; font-size: 14px; } |
|
764 |
+ |
| 622 |
765 |
.storage-page { grid-template-columns: 1fr; } |
|
766 |
+ .stat-row { grid-template-columns: 1fr 1fr; gap: 10px; } |
|
767 |
+ .shares-table { display: block; overflow-x: auto; } |
|
768 |
+ .modal { max-height: 80vh; } |
|
769 |
+ .request-card { padding: 22px 18px; } |
| 623 |
770 |
} |
| 624 |
771 |
|
| 625 |
772 |
@media print { |