/* Visual baseline: frontend/src/styles/theme.css, PlatformLayout.vue and OperationLogsView.vue.
   Native controls keep the same dimensions; login-specific rules live in login-adapter.css. */
:root{--primary:#1769aa;--page:#f5f7fa;--text:#273142;--secondary:#667085;--muted:#98a2b3;--border:#e8ecf2;--sidebar:232px}
*{box-sizing:border-box}body{margin:0;background:var(--page);color:var(--text);font:13px/1.6 -apple-system,"Microsoft YaHei","PingFang SC",sans-serif;-webkit-font-smoothing:antialiased}button,input,select{font:inherit}button,a,input,select,summary{outline-offset:3px}button{cursor:pointer;transition:background .15s;border:0}button:disabled{cursor:not-allowed;opacity:.5}a{color:var(--primary);text-decoration:none}h1,h2,h3,p{margin:0}h1{font-size:22px;line-height:1.35;font-weight:700}h2{font-size:18px}h3{font-size:15px}.muted{color:var(--muted);font-size:13px}.eyebrow{font-size:10px;font-weight:700;letter-spacing:2px;color:#788dab;margin-bottom:10px}.primary,.secondary{display:inline-flex;align-items:center;justify-content:center;min-height:32px;padding:5px 14px;border-radius:7px;font-weight:600;white-space:nowrap}.primary{color:#fff;background:var(--primary);border:1px solid var(--primary)}.primary:hover{background:#125b95}.secondary{border:1px solid var(--border);background:#fff;color:#667085}.secondary:hover{background:#f1f5fb;color:var(--primary);border-color:#c6d9ee}.plain{color:var(--primary);background:transparent;padding:5px 8px}.danger{color:#a44343}.row{display:flex;align-items:center;gap:10px}.between{justify-content:space-between}input,select{width:100%;min-height:34px;border:1px solid #dce3ed;border-radius:7px;background:#fff;padding:6px 12px;color:var(--text)}input::placeholder{color:#a0aaba}input:focus,select:focus{outline:none;border-color:#1769aa;box-shadow:0 0 0 3px #1769aa12}label{display:block;font-size:13px;font-weight:600;margin:16px 0 8px}label input,label select{margin-top:7px;font-weight:400}.error{color:#a44343;margin-top:12px;min-height:20px;font-size:12px}.ui-icon{width:20px;height:20px;display:block;fill:none;stroke:currentColor;stroke-width:1.7;stroke-linecap:round;stroke-linejoin:round;flex-shrink:0}
/* Shell follows the material platform's 232px sidebar, 64px header and 45px module trail. */
.workspace{min-height:100vh}.sidebar{width:var(--sidebar);position:fixed;inset:0 auto 0 0;background:#fff;border-right:1px solid var(--border);display:flex;flex-direction:column;box-shadow:0 0 20px #00000005;z-index:30}.brand{height:64px;padding:0 18px;display:flex;align-items:center;gap:11px;border-bottom:1px solid var(--border);font-size:14px;font-weight:700;letter-spacing:.5px;flex-shrink:0}.brand small{display:block;font-size:11px;color:#9aa5be;font-weight:400;letter-spacing:0}.brandmark{width:38px;height:38px;flex-shrink:0;border-radius:10px;background:linear-gradient(135deg,#385c90,#477ab3);display:grid;place-items:center;color:white;box-shadow:0 4px 10px #345da52b}.brandmark .ui-icon{width:23px;height:23px}.nav-label{padding:16px 22px 8px;color:#98a2b3;font-size:11px;font-weight:600;letter-spacing:1.5px}.sidebar nav .nav-label{margin-top:12px}.sidebar nav button{position:relative;display:flex;align-items:center;gap:10px;margin:2px 12px;padding:9px 10px;width:calc(100% - 24px);text-align:left;border-radius:8px;background:transparent;color:#5a6478;font-size:13.5px}.sidebar nav button:hover{background:#f1f4fa;color:#1565c0}.sidebar nav button.active{background:linear-gradient(90deg,#1565c01f,#1565c00a);color:#1565c0;font-weight:600}.sidebar nav button.active:before{content:'';position:absolute;left:-12px;width:3px;height:18px;border-radius:0 3px 3px 0;background:linear-gradient(#568eef,#2670cc)}.sidebar nav button.active:after{content:'';position:absolute;right:12px;width:6px;height:6px;border-radius:50%;background:#3977c8;box-shadow:0 0 6px #3977c855}.sidebar-bottom{margin-top:auto;min-height:48px;border-top:1px solid var(--border);display:flex;align-items:center;gap:7px;padding:0 22px;color:#98a2b3;font-size:10px}.sidebar-bottom i{width:5px;height:5px;border-radius:50%;background:#8dbe73;box-shadow:0 0 5px #8dbe7366}main{margin-left:var(--sidebar);min-width:0}.topbar{position:sticky;top:0;z-index:20;height:64px;background:white;border-bottom:1px solid var(--border);padding:0 28px;display:flex;align-items:center;justify-content:space-between;gap:20px}.header-heading{display:flex;align-items:baseline;gap:13px;min-width:0}.header-heading h2{font-size:18px;white-space:nowrap}.header-heading>span{font-size:12px;color:var(--muted)}.header-actions,.owner{display:flex;align-items:center;gap:16px}.owner{gap:10px;font-size:12px}.avatar{width:32px;height:32px;display:grid;place-items:center;background:linear-gradient(135deg,#4d70ae,#7194cb);color:#fff;border-radius:50%;font-weight:600;flex-shrink:0}.owner-copy strong{font-size:12px}.owner-copy small{display:block;color:var(--muted);font-size:10px}.header-clock{display:flex;align-items:center;gap:10px;height:46px;min-width:150px;padding:5px 11px 5px 7px;border:1px solid #e3ecf5;border-radius:12px;background:linear-gradient(135deg,#f9fbfe,#f0f6fb);box-shadow:0 2px 6px #345a8510}.clock-icon{height:32px;width:32px;border-radius:9px;display:grid;place-items:center;color:#fff;background:linear-gradient(135deg,#477bb7,#5297c4)}.header-clock strong{font:600 15px Consolas,monospace;letter-spacing:1px;color:#4b6486}.header-clock small{display:block;font-size:10px;color:#8c9aad}.module-trail{position:sticky;top:64px;z-index:19;min-height:45px;background:#fff;border-bottom:1px solid var(--border);display:flex;align-items:center;gap:12px;padding:7px 24px}.module-root,.module-current{display:inline-flex;align-items:center;gap:7px;padding:4px 12px;border-radius:7px;font-weight:600;min-height:30px;font-size:12px}.module-root{background:#f2f5fa;color:#647084;flex-direction:row-reverse}.module-root .ui-icon{width:13px;height:13px}.trail-separator{color:#b8c5d7;font-size:20px}.module-current{background:#edf4ff;border:1px solid #b9d1f7;color:#356cb9}.content{max-width:1408px;margin:0 auto;padding:24px 24px 64px}.page-heading{display:flex;justify-content:space-between;align-items:center;gap:20px;min-height:52px;margin-bottom:20px}.page-heading .muted{margin-top:5px;line-height:1.55}
.stats{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:14px;margin-bottom:20px}.stats>div{position:relative;background:#fff;border:1px solid #e1e9f2;border-radius:12px;padding:17px 18px 17px 80px;min-height:108px;box-shadow:0 2px 5px #1e3a5605}.stat-icon{position:absolute;left:18px;top:31px;width:46px;height:46px;border-radius:12px;display:grid;place-items:center;color:white;box-shadow:0 4px 8px #345a851c}.stat-icon .ui-icon{width:23px;height:23px}.stats span{display:block;font-size:12px;color:#8290a5}.stats strong{display:block;font-size:27px;line-height:1.3;color:#426eba}.stats small{display:block;font-size:11px;color:#98a2b3;margin-top:4px}.stats>div:nth-child(2) strong{color:#4d9784}.stats>div:nth-child(3) strong{color:#be8830}.toolbar{display:flex;justify-content:space-between;gap:14px;align-items:center;margin-bottom:16px;padding:12px 14px;border:1px solid var(--border);border-radius:12px;background:#fff}.toolbar input{width:290px}.chip{padding:7px 12px;border-radius:7px;background:transparent;color:#78879b;font-size:12px}.chip.active{background:#e8f0fd;color:#376fae;font-weight:600}.systems-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:16px}.system-card{border-radius:12px;border:1px solid #e1e9f2;background:white;padding:22px;box-shadow:0 2px 5px #1e3a5605}.system-card h2{font-size:17px;margin:16px 0 6px}.system-card>.muted{font-size:12px}.card-icon{width:40px;height:40px;display:grid;place-items:center;border-radius:11px;color:white;box-shadow:0 3px 8px #345a8520}.blue{background:linear-gradient(135deg,#4272c5,#75a6ef)}.green{background:linear-gradient(135deg,#478c80,#75bbaa)}.violet,.indigo{background:linear-gradient(135deg,#7963b0,#ab91d7)}.amber{background:linear-gradient(135deg,#ce8830,#edb94e)}.badge{display:inline-flex;align-items:center;gap:5px;border:1px solid transparent;border-radius:5px;padding:2px 8px;font-size:11px;font-weight:600;white-space:nowrap}.badge.neutral{background:#f2f4f7;color:#8290a2;border-color:#e8ecf2}.badge.green{background:#edf7f1;color:#2f7254;border-color:#d4e9dc}.badge.violet,.badge.indigo,.badge.purple{background:#f0ecfb;color:#7963b0;border-color:#e0d8f4}.badge.red,.badge.disabled{background:#fff1f1;color:#a44343;border-color:#efd5d5}.badge.orange,.badge.amber{background:#fff7e8;color:#946921;border-color:#f0dfbd}.badge.blue{background:#edf5fc;color:#1769aa;border-color:#d7e8f7}.domain{font:11px/1.7 Consolas,monospace;color:#8e9eb2;margin:8px 0;overflow-wrap:anywhere}.system-status{display:flex;align-items:center;gap:12px;padding:8px 0 12px}.system-status small{font-size:11px;color:#95a2b5}.model-note{font-size:12px;color:#8290a5;line-height:1.8}.service-status{display:flex;align-items:center;justify-content:space-between;gap:12px;margin:14px 0;font-size:12px;border-top:1px dashed #e4ebf4;padding-top:10px}.service-status .muted{font-size:12px}.card-actions{border-top:1px solid #edf1f7;padding-top:16px;display:flex;align-items:center;gap:10px;flex-wrap:wrap}.system-menu{margin-left:auto}.system-menu summary{font-size:12px}.system-menu .account-actions{padding:8px 0}.panel{background:#fff;border:1px solid #e1e9f2;border-radius:12px;overflow:hidden;box-shadow:0 2px 5px #1e3a5605}.panel-heading{display:flex;justify-content:space-between;gap:16px;align-items:center;padding:18px 20px}.panel-heading .row{flex-wrap:wrap}.panel-heading input{width:220px}.panel-title{display:flex;align-items:center;gap:10px}.panel-title .muted{font-size:11px;margin-top:3px}.heading-icon{width:32px;height:32px;border-radius:9px;display:grid;place-items:center;color:#fff;box-shadow:0 3px 6px #345a8520}.table-scroll{overflow-x:auto}table{width:100%;border-collapse:collapse;text-align:left;font-size:12px}th{background:#f7f9fc;color:#64748b;font-weight:600;padding:12px 18px;white-space:nowrap}td{padding:17px 18px;border-top:1px solid #edf1f7;vertical-align:middle}tbody tr:hover{background:#f8fbff}td strong{display:block;font-size:13px;font-weight:600}td small{display:block;color:#98a2b3;font-size:11px;margin-top:3px}details summary{cursor:pointer;color:#5475a8;white-space:nowrap}details button{font-size:12px}.account-actions{display:flex;gap:6px;flex-wrap:wrap;margin-top:10px}#account-rows td:last-child{min-width:120px}#account-search{min-width:210px}#account-role,#account-enabled{width:auto;min-width:120px}.notice{background:#edf5fc;color:#55799e;border:1px solid #dce8f5;padding:12px 16px;border-radius:9px;font-size:12px;margin-bottom:18px}.security-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:16px;margin-bottom:18px}.info{padding:22px}.info h3{margin:16px 0 10px}.info p{font-size:12px;color:#8290a5;line-height:1.9}.account-models{display:grid;grid-template-columns:1fr 1fr;gap:16px;margin:0 0 20px}.account-models>div{background:#fff;border:1px solid #e1e9f2;border-radius:12px;padding:20px}.account-models h3{margin:12px 0 8px}.account-models p{font-size:12px;color:#8290a5;line-height:1.8}#directory-page .system-card .primary{margin-top:18px}#connection-list>p{padding:10px 0;border-bottom:1px solid #edf1f7}.empty{text-align:center;padding:48px 20px;color:#98a2b3;grid-column:1/-1}
/* OperationLogsView.vue: filter panel, category icon, summary, actor and timestamp hierarchy. */
.log-filters{padding:16px 20px;margin-bottom:16px}.filter-main{display:flex;gap:12px}.filter-main input{max-width:360px}.filter-main select{max-width:190px;background:#f8faff}.filter-dates{display:flex;align-items:center;gap:12px;margin-top:12px;font-size:12px;color:#8290a5}.filter-dates label{display:flex;align-items:center;gap:8px;font-size:11px;font-weight:400;margin:0}.filter-dates input{margin:0;width:150px}.log-filters .error:empty{display:none}.log-panel{padding:0 20px}.log-panel .panel-heading{padding:18px 0}.log-privacy{color:#98a2b3;font-size:11px}.log-row{display:flex;align-items:flex-start;gap:14px;min-height:104px;padding:16px 12px;border-top:1px solid #e8eef5}.log-row:hover{background:#f3f8fd}.log-icon{width:38px;height:38px;display:grid;place-items:center;color:#fff;border-radius:10px;flex-shrink:0}.log-content{flex:1;min-width:0}.log-title{display:flex;align-items:center;gap:10px;flex-wrap:wrap}.log-title h3{font-size:15px}.log-summary{font-size:12px;color:#61758e;margin:6px 0;overflow-wrap:anywhere}.log-meta{display:flex;gap:16px;flex-wrap:wrap;font-size:11px;color:#8b9ab0}.log-request{color:#aa8038;font-size:11px;margin-top:6px}.log-time{font:11px/1.8 Consolas,monospace;color:#8696ac;white-space:nowrap;margin-top:2px}.pagination{display:flex;justify-content:flex-end;align-items:center;gap:12px;padding:16px 0;border-top:1px solid #e8eef5;color:#8b9ab0;font-size:12px}.pagination .secondary{min-width:30px;padding:3px 10px}.pagination #log-page{color:#416fad;font-weight:600}
footer{color:#a0adbe;text-align:center;font-size:10px;padding:15px}footer a,.filing a{color:#96a4b8}.filing{margin-top:15px;font-size:10px}dialog{width:520px;max-width:calc(100vw - 32px);max-height:90vh;overflow:auto;border:1px solid #e1e8f3;border-radius:12px;padding:24px;box-shadow:0 25px 100px #16274233}dialog::backdrop{background:#1c2c465e}.modal-heading{display:flex;justify-content:space-between;align-items:flex-start}.close{background:#f3f6fb;color:#8091a7;border-radius:7px;width:30px;height:30px;font-size:21px}.modal-heading .eyebrow{margin-bottom:3px}.modal-heading h2{font-size:18px}#modal-description{margin-top:14px}.modal-actions{display:flex;justify-content:flex-end;gap:10px;border-top:1px solid #eaf0f7;padding-top:18px;margin-top:24px}.field-note{color:#98a4b5;font-size:11px;margin-top:7px}#toast{position:fixed;bottom:26px;left:50%;transform:translateX(-50%);max-width:90vw;padding:12px 23px;background:#263d5b;color:white;border-radius:9px;box-shadow:0 5px 20px #1e30452f;font-size:13px;z-index:100}.block{display:block}#mfa-secret{font-family:monospace;font-size:13px}#mfa-setup{margin-top:18px}#mfa-recovery-codes{overflow-wrap:anywhere;white-space:pre-wrap;font-size:12px;padding:12px;background:#f3f6fb;border-radius:8px}#recovery-saved{width:auto}#mfa-restart{margin-top:12px}#replace-authenticator{margin:12px 0 22px}[hidden]{display:none!important}
@media(max-width:1100px){.header-heading>span{display:none}.panel-heading{flex-wrap:wrap}.security-grid{grid-template-columns:1fr}.stats small{font-size:10px}}
@media(max-width:1000px){:root{--sidebar:76px}.brand{justify-content:center;padding:0}.brand>div,.nav-text,.nav-label,.sidebar-bottom span{display:none}.sidebar nav{padding-top:16px}.sidebar nav button{justify-content:center;padding:11px 8px}.sidebar nav button.active:after{display:none}.sidebar-bottom{justify-content:center;padding:0}.systems-grid{grid-template-columns:1fr}.filter-main{flex-wrap:wrap}.filter-main input{max-width:none}.filter-main select{flex:1;max-width:none}.filter-dates{flex-wrap:wrap}}
@media(max-width:720px){.topbar{padding:0 14px}.header-clock,.owner-copy{display:none}.header-actions{gap:0}.owner{gap:6px}.content{padding:18px 14px 40px}.module-trail{padding:7px 14px}.page-heading{align-items:flex-start;flex-wrap:wrap;gap:12px}.stats{grid-template-columns:1fr;gap:10px}.stats>div{min-height:88px;padding-block:12px}.stat-icon{top:21px}.stats small{font-size:11px}.stats strong{font-size:24px}.toolbar{align-items:stretch;flex-direction:column;gap:12px}.toolbar input{width:100%}.toolbar>div{display:flex;flex-wrap:wrap}.chip{padding:6px 8px}.account-models{grid-template-columns:1fr}.system-card{padding:18px}.system-menu{margin-left:0}.service-status{flex-wrap:wrap}.panel-heading{padding:16px}.panel-heading input,#account-search{width:100%;min-width:0}.account-models>div,.info{padding:18px}.filter-dates label{width:100%;justify-content:space-between}.filter-dates>span:nth-of-type(2){display:none}.filter-dates input{width:calc(100% - 62px);min-width:0}.log-filters,.log-panel{padding:14px}.log-panel{padding-block:0}.log-privacy{display:none}.log-row{flex-wrap:wrap;padding:14px 0;gap:10px}.log-content{width:calc(100% - 48px);flex:auto}.log-time{margin-left:48px}.log-title h3{font-size:14px}.pagination{gap:8px}.system-status{flex-wrap:wrap}.header-heading h2{font-size:16px}}
/* Release workspace uses the same panels, type scale and controls as system/account pages. */
.release-layout{display:grid;grid-template-columns:minmax(0,1.1fr) minmax(0,1fr);gap:18px;align-items:start;margin-bottom:20px}.release-form,.release-review-body{padding:24px}.release-form label{display:grid;gap:9px;font-weight:600;margin-bottom:18px}.release-form input,.release-form select{width:100%;min-width:0}.release-form small{font-weight:400;color:#8794a8}.release-files{display:grid;grid-template-columns:1fr 1fr;gap:16px}.release-files label{padding:16px;border:1px dashed #bed0ea;background:#f8fbff;border-radius:12px}.release-files input{font-size:12px;padding:8px 0;border:0;background:transparent}.release-summary{display:grid;grid-template-columns:95px minmax(0,1fr);gap:14px;margin:24px 0}.release-summary dt{color:#8490a3}.release-summary dd{margin:0;overflow-wrap:anywhere}.release-sql-preview{margin:18px 0}.release-sql-preview pre{max-height:260px;overflow:auto;background:#f5f8fc;padding:16px;font-size:12px;white-space:pre-wrap;overflow-wrap:anywhere}.release-confirm{display:flex;align-items:flex-start;gap:8px;font-size:12px;margin-bottom:20px;line-height:1.7}.release-confirm input{width:auto;margin-top:5px}.release-job{padding:22px 26px;border-top:1px solid #edf1f7}.release-job h3{margin:0}.release-job .row{gap:12px}.release-job p{overflow-wrap:anywhere}.release-job progress,#release-upload-bar{width:100%;height:7px;accent-color:#446fae;display:block;margin:14px 0 9px}.release-stage{color:#46648b;font-size:13px}.release-details summary{color:#7d8da4;font-size:12px;cursor:pointer}.release-details ol{line-height:2;color:#66788e;font-size:12px}.release-review-body>.primary{width:100%;margin-top:10px}#release-error:empty{display:none}#release-upload-label{display:block;margin-bottom:14px;color:#5575a0}@media(max-width:1100px){.release-layout{grid-template-columns:1fr}.release-review-body:has(.empty){padding:12px}}@media(max-width:600px){.release-files{grid-template-columns:1fr}.release-form,.release-review-body{padding:16px}.release-job{padding:18px 16px}.release-job .row{align-items:flex-start}.release-job .badge{white-space:nowrap}}
