:root { color-scheme: light; --bg: #f5f7fb; --surface: #ffffff; --surface-soft: #f8fafc; --line: #dbe3ee; --line-strong: #c6d1df; --text: #172033; --muted: #64748b; --brand: #1d4ed8; --brand-dark: #143b8f; --brand-soft: #e7efff; --success: #0f8f6d; --warning: #b7791f; --danger: #c2413d; --info: #2363b8; --shadow: 0 16px 40px rgba(23, 32, 51, 0.08); } * { box-sizing: border-box; } body { margin: 0; min-width: 320px; background: var(--bg); color: var(--text); font-family: "Microsoft YaHei", "PingFang SC", "Segoe UI", Arial, sans-serif; letter-spacing: 0; } [hidden] { display: none !important; } button, input, select, textarea { font: inherit; } button { cursor: pointer; } button:disabled, button.is-disabled { cursor: not-allowed; opacity: 0.45; } .login-screen { min-height: 100vh; display: grid; place-items: center; padding: 32px; background: linear-gradient(135deg, rgba(29, 78, 216, 0.08), rgba(15, 143, 109, 0.08)), var(--bg); } .login-card { width: min(980px, 100%); display: grid; grid-template-columns: minmax(0, 0.9fr) minmax(360px, 1.1fr); gap: 28px; padding: 28px; border: 1px solid var(--line); border-radius: 8px; background: var(--surface); box-shadow: var(--shadow); } .login-copy { display: grid; align-content: center; } .login-copy h1 { margin-bottom: 16px; font-size: 34px; } .login-copy p:last-child { margin: 0; color: var(--muted); line-height: 1.7; } .login-panel { display: grid; gap: 12px; } .login-form { display: grid; gap: 12px; padding: 18px; border: 1px solid var(--line); border-radius: 8px; background: var(--surface-soft); } .register-form { background: var(--surface); } .register-password-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 12px; } .form-heading { display: grid; gap: 4px; } .form-heading strong { font-size: 16px; } .form-heading small { color: var(--muted); line-height: 1.5; } .login-form label { display: grid; gap: 7px; } .login-form label span { color: var(--muted); font-size: 13px; } .login-form input { width: 100%; min-height: 44px; padding: 0 12px; border: 1px solid var(--line); border-radius: 8px; background: var(--surface); } .login-message { min-height: 18px; margin: 0; color: var(--danger); font-size: 13px; } .demo-accounts { display: grid; gap: 10px; } .account-fill-button { min-height: 74px; padding: 14px 16px; border: 1px solid var(--line); border-radius: 8px; background: var(--surface-soft); text-align: left; } .account-fill-button:hover { border-color: var(--brand); box-shadow: 0 0 0 3px rgba(29, 78, 216, 0.1); } .account-fill-button strong, .account-fill-button span, .account-fill-button em { display: block; } .account-fill-button span { margin-top: 5px; color: var(--text); font-size: 13px; } .account-fill-button em { margin-top: 4px; color: var(--muted); font-size: 13px; font-style: normal; } .app-shell { display: grid; grid-template-columns: 260px minmax(0, 1fr); min-height: 100vh; } .sidebar { position: sticky; top: 0; height: 100vh; padding: 22px 18px; background: #0f172a; color: #f8fafc; display: flex; flex-direction: column; gap: 24px; } .brand { display: flex; gap: 12px; align-items: center; } .brand-mark { width: 42px; height: 42px; display: grid; place-items: center; border-radius: 8px; background: #2f80ed; font-weight: 800; } .brand strong, .brand small { display: block; } .brand small { margin-top: 4px; color: #a9b7cc; font-size: 12px; } .nav-list { display: grid; gap: 8px; } .nav-item { width: 100%; display: flex; align-items: center; justify-content: space-between; min-height: 44px; padding: 0 12px; border: 0; border-radius: 8px; background: transparent; color: #d7deea; text-align: left; } .nav-item b { color: #718096; font-size: 12px; } .nav-item:hover, .nav-item.active { background: rgba(255, 255, 255, 0.1); color: #ffffff; } .sidebar-card { margin-top: auto; padding: 16px; border: 1px solid rgba(255, 255, 255, 0.12); border-radius: 8px; background: rgba(255, 255, 255, 0.06); } .sidebar-card p { margin: 10px 0 6px; color: #cbd5e1; } .sidebar-card strong { font-size: 28px; } .status-dot { width: 9px; height: 9px; display: inline-block; border-radius: 50%; background: #4ade80; box-shadow: 0 0 0 5px rgba(74, 222, 128, 0.14); } .main { min-width: 0; padding: 24px; } .topbar, .panel-heading, .top-actions, .form-actions, .modal-header, .drawer-actions { display: flex; align-items: center; } .topbar, .panel-heading, .modal-header { justify-content: space-between; gap: 16px; } .topbar { margin-bottom: 18px; } .eyebrow { margin: 0 0 6px; color: var(--muted); font-size: 12px; font-weight: 700; } h1, h2, h3, p { margin-top: 0; } h1 { margin-bottom: 0; font-size: 28px; line-height: 1.25; } h2 { margin-bottom: 0; font-size: 18px; } h3 { font-size: 15px; } .top-actions, .drawer-actions { gap: 10px; } .user-panel { display: grid; grid-template-columns: auto auto auto auto; align-items: center; gap: 8px; padding: 6px 8px 6px 12px; border: 1px solid var(--line); border-radius: 8px; background: var(--surface); } .user-panel span { color: var(--muted); font-size: 12px; } .user-panel strong { font-size: 13px; } .user-panel em { padding: 3px 7px; border-radius: 999px; background: var(--brand-soft); color: var(--brand); font-size: 12px; font-style: normal; font-weight: 700; } .primary-button, .ghost-button, .icon-button, .success-button, .danger-button, .small-button { border: 1px solid transparent; border-radius: 8px; min-height: 38px; padding: 0 14px; background: var(--surface); color: var(--text); } .primary-button { background: var(--brand); color: #ffffff; } .primary-button:hover { background: var(--brand-dark); } .ghost-button { border-color: var(--line); } .success-button { background: var(--success); color: #ffffff; } .danger-button { background: var(--danger); color: #ffffff; } .small-button { min-height: 30px; padding: 0 10px; border-color: var(--line); font-size: 12px; } .link-button { padding: 0; border: 0; background: transparent; color: var(--brand); font: inherit; font-weight: 800; text-align: left; } .customer-cell-button { width: 100%; min-width: 210px; display: grid; gap: 5px; margin: -8px -10px; padding: 8px 10px; border: 0; border-radius: 8px; background: transparent; color: inherit; text-align: left; } .customer-cell-button:hover, .customer-cell-button:focus-visible { background: var(--brand-soft); } .customer-cell-button strong { color: var(--brand); font-weight: 800; } .customer-cell-button small { color: var(--muted); line-height: 1.45; white-space: normal; } .customer-cell-meta { display: flex; flex-wrap: wrap; gap: 6px; } .icon-button { width: 38px; padding: 0; border-color: var(--line); font-size: 18px; } .filter-bar { display: grid; grid-template-columns: repeat(4, minmax(150px, 1fr)); gap: 12px; margin-bottom: 16px; padding: 14px; border: 1px solid var(--line); border-radius: 8px; background: var(--surface); } label span { display: block; margin-bottom: 6px; color: var(--muted); font-size: 12px; font-weight: 700; } input, select, textarea { width: 100%; border: 1px solid var(--line); border-radius: 8px; background: #ffffff; color: var(--text); outline: none; } input, select { height: 38px; padding: 0 10px; } input[type="checkbox"] { width: auto; height: auto; padding: 0; box-shadow: none; } textarea { resize: vertical; padding: 10px; } input:focus, select:focus, textarea:focus { border-color: var(--brand); box-shadow: 0 0 0 3px rgba(29, 78, 216, 0.12); } .page-section { display: none; } .page-section.active { display: block; } .kpi-grid, .insight-grid, .section-grid, .analysis-grid { display: grid; gap: 16px; } .kpi-grid { grid-template-columns: repeat(4, minmax(0, 1fr)); margin-bottom: 16px; } .metric-card, .panel { border: 1px solid var(--line); border-radius: 8px; background: var(--surface); box-shadow: var(--shadow); } .metric-card { padding: 18px; } .metric-card span, .metric-card em { display: block; color: var(--muted); font-style: normal; } .metric-card strong { display: block; margin: 10px 0 8px; font-size: 28px; line-height: 1; } .metric-card em { font-size: 13px; } .insight-grid { grid-template-columns: 1.1fr 1fr 1fr; margin-bottom: 16px; } .section-grid.two, .analysis-grid { grid-template-columns: minmax(0, 1.45fr) minmax(320px, 0.75fr); } .analysis-grid { grid-template-columns: 1fr 0.8fr 0.8fr; } .panel { min-width: 0; padding: 18px; margin-bottom: 16px; } .panel-chip { display: inline-flex; align-items: center; min-height: 28px; padding: 0 10px; border-radius: 999px; background: #fff3e3; color: var(--warning); font-size: 12px; font-weight: 700; } .funnel { display: grid; gap: 12px; margin-top: 18px; } .funnel-row { width: var(--w); min-height: 48px; display: flex; align-items: center; justify-content: space-between; padding: 0 16px; border-radius: 8px; color: #ffffff; } .tier-a { background: #c2413d; } .tier-b { background: #b7791f; } .tier-c { background: #2363b8; } .bar-list, .rank-list, .risk-list, .checklist, .permission-list, .record-list, .inspection-summary { display: grid; gap: 12px; margin-top: 18px; } .inspection-summary { grid-template-columns: repeat(3, minmax(0, 1fr)); } .inspection-summary article { padding: 14px; border: 1px solid var(--line); border-radius: 8px; background: var(--surface-soft); } .inspection-summary span { color: var(--muted); font-size: 12px; } .inspection-summary strong { display: block; margin-top: 6px; font-size: 24px; } .bar-item { display: grid; grid-template-columns: 68px minmax(0, 1fr) 36px; gap: 10px; align-items: center; } .bar-item span, .bar-item strong { font-size: 13px; } .bar-item div { height: 10px; overflow: hidden; border-radius: 999px; background: var(--brand-soft); } .bar-item i { display: block; height: 100%; border-radius: inherit; background: #2f80ed; } .risk-item { padding: 13px; border-left: 4px solid var(--info); border-radius: 8px; background: var(--surface-soft); } .risk-item b, .risk-item span { display: block; } .risk-item span { margin-top: 5px; color: var(--muted); font-size: 13px; line-height: 1.5; } .risk-item.danger { border-left-color: var(--danger); } .risk-item.warning { border-left-color: var(--warning); } .risk-item.info { border-left-color: var(--info); } .segmented { display: inline-flex; padding: 3px; border: 1px solid var(--line); border-radius: 8px; background: var(--surface-soft); } .segmented button { min-width: 54px; height: 30px; border: 0; border-radius: 6px; background: transparent; color: var(--muted); } .segmented button.active { background: #ffffff; color: var(--brand); box-shadow: 0 2px 8px rgba(23, 32, 51, 0.08); } .table-wrap { margin-top: 14px; overflow-x: auto; } table { width: 100%; border-collapse: collapse; min-width: 1120px; } th, td { padding: 13px 10px; border-bottom: 1px solid var(--line); text-align: left; white-space: nowrap; } th { color: var(--muted); font-size: 12px; font-weight: 700; } tbody tr:hover { background: var(--surface-soft); } .badge, .status-badge, .data-tag { display: inline-flex; align-items: center; min-height: 26px; padding: 0 9px; border-radius: 999px; font-size: 12px; font-weight: 700; } .badge { background: var(--brand-soft); color: var(--brand); } .data-tag { min-height: 22px; margin-left: 6px; padding: 0 7px; background: #f1f5f9; color: var(--muted); font-size: 11px; } .status-badge.closed, .status-badge.normal { background: #e8f7f1; color: var(--success); } .status-badge.audit, .status-badge.orange { background: #fff3e3; color: var(--warning); } .status-badge.risk { background: #ffecec; color: var(--danger); } .status-badge.blue { background: var(--brand-soft); color: var(--brand); } .action-cell { display: flex; gap: 8px; } .drawer-backdrop, .modal-backdrop { position: fixed; inset: 0; z-index: 20; background: rgba(15, 23, 42, 0.32); } .detail-drawer { position: fixed; top: 0; right: 0; z-index: 30; width: min(470px, 100vw); height: 100vh; display: flex; flex-direction: column; background: #ffffff; box-shadow: -22px 0 48px rgba(23, 32, 51, 0.16); transform: translateX(104%); transition: transform 0.22s ease; } .detail-drawer.open { transform: translateX(0); } .drawer-header { display: flex; align-items: center; justify-content: space-between; gap: 16px; padding: 20px; border-bottom: 1px solid var(--line); } .drawer-body { overflow-y: auto; padding: 20px; } .detail-score { padding: 18px; border-radius: 8px; background: var(--brand-soft); } .detail-score span, .detail-score strong { display: block; } .detail-score span { color: var(--muted); } .detail-score strong { margin-top: 8px; color: var(--brand); font-size: 44px; line-height: 1; } .detail-list { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 12px; margin: 16px 0; } .detail-list div { padding: 12px; border: 1px solid var(--line); border-radius: 8px; } dt { color: var(--muted); font-size: 12px; } dd { margin: 6px 0 0; font-weight: 700; } .timeline { padding-top: 8px; } .detail-block { margin: 16px 0; padding: 14px; border: 1px solid var(--line); border-radius: 8px; background: var(--surface-soft); } .detail-block h3, .detail-block p { margin-bottom: 0; } .detail-block p, .muted-text { color: var(--muted); line-height: 1.6; } .record-card { padding: 12px; border: 1px solid var(--line); border-radius: 8px; background: #ffffff; } .record-card div { display: flex; justify-content: space-between; gap: 10px; margin-bottom: 8px; } .record-card span, .record-card small { color: var(--muted); } .record-card p { margin-bottom: 8px; line-height: 1.55; } .timeline ol { display: grid; gap: 12px; margin: 0; padding-left: 20px; } .timeline li { padding-left: 4px; line-height: 1.55; } .drawer-actions { flex-wrap: wrap; margin-top: 18px; padding-top: 18px; border-top: 1px solid var(--line); } .modal { position: fixed; top: 50%; left: 50%; z-index: 40; width: min(760px, calc(100vw - 32px)); max-height: calc(100vh - 48px); overflow-y: auto; padding: 20px; border-radius: 8px; background: #ffffff; box-shadow: 0 24px 70px rgba(15, 23, 42, 0.24); transform: translate(-50%, -50%) scale(0.98); opacity: 0; pointer-events: none; transition: 0.18s ease; } .modal.open { transform: translate(-50%, -50%) scale(1); opacity: 1; pointer-events: auto; } .modal-form, .settings-form { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 12px; margin-top: 18px; } .modal-form .full, .settings-form .full { grid-column: 1 / -1; } .form-actions { justify-content: flex-end; gap: 10px; } .trend { height: 260px; display: grid; grid-template-columns: repeat(7, 1fr); align-items: end; gap: 12px; padding-top: 18px; } .trend span { position: relative; min-height: 28px; border-radius: 8px 8px 0 0; background: linear-gradient(180deg, #2f80ed, #a7c7ff); height: var(--h); } .trend b { position: absolute; left: 50%; bottom: -24px; transform: translateX(-50%); color: var(--muted); font-size: 12px; } .rank-list div, .permission-list div, .insight-note p, .checklist label { padding: 13px; border: 1px solid var(--line); border-radius: 8px; background: var(--surface-soft); } .rank-list div, .permission-list div { display: flex; justify-content: space-between; gap: 12px; } .permission-list div { display: grid; } .permission-list span, .insight-note p { color: var(--muted); line-height: 1.55; } .admin-grid, .admin-kpis, .compact-form, .dictionary-form { display: grid; gap: 12px; } .admin-grid { grid-template-columns: minmax(0, 1.1fr) minmax(360px, 0.9fr); align-items: start; } .admin-kpis { grid-template-columns: repeat(4, minmax(0, 1fr)); margin-bottom: 16px; } .compact-form { grid-template-columns: repeat(5, minmax(0, 1fr)); align-items: end; margin-top: 16px; } .compact-form .form-actions { align-self: end; } .admin-table, .admin-review-table { min-width: 860px; } .admin-review-table { min-width: 1180px; } .inline-input { min-width: 120px; } .role-card-list { display: grid; gap: 12px; margin-top: 16px; } .role-card { display: grid; gap: 14px; padding: 14px; border: 1px solid var(--line); border-radius: 8px; background: var(--surface-soft); } .role-card-head { display: flex; justify-content: space-between; gap: 12px; align-items: flex-start; } .role-card-head strong, .role-card-head span, .role-card-section b { display: block; } .role-card-head span { margin-top: 5px; color: var(--muted); font-size: 13px; line-height: 1.45; } .role-card-section b { margin-bottom: 8px; color: var(--muted); font-size: 12px; } .checkbox-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 8px; } .checkbox-grid label { display: flex; align-items: center; gap: 8px; min-height: 36px; padding: 8px 10px; border: 1px solid var(--line); border-radius: 8px; background: #ffffff; color: var(--text); font-size: 13px; } .checkbox-grid label span { margin: 0; color: inherit; font-size: 13px; font-weight: 600; } .dictionary-form { grid-template-columns: repeat(4, minmax(0, 1fr)); margin-top: 16px; } .toast { position: fixed; right: 24px; bottom: 24px; z-index: 60; max-width: min(360px, calc(100vw - 48px)); padding: 13px 16px; border-radius: 8px; background: #0f172a; color: #ffffff; box-shadow: 0 16px 40px rgba(15, 23, 42, 0.2); opacity: 0; transform: translateY(10px); pointer-events: none; transition: 0.18s ease; } .toast.show { opacity: 1; transform: translateY(0); } .permission-list div.is-current { border-color: var(--brand); background: var(--brand-soft); } @media (max-width: 1180px) { .kpi-grid, .admin-kpis, .insight-grid, .section-grid.two, .analysis-grid, .admin-grid, .dictionary-form { grid-template-columns: repeat(2, minmax(0, 1fr)); } } @media (max-width: 860px) { .login-card { grid-template-columns: 1fr; } .app-shell { grid-template-columns: 1fr; } .sidebar { position: static; height: auto; } .nav-list { grid-template-columns: repeat(2, minmax(0, 1fr)); } .sidebar-card { display: none; } .filter-bar { grid-template-columns: repeat(2, minmax(0, 1fr)); } .compact-form { grid-template-columns: repeat(2, minmax(0, 1fr)); } } @media (max-width: 620px) { .main { padding: 16px; } .topbar, .panel-heading { align-items: flex-start; flex-direction: column; } .top-actions, .segmented { width: 100%; flex-wrap: wrap; } .top-actions .primary-button, .top-actions .ghost-button, .user-panel, .segmented button { flex: 1; } .filter-bar, .kpi-grid, .modal-form, .register-password-grid, .settings-form, .detail-list, .nav-list, .section-grid.two, .analysis-grid, .admin-grid, .admin-kpis, .compact-form, .dictionary-form, .checkbox-grid { grid-template-columns: 1fr; } h1 { font-size: 24px; } } @media (max-width: 760px) { .login-screen { min-height: 100svh; padding: 0; place-items: stretch; } .login-card { width: 100%; min-height: 100svh; grid-template-columns: 1fr; align-content: start; gap: 18px; padding: 22px; border: 0; border-radius: 0; box-shadow: none; } .login-copy h1 { font-size: 24px; } .login-copy p:last-child { line-height: 1.55; } .account-fill-button { min-height: 0; padding: 12px 14px; } .app-shell { display: block; } .sidebar { position: sticky; top: 0; z-index: 15; height: auto; gap: 10px; padding: 10px 10px 8px; border-bottom: 1px solid rgba(255, 255, 255, 0.12); } .brand { gap: 8px; } .brand-mark { width: 32px; height: 32px; } .brand strong { font-size: 14px; } .brand small, .sidebar-card, .nav-item b { display: none; } .nav-list { display: flex; grid-template-columns: none; gap: 8px; overflow-x: auto; padding-bottom: 2px; scrollbar-width: none; } .nav-list::-webkit-scrollbar { display: none; } .nav-item { width: auto; flex: 0 0 auto; min-height: 34px; padding: 0 13px; border-radius: 999px; background: rgba(255, 255, 255, 0.06); } .nav-item span { white-space: nowrap; } .main { padding: 12px 10px 80px; } .topbar { display: grid; gap: 10px; margin-bottom: 12px; } .topbar h1 { font-size: 20px; } .top-actions { width: 100%; display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 8px; } .user-panel { grid-column: 1 / -1; grid-template-columns: 1fr auto auto; min-width: 0; } .user-panel span { display: none; } .user-panel strong { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .top-actions .primary-button, .top-actions .ghost-button { width: 100%; min-height: 40px; padding: 0 10px; } .filter-bar { display: flex; grid-template-columns: none; gap: 8px; overflow-x: auto; margin: 0 -10px 12px; padding: 10px; border-right: 0; border-left: 0; border-radius: 0; scrollbar-width: none; } .filter-bar::-webkit-scrollbar { display: none; } .filter-bar label { flex: 0 0 142px; } .filter-bar .search-field { flex-basis: 220px; } input, select { height: 42px; } .kpi-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 10px; margin-bottom: 12px; } .metric-card, .panel { box-shadow: none; } .metric-card { padding: 13px; } .metric-card strong { margin: 8px 0 6px; font-size: 24px; } .metric-card em { font-size: 12px; } .insight-grid, .section-grid, .section-grid.two, .analysis-grid, .inspection-summary, .admin-grid, .dictionary-form { grid-template-columns: 1fr; gap: 10px; } .panel { padding: 14px; margin-bottom: 12px; } .panel-heading { align-items: flex-start; gap: 10px; } .panel-heading .primary-button, .panel-heading .ghost-button, .panel-heading .segmented { width: 100%; } .segmented { display: flex; overflow-x: auto; gap: 4px; scrollbar-width: none; } .segmented::-webkit-scrollbar { display: none; } .segmented button { min-width: 74px; flex: 0 0 auto; } .table-wrap { overflow: visible; margin-top: 10px; } table, thead, tbody, tr, td { display: block; width: 100%; min-width: 0; } table { border-collapse: separate; } thead { display: none; } tbody { display: grid; gap: 10px; } tr { padding: 12px; border: 1px solid var(--line); border-radius: 8px; background: var(--surface); } tbody tr:hover { background: var(--surface); } td { display: grid; grid-template-columns: 82px minmax(0, 1fr); gap: 10px; align-items: start; padding: 7px 0; border-bottom: 0; white-space: normal; } td::before { content: attr(data-label); color: var(--muted); font-size: 12px; font-weight: 700; } td[data-label="客户"] { padding-top: 0; } td[data-label="操作"] { display: block; padding-top: 10px; border-top: 1px solid var(--line); } td[data-label="操作"]::before { display: none; } .action-cell { flex-wrap: wrap; } .action-cell .small-button { flex: 1 1 88px; min-height: 34px; } .customer-cell-button { min-width: 0; margin: -4px 0; padding: 6px 8px; } .funnel-row, .bar-item, .risk-item { min-width: 0; } .detail-drawer { width: 100vw; box-shadow: none; } .drawer-header, .drawer-body { padding: 16px; } .detail-list { grid-template-columns: 1fr; } .drawer-actions { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); } .drawer-actions button { width: 100%; } .modal { top: auto; right: 0; bottom: 0; left: 0; width: 100vw; max-height: 92svh; padding: 16px; border-radius: 16px 16px 0 0; transform: translateY(104%); } .modal.open { transform: translateY(0); } .modal-form, .settings-form, .compact-form, .checkbox-grid { grid-template-columns: 1fr; } .form-actions { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); } .form-actions button { width: 100%; } .trend { height: 200px; } .toast { right: 12px; bottom: 12px; left: 12px; max-width: none; } }