Files
short-drama-agent-front/src/styles/admin.css
T

468 lines
12 KiB
CSS

/* 管理后台视口边界: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 .n-tabs-nav .n-tabs-tab {
padding-inline: 16px;
}
/* 相邻 Tab 紧贴排列,间隔由各项内部留白提供。 */
.workspace-tabs.n-tabs .n-tabs-nav .n-tabs-tab-pad {
width: 0;
}
/* 选中状态仅通过文字颜色表达,不显示底部指示线。 */
.workspace-tabs.n-tabs .n-tabs-nav .n-tabs-bar {
display: none;
}
/* 标签与两侧附加操作共用无底边框的导航行。 */
.workspace-tabs.n-tabs .n-tabs-nav.n-tabs-nav--line-type.n-tabs-nav--top .n-tabs-nav-scroll-content,
.workspace-tabs.n-tabs .n-tabs-nav.n-tabs-nav--line-type.n-tabs-nav--top .n-tabs-nav__prefix,
.workspace-tabs.n-tabs .n-tabs-nav.n-tabs-nav--line-type.n-tabs-nav--top .n-tabs-nav__suffix {
border-bottom: none;
}
.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;
}
}
/* 明暗模式沿用组件的 primary 文字色,选中和悬停均不绘制背景。 */
.workspace-tabs.n-tabs .n-tabs-nav .n-tabs-tab--active {
color: var(--n-tab-text-color-active);
}
.workspace-tabs.n-tabs .n-tabs-nav .n-tabs-tab--active,
.workspace-tabs.n-tabs .n-tabs-nav .n-tabs-tab:hover {
background: transparent;
}