:root { --surface: #f7f9fb; --surface-soft: #eef2f6; --surface-strong: #e3e8ee; --card: #ffffff; --primary: #041627; --primary-soft: #1a2b3c; --text: #191c1e; --muted: #5f6670; --line: #d8dee6; --line-soft: #edf1f5; --blue: #0f62c6; --blue-soft: #e8f1ff; --green: #008c61; --green-soft: #ddf8ee; --red: #bd1e1e; --red-soft: #ffebe8; --shadow: 0 16px 32px rgba(4, 22, 39, 0.06); --sidebar-bg: #f3f6f9; --nav-text: #303842; --nav-active-bg: #e1e6ec; --topbar-bg: rgba(247, 249, 251, 0.94); --search-bg: #f1f4f8; --control-bg: #fbfcfe; --secondary-bg: #e8edf2; --secondary-hover-bg: #dde5ed; --secondary-hover-border: #c6d0db; --table-header-bg: #f5f7fa; --table-row-hover-bg: #fafcff; --modal-backdrop: rgba(4, 22, 39, 0.32); --primary-rgb: 4, 22, 39; --accent-rgb: 15, 98, 198; --app-font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Microsoft YaHei", sans-serif; --radius-sm: 7px; --radius-md: 8px; --radius-lg: 12px; --topbar-height: 72px; --nav-height: 48px; --control-height: 44px; --base-font-size: 16px; --page-padding: 32px; --content-gap: 24px; --panel-padding: 24px; --table-cell-y: 18px; --table-cell-x: 24px; --layout-sidebar-width: 280px; --layout-sidebar-offset: 280px; --collapsed-sidebar-width: 88px; --collapsed-sidebar-offset: 88px; --content-max-width: none; --motion-duration: 280ms; --motion-duration-fast: 180ms; --motion-easing: cubic-bezier(0.22, 1, 0.36, 1); color: var(--text); background: var(--surface); font-family: var(--app-font-family); } * { box-sizing: border-box; } html, body, #app { min-height: 100%; } body { margin: 0; background: var(--surface); color: var(--text); font-size: var(--base-font-size); -webkit-font-smoothing: antialiased; } button, input, select, textarea { font: inherit; } button { cursor: pointer; } button:disabled { cursor: not-allowed; opacity: 0.62; } a { color: inherit; text-decoration: none; } .app-shell { min-height: 100vh; background: var(--surface); } .main-shell { min-height: 100vh; margin-left: var(--layout-sidebar-offset); transition: margin-left var(--motion-duration) var(--motion-easing); will-change: margin-left; } :root[data-sidebar="floating"] .app-shell { --collapsed-sidebar-offset: calc(var(--collapsed-sidebar-width) + 24px); } .app-shell.is-sidebar-collapsed .main-shell { margin-left: var(--collapsed-sidebar-offset); } .page-shell { padding: var(--page-padding); } .page-shell > .view-stack { max-width: var(--content-max-width); margin-inline: auto; } .sidebar { position: fixed; inset: 0 auto 0 0; z-index: 30; display: flex; width: var(--layout-sidebar-width); flex-direction: column; overflow: hidden; border-right: 1px solid var(--line); background: var(--sidebar-bg); transition: width var(--motion-duration) var(--motion-easing), background var(--motion-duration-fast) ease, border-color var(--motion-duration-fast) ease, box-shadow var(--motion-duration-fast) ease, transform var(--motion-duration) var(--motion-easing); will-change: width, transform; } .app-shell.is-sidebar-collapsed .sidebar { width: var(--collapsed-sidebar-width); } :root[data-sidebar="floating"] .sidebar { inset: 16px auto 16px 16px; border: 1px solid var(--line); border-radius: var(--radius-lg); box-shadow: var(--shadow); } :root[data-sidebar="edge"] .sidebar { border-right: 0; background: var(--primary); } :root[data-sidebar="edge"] .brand-title, :root[data-sidebar="edge"] .brand-subtitle, :root[data-sidebar="edge"] .nav-link { color: white; } :root[data-sidebar="edge"] .brand-mark { background: rgba(255, 255, 255, 0.16); } :root[data-sidebar="edge"] .nav-link:hover, :root[data-sidebar="edge"] .nav-link.is-active { background: rgba(255, 255, 255, 0.16); color: white; } :root[data-layout="fullscreen"] .main-shell { margin-left: 0; } :root[data-layout="fullscreen"] .sidebar { transform: translateX(-110%); } :root[data-layout="fullscreen"] .sidebar.is-open { transform: translateX(0); } :root[data-layout="fullscreen"] .mobile-menu { display: grid; } .brand { display: flex; align-items: center; gap: 12px; padding: calc(var(--panel-padding) + 8px) var(--panel-padding) var(--panel-padding); transition: gap var(--motion-duration) var(--motion-easing), padding var(--motion-duration) var(--motion-easing); } .brand-main { display: flex; align-items: center; gap: 12px; min-width: 0; } .brand-copy { min-width: 0; max-width: 160px; overflow: hidden; opacity: 1; transform: translateX(0); white-space: nowrap; transition: max-width var(--motion-duration) var(--motion-easing), opacity var(--motion-duration-fast) ease, transform var(--motion-duration) var(--motion-easing); } .brand-mark { display: grid; width: 40px; height: 40px; place-items: center; flex: 0 0 auto; border-radius: var(--radius-md); background: var(--primary); color: white; box-shadow: 0 8px 18px rgba(var(--primary-rgb), 0.2); transition: width var(--motion-duration) var(--motion-easing), height var(--motion-duration) var(--motion-easing), border-radius var(--motion-duration-fast) ease, box-shadow var(--motion-duration-fast) ease; } .brand-mark.large { width: 52px; height: 52px; } .brand-title { margin: 0; color: var(--primary); font-size: 18px; font-weight: 800; } .brand-subtitle { margin: 4px 0 0; color: var(--muted); font-size: 12px; } .sidebar-nav { display: grid; flex: 1; align-content: start; gap: 8px; min-height: 0; overflow-y: auto; padding: 16px; transition: gap var(--motion-duration) var(--motion-easing), padding var(--motion-duration) var(--motion-easing); } .sidebar-nav::-webkit-scrollbar { width: 8px; } .sidebar-nav::-webkit-scrollbar-thumb { border: 2px solid var(--sidebar-bg); border-radius: 999px; background: var(--surface-strong); } .app-shell.is-sidebar-collapsed .brand { justify-content: center; gap: 4px; padding-inline: 8px; } .app-shell.is-sidebar-collapsed .brand-main { justify-content: center; } .app-shell.is-sidebar-collapsed .brand-copy, .app-shell.is-sidebar-collapsed .nav-link span { max-width: 0; opacity: 0; pointer-events: none; transform: translateX(-8px); } .app-shell.is-sidebar-collapsed .brand-mark { width: 36px; height: 36px; } .app-shell.is-sidebar-collapsed .sidebar-nav, .app-shell.is-sidebar-collapsed .sidebar-footer { padding-inline: 14px; } .app-shell.is-sidebar-collapsed .nav-link { justify-content: center; gap: 0; padding-inline: 0; } .nav-link { display: flex; align-items: center; gap: 12px; min-height: var(--nav-height); width: 100%; border: 0; border-radius: var(--radius-md); background: transparent; color: var(--nav-text); padding: 0 16px; text-align: left; transition: background var(--motion-duration-fast) ease, color var(--motion-duration-fast) ease, gap var(--motion-duration) var(--motion-easing), padding var(--motion-duration) var(--motion-easing), transform var(--motion-duration-fast) ease; } .nav-link span { max-width: 120px; overflow: hidden; opacity: 1; transform: translateX(0); white-space: nowrap; transition: max-width var(--motion-duration) var(--motion-easing), opacity var(--motion-duration-fast) ease, transform var(--motion-duration) var(--motion-easing); } .nav-link:hover, .nav-link.is-active { background: var(--nav-active-bg); color: var(--blue); } .nav-link.is-active { font-weight: 700; } .nav-button { appearance: none; } .nav-link.danger { color: var(--red); } .sidebar-footer { display: grid; flex: 0 0 auto; gap: 6px; border-top: 1px solid var(--line); padding: 16px; transition: gap var(--motion-duration) var(--motion-easing), padding var(--motion-duration) var(--motion-easing); } .topbar { position: sticky; top: 0; z-index: 20; display: flex; min-height: var(--topbar-height); align-items: center; justify-content: space-between; gap: var(--content-gap); border-bottom: 1px solid var(--line-soft); background: var(--topbar-bg); padding: 0 var(--page-padding); backdrop-filter: blur(14px); } .topbar-left, .topbar-actions { display: flex; align-items: center; gap: 16px; } .global-search { display: flex; width: min(520px, 40vw); min-width: 260px; align-items: center; gap: 10px; border: 1px solid var(--line); border-radius: 999px; background: var(--search-bg); padding: 0 16px; color: var(--muted); } .global-search input { min-height: var(--control-height); width: 100%; border: 0; background: transparent; color: var(--text); outline: 0; } .icon-button { position: relative; display: grid; width: 42px; height: 42px; place-items: center; border: 0; border-radius: 999px; background: transparent; color: var(--nav-text); } .icon-button:hover { background: var(--surface-strong); color: var(--blue); } .mobile-menu { display: none; } .notice-dot { position: absolute; top: 9px; right: 10px; width: 8px; height: 8px; border: 2px solid var(--surface); border-radius: 999px; background: var(--red); } .user-summary { display: flex; align-items: center; gap: 12px; border-left: 1px solid var(--line); padding-left: 20px; } .profile-trigger { border-top: 0; border-right: 0; border-bottom: 0; background: transparent; color: inherit; text-align: left; } .profile-trigger:hover .avatar { border-color: var(--blue); } .user-text { display: grid; gap: 2px; text-align: right; } .user-text strong { color: var(--primary); font-size: 14px; } .user-text span { color: var(--muted); font-size: 12px; } .avatar { display: grid; width: 42px; height: 42px; place-items: center; border: 2px solid var(--line); border-radius: 999px; background: var(--card); color: var(--primary); font-size: 13px; font-weight: 800; overflow: hidden; } .avatar img { width: 100%; height: 100%; object-fit: cover; } .avatar.large { width: 76px; height: 76px; font-size: 20px; } .appearance-panel-layer { position: fixed; inset: 0; z-index: 90; display: grid; align-items: start; justify-items: end; pointer-events: auto; } .appearance-panel { width: min(560px, calc(100vw - 20px)); max-height: 100vh; margin: 0; overflow-y: auto; border: 1px solid var(--line); border-radius: 0 0 0 var(--radius-lg); background: var(--card); box-shadow: 0 28px 70px rgba(var(--primary-rgb), 0.26); color: var(--text); padding: 16px; transform: translateX(0); transition: opacity var(--motion-duration-fast) ease, transform var(--motion-duration) var(--motion-easing); will-change: transform, opacity; } .drawer-slide-enter-active, .drawer-slide-leave-active { transition: opacity var(--motion-duration) ease; } .drawer-slide-enter-from, .drawer-slide-leave-to { opacity: 0; } .drawer-slide-enter-from .appearance-panel, .drawer-slide-leave-to .appearance-panel { opacity: 0; transform: translateX(28px); } .drawer-slide-enter-to .appearance-panel, .drawer-slide-leave-from .appearance-panel { opacity: 1; transform: translateX(0); } .fade-enter-active, .fade-leave-active { transition: opacity var(--motion-duration-fast) ease; } .fade-enter-from, .fade-leave-to { opacity: 0; } :root[data-theme-mode="dark"] .appearance-panel { box-shadow: 0 28px 70px rgba(0, 0, 0, 0.45); } .appearance-panel::-webkit-scrollbar { width: 10px; } .appearance-panel::-webkit-scrollbar-thumb { border: 3px solid var(--card); border-radius: 999px; background: var(--surface-strong); } .appearance-panel-header { display: flex; align-items: flex-start; justify-content: space-between; gap: 12px; margin-bottom: 14px; } .appearance-panel-header .icon-button { width: 32px; height: 32px; } .appearance-panel-header .icon-button svg { width: 18px; height: 18px; } .appearance-panel-header h2, .appearance-section-head h3 { margin: 0; color: var(--primary); } .appearance-panel-header h2 { font-size: 18px; } .appearance-panel-header p { margin: 4px 0 0; color: var(--muted); font-size: 13px; } .appearance-section { display: grid; gap: 8px; } .appearance-section + .appearance-section { margin-top: 16px; } .appearance-section-head { display: flex; align-items: center; gap: 8px; } .appearance-section-head h3 { font-size: 16px; } .appearance-reset { display: grid; width: 22px; height: 22px; place-items: center; border: 1px solid transparent; border-radius: 999px; background: transparent; color: var(--muted); } .appearance-reset svg { width: 14px; height: 14px; } .appearance-reset:hover { border-color: var(--line); background: var(--surface-soft); color: var(--blue); } .appearance-grid { display: grid; gap: 10px; } .mode-grid, .font-grid, .sidebar-grid, .layout-grid { grid-template-columns: repeat(3, minmax(0, 1fr)); } .color-preset-grid { grid-template-columns: repeat(4, minmax(0, 1fr)); } .radius-grid { grid-template-columns: repeat(6, minmax(0, 1fr)); } .density-grid { grid-template-columns: repeat(4, minmax(0, 1fr)); } .content-width-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); } .appearance-choice, .color-preset-choice { position: relative; display: grid; gap: 6px; min-width: 0; border: 1px solid var(--line); border-radius: var(--radius-lg); background: var(--surface); color: var(--text); padding: 6px; text-align: center; transition: background 0.18s ease, border-color 0.18s ease, box-shadow 0.18s ease, transform 0.18s ease; } .appearance-choice:hover, .color-preset-choice:hover, .appearance-choice.is-active, .color-preset-choice.is-active { border-color: var(--blue); box-shadow: none; } .appearance-choice strong, .color-preset-choice strong { color: var(--primary); font-size: 13px; line-height: 1.25; } .choice-check { position: absolute; top: -7px; right: -7px; display: grid; width: 24px; height: 24px; place-items: center; border: 2px solid var(--card); border-radius: 999px; background: var(--blue); color: white; box-shadow: 0 8px 18px rgba(var(--accent-rgb), 0.24); } .choice-check svg { width: 14px; height: 14px; } .theme-mode-choice { align-content: start; padding: 0; } .mode-preview, .layout-preview, .dashboard-preview, .content-width-preview, .density-preview, .radius-preview { position: relative; display: block; overflow: hidden; border-radius: var(--radius-lg); background: var(--surface-soft); } .mode-preview { height: 78px; border: 1px solid var(--line); } .theme-mode-choice strong { padding-bottom: 6px; text-align: left; } .theme-mode-choice strong, .layout-choice strong, .content-width-choice strong, .density-choice strong, .font-choice strong, .radius-choice strong { padding-inline: 2px; } .theme-mode-choice .preview-sidebar { position: absolute; inset: 0 auto 0 0; display: grid; width: 30%; align-content: start; gap: 5px; background: rgba(var(--primary-rgb), 0.08); padding: 11px 8px; } .preview-sidebar i, .density-preview i, .content-width-preview i { display: block; height: 4px; border-radius: 999px; background: currentColor; opacity: 0.55; } .preview-sidebar i:first-child { width: 17px; } .preview-sidebar i:nth-child(2) { width: 27px; } .preview-sidebar i:nth-child(3) { width: 23px; } .preview-chart { position: absolute; left: 40%; top: 29px; display: flex; align-items: end; gap: 4px; color: var(--blue); } .preview-chart i { display: block; width: 5px; border-radius: 3px 3px 0 0; background: currentColor; } .preview-chart i:first-child { height: 11px; } .preview-chart i:nth-child(2) { height: 16px; } .preview-chart i:nth-child(3) { height: 24px; } .preview-pie { position: absolute; top: 14px; right: 14px; width: 28px; height: 28px; border-radius: 999px; background: conic-gradient(var(--blue) 0 32%, var(--surface-strong) 32% 100%); } .preview-card { position: absolute; left: 38%; right: 12px; bottom: 9px; height: 28px; border-radius: var(--radius-md); background: rgba(var(--primary-rgb), 0.1); } .theme-mode-choice.is-system .mode-preview { background: linear-gradient(90deg, #252320 0 50%, #f4f2ef 50% 100%); color: #d8d3ca; } .theme-mode-choice.is-light .mode-preview { background: #f5f6f8; color: #a9a9a9; } .theme-mode-choice.is-dark .mode-preview { background: #12213a; color: #6b94c6; } .color-preset-choice { min-height: 68px; align-content: start; background: transparent; border-color: transparent; padding: 0; } .color-preset-swatch { display: block; height: 42px; border: 1px solid var(--line); border-radius: var(--radius-lg); background: linear-gradient(135deg, var(--preset-from), var(--preset-to)); box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.18); } .color-preset-choice strong { text-align: center; } .font-choice { min-height: 54px; place-items: center; } .font-choice span:first-child { color: var(--primary); font-size: 20px; font-weight: 800; line-height: 1; } .font-auto span:first-child { font-family: var(--app-font-family); } .font-sans span:first-child { font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Microsoft YaHei", sans-serif; } .font-serif span:first-child { font-family: Georgia, "Times New Roman", "Songti SC", "SimSun", serif; } .radius-choice { min-height: 52px; place-items: center; } .radius-preview { width: 100%; height: 24px; border: 1px solid currentColor; border-radius: var(--preview-radius); color: var(--muted); } .radius-preview::before { content: ""; position: absolute; top: 7px; left: 10px; width: 16px; height: 12px; border-top: 2px solid currentColor; border-left: 2px solid currentColor; border-top-left-radius: var(--preview-radius); } .density-choice { min-height: 54px; } .density-preview { display: grid; height: 27px; align-content: center; gap: 4px; color: var(--muted); } .density-preview i:first-child { width: 72%; } .density-preview i:nth-child(2) { width: 64%; } .density-preview i:nth-child(3) { width: 56%; } .density-preview i:nth-child(4) { width: 48%; } .density-preview i:nth-child(5) { width: 42%; } .layout-choice { min-height: 86px; } .layout-preview { height: 58px; border: 1px solid var(--line); } .layout-side { position: absolute; top: 9px; bottom: 9px; left: 9px; display: grid; width: 30px; align-content: start; gap: 5px; border-radius: var(--radius-md); background: rgba(var(--accent-rgb), 0.26); padding: 8px 6px; } .layout-side i { display: block; height: 5px; border-radius: 999px; background: var(--primary); opacity: 0.62; } .layout-side i:first-child { width: 15px; } .layout-side i:nth-child(2) { width: 21px; } .layout-side i:nth-child(3) { width: 18px; } .layout-main { position: absolute; inset: 9px 9px 9px 46px; border-radius: var(--radius-md); background: rgba(var(--primary-rgb), 0.12); } .sidebar-choice.is-embedded .layout-side { top: 0; bottom: 0; left: 0; border-radius: 0; } .sidebar-choice.is-edge .layout-side { top: 0; bottom: 0; left: 0; width: 40px; border-radius: 0; background: var(--primary); } .sidebar-choice.is-edge .layout-main { left: 40px; } .dashboard-preview { height: 58px; border: 1px solid var(--line); } .dashboard-preview i { position: absolute; display: block; border-radius: var(--radius-md); background: rgba(var(--primary-rgb), 0.24); } .dashboard-preview i:first-child { inset: 8px auto auto 8px; width: 24px; height: 42px; background: rgba(var(--accent-rgb), 0.46); } .dashboard-preview i:nth-child(2) { top: 8px; left: 40px; right: 9px; height: 6px; } .dashboard-preview i:nth-child(3) { top: 23px; left: 40px; width: 23px; height: 6px; } .dashboard-preview i:nth-child(4) { left: 40px; bottom: 9px; width: 42px; height: 21px; } .dashboard-preview i:nth-child(5) { right: 10px; bottom: 12px; width: 22px; height: 22px; border-radius: 999px; } .dashboard-layout-choice.is-compact .dashboard-preview i:first-child { width: 6px; } .dashboard-layout-choice.is-compact .dashboard-preview i:nth-child(n + 2) { left: 24px; } .dashboard-layout-choice.is-fullscreen .dashboard-preview i:first-child { display: none; } .dashboard-layout-choice.is-fullscreen .dashboard-preview i:nth-child(n + 2) { left: 9px; } .content-width-choice { min-height: 54px; } .content-width-preview { display: grid; height: 27px; align-content: center; gap: 5px; color: var(--muted); } .content-width-preview i { height: 4px; } .content-width-choice.is-full .content-width-preview i { width: 100%; } .content-width-choice.is-full .content-width-preview i:nth-child(2) { width: 92%; } .content-width-choice.is-full .content-width-preview i:nth-child(3) { width: 74%; } .content-width-choice.is-centered .content-width-preview { justify-items: center; } .content-width-choice.is-centered .content-width-preview i:first-child { width: 100%; } .content-width-choice.is-centered .content-width-preview i:nth-child(2) { width: 55%; } .content-width-choice.is-centered .content-width-preview i:nth-child(3) { width: 38%; } .modal-backdrop { position: fixed; inset: 0; z-index: 80; display: grid; align-items: start; justify-items: center; background: var(--modal-backdrop); overflow-y: auto; padding: 48px 24px; } .profile-modal { width: min(720px, 100%); max-height: min(760px, calc(100vh - 48px)); overflow: auto; border: 1px solid var(--line); border-radius: var(--radius-lg); background: var(--card); box-shadow: 0 26px 64px rgba(var(--primary-rgb), 0.22); } .employee-modal { width: min(980px, 100%); max-height: min(780px, calc(100vh - 48px)); } .modal-header { display: flex; align-items: flex-start; justify-content: space-between; gap: 18px; border-bottom: 1px solid var(--line-soft); padding: 22px 24px; } .modal-header h2 { margin: 0; color: var(--primary); font-size: 22px; } .modal-header p, .profile-avatar-row p { margin: 6px 0 0; color: var(--muted); } .profile-avatar-row { display: flex; align-items: center; gap: 18px; padding: 24px; } .profile-avatar-row strong { display: block; color: var(--primary); font-size: 18px; } .avatar-upload { position: relative; margin-top: 14px; overflow: hidden; } .avatar-upload input { position: absolute; inset: 0; opacity: 0; } .profile-form { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 18px; border-top: 1px solid var(--line-soft); padding: var(--panel-padding); } .employee-modal-form { grid-template-columns: repeat(3, minmax(0, 1fr)); } .password-form { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 18px; border-top: 1px solid var(--line-soft); padding: var(--panel-padding); } .form-section-head { display: flex; align-items: flex-start; justify-content: space-between; gap: 16px; } .form-section-head h3 { margin: 0; color: var(--primary); font-size: 18px; } .form-section-head p { margin: 6px 0 0; color: var(--muted); line-height: 1.5; } .view-stack { display: grid; gap: var(--content-gap); } .page-header { display: flex; align-items: flex-end; justify-content: space-between; gap: 20px; } .page-header h1 { margin: 0; color: var(--primary); font-size: 32px; line-height: 1.2; } .page-header p, .panel-header p, .action-card p { margin: 8px 0 0; color: var(--muted); line-height: 1.6; } .header-actions, .form-actions { display: flex; align-items: center; gap: 12px; flex-wrap: wrap; } .align-right { justify-content: flex-end; } .primary-button, .secondary-button, .link-button, .file-button { display: inline-flex; min-height: var(--control-height); align-items: center; justify-content: center; gap: 9px; border-radius: var(--radius-md); border: 1px solid transparent; padding: 0 18px; font-weight: 700; transition: background 0.18s ease, border-color 0.18s ease, box-shadow 0.18s ease, transform 0.18s ease; } .primary-button { background: var(--blue); color: white; box-shadow: 0 12px 22px rgba(var(--accent-rgb), 0.16); } .primary-button:hover { background: var(--blue); filter: brightness(0.94); } .secondary-button { border-color: var(--line); background: var(--secondary-bg); color: var(--primary); } .secondary-button:hover { border-color: var(--secondary-hover-border); background: var(--secondary-hover-bg); } .link-button { min-height: auto; border: 0; background: transparent; color: var(--blue); padding: 0; font-weight: 800; } .full { width: 100%; } .stats-grid { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: var(--content-gap); } .stat-card, .panel, .action-card { border: 1px solid var(--line); border-radius: var(--radius-lg); background: var(--card); box-shadow: 0 8px 20px rgba(var(--primary-rgb), 0.04); } .stat-card { display: grid; gap: 12px; min-height: 178px; padding: var(--panel-padding); } .stat-head { display: flex; align-items: flex-start; justify-content: space-between; gap: 14px; } .stat-icon, .action-icon { display: grid; place-items: center; border-radius: var(--radius-md); } .stat-icon { width: 52px; height: 52px; background: var(--surface-soft); color: var(--primary); } .tone-blue .stat-icon { background: var(--blue-soft); color: var(--blue); } .tone-green .stat-icon { background: var(--green-soft); color: var(--green); } .tone-red .stat-icon { background: var(--red-soft); color: var(--red); } .stat-meta, .status-chip { display: inline-flex; align-items: center; min-height: 26px; border-radius: var(--radius-sm); padding: 0 10px; font-size: 12px; font-weight: 800; white-space: nowrap; } .stat-meta, .status-chip.neutral { background: var(--surface-soft); color: var(--muted); } .status-chip.green { background: var(--green-soft); color: var(--green); } .status-chip.red { background: var(--red-soft); color: var(--red); } .stat-card p { margin: 0; color: var(--muted); font-size: 13px; font-weight: 800; } .stat-card strong { color: var(--primary); font-size: 28px; line-height: 1.15; } .employee-header-actions { display: flex; align-items: center; justify-content: flex-end; gap: 12px; } .employee-inline-metric { display: flex; min-height: 48px; align-items: center; gap: 10px; border: 1px solid var(--line); border-radius: var(--radius-md); background: rgba(255, 255, 255, 0.58); color: var(--primary); padding: 8px 12px; } .employee-inline-icon { display: grid; width: 34px; height: 34px; place-items: center; border-radius: var(--radius-sm); background: var(--blue-soft); color: var(--blue); } .employee-inline-metric div { display: grid; gap: 1px; } .employee-inline-metric span { color: var(--muted); font-size: 12px; font-weight: 800; } .employee-inline-metric strong { color: var(--primary); font-size: 21px; line-height: 1; } .employee-inline-metric em { border-radius: var(--radius-sm); background: var(--surface-soft); color: var(--muted); padding: 4px 8px; font-size: 12px; font-style: normal; font-weight: 800; white-space: nowrap; } .dashboard-grid, .action-grid { display: grid; grid-template-columns: minmax(0, 0.9fr) minmax(0, 1.6fr); gap: var(--content-gap); } .action-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); } .panel { overflow: hidden; } .panel-header { display: flex; align-items: center; justify-content: space-between; gap: 16px; border-bottom: 1px solid var(--line-soft); padding: calc(var(--panel-padding) - 2px) var(--panel-padding); } .panel-header h2, .action-card h2 { margin: 0; color: var(--primary); font-size: 21px; line-height: 1.3; } .sync-panel, .trend-panel { min-height: 360px; } .compact-list, .detail-grid { display: grid; gap: 18px; margin: 0; padding: var(--panel-padding); } .compact-list div, .detail-grid div { display: flex; align-items: center; justify-content: space-between; gap: 18px; border-bottom: 1px solid var(--line-soft); padding-bottom: 16px; } .compact-list dt, .detail-grid dt { color: var(--muted); font-size: 13px; } .compact-list dd, .detail-grid dd { margin: 0; color: var(--primary); font-weight: 800; text-align: right; } .sync-panel .primary-button { margin: 0 24px 24px; width: calc(100% - 48px); } .legend-line { display: flex; gap: 16px; color: var(--muted); font-size: 13px; } .legend-line span { display: inline-flex; align-items: center; gap: 8px; } .legend-line i { display: inline-block; width: 12px; height: 12px; border-radius: 999px; background: var(--surface-strong); } .legend-line .legend-blue { background: var(--blue); } .bar-chart { display: grid; height: 250px; grid-template-columns: repeat(6, minmax(36px, 1fr)); align-items: end; gap: var(--content-gap); padding: 24px 34px 28px; } .bar-item { position: relative; display: grid; height: 100%; align-items: end; justify-items: center; gap: 10px; } .bar-item strong, .bonus-bar { display: block; width: 50px; border-radius: var(--radius-sm) var(--radius-sm) 0 0; } .bar-item strong { background: var(--blue); } .bonus-bar { position: absolute; bottom: 22px; background: var(--surface-strong); } .bar-item em { font-style: normal; color: var(--muted); font-size: 13px; font-weight: 700; } .action-card { position: relative; display: grid; align-content: start; gap: 18px; min-height: 260px; padding: calc(var(--panel-padding) + 8px); } .action-icon { width: 62px; height: 62px; } .action-icon.blue { background: var(--blue-soft); color: var(--blue); } .action-icon.green { background: var(--green-soft); color: var(--green); } .file-button { position: relative; width: fit-content; background: var(--blue); color: white; } .file-button input { position: absolute; inset: 0; opacity: 0; } .form-grid { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 18px; padding: var(--panel-padding); } .compact-form { grid-template-columns: repeat(2, minmax(0, 1fr)); } .user-form { grid-template-columns: repeat(2, minmax(0, 1fr)); } .span-row { grid-column: 1 / -1; } .field { display: grid; gap: 8px; } .field span, .checkbox-card span { color: var(--muted); font-size: 13px; font-weight: 800; } .field input, .field select, .field textarea, .input-with-icon { min-height: var(--control-height); width: 100%; border: 1px solid var(--line); border-radius: var(--radius-md); background: var(--control-bg); color: var(--text); outline: none; transition: border-color 0.18s ease, box-shadow 0.18s ease; } .field input, .field select, .field textarea { padding: 0 13px; } .field textarea { min-height: 112px; resize: vertical; padding: 12px 13px; } .field input:focus, .field select:focus, .field textarea:focus, .input-with-icon:focus-within { border-color: var(--blue); box-shadow: 0 0 0 4px rgba(var(--accent-rgb), 0.12); } .checkbox-card, .checkbox-line { display: flex; align-items: center; gap: 10px; } .checkbox-card { min-height: var(--control-height); align-self: end; border: 1px solid var(--line); border-radius: var(--radius-md); background: var(--control-bg); padding: 0 14px; } .form-actions { border-top: 1px solid var(--line-soft); padding: 18px 24px 24px; } .search-form { display: grid; grid-template-columns: minmax(0, 1fr) auto; align-items: end; gap: 16px; padding: 24px; } .table-filter-bar { display: grid; grid-template-columns: minmax(220px, 1fr) minmax(150px, 190px) auto; align-items: end; gap: 12px; border-bottom: 1px solid var(--line-soft); padding: 14px var(--panel-padding); } .table-filter-bar .field { gap: 6px; } .table-filter-bar .field input, .table-filter-bar .field select { min-height: 40px; } .table-pagination { display: flex; align-items: center; justify-content: space-between; gap: 16px; border-top: 1px solid var(--line-soft); padding: 18px 24px 24px; } .table-pagination p { margin: 0; color: var(--muted); font-weight: 700; } .table-pagination .form-actions { border-top: 0; padding: 0; } .compact-select, .table-input, .table-textarea { border: 1px solid var(--line); border-radius: var(--radius-sm); background: var(--control-bg); color: var(--text); outline: 0; } .compact-select { min-height: 38px; padding: 0 12px; } .table-input { min-height: 36px; width: min(180px, 100%); padding: 0 10px; } .table-textarea { min-height: 54px; width: min(320px, 100%); resize: vertical; padding: 8px 10px; } .table-wrap { width: 100%; overflow-x: auto; } .data-table { width: 100%; min-width: 860px; border-collapse: collapse; } .data-table th, .data-table td { border-bottom: 1px solid var(--line-soft); padding: var(--table-cell-y) var(--table-cell-x); text-align: left; vertical-align: middle; } .data-table th { background: var(--table-header-bg); color: var(--muted); font-size: 12px; font-weight: 800; } .data-table td { color: var(--text); } .data-table tr:hover td { background: var(--table-row-hover-bg); } .data-table td strong { display: block; color: var(--primary); } .data-table td span { display: block; margin-top: 4px; color: var(--muted); font-size: 12px; } .mono { font-family: "JetBrains Mono", "SFMono-Regular", Consolas, monospace; } .strong { font-weight: 800; } .note-cell { max-width: 260px; color: var(--muted); } .operation-log-table { min-width: 1080px; } .operation-log-table td span { max-width: 220px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .log-detail-cell { max-width: 320px; overflow: hidden; color: var(--muted); text-overflow: ellipsis; white-space: nowrap; } .empty-state { display: grid; min-height: 150px; place-items: center; color: var(--muted); padding: 24px; } .recent-list { display: grid; gap: 10px; padding: 18px 24px 8px; } .recent-item { display: grid; grid-template-columns: auto minmax(0, 1fr) auto; align-items: center; gap: 14px; width: 100%; border: 1px solid var(--line-soft); border-radius: var(--radius-md); background: var(--control-bg); color: var(--text); padding: 14px; text-align: left; } .recent-item:hover { border-color: var(--blue); } .recent-item span, .recent-item em { display: block; } .recent-item strong { color: var(--primary); } .recent-item em, .recent-item small { color: var(--muted); font-style: normal; } .form-error, .form-success { margin: 0; border-radius: var(--radius-md); padding: 12px 14px; font-weight: 700; } .form-error { background: var(--red-soft); color: var(--red); } .form-success { background: var(--green-soft); color: var(--green); } .spin { animation: spin 0.9s linear infinite; } .login-screen { display: grid; min-height: 100vh; grid-template-columns: minmax(420px, 42vw) minmax(0, 1fr); background: var(--surface); } .login-form-side { display: grid; place-items: center; padding: 48px; } .login-card { width: min(440px, 100%); } .login-brand { margin-bottom: 28px; } .login-brand h1 { margin: 22px 0 8px; color: var(--primary); font-size: 28px; line-height: 1.2; } .login-brand p { margin: 0; color: var(--muted); } .form-stack { display: grid; gap: 18px; } .input-with-icon { display: flex; align-items: center; gap: 12px; padding: 0 13px; } .input-with-icon input { min-height: var(--control-height); flex: 1; border: 0; background: transparent; outline: 0; } .input-action { display: grid; width: 34px; height: 34px; place-items: center; border: 0; border-radius: 999px; background: transparent; color: var(--muted); } .input-action:hover { background: var(--surface-soft); } .login-footer { display: flex; flex-wrap: wrap; gap: 14px 22px; margin-top: 42px; border-top: 1px solid var(--line); padding-top: 24px; color: var(--muted); } .login-footer p { flex-basis: 100%; margin: 0; } .login-footer span { color: var(--primary); font-weight: 700; } .login-visual { position: relative; display: grid; place-items: center; overflow: hidden; background: linear-gradient(135deg, rgba(var(--primary-rgb), 0.94), rgba(var(--accent-rgb), 0.86)), repeating-linear-gradient(90deg, rgba(255, 255, 255, 0.08) 0 1px, transparent 1px 74px), repeating-linear-gradient(0deg, rgba(255, 255, 255, 0.05) 0 1px, transparent 1px 74px); color: white; padding: 48px; } .ledger-visual { width: min(620px, 100%); border: 1px solid rgba(255, 255, 255, 0.16); border-radius: var(--radius-lg); background: rgba(255, 255, 255, 0.07); padding: 48px; box-shadow: 0 28px 60px rgba(0, 0, 0, 0.24); } .ledger-visual h2 { margin: 24px 0 18px; font-size: 44px; line-height: 1.18; } .ledger-visual p { margin: 0; color: rgba(255, 255, 255, 0.82); font-size: 17px; line-height: 1.7; } .visual-metrics { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: var(--content-gap); margin-top: 34px; border-top: 1px solid rgba(255, 255, 255, 0.16); padding-top: 28px; } .visual-metrics strong, .visual-metrics span { display: block; } .visual-metrics strong { font-size: 32px; } .visual-metrics span { margin-top: 4px; color: rgba(255, 255, 255, 0.68); } .security-line { position: absolute; right: 32px; bottom: 28px; display: inline-flex; align-items: center; gap: 8px; color: rgba(255, 255, 255, 0.58); font-family: "JetBrains Mono", "SFMono-Regular", Consolas, monospace; font-size: 13px; } @keyframes spin { to { transform: rotate(360deg); } } @media (max-width: 1120px) { .appearance-panel { width: min(540px, calc(100vw - 16px)); padding: 14px; } .color-preset-grid, .density-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); } .radius-grid { grid-template-columns: repeat(3, minmax(0, 1fr)); } .stats-grid, .dashboard-grid, .action-grid, .form-grid, .password-form { grid-template-columns: repeat(2, minmax(0, 1fr)); } .login-screen { grid-template-columns: 1fr; } .login-visual { display: none; } } @media (max-width: 820px) { .main-shell { margin-left: 0; } .sidebar { transform: translateX(-100%); } .sidebar.is-open { transform: translateX(0); } .sidebar-scrim { position: fixed; inset: 0; z-index: 25; background: var(--modal-backdrop); } .mobile-menu { display: grid; } .topbar { padding: 0 18px; } .global-search { width: min(100%, 420px); min-width: 0; } .user-text { display: none; } .page-shell { padding: 22px; } .page-header { align-items: stretch; flex-direction: column; } .mode-grid, .font-grid, .sidebar-grid, .layout-grid, .content-width-grid { grid-template-columns: 1fr; } .header-actions, .form-actions { width: 100%; } .employee-header-actions { justify-content: flex-start; flex-wrap: wrap; } .employee-inline-metric { flex: 0 1 auto; } .table-pagination { align-items: stretch; flex-direction: column; } .header-actions > *, .form-actions > * { flex: 1 1 auto; } } @media (max-width: 640px) { .appearance-panel { width: 100vw; max-height: 100vh; border-radius: 0; padding: 16px; } .appearance-panel-header h2 { font-size: 17px; } .appearance-section-head h3 { font-size: 15px; } .color-preset-grid, .radius-grid, .density-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); } .stats-grid, .dashboard-grid, .action-grid, .form-grid, .user-form, .password-form, .search-form, .table-filter-bar, .visual-metrics { grid-template-columns: 1fr; } .employee-header-actions { align-items: stretch; flex-direction: column; } .employee-inline-metric { justify-content: flex-start; } .login-form-side { padding: 28px 20px; } .topbar-actions { gap: 8px; } .global-search { display: none; } .page-header h1 { font-size: 27px; } } @media (prefers-reduced-motion: reduce) { :root { --motion-duration: 1ms; --motion-duration-fast: 1ms; } }