/* 管理后台视口边界:document 不滚动,各个工作区和面板独立滚动。 */ :root { --app-ink: #191919; --app-muted: #707070; --app-body: #ffffff; --app-surface: #ffffff; --app-subtle: #f7f7f7; --app-control: #f0f0f0; --app-control-hover: #e5e5e5; --app-field: #f0f0f0; --app-field-hover: #e8e8e8; --app-border: #e5e5e5; --app-inverse: #ffffff; --app-accent: #07c160; --app-accent-hover: #2dcb79; --app-accent-text: #087c42; --app-on-accent: #ffffff; --app-button-primary: #078640; --app-button-hover: #087c42; --app-button-pressed: #066b36; --app-disabled-bg: #e4e4e4; --app-disabled-text: #8c8c8c; --app-selected: #e4f4e9; --app-shadow: #00000018; --app-danger: #a93232; --app-success: #087c42; } :root[data-theme='dark'] { --app-ink: #d9d9d9; --app-muted: #a3a3a3; --app-body: #111111; --app-surface: #191919; --app-subtle: #232323; --app-control: #2b2b2b; --app-control-hover: #353535; --app-field: #2b2b2b; --app-field-hover: #353535; --app-disabled-bg: #303030; --app-disabled-text: #808080; --app-border: #333333; --app-inverse: #111111; --app-accent-text: #5cd693; --app-selected: #173527; --app-shadow: #00000055; --app-danger: #fa7373; --app-success: #5cd693; } html, body, #app, .app-provider { height: 100%; min-height: 0; overflow: hidden; } html { background: var(--app-body); } body { margin: 0; } /* 外壳固定品牌与底部设置;只有菜单自身使用 NScrollbar 滚动。 */ /* Naive 菜单背景默认左右内缩 8px;只铺满导航行,不改图标与文字缩进。 */ /* 按钮保持直角,单图标按钮以 Naive 当前尺寸为边长,加载时也不改变宽度。 */ .n-button { border-radius: 0; } .n-button.icon-button { width: var(--n-height); min-width: var(--n-height); height: var(--n-height); padding: 0; flex: 0 0 auto; } .n-button.icon-button .n-button__icon { margin: 0; } .n-button:focus-visible { outline: 2px solid var(--app-accent-text); outline-offset: 2px; } /* 标题移除额外按钮后让名称使用剩余空间;未完成项目的引导仍留在内容区。 */ /* 常用工具固定在滚动区外;低频操作使用局部抽屉,不叠加占高面板。 */ .workspace-toolbar { display: flex; align-items: center; flex-wrap: wrap; gap: 8px 16px; min-height: 34px; } .toolbar-episode { display: flex; align-items: center; gap: 8px; flex: 0 1 340px; min-width: 180px; font-size: 12px; } .toolbar-episode .n-select { min-width: 0; } .toolbar-metrics, .toolbar-summary { display: flex; align-items: center; flex-wrap: wrap; gap: 8px 16px; color: var(--app-muted); font-size: 12px; line-height: 1.6; } .toolbar-actions { display: flex; align-items: center; flex-wrap: wrap; gap: 10px; margin-left: auto; } /* 身份说明与折叠入口分开,避免正文紧贴下一组操作。 */ /* 与 34px 中号输入框共用一行;不再通过 pb-2 / pb-3 手动垫高复选框。 */ .n-checkbox.control-row-checkbox { align-self: end; align-items: center; min-height: 34px; padding-block: 0; } .control-row-checkbox .n-checkbox-box-wrapper { align-self: center; } /* 拆解配置跟随抽屉实际宽度;标题 20px + 间距 8px,下方统一使用 34px 控件行。 */ /* 筛选与关联行整体吸顶,底部不留固定分隔带;列表自己的顶部间距随内容滚走。 */ /* 使用成熟的多列排版实现瀑布流;完整卡片不跨列,窄容器自动减少列数。 */ .workspace-feedback.n-scrollbar { flex-shrink: 0; height: auto; max-height: min(24dvh, 160px); overflow: hidden; } .workspace-feedback .n-alert + .n-alert { margin-top: 8px; } .overview-content { padding-bottom: 8px; } /* 目录统一为固定标题/筛选区和独立滚动列表;不再依赖按钮的默认行高与内边距。 */ .directory-panel { --app-field: var(--app-surface); --app-field-hover: var(--app-surface); display: flex; flex-direction: column; min-width: 0; min-height: 0; padding: 0; overflow: hidden; background: var(--app-subtle); } .directory-heading { display: flex; align-items: center; justify-content: space-between; flex-wrap: wrap; flex-shrink: 0; gap: 8px; padding: 18px 16px 14px; font-size: 11px; color: var(--app-muted); } .directory-heading h3 { font-size: 13px; font-weight: 600; color: var(--app-ink); } .directory-heading h3 span { margin-left: 8px; font-size: 11px; font-weight: 400; color: var(--app-muted); } .directory-scroll { flex: 1; } .directory-list-content { display: flex; flex-direction: column; gap: 8px; padding: 8px 0 16px; } /* 可选前导内容用于主体母版,不改变剧集与镜头目录的原有排版。 */ .directory-status { display: inline-flex; align-items: center; gap: 5px; padding: 1px 5px; border-radius: 0; background: var(--app-control); } .directory-status svg { flex-shrink: 0; } /* 标签与操作由同一 NTabs 导航行管理,suffix 共享底线及垂直中心。 */ .tabs-toolbar { container: tabs-toolbar / inline-size; width: 100%; min-width: 0; } .workspace-tabs.n-tabs { width: 100%; min-width: 0; } .workspace-tabs > .n-tabs-nav { background: var(--app-surface); align-items: stretch; } .workspace-tabs .n-tabs-tab { min-height: 40px; box-sizing: border-box; } .workspace-tabs .n-tabs-nav-scroll-wrapper { min-width: 0; } .workspace-tabs .n-tabs-nav__suffix { align-items: center; flex-shrink: 0; padding-left: 20px; } .tabs-toolbar-actions { display: flex; align-items: center; justify-content: flex-end; flex-wrap: wrap; gap: 4px 14px; min-height: 40px; } .tabs-toolbar-actions .n-button, .tabs-toolbar-actions .text-button { display: inline-flex; align-items: center; justify-content: center; height: 32px; white-space: nowrap; } .tabs-toolbar-actions .n-button.icon-button { width: 32px; min-width: 32px; height: 32px; padding: 0; } /* 窄内容区允许 suffix 独占一行;Tabs 本身继续使用组件内置横向滚动。 */ @container tabs-toolbar (max-width: 600px) { .workspace-tabs > .n-tabs-nav { flex-wrap: wrap; } .workspace-tabs .n-tabs-nav-scroll-wrapper { flex-basis: 100%; } .workspace-tabs .n-tabs-nav__suffix { width: 100%; justify-content: flex-end; padding-left: 0; } } /* 筛选按内容区的实际宽度换行,避免侧栏展开后下拉框把其他控件挤到下一行。 */ /* 镜头选择和图库筛选共用一行,以控件中心对齐;窄屏保留完整筛选组,不挤压复选框。 */ .content-with-history { height: clamp(360px, 66dvh, 850px); min-height: 0; grid-template-columns: minmax(0, 1fr) 207px; } .content-with-history > main, .content-with-history > aside { min-height: 0; overflow: hidden; overscroll-behavior: contain; } /* 拆解结果使用剩余高度,不能再用视口比例定高后隐藏长列表。 */ /* 剧集选择、统计和下一步入口共用一行,避免空操作行与双层顶部留白。 */ /* 连续阅读区保留双栏,执行记录按需展开,不挤占默认阅读宽度。 */ /* 面板只负责尺寸与裁切;滚动和深浅主题滚动条统一交给 Naive UI。 */ .panel-scroll.n-scrollbar { height: 100%; min-height: 0; min-width: 0; overflow: hidden; } .n-scrollbar > .n-scrollbar-container { overscroll-behavior: contain; } .production-detail, .storyboard-detail, .content-with-history > main { min-width: 0; min-height: 0; } .image-history.n-scrollbar, .table-scroll.n-scrollbar { height: auto; overflow: hidden; } .image-history.n-scrollbar { width: 100%; max-width: 100%; min-width: 0; } .image-history-heading { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 6px 16px; margin-block: 16px 8px; font-size: 12px; } .image-history-content { display: flex; gap: 12px; padding: 4px 4px 12px; width: max-content; } .code-scroll.n-scrollbar { height: auto; max-height: 420px; overflow: hidden; } .code-scroll .json-view, .code-scroll .storyboard-json { max-height: none; overflow: visible; } /* 项目筛选与搜索框同高,保留更宽的点击区;窄屏可自然换行。 */ /* 状态说明与操作各自成组,避免小标签夹在不同尺寸的按钮之间。 */ .dialog-footer { display: flex; justify-content: flex-end; gap: 8px; padding-top: 16px; } /* 预览尺寸不随原图分辨率增长,历史缩略图也不能被按钮默认宽度覆盖。 */ .n-button__content { gap: 6px; } .n-button:disabled { opacity: 1; } .n-button.image-history-item { width: 128px; min-width: 128px; max-width: 128px; flex: 0 0 128px; height: auto; padding: 6px; white-space: normal; background: var(--app-subtle); } .n-button.image-history-item.selected { background: var(--app-selected); box-shadow: inset 0 0 0 2px var(--app-accent); } .n-button.image-history-item .n-button__content { display: block; width: 100%; text-align: left; overflow: hidden; } .image-history-item .asset-image { height: 88px; min-height: 0; aspect-ratio: auto; } .image-history-label { display: block; margin-top: 6px; font-size: 11px; line-height: 1.5; overflow-wrap: anywhere; } .image-history-meta { display: flex; align-items: center; flex-wrap: wrap; gap: 4px; margin-top: 6px; color: var(--app-muted); font-size: 10px; line-height: 1.5; } /* 选角进度按抽屉实际宽度排列;按钮尺寸显式覆盖组件默认值。 */ /* 主体搜索靠左,统计紧随输入框;窄内容区自然换行,不占满整行或挤压控件。 */ /* 诊断筛选按实际空间换行,长 checkpoint ID 不撑开弹窗。 */ /* 镜头影响和素材定位使用固定底色;高亮只表示当前定位,不代表素材失效。 */ /* 关联素材始终单行横向浏览,数量和长名称不会撑高定位区或压缩图片区域。 */ /* 低频记录收起后归还正文宽度,不留下历史列的占位。 */ /* 补充说明只按需展开,继续使用平直背景层级,不增加边框或圆角。 */ .select-control { min-width: 130px; } .n-checkbox { align-items: flex-start; } .n-checkbox .n-checkbox__label { white-space: normal; } .n-alert { line-height: 1.8; } .n-collapse.panel { padding: 16px; } .n-table.project-table th { background: var(--app-subtle); } @media (max-width: 1000px) { .content-with-history { grid-template-columns: minmax(0, 1fr) 180px; } } @media (max-width: 760px) { .toolbar-episode { flex: 1; } .toolbar-actions { gap: 8px; } .directory-panel { height: 100%; border-right: 0; } .directory-heading { padding: 12px 14px 8px; } .directory-list-content { flex-direction: row; width: max-content; align-items: stretch; padding-bottom: 12px; } .content-with-history { grid-template-columns: minmax(0, 1fr); grid-template-rows: minmax(0, 1fr) 130px; } } /* 导航保留明确选中态与轻量悬停反馈,明暗模式共用主题变量。 */ .workspace-tabs .n-tabs-tab--active { font-weight: 600; } .workspace-tabs .n-tabs-tab:hover { background: var(--app-subtle); }