@font-face{font-family:Iosevka;src:url(fonts/iosevka.ttf)format("truetype");font-weight:400;font-style:normal;font-display:swap}html,body{margin:0;padding:0}@font-face{font-family:Chirufont;src:url(fonts/chirufont.ttf)format("truetype");font-weight:400;font-style:normal;font-display:swap}:root{--color-bg:#fff;--color-fg:#000000e6;--workspace-fill:#faf7f1e6;--workspace-stroke:#00000014;--puzzle-bounds-stroke:#00000040;--debug-hitbox-stroke:#2878c873;--debug-center-fill:#ff5733e6;--debug-center-stroke:#fffc;--debug-label-fill:#000000bf;--debug-label-stroke:#ffffffe6;--debug-auto-pan-outer:#ffb800a6;--debug-auto-pan-inner:#ff6200a6;--outline-simple-stroke:#0003;--panel-bg:#ffffffe0;--panel-border:#0000001a;--panel-shadow:0 16px 32px #0000002e;--panel-group-bg:#ffffffb3;--panel-group-border:#0000001f;--panel-group-text:inherit;--controls-hint-bg:#000000b3;--controls-hint-bg-hover:#000000d9;--controls-hint-color:#ffffffe6;--preview-bg:#ffffffe6;--preview-border:#0000001f;--preview-shadow:0 12px 24px #0000002e;--preview-shadow-hover:0 16px 32px #00000038;--preview-toggle-bg:#ffffffe6;--preview-toggle-border:#00000040;--preview-toggle-shadow:0 8px 16px #0000002e;--preview-icon-stroke:#141414d9;--preview-icon-fill:#141414d9;--preview-icon-slash:#141414d9;--preview-arrow-bg:#ffffffd9;--preview-arrow-border:#00000040;--preview-arrow-shadow:0 6px 12px #0000002e;--preview-arrow-shadow-hover:0 8px 16px #00000038;--preview-arrow-icon:#1e1e1ed9;--focus-outline:#1e78d2b3;--status-bg:#0000000f;--status-color:#0009;--status-solved-bg:#2e99532e;--status-solved-color:#135b28e6;--status-solved-border:#2e995359;--solved-banner-bg:#2e9953e6;--solved-banner-color:#fff;--solved-banner-shadow:0 14px 28px #19573159;--control-value-color:#0009;--control-select-bg:#fff;--control-select-border:#0003;--control-select-color:#000000e6;--control-separator:#0000002e;--control-button-bg:#fffffff2;--control-button-border:#0003;--control-button-color:#000000e6;--control-button-shadow:0 6px 12px #00000029;--sync-status-bg:#f05050e6;--sync-status-color:#fff;--sync-status-shadow:0 6px 16px #0003;--piece-outline-edge:red;--piece-outline-owned:#1e78d2;--piece-outline-solved:#2aa84a;--boot-bg:var(--color-bg);--boot-bar-track:#0000001f;--boot-bar-fill:#000000b3;--boot-error:var(--color-fg);--boot-error-muted:#000000a6}body{color-scheme:light;background:var(--color-bg);color:var(--color-fg)}.hidden{display:none}.boot-shell{opacity:1;background:var(--boot-bg,#fff);flex-direction:column;gap:20px;transition:opacity .45s;display:flex}.boot-shell.is-ready{opacity:0;pointer-events:none}.boot-bar{align-items:center;width:min(320px,72vw);height:10px;display:flex}.boot-bar-track{background:var(--boot-bar-track,#140e0a1f);width:100%;height:2px;position:relative}.boot-bar-fill{background:var(--boot-bar-fill,#140e0ab3);width:12%;height:6px;transition:width .2s;position:absolute;top:-2px;left:0}.boot-blocked{text-align:left;max-width:min(560px,90vw);color:var(--boot-error,#140e0ad9);font-family:Iosevka,Chirufont,monospace;display:none}.boot-blocked-title{letter-spacing:.02em;margin-bottom:6px;font-size:16px}.boot-blocked-message{margin-bottom:4px;font-size:14px}.boot-blocked-hint{color:var(--boot-error-muted,#140e0aa6);font-size:13px}.boot-shell.is-blocked .boot-blocked{display:block}.boot-shell.is-blocked .boot-bar{display:none}.sr-only{clip:rect(0, 0, 0, 0);white-space:nowrap;border:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.boot-noscript{background:var(--boot-bg,#fff);color:var(--boot-error,#140e0ad9);z-index:9999;text-align:left;justify-content:center;align-items:center;padding:24px;font-family:Iosevka,Chirufont,monospace;display:flex;position:fixed;inset:0}.boot-noscript-title{color:var(--boot-error,#140e0ae6);margin-bottom:8px;font-size:clamp(22px,3.4vw,28px)}.boot-noscript-message{color:var(--boot-error-muted,#140e0ab3);font-size:15px}.app{justify-content:center;align-items:center;min-height:100vh;display:flex;position:relative}.app.wgpu{overscroll-behavior:none;width:100vw;height:100vh;display:block;position:relative;overflow:hidden}.app.wgpu .puzzle-canvas{touch-action:none;width:100%;max-width:none;height:100%;display:block}.app.svg{overscroll-behavior:none;width:100vw;height:100vh;display:block;position:relative;overflow:hidden}.app.svg .puzzle-image{width:100%;max-width:none;height:100%;max-height:none}.puzzle-image{touch-action:none;isolation:isolate;-webkit-user-select:none;user-select:none;-webkit-touch-callout:none;max-width:100%;height:auto;display:block}.puzzle-image.panning{cursor:move}.ui-text{text-anchor:middle;dominant-baseline:middle;letter-spacing:.02em;pointer-events:none;font-family:Chirufont,sans-serif;font-weight:400}.ui-link{pointer-events:auto;cursor:pointer;text-decoration:none}.ui-link .ui-credit{text-decoration:none}.ui-link .ui-text{pointer-events:auto}.ui-link:hover .ui-credit{text-decoration:underline}.ui-art-credit{letter-spacing:.03em}.ui-progress{letter-spacing:.04em}.ui-title{letter-spacing:.05em}.ui-success{letter-spacing:.06em}.ui-menu-title{letter-spacing:.05em}.ui-menu-sub{letter-spacing:.06em}.puzzle-canvas{touch-action:manipulation;-webkit-user-select:none;user-select:none;-webkit-touch-callout:none;cursor:default;max-width:100%;height:auto;display:block}.puzzle-canvas.pan-ready{cursor:default}.puzzle-canvas.panning{cursor:move}.puzzle-canvas.hover{cursor:grab}.puzzle-canvas.owned-other{cursor:not-allowed}.puzzle-canvas.dragging{cursor:grabbing}.puzzle-canvas.ui-link-hover,.puzzle-image.ui-link-hover{cursor:pointer}.puzzle-canvas.preview-grab{cursor:grab}.puzzle-canvas.preview-resize-ew{cursor:ew-resize}.puzzle-canvas.preview-resize-ns{cursor:ns-resize}.puzzle-canvas.preview-resize-nwse{cursor:nwse-resize}.puzzle-canvas.preview-resize-nesw{cursor:nesw-resize}.puzzle-canvas.preview-dragging{cursor:grabbing}.workspace-bounds{fill:var(--workspace-fill);stroke:var(--workspace-stroke);stroke-width:2px;vector-effect:non-scaling-stroke;pointer-events:all}.puzzle-bounds{fill:none;stroke:var(--puzzle-bounds-stroke);stroke-width:1.5px;stroke-dasharray:6 4;pointer-events:none}.piece{cursor:grab;transition:transform .14s cubic-bezier(.22,.61,.36,1)}.puzzle-image.no-anim .piece{transition:none}.sync-status{background:var(--sync-status-bg);width:20px;height:20px;color:var(--sync-status-color);box-shadow:var(--sync-status-shadow);opacity:0;pointer-events:none;border-radius:50%;justify-content:center;align-items:center;font-size:12px;font-weight:700;transition:opacity .12s ease-out;display:flex;position:absolute;top:18px;right:18px}.app.sync-disconnected .sync-status{opacity:1}.app.sync-disconnected .puzzle-canvas.hover,.app.sync-disconnected .piece.hovered,.app.sync-disconnected .piece.hovered .piece-hitbox{cursor:wait}.app.sync-disconnected .puzzle-canvas.ui-link-hover{cursor:pointer}.piece.dragging{cursor:grabbing;transition:none}.piece.animating{transition:none}.piece.owned-other,.piece.owned-other .piece-hitbox{cursor:not-allowed}.piece-hitbox{fill:#0000;pointer-events:all}.puzzle-image.debug .piece-hitbox{stroke:var(--debug-hitbox-stroke);stroke-width:1.2px;vector-effect:non-scaling-stroke}.piece-debug-center{fill:var(--debug-center-fill);stroke:var(--debug-center-stroke);stroke-width:.8px;vector-effect:non-scaling-stroke;pointer-events:none}.piece-debug-label{fill:var(--debug-label-fill);paint-order:stroke;stroke:var(--debug-label-stroke);stroke-width:2px;text-anchor:middle;dominant-baseline:middle;pointer-events:none;font-size:18px}.debug-rect-overlay{pointer-events:none;z-index:2;position:absolute;inset:0}.debug-rect{border:1px dashed var(--debug-auto-pan-outer);box-sizing:border-box;position:absolute}.debug-rect-inner{border-color:var(--debug-auto-pan-inner)}.piece-outline-group{pointer-events:none}.piece-outline{fill:none;vector-effect:non-scaling-stroke;pointer-events:none;stroke-linecap:round;stroke-linejoin:round}.piece-image{pointer-events:none;mask-type:luminance;transition:opacity .12s}.piece-back{pointer-events:none;display:none}.piece-outline-group.edge-external,.piece-outline-group.edge-internal{opacity:0}.piece.hovered .piece-image,.piece.hovered .piece-outline-group.edge-external,.piece.hovered .piece-outline-group.edge-internal,.piece.owned-other .piece-outline-group.edge-external,.piece.owned-other .piece-outline-group.edge-internal{opacity:1}.piece-outline.edge-external,.piece-outline.edge-internal{stroke:var(--piece-outline-edge);stroke-width:3px}.piece.owned-other .piece-outline.edge-external,.piece.owned-other .piece-outline.edge-internal{stroke:var(--piece-outline-owned)}.puzzle-image.solved .piece-outline.edge-external,.puzzle-image.solved .piece-outline.edge-internal{stroke:var(--piece-outline-solved)}.piece-outline-simple{stroke:var(--outline-simple-stroke);stroke-width:1px}.puzzle-image.fast-render{shape-rendering:optimizespeed}.puzzle-image.fast-render .piece-outline{shape-rendering:crispedges}.piece.flipped .piece-image{display:none}.piece.flipped .piece-back{display:block}.controls{z-index:10;background:var(--panel-bg);border:1px solid var(--panel-border);width:260px;max-width:calc(100vw - 32px);max-height:calc(100vh - 212px);box-shadow:var(--panel-shadow);border-radius:12px;padding:12px 14px 10px;font-family:Iosevka,monospace;position:fixed;top:16px;left:16px;overflow-y:auto}.control-group{border:1px solid var(--panel-group-border);background:var(--panel-group-bg);border-radius:10px;margin:10px 0;overflow:hidden}.control-group>summary{cursor:pointer;letter-spacing:.05em;text-transform:uppercase;color:var(--panel-group-text);justify-content:space-between;align-items:center;padding:6px 8px;font-size:12px;font-weight:600;list-style:none;display:flex}.control-group>summary::-webkit-details-marker{display:none}.control-group>summary:after{content:"▸";transition:transform .12s}.control-group[open]>summary:after{transform:rotate(90deg)}.control-group-body{padding:6px 8px 2px}.controls-hint{z-index:10;text-transform:uppercase;letter-spacing:.08em;background:var(--controls-hint-bg);color:var(--controls-hint-color);border-radius:999px;padding:6px 10px;font-size:11px;text-decoration:none;position:fixed;bottom:16px;right:16px}.controls-hint:hover{background:var(--controls-hint-bg-hover)}.preview-box{z-index:9;box-sizing:border-box;background:var(--preview-bg);border:1px solid var(--preview-border);box-shadow:var(--preview-shadow);pointer-events:auto;touch-action:none;user-select:none;transform-origin:50%;border-radius:12px;padding:8px;transition:box-shadow .16s;position:absolute;top:0;left:0}.preview-box.preview-hidden img{filter:blur(6px)saturate(.8);opacity:.6}.preview-box.preview-grab{cursor:grab}.preview-box.preview-resize-ew{cursor:ew-resize}.preview-box.preview-resize-ns{cursor:ns-resize}.preview-box.preview-resize-nwse{cursor:nwse-resize}.preview-box.preview-resize-nesw{cursor:nesw-resize}.preview-box.preview-dragging{cursor:grabbing}.preview-toggle{border:1px solid var(--preview-toggle-border);background:var(--preview-toggle-bg);cursor:pointer;width:44px;height:44px;box-shadow:var(--preview-toggle-shadow);z-index:2;border-radius:999px;justify-content:center;align-items:center;padding:0;transition:opacity .12s,transform .12s,box-shadow .12s;display:flex;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)scale(1)}.preview-toggle:hover{transform:translate(-50%,-50%)scale(1.05);box-shadow:0 10px 18px #00000038}.preview-box.preview-hidden .preview-toggle{opacity:.95}.preview-box.preview-revealed .preview-toggle{opacity:0;pointer-events:none}.preview-box.preview-revealed img{cursor:inherit}.preview-toggle-icon{width:24px;height:24px;stroke:var(--preview-icon-stroke);stroke-width:1.6px;stroke-linecap:round;stroke-linejoin:round}.preview-toggle-eye{fill:none}.preview-toggle-pupil{fill:var(--preview-icon-fill);stroke:none}.preview-toggle-slash{stroke:var(--preview-icon-slash);stroke-width:1.6px}.preview-arrow{border:1px solid var(--preview-arrow-border);background:var(--preview-arrow-bg);cursor:pointer;width:22px;height:22px;box-shadow:var(--preview-arrow-shadow);opacity:0;--arrow-tx:-50%;--arrow-ty:-50%;transform:translate(var(--arrow-tx), var(--arrow-ty)) scale(.9);pointer-events:none;border-radius:999px;justify-content:center;align-items:center;padding:0;transition:transform .12s,opacity .12s,box-shadow .12s;display:flex;position:absolute}.preview-box:hover .preview-arrow{opacity:.85;transform:translate(var(--arrow-tx), var(--arrow-ty)) scale(1);pointer-events:auto}.preview-arrow:hover{opacity:1;box-shadow:var(--preview-arrow-shadow-hover);transform:translate(var(--arrow-tx), var(--arrow-ty)) scale(1.08)}.preview-arrow:focus-visible{outline:2px solid var(--focus-outline);outline-offset:2px}.preview-arrow-icon{width:12px;height:12px;stroke:var(--preview-arrow-icon);stroke-width:2.2px;stroke-linecap:round;stroke-linejoin:round;fill:none}.preview-arrow-right{--arrow-tx:50%;--arrow-ty:-50%;top:50%;right:-8px}.preview-arrow-left{--arrow-tx:-50%;--arrow-ty:-50%;top:50%;left:-8px}.preview-arrow-up{--arrow-tx:-50%;--arrow-ty:-50%;top:-8px;left:50%}.preview-arrow-down{--arrow-tx:-50%;--arrow-ty:50%;bottom:-8px;left:50%}.preview-arrow-left .preview-arrow-icon{transform:rotate(180deg)}.preview-arrow-up .preview-arrow-icon{transform:rotate(-90deg)}.preview-arrow-down .preview-arrow-icon{transform:rotate(90deg)}.preview-box img{object-fit:contain;border-radius:8px;width:100%;height:100%;display:block}.controls h2{letter-spacing:.08em;text-transform:uppercase;margin:0 0 8px;font-size:12px}.status{text-transform:uppercase;letter-spacing:.08em;background:var(--status-bg);color:var(--status-color);border-radius:6px;margin:0 0 10px;padding:4px 6px;font-size:12px}.status-solved{background:var(--status-solved-bg);color:var(--status-solved-color);border:1px solid var(--status-solved-border);font-weight:600}.solved-banner{z-index:10;background:var(--solved-banner-bg);color:var(--solved-banner-color);letter-spacing:.08em;text-transform:uppercase;box-shadow:var(--solved-banner-shadow);border-radius:12px;padding:10px 14px;font-size:13px;position:fixed;top:16px;right:16px}.control{gap:6px;margin-bottom:10px;display:grid}.control label{justify-content:space-between;font-size:12px;display:flex}.control-value{color:var(--control-value-color);font-variant-numeric:tabular-nums}.control input[type=range]{width:100%}.control select{border:1px solid var(--control-select-border);background:var(--control-select-bg);width:100%;color:var(--control-select-color);border-radius:6px;padding:4px 6px;font-family:inherit;font-size:12px}.control-separator{border:none;border-top:1px solid var(--control-separator);margin:8px 0 12px}.control-button{text-transform:uppercase;letter-spacing:.08em;border:1px solid var(--control-button-border);background:var(--control-button-bg);width:100%;color:var(--control-button-color);cursor:pointer;border-radius:8px;padding:6px 10px;font-family:inherit;font-size:12px;transition:transform .12s,box-shadow .12s}.control-button:hover:enabled{box-shadow:var(--control-button-shadow);transform:translateY(-1px)}.control-button:disabled{cursor:not-allowed;opacity:.6}body[data-theme=light]{color-scheme:light}body[data-theme=dark]{color-scheme:dark;--color-bg:#141312;--color-fg:#ffffffe0;--workspace-fill:#201e1ceb;--workspace-stroke:#ffffff14;--puzzle-bounds-stroke:#ffffff47;--debug-hitbox-stroke:#78beff80;--debug-center-fill:#ff7555e6;--debug-center-stroke:#000000b3;--debug-label-fill:#ffffffd9;--debug-label-stroke:#000c;--debug-auto-pan-outer:#ffc840b3;--debug-auto-pan-inner:#ff8840b3;--outline-simple-stroke:#fff3;--panel-bg:#181818eb;--panel-border:#ffffff1f;--panel-shadow:0 16px 32px #0000008c;--panel-group-bg:#202020e6;--panel-group-border:#ffffff1f;--panel-group-text:#ffffffd9;--controls-hint-bg:#ffffff29;--controls-hint-bg-hover:#ffffff3d;--controls-hint-color:#ffffffe0;--preview-bg:#1c1c1ceb;--preview-border:#ffffff1f;--preview-shadow:0 12px 24px #0000008c;--preview-shadow-hover:0 16px 32px #000000a6;--preview-toggle-bg:#202020eb;--preview-toggle-border:#ffffff38;--preview-toggle-shadow:0 8px 16px #0000008c;--preview-icon-stroke:#ffffffdb;--preview-icon-fill:#ffffffdb;--preview-icon-slash:#ffffffdb;--preview-arrow-bg:#222222e6;--preview-arrow-border:#ffffff38;--preview-arrow-shadow:0 6px 12px #00000080;--preview-arrow-shadow-hover:0 8px 16px #000000a6;--preview-arrow-icon:#ffffffd9;--focus-outline:#78b4ffb3;--status-bg:#ffffff14;--status-color:#ffffffad;--status-solved-bg:#2e995347;--status-solved-color:#d6ffe8e6;--status-solved-border:#2e995373;--solved-banner-shadow:0 14px 28px #00000073;--control-value-color:#ffffffa6;--control-select-bg:#1e1e1ef2;--control-select-border:#fff3;--control-select-color:#ffffffe6;--control-separator:#ffffff2e;--control-button-bg:#202020f2;--control-button-border:#ffffff2e;--control-button-color:#ffffffe6;--control-button-shadow:0 6px 12px #00000073;--boot-bar-track:#fff3;--boot-bar-fill:#ffffffbf;--boot-error-muted:#fff9}@media (prefers-color-scheme:dark){body:not([data-theme]),body[data-theme=system]{color-scheme:dark;--color-bg:#141312;--color-fg:#ffffffe0;--boot-bar-track:#fff3;--boot-bar-fill:#ffffffbf;--boot-error-muted:#fff9;--workspace-fill:#201e1ceb;--workspace-stroke:#ffffff14;--puzzle-bounds-stroke:#ffffff47;--debug-hitbox-stroke:#78beff80;--debug-center-fill:#ff7555e6;--debug-center-stroke:#000000b3;--debug-label-fill:#ffffffd9;--debug-label-stroke:#000c;--debug-auto-pan-outer:#ffc840b3;--debug-auto-pan-inner:#ff8840b3;--outline-simple-stroke:#fff3;--panel-bg:#181818eb;--panel-border:#ffffff1f;--panel-shadow:0 16px 32px #0000008c;--panel-group-bg:#202020e6;--panel-group-border:#ffffff1f;--panel-group-text:#ffffffd9;--controls-hint-bg:#ffffff29;--controls-hint-bg-hover:#ffffff3d;--controls-hint-color:#ffffffe0;--preview-bg:#1c1c1ceb;--preview-border:#ffffff1f;--preview-shadow:0 12px 24px #0000008c;--preview-shadow-hover:0 16px 32px #000000a6;--preview-toggle-bg:#202020eb;--preview-toggle-border:#ffffff38;--preview-toggle-shadow:0 8px 16px #0000008c;--preview-icon-stroke:#ffffffdb;--preview-icon-fill:#ffffffdb;--preview-icon-slash:#ffffffdb;--preview-arrow-bg:#222222e6;--preview-arrow-border:#ffffff38;--preview-arrow-shadow:0 6px 12px #00000080;--preview-arrow-shadow-hover:0 8px 16px #000000a6;--preview-arrow-icon:#ffffffd9;--focus-outline:#78b4ffb3;--status-bg:#ffffff14;--status-color:#ffffffad;--status-solved-bg:#2e995347;--status-solved-color:#d6ffe8e6;--status-solved-border:#2e995373;--solved-banner-shadow:0 14px 28px #00000073;--control-value-color:#ffffffa6;--control-select-bg:#1e1e1ef2;--control-select-border:#fff3;--control-select-color:#ffffffe6;--control-separator:#ffffff2e;--control-button-bg:#202020f2;--control-button-border:#ffffff2e;--control-button-color:#ffffffe6;--control-button-shadow:0 6px 12px #00000073}}