@font-face{font-family:'Press Start 2P';src:url('./fonts/PressStart2P-Regular.ttf') format('truetype');font-style:normal;font-weight:400;font-display:swap}
@font-face{font-family:'Montserrat';src:url('./fonts/Montserrat-Variable.ttf') format('truetype');font-style:normal;font-weight:100 900;font-display:swap}
:root{font-family:'Montserrat',sans-serif;color:#f5fdfb;background:#15221e;font-synthesis:none;--lime:#c3ff70;--muted:#9eaba8;--line:#ffffff13;--mono:ui-monospace,SFMono-Regular,Consolas,monospace}*{box-sizing:border-box}body{margin:0;min-width:320px}button,input,textarea,select{font:inherit}button,a,select{-webkit-tap-highlight-color:transparent}button{cursor:pointer}button:disabled{cursor:default;opacity:.42}button{color:inherit}button:focus-visible,a:focus-visible,textarea:focus-visible,select:focus-visible{outline:2px solid var(--lime);outline-offset:4px}button{transition:background .18s,transform .18s,border-color .18s}button:active:not(:disabled){transform:translateY(1px)}.app-shell{max-width:1664px;margin:auto;padding:0 48px}.topbar{height:105px;display:flex;align-items:center;justify-content:space-between;border-bottom:1px solid var(--line);gap:24px}.brand{display:flex;gap:14px;align-items:center;text-decoration:none;color:#fafefd;font-size:24px;font-weight:800;letter-spacing:2px}.brand-mark{position:relative;display:grid;place-items:center;background:var(--lime);color:#15231f;width:44px;height:44px;border-radius:12px;font-size:29px;font-weight:800;letter-spacing:-3px;transform:rotate(-7deg)}.brand-mark span{font-size:20px;margin-left:-4px}.brand-mark{display:flex;justify-content:center}.brand-sub{display:block;font-size:9px;letter-spacing:1.45px;margin-top:3px;color:#a0b3ae}.header-center{font-size:11px;letter-spacing:2px;color:#91a19d;display:flex;align-items:center;gap:10px}.mini-square{width:5px;height:5px;background:#b2dcd1;transform:rotate(45deg)}.header-actions{display:flex;gap:12px;align-items:center}.icon-button,.help-button{background:transparent;border:1px solid #ffffff1b;height:42px;border-radius:10px}.icon-button{width:42px;font-size:22px;position:relative}.help-button{display:flex;align-items:center;gap:9px;padding:0 14px;font-size:13px;color:#d0ddd9}.help-button>span:first-child{border:1px solid #a1b0ac;width:17px;height:17px;line-height:16px;font-size:11px;border-radius:50%}.workspace-heading{padding:35px 0 28px;display:flex;align-items:flex-end;justify-content:space-between;gap:16px}.eyebrow{font-size:10px;font-weight:700;letter-spacing:1.9px;color:#a0b2ad}h1{font-size:clamp(24px,2.5vw,37px);letter-spacing:-1.6px;margin:9px 0 0;font-weight:700}h1 span{color:var(--lime)}.mobile-break{display:none}.model-badge{font-family:var(--mono);font-size:11px;color:#b4c5c0;letter-spacing:1px;border:1px solid #ffffff1c;border-radius:6px;padding:9px 12px;margin-bottom:4px;white-space:nowrap}.model-badge span{padding:0 7px;color:#74938b}.workspace{display:grid;grid-template-columns:minmax(0,1.95fr) minmax(300px,1fr);gap:22px}.machine-panel{position:relative;background:radial-gradient(ellipse at 49% 26%,#61a290 0,#38564e 34%,#21352f 64%,#1e2c28 100%);border:1px solid #b5ebdd25;border-radius:20px;min-width:0;overflow:hidden;display:flex;flex-direction:column}.stage-top{position:absolute;z-index:1;top:24px;left:26px;right:25px;display:flex;align-items:center;justify-content:space-between;gap:12px;pointer-events:none}.stage-top>*{pointer-events:auto}.live-badge{font-size:10px;font-weight:700;letter-spacing:1px;display:flex;align-items:center;gap:8px;color:#dbebe7}.live-badge i{height:6px;width:6px;background:var(--lime);border-radius:50%;box-shadow:0 0 12px #bcff6560}.quiet-button{background:none;border:0;color:#cae0da;font-size:11px;padding:5px 0}.quiet-button span{font-size:19px;vertical-align:-1px;margin-right:4px}#scene{height:465px;position:relative;touch-action:none;width:100%;isolation:isolate}#scene canvas{display:block;width:100%;height:100%;cursor:grab}#scene canvas:active{cursor:grabbing}#scene-loading{position:absolute;inset:0;display:flex;justify-content:center;align-items:center;gap:12px;font-size:14px;color:#e1f1ed;z-index:-1}.loader{width:17px;height:17px;border:2px solid #c3ff7040;border-top-color:var(--lime);border-radius:50%;animation:spin 1s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}.scene-caption{text-align:center;color:#b5d0c9;font-size:11px;letter-spacing:.15px;margin-top:-18px;z-index:1;pointer-events:none}.drag-icon{font-size:19px;margin-right:8px;vertical-align:-1px}.view-tag{position:absolute;left:26px;top:412px;color:#a4c0b9;font:10px var(--mono);letter-spacing:2px;writing-mode:vertical-rl;transform:rotate(180deg)}.view-tag span{color:#dcf8f0}.rotor-section{padding:20px 26px 18px;margin-top:17px;border-top:1px solid #ffffff0e;background:#141f1c50}.section-label{display:flex;align-items:center;justify-content:space-between;font-size:10px;font-weight:700;letter-spacing:1.35px;color:#b7cbc5;margin-bottom:12px}.settings-link{padding:0;border:0;background:none;color:var(--lime);font-size:12px;letter-spacing:0;display:flex;align-items:center;gap:6px}.settings-link span{font-size:17px}.rotor-cards{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:12px}.rotor-card{background:#ffffff07;border:1px solid #b5e2d620;border-radius:10px;display:flex;align-items:center;justify-content:space-between;padding:10px 7px}.rotor-card button{border:0;background:transparent;font-size:22px;color:#9ebbb3;width:28px;min-height:40px;padding:0}.rotor-card button:hover{color:var(--lime)}.rotor-value{text-align:center}.rotor-name{display:block;font-size:9px;letter-spacing:1.5px;color:#a9c1ba;margin-bottom:4px}.rotor-letter{font-family:var(--mono);font-weight:600;font-size:31px;color:#fff;line-height:1.15}.rotor-caption{display:flex;align-items:center;justify-content:space-between;gap:8px;margin-top:11px;color:#8ca7a0;font-size:10px}.text-button{border:0;background:transparent;padding:3px 0;font-size:11px;color:#bad3cc}.message-panel{border:1px solid #ffffff13;border-radius:20px;background:#1e2d29;padding:27px;display:flex;flex-direction:column;min-width:0}.console-heading{display:flex;align-items:center;gap:10px;margin-bottom:29px}.console-symbol{color:var(--lime);font-size:26px;line-height:1}h2{font-size:19px;letter-spacing:-.5px;margin:0;font-weight:700}.small-badge{font:9px var(--mono);padding:5px 7px;letter-spacing:1px;color:var(--lime);background:#c3ff7010;border:1px solid #c3ff7025;border-radius:4px;margin-left:auto}.input-heading,.output-heading{display:flex;align-items:center;justify-content:space-between;font-size:10px;font-weight:700;letter-spacing:1.1px;color:#b3c3bf;margin-bottom:11px}.input-heading>span{font:10px var(--mono);letter-spacing:0;color:#8da39d}.text-area-wrap{position:relative}textarea{width:100%;height:130px;resize:vertical;min-height:95px;max-height:250px;background:#141d1b;border:1px solid #ffffff10;border-radius:9px;padding:16px 34px 16px 16px;color:#f2fcf9;font:17px/1.6 var(--mono);letter-spacing:1.5px;text-transform:uppercase;display:block}textarea::placeholder{font:14px/1.8 'Montserrat',sans-serif;text-transform:none;letter-spacing:0;color:#859993}textarea:focus{outline:none;border-color:#a7d0c570}.clear-button{position:absolute;right:9px;top:7px;background:transparent;border:0;color:#829e97;font-size:22px;padding:4px}.input-note{font-size:10px;color:#91a49f;margin-top:9px;line-height:1.5}.signal-divider{display:flex;align-items:center;gap:12px;margin:23px 0}.signal-divider>span{height:1px;background:#ffffff0c;flex:1}.signal-divider>div{font-size:16px;color:#7d918c;white-space:nowrap}.signal-divider>div>span{font-size:8px;letter-spacing:1.3px;margin:0 5px;vertical-align:2px}.output-heading{color:var(--lime);margin-bottom:11px}.output-heading button{background:none;border:0;padding:0;color:#b4c391;width:20px;height:20px}.output-heading svg{height:18px;stroke:currentColor;stroke-width:1.6}.output-box{background:#b6ff7008;border:1px solid #b6ff7026;border-radius:9px;padding:16px;min-height:112px;max-height:230px;overflow:auto;overflow-wrap:anywhere}output{white-space:pre-wrap;font:18px/1.6 var(--mono);letter-spacing:2px;color:var(--lime)}.output-placeholder{font:14px 'Montserrat',sans-serif;letter-spacing:0;color:#819367}.cursor{display:inline-block;height:16px;width:6px;background:#b7ed73;vertical-align:-3px;margin-left:9px;animation:blink 1.4s step-end infinite}@keyframes blink{50%{opacity:0}}.last-signal{display:flex;align-items:center;gap:10px;margin:20px 0}.signal-label{font-size:9px;letter-spacing:.8px;color:#91a5a0;margin-right:auto}.letter-pill{height:32px;width:32px;border-radius:6px;border:1px solid #ffffff1c;display:grid;place-items:center;font:16px var(--mono);color:#cbe0da}.result-letter{color:var(--lime);border-color:#c3ff702b;background:#c3ff700a}.signal-arrow{color:#829e97}.console-tip{display:flex;gap:10px;align-items:center;margin:auto 0 21px;padding-top:9px}.tip-icon{font-size:22px;color:#9bbdb4}.console-tip p{font-size:11px;line-height:1.65;margin:0;color:#caded8}.console-tip p span{color:#9db4ae}.primary-button{background:var(--lime);border:1px solid transparent;color:#1b2320;border-radius:9px;padding:14px 16px;display:flex;justify-content:space-between;align-items:center;gap:12px;font-size:13px;font-weight:800}.primary-button:hover:not(:disabled){background:#d5ff9d}.primary-button>span{font-size:20px;line-height:1}.decrypt-hint{text-align:center;color:#90a49e;font-size:9px;margin-top:10px;line-height:1.5}footer{display:flex;align-items:center;justify-content:space-between;gap:20px;padding:24px 0;color:#7c8c88;font-size:10px}footer>span:first-child{letter-spacing:1.2px;font-size:9px}.footer-dot{display:inline-block;width:5px;height:5px;margin-right:8px;background:#a1ccc1;border-radius:50%}.keyboard-icon{font-size:18px;vertical-align:-2px;margin-left:8px}dialog{background:#20312c;color:#f1fcf9;border:1px solid #abd2c740;border-radius:18px;padding:28px;width:min(620px,calc(100vw - 28px));max-height:calc(100dvh - 40px);box-shadow:0 30px 120px #0008}dialog::backdrop{background:#0c1815ba;backdrop-filter:blur(7px)}.dialog-heading{display:flex;justify-content:space-between;gap:18px;align-items:center}.dialog-heading h2{font-size:24px;margin-top:8px}.close-dialog{border:1px solid #ffffff20;border-radius:9px;background:transparent;width:36px;height:36px;font-size:24px;color:#bed7d0}.dialog-intro{font-size:13px;line-height:1.6;color:#aac2bb;margin:18px 0 22px}.settings-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:12px}.settings-rotor{background:#131d1a60;border:1px solid #ffffff12;padding:14px;border-radius:10px}.settings-rotor h3{font-size:12px;margin:0 0 14px;color:var(--lime)}.settings-rotor label{display:block;font-size:11px;color:#a6bcb6;margin-top:12px;margin-bottom:6px}select{width:100%;background:#293c37;border:1px solid #ffffff25;border-radius:6px;padding:8px 10px;color:white;font:14px var(--mono)}.reflector-row{display:flex;align-items:center;justify-content:space-between;margin:18px 0 26px;font-size:14px}.reflector-row select{width:120px}.plug-title{display:flex;align-items:center;justify-content:space-between;gap:10px}.plug-title h3{font-size:16px;margin:0}.plug-title p{font-size:12px;color:#a0b5af;margin:7px 0 15px}.plug-title>span{font:13px var(--mono);color:#afc6c0}.plugboard{display:grid;grid-template-columns:repeat(13,1fr);gap:5px}.plug-key{min-width:0;height:36px;border:1px solid #ffffff25;background:#293a36;border-radius:6px;font:14px var(--mono)}.plug-key.connected{border-color:var(--pair-color);color:var(--pair-color);background:color-mix(in srgb,var(--pair-color) 10%,transparent)}.plug-key.selected{background:var(--lime);border-color:var(--lime);color:#192824}.plug-pairs{min-height:38px;margin-top:12px;display:flex;flex-wrap:wrap;gap:7px;align-items:center}.plug-pair{border:1px solid var(--pair-color);color:var(--pair-color);background:transparent;border-radius:5px;font:12px var(--mono);padding:5px 7px}.plug-empty{font-size:12px;color:#92a9a3}.settings-error{font-size:13px;color:#bbf1e2;min-height:20px;margin-top:10px}.dialog-footer{display:flex;justify-content:space-between;gap:12px;margin-top:14px;border-top:1px solid #ffffff15;padding-top:20px}.secondary-button{padding:12px 15px;border:1px solid #ffffff25;border-radius:9px;background:transparent;font-size:13px}.help-steps{list-style:none;padding:0;margin:28px 0;display:grid;gap:24px}.help-steps li{display:flex;gap:18px}.help-steps li>span{font:20px var(--mono);color:var(--lime)}.help-steps h3{margin:0;font-size:15px}.help-steps p{margin:7px 0 0;font-size:14px;color:#b0c5bf;line-height:1.65}.help-note{font-size:12px;line-height:1.6;padding:16px;background:#ffffff05;color:#9fb5af;border-radius:8px;margin-bottom:22px}#help-dialog>.primary-button{width:100%}#toast{position:fixed;top:max(20px,env(safe-area-inset-top));left:50%;transform:translate(-50%,-16px);padding:13px 20px;border-radius:10px;background:#e1ffc0;color:#25321c;font-size:14px;box-shadow:0 10px 50px #0004;z-index:30;opacity:0;pointer-events:none;transition:.25s;max-width:calc(100vw - 30px);text-align:center}#toast.show{opacity:1;transform:translate(-50%,0)}.fallback{padding:90px 28px 35px;text-align:center;color:#d5e7e2;font-size:15px;line-height:1.6}.fallback p{margin-bottom:22px}.fallback-keys{display:flex;flex-wrap:wrap;gap:7px;justify-content:center}.fallback-keys button{width:38px;height:38px;background:#c3ff70;color:#1d2a26;border:0;border-radius:8px;font:16px var(--mono)}
@media(min-width:1500px){#scene{height:535px}.view-tag{top:475px}.message-panel{padding:30px}.console-heading{margin-bottom:35px}textarea{height:160px}.output-box{min-height:145px}.workspace-heading{padding:39px 0 32px}}
@media(max-width:1100px){.app-shell{padding:0 26px}.header-center{display:none}.workspace{grid-template-columns:minmax(0,1.5fr) minmax(300px,1fr);gap:16px}.message-panel{padding:22px}.stage-top{left:18px;right:18px}.rotor-section{padding:20px 18px 17px}.rotor-cards{gap:8px}.rotor-card{padding:9px 2px}.rotor-name{font-size:8px}.rotor-caption{font-size:9px}#scene{height:459px}.scene-caption{font-size:10px}.view-tag{display:none}footer>span:last-child{font-size:9px}}
@media(max-width:800px){.app-shell{padding:0 20px}.topbar{height:82px}.brand{font-size:22px}.brand-sub{font-size:8px}.brand-mark{width:39px;height:39px}.workspace-heading{padding:26px 0 23px}h1{font-size:30px}.eyebrow{font-size:9px}.model-badge{font-size:9px;padding:8px}.workspace{grid-template-columns:1fr;gap:18px}#scene{height:420px}.scene-caption{font-size:11px}.rotor-section{padding:18px 22px}.rotor-name{font-size:10px}.rotor-card{padding:10px 12px}.rotor-caption{font-size:11px}.message-panel{padding:24px}.console-heading{margin-bottom:24px}textarea{height:125px}.console-tip{margin-top:0}.signal-divider{margin:20px 0}.last-signal{margin:17px 0}.console-tip p{font-size:12px}.primary-button{font-size:14px;min-height:48px}.decrypt-hint{font-size:11px}.input-note{font-size:12px}.input-heading,.output-heading{font-size:11px}.console-heading h2{font-size:20px}.output-box{min-height:105px}footer{align-items:flex-start;flex-direction:column;gap:10px;padding:22px 0 26px}footer>span:last-child{font-size:11px}.rotor-card button{min-width:40px}.settings-link{font-size:13px}}
@media(max-width:480px){.app-shell{padding:0 14px}.topbar{height:77px;gap:10px}.brand{gap:10px;font-size:20px;letter-spacing:1.5px}.brand-sub{font-size:7px;letter-spacing:1px}.brand-mark{width:36px;height:36px;border-radius:10px}.header-actions{gap:7px}.help-label{display:none}.help-button{width:36px;padding:0;justify-content:center}.help-button,.icon-button{height:36px;border-radius:9px}.icon-button{width:36px}.sound-slash{left:7px;top:16px}.workspace-heading{align-items:flex-end;padding:23px 0 20px}.eyebrow{font-size:8px;letter-spacing:1.3px}h1{font-size:27px;line-height:1.25;letter-spacing:-1.1px}.mobile-break{display:block}.model-badge{font-size:8px;letter-spacing:.5px;padding:7px 8px;margin-bottom:4px}.model-badge span{padding:0 3px}.machine-panel,.message-panel{border-radius:15px}.stage-top{top:18px;left:16px;right:16px}.live-badge{font-size:8px;letter-spacing:.7px}.quiet-button{font-size:10px}.quiet-button span{font-size:17px}#scene{height:335px}.scene-caption{font-size:10px;margin-top:-12px}.rotor-section{padding:16px 14px;margin-top:15px}.section-label{font-size:9px;letter-spacing:.8px}.rotor-card{padding:9px 0}.rotor-card button{min-width:26px;width:26px}.rotor-letter{font-size:26px}.rotor-name{font-size:8px}.rotor-caption{font-size:9px}.rotor-caption .text-button{font-size:10px}.message-panel{padding:21px}.plugboard{grid-template-columns:repeat(9,1fr)}dialog{padding:22px 18px}.dialog-heading h2{font-size:22px}.settings-grid{gap:7px}.settings-rotor{padding:10px 8px}.settings-rotor label{font-size:10px}.settings-rotor select{padding:8px 5px}.settings-rotor h3{font-size:11px}.dialog-footer{gap:8px}.dialog-footer button{font-size:12px;padding:12px}.help-steps{gap:20px}.help-steps p{font-size:13px}}
@media(prefers-reduced-motion:reduce){*,*::before,*::after{animation:none!important;transition:none!important}}
/* Keep controls and supporting copy readable at desktop and phone sizes. */
.eyebrow,.header-center,.brand-sub,.model-badge,.live-badge,.quiet-button,.scene-caption,.rotor-name,.rotor-caption,.text-button,.small-badge,.input-heading>span,.input-note,.signal-divider>div>span,.signal-label,.decrypt-hint,footer,footer>span:first-child,footer>span:last-child,.plug-title p,.plug-empty,.help-note{font-size:12px}
.section-label,.input-heading,.output-heading,.settings-link,.settings-rotor label{font-size:14px}
.console-tip p,.help-button,.primary-button,.settings-rotor h3{font-size:14px}
.help-steps p,.dialog-intro{font-size:16px}
.brand-sub{font-size:10px;letter-spacing:.5px}.header-center{letter-spacing:1px}.stage-top{gap:8px}.live-badge{letter-spacing:.3px}.section-label{letter-spacing:.5px}.rotor-name{letter-spacing:.7px}.input-heading,.output-heading{letter-spacing:.3px}.signal-label{font-size:12px;letter-spacing:0}.console-tip{margin-top:12px}.console-tip p{line-height:1.6}.decrypt-hint{line-height:1.7}.mobile-type-button{display:none}
@media(min-width:801px){#scene{flex:1;min-height:465px}.rotor-section{margin-top:22px}.scene-caption{padding:0 14px}}
@media(max-width:1100px) and (min-width:801px){.workspace{grid-template-columns:minmax(0,1.4fr) minmax(320px,1fr)}.scene-caption{font-size:12px}.stage-top{flex-wrap:wrap}.last-signal{gap:6px}.signal-label{font-size:11px}.rotor-caption{flex-wrap:wrap}.section-label{font-size:12px}.rotor-name{font-size:11px}}
@media(max-width:800px){.mobile-type-button{display:flex;align-items:center;justify-content:center;gap:10px;align-self:center;border:1px solid #c3ff7045;background:#c3ff700b;color:var(--lime);border-radius:8px;padding:10px 16px;margin:12px 0 0;font-size:14px}.rotor-section{margin-top:15px}.scene-caption{padding:0 12px;line-height:1.5}.rotor-caption{font-size:12px}.settings-rotor label{font-size:12px}.rotor-cards{gap:8px}}
@media(max-width:480px){.brand-sub{display:none}.model-badge{display:none}.workspace-heading{padding:20px 0}.workspace-heading .eyebrow{font-size:12px;letter-spacing:.6px}.live-badge,.quiet-button{font-size:12px}.stage-top{left:14px;right:14px}.section-label{font-size:12px;letter-spacing:0}.settings-link{font-size:14px}.rotor-name{font-size:12px}.rotor-caption{flex-wrap:wrap;font-size:12px;gap:3px}.rotor-caption .text-button{font-size:12px}.input-heading,.output-heading{font-size:12px}.input-heading>span{font-size:12px}.console-tip p{font-size:14px}.scene-caption{font-size:12px}.help-steps p{font-size:15px}.settings-rotor h3{font-size:12px}.dialog-intro{font-size:14px}.help-note{font-size:13px}.signal-label{font-size:12px}.header-actions{gap:8px}}
.plug-title>span{white-space:nowrap;flex-shrink:0}.dialog-footer button{min-height:44px}
body{min-width:0}#toast{width:max-content}
@media(max-width:480px){.rotor-card{position:relative;padding:27px 0 8px}.rotor-name{position:absolute;top:9px;left:0;right:0;white-space:nowrap;font-size:12px}.rotor-card button{min-width:24px;width:24px;flex-shrink:0}.rotor-value{flex:1;min-width:0}.rotor-letter{font-size:26px}.stage-top{flex-wrap:wrap}}
/* Wooden case and mechanical controls. */
:root{background:#111c1b;color:#f0f2e9;--muted:#a0b1ab;--lime:#c3e879}
.machine-panel{background:radial-gradient(ellipse at 47% 30%,#47736a 0,#29473f 36%,#192e29 70%,#152621 100%);border-color:#91bba933}
.message-panel{background:#1a2b26}dialog{background:#1c302a}textarea{background:#111f1c}.rotor-section{background:#111f1c66}
.machine-toolbar{z-index:2;position:relative;display:flex;align-items:center;justify-content:space-between;gap:10px;padding:62px 18px 0;flex-wrap:wrap}
.view-buttons{display:flex;gap:3px;padding:4px;background:#0e211b99;border:1px solid #bdd2bc26;border-radius:9px}
.view-buttons button,#lid-toggle{font-size:13px;border:1px solid transparent;border-radius:6px;padding:9px 11px;background:transparent;color:#c1d3ca;min-height:38px}
.view-buttons button[aria-pressed=true]{background:#bfd4b521;color:#edf6e4;border-color:#c3ddad30}
#lid-toggle{border:1px solid #d7bd8559;background:#d7bd8510;color:#edcf96}
#scene{height:520px;min-height:480px;flex:initial}.scene-caption{padding:0 22px;margin-top:0;line-height:1.6;min-height:40px;color:#b3c8bc}
.view-tag{display:none}.rotor-caption{flex-wrap:wrap;font-size:12px}.rotor-card.empty{border-style:dashed;opacity:.65}
.interaction-panel{margin:12px 18px 2px;padding:16px;border:1px solid #bbd5bf33;background:#101e1bbc;border-radius:12px}
.interaction-panel[hidden]{display:none}.workshop-top{display:flex;align-items:center;gap:10px;flex-wrap:wrap}.workshop-top label{font-size:13px;color:#a4bcb0}.workshop-top select{width:112px;background:#213d31}.workshop-top>span{font-size:14px;margin-right:auto}.workshop-top button{padding:8px 12px;min-height:40px;border-color:#d3b67366;color:#f2d499}
.bank-row{display:flex;align-items:center;gap:16px;margin-top:16px}.bank-row>span{font-size:13px;color:#b9cabb}#rotor-bank{display:flex;gap:8px;flex-wrap:wrap}.spare-rotor{width:43px;height:40px;border:1px solid #e0c18470;border-radius:8px;background:#d3b66c15;font:16px var(--mono);color:#f2d799}.spare-rotor:disabled{opacity:.3}
.interaction-panel p{font-size:12px;color:#a9bfb1;line-height:1.6;margin:12px 0 0}.plug-live-heading{display:flex;align-items:center;justify-content:space-between;gap:10px;flex-wrap:wrap;font-size:13px}.plug-live-heading strong{color:#d8e9be}.plug-live-heading>span{color:#9bb2a5}.interaction-panel summary{cursor:pointer;font-size:13px;color:#c4d6c4;padding:8px 0}.interaction-panel .plugboard{margin-top:8px}.plug-key[aria-pressed=true]{border-color:#c3e879;color:#c3e879;background:#c3e87916}.settings-error{color:#efb575}.live-badge{max-width:100%}textarea:disabled{opacity:.55;cursor:not-allowed}
@media(min-width:1500px){#scene{height:570px;min-height:570px}}
@media(max-width:1100px) and (min-width:801px){.machine-toolbar{padding-left:14px;padding-right:14px;gap:7px}.view-buttons button,#lid-toggle{font-size:12px;padding:8px}.bank-row{align-items:flex-start;flex-direction:column;gap:10px}}
@media(max-width:800px){#scene{height:470px;min-height:470px}.machine-toolbar{padding-top:60px}.rotor-section{margin-top:18px}}
@media(max-width:480px){#scene{height:390px;min-height:390px}.machine-toolbar{padding:58px 12px 0;gap:9px}.view-buttons{flex:1}.view-buttons button{flex:1;font-size:12px;padding:8px 6px}#lid-toggle{width:100%;font-size:13px;padding:8px}.scene-caption{font-size:12px;padding:0 14px}.interaction-panel{margin:12px 12px 0;padding:13px}.workshop-top{gap:9px}.workshop-top>span{width:calc(100% - 110px);font-size:13px}.workshop-top select{flex:1}.bank-row{flex-direction:column;align-items:flex-start;gap:9px}.spare-rotor{width:39px;height:42px}#rotor-bank{gap:6px}.section-label{gap:8px}.rotor-caption>span{max-width:100%}}

.backspace-button{display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:6px;margin-top:10px;padding:10px 12px;border:1px solid #e0bd6755;border-radius:9px;background:#e0bd6710;color:#f1d792;font-size:14px;min-height:44px}.backspace-button span{font-size:11px;color:#bac6ad}.backspace-button:hover:not(:disabled){background:#e0bd6724}

.language-bar{display:flex;align-items:center;justify-content:space-between;gap:8px;margin-bottom:18px}.language-bar span{font:10px var(--mono);color:#bdd28e;letter-spacing:.5px}.language-bar button{flex-shrink:0;padding:8px 12px;min-height:40px;border:1px solid #bdcf8b55;background:#bdcf8b12;border-radius:8px;color:#e3efa9;font:13px var(--mono)}

/* A real editable control keeps native mobile keyboards within the screen view. */
#screen-input.screen-native-input{position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);width:24px!important;height:24px!important;min-height:0;padding:0;border:0;opacity:.01;pointer-events:none;font-size:16px;resize:none;background:transparent;color:transparent;caret-color:transparent;outline:none;box-shadow:none;overflow:hidden;scrollbar-width:none;-webkit-appearance:none;appearance:none}
body.screen-typing{overflow:hidden}
.machine-panel.laptop-mobile{position:fixed;inset:auto 0 auto 0;top:var(--typing-top,0px);height:var(--typing-height,100dvh);z-index:20;margin:0;border-radius:0;display:flex;flex-direction:column;background:#1d332d;overflow:hidden}
.laptop-mobile .stage-top{top:max(12px,env(safe-area-inset-top));left:14px;right:14px}
.laptop-mobile .machine-toolbar{flex:none;padding:48px 12px 6px;gap:6px;flex-wrap:nowrap}
.laptop-mobile #lid-toggle{width:auto;font-size:11px;padding:8px}
.laptop-mobile .view-buttons{flex:1}.laptop-mobile .view-buttons button{font-size:11px;padding:8px 5px}
.laptop-mobile #scene{flex:1;min-height:0;height:auto;width:100%}
.laptop-mobile .rotor-section,.laptop-mobile .interaction-panel,.laptop-mobile .scene-caption,.laptop-mobile #mobile-type{display:none}

/* The default presentation contains only the machine and its two reset actions. */
body[data-mode="machine"]{overflow:hidden}
body[data-mode="machine"] .app-shell{max-width:none;margin:0;padding:0}
body[data-mode="machine"] .workspace{display:block}
body[data-mode="machine"] .topbar,
body[data-mode="machine"] .workspace-heading,
body[data-mode="machine"] .message-panel,
body[data-mode="machine"] footer,
body[data-mode="machine"] .machine-toolbar,
body[data-mode="machine"] .scene-caption,
body[data-mode="machine"] #mobile-type,
body[data-mode="machine"] .interaction-panel,
body[data-mode="machine"] .view-tag,
body[data-mode="machine"] .rotor-section,
body[data-mode="machine"] .live-badge{display:none}
body[data-mode="machine"] .machine-panel{position:fixed;inset:0;height:100dvh;border:0;border-radius:0}
body[data-mode="machine"] #scene{flex:1;height:100%;min-height:0}
body[data-mode="machine"] .stage-top{top:max(16px,env(safe-area-inset-top));left:max(16px,env(safe-area-inset-left));right:max(16px,env(safe-area-inset-right));justify-content:flex-end;gap:8px}
body[data-mode="machine"] .stage-top button{min-height:44px;padding:8px 14px;border:1px solid #b5ebdd30;border-radius:10px;background:#152a23cc;color:#e1efe9;font-size:12px;backdrop-filter:blur(8px)}
body[data-mode="machine"] .stage-top button:hover{background:#294a3ded}
body[data-mode="machine"] .machine-panel.laptop-mobile{inset:auto 0 auto 0;top:var(--typing-top,0px);height:var(--typing-height,100dvh)}

.corner-actions{position:absolute;inset:auto 16px max(16px,env(safe-area-inset-bottom));z-index:3;display:flex;justify-content:space-between;pointer-events:none}
.corner-actions button,#reset-machine{pointer-events:auto;display:flex;align-items:center;justify-content:center;width:48px;height:48px;padding:0;line-height:1;border:1px solid #b5ebdd30;border-radius:12px;background:#152a23cc;color:#e1efe9;backdrop-filter:blur(8px)}
.corner-actions button:hover{background:#294a3ded}
.corner-actions svg,#reset-machine svg{display:block;flex:none;width:24px;height:24px;fill:none;stroke:currentColor;stroke-width:1.8;stroke-linecap:round;stroke-linejoin:round}
#sound-toggle[aria-pressed=true] .sound-mute{display:none}
.corner-actions #sound-toggle{order:0}.corner-actions #reset-camera{order:1}
#scene-loading.loading-error{z-index:5;flex-direction:column;padding:28px;text-align:center;background:#18352eed;line-height:1.5}
#scene-loading.loading-error p{max-width:440px;margin:0}

/* Overlays belong to the interactive scene, not the browser's page zoom. */
body[data-mode="machine"] .machine-panel,.machine-panel.laptop-mobile,
#sound-toggle,.corner-actions button,.stage-top button{touch-action:none}

body.screen-typing #toast{top:calc(var(--typing-top,0px) + max(20px,env(safe-area-inset-top)))}

#lock-digits{display:flex;gap:5px}#lock-digits select{padding:6px;width:42px;font:700 18px monospace;border:1px solid #aa9769;border-radius:5px;background:#172d27;color:#efdfb6}

body[data-mode="machine"] #toast{display:none}

#paper-dialog{width:min(840px,calc(88dvh * .707182 + 116px),calc(100vw - 20px));max-width:none;max-height:94dvh;padding:6px 0;border:0;border-radius:0;background:transparent;color:#263029;overflow:auto;box-shadow:none}
#paper-dialog[open]{display:grid;grid-template-columns:44px minmax(0,1fr) 44px;align-items:start;gap:14px}
#paper-dialog::backdrop{background:#07120ed4;backdrop-filter:blur(6px)}
.paper-sheet{position:relative;container-type:inline-size;width:100%;aspect-ratio:768/1086;background:#f3ecd4;border-radius:1px;box-shadow:0 10px 30px #0006,inset 0 0 45px #b3a57a12}
.paper-sheet h2{position:absolute;left:6.25%;right:6.25%;top:3.5%;margin:0;padding-bottom:2.4cqw;border-bottom:1px solid #b7ad91;color:#546052;font:400 2.865cqw/1.25 "Press Start 2P",monospace;letter-spacing:0}
#paper-text{position:absolute;left:6.25%;right:6.25%;top:10.13%;margin:0;padding:0;white-space:pre;overflow:visible;font:400 3.386cqw/1.25 "Press Start 2P",monospace;color:#263029;user-select:text;letter-spacing:0}
#paper-counter{position:absolute;left:6.25%;top:95.12%;font:400 2.344cqw/1.25 "Press Start 2P",monospace;color:#777b67}
.paper-controls{position:sticky;top:6px;height:min(88dvh,calc((100vw - 136px)*1.414));display:flex;flex-direction:column;align-items:center;justify-content:center;gap:14px}
.paper-controls button{flex-shrink:0;width:44px;height:44px;padding:0;display:grid;place-items:center;border:1px solid #c6d4b84d;border-radius:50%;background:#233a31;color:#ecf0dc;font:25px/1 monospace;box-shadow:0 3px 12px #0003}
.paper-controls button:hover:not(:disabled){background:#39513e;border-color:#c3e879}
.paper-controls button:focus-visible{outline:2px solid #c3e879;outline-offset:3px}
.paper-controls button:disabled{opacity:.25;cursor:default}
#paper-next{position:absolute;top:50%;transform:translateY(-50%)}
#paper-save{position:absolute;top:calc(50% + 36px)}
.paper-controls .paper-close{position:absolute;top:0}
.paper-controls svg{display:block;flex:none;width:23px;height:23px;stroke:currentColor;stroke-width:1.7;stroke-linecap:round;stroke-linejoin:round}
#paper-save-status{grid-column:2;margin:0;color:#f3ecd4;font-size:13px;text-align:center}
#paper-save-status:empty{display:none}
@media(max-width:480px){#paper-dialog[open]{grid-template-columns:36px minmax(0,1fr) 36px;gap:6px}.paper-controls{height:calc((100vw - 104px)*1.414);gap:12px}.paper-controls button{width:36px;height:36px;font-size:22px}.paper-controls svg{width:20px;height:20px}}


#screen-input::-webkit-scrollbar{display:none}

#code-value{display:block;min-height:56px;margin-bottom:12px;color:#b6e6b4;background:#0a2019;padding:12px;text-align:left;font:26px monospace;letter-spacing:4px}
#code-value::after{content:'';display:inline-block;width:.6em;height:.85em;border-bottom:2px solid currentColor;animation:code-cursor-blink 1.1s step-end infinite}
#code-value[data-full="true"]::after{display:none}
@keyframes code-cursor-blink{0%,100%{opacity:1}50%{opacity:0}}
@media(prefers-reduced-motion:reduce){#code-value::after{animation:none}}
#code-buttons{display:grid;grid-template-columns:repeat(3,1fr);gap:8px;max-width:320px;margin:auto}
#code-buttons button{border:1px solid #bccda144;border-radius:8px;background:#2c453b;color:#f1f0d3;min-height:44px;font-size:20px}
.paper-sheet.is-document{background:white;overflow:hidden}.paper-sheet.is-document h2,.paper-sheet.is-document pre,.paper-sheet.is-document #paper-counter{display:none}
#paper-artwork{width:100%;height:100%;object-fit:contain;display:block}#paper-artwork[hidden]{display:none}

/* Persistent setup: a separate workspace, available only through ?mode=setup. */
body[data-mode="setup"]{background:#13221e;color:#edf4e9;overflow:auto}
body[data-mode="setup"] .app-shell{max-width:1320px;padding:0 40px}
.setup-header{display:flex;align-items:center;gap:24px;min-height:88px;border-bottom:1px solid #ffffff18}
.setup-header .brand{font-size:22px;letter-spacing:3px}.setup-local{font-size:12px;color:#a8beae;border:1px solid #69887660;border-radius:30px;padding:7px 12px}
.setup-back{margin-left:auto;color:#d6e8ca;text-decoration:none;font-size:14px}
.setup-main{padding:46px 0 28px}.setup-heading{max-width:760px;margin-bottom:30px}.setup-heading h1{font-size:clamp(27px,3.4vw,42px);letter-spacing:-1.5px}.setup-heading p{font-size:15px;line-height:1.7;color:#a9beb2;margin:17px 0 0}
.setup-fields{border:0;margin:0;padding:0;min-width:0}.setup-columns{display:grid;grid-template-columns:minmax(0,1.2fr) minmax(0,1fr);gap:22px}.setup-column{display:flex;flex-direction:column;gap:22px;min-width:0}
.setup-card{background:#1c3028;border:1px solid #78927c35;border-radius:18px;padding:26px;min-width:0}.setup-number{font:11px var(--mono);letter-spacing:1.2px;color:#b0c295}.setup-card h2{font-size:21px;letter-spacing:-.5px;margin:10px 0 23px}.setup-card h3{font-size:14px;margin:0}.setup-card-heading{display:flex;align-items:start;justify-content:space-between;gap:18px}.setup-card-heading h2{margin-bottom:12px}
.setup-card label{display:flex;flex-direction:column;gap:9px;color:#d5e0d3;font-size:12px;line-height:1.5}.setup-card .setup-language{font-size:10px;min-width:168px}.setup-card input:not([type=checkbox]):not([type=range]):not([type=file]),.setup-card select{width:100%;border:1px solid #7b99805c;border-radius:8px;background:#13251e;color:#eef5e8;padding:11px 10px;min-height:44px;font-size:15px;outline-offset:3px}.setup-card input:focus-visible{outline:2px solid var(--lime)}.setup-card input[inputmode=numeric]{font-family:var(--mono);letter-spacing:5px;font-size:20px!important}
.setup-hint{font-size:12px;color:#9fb3a5;line-height:1.65;margin:10px 0 18px}.setup-rotors{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:12px;margin-top:20px}.setup-rotor{padding:16px 12px;background:#16271f;border:1px solid #a3be901c;border-radius:12px}.setup-rotor h3{margin-bottom:18px;color:#c7ddba}.setup-rotor label+label{margin-top:14px}.setup-reflector{margin-top:20px;max-width:170px}.setup-plug-heading{display:flex;justify-content:space-between;align-items:center;margin-top:28px;gap:12px}.setup-plug-heading span{font:11px var(--mono);color:#b8c9a6}
.setup-plugs{display:grid;grid-template-columns:repeat(9,minmax(0,1fr));gap:7px}.setup-plugs button{height:40px;border:1px solid #79967e50;border-radius:8px;background:#14261e;font:15px var(--mono);color:#b3c5b6}.setup-plugs button[aria-pressed=true]{color:#d9f79d;background:#a1c6731c;border-color:#98bc6c}.setup-plugs button.is-pending{outline:2px solid var(--lime);outline-offset:2px}.setup-pairs{display:flex;flex-wrap:wrap;gap:8px;min-height:27px;margin-top:18px;font-size:12px;color:#9fb3a5}.setup-pairs button{border:1px solid #9eba743f;border-radius:6px;background:#c3ff700c;color:#d6e8b6;padding:6px 9px;font-size:12px}
.setup-code-grid{display:grid;grid-template-columns:1fr 1fr;gap:16px;margin-bottom:20px}.setup-card .setup-check{flex-direction:row;align-items:center;font-size:14px;gap:10px}.setup-check input{width:18px;height:18px;accent-color:var(--lime)}.setup-volume{position:relative;margin-top:20px}.setup-volume output{position:absolute;right:0;font-family:var(--mono);color:#d6e8b6}.setup-volume input{width:100%;accent-color:#bad784;height:22px}
.setup-file+.setup-file{border-top:1px solid #a1bf9028;margin-top:22px;padding-top:22px}.setup-file-name{display:block;margin:8px 0 14px;color:#b7c9ae;font-size:12px;overflow-wrap:anywhere}.setup-file input[type=file]{width:100%;font-size:12px;color:#a5b9a9;min-height:42px}.setup-file input::file-selector-button{background:#2d4737;color:#e8f2d7;border:1px solid #89a37966;border-radius:7px;padding:10px 13px;margin-right:10px;cursor:pointer}.setup-file .text-button{font-size:12px;margin-top:10px}.setup-file details{font-size:12px;color:#c2d4b5}.setup-file summary{cursor:pointer;padding:4px 0}.setup-file img{display:block;max-width:100%;max-height:420px;object-fit:contain;margin:15px auto 0;background:white}.setup-file audio{display:block;width:100%;height:38px;margin-top:10px}
.setup-savebar{position:sticky;bottom:16px;z-index:10;background:#11251ef2;backdrop-filter:blur(16px);border:1px solid #91ad744d;border-radius:14px;padding:18px 22px;display:flex;align-items:center;justify-content:space-between;gap:20px;margin-top:24px;box-shadow:0 12px 40px #07140d60}.setup-savebar strong{font-size:13px;font-weight:500;color:#d8e8c9}.setup-savebar strong[data-error=true]{color:#ffc39d}.setup-savebar p{font-size:11px;line-height:1.5;color:#96ad9c;margin:7px 0 0}.setup-savebar .primary-button{white-space:nowrap;padding:15px 19px;margin:0}
@media(max-width:1050px){.setup-card-heading{flex-direction:column}.setup-card .setup-language{width:100%}.setup-columns{gap:16px}.setup-card{padding:20px}.setup-rotors{gap:8px}.setup-plugs{grid-template-columns:repeat(8,minmax(0,1fr))}}
@media(max-width:760px){body[data-mode="setup"] .app-shell{padding:0 16px}.setup-header{min-height:74px;gap:12px}.setup-header .brand{font-size:18px}.setup-local{display:none}.setup-back{font-size:12px}.setup-main{padding-top:30px}.setup-heading{margin-bottom:24px}.setup-heading p{font-size:14px}.setup-columns{grid-template-columns:1fr}.setup-card-heading{flex-direction:row;flex-wrap:wrap}.setup-card .setup-language{width:auto}.setup-rotors{gap:7px}.setup-rotor{padding:13px 8px}.setup-rotor h3{font-size:12px}.setup-card select{padding:10px 6px}.setup-card input:not([type=checkbox]):not([type=range]):not([type=file]),.setup-card select{font-size:16px}.setup-plugs{grid-template-columns:repeat(8,minmax(0,1fr))}.setup-code-grid{gap:12px}.setup-savebar{flex-direction:column;align-items:stretch;gap:13px;bottom:max(8px,env(safe-area-inset-bottom));padding:15px}.setup-savebar .primary-button{justify-content:center}.setup-savebar p{font-size:10px}}

#photo-dialog{padding:24px 52px;width:min(900px,94vw);max-width:94vw;background:#182720;border:1px solid #71817480;border-radius:12px;color:#e5e6d4;overflow:visible}#photo-dialog::backdrop{background:#07100deb;backdrop-filter:blur(12px)}#photo-dialog figure{margin:0;display:flex;flex-direction:column;align-items:center;gap:14px}#photo-dialog img{display:block;max-width:100%;max-height:75dvh;object-fit:contain;box-shadow:0 12px 40px #0005}#photo-dialog button{position:absolute;background:#35483b;border:1px solid #aabb9233;color:#e8eedc;width:38px;height:38px;border-radius:50%;font:26px Arial;cursor:pointer}#photo-dialog .photo-close{right:8px;top:8px}#photo-dialog .photo-prev{left:7px;top:48%}#photo-dialog .photo-next{right:7px;top:48%}
.setup-room-card{margin-top:22px}.setup-room-photos{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:22px}.setup-photo{display:flex;flex-direction:column;gap:12px;min-width:0;padding:16px;border:1px solid #78927c35;border-radius:12px;background:#13251e}.setup-photo img{width:100%;height:230px;object-fit:contain;background:#0c1b15;border-radius:6px}.setup-photo img[hidden]{display:none}.setup-photo input{max-width:100%;font-size:12px}.setup-photo .setup-hint{margin:0;overflow-wrap:anywhere}.setup-photo button{text-align:left}.setup-photo input::file-selector-button{background:#2d4737;color:#e8f2d7;border:1px solid #89a37966;border-radius:7px;padding:9px;margin:10px 5px 0 0;cursor:pointer}
@media(max-width:760px){.setup-room-photos{grid-template-columns:1fr}.setup-photo img{height:280px}#photo-dialog{padding:48px 43px 20px}}
/* Emoji entry: an orbit on desktop, a keyboard below the card on phones. */
body[data-mode="login"]{background:#f4f3ed;color:#213c33;overflow:auto}
body[data-mode="login"]>.app-shell,body[data-mode="login"]>#toast{display:none}
.login-page{position:relative;z-index:20;min-height:100dvh;background:radial-gradient(ellipse at center,#fffef8 15%,#f1f1e9 72%);display:grid;place-items:center;padding:20px}
.login-stage{position:relative;width:min(1040px,100%);height:800px;max-height:none;display:grid;place-items:center}
.login-card{position:relative;z-index:2;width:390px;padding:32px;background:#ffffffed;border:1px solid #d5ded5;border-radius:24px;box-shadow:0 18px 70px #24433212;text-align:left}
.login-field{margin-top:17px}.login-field>span{display:block;font-size:12px;font-weight:600;margin:0 0 8px 3px;color:#5f7265}.login-input-row{display:flex;gap:6px}.login-input{flex:1;min-width:0;min-height:56px;display:flex;align-items:center;gap:4px;overflow-x:auto;background:#f8faf6;border:1px solid #d8e0d4;border-radius:10px;padding:10px;text-align:left;color:#4a6656}.login-input[aria-pressed="true"]{border-color:#6b8d64;box-shadow:0 0 0 3px #8cac7917;background:#fff}.login-input img{width:28px;height:28px;object-fit:contain;flex:none}.login-input>span:not(.login-placeholder){font-size:24px}.login-placeholder{font-size:12px;white-space:nowrap;color:#8a978a}.login-delete{flex:none;width:38px;border:0;border-radius:10px;background:#edf2e9;color:#697e62;font-size:24px}.login-delete:hover{background:#e0e9d8}
.login-submit{display:flex;justify-content:space-between;align-items:center;width:100%;padding:16px 19px;border:0;border-radius:11px;background:#284c3b;color:white;font-size:14px;font-weight:600;margin-top:24px}.login-submit:hover{background:#37614b}.login-submit span{font-size:20px}
.login-symbols{position:absolute;inset:0;pointer-events:none}.login-symbol{position:absolute;left:var(--x);top:var(--y);transform:translate(-50%,-50%);pointer-events:auto;width:56px;height:56px;display:grid;place-items:center;border:1px solid #dbe2d555;border-radius:16px;background:#ffffff90;box-shadow:0 4px 14px #23453206;color:#294b39}.login-symbol img{width:38px;height:38px;object-fit:contain}.login-symbol>span:not(.login-letter){font-size:30px}.login-symbol:active:not(:disabled){transform:translate(-50%,-50%) scale(.94)}.login-letter{position:absolute;right:-5px;top:-6px;min-width:23px;height:23px;display:grid;place-items:center;background:#284c3b;color:#fff;border-radius:8px;font-size:12px;opacity:0;transition:opacity .15s}.login-symbol:focus-visible .login-letter,.login-symbol.is-revealed .login-letter{opacity:1}.login-page button:focus-visible{outline:2px solid #719464;outline-offset:3px}
.setup-login-card{margin-bottom:22px}.setup-login-card details{margin-top:22px}.setup-login-card summary{cursor:pointer;font-weight:600;font-size:14px}.setup-login-preview{display:grid;gap:10px;margin-top:18px}.setup-login-preview>div{display:flex;flex-wrap:wrap;gap:5px;align-items:center;min-height:30px}.setup-login-preview>div>span:first-child{font-size:12px;min-width:80px;color:var(--muted)}.setup-login-preview img,.setup-login-symbol img{width:30px;height:30px;object-fit:contain;background:#fff;border-radius:5px;padding:2px}.setup-login-symbols{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:10px}.setup-card .setup-login-symbol{display:flex;align-items:center;gap:10px;padding:10px;background:#ffffff06;border-radius:8px}.setup-login-symbol>span:first-child{font-weight:600;font-size:18px;min-width:20px}.setup-card .setup-login-symbol select{min-width:0;flex:1;font-size:12px;padding:8px}
@media(min-width:761px) and (min-height:880px){.login-stage{height:min(900px,calc(100dvh - 40px))}}
@media(max-width:760px){.login-page{display:block;padding:24px 16px 30px}.login-stage{width:100%;height:auto;display:flex;flex-direction:column;gap:25px;max-width:480px;margin:auto}.login-card{width:100%;padding:26px 24px;border-radius:20px}.login-card h1{font-size:26px;margin-top:23px}.login-intro{margin-bottom:20px}.login-symbols{position:static;display:grid;grid-template-columns:repeat(7,minmax(0,1fr));gap:10px 6px;width:100%;padding:0 3px}.login-symbol{position:relative;left:auto;top:auto;transform:none;width:100%;height:auto;aspect-ratio:1;border-radius:12px;min-height:40px}.login-symbol img{width:72%;height:72%}.login-symbol:active:not(:disabled){transform:scale(.94)}.login-letter{right:-2px;top:-5px}.setup-login-symbols{grid-template-columns:repeat(2,minmax(0,1fr))}}
@media(max-width:420px){.setup-login-symbols{grid-template-columns:1fr}.login-card{padding:24px 20px}.login-placeholder{font-size:11px}}
/* Symbol-only login and remembered entry. */
.login-field:first-child{margin-top:0}
.login-field>.login-word,.login-word{display:flex;align-items:center;gap:5px}
.login-word img{width:27px;height:27px;object-fit:contain}
.login-submit.login-word{justify-content:center;gap:9px;min-height:60px;background:#e5ecdf;border:1px solid #c7d5bb}
.login-submit.login-word:hover{background:#d6e2cd}
.login-submit.login-word img{width:30px;height:30px}
.login-delete{display:grid;place-items:center;padding:0;line-height:1}
.login-delete svg{display:block}
.login-loading{display:flex;align-items:center;justify-content:center;gap:10px;margin-top:18px;color:#395c44;font-size:13px;line-height:1.5;text-align:center}
.login-loading[hidden]{display:none}
.login-spinner{flex:none;width:18px;height:18px;border:2px solid #c7d5bb;border-top-color:#395c44;border-radius:50%;animation:spin .8s linear infinite}
@media(prefers-reduced-motion:reduce){.login-spinner{animation:none}}
.login-status{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap;border:0}
.login-error .login-input{border-color:#bb6659;box-shadow:0 0 0 2px #bb66591c}
.login-error .login-submit.login-word{background:#c64d43;border-color:#ae382f;animation:login-shake .3s ease}
.login-error .login-submit.login-word:hover{background:#c64d43}
.login-error .login-submit .login-morph{color:#fff}
@media(prefers-reduced-motion:reduce){.login-error .login-submit.login-word{animation:none}}
.login-accepted .login-input{border-color:#82a365;background:#f0f7e9}
.login-new-symbol{animation:login-fill .25s ease-out both}
.login-page[aria-busy="true"] button{opacity:1;cursor:wait}
.login-cover{position:fixed;inset:0;overflow:auto}
.login-page{transition:opacity .65s ease}
.login-stage{transition:transform .65s ease,filter .65s ease}
.login-leaving{opacity:0;pointer-events:none}
.login-leaving .login-stage{transform:scale(1.035);filter:blur(5px)}
@keyframes login-fill{from{opacity:0;transform:translateY(9px) scale(.7)}to{opacity:1;transform:none}}
@keyframes login-shake{25%,75%{transform:translateX(-4px)}50%{transform:translateX(4px)}}
.setup-tabs{display:flex;gap:6px;flex-wrap:wrap;margin-bottom:24px;padding:5px;border:1px solid #91ad7433;border-radius:12px;background:#102019;width:fit-content;max-width:100%}
.setup-tabs [role="tab"]{border:1px solid transparent;border-radius:8px;padding:12px 18px;min-height:44px;background:transparent;color:#a5b9a9;font-size:13px;font-weight:600}
.setup-tabs [role="tab"][aria-selected="true"]{background:#c3e87919;border-color:#c3e87950;color:#e0edcb}
.setup-tabs [role="tab"]:hover{background:#c3e87910;color:#e0edcb}
[role="tabpanel"][hidden]{display:none!important}
@media(max-width:480px){.setup-tabs{width:100%}.setup-tabs [role="tab"]{flex:1;padding:11px 8px;font-size:12px}}
.admin-entry{min-height:100dvh;display:grid;place-content:center;padding:32px 0}.admin-card{width:min(420px,calc(100vw - 32px));padding:32px;background:#1c3026;border:1px solid #91ad7440;border-radius:18px;box-shadow:0 20px 70px #0002}.admin-card h1{font-size:27px;letter-spacing:-.7px;margin:20px 0}.admin-card>p{font-size:13px;line-height:1.6;color:#b1c1b1}.admin-card label{display:flex;flex-direction:column;gap:9px;margin:20px 0;font-size:13px}.admin-card input{width:100%;min-height:48px;background:#11251c;color:#edf4e9;border:1px solid #91ad744d;border-radius:8px;padding:12px;font-size:16px}.admin-card input:focus-visible{outline:2px solid var(--lime);outline-offset:2px}.admin-card .primary-button{width:100%;justify-content:space-between;margin-top:18px}.admin-card .admin-status{color:#ffc39d;min-height:20px;margin:0}.admin-back{display:block;margin-top:22px;color:#b9cbb1;text-align:center;font-size:12px;text-underline-offset:4px}#setup-logout{white-space:nowrap}

/* Keep tapping native buttons immediate, without double-tap zoom or image callouts. */
.login-page{touch-action:manipulation;-webkit-touch-callout:none;-webkit-user-select:none;user-select:none}
.login-page img{pointer-events:none;-webkit-touch-callout:none;-webkit-user-drag:none;user-select:none}
.login-symbol .login-letter{left:50%;right:auto;top:auto;bottom:calc(100% + 8px);transform:translateX(-50%);min-width:32px;height:30px;padding:0 7px;pointer-events:none;font-size:17px;font-weight:600;box-shadow:0 3px 12px #152c2926}
.login-symbol{z-index:3;touch-action:none}
/* Use the same target for the letter hint and its frame, including captured touch swipes. */
.login-symbol.is-revealed,.login-symbol:focus-visible{z-index:4;background:white;border-color:#719464;box-shadow:0 4px 20px #284e3914;outline:2px solid #719464;outline-offset:3px}
@media(hover:hover) and (pointer:fine){.login-symbol:hover .login-letter{opacity:1}.login-symbol:hover{z-index:4;background:white;border-color:#719464;box-shadow:0 4px 20px #284e3914;outline:2px solid #719464;outline-offset:3px}}
@media(min-width:761px){.login-page{padding-top:44px}}
.setup-symbol-upload{display:grid;place-items:center;min-width:64px;min-height:64px;padding:7px;border:1px solid #91ad7455;border-radius:12px;background:#eff2e6;cursor:pointer}
.setup-symbol-upload:hover{background:#fff;border-color:#c3e879}
.setup-login-symbol .setup-symbol-upload img{width:48px;height:48px;padding:0;background:transparent;object-fit:contain}
.setup-login-symbol input[hidden],.setup-login-symbol button[hidden]{display:none}
.setup-login-symbol .text-button{margin-left:auto;font-size:11px}
@media(min-width:761px){.login-card{width:min(540px,calc(100% - 220px))}}
/* One word at a time; 1300ms visibility / 280ms steps permits at most 5 letters. */
.login-card .login-prompt{display:flex;justify-content:center;margin:0 0 25px;font-size:26px;font-weight:600;line-height:1.2;color:#294b39}
.login-morph{display:inline-flex;align-items:center;gap:3px;white-space:nowrap;pointer-events:none}
.login-morph-cell{position:relative;display:block;width:27px;height:32px;flex:none}
.login-morph-icon,.login-morph-text{position:absolute;inset:0;margin:auto;backface-visibility:hidden}
.login-morph .login-morph-text{display:flex;align-items:center;justify-content:center;width:100%;height:100%}
.login-morph .login-morph-icon{width:27px;height:27px;object-fit:contain}
.login-morph .login-morph-text{font-family:'Montserrat',sans-serif;font-size:inherit;color:inherit;letter-spacing:normal;line-height:1.3;opacity:0}
.login-morph.is-running .login-morph-icon{animation:login-wave-blur 1300ms ease-in-out var(--letter-delay) both,login-wave-icon 1300ms steps(1,end) var(--letter-delay) both}
.login-morph.is-running .login-morph-text{animation:login-wave-blur 1300ms ease-in-out var(--letter-delay) both,login-wave-text 1300ms steps(1,end) var(--letter-delay) both}
.login-field>.login-word{font-size:18px;color:#5f7265}
.login-input>.login-morph:not(.login-placeholder){font-size:17px;font-weight:500;color:#73836e;flex:none}
.login-input .login-morph-cell{width:22px;height:28px}
.login-input .login-morph-icon{width:22px;height:22px}
.login-submit .login-morph{font-size:20px;font-weight:600;color:#294b39}
.login-submit .login-morph-cell{width:30px;height:32px}
@keyframes login-wave-icon{0%{opacity:1}5%{opacity:0}95%,100%{opacity:1}}
@keyframes login-wave-text{0%{opacity:0}5%{opacity:1}95%,100%{opacity:0}}
@keyframes login-wave-blur{0%,35%,65%,100%{filter:blur(0)}5%,95%{filter:blur(3px)}}
@media(prefers-reduced-motion:reduce){.login-morph .login-morph-icon{opacity:0}.login-morph .login-morph-text{opacity:1}}

#live-plug-pairs .plug-pair[aria-pressed=true]{outline:2px solid #74d6bc;outline-offset:2px;background:#74d6bc22}

.setup-action{padding:20px 0;border-top:1px solid #79967e40}.setup-action h3{margin:0}.setup-action>label{margin-top:16px}.setup-action [data-print-content]>label,.setup-action [data-music-content]>label{margin-top:14px}.setup-action .setup-action-music{display:flex;flex-direction:row;align-items:center;gap:10px}.setup-action input[type=checkbox]{width:18px;height:18px;flex:none;accent-color:var(--lime)}.setup-action audio{width:100%;margin-top:12px}.setup-action details img{max-width:100%;max-height:280px;object-fit:contain}.setup-action textarea{min-height:150px;width:100%;resize:vertical;text-transform:none;letter-spacing:normal}.setup-action .setup-file-name{display:block;overflow-wrap:anywhere;margin-top:8px}

#setup-panel-actions{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:20px;align-items:start}
#setup-panel-actions>.setup-action{min-width:0;padding:20px;border:1px solid #79967e40;border-radius:12px;background:#14261e40}
#setup-panel-actions>.secondary-button{grid-column:1/-1;justify-self:start}
@media(max-width:760px){#setup-panel-actions{grid-template-columns:1fr}}
.setup-action-heading{font-size:18px;font-weight:600;line-height:1.4;color:#edf4e6}
.setup-action details summary{font-size:12px;line-height:1.5;color:#a9bca5;cursor:pointer}
.setup-action details img{display:block;max-width:min(100%,220px);max-height:180px;margin-top:8px}

.cipher-texts{display:grid;grid-template-columns:1fr 1fr;gap:24px;margin-top:28px}.cipher-texts textarea{display:block;width:100%;margin-top:12px;resize:vertical;padding:16px;line-height:1.7;min-height:220px}.cipher-actions{display:flex;gap:24px;flex-wrap:wrap;align-items:center}[data-preview]{display:flex;flex-direction:column;align-items:center;gap:24px;margin-top:28px}[data-preview] img{width:min(100%,540px);height:auto;box-shadow:0 10px 35px #0004}.setup-savebar[hidden],#cipher-print-root{display:none}
@media(max-width:760px){.cipher-texts{grid-template-columns:1fr}.setup-tabs{flex-wrap:wrap}}
@media print{@page{size:A4;margin:0}body.cipher-printing{background:white!important;margin:0!important;min-width:0!important}body.cipher-printing>*{display:none!important}body.cipher-printing>#cipher-print-root{display:block!important}#cipher-print-root img{display:block;width:210mm;height:297mm;break-after:page}#cipher-print-root img:last-child{break-after:auto}}

#reset-machine{position:absolute;top:max(16px,env(safe-area-inset-top));left:16px;z-index:4;padding:0;border:1px solid #b5ebdd30;border-radius:12px;background:#152a23cc;color:#e1efe9;backdrop-filter:blur(8px);touch-action:manipulation}#reset-machine:hover{background:#294a3ded}body[data-mode="full"] .stage-top{left:80px}

#reset-machine-dialog{width:min(460px,calc(100vw - 32px))}#reset-machine-dialog .dialog-footer{justify-content:flex-end}

body[data-mode="machine"] #toast.is-error{display:block}
