:root{--c-bg: #0b3d2e;--c-bg-soft: #12503c;--c-felt: #14624a;--c-surface: #ffffff;--c-surface-2: #f4f6f5;--c-surface-3: #e7ebe9;--c-border: #cfd8d4;--c-border-strong: #9fb0a9;--c-text: #10241d;--c-text-soft: #4b5f58;--c-text-inv: #f2f7f4;--c-primary: #0f7a55;--c-primary-strong: #0a6344;--c-primary-soft: #d8efe6;--c-accent: #c8791a;--c-accent-soft: #fbeed9;--c-danger: #b3261e;--c-danger-soft: #fbe6e4;--c-info: #1f5f8b;--tile-face: #fdfcf7;--tile-face-2: #f0ece0;--tile-edge: #c9c2ad;--tile-back: #1c6b52;--tile-shadow: rgba(8, 34, 26, .35);--radius-sm: 4px;--radius: 8px;--radius-lg: 14px;--tap: 44px;--gap-xs: 4px;--gap-sm: 8px;--gap: 12px;--gap-lg: 20px;--font: system-ui, -apple-system, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", sans-serif;--font-num: ui-monospace, "SFMono-Regular", Consolas, monospace;--shadow-1: 0 1px 2px rgba(8, 34, 26, .12);--shadow-2: 0 4px 14px rgba(8, 34, 26, .18);--shadow-3: 0 12px 32px rgba(8, 34, 26, .28)}*{box-sizing:border-box}html,body,#app{height:100%;margin:0}body{font-family:var(--font);color:var(--c-text);background:var(--c-bg);-webkit-font-smoothing:antialiased;overscroll-behavior:none}.app-root{min-height:100%}button{font:inherit;color:inherit;cursor:pointer}button:disabled{cursor:not-allowed;opacity:.45}input,select{font:inherit}.btn{min-height:var(--tap);padding:0 var(--gap-lg);border:1px solid var(--c-border-strong);border-radius:var(--radius);background:var(--c-surface);color:var(--c-text);font-weight:600;transition:transform .06s ease,background .15s ease}.btn:active:not(:disabled){transform:translateY(1px)}.btn--primary{background:var(--c-primary);border-color:var(--c-primary-strong);color:#fff}.btn--primary:hover:not(:disabled){background:var(--c-primary-strong)}.btn--danger{background:var(--c-surface);border-color:var(--c-danger);color:var(--c-danger)}.btn--ghost{background:transparent;border-color:currentColor;color:var(--c-text-inv)}.btn--sm{min-height:34px;padding:0 var(--gap);font-size:.85rem}.field{display:flex;flex-direction:column;gap:var(--gap-xs)}.field>label{font-size:.85rem;font-weight:600;color:var(--c-text-soft)}.input{min-height:var(--tap);padding:0 var(--gap);border:1px solid var(--c-border);border-radius:var(--radius);background:var(--c-surface);outline:none}.input:focus{border-color:var(--c-primary);box-shadow:0 0 0 3px var(--c-primary-soft)}.card{background:var(--c-surface);border:1px solid var(--c-border);border-radius:var(--radius-lg);box-shadow:var(--shadow-1)}.hint{color:var(--c-text-soft);font-size:.85rem}.hint--bad{color:var(--c-danger)}.tag{display:inline-flex;align-items:center;gap:4px;padding:2px 8px;border-radius:999px;font-size:.75rem;font-weight:600;background:var(--c-surface-3);color:var(--c-text-soft)}.tag--ok{background:var(--c-primary-soft);color:var(--c-primary-strong)}.tag--warn{background:var(--c-accent-soft);color:var(--c-accent)}.tag--off{background:var(--c-surface-3);color:var(--c-text-soft)}.overlay{position:fixed;top:0;right:0;bottom:0;left:0;display:flex;align-items:center;justify-content:center;padding:var(--gap);background:#061a149e;z-index:40}.modal{width:min(460px,100%);padding:var(--gap-lg);background:var(--c-surface);border-radius:var(--radius-lg);box-shadow:var(--shadow-3)}.modal h2{margin:0 0 var(--gap-sm);font-size:1.1rem}.modal__actions{display:flex;justify-content:flex-end;gap:var(--gap-sm);margin-top:var(--gap-lg)}.toast-layer{position:fixed;left:50%;bottom:calc(16px + env(safe-area-inset-bottom,0px));transform:translate(-50%);display:flex;flex-direction:column;gap:var(--gap-sm);z-index:60;pointer-events:none}.toast{pointer-events:auto;max-width:min(92vw,520px);padding:10px 16px;border-radius:999px;background:#123c30;color:#fff;font-size:.9rem;box-shadow:var(--shadow-2);animation:toast-in .18s ease}.toast--error{background:var(--c-danger)}.toast--ok{background:var(--c-primary-strong)}@keyframes toast-in{0%{opacity:0;transform:translateY(8px)}to{opacity:1;transform:none}}.rotate-hint{position:fixed;top:0;right:0;bottom:0;left:0;display:none;flex-direction:column;align-items:center;justify-content:center;gap:var(--gap);background:var(--c-bg);color:var(--c-text-inv);text-align:center;z-index:100}.rotate-hint__icon{font-size:3rem;animation:rotate-nudge 2s ease-in-out infinite}@keyframes rotate-nudge{0%,to{transform:rotate(0)}50%{transform:rotate(90deg)}}
