.admin-menu{display:grid;grid-template-columns:repeat(auto-fit,minmax(260px,360px));gap:18px}.admin-menu-card{display:flex;flex-direction:column;gap:9px;padding:24px;background:#fff;border:1px solid var(--line);border-radius:10px;text-decoration:none;box-shadow:0 2px 10px #21384e0b}.admin-menu-card strong{color:var(--blue);font-size:18px}.admin-menu-card span{color:var(--muted);line-height:1.5}.dataset-card .panel-title>div{display:flex;align-items:baseline;gap:12px}.dataset-card code{color:var(--muted)}.dataset-state,.status-badge{display:inline-flex;width:max-content;border-radius:99px;padding:5px 10px;font-weight:700;font-size:12px;white-space:nowrap}.dataset-state.enabled,.status-succeeded{background:#e7f6ed;color:#237145}.dataset-state.disabled,.status-failed{background:#f5eaea;color:#8a3434}.status-partial{background:#fff4d6;color:#7a5a08}.status-running,.status-pending,.status-waiting{background:#e7f1fa;color:#21618c}.status-not_started{background:#eceff1;color:#546069}.health-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:1px;background:var(--line);border-bottom:1px solid var(--line)}.health-grid>div{min-width:0;background:#f8fafc;padding:14px 16px}.health-grid span{display:block;color:var(--muted);font-size:11px;margin-bottom:5px}.health-date-form{display:flex;gap:10px;align-items:center;margin-bottom:16px}.dataset-summary{display:grid;grid-template-columns:repeat(5,minmax(150px,1fr));gap:1px;background:var(--line);border-bottom:1px solid var(--line)}.dataset-summary div{min-width:0;background:#f8fafc;padding:14px 16px}.dataset-summary span{display:block;color:var(--muted);font-size:11px;margin-bottom:5px}.dataset-summary strong{font-size:13px;overflow-wrap:anywhere}.dataset-sources{padding:18px 20px;border-bottom:1px solid var(--line)}.dataset-sources h3{margin:0 0 12px;font-size:14px}.source-row{display:grid;grid-template-columns:190px 110px minmax(0,1fr);gap:12px;padding:6px 0}.source-row>*{min-width:0}.source-row a{color:var(--blue);overflow-wrap:anywhere;word-break:break-word}.latest-error{display:grid;grid-template-columns:110px minmax(0,1fr);gap:16px;padding:13px 20px;border-bottom:1px solid var(--line);font-size:13px}.error-content,.history-error{min-width:0}.error-summary{color:var(--muted);overflow-wrap:anywhere;word-break:break-word}.error-details{margin-top:6px;max-width:100%}.error-details summary{width:max-content;max-width:100%;color:var(--blue);cursor:pointer}.error-details pre{margin:8px 0 0;padding:10px;background:#f5f7f9;border-radius:6px;white-space:pre-wrap;overflow-wrap:anywhere;word-break:break-word;max-width:100%;font:12px/1.5 ui-monospace,SFMono-Regular,Consolas,monospace}.run-history{min-width:1100px;table-layout:fixed}.run-history th:nth-child(9),.run-history td:nth-child(9){width:280px}@media(max-width:900px){.dataset-summary{grid-template-columns:repeat(2,minmax(0,1fr))}.source-row{grid-template-columns:1fr}.dataset-card .panel-title>div{align-items:flex-start;flex-direction:column}.latest-error{grid-template-columns:1fr}}
.status-open{background:#fff4d6;color:#7a5a08}.tier-active{background:#e7f6ed;color:#237145}.tier-configured{background:#fff4d6;color:#7a5a08}.tier-planned{background:#eceff1;color:#546069}
.history-collapse{border-top:1px solid var(--line)}.history-collapse summary{cursor:pointer;list-style:none;display:flex;align-items:center;gap:8px;padding:14px 20px;font-weight:600;color:var(--blue);user-select:none}.history-collapse summary::-webkit-details-marker{display:none}.history-toggle-icon{display:inline-flex;align-items:center;justify-content:center;width:18px;height:18px;border:1px solid var(--blue);border-radius:4px;font-size:13px;line-height:1;color:var(--blue)}.history-toggle-icon::before{content:"+"}.history-collapse[open] .history-toggle-icon::before{content:"\2212"}.history-collapse .table-wrap{padding:0 20px 16px}
/* Nightly Maintenance (夜間資料維護): reuses the existing status-badge base
   class plus the same green/amber/red/grey palette already defined above
   for SUCCEEDED/PARTIAL/FAILED/NOT_STARTED -- PASS/FAIL/NO_OP are simply
   this feature's own vocabulary for the identical states. */
.status-pass{background:#e7f6ed;color:#237145}.status-fail{background:#f5eaea;color:#8a3434}.status-no_op{background:#eceff1;color:#546069}
.nightly-maintenance-card{display:flex;flex-direction:column;gap:20px}
.nightly-maintenance-status{display:grid;grid-template-columns:repeat(auto-fit,minmax(160px,1fr));gap:1px;background:var(--line);border:1px solid var(--line);border-radius:8px;overflow:hidden}
.nightly-maintenance-status>div{min-width:0;background:#f8fafc;padding:14px 16px}
.nightly-maintenance-status span{display:block;color:var(--muted);font-size:11px;margin-bottom:5px}
.nightly-maintenance-status strong{font-size:14px;overflow-wrap:anywhere}
.nightly-maintenance-settings{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:14px 20px}
.nightly-maintenance-settings label{display:flex;flex-direction:column;gap:6px;font-size:13px;color:var(--muted)}
.nightly-maintenance-settings input,.nightly-maintenance-settings select{padding:8px 10px;border:1px solid var(--line);border-radius:6px;font-size:14px}
.nightly-maintenance-window{display:flex;align-items:center;gap:8px}
.nightly-maintenance-actions{display:flex;gap:10px;flex-wrap:wrap}
.nightly-maintenance-next{display:flex;flex-wrap:wrap;gap:16px;font-size:13px;color:var(--muted)}
@media(max-width:640px){.nightly-maintenance-status{grid-template-columns:repeat(2,minmax(0,1fr))}.nightly-maintenance-settings{grid-template-columns:1fr}.nightly-maintenance-actions button{flex:1 1 auto}}

/* 網站設定: 網站開放/維護中 + 全站公告 (2026-09-09) -- reuses the existing
   .status-badge/.status-succeeded/.status-partial/.status-failed palette
   above for the current-state preview, and .admin-stack-form's own grid
   gap for spacing; only the segmented radio control and textareas
   (this project's first textarea fields) are genuinely new. */
.settings-section-title{margin:8px 0 -4px;padding-top:12px;border-top:1px solid var(--line);font-size:15px;color:var(--navy)}
.settings-status-preview{display:flex;align-items:center;gap:10px;font-size:13px;color:var(--muted)}
.segmented-radio{display:inline-flex;gap:4px;padding:3px;border:1px solid var(--line);border-radius:8px;background:#f4f7fa;width:max-content}
.segmented-radio-option{position:relative;display:inline-flex}
.segmented-radio-option input{position:absolute;inset:0;width:100%;height:100%;margin:0;opacity:0;cursor:pointer}
.segmented-radio-option span{padding:7px 16px;border-radius:6px;font-size:13px;font-weight:650;color:#52677b;white-space:nowrap}
.segmented-radio-option input:checked+span{background:var(--blue);color:#fff}
.segmented-radio-option input:focus-visible+span{outline:2px solid #b9d9ef}
.admin-stack-form label small{display:block;margin-top:3px;font-weight:400;color:var(--muted)}
.admin-stack-form textarea{width:100%;min-height:96px;padding:9px 10px;border:1px solid #cbd7e0;border-radius:6px;background:#fff;color:var(--ink);font:inherit;resize:vertical}
.admin-stack-form textarea:focus{outline:2px solid #b9d9ef;border-color:var(--blue)}
@media(max-width:640px){.segmented-radio{width:100%}.segmented-radio-option{flex:1 1 0}.segmented-radio-option span{width:100%;text-align:center}}
