:root{--bg: #f7f5fc;--panel: #ffffff;--text: #231d33;--muted: #675f78;--border: #e2dcef;--accent: #7c3aed;--accent-soft: #f1ebfd;--danger: #c62828;--ok-row: #e8f5e9;--warn-row: #fff8e1;font-family:system-ui,-apple-system,Segoe UI,Roboto,Arial,sans-serif;font-size:14px;color:var(--text);background:var(--bg)}*{box-sizing:border-box}body{margin:0}a{color:var(--accent);text-decoration:none}a:hover{text-decoration:underline}h1{font-size:20px;margin:0 0 16px}h2{font-size:16px;margin:24px 0 8px}.layout{display:flex;min-height:100vh}.nav{width:210px;background:#ece5fa;color:#3b2f5c;padding:16px 0;flex-shrink:0;border-right:1px solid #ddd2f3}.nav .brand{color:#5b21b6;font-weight:700;font-size:15px;padding:2px 16px 16px;line-height:1.3;border-bottom:1px solid #ddd2f3;margin-bottom:8px}.nav a{display:block;color:#3b2f5c;padding:8px 16px;border-left:3px solid transparent}.nav a:hover{background:#e2d8f7;text-decoration:none}.nav a.router-link-active{background:#dccff6;color:#4c1d95;font-weight:600;border-left-color:#7c3aed;text-decoration:none}.nav .user{padding:16px;font-size:12px;color:#675f78;border-top:1px solid #ddd2f3;margin-top:16px}.main{flex:1;padding:20px 24px;min-width:0}.panel{background:var(--panel);border:1px solid var(--border);border-radius:6px;padding:16px;margin-bottom:16px}.toolbar{display:flex;gap:8px;align-items:end;flex-wrap:wrap;margin-bottom:12px}label{display:flex;flex-direction:column;gap:4px;font-size:12px;color:var(--muted)}input,select,textarea{font:inherit;padding:6px 8px;border:1px solid var(--border);border-radius:4px;background:#fff;color:var(--text)}textarea{min-height:64px;resize:vertical;width:100%}button{font:inherit;padding:6px 14px;border:1px solid var(--accent);background:var(--accent);color:#fff;border-radius:4px;cursor:pointer}button.secondary{background:#fff;color:var(--accent)}button.danger{background:#fff;color:var(--danger);border-color:var(--danger)}button:disabled{opacity:.5;cursor:default}table{border-collapse:collapse;width:100%;background:var(--panel)}th,td{border:1px solid var(--border);padding:6px 8px;text-align:left;vertical-align:top}th{background:#f1edf8;font-weight:600;font-size:12px}tr.clickable{cursor:pointer}tr.clickable:hover td{background:var(--accent-soft)}.grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(220px,1fr));gap:12px}.grid .wide{grid-column:1 / -1}.muted{color:var(--muted)}.error{color:var(--danger);margin:8px 0}.notice{background:var(--accent-soft);padding:8px 12px;border-radius:4px;margin:8px 0}.nowrap{white-space:nowrap}.small{font-size:12px}.table-wrap{overflow-x:auto}a.button{display:inline-block;font:inherit;padding:6px 14px;border:1px solid var(--accent);background:var(--accent);color:#fff;border-radius:4px;text-decoration:none}a.button.secondary{background:#fff;color:var(--accent)}a.button.disabled{opacity:.5;pointer-events:none}.spacer{flex:1}label.inline{flex-direction:row;align-items:center;gap:6px;font-size:14px;color:var(--text);padding-bottom:6px}tr.row-ok td{background:var(--ok-row)}tr.row-warn td{background:var(--warn-row)}ul.missing{margin:0;padding-left:20px;columns:2}.warn-panel{background:var(--warn-row);border:1px solid #f0d58c;border-radius:6px;padding:10px 14px;margin-bottom:16px}.ok-panel{background:var(--ok-row);border:1px solid #b7dfb9;border-radius:6px;padding:10px 14px;margin-bottom:16px}.flash{outline:3px solid #f0b400;outline-offset:1px}ul.missing.sticky-list{position:sticky;left:24px;max-width:900px}button:active:not(:disabled){transform:translateY(1px);filter:brightness(.92)}.toast{position:fixed;right:24px;bottom:24px;z-index:1000;max-width:420px;display:flex;align-items:center;gap:10px;padding:12px 18px;border-radius:6px;color:#fff;background:#2e7d32;box-shadow:0 6px 20px #0000002e;cursor:pointer;font-size:15px}.toast.busy{background:var(--accent)}.toast.error{background:var(--danger)}.toast-enter-active,.toast-leave-active{transition:opacity .2s,transform .2s}.toast-enter-from,.toast-leave-to{opacity:0;transform:translateY(8px)}.spinner{width:14px;height:14px;border:2px solid rgba(255,255,255,.45);border-top-color:#fff;border-radius:50%;animation:spin .8s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}.small-button,a.button.small-button{padding:2px 8px;font-size:12px;margin:2px 2px 2px 0}button.secondary.active{background:var(--accent-soft)}button.link{background:none;border:0;padding:0 0 0 8px;color:var(--accent);text-decoration:underline dotted;cursor:pointer}tr.details-row>td{background:var(--accent-soft)}.label-row{display:flex;align-items:baseline;gap:4px}
