@font-face{font-family:Klad;src:url(data:font/woff;base64,d09GRgABAAAAABK8AAoAAAAA7pgAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABPUy8yAAAA9AAAADgAAABgTkNZQGNtYXAAAAEsAAAA0gAAAXRfjF/9Z2x5ZgAAAgAAAA1vAADltLEZLKRoZWFkAAAPcAAAADAAAAA2MIOkbmhoZWEAAA+gAAAAHAAAACQH+gOuaG10eAAAD7wAAAB7AAAChFvAVgRsb2NhAAAQOAAAAeYAAAKIAEKdZG1heHAAABIgAAAAGAAAACAAwgCCbmFtZQAAEjgAAABxAAAAugr8IfFwb3N0AAASrAAAABAAAAAgAAMAAXjaY2BhPsA4gYGVgQjAxIjM8/ZxdGFwYFBg8Wex+O/DwMBiwbAFKAw2iUkGyGNgUGBgAAD6DAYmeNq10D1LgnEUxuEj/dwaMs2aTHg0ezPfzS1Fs/cagsYgamiJSi3cIgg/h1+t73HD0+G/O3bgcG7u4RqOmSVsydds2Ug8+72zriUta182J8UqadbIss4mEQWKbFFimx122WOfMgdUqFGnQYs2hxzRZ8AxQ0445YxzLrjkimtu4tj9vLsrwc0Ed4P8Qrca3GZwO3QXu/Fv/KCRZvrQu77143msRz3pXlNNvP3Uq170pltv6xqqpZp6GnhuKFJBOXXU9LatisqqKq0ofOUf5g97GE8QAAB42u1dP4scyRV/OyvsQzdeL+NFFrrFHnBgWA94wYENHs6BgxN4wYEDC3nBgQMP3IIDgz1wBicb6ANsoA8wHPsBOrjwOPQBNthYTDAfYDgcnrTurp7uqaquP6/+V49GIFrV3eruqfen3p/fewWPoQAY3D36DRzC9+Fj+CH8CH4Mn8BP4Wfwc4AD5J/BCwCYAzy82hwv1OP3r8tjsTlfHY/Z8eFbeFmOvnz4End8/636OnwE68Hd4VDwO/W/cVJ/U/Xd1fH9mB2/W23/TX7bJTtufks5Yr8JOYanMC2f8vzwWkijX8Av4Vfwa/gt/A5+D5/BH+CP8Cf4M/wF/oqnn/WfWfmV5deROZpufjs1fne7mQfqHDl/JTl/G/d5h2eGtDA8H/p5MIL1w8Xhc4n88rzhjR8GN5w835fPntVyTY7jDQ3m2+v8+GBR04McX2+vETrdc+Mx9/x79v1YfaGbV9f72/tOCXddI+lCy+zf4O/wOfwjguxqdDiRnfVWjxE9R483stXIHU2v6r7vvkJcX3Pnqft111u9O6/vIzxHjZvrOh4xldVU13U8CCfVr0brgornvPPY4K6rF1raKcbC+9fUWjplaSpba8l4TT2fG9vygC3PGPPYo4PZ4G7wgqJhl0YLge1koAthWM3I4EbBJ8Z8MTjl7L1jM3uwM35lp99tjzCsLAKpHWw3Jy/Uv8l4To4jz8lJ+ZaXpd15lk6fEF5XyDtt99FrRGuj8+dfU+vIfLuetPYKd548X/H+Ut8Ftfec7cPHRNbvJL4DWMu3wJ87WG7stOXWnpPd39jd3ni11JsPF6XEFfZ6s3yS+h0DWJfa+aaci+od7fOrGaZt2YNvOt9W6ZbT0m6Vf9tM7Q8fHGl1+lyz9oPrWt7R6Y7j4PrrKXmLjQ0e3vZesjxDbOl57du0tjU95vRQo6ea+zrnryhbmPrb3s+fv9K8/5b9Xl+2dCw92PnOo1p7a3jDmg+IvqTkt/VvJXawqS1A9K0HeljL1lEdkwo1f0Q+KH9fJx+d+RnXMR4SZ5hsfUN6PisaVf5EdYw+f8fo+AD4sKHotbmV9QUn+wtJbJazW7W6YsXSLtTcomX9mKwDwxhzzcfF+HVcpwfaGIbMvy2vV35FNefVkbezfMXBrONeofXCgls3V125pnk9FO8ayzueV6fIGA54sUFoHauZS6yN4mpDxOLdEDZzbelv15Xe2cwjI5sZktnDKzv7ObR9G4xXj9F0gVS+iXJuaZ3M2Wo8LV19C1dbDR7V8dHS/5X760tuXb9kx4N/cfnpT7l3fA+KhwvmHRU9QUUT1ft4PaF7vyg/XlkU3Peg8uMk/qHIzT28UY/5b7WiVzG4U9Jr1s1P0uPOfH3Lz0+p2V8ObgSxUL28zczmg8+lNjFG+9g2yQsNva5zC7HtQPLq8+5Yt64RnkHgP2xlvEPPJ9q1XxQbChcXWlB5c8U8MvEbRc6Tz5W29xnmUFu/+Q2lwwU62lv+y3Och8plmObjIZeYn+o67Qti7lddj7XuWvPGyIiG/ug3Y216DN0Yv2nll85729RchnRx1dh+gXV84MR43QqSk2WwW+PtesHEsNaSNUyypmnXPMXzY/gPHuMOOj0GvnSULN4tum4TH/eHv+jHnCSIxTxPEosxsO1l89bcQ9uYZKyT90D5A2/y+8QK2xnOd5i561ehfeOor2XXXfHw0TF5IeLES03MJFA+2JtuimjzHQ7N5sKZf1eZ5Sl6qm+w9po3+1Hj1/ZM33iP1zlhT0X24c3GN72JoG+eOdVTxKulwMhGsf1LrhdU/O6WxQO0ONQVd37uSddFWqtD1U8Zv/8ZOr+eBR8pdWLB4kLocVurM6euU+MOP/H4E+48ttam+QYGx1L456PUfJZFHMbSTwt2vW9xmJgYPIsYsk2M2TRWES2nnlu+LZDsMLWKvN6U4bZ5/bmOL0ve8dU55NsiyZwKq6law7PPtx2hZBZ8yyCN2VTihkziiIsEWM4AcaNNzRm8O6+PDc/58uuC+3FPrOzvcOvAJLHNZGlTpbahDGJXWOx9VHrrYk2hrjN+05zre9GM1xt81LqH9O6Lf52J3PP9MRi/vJDbkTzf5MYnznXLOdiPC7+yLByr/j/Sfgztw1nzwDHa54PQ8TJTWtnWZcTypyX4iaC1LJ0cpUUtS2RMSeE9j7Lk6kpfu9vfIerNYvZ+aWQMi283He8Cn7j6ZYQ/qOcFn5OPDiaDUyGfaOdC2AtIt+5Nu/0SbdclGFS1NQQ1wPbpKFgcraiHiLb3Et+nw5BXG15T9HJ057VXglp4Qc2saq1kfM6z4DWvRaz6bFJHpemxxPSxGbv7g/TzkmNJHiv5D0xs406/R8P+Xsy6dxYEn5Sm5p/X3ZfiOmqXGEJmddT+dZqEv0wxRQy/IXSat3zXsF6DfM4J6SdH14Dea9ZZQ0yhbxkUyWTVqxbRx9hPzxODNc9U5oT9ZhD6LFq+dYReU71jx7X+Di+n021czHe8NZVu1PTju3Hut36q7jOD6iUpiDNj+6kj+sBgZN2+v9adoz+F6LMTwj5Br6kj7ZoaRn4XmjjZpf66KD6ifZ6sd/5ZZjnxuk9s2N65rtjcV5FjBae1rW2xP0GyXufVvLT7BFD94nQ4SC0+MpP7Q+9rkPp8Sv3I+CWXSAxQoOuh7EyHnA+WLuCdFuPwufsYNr5J3X0qf8pLXEzlryN902j+1LHWn/eay4zpu3ZyUKnnuo5RPneOUS4dY5She5Y/VtpN/mKxXKy10xNz5Sfen3S/iQvNfkSIWFhUmzmV/TJLa68QHhPommzwa6N6P7zodJmEn3cj3GGWdNlNeWHsoEt1f+hYdEHn2jcYryh20TIx3u4sMZ5uhLb3w8hAJL9KiF9IsGaY2avue+yQmJTKTkfg6wLbcdHxdNpesqntuAS2bfY1Pjng6d6o+Sg+nq7uUOy8//B82/u5U8s/p3pDU2Pn/Ydt8XQ571s8wfUoa+PqhaBug9uHjqYT6Rs54fapM3ye6vt6v2/xHgeZFgc5E++//MHgIE/Q8dyg9ek5xWI6WObMYgB7PFnCmPwe4ynsxZxch0wk2GLDfR/R99/62ec1NF7AMNfkPwdzmVmuaR+nixenOzGKVe+sbUHoMRWPc7EtFLHWOqb3NgH+UiQLqeh0zcnGRQ502eNis8PFjtDri1e6VLFSZl4vkWuHZF6d6w1yw+Ptsbl7bG58bO68r7l6IcbREZubjY7eY3N3H6+yoNbDPT5dIgMofJefGLtJrQAXj9XuFa+xdXzFv1z6P+3x6VEx07vf16Gun3XG2pA9i+k45n1m8bo91itPrNcTImfXhv5U8L14OvuCrBTnFVgSaZxi05+pMx6b9T3n6Rlsv19PvlXjy0Tvo7CQ0EERt0iRr0+2B99Qa8cF2SNJaM9h5zA0fqTurf11Nrqp6bG74PrrN+Nz/fWm31qLsaLH5+x8t7rnSnL+vKYDfR89jp2TcMZQHaF8GfCmg3T+yz3Xnwjj79AYzEj+CtWr2iU2Gr1XdV/jnTIcXV/jmx0++gEi1gMxomjNitWJFNxvsoqe0UXGiC2o8hGGmJks8hG7JH86nF/f5VHQi2oddJ2ceMZhImMNcbF/fm1tEn/R1HNkbWv/BKpyiK8t97mo9Ng/4d8JdJmAZ8neS1fc+JzVIe2+FZLz3/3P/P42z9vY5hO357X1EQuufsJi35zQ5z+I/TOWHGbaw/5rdL0R5n7MvtDZ7r+Wwf6UjD4W7H3ni5bJ60GewrS0S232lw6vw5H7rae8Tu9JJ6s37cseVgLeKH+T1VofnjeWYvy/i1w6XT+vUIDlevzV5vif+jzpXT2vz9Pj3PcIRtQx6nQ0hNDFuuuq+4PXOp8Y7wHnXU6Ix0fbCuesz9WJIXPnW3sSeT/RfdT7dPUfOr5PXheTiK+z7muw35Ou/3vSnRrTMH38EWn/ERoUXG63cNibHIspuN2+q71v3e1xIPt+3/Zhat+985xPnPZE/Twyxy3EGqPRBDwV+85lvecu2OT9r7PZY9lEXxlgL3VYFq3/qokD5RL30VI8M3qT/a9sbAjbGixdPCJR3C8YvZ852SyQlZ1SbP8yWMS1YEWYcvbMVNyjIFRcK7Vdsut6w0dcU+RP5s4P0daJE/T+22FzQFQeF71Wh7q+wu2dmE3f4wxlNqbM+ZLZ3qz1GcROSd2az5yCDJte4LDpsWi6S3lbl/yOKM9rG8eOsC/LPNpcW+IZdPFr6f+/9bNWecM8DbX2hDkObM7mjl37ZkXPCRyjbSzwZS/7iv1j+omHyONbz3VP/OC27qSQ9NorFL321hwdJTkaISoc28OPr5vhc57ceZ7uoWr2YuVCYWTERxDcdjZci0NjrpLV9MXUpZhaP99z7wGD4W2uT53xy8nqMHKqJ/Raf/g27/pDZ0xyTL9oYebDNn0PW9uI3yPvChFXClAv/aHXJ+hkHW1jxbp/Lt/HoYMXo/ye3OoTgtdMRl7rRb3bZbLc6cXO1WfFijF70wVja/wyrQu+gP8m1AcfkF6g8dOuWPqdq+UcGeW0wLdPHww3z+UysXGtbPoiRdTnTY2iql52l2uV/g8UCAiXAHjaY2BkYGAA4uU2rK7x/DZfGbhZ3gBFGJ5d0m9A0P99mA+wWAC5HAxMINUAMX4K7XjaY2BkYGCx+O/DwMB8gIEBTDIyoIKFAFBJA7F42o1R2xGAMAir5zqOwECOkMEYwJEYwZ72gVzo+ZELFAiP7lcp+wutsAr58nY2PiojeeuQhmhj1o4+vd6S/KiFYLP4nzydczz9te2jDiC2TXvsneUb0fM5MS5JfxB9DTfV9ayDhWj2OYq7kxB/BRCf/WFx2nCMG9lcyLAAeNpVkktIlVEURldUWKQlYaKhdAsJQ6W0EiEJMQmRHpYm9rCHiL2MpKeKhVSihYGhlNFbSkSLikwskoyKFEsqJKUiQxQaOGjgoEGD1rQLG+45Z+9vr2/vH/77/YIpd2FqD0zPh6D3MLPemIRZMyA4CkJ+wuxemBNvFBn+D/0Oc/9AWArMK4PwMYjIhkhr5/+FqFCIboUFYYbvAbUCb2BhrGHuImtj7L34PsRmwJJHEHcM4msh4TosXQGJMZCk/nL5VjZCsnopv2GVd6n2WL0P0mROl3HNDsgohbW7IVOOrCZY5916WTfIutG6TdNgc4QxCDnBhvm552CLb3nDkC/HVvW2lcB2zwW+7/S8S609y6DQ96IuKFZ/7wvYr5cDch2shBLnckifh/VdKueRNDiqt+PWnHBuJz2X5UK5zBX6qpCt0vxTdXDaWVSpd0a9s6lQ7VqqnU2N+eflveBs6jLhonuo9+7SBDTI1Sj3ZXWu6LHJnKtyXpPzRgBuynnLXd5Rt9lZ3ZOjRT+tzr7N/u3O8IEeHzrrx+7miXdPZexUv8uez2R+rn63vl66t1cd8No9vLX3O+fZdxv63fUH8wf8dj6a/8n6z3oe9Nv5oq8hfX11lt/s80OvI/YelXNML+Md/wAaIpOxAAB42mNgZGBgWMjQwKDAAAJMDGgAACC8AUV42lWMwQpEUBhGj2FkNpay9AImNsrGCygLyV6ZJiVTGM/vy9xkupvznfN3AZcKG8t5YOGB4Ru+1o9tIgLDjmxm+C5bGHYJaSgZ6eipefHme6z5tJHoo72prlopuV5y9lZ+ZmHQ1XT056XG/7/uMXwVBgAAAHjaY2BmQAaMDGgAAACOAAU=) format("woff");font-display:block}
:root{--yellow:#ffff55;--cyan:#55ffff;--green:#55ff55;--magenta:#ff55ff;--red:#ff5555;--grey:#9a9a9a}
*{box-sizing:border-box}
html,body{margin:0;background:#000;color:#fff;min-height:100%}
body{font:16px/1.5 ui-monospace,"SF Mono",Menlo,Consolas,monospace;overscroll-behavior:none}
[hidden]{display:none!important}
.klad{font-family:Klad,ui-monospace,Menlo,monospace}
/* ---- start page ---- */
/* viewport-fit=cover also places standalone iOS pages beneath the system status bar. */
#start{max-width:900px;margin:0 auto;padding:24px 16px 48px;
  padding:calc(24px + env(safe-area-inset-top,0px)) max(16px,env(safe-area-inset-right,0px)) calc(48px + env(safe-area-inset-bottom,0px)) max(16px,env(safe-area-inset-left,0px))}
#start h1{font-size:22px;line-height:1.4;margin:36px 0 12px;color:var(--cyan)}
#start .lead{margin-bottom:20px}
#start h3{font-size:18px;color:var(--green);margin:24px 0 8px}
/* the line that says the pictures below are the buttons */
#start .pick{font-size:20px;color:var(--green);text-align:center;margin:16px 0 14px}
/* the two borders of the title screen, 512x27 px, scaled by whole pixels as the picture allows */
#start .band{display:block;width:100%;height:auto;image-rendering:pixelated}
#start footer{margin-top:44px}
#start h2{font-size:22px;color:var(--cyan);margin:36px 0 12px}
#start p{margin:0 0 12px}
#start .port-features{margin:0 0 12px;padding-left:24px}
#start .port-features li+li{margin-top:6px}
#start .contact a{color:var(--cyan);text-underline-offset:3px}
#start .contact a:hover{color:var(--yellow)}
.parts{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(280px,100%),1fr));gap:16px}
.part{display:block;position:relative;border:2px solid #333;border-radius:6px;overflow:hidden;color:inherit;text-decoration:none;background:#000}
.part:hover,.part:focus-visible{border-color:var(--cyan);outline:none}
/* the maze is 512x220 Korvet pixels, and they are 1.5 times taller than wide */
.part canvas{width:100%;height:auto;display:block;image-rendering:pixelated;aspect-ratio:512/330}
.part .num{position:absolute;right:10px;top:8px;font-size:26px;color:var(--magenta);background:#000c;padding:2px 10px 4px;border-radius:4px;letter-spacing:1px}
.part .cap{display:block;text-align:center;font-size:20px;color:var(--green);padding:10px 8px 8px}
#start .about{font-size:17px;line-height:1.8;border-left:4px solid var(--magenta);padding:2px 0 2px 16px;margin:28px 0 0}
table{border-collapse:collapse;margin:0 0 12px}
td,th{padding:3px 14px 3px 0;text-align:left;vertical-align:top}
th{color:var(--grey);font-weight:normal}
@media (max-width:400px){#key-bindings table{font-size:14px}#key-bindings td,#key-bindings th{padding-right:8px}}
/* Fit the complete game picker into a short landscape viewport, including browser chrome.
   Shrink both axes together so the original maze proportions remain intact. */
@media (orientation:landscape) and (max-height:600px){
  #start{padding-top:calc(8px + env(safe-area-inset-top,0px));padding-left:max(16px,env(safe-area-inset-left));padding-right:max(16px,env(safe-area-inset-right))}
  #start .launch{--launch-width:calc(min(900px,100vw) - max(16px,env(safe-area-inset-left,0px)) - max(16px,env(safe-area-inset-right,0px)));display:grid;grid-template-columns:minmax(0,1fr)}
  #start .launch>.band{grid-area:1/1;margin-bottom:4px}
  /* Standalone iOS can report a zero top inset in landscape. Put the link below the logo,
     alongside the picker, rather than relying on that inset to make the top edge tappable. */
  #start .language-nav{grid-area:2/1;justify-self:end;align-self:center;z-index:1;margin:0;font-size:12px}
  #start .language-nav a{display:flex;align-items:center;justify-content:center;min-width:44px;min-height:44px;padding:4px 8px}
  #start .pick{grid-area:2/1;font-size:16px;line-height:1.5;margin:8px 0 10px}
  /* Keep the header full width. Only the cards need to shrink to fit the remaining height:
     logo = width*27/512, two maze previews = cards width*165/512, other rows need <92px. */
  #start .parts{grid-area:3/1;width:100%;justify-self:center;max-width:calc((100svh - env(safe-area-inset-top,0px) - env(safe-area-inset-bottom,0px) - 92px - var(--launch-width)*27/512)*512/165)}
  .parts{grid-template-columns:repeat(2,minmax(0,1fr));gap:12px}
  .part .num{font-size:20px;right:6px;top:6px;padding:2px 6px}
  .part .cap{font-size:16px;line-height:1.5;padding:6px}
}
/* ---- game page ---- */
#game{position:fixed;inset:0;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:8px;background:#000;-webkit-user-select:none;user-select:none;touch-action:manipulation}
.tube{width:min(100vw,calc((100dvh - 48px)*4/3));aspect-ratio:4/3;background:#000}
#screen{width:100%;height:100%;display:block;image-rendering:pixelated;image-rendering:crisp-edges}
.hint{color:var(--grey);font-size:13px;margin:0;text-align:center;min-height:1.5em}
#record-name{font:inherit;padding:8px;background:#111;color:#fff;border:1px solid #444;max-width:90vw}
/* the pause: a dark sheet over the whole page, the game frame stays visible behind it */
.pause{position:fixed;inset:0;z-index:3;display:flex;align-items:center;justify-content:center;background:#000a}
.pause-box{display:flex;flex-direction:column;align-items:center;gap:12px;padding:20px 24px;border:2px solid #444;border-radius:8px;background:#000;max-width:min(90vw,420px);text-align:center}
.pause-box #pause-title{font-size:28px;color:var(--yellow);margin:0}
.pause-box .hint{margin:0}
.pause-box .hint:empty{display:none}
.pause-box button{font:inherit;font-size:18px;color:#fff;background:#222;border:1px solid #555;border-radius:12px;padding:12px 24px;min-width:240px;min-height:48px;cursor:pointer}
.pause-box button:hover,.pause-box button:focus-visible{border-color:var(--cyan);outline:none}
#btn-quit{color:var(--red)}
.touch{display:none}
@media (pointer:coarse){
  /* sizes follow the viewport: a d-pad cell and a fire button, neither fixed in pixels */
  #game{--cell:clamp(52px,15vmin,72px);--fire:clamp(60px,16vmin,76px);--hit:12px}
  .hint.kb{display:none}
  .touch{display:contents}
  /* translucent at rest, so the picture shows through should a pad ever lie over it; solid when pressed */
  .touch button{font:inherit;color:#fffd;background:#2229;border:1px solid #5559;border-radius:12px;min-height:56px;padding:0;font-size:20px;touch-action:none}
  .touch button.on{background:var(--yellow);color:#000;border-color:var(--yellow)}
  .dpad,.fire{position:fixed;display:grid;touch-action:none}
  /* one surface: the padding is an invisible hit area around the drawn cross */
  .dpad{grid-template:repeat(3,var(--cell))/repeat(3,var(--cell));padding:var(--hit)}
  .dpad span{display:flex;align-items:center;justify-content:center;color:#fffd;background:#2229;border:1px solid #5559;border-radius:12px;font-size:20px;pointer-events:none}
  .dpad span.on{background:var(--yellow);color:#000;border-color:var(--yellow)}
  .fire{grid-template-columns:repeat(2,var(--fire));gap:6px}
  .fire button{min-height:var(--fire);border-radius:50%;border-color:#ff5555aa;font-size:12px}
  .u{grid-area:1/2}.l{grid-area:2/1}.r{grid-area:2/3}.d{grid-area:3/2}
  .corner{position:fixed;top:calc(8px + env(safe-area-inset-top));width:44px;min-height:44px!important;border-radius:50%!important;background:#2229!important;font-size:18px!important}
  #btn-menu{left:calc(8px + env(safe-area-inset-left))}
  #btn-sound{right:calc(8px + env(safe-area-inset-right))}
  /* no room for a hint over the picture: the corner button carries the state instead */
  #audio-hint{display:none}
  .corner[aria-pressed="false"]{opacity:.4}
  #record-name{position:fixed;left:50%;transform:translateX(-50%);bottom:calc(8px + env(safe-area-inset-bottom));z-index:2;margin:0}
  @media (orientation:landscape){
    /* The pads live in the black margins beside the 4:3 picture and never on it. The cell shrinks to fit
       the margin first (down to 48 px); only when a screen is too square for that (tablets) does the
       picture give way. The margin on the left is the narrower one, with the notch inset taken away. */
    #game{--inset:max(env(safe-area-inset-left),env(safe-area-inset-right));
      --margin:calc((100vw - 100dvh*4/3)/2 - var(--inset) - 2*var(--hit));
      --cell:clamp(48px,min(15vmin,var(--margin)/3),72px);
      --panel:calc(3*var(--cell) + 2*var(--hit) + var(--inset));
      --fire:clamp(48px,min(16vmin,(var(--panel) - var(--inset) - 2*var(--hit) - 6px)/2),76px)}
    .tube{width:min(100dvh*4/3,100vw - 2*var(--panel));height:auto}
    .dpad{left:env(safe-area-inset-left);top:50%;transform:translateY(-50%)}
    .fire{right:calc(var(--hit) + env(safe-area-inset-right));top:50%;transform:translateY(-50%)}
  }
  @media (orientation:portrait){
    /* the picture sits between the corner buttons and the pads, not pinned to the top */
    #game{padding-top:calc(52px + env(safe-area-inset-top));padding-bottom:calc(3*var(--cell) + 2*var(--hit) + 16px + env(safe-area-inset-bottom))}
    .tube{width:100vw}
    .dpad{left:env(safe-area-inset-left);bottom:calc(4px + env(safe-area-inset-bottom))}
    .fire{right:calc(12px + env(safe-area-inset-right));bottom:calc(24px + env(safe-area-inset-bottom))}
  }
}
/* Language links share the existing header/hint space. */
.language-nav{display:flex;justify-content:flex-end;font-size:13px;line-height:1.5;margin-bottom:4px}
.language-nav a,.hint a{color:var(--cyan);text-underline-offset:3px}
.language-nav a:focus-visible,.hint a:focus-visible{outline:1px solid var(--yellow);outline-offset:3px}
