diff --git a/src/web_ui/index.html b/src/web_ui/index.html
index bbbaa9b..cc9da0e 100644
--- a/src/web_ui/index.html
+++ b/src/web_ui/index.html
@@ -18,8 +18,8 @@
.theme-emo-coffin{--bg:#0d0009;--panel:#110010;--card:#1a0018;--accent:#cc2222;--text:#c0c0c0;--muted:#666;--border:#3a0030}
.theme-emo-scene-queen{--bg:#080818;--panel:#0a0a1e;--card:#111128;--accent:#39ff14;--text:#c8c8ff;--muted:#666;--border:#222244}
*{box-sizing:border-box;margin:0;padding:0}
- body{background:var(--bg);color:var(--text);font:14px/1.5 system-ui,sans-serif;display:flex;flex-direction:column;height:100vh;overflow:hidden}
- header{background:var(--panel);padding:8px 12px;display:flex;gap:8px;align-items:center;border-bottom:1px solid var(--border);flex-shrink:0;flex-wrap:wrap}
+ body{background:var(--bg);color:var(--text);font:14px/1.5 system-ui,sans-serif;display:flex;flex-direction:column;height:100dvh;min-height:100dvh;overflow:hidden;overscroll-behavior:none}
+ header{background:var(--panel);padding:8px 12px;display:flex;gap:8px;align-items:center;border-bottom:1px solid var(--border);flex-shrink:0;flex-wrap:wrap;position:sticky;top:0;z-index:20}
header h1{font-size:1em;font-weight:700;white-space:nowrap}
#search{flex:1;min-width:100px;background:var(--bg);border:1px solid var(--border);color:var(--text);padding:5px 9px;border-radius:4px;font-size:13px}
#sort{background:var(--card);color:var(--text);border:1px solid var(--border);padding:4px 6px;border-radius:4px;font-size:12px}
@@ -29,7 +29,7 @@
button:hover,button:active{background:var(--accent);border-color:var(--accent);color:#fff}
button.primary{background:var(--accent);border-color:var(--accent);color:#fff}
#menu-btn{display:none;font-size:18px;padding:3px 9px;line-height:1}
- main{display:flex;flex:1;overflow:hidden;position:relative}
+ main{display:flex;flex:1;min-height:0;overflow:hidden;position:relative}
aside{width:210px;background:var(--panel);border-right:1px solid var(--border);overflow-y:auto;flex-shrink:0;padding:6px 0;transition:transform .2s}
#sidebar-overlay{display:none;position:fixed;inset:0;background:rgba(0,0,0,.5);z-index:49}
.sidebar-label{padding:2px 10px;font-size:10px;text-transform:uppercase;color:var(--muted);letter-spacing:.07em;margin-top:6px}
@@ -39,7 +39,8 @@
.ch-sub{padding:4px 10px 4px 22px;font-size:12px;color:var(--muted);cursor:pointer;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.ch-sub:hover{color:var(--text);background:rgba(128,128,128,.08)}
.ch-sub.active{color:var(--text)}
- section#content{flex:1;overflow-y:auto;padding:10px;min-width:0}
+ section#content{flex:1;overflow-y:auto;padding:10px;min-width:0;min-height:0}
+ .card,.ch-card,.ch-item,.chip,.job,.settings-row,.det-actions,.vctrl{min-width:0}
.toolbar{display:flex;align-items:center;gap:8px;margin-bottom:8px;flex-wrap:wrap}
/* Filter chip row above the grid. Each chip is a button that toggles
a single filter dimension; the active state inverts colors so it's
@@ -167,6 +168,7 @@
.preview-thumb{width:100%;max-width:280px;aspect-ratio:16/9;object-fit:cover;border-radius:4px;background:#000;flex-shrink:0}
.empty{grid-column:1/-1;text-align:center;color:var(--muted);padding:40px;font-size:13px}
@media(max-width:640px){
+ body{padding-bottom:calc(env(safe-area-inset-bottom) + 4px)}
#menu-btn{display:block}
aside{position:fixed;top:0;left:0;height:100%;z-index:50;transform:translateX(-100%);width:240px}
aside.open{transform:translateX(0)}
@@ -176,28 +178,44 @@
are the ones users actually reach for. */
#hdr-stats,#sort,#agpl-notice{display:none}
header h1{display:none}
- header{padding:6px 8px;gap:6px}
+ header{padding:6px 8px;gap:6px;position:sticky;top:0;z-index:20}
+ #search{order:3;flex-basis:100%;width:100%;min-width:0}
header button{min-width:34px;min-height:34px;padding:4px 7px;font-size:14px}
+ .filters{overflow-x:auto;padding-bottom:2px;scrollbar-width:none}
+ .filters::-webkit-scrollbar{display:none}
+ .toolbar{gap:6px}
+ .toolbar > *{min-width:0}
/* Bigger tap targets on cards. The five-button card-foot reflows
to a comfortable height instead of cramming icons together. */
.grid{grid-template-columns:repeat(auto-fill,minmax(150px,1fr));gap:8px}
.card-foot{padding:6px 6px 8px;gap:4px;flex-wrap:wrap}
.card-foot button{font-size:13px;padding:6px 8px;min-height:34px}
.card-foot button:not(.play){min-width:34px}
- .card-meta{font-size:10px}
+ .card-title{min-height:0}
+ .card-meta{font-size:10px;line-height:1.3}
/* Modals go full-screen so the cramped 10px page-margin we use on
desktop doesn't eat the iPhone safe area. */
.modal-bg{padding:0}
- .modal{max-width:100vw;max-height:100vh;border-radius:0;border:none}
+ .modal{max-width:100vw;max-height:100dvh;height:100dvh;border-radius:0;border:none;overflow-y:auto;padding:12px 12px calc(12px + env(safe-area-inset-bottom))}
+ .modal-body{flex-direction:column;gap:8px;overflow-y:auto}
.modal video{max-height:55vh}
- #details{max-height:160px;padding:8px 10px}
+ .vctrl{padding:6px;gap:6px}
+ .vctrl .vseek{order:3;flex-basis:100%;min-width:0}
+ .vctrl .vtime{margin-left:auto}
+ .settings-row{flex-direction:column;align-items:flex-start;gap:4px}
+ .meta-grid{grid-template-columns:1fr}
+ .det-head{flex-direction:column;gap:4px}
+ .det-actions{width:100%}
+ .det-actions button{flex:1 1 calc(50% - 4px)}
+ #details{max-height:min(45vh,220px);padding:8px 10px}
.chapters-pane{display:none}
.transcript-pane{display:none !important}
section#content{padding:8px}
/* Modal "new download" form stacks vertically on small screens so
the URL + button + quality picker don't squeeze each other. */
.dl-new-row{flex-direction:column;align-items:stretch}
- .dl-new-row input[type="url"]{width:100%}
+ .dl-new-row input[type="url"]{width:100%;min-width:0}
+ .dl-new-row select{width:100%}
/* Bulk-mode actions stack vertically when active. */
.toolbar{flex-wrap:wrap}
#bulk-actions{flex-wrap:wrap;gap:4px}
@@ -210,6 +228,9 @@
@media(max-width:380px){
/* Single-column on very narrow phones. */
.grid{grid-template-columns:1fr;gap:6px}
+ .card-foot{flex-direction:column;align-items:stretch}
+ .card-foot button{width:100%;min-width:0}
+ .det-actions button{flex-basis:100%}
}
/* ───────────────────────────────────────────────────────────────────────