542 lines
10 KiB
CSS
542 lines
10 KiB
CSS
/**
|
|
* CTMS 全局样式系统
|
|
* 参考 shadcn-admin 的轻量、中性、分层风格
|
|
*/
|
|
|
|
@import url("https://fonts.googleapis.com/css2?family=Manrope:wght@400;500;600;700;800&display=swap");
|
|
|
|
:root {
|
|
/* 品牌色 - 低饱和蓝灰 */
|
|
--ctms-primary: #3f5d75;
|
|
--ctms-primary-hover: #365067;
|
|
--ctms-primary-active: #2b4356;
|
|
--ctms-primary-light: #e6edf2;
|
|
--ctms-brand-900: #13243a;
|
|
--ctms-brand-700: #24496f;
|
|
|
|
/* 语义色 */
|
|
--ctms-success: #3f8f6b;
|
|
--ctms-warning: #c58b2a;
|
|
--ctms-danger: #c24b4b;
|
|
--ctms-info: #64748b;
|
|
|
|
/* 文字颜色 - 高层级到低层级 */
|
|
--ctms-text-main: #0f172a;
|
|
--ctms-text-regular: #334155;
|
|
--ctms-text-secondary: #64748b;
|
|
--ctms-text-disabled: #94a3b8;
|
|
|
|
/* 中性色 & 背景 */
|
|
--ctms-bg-base: #f9fafb;
|
|
--ctms-bg-card: #ffffff;
|
|
--ctms-bg-muted: #f3f4f6;
|
|
--ctms-neutral-100: #f5f7fa;
|
|
--ctms-neutral-300: #d5dce5;
|
|
--ctms-border-color: #e5e7eb;
|
|
--ctms-border-color-hover: #cbd5e1;
|
|
|
|
/* 间距 - 8px 网格 */
|
|
--ctms-spacing-xs: 4px;
|
|
--ctms-spacing-sm: 8px;
|
|
--ctms-spacing-md: 16px;
|
|
--ctms-spacing-lg: 24px;
|
|
--ctms-spacing-xl: 32px;
|
|
|
|
/* 圆角 & 阴影 */
|
|
--ctms-radius-sm: 6px;
|
|
--ctms-radius: 10px;
|
|
--ctms-radius-lg: 12px;
|
|
--ctms-radius-round: 50%;
|
|
|
|
--ctms-shadow-sm: 0 1px 2px rgba(15, 23, 42, 0.04);
|
|
--ctms-shadow: 0 8px 20px rgba(15, 23, 42, 0.06);
|
|
--ctms-shadow-md: 0 12px 26px rgba(15, 23, 42, 0.08);
|
|
--ctms-shadow-lg: 0 20px 40px rgba(15, 23, 42, 0.1);
|
|
|
|
/* 动画 */
|
|
--ctms-transition: all 0.25s cubic-bezier(0.22, 1, 0.36, 1);
|
|
--ctms-focus-ring: 0 0 0 3px rgba(36, 73, 111, 0.2);
|
|
|
|
/* Element Plus 主色适配 */
|
|
--el-color-primary: var(--ctms-primary);
|
|
--el-color-primary-light-3: #9bb1c2;
|
|
--el-color-primary-light-5: #c0cdd7;
|
|
--el-color-primary-light-7: #dde5ec;
|
|
--el-color-primary-light-8: #eef2f6;
|
|
--el-color-primary-dark-2: #2b4356;
|
|
--el-border-radius-base: var(--ctms-radius);
|
|
--el-border-color: var(--ctms-border-color);
|
|
--el-text-color-primary: var(--ctms-text-main);
|
|
--el-text-color-regular: var(--ctms-text-regular);
|
|
}
|
|
|
|
/* 现代滚动条 */
|
|
::-webkit-scrollbar {
|
|
width: 6px;
|
|
height: 6px;
|
|
}
|
|
|
|
::-webkit-scrollbar-track {
|
|
background: transparent;
|
|
}
|
|
|
|
::-webkit-scrollbar-thumb {
|
|
background: #d9d9d9;
|
|
border-radius: 10px;
|
|
}
|
|
|
|
::-webkit-scrollbar-thumb:hover {
|
|
background: #bfbfbf;
|
|
}
|
|
|
|
/* 全局重置 */
|
|
html,
|
|
body,
|
|
#app {
|
|
min-height: 100%;
|
|
}
|
|
|
|
body {
|
|
margin: 0;
|
|
font-family: "Manrope", "Segoe UI", sans-serif;
|
|
background: var(--ctms-bg-base);
|
|
color: var(--ctms-text-main);
|
|
-webkit-font-smoothing: antialiased;
|
|
}
|
|
|
|
/* Element Plus 全局覆盖 */
|
|
|
|
/* 按钮美化 */
|
|
.el-button {
|
|
border-radius: var(--ctms-radius);
|
|
font-weight: 600;
|
|
transition: var(--ctms-transition);
|
|
}
|
|
|
|
.el-button--primary {
|
|
background-color: var(--ctms-primary);
|
|
border-color: var(--ctms-primary);
|
|
}
|
|
|
|
.el-button--primary:hover {
|
|
background-color: var(--ctms-primary-hover);
|
|
border-color: var(--ctms-primary-hover);
|
|
}
|
|
|
|
.el-button--default {
|
|
background-color: #fff;
|
|
border-color: var(--ctms-border-color);
|
|
color: var(--ctms-text-regular);
|
|
}
|
|
|
|
.el-button--default:hover {
|
|
border-color: var(--ctms-border-color-hover);
|
|
color: var(--ctms-text-main);
|
|
}
|
|
|
|
.el-button--danger.is-plain {
|
|
color: var(--ctms-danger);
|
|
border-color: rgba(194, 75, 75, 0.4);
|
|
background-color: rgba(194, 75, 75, 0.04);
|
|
}
|
|
|
|
.el-button--default,
|
|
.el-button--primary,
|
|
.el-button--danger,
|
|
.el-button--success,
|
|
.el-button--warning {
|
|
height: 34px;
|
|
padding: 0 14px;
|
|
font-size: 13px;
|
|
}
|
|
|
|
.el-button--small {
|
|
height: 28px;
|
|
padding: 0 10px;
|
|
font-size: 12px;
|
|
}
|
|
|
|
.el-button--large {
|
|
height: 40px;
|
|
padding: 0 18px;
|
|
font-size: 14px;
|
|
}
|
|
|
|
/* 卡片美化 */
|
|
.el-card {
|
|
border: 1px solid var(--ctms-border-color);
|
|
box-shadow: none !important;
|
|
border-radius: var(--ctms-radius-lg);
|
|
margin-bottom: var(--ctms-spacing-md);
|
|
}
|
|
|
|
.el-card__header {
|
|
padding: var(--ctms-spacing-md) var(--ctms-spacing-lg);
|
|
border-bottom: 1px solid var(--ctms-border-color);
|
|
font-weight: 600;
|
|
color: var(--ctms-text-main);
|
|
}
|
|
|
|
.el-card__body {
|
|
padding: var(--ctms-spacing-lg);
|
|
}
|
|
|
|
/* 表格美化 */
|
|
.el-table {
|
|
color: var(--ctms-text-regular);
|
|
}
|
|
|
|
.el-table th.el-table__cell {
|
|
background-color: #f6f7f9;
|
|
color: var(--ctms-text-main);
|
|
font-weight: 600;
|
|
height: 44px;
|
|
}
|
|
|
|
.el-table td.el-table__cell {
|
|
padding: 10px 0;
|
|
}
|
|
|
|
.el-table--enable-row-hover .el-table__row:hover>td.el-table__cell {
|
|
background-color: #f2f5f8;
|
|
}
|
|
|
|
/* 表单美化 */
|
|
.el-form-item__label {
|
|
font-weight: 500;
|
|
color: var(--ctms-text-regular);
|
|
}
|
|
|
|
.el-input__inner {
|
|
border-radius: var(--ctms-radius);
|
|
}
|
|
|
|
.el-input__wrapper {
|
|
border-radius: var(--ctms-radius);
|
|
background-color: #ffffff;
|
|
min-height: 34px;
|
|
}
|
|
|
|
.el-select .el-input__wrapper {
|
|
background-color: #ffffff;
|
|
}
|
|
|
|
.el-input--small .el-input__wrapper,
|
|
.el-select--small .el-input__wrapper {
|
|
min-height: 30px;
|
|
}
|
|
|
|
.el-input--large .el-input__wrapper,
|
|
.el-select--large .el-input__wrapper {
|
|
min-height: 40px;
|
|
}
|
|
|
|
.el-form-item {
|
|
margin-bottom: 16px;
|
|
}
|
|
|
|
.ctms-form--dense .el-form-item {
|
|
margin-bottom: 12px;
|
|
}
|
|
|
|
.el-form-item__error {
|
|
color: #b45309;
|
|
font-size: 12px;
|
|
}
|
|
|
|
/* 标签美化 */
|
|
.el-tag {
|
|
border-radius: 999px;
|
|
border: none;
|
|
}
|
|
|
|
.el-tag--info {
|
|
background-color: #f5f5f5;
|
|
color: var(--ctms-text-secondary);
|
|
}
|
|
|
|
.el-tag--success {
|
|
background-color: rgba(63, 143, 107, 0.12);
|
|
color: var(--ctms-success);
|
|
border: 1px solid rgba(63, 143, 107, 0.2);
|
|
}
|
|
|
|
.el-tag--warning {
|
|
background-color: rgba(197, 139, 42, 0.12);
|
|
color: var(--ctms-warning);
|
|
border: 1px solid rgba(197, 139, 42, 0.2);
|
|
}
|
|
|
|
.el-tag--danger {
|
|
background-color: rgba(194, 75, 75, 0.12);
|
|
color: var(--ctms-danger);
|
|
border: 1px solid rgba(194, 75, 75, 0.2);
|
|
}
|
|
|
|
.el-alert {
|
|
border: 1px solid var(--ctms-border-color);
|
|
background-color: #ffffff;
|
|
}
|
|
|
|
.el-alert__title {
|
|
font-size: 13px;
|
|
color: var(--ctms-text-regular);
|
|
}
|
|
|
|
.el-alert--warning .el-alert__icon {
|
|
color: var(--ctms-warning);
|
|
}
|
|
|
|
.el-alert--success .el-alert__icon {
|
|
color: var(--ctms-success);
|
|
}
|
|
|
|
.el-alert--error .el-alert__icon {
|
|
color: var(--ctms-danger);
|
|
}
|
|
|
|
.el-button.is-disabled,
|
|
.el-input.is-disabled .el-input__wrapper,
|
|
.el-select.is-disabled .el-input__wrapper {
|
|
opacity: 0.6;
|
|
}
|
|
|
|
.el-empty__description {
|
|
color: var(--ctms-text-secondary);
|
|
}
|
|
|
|
.el-skeleton__item {
|
|
background: linear-gradient(90deg, #f2f3f5 25%, #eceef1 37%, #f2f3f5 63%);
|
|
}
|
|
|
|
/* 页面结构与筛选区域 */
|
|
.ctms-page {
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: var(--ctms-spacing-lg);
|
|
}
|
|
|
|
.ctms-page-header {
|
|
display: flex;
|
|
justify-content: space-between;
|
|
align-items: flex-end;
|
|
gap: 16px;
|
|
}
|
|
|
|
.ctms-page-title {
|
|
font-size: 22px;
|
|
font-weight: 600;
|
|
color: var(--ctms-text-main);
|
|
margin: 0;
|
|
}
|
|
|
|
.ctms-page-title,
|
|
.ctms-page-subtitle,
|
|
.page-title,
|
|
.page-subtitle {
|
|
display: none;
|
|
}
|
|
|
|
|
|
.ctms-page-actions {
|
|
display: flex;
|
|
align-items: center;
|
|
gap: 12px;
|
|
}
|
|
|
|
.ctms-filter-card {
|
|
margin-bottom: 0;
|
|
}
|
|
|
|
.ctms-filter-row {
|
|
display: flex;
|
|
align-items: flex-end;
|
|
gap: 12px;
|
|
flex-wrap: wrap;
|
|
}
|
|
|
|
.ctms-filter-item {
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: 4px;
|
|
min-width: 144px;
|
|
}
|
|
|
|
.ctms-filter-label {
|
|
font-size: 12px;
|
|
font-weight: 600;
|
|
color: var(--ctms-text-regular);
|
|
}
|
|
|
|
.ctms-filter-spacer {
|
|
flex: 1;
|
|
}
|
|
|
|
.ctms-table-card {
|
|
margin-bottom: 0;
|
|
border: 0;
|
|
border-radius: 0;
|
|
box-shadow: none !important;
|
|
background: transparent;
|
|
}
|
|
|
|
.ctms-table-card > .el-card__body {
|
|
padding: 0;
|
|
}
|
|
|
|
.ctms-table .el-table__row {
|
|
cursor: pointer;
|
|
}
|
|
|
|
.ctms-pagination {
|
|
margin-top: 10px;
|
|
display: flex;
|
|
justify-content: flex-end;
|
|
}
|
|
|
|
.ctms-section-card {
|
|
border: 1px solid var(--ctms-border-color);
|
|
}
|
|
|
|
.ctms-section-title {
|
|
font-size: 15px;
|
|
font-weight: 600;
|
|
color: var(--ctms-text-main);
|
|
}
|
|
|
|
.ctms-section-header {
|
|
display: flex;
|
|
justify-content: space-between;
|
|
align-items: center;
|
|
margin-bottom: 16px;
|
|
}
|
|
|
|
.ctms-section-actions {
|
|
display: flex;
|
|
gap: 8px;
|
|
}
|
|
|
|
.ctms-section-card {
|
|
margin-bottom: 16px;
|
|
}
|
|
|
|
.ctms-page-subtitle {
|
|
margin: 6px 0 0;
|
|
font-size: 13px;
|
|
color: var(--ctms-text-secondary);
|
|
}
|
|
|
|
.ctms-descriptions {
|
|
margin-top: 0;
|
|
}
|
|
|
|
.ctms-descriptions :deep(.el-descriptions__label) {
|
|
font-weight: 500;
|
|
color: var(--ctms-text-regular);
|
|
background-color: #f8fafc;
|
|
}
|
|
|
|
.ctms-tabs :deep(.el-tabs__nav-wrap::after) {
|
|
height: 1px;
|
|
background-color: var(--ctms-border-color);
|
|
}
|
|
|
|
.ctms-tabs :deep(.el-tabs__item) {
|
|
font-weight: 500;
|
|
color: var(--ctms-text-regular);
|
|
}
|
|
|
|
.ctms-tabs :deep(.el-tabs__item.is-active) {
|
|
color: var(--ctms-primary);
|
|
font-weight: 600;
|
|
}
|
|
|
|
/* Unified loading / empty / error states */
|
|
.ctms-state {
|
|
display: flex;
|
|
flex-direction: column;
|
|
align-items: center;
|
|
justify-content: center;
|
|
gap: 8px;
|
|
padding: 28px 16px;
|
|
text-align: center;
|
|
border: 1px solid var(--ctms-border-color);
|
|
border-radius: var(--ctms-radius);
|
|
background: #ffffff;
|
|
}
|
|
|
|
.ctms-state-icon {
|
|
font-size: 34px;
|
|
}
|
|
|
|
.ctms-state-title {
|
|
margin: 0;
|
|
font-size: 15px;
|
|
font-weight: 600;
|
|
}
|
|
|
|
.ctms-state-desc {
|
|
margin: 0;
|
|
font-size: 13px;
|
|
color: var(--ctms-text-secondary);
|
|
}
|
|
|
|
.ctms-state-action {
|
|
margin-top: 4px;
|
|
}
|
|
|
|
.ctms-state-loading .ctms-state-skeleton {
|
|
width: min(560px, 100%);
|
|
margin-top: 4px;
|
|
}
|
|
|
|
/* Tool classes */
|
|
.text-main {
|
|
color: var(--ctms-text-main);
|
|
}
|
|
|
|
.text-secondary {
|
|
color: var(--ctms-text-secondary);
|
|
}
|
|
|
|
.text-danger {
|
|
color: var(--ctms-danger);
|
|
}
|
|
|
|
.text-primary {
|
|
color: var(--ctms-primary);
|
|
}
|
|
|
|
.font-medium {
|
|
font-weight: 500;
|
|
}
|
|
|
|
.font-mono {
|
|
font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
|
|
}
|
|
|
|
.text-xs {
|
|
font-size: 12px;
|
|
}
|
|
|
|
.text-sm {
|
|
font-size: 13px;
|
|
}
|
|
|
|
/* ============================================================
|
|
* 全局弹窗定位修复:弹窗仅显示在主内容区域,不覆盖左侧菜单栏
|
|
* --ctms-sidebar-width 由 Layout.vue 在 body 上动态设置
|
|
* ============================================================ */
|
|
|
|
/* ElMessage 提示消息:按“主内容区域”居中(而非全窗口/左上角) */
|
|
.el-message {
|
|
left: calc((100% + var(--ctms-sidebar-width, 0px)) / 2) !important;
|
|
margin-left: 0 !important;
|
|
transform: translateX(-50%) !important;
|
|
}
|
|
|
|
/* ElMessageBox / ElDialog 遮罩层:左侧偏移侧边栏宽度,只覆盖主内容区域 */
|
|
.el-overlay {
|
|
left: var(--ctms-sidebar-width, 0px) !important;
|
|
}
|