:root { --ink: #1f2933; --muted: #68717d; --line: #d8dee4; --paper: #f4f6f8; --panel: #ffffff; --field: #f9fafb; --teal: #147c72; --teal-dark: #0d5d55; --cinnabar: #c94a36; --amber: #b7822f; --ok: #497c43; --shadow: 0 18px 50px rgba(31, 41, 51, 0.12); color-scheme: light; } * { box-sizing: border-box; } body { margin: 0; background: var(--paper); color: var(--ink); font-family: "Noto Sans CJK SC", "Source Han Sans SC", "Microsoft YaHei", sans-serif; letter-spacing: 0; } button, input, select, textarea { font: inherit; } .topbar { min-height: 76px; display: grid; grid-template-columns: minmax(280px, max-content) minmax(260px, 1fr) max-content; align-items: center; gap: 14px; padding: 14px 22px; border-bottom: 1px solid var(--line); background: rgba(255, 255, 255, 0.94); position: sticky; top: 0; z-index: 10; } #saveState { max-width: min(760px, 100%); justify-self: center; color: var(--ink); font-size: 16px; font-weight: 800; line-height: 1.35; text-align: center; text-decoration: underline; text-underline-offset: 4px; white-space: normal; overflow-wrap: anywhere; overflow: hidden; display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 2; pointer-events: none; } .eyebrow { color: var(--teal); font-size: 12px; font-weight: 800; letter-spacing: 0; } h1 { margin: 2px 0 0; font-size: 22px; font-weight: 800; } .top-actions { display: flex; align-items: center; justify-content: flex-end; gap: 12px; } .top-nav { display: flex; gap: 6px; padding: 4px; border: 1px solid var(--line); border-radius: 8px; background: var(--field); } .nav-button { min-height: 32px; border: 0; padding: 6px 10px; background: transparent; color: var(--muted); } .nav-button.active { background: var(--teal); color: #fff; } .save-state { color: var(--muted); font-size: 13px; } .pg-state { color: var(--ok); font-size: 13px; max-width: 360px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .pg-state.warn { color: var(--cinnabar); } .workspace { height: calc(100vh - 76px); display: grid; grid-template-columns: minmax(320px, 26vw) minmax(420px, 1fr) minmax(390px, 28vw); min-height: 640px; } .page-view.hidden { display: none; } .hidden { display: none !important; } .overview-view, .audit-view, .settings-view { min-height: calc(100vh - 76px); padding: 18px 22px; } .audit-view { height: calc(100vh - 76px); min-height: 0; display: grid; grid-template-rows: auto minmax(0, 1fr); gap: 14px; overflow: hidden; } .audit-history-view { height: calc(100vh - 76px); min-height: 0; } .overview-grid, .batch-grid, .settings-layout { display: grid; gap: 12px; } .overview-grid { grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); margin-bottom: 16px; } .overview-panel, .settings-panel, .audit-toolbar, .audit-detail { border: 1px solid var(--line); border-radius: 8px; background: var(--panel); padding: 16px; } .overview-panel h2 { margin: 0 0 12px; font-size: 18px; } .batch-grid { grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); } .settings-layout { grid-template-columns: minmax(560px, 1fr) minmax(340px, 420px); align-items: start; } .settings-panel { display: grid; gap: 12px; } .settings-heading { display: flex; align-items: center; justify-content: space-between; gap: 12px; } .settings-heading h2 { margin: 0; font-size: 18px; } .settings-side, .new-user-form { display: grid; gap: 12px; } .settings-form-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; } .settings-label { color: var(--muted); font-size: 12px; font-weight: 700; margin-bottom: 7px; } .settings-note { margin: 0; color: var(--muted); font-size: 13px; line-height: 1.6; } .settings-panel label, .audit-toolbar label { display: grid; gap: 6px; color: var(--muted); font-size: 12px; font-weight: 700; } .settings-panel input, .audit-toolbar input, .audit-toolbar select, .audit-history-filters input, .audit-history-filters select { width: 100%; border: 1px solid var(--line); border-radius: 8px; background: var(--field); padding: 10px 11px; color: var(--ink); outline: none; } .audit-toolbar { display: grid; grid-template-columns: minmax(180px, 220px) 150px auto minmax(420px, auto) minmax(150px, 1fr); gap: 10px; align-items: end; } .ai-disabled .audit-toolbar { grid-template-columns: minmax(180px, 220px) 150px auto minmax(150px, 1fr); } .inline-field { display: grid; grid-template-columns: auto minmax(0, 1fr); align-items: center; gap: 8px; } .audit-toolbar label.inline-field, .audit-history-filters .inline-field { display: grid; grid-template-columns: auto minmax(0, 1fr); gap: 8px; align-items: center; } .field-prefix { color: var(--muted); font-size: 12px; font-weight: 900; white-space: nowrap; } .settings-panel input:focus, .audit-toolbar input:focus, .audit-toolbar select:focus, .audit-history-filters input:focus, .audit-history-filters select:focus { border-color: var(--teal); box-shadow: 0 0 0 3px rgba(20, 124, 114, 0.12); } .audit-layout { display: grid; grid-template-columns: minmax(280px, 24vw) minmax(420px, 1fr) minmax(320px, 24vw); gap: 14px; min-height: 0; height: 100%; overflow: hidden; } .audit-history-view .audit-toolbar { grid-template-columns: auto minmax(140px, 1fr); margin-bottom: 0; } .audit-history-layout { height: 100%; min-height: 0; overflow: hidden; grid-template-columns: minmax(300px, 25vw) minmax(440px, 1fr) minmax(340px, 26vw); gap: 16px; } .audit-history-layout > .audit-history-left, .audit-history-layout > .audit-detail, .audit-history-layout > .audit-side, .audit-layout > .queue-list, .audit-layout > .audit-detail, .audit-layout > .audit-side { min-height: 0; max-height: 100%; overflow: auto; overscroll-behavior: contain; } .audit-layout > .audit-detail { border: 0; background: transparent; padding: 2px 4px 14px; } .audit-history-left { display: grid; grid-template-rows: auto minmax(0, 1fr); gap: 12px; overflow: hidden; } .audit-history-layout > .audit-history-left { overflow: hidden; } .audit-history-filters { display: grid; gap: 8px; padding: 12px; border: 1px solid var(--line); border-radius: 8px; background: var(--panel); } .audit-history-left > .queue-list { overflow: auto; align-content: start; padding-right: 4px; gap: 10px; } .audit-history-layout .queue-item { padding: 11px 12px; min-height: 94px; } .audit-history-layout .queue-title { line-height: 1.25; } .audit-history-layout .queue-meta { display: block; margin-top: 3px; line-height: 1.45; white-space: normal; overflow-wrap: anywhere; } .finder-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 8px; } .finder-card { border: 1px solid var(--line); border-radius: 8px; background: var(--field); padding: 10px; } .finder-card strong { display: block; color: var(--ink); font-size: 22px; line-height: 1.1; } .finder-card span { color: var(--muted); font-size: 12px; } .queue-panel, .image-panel, .edit-panel { min-width: 0; min-height: 0; overflow: auto; } .queue-panel { border-right: 1px solid var(--line); padding: 16px; } .queue-panel:focus { outline: none; } .image-panel { padding: 16px 18px; } .edit-panel { border-left: 1px solid var(--line); padding: 16px; background: var(--panel); } .stats-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(86px, 1fr)); gap: 8px; margin-bottom: 12px; } .stat { background: var(--panel); border: 1px solid var(--line); border-radius: 8px; padding: 10px; } .stat strong { display: block; font-size: 24px; line-height: 1; } .stat span { color: var(--muted); font-size: 12px; } .batch-card { border: 1px solid var(--line); border-radius: 8px; background: var(--panel); padding: 12px; } .batch-card h3 { margin: 0 0 10px; font-size: 14px; } .batch-metrics { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 8px; } .batch-metrics span { min-width: 0; color: var(--muted); font-size: 12px; } .batch-metrics strong { display: block; color: var(--ink); font-size: 18px; line-height: 1.1; } .filters { display: grid; gap: 8px; margin-bottom: 12px; } .filter-row { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); gap: 8px; } .filter-row #sortFilter { grid-column: 1 / -1; } .filters .review-filter-field { display: grid; grid-template-columns: auto minmax(0, 1fr); align-items: center; gap: 8px; } .review-status-row { display: grid; grid-template-columns: minmax(0, 1.35fr) minmax(130px, 0.65fr); gap: 8px; align-items: stretch; } .status-segment { display: grid; grid-template-columns: 1fr; padding: 3px; border: 1px solid var(--line); border-radius: 8px; background: #eef3f4; } .status-pill { min-height: 36px; border: 0; border-radius: 6px; padding: 7px 9px; background: transparent; color: var(--muted); font-weight: 800; } .status-pill.active { background: var(--teal); color: #fff; box-shadow: 0 5px 14px rgba(20, 124, 114, 0.18); } .ai-action-panel { border: 1px solid rgba(20, 124, 114, 0.28); border-radius: 8px; background: linear-gradient(180deg, #f5fbf8, #eef6f4); padding: 9px; display: grid; gap: 8px; } .review-ai-panel { margin-top: 2px; } .audit-ai-panel { min-width: 420px; grid-template-columns: auto 1fr; align-items: center; gap: 10px; } .ai-action-title { display: flex; align-items: center; gap: 7px; color: var(--teal-dark); font-size: 12px; font-weight: 900; } .ai-badge { width: 28px; height: 22px; display: inline-grid; place-items: center; border-radius: 7px; background: var(--teal); color: #fff; font-size: 12px; font-weight: 900; } .ai-action-buttons { display: grid; grid-template-columns: 1fr 1fr; gap: 8px; } .review-ai-panel .ai-action-buttons { grid-template-columns: repeat(3, minmax(0, 1fr)); } .audit-ai-panel .ai-action-buttons { min-width: 0; } .ai-button { background: #fff; border-color: rgba(20, 124, 114, 0.34); font-weight: 800; } .filters select, .filters input, .edit-form input, .edit-form textarea { width: 100%; border: 1px solid var(--line); border-radius: 8px; background: var(--field); padding: 10px 11px; color: var(--ink); outline: none; } .filters select:focus, .filters input:focus, .edit-form input:focus, .edit-form textarea:focus { border-color: var(--teal); box-shadow: 0 0 0 3px rgba(20, 124, 114, 0.12); } .queue-list { display: grid; gap: 8px; } .queue-item { width: 100%; text-align: left; background: var(--panel); border: 1px solid var(--line); border-radius: 8px; padding: 10px 11px; cursor: pointer; transition: border-color 0.15s ease, transform 0.15s ease, box-shadow 0.15s ease; } .queue-item:hover, .queue-item.active { border-color: var(--teal); box-shadow: var(--shadow); } .queue-item:hover { transform: translateY(-1px); } .queue-title { font-weight: 800; display: flex; justify-content: space-between; gap: 8px; align-items: center; min-width: 0; } .queue-title > span:first-child { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .queue-badges { display: flex; justify-content: flex-end; gap: 6px; flex: 0 1 auto; flex-wrap: wrap; min-width: 0; } .queue-badges .badge { white-space: nowrap; } .queue-badges .validation-badge { max-width: 100%; } .queue-meta, .record-meta { color: var(--muted); font-size: 12px; line-height: 1.55; } .queue-load-state { color: var(--muted); font-size: 12px; line-height: 1.55; text-align: center; padding: 8px 0 2px; } .badge { display: inline-flex; align-items: center; height: 22px; padding: 0 8px; border-radius: 999px; font-size: 12px; white-space: nowrap; background: #eef1f4; color: var(--muted); } .badge.pending { background: #f3e1dc; color: var(--cinnabar); } .badge.done { background: #dde9dc; color: var(--ok); } .badge.warn { background: #f0e4cb; color: var(--amber); } .badge.ai { background: #dbe7f5; color: #2f5f91; } .record-strip { display: flex; justify-content: space-between; gap: 12px; align-items: flex-start; margin-bottom: 12px; } .index-note { margin-bottom: 10px; border: 1px solid rgba(20, 124, 114, 0.28); border-radius: 8px; background: #f3fbf8; color: var(--teal-dark); padding: 10px 12px; font-size: 15px; font-weight: 800; text-align: center; text-decoration: underline; text-underline-offset: 4px; } .record-title { font-size: 18px; font-weight: 800; } .record-title .title-badges { display: inline-flex; vertical-align: middle; margin-left: 8px; } .crop-frame { background: #e5e9ee; border: 1px solid var(--line); border-radius: 8px; min-height: 280px; display: grid; place-items: center; overflow: auto; cursor: grab; user-select: none; overscroll-behavior: contain; touch-action: none; } .crop-frame.is-dragging { cursor: grabbing; } .crop-frame img { max-width: none; display: block; height: auto; transition: width 0.12s ease; pointer-events: none; } .zoom-actions { display: flex; align-items: center; gap: 8px; margin-top: 8px; } .tips-box, .validation-box { margin-top: 12px; display: grid; gap: 8px; } .tips-box .validation { font-size: 15px; font-weight: 800; text-decoration: underline; text-underline-offset: 4px; } .tip, .validation { border-radius: 8px; border: 1px solid var(--line); background: var(--panel); padding: 9px 10px; font-size: 13px; } .validation.error { border-color: rgba(201, 74, 54, 0.42); color: var(--cinnabar); background: #fff7f4; } .validation.ok { border-color: rgba(73, 124, 67, 0.38); color: var(--ok); background: #f5fbf2; } .validation.info { border-color: rgba(104, 113, 125, 0.28); color: var(--muted); background: #f9fafb; } .model-result { min-height: 150px; border: 1px solid var(--line); border-radius: 8px; padding: 12px; background: var(--field); color: var(--ink); overflow: auto; } .model-result table { width: 100%; border-collapse: collapse; background: var(--panel); border-radius: 8px; overflow: hidden; } .model-result th, .model-result td { border: 1px solid var(--line); padding: 9px 10px; vertical-align: top; text-align: left; font-size: 13px; } .model-result th { width: 120px; color: var(--muted); background: #eef3f4; font-weight: 900; } .model-result pre { margin: 0; white-space: pre-wrap; overflow-wrap: anywhere; font: inherit; } .ai-full-output { border: 1px solid var(--line); border-radius: 8px; background: var(--field); padding: 10px 12px; } .ai-full-output summary { cursor: pointer; color: var(--muted); font-size: 12px; font-weight: 900; } .ai-full-output pre { margin: 10px 0 0; max-height: 220px; overflow: auto; white-space: pre-wrap; overflow-wrap: anywhere; color: var(--ink); font: inherit; font-size: 13px; } .change-log { display: grid; gap: 8px; } .change-log:empty { display: none; } .change-log details { border: 1px solid rgba(20, 124, 114, 0.25); border-radius: 8px; background: #f5fbf8; padding: 10px; } .change-log summary { cursor: pointer; color: var(--teal-dark); font-size: 12px; font-weight: 900; } .change-log-source { margin: 8px 0 0; color: var(--muted); font-size: 12px; font-weight: 800; } .change-log table { width: 100%; border-collapse: collapse; margin-top: 8px; background: var(--panel); } .change-log th, .change-log td { border: 1px solid var(--line); padding: 7px 8px; text-align: left; vertical-align: top; font-size: 12px; } .audit-frame { height: 360px; min-height: 360px; margin: 12px 0; display: block; padding: 0; } .audit-image-stage { width: max-content; height: max-content; min-width: 100%; min-height: 100%; display: flex; align-items: center; justify-content: center; } .audit-image-stage img { flex: 0 0 auto; margin: 0; } .ai-result-section, .ai-prompt-output, .ai-full-output { width: 100%; } .audit-side, .history-card { border: 1px solid var(--line); border-radius: 8px; background: var(--panel); padding: 14px; } .audit-side { display: grid; gap: 12px; align-content: start; } .audit-side h2 { margin: 0; font-size: 17px; } .audit-side label, .model-label { display: grid; gap: 6px; color: var(--muted); font-size: 12px; font-weight: 700; } .audit-side select, .audit-side input, .audit-side textarea, .model-label textarea { width: 100%; border: 1px solid var(--line); border-radius: 8px; background: var(--field); padding: 10px 11px; color: var(--ink); } .patient-kv, .audit-verdict-grid { display: grid; grid-template-columns: auto 1fr; gap: 6px 10px; font-size: 13px; } .audit-edit-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; } .audit-edit-grid label { display: grid; gap: 5px; color: var(--muted); font-size: 12px; font-weight: 700; } .audit-edit-grid label.wide { grid-column: 1 / -1; } .audit-edit-grid textarea { min-height: 72px; resize: vertical; } .patient-kv span:nth-child(odd), .audit-verdict-grid span { color: var(--muted); } .audit-verdict-grid { padding: 10px; border: 1px solid var(--line); border-radius: 8px; background: var(--field); } .audit-verdict-grid strong { min-width: 0; overflow-wrap: anywhere; } .history-list { display: grid; gap: 10px; } .history-card { display: grid; gap: 8px; } .edit-form { display: grid; gap: 12px; } .edit-form label { display: grid; gap: 6px; color: var(--muted); font-size: 12px; font-weight: 700; } .edit-form input, .edit-form textarea { color: var(--ink); font-size: 14px; font-weight: 500; } .form-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; } .check-row { grid-template-columns: auto 1fr !important; align-items: center; } .check-row input { width: 18px; height: 18px; } .button-row { display: grid; grid-template-columns: 1fr 1fr 1fr; gap: 8px; } .review-actions { grid-template-columns: repeat(3, 1fr); } .permission-grid, .settings-list { display: grid; gap: 8px; } .permission-grid { grid-template-columns: repeat(auto-fit, minmax(118px, 1fr)); } .permission-grid label, .user-permissions label { display: inline-flex; align-items: center; gap: 6px; min-height: 38px; padding: 7px 9px; border: 1px solid var(--line); border-radius: 8px; background: var(--field); color: var(--ink); font-size: 13px; font-weight: 500; } .permission-grid input, .user-permissions input { width: auto; } .settings-user { border: 1px solid var(--line); border-radius: 8px; padding: 12px; display: grid; gap: 10px; } .user-permissions { display: grid; grid-template-columns: repeat(auto-fit, minmax(104px, 1fr)); gap: 8px; } button, .ghost-button, .primary-button, .secondary-button, .danger-button { border: 1px solid var(--line); border-radius: 8px; min-height: 40px; padding: 9px 12px; cursor: pointer; text-decoration: none; display: inline-grid; place-items: center; background: var(--panel); color: var(--ink); } button:disabled { cursor: not-allowed; opacity: 0.58; } .compact-button { min-height: 32px; padding: 6px 10px; font-size: 13px; } .primary-button { background: var(--teal); border-color: var(--teal); color: #fff; font-weight: 800; } .primary-button:hover { background: var(--teal-dark); } .secondary-button:hover, .ghost-button:hover { border-color: var(--teal); } .danger-button { color: var(--cinnabar); } .danger-button:hover { border-color: var(--cinnabar); } .login-shell { min-height: 100vh; display: grid; place-items: center; background: var(--paper); } .login-panel { width: min(420px, calc(100vw - 32px)); background: var(--panel); border: 1px solid var(--line); border-radius: 8px; padding: 28px; box-shadow: var(--shadow); } .login-mark { width: 54px; height: 54px; display: grid; place-items: center; border-radius: 8px; background: var(--teal); color: #fff; font-weight: 900; margin-bottom: 16px; } .login-form { display: grid; gap: 14px; } .login-form label { display: grid; gap: 7px; color: var(--muted); font-size: 13px; font-weight: 700; } .login-form input { width: 100%; border: 1px solid var(--line); border-radius: 8px; padding: 11px 12px; background: var(--field); } .login-form button { background: var(--teal); color: white; font-weight: 800; border-color: var(--teal); } .form-error { color: var(--cinnabar); font-size: 13px; } @media (max-width: 1120px) { .workspace { grid-template-columns: 330px minmax(420px, 1fr); height: auto; } .edit-panel { grid-column: 1 / -1; border-left: 0; border-top: 1px solid var(--line); } } @media (max-width: 760px) { .topbar { height: auto; grid-template-columns: 1fr; align-items: flex-start; } #saveState { justify-self: stretch; text-align: left; } .workspace { display: block; } .queue-panel, .image-panel, .edit-panel { border: 0; border-bottom: 1px solid var(--line); } .form-grid, .button-row, .stats-grid, .overview-grid, .settings-layout, .settings-form-grid, .audit-toolbar, .audit-layout { grid-template-columns: 1fr; } }