diff --git a/web/src/app/shell.css b/web/src/app/shell.css index cedeb0f..351911e 100644 --- a/web/src/app/shell.css +++ b/web/src/app/shell.css @@ -46,7 +46,11 @@ .app-nav { order: -1; display: flex; flex-direction: column; width: var(--app-nav-width); padding: 24px 14px; border-right: 1px solid var(--nav-line); overflow-y: auto; } .app-nav-brand { padding: 0 14px 22px; font-family: 'Songti SC', 'Noto Serif SC', 'Source Han Serif SC', serif; font-size: 26px; font-weight: 700; color: var(--nav-accent); } .app-nav-item { display: flex; align-items: center; gap: 12px; height: 44px; padding: 0 14px; border-radius: 12px; font-size: 15px; color: var(--nav-ink); } - .app-nav-item:hover { background: var(--color-surface-2); } + /* ui.md §2.5: hover only where a pointer can hover, or a tap leaves the item looking selected. */ + @media (hover: hover) and (pointer: fine) { + .app-nav-item:hover:not([aria-current='page']), + .app-nav-subitem:hover:not([aria-current='page']) { background: color-mix(in srgb, var(--color-surface-2) 60%, transparent); } + } .app-nav-item[aria-current='page'] { background: var(--nav-soft); color: var(--nav-accent); font-weight: 600; } .app-nav-sub { margin-top: 2px; } .app-nav-subitem { display: flex; align-items: center; gap: 12px; height: 38px; padding: 0 14px 0 46px; border-radius: 10px; font-size: 14px; color: var(--nav-muted); } diff --git a/web/src/features/media/components/library-editor.tsx b/web/src/features/media/components/library-editor.tsx index a92cb97..c9ec9ff 100644 --- a/web/src/features/media/components/library-editor.tsx +++ b/web/src/features/media/components/library-editor.tsx @@ -48,7 +48,7 @@ export function MediaLibraryEditor({ api, library, onSaved, onCancel }: { } }; - return

编辑媒体库

+ return

编辑媒体库

{leaving&&setLeaving(false)} onConfirm={()=>{setLeaving(false);onCancel();}}/>}
{ event.preventDefault(); void save(); }}> {error &&
{error}{!configuration && }
} diff --git a/web/src/features/media/components/permissions.tsx b/web/src/features/media/components/permissions.tsx index 8e85307..79b5c98 100644 --- a/web/src/features/media/components/permissions.tsx +++ b/web/src/features/media/components/permissions.tsx @@ -41,7 +41,7 @@ export function MediaPermissions({api,library,onSaved,onCancel}:{api:MediaApi;li catch(error){if(!controller.signal.aborted)setError(error instanceof ApiError&&error.kind==='offline'?'无法连接服务器,请检查连接。当前选择已保留,可以重新保存。':error instanceof ApiError&&error.code==='ADMIN_REQUIRED'?'需要管理员权限才能保存。当前选择已保留。':error instanceof Error?error.message:'保存失败');} finally {if(pending.current===controller)pending.current=null;if(!controller.signal.aborted)setSaving(false);} }; - return

访问权限

+ return

访问权限

{leaving&&setLeaving(false)} onConfirm={()=>{setLeaving(false);onCancel();}}/>} {event.preventDefault();if(ready&&!saving)void save();}}>

{library.name}

允许访问的用户共享作品资料,收藏与进度各自独立。

diff --git a/web/src/features/media/components/settings.tsx b/web/src/features/media/components/settings.tsx index 17ff53a..0bf3fac 100644 --- a/web/src/features/media/components/settings.tsx +++ b/web/src/features/media/components/settings.tsx @@ -88,8 +88,8 @@ export function MediaSettings({ scope, preferences, player, account, onSaved, on - - + +
diff --git a/web/src/features/media/pages/MediaCatalogPage.tsx b/web/src/features/media/pages/MediaCatalogPage.tsx index c501d89..235c1b3 100644 --- a/web/src/features/media/pages/MediaCatalogPage.tsx +++ b/web/src/features/media/pages/MediaCatalogPage.tsx @@ -54,7 +54,6 @@ export function MediaCatalogPage() { })} } { void query.refetch(); }} /> - {emptyCatalog && navigate(`/media/${channel}/settings/libraries/new`)} onManage={() => navigate(`/media/${channel}/settings/libraries`)} />} {!emptyCatalog && !playerActive && offset === 0 && (current.kind === 'video' || current.kind === 'album' || current.kind === 'audiobook') &&
} + {/* After the toolbar: the empty state answers "this library/category has nothing", so the selector it refers to sits above it. */} + {emptyCatalog && navigate(`/media/${channel}/settings/libraries/new`)} onManage={() => navigate(`/media/${channel}/settings/libraries`)} />} {!emptyCatalog && query.data && <>{query.data.total > 60 &&
{selectedSource &&

搜索与浏览

{catalogError && setCatalogError('')}>{catalogError}} diff --git a/web/src/styles/reader.css b/web/src/styles/reader.css index 4f2f5f8..9253702 100644 --- a/web/src/styles/reader.css +++ b/web/src/styles/reader.css @@ -1276,13 +1276,6 @@ book-content { display: none; } -.shelf-status { - font-size: 0.78rem; - text-align: center; - color: var(--reader-muted); - padding: 0.75rem 0.9rem calc(0.75rem + var(--safe-bottom)); -} - /* ---- the pager ---- * @@ -3784,6 +3777,7 @@ svg.icon { display: inline-block; width: 1em; height: 1em; flex-shrink: 0; verti .source-picker > div p { margin:0; font-size:.85rem; } .source-picker > label { flex:1; margin:0; font-size:.85rem; color:var(--reader-muted); } .source-picker > p { flex-basis:100%; margin:0; } + .source-picker > .source-picker-cta { margin-top: calc(var(--space-3) * -0.5); } } /* Collection pages share a quiet heading, labelled destinations and useful empty states. */ .shelf-head { align-items: center; padding-top: calc(1.25rem + var(--safe-top)); padding-bottom: .85rem; } @@ -3816,7 +3810,8 @@ svg.icon { display: inline-block; width: 1em; height: 1em; flex-shrink: 0; verti .collection-empty p.muted { max-width: 23rem; font-size: .875rem; line-height: 1.8; text-wrap: pretty; } .collection-empty .empty-actions { margin-top: .6rem; gap: .65rem; } .collection-empty .button { min-height: 44px; font-size: .875rem; } -.library-browse-body > .manager-status { background: transparent; border: 0; margin: .75rem auto; } +/* Browsing pages with a pager, so the count is a footer line, not a sticky overlay over the grid. */ +.library-browse-body > .manager-status { position: static; background: transparent; backdrop-filter: none; border: 0; margin: .75rem auto; } .file-manager-header .manager-crumbs { margin-top: .75rem; padding: .25rem 0; } .file-manager-header .manager-crumb { min-height: 44px; } .library-files-screen .manager-list { margin: .5rem 1rem; border: 1px solid var(--reader-line); border-radius: 1rem; overflow: hidden; }