diff --git a/src/components/Menu/src/components/useRenderMenuItem.tsx b/src/components/Menu/src/components/useRenderMenuItem.tsx index 301313f..0132652 100644 --- a/src/components/Menu/src/components/useRenderMenuItem.tsx +++ b/src/components/Menu/src/components/useRenderMenuItem.tsx @@ -9,7 +9,7 @@ const { renderMenuTitle } = useRenderMenuTitle() export const useRenderMenuItem = () => // allRouters: AppRouteRecordRaw[] = [], { - const renderMenuItem = (routers: AppRouteRecordRaw[], parentPath = '/') => { + const renderMenuItem = (routers: AppRouteRecordRaw[], parentPath = '/', nested = false) => { return routers .filter((v) => !v.meta?.hidden) .map((v) => { @@ -27,7 +27,8 @@ export const useRenderMenuItem = () => index={onlyOneChild ? pathResolve(fullPath, onlyOneChild.path) : fullPath} > {{ - default: () => renderMenuTitle(onlyOneChild ? onlyOneChild?.meta : meta) + default: () => + renderMenuTitle(onlyOneChild ? onlyOneChild?.meta : meta, !nested) }} ) @@ -35,8 +36,8 @@ export const useRenderMenuItem = () => return ( {{ - title: () => renderMenuTitle(meta), - default: () => renderMenuItem(v.children!, fullPath) + title: () => renderMenuTitle(meta, !nested), + default: () => renderMenuItem(v.children!, fullPath, true) }} ) diff --git a/src/components/Menu/src/components/useRenderMenuTitle.tsx b/src/components/Menu/src/components/useRenderMenuTitle.tsx index 5c3dde8..838423e 100644 --- a/src/components/Menu/src/components/useRenderMenuTitle.tsx +++ b/src/components/Menu/src/components/useRenderMenuTitle.tsx @@ -5,11 +5,11 @@ import { AppIcon } from '@/components/AppIcon' import { useI18n } from '@/hooks/web/useI18n' export const useRenderMenuTitle = () => { - const renderMenuTitle = (meta: RouteMeta) => { + const renderMenuTitle = (meta: RouteMeta, showIcon = true) => { const { t } = useI18n() const { title = 'Please set title', icon } = meta - return icon ? ( + return icon && showIcon ? ( <> diff --git a/src/components/Setting/src/Setting.vue b/src/components/Setting/src/Setting.vue index 6f25ee1..e60cf2d 100644 --- a/src/components/Setting/src/Setting.vue +++ b/src/components/Setting/src/Setting.vue @@ -195,7 +195,7 @@ const themeChange = () => { import { useI18n } from '@/hooks/web/useI18n' -import { ref } from 'vue' +import { computed, reactive } from 'vue' import { Dialog } from '@/components/Dialog' import { Form } from '@/components/Form' import { useForm } from '@/hooks/web/useForm' -import { reactive, computed } from 'vue' import { useValidator } from '@/hooks/web/useValidator' import { FormSchema } from '@/components/Form' import { ElButton } from 'element-plus' @@ -41,13 +40,10 @@ const emit = defineEmits(['update:modelValue']) const dialogVisible = computed({ get: () => props.modelValue, - set: (val) => { - console.log('set: ', val) - emit('update:modelValue', val) - } + set: (val) => emit('update:modelValue', val) }) -const dialogTitle = ref(t('lock.lockScreen')) +const dialogTitle = computed(() => t('lock.lockScreen')) const rules = reactive({ password: [required()] @@ -60,7 +56,10 @@ const schema: FormSchema[] = reactive([ component: 'Input', componentProps: { type: 'password', - showPassword: true + showPassword: true, + style: { + width: '100%' + } } } ]) @@ -82,41 +81,163 @@ const handleLock = async () => { } }) } + +const cancel = () => { + dialogVisible.value = false +} diff --git a/src/locales/en.ts b/src/locales/en.ts index 15ff3d6..3e35f06 100644 --- a/src/locales/en.ts +++ b/src/locales/en.ts @@ -52,6 +52,7 @@ export default { lockScreen: 'Lock screen', lock: 'Lock', lockPassword: 'Lock screen password', + description: 'Enter your password to unlock this session.', unlock: 'Click to unlock', backToLogin: 'Back to login', entrySystem: 'Entry the system', diff --git a/src/locales/zh-CN.ts b/src/locales/zh-CN.ts index 9825d3a..1961130 100644 --- a/src/locales/zh-CN.ts +++ b/src/locales/zh-CN.ts @@ -52,6 +52,7 @@ export default { lockScreen: '锁定屏幕', lock: '锁定', lockPassword: '锁屏密码', + description: '输入密码解锁当前会话。', unlock: '点击解锁', backToLogin: '返回登录', entrySystem: '进入系统', diff --git a/src/store/modules/app.ts b/src/store/modules/app.ts index 51c8778..e11ca33 100644 --- a/src/store/modules/app.ts +++ b/src/store/modules/app.ts @@ -67,7 +67,7 @@ export const useAppStore = defineStore('app', { currentSize: 'default', // 组件尺寸 theme: { // 主题色 - elColorPrimary: '#409eff', + elColorPrimary: '#c4322a', // 左侧菜单边框颜色 leftMenuBorderColor: 'inherit', // 左侧菜单背景颜色 @@ -343,6 +343,10 @@ export const useAppStore = defineStore('app', { persist: { afterRestore: (context) => { context.store.title = import.meta.env.VITE_APP_TITLE + if (context.store.theme?.elColorPrimary !== '#c4322a') { + context.store.setTheme({ elColorPrimary: '#c4322a' }) + context.store.setCssVarTheme() + } } } }) diff --git a/src/styles/business/dark.css b/src/styles/business/dark.css index c1c3f6a..51a7640 100644 --- a/src/styles/business/dark.css +++ b/src/styles/business/dark.css @@ -28,12 +28,12 @@ html.dark .role-card { html.dark .stat-icon, html.dark .role-icon { - background: rgb(64 158 255 / 16%) !important; + background: color-mix(in srgb, var(--el-color-primary) 18%, transparent) !important; color: var(--el-color-primary) !important; } html.dark .role-active { - background: rgb(64 158 255 / 12%); + background: color-mix(in srgb, var(--el-color-primary) 14%, transparent); border-color: var(--el-color-primary); } @@ -106,12 +106,12 @@ html.dark .el-tag.status-badge.is-draft { color: #c0c4cc !important; } html.dark .el-tag.status-badge.is-pending { - --el-tag-bg-color: rgba(64, 158, 255, 0.18); - --el-tag-border-color: rgba(121, 187, 255, 0.45); - --el-tag-text-color: #8cc5ff; - background: rgba(64, 158, 255, 0.18) !important; - border-color: rgba(121, 187, 255, 0.45) !important; - color: #8cc5ff !important; + --el-tag-bg-color: color-mix(in srgb, var(--el-color-primary) 18%, transparent); + --el-tag-border-color: color-mix(in srgb, var(--el-color-primary) 45%, transparent); + --el-tag-text-color: var(--el-color-primary-light-5); + background: color-mix(in srgb, var(--el-color-primary) 18%, transparent) !important; + border-color: color-mix(in srgb, var(--el-color-primary) 45%, transparent) !important; + color: var(--el-color-primary-light-5) !important; } html.dark .el-tag.status-badge.is-offline { --el-tag-bg-color: rgba(245, 108, 108, 0.18); diff --git a/src/styles/business/drama-management.css b/src/styles/business/drama-management.css index 7363c62..8fcd3ff 100644 --- a/src/styles/business/drama-management.css +++ b/src/styles/business/drama-management.css @@ -91,29 +91,192 @@ font-size: 13px; } -/* 编辑弹窗里的封面预览:固定竖版尺寸,和上传控件并排,避免弹窗过高 */ -.cover-field { +/* 短剧编辑弹窗:固定宽度、内容区滚动、底部操作固定。 */ +.drama-editor-dialog { display: flex; - gap: 12px; - align-items: flex-start; - width: 100%; + max-height: calc(100vh - 40px); + overflow: hidden; + flex-direction: column; + border-radius: var(--app-radius-lg) !important; } -.cover-field-actions { + +.drama-editor-dialog .el-dialog__body { + flex: 1 1 auto; + padding: 8px 24px 0; + overflow-y: auto; +} + +.drama-editor-dialog .el-dialog__footer { + flex: 0 0 auto; + padding: 14px 24px; + background: var(--el-bg-color-overlay); + border-top: 1px solid var(--el-border-color-lighter); +} + +.drama-editor-dialog .el-dialog__footer .el-button { + min-width: 88px; + height: 36px; +} + +.editor-section { + padding: 4px 0 18px; + border-bottom: 1px solid var(--el-border-color-lighter); +} + +.editor-section + .editor-section { + padding-top: 18px; +} + +.editor-section:last-child { + padding-bottom: 4px; + border-bottom: 0; +} + +.editor-section-title { + margin: 0 0 14px; + color: var(--el-text-color-primary); + font-size: 15px; + font-weight: 650; + line-height: 1.4; +} + +.editor-grid { + display: grid; + gap: 0 16px; +} + +.editor-grid--two { + grid-template-columns: repeat(2, minmax(0, 1fr)); +} + +.editor-number { + width: 180px !important; +} + +.cover-editor { + display: flex; + gap: 18px; + align-items: flex-start; +} + +.cover-preview-card { + position: relative; + display: grid; + flex: 0 0 96px; + width: 96px; + height: 128px; + overflow: hidden; + border: 1px solid var(--el-border-color); + border-radius: 8px; + background: var(--el-fill-color-lighter); +} + +.cover-preview-card img { + width: 100%; + height: 100%; + object-fit: cover; +} + +.cover-preview-empty { + display: flex; + height: 100%; + color: var(--el-text-color-placeholder); + font-size: 12px; + flex-direction: column; + align-items: center; + justify-content: center; + gap: 8px; + border: 1px dashed var(--el-border-color); + border-radius: 8px; +} + +.cover-upload-mask { + position: absolute; + inset: 0; + display: flex; + color: #fff; + font-size: 12px; + flex-direction: column; + align-items: center; + justify-content: center; + gap: 4px; + background: color-mix(in srgb, var(--el-color-primary) 78%, transparent); +} + +.cover-upload-mask b { + font-size: 16px; +} + +.cover-editor-meta { + display: flex; flex: 1 1 auto; min-width: 0; + flex-direction: column; + gap: 10px; } -.form-cover-preview { - display: block; - width: 84px; - height: 112px; - flex: 0 0 84px; - object-fit: cover; - border: 1px solid var(--el-border-color-lighter); - border-radius: var(--app-radius-md); - background: #f0f2f4 !important; + +.cover-status-line { + display: flex; + align-items: center; + gap: 10px; + min-width: 0; } -.dark .form-cover-preview { - background: #353b45 !important; + +.cover-filename { + overflow: hidden; + color: var(--el-text-color-regular); + font-size: 13px; + text-overflow: ellipsis; + white-space: nowrap; +} + +.cover-hint { + margin: 0; + color: var(--el-text-color-secondary); + font-size: 12px; +} + +.cover-actions { + display: flex; + align-items: center; + gap: 10px; + flex-wrap: wrap; +} + +.cover-actions .el-button { + height: 36px; +} + +.cover-original-link { + color: var(--el-color-primary); + font-size: 13px; + text-decoration: none; +} + +.cover-original-link:hover { + text-decoration: underline; +} + +@media (max-width: 600px) { + .drama-editor-dialog { + width: calc(100vw - 24px) !important; + margin: 12px auto !important; + } + + .drama-editor-dialog .el-dialog__body { + padding-right: 18px; + padding-left: 18px; + } + + .editor-grid--two { + grid-template-columns: 1fr; + } + +} + +html.dark .cover-preview-card, +html.dark .cover-preview-empty { + background: var(--el-fill-color-light); } /* 编辑弹窗里的视频预览 */ @@ -163,7 +326,7 @@ /* 列表里点视频即放大播放,给个悬停反馈 */ .episode-video-thumb:hover { border-color: var(--el-color-primary); - box-shadow: 0 0 0 2px rgba(64, 158, 255, 0.25); + box-shadow: 0 0 0 2px color-mix(in srgb, var(--el-color-primary) 25%, transparent); } .dark .table-result-count { color: #a6aeb9; @@ -233,8 +396,8 @@ .table-actions .el-button--primary { --el-button-bg-color: var(--el-color-primary); --el-button-border-color: var(--el-color-primary); - --el-button-hover-bg-color: var(--el-color-primary-light-3); - --el-button-hover-border-color: var(--el-color-primary-light-3); + --el-button-hover-bg-color: var(--el-color-primary-dark-2); + --el-button-hover-border-color: var(--el-color-primary-dark-2); } .table-actions .el-button--success { --el-button-bg-color: #4d866a; diff --git a/src/styles/business/index.css b/src/styles/business/index.css index 3e58968..415def2 100644 --- a/src/styles/business/index.css +++ b/src/styles/business/index.css @@ -8,4 +8,5 @@ @import './console.css'; @import './creator-center.css'; @import './layout.css'; +@import './menu.css'; @import './dark.css'; diff --git a/src/styles/business/menu.css b/src/styles/business/menu.css new file mode 100644 index 0000000..de29fdd --- /dev/null +++ b/src/styles/business/menu.css @@ -0,0 +1,131 @@ +/* 左侧菜单:统一行高、缩进、图标和选中态。 */ +#v-menu .el-menu { + padding: 4px 0; + background: transparent; +} + +#v-menu .el-menu-item, +#v-menu .el-sub-menu__title { + height: 44px; + padding-left: 8px !important; + margin: 4px 8px; + overflow: hidden; + color: var(--left-menu-text-color); + font-size: 14px; + line-height: 44px; + border-radius: 8px; + transition: + color var(--transition-time-02), + background-color var(--transition-time-02); +} + +#v-menu .el-menu--inline { + padding-left: 0 !important; +} + +#v-menu .el-menu--inline .el-menu-item, +#v-menu .el-menu--inline .el-sub-menu__title { + height: 40px; + padding-left: 0 !important; + margin: 3px 8px 3px 42px; + line-height: 40px; +} + +#v-menu .el-menu--inline .app-icon { + display: none; +} + +#v-menu .el-menu-item .app-icon, +#v-menu .el-sub-menu__title .app-icon { + flex: 0 0 18px; + width: 18px; + height: 18px; + margin-right: 8px; +} + +#v-menu .el-menu-item:hover, +#v-menu .el-sub-menu__title:hover, +#v-menu .el-sub-menu.is-opened > .el-sub-menu__title, +#v-menu .el-sub-menu.is-active > .el-sub-menu__title, +#v-menu .el-menu-item.is-active { + color: var(--el-color-primary) !important; + background-color: var(--el-color-primary-light-9) !important; +} + +#v-menu .el-menu .el-menu { + background: transparent; +} + +#v-menu .el-menu--collapse .el-menu-item, +#v-menu .el-menu--collapse .el-sub-menu__title { + justify-content: center; + padding: 0 !important; + margin: 4px 6px; +} + +#v-menu .el-menu--collapse .app-icon { + margin-right: 0; +} + +html.dark #v-menu .el-menu-item:hover, +html.dark #v-menu .el-sub-menu__title:hover { + color: #fff !important; + background-color: color-mix(in srgb, var(--el-color-primary) 72%, transparent) !important; +} + +html.dark #v-menu .el-sub-menu.is-opened > .el-sub-menu__title, +html.dark #v-menu .el-sub-menu.is-active > .el-sub-menu__title, +html.dark #v-menu .el-menu-item.is-active { + color: #fff !important; + background-color: var(--app-primary-strong) !important; +} + +.v-menu-popper--vertical, +.v-menu-popper--horizontal { + padding: 4px; + border: 1px solid var(--el-border-color-light); + border-radius: 8px; + background: var(--el-bg-color-overlay); +} + +.v-menu-popper--vertical .el-menu-item, +.v-menu-popper--vertical .el-sub-menu__title, +.v-menu-popper--horizontal .el-menu-item, +.v-menu-popper--horizontal .el-sub-menu__title { + height: 40px; + padding-left: 16px !important; + margin: 2px 4px; + color: var(--el-text-color-regular); + font-size: 14px; + line-height: 40px; + border-radius: 8px; +} + +.v-menu-popper--vertical .app-icon, +.v-menu-popper--horizontal .app-icon { + flex: 0 0 18px; + width: 18px; + height: 18px; + margin-right: 8px; +} + +.v-menu-popper--vertical .el-menu-item:hover, +.v-menu-popper--horizontal .el-menu-item:hover, +.v-menu-popper--vertical .el-menu-item.is-active, +.v-menu-popper--horizontal .el-menu-item.is-active { + color: var(--el-color-primary) !important; + background-color: var(--el-color-primary-light-9) !important; +} + +html.dark .v-menu-popper--vertical, +html.dark .v-menu-popper--horizontal { + border-color: var(--el-border-color); +} + +html.dark .v-menu-popper--vertical .el-menu-item:hover, +html.dark .v-menu-popper--horizontal .el-menu-item:hover, +html.dark .v-menu-popper--vertical .el-menu-item.is-active, +html.dark .v-menu-popper--horizontal .el-menu-item.is-active { + color: #fff !important; + background-color: var(--app-primary-strong) !important; +} diff --git a/src/styles/business/theme.css b/src/styles/business/theme.css index 3d54de4..6831643 100644 --- a/src/styles/business/theme.css +++ b/src/styles/business/theme.css @@ -15,13 +15,13 @@ font-family: var(--font-body); color: var(--el-text-color-primary); background: var(--el-bg-color-page); - --el-color-primary: #409eff; - --el-color-primary-light-3: #79bbff; - --el-color-primary-light-5: #a0cfff; - --el-color-primary-light-7: #c6e2ff; - --el-color-primary-light-8: #d9ecff; - --el-color-primary-light-9: #ecf5ff; - --el-color-primary-dark-2: #337ecc; + --el-color-primary: #c4322a; + --el-color-primary-light-3: #d3615b; + --el-color-primary-light-5: #e19995; + --el-color-primary-light-7: #f0c2c0; + --el-color-primary-light-8: #f5d9d8; + --el-color-primary-light-9: #faeeed; + --el-color-primary-dark-2: #9d2822; --purple: var(--el-color-primary); --muted: #909399; --line: #e4e7ed; @@ -30,6 +30,14 @@ body { background: var(--el-bg-color-page); color: var(--el-text-color-primary); } +.el-button--primary { + --el-button-bg-color: var(--el-color-primary); + --el-button-border-color: var(--el-color-primary); + --el-button-hover-bg-color: var(--el-color-primary-dark-2); + --el-button-hover-border-color: var(--el-color-primary-dark-2); + --el-button-active-bg-color: var(--el-color-primary-dark-2); + --el-button-active-border-color: var(--el-color-primary-dark-2); +} .eyebrow { letter-spacing: 0.7px; color: #9298a1; @@ -52,8 +60,8 @@ body { box-shadow: none !important; } .primary-button:hover { - background: var(--el-color-primary-light-3) !important; - border-color: var(--el-color-primary-light-3) !important; + background: var(--el-color-primary-dark-2) !important; + border-color: var(--el-color-primary-dark-2) !important; } .stats-grid { gap: 12px; @@ -73,7 +81,7 @@ body { } .stat-icon { border-radius: var(--app-radius-sm); - background: #ecf5ff !important; + background: var(--el-color-primary-light-9) !important; color: var(--el-color-primary) !important; } .stat-value { @@ -97,7 +105,7 @@ body { color: #61738a; } .chart-svg path:first-of-type { - fill: #d9ecff; + fill: var(--el-color-primary-light-8); } .chart-svg path:last-of-type { stroke: var(--el-color-primary); @@ -241,12 +249,12 @@ body { border-color: #e7e9ec; } .role-active { - border-color: #a0cfff; - background: #ecf5ff; + border-color: var(--el-color-primary-light-5); + background: var(--el-color-primary-light-9); } .role-icon { border-radius: var(--app-radius-sm); - background: #ecf5ff !important; + background: var(--el-color-primary-light-9) !important; color: var(--el-color-primary) !important; } .role-badge { @@ -314,12 +322,12 @@ body { color: #6b7280 !important; } .el-tag.status-badge.is-pending { - --el-tag-bg-color: #ecf5ff; - --el-tag-border-color: #c6e2ff; - --el-tag-text-color: #2b7de9; - background: #ecf5ff !important; - border-color: #c6e2ff !important; - color: #2b7de9 !important; + --el-tag-bg-color: var(--el-color-primary-light-9); + --el-tag-border-color: var(--el-color-primary-light-7); + --el-tag-text-color: var(--el-color-primary); + background: var(--el-color-primary-light-9) !important; + border-color: var(--el-color-primary-light-7) !important; + color: var(--el-color-primary) !important; } .el-tag.status-badge.is-offline { --el-tag-bg-color: #fdecec; diff --git a/src/views/Login/Login.vue b/src/views/Login/Login.vue index ad10cc4..f98d12b 100644 --- a/src/views/Login/Login.vue +++ b/src/views/Login/Login.vue @@ -129,7 +129,7 @@ const themeChange = () => { font-size: 13px; font-weight: 600; letter-spacing: 0.08em; - color: #d9ecff !important; + color: var(--el-color-primary-light-8) !important; } .login-panel { diff --git a/src/views/contentManagement/DramaManagementView.vue b/src/views/contentManagement/DramaManagementView.vue index 6b9db63..2dcbb1b 100644 --- a/src/views/contentManagement/DramaManagementView.vue +++ b/src/views/contentManagement/DramaManagementView.vue @@ -1,7 +1,7 @@