@hadoku/watchparty-ui 0.44.20 → 0.45.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (29) hide show
  1. package/dist/chunks/{AdminPanel-CYbxabgY.js → AdminPanel-BGVD6Qlb.js} +4 -4
  2. package/dist/chunks/{AdminPanel-CYbxabgY.js.map → AdminPanel-BGVD6Qlb.js.map} +1 -1
  3. package/dist/chunks/{GameModule-Df1rYrJo.js → GameModule-Dx3GHtRk.js} +244 -247
  4. package/dist/chunks/GameModule-Dx3GHtRk.js.map +1 -0
  5. package/dist/chunks/{MapEditor-DgbOaCT2.js → MapEditor-yvJbXXgw.js} +319 -325
  6. package/dist/chunks/MapEditor-yvJbXXgw.js.map +1 -0
  7. package/dist/chunks/{MediaDrawer-Da6-fLeV.js → MediaDrawer-DLFj0-te.js} +293 -297
  8. package/dist/chunks/MediaDrawer-DLFj0-te.js.map +1 -0
  9. package/dist/chunks/{PlaylistPanel-fy0YV4nH.js → PlaylistPanel-B0SWGlFy.js} +124 -126
  10. package/dist/chunks/PlaylistPanel-B0SWGlFy.js.map +1 -0
  11. package/dist/chunks/Room-BVyJK3zM.js +6165 -0
  12. package/dist/chunks/Room-BVyJK3zM.js.map +1 -0
  13. package/dist/chunks/{index-B92W398r.js → index-DOLbMWw6.js} +1626 -1618
  14. package/dist/chunks/index-DOLbMWw6.js.map +1 -0
  15. package/dist/chunks/{submissionsApi-CHcpF-It.js → submissionsApi-CXZf_xlm.js} +2 -2
  16. package/dist/chunks/{submissionsApi-CHcpF-It.js.map → submissionsApi-CXZf_xlm.js.map} +1 -1
  17. package/dist/index.d.ts +11 -2
  18. package/dist/index.js +1 -1
  19. package/dist/room-chrome.js +3 -2
  20. package/dist/room-chrome.js.map +1 -1
  21. package/dist/watchparty-ui.css +1 -1
  22. package/package.json +2 -2
  23. package/dist/chunks/GameModule-Df1rYrJo.js.map +0 -1
  24. package/dist/chunks/MapEditor-DgbOaCT2.js.map +0 -1
  25. package/dist/chunks/MediaDrawer-Da6-fLeV.js.map +0 -1
  26. package/dist/chunks/PlaylistPanel-fy0YV4nH.js.map +0 -1
  27. package/dist/chunks/Room-Ci6DN1Oi.js +0 -6137
  28. package/dist/chunks/Room-Ci6DN1Oi.js.map +0 -1
  29. package/dist/chunks/index-B92W398r.js.map +0 -1
@@ -1,7 +1,7 @@
1
- import { jsxs as f, jsx as o, Fragment as _e } from "react/jsx-runtime";
2
- import { useState as R, useMemo as P, useRef as z, useEffect as q, useCallback as E } from "react";
3
- import { C as ye, u as ke, g as Ue, s as Fe } from "./index-B92W398r.js";
4
- const Oe = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAA4ElEQVR4nO3bvQrCMAAAYRUnwcFn7PvjILjq4JalCDYf0ru5P8eRhNCf47Isr8NEno/7V8dfrreNTD6cNr36H1AALaA5z77hOKfHNWHrOT+y+xFQAC2gKYAW0BRAC2gKoAU0BdACmgJoAU0BtICmAFpAUwAtoCmAFtAUQAtoCqAFNAXQAprp7wZHZr8LHNn9CCiAFtAUQAtoCqAFNAXQApoCaAFNAbSApgBaQMOfB/StMKYAWkBTAC2gKYAW0EzfB6z9Nzh7X7D7EVAALaDZfA349l/hX5+/xu5HQAG0gOYNTj4XivrBP34AAAAASUVORK5CYII=", Se = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABABAMAAABYR2ztAAAAIGNIUk0AAHomAACAhAAA+gAAAIDoAAB1MAAA6mAAADqYAAAXcJy6UTwAAAAVUExURWY5MXlWQkUoPJVoVKx3USYjOv///88sd78AAAABYktHRAZhZrh9AAAAB3RJTUUH6gUWFB4FeZ3ViwAAAHVJREFUSMflk8kNwCAMBLcFWnALtEAL6b+VgMyKCHG8skHKfMBoHsYHgJABrIPvkAhxwZ+EE3qRHnhqLf5CoEJJJZzRi83ASIS5ohHMwoJcMIkAeKvGp0bwZAockRYphavS35UCl8XXZfqL1wWWiLFawACZcANvCQaAiP6VCQAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAyNi0wNS0yMlQyMDoyMTo0MSswMDowMGeGF3AAAAAldEVYdGRhdGU6bW9kaWZ5ADIwMjYtMDUtMjJUMjA6MjE6NDErMDA6MDAW26/MAAAAKHRFWHRkYXRlOnRpbWVzdGFtcAAyMDI2LTA1LTIyVDIwOjMwOjA1KzAwOjAwH4cQBAAAAABJRU5ErkJggg==", He = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAABXUlEQVR4nO2awUrDUBBFrcxKUOjChboSBIXuBBcFv7q/IeJKMSC4aiMILWgo7ux6RrA8THvsm3t2MwRyc7mZvCRvcH07/t6riK4dFB2/vyEdO4MMoAXQ2OXpiWscHA5dfX52sU09vfP4fOfqZta6On0CZAAtgMZqu+cjo6sbVzeziavTJ0AG0AJoZAAtgEYG0AJorLbnfinpEyADaAE0MoAWQCMDaAE09jp9cY1s64L0CZABtAAaW34uXKO2mRCvJ5I+ATKAFkBjsRFnQvy39t+J/znWkT4BMoAWQPNjBuw6cYbFmRD3EKVPgAygBdBUNwMiD81T6GgGOGQALYDG3j8Wvx5wfFS2ti6l7/PHfYDrSJ8AGUALoLFN3+Ol/FVP3PscuW/fXJ0+ATKAFkCz9XeB+Nyn1xnpEyADaAE01X8PmHdfoaPvAQ4ZQAugsdL3576Zd+z50ydABtACaFan50Bii49pkgAAAABJRU5ErkJggg==", De = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAABV0lEQVR4nO2aPWsCQRRFY9gqJIKFhbGQfBDBLm3+f5ciVYKCKCk2FhaBKLZavzvFMmziyTL3dE+W5bzLm3HY3d7Tw8vxIoPrUdblZ2e/6WVdf/lHHp3BAdACNJWu6efpLNR348dz+vw663oZ6rfFR6iLnwAHQAvQVPpD19e8ov14DxAcAC1A4wBoARoHQAvQOABagMYB0AI0DoAWoHEAtACNA6AFaBwALUBT6bs0fY7e9WeE2o/2W/wEOABagCZ5L3DYfYf6ff6adcOrm0E7owbUry3FT4ADoAVoku8DlO1PXHOT8X2o6XOC/s9/1qtQD/txT9J+i58AB0AL0CTngMXXJtTT21Go6TWvqI+eE7QfpfgJcAC0AE2yB+ia7zraj+4JxU+AA6AFaBwALUDjAGgBGgdAC9A4AFqAxgHQAjQOgBagSZ4HNPHfvh9Qn1yKnwAHQAvQnAB0ZD6cfejf/wAAAABJRU5ErkJggg==", Me = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAABgUlEQVR4nO2aMUsDQRCFL5JCRIUIFmolCBHsBAvBX+3fELFSPBCszAlCAhqCnbbOLGQZvLvvwr6vm2RZ3j5m5vb2dnR5c/1T/WF6fFRF2NmbhMa3zeprERpfzxoTb7UpZhORAbQAmnFuwMX5VR86OuPx+W7t/8VngAygBdAkPWDTa97j11PPbk1cfAbIAFoAjQygBdDIAFoAjQygBdDIAFoAjQygBdDIAFoAjQygBdDIAFoATXIm+Pr2YuLTk7PexHSBX4+n+AyQAbQAmuy3QV9D0e/xfRO9r1B8BsgAWgDNeNmM7C9TGw695j1er+8Jfr3FZ4AMoAXQJPuAh/rJxNF7g0PDr6eq1AMMMoAWQJN9F/B3a9vuCX5+z8HutokP99fv9XPzeYrPABlAC6BJekDfz/1ojefI6b9v3k1cfAbIAFoATXYf0DYfn8M6Xyg+A2QALYAm6QG+Rv/7XM7R9fy5nlN8BsgAWgBN0gPmy28Xx96vo3Q9f4rOBA0ygBZA8wuEsEaUV+FlQgAAAABJRU5ErkJggg==", We = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAABUklEQVR4nO2bv4vCQBBGL0cKCxEULNRKlFOwvub+/95OEAQrtRAUPJHrznpmi7D442nme90ESR4fs5vNxhRfo5//jwyavayfvzyftACNAqAFaEo/pif9nqln0+9n+jyc9WZl6vAdoABoAZrSH6jbmPcMB2NTh+8ABUAL0CgAWoBGAdACNAqAFqBRALQAjQKgBWgUAC1AowBoARoFQAvQJHuCft/c76G9O3ov4FAAtABNMgd4/Ji5/B4fJkMQvgMUAC1AU553hT0ysWXdxrwnfAcoAFqAJlkHzJcLU/v/DNWN8B2gAGgBmspngeV2Z+pOs2Hqbqt9k8D+lLfOyL1e1fnDd4ACoAVokjmAvu/fOqfkni98BygAWoAmmQP8ffPeY/LVCN8BCoAWoEnmgMP5z9Td1n0v6J8t6HVH+A5QALQATeG/Ha7bt8FVhO8ABUAL0FwBfpsww2cW0LwAAAAASUVORK5CYII=", Le = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAABh0lEQVR4nO2asUvDQBTGL9JBpBYUOrROojSCm+Cg+P8vDk6KhUIn7SBU0CJudfXeYY/wkvxM3vtt1+Saj4/vLu8uV1zd3WzDL8rpJGg4ODxS9c/x9fmu6j9/XUXtPdW/9QA3gBZAM8jdcHlx3YaOxli+LKJ2OY2vm0+AG0ALoEnmgK6PecnpyXnUlnOC+QS4AbQAGjeAFkDjBtACaLJrgb4h6wLzCXADaAE0bgAtgMYNoAXQJHWAXC/L92bX8f0AgRtAC6DJrgW6PidI/fLbovkEuAG0AJrK+wGPz/dN6MAwnwA3gBZAM9isiviXMm5qz+TkkGd2tGeUqmI+AW4ALYAmqQMe5k9Ru+0x2facYD4BbgAtgKaYnd1GZ4WHk+1f94YQQjge7qseuN58q/pXJafXfALcAFoATVIHyDEzHtV7/n882n397WP32qNuPeYT4AbQAmj+/Rmhuse8xHwC3ABaAE0yB6S1evxebnpMyufn6gYt5hPgBtACaCrvB/QN8wlwA2gBND+5n0Dr51yy0gAAAABJRU5ErkJggg==", Te = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAABdUlEQVR4nO2bPUvEQBCGc7KV4IHFFWolCB7YCRbC/er7GxZWigHByrtCOEGDaHW2NxNwCfl4vMz7dLNhN29eZiebTTK5Xtxuix0uT0+KNhweHbfqn+Pr871V/3K1NvFBq9FGgAygBdAkP+f9HD4/uxhST+c8PN39eTx8BsgAWgBNGtuc91zNb0xcrpYmDp8BMoAWQCMDaAE0MoAWQJPGdt9vSvgMkAG0ABoZQAugkQG0AJr08vpsGsa2LvDX5wmfATKAFkCT/Lu2fa8JuTnvCZ8BMoAWQJN8g68JuXdr/42m3yeEzwAZQAugqdWAfcfXMF8TqvXExOEzQAbQAmjS24edM7Npv9/5Dc19+ehaVAMMMoAWQFNbB/ia4GlaI3LjdT3+pvpu1D98BsgAWgBN6vu+78fvet3h+8+m9rg/X1X8mDh8BsgAWgCNDKAF0MgAWgBN73uC9H5D/dlA+wEGGUALoEn+X9q+2VTDni9H+AyQAbQAml8slkzMIBNZowAAAABJRU5ErkJggg==", Ve = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAABQ0lEQVR4nO2asQ4BQRRFka2EQolKiE10Wv/fKVTEJhIVSgXR0po7iY2sONbc071NVs7cvJnZjGlOx4t744lOPyj/nhYtQOMAaAGaTOf8PJ8F9Wg4+abPx9kfdkF9u5yDOvkOcAC0AE2mD+o+5xUdj64JyXeAA6AFaBwALUDjAGgBGgdAC9A4AFqAxgHQAjQOgBagic4D/h2fCQoOgBagya6nZvBAz8zqfkao41GS7wAHQAvQRN8Buk+ut8u3frDd7VUzKkH9qpJ8BzgAWoAmuh+gFMdTUP/a/QHd51fFJqjzQf/l+8l3gAOgBWii7wCd8zqH6DmvqI9+J+h4lOQ7wAHQAjTRGlC2b9YNHY+uCcl3gAOgBWgcAC1A4wBoARoHQAvQOABagMYB0AI0DoAWoHn7jtCv3R8o+/+/jOQ7wAHQAjQPMsI9FqsxS7oAAAAASUVORK5CYII=", Pe = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAABQUlEQVR4nO2aoQoCQRRFVSaJBuNqEgTBpk3w/4thk+KCYFKjQbFqfneDCItHnXva27CcubwZhplpL1bLRysjbud2qDuQx9fgAGgBmjQdFuFDtz8I9Xg0+aRP4xyO+1CXrW2os+8AB0AL0KR/m/OKjqesvAYEHAAtQOMAaAEaB0AL0DgAWoDGAdACNA6AFqBxALQATbpfL7QDSvYd4ABoAZqkH/Qc/dfPCHU8vhsUHAAtQFNbA3RfsNmt3/qh3jM0TdP7luw7wAHQAjS1NUCpTudQz6ezUNP7hNr9v9z96fuHXhGfRGXfAQ6AFqBJOscVnUP0nFfUR/cJr8aXfQc4AFqAprYP0Dn/6+h4dE3IvgMcAC1A4wBoARoHQAvQOABagMYB0AI0DoAWoHEAtADNy3sB5dveD6jPu2TfAQ6AFqB5AmmUO6FIXs0fAAAAAElFTkSuQmCC", qe = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAABRklEQVR4nO2asWoCQRRFTZhKsEipqYSAEisDFoH8f5PCKkFBsDKWFoKttpm7xTDE7Fl993SzLMuZy3vD7O48vH28n3u/mIyGvRr6g6eq+6/N6Xioun/9s8/Gj9eUuUUcAC1Ak7TntafHzy9t+vw7/cEmG4evAAdAC9Cke+95RecXvgIcAC1Ak+6950uErwAHQAvQOABagMYB0AI0DoAWoHEAtABN2u7yb2TR3g3CV4ADoAVokv5bi7YmhK8AB0AL0CS9oGvC1+qz6oGz6eJvRgVqfUqErwAHQAvQNNYARc/UzCev2bjtfYKuMbpvWa6/s3HpzFP4CnAAtABN0h5XtIe69m6gPrqPKc0vfAU4AFqAprEPqD0r3HV0Pj4rLDgAWoDGAdACNA6AFqBxALQAjQOgBWgcAC1A4wBoARoHQAvQOABagOYCVgAynQlZGFoAAAAASUVORK5CYII=", Ge = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAABOElEQVR4nO2bwQsBQRSH0RwkFLUHnJSi3JSD8v9fnBWlnHBQFJIb53lbatrsl97vu83s1n79evt2ZtutzpaLd8UxNVqARgHQAjRh3O9FE9PJHFIph/1hF43dV4ACoAVoQqPVoR1KZTgYRWP3FaAAaAGaYO8Jb7ivAAVAC9AoAFqARgHQAjQKgBagUQC0AE2w78i87Q3cV4ACoAVowvN+jSa89QT3FaAAaAGaYCdsT1hvVqXJELivAAVAC9AoAFqARgHQAjThfIuf+1nb1/cC7itAAdACNLm9gO0JlsvjlXSBbrP+9Xhqz9keT0nnW6yP+wpQALQATUi9B7N2PC57HWG/bS56ffcVoABoAZrcOuDfKNpz3FeAAqAFaJJ7gH3u2r2BXSf8Gq0DCqIAaAGaqv4ddo4CoAVoPpR0Me34gHFfAAAAAElFTkSuQmCC", Xe = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAABeklEQVR4nO2asUoDQRRFN7KVaMAiRbQSxQjWNn62vyFipbggpDIrCAoaxE7ruVMMg7N7XOae7oUlOXN583ay7Ozs5OqnyWBvmXX56Gz7Wdb1OwN5TAYHQAvQtLqnV4fLoL44vxzTpzj3jzdB3W36oK6+AxwALUDT6gdT3/OKrqfbXAd19R3gAGgBGgdAC9A4AFqAxgHQAjQOgBagcQC0AI0DoAVooucB6+enoD4+Oh1NZgh0PUr1HeAAaAEaB0AL0DgAWoAmOgcoeh/9+nwfTKYEu/sHWddX3wEOgBagaaN3alZh+d/3vKK+OhN0vdV3gAOgBWiic8Bd9xDU+s7Q1ND1NI1nQIADoAVokv8F9L26v86E14+8c8Vinne2V98U1XeAA6AFaKIZMPR9X/e0zoTcPa+k/G/7l6CuvgMcAC1AE82A0nuSJnXuqL4DHAAtQBPNgLftd1Av5mV/sPR/ixS6Hj8PEBwALUCT/TygNEN/f4rqO8AB0AI0v8NqTSVA9X9QAAAAAElFTkSuQmCC", Ie = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAABUElEQVR4nO2asWoCQRRF3TCVYJEyWogSSMAuYCH41f5GakFBDCnUIoWQiK22zhWyyIQc2XdP91ZWz17ejAvzqrfp5NS64KX71Cqh3Xksur+O48++6P7ldpfVD0Xf1gAcAC1Ak3TN6xoe9J7/0+fPmS/ef/08fAc4AFqAJjVtzSuj13FWL7ezrA7fAQ6AFqBxALQAjQOgBWhS0/73byV8BzgAWoDGAdACNA6AFqBJH5tVdiHae0H4DnAAtABN0rO2pu0J+jxK+A5wALQATdILuifUna0p9HxA3e8fdlVWh+8AB0AL0FztAcrXd77m+r1hVtPvCbpHfW7WWa2+SvgOcAC0AE2lc4KKzhDpefu9oXuCzgUq4TvAAdACNFfvAaWzwveGPo9nhQUHQAvQOABagMYB0AI0DoAWoHEAtACNA6AFaBwALUDjAGgBGgdAC9CcAYDuOTwDN8emAAAAAElFTkSuQmCC", je = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAABNElEQVR4nO2aQQsBURRG0VspysKCWYgUZacslP+/sVaUyGLGwkJRtqzfnZppFubQ/c7uvaQzX9/c3hjN5Wb9bjimRQvQKABagCbMhoNoYzFfQSr1cE6P0dp9AxQALUAT2p0e7VAr42Qard03QAHQAjTB3hPecN8ABUAL0CgAWoBGAdACNAqAFqBRALQATbC/kXl7NnDfAAVAC9CE1/MebXibCe4boABoAZpgN+xM2O23lb7w2+8Wq/qU4b4BCoAWoMnNAMvtEc+EUTKJ1nWfE+yMseeWS3qK1v1u8btP9w1QALQATThk18IP2P8Q/dqzgfWx55iy63PfAAVAC9DkzgH2nv937PXYmeC+AQqAFqBRALQAjQKgBWgUAC1AowBoARoFQAvQKABagEYB0AI0CoAWoPkA1dkt6kUtkpYAAAAASUVORK5CYII=", ze = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAABUUlEQVR4nO2bMWvCQBiGVW4owQgtZFCnQqF7N6H/f3EWFAQndRAstKV0a1fvyyAf0Twk3/tsJwc+vrx3JvEcvr0v/gYXvM6mAw9F+eiaf2t+vj5c8zeHYzYe3VKmiygAWoAm2TVv1/Tz/KVNn7tTlNtsHL4BCoAWoEl9X/MW+/nCN0AB0AI0qe9r/hrhG6AAaAEaBUAL0CgAWoBGAdACNAqAFqBJu33+jCzavUH4BigAWoAm2d/Wou0J4RugAGgBmmRfsHvCar1sTYYgfAMUAC1AowBoARoFQAvQJHtuzntOsOuEb4ACoAVoavcCdk/w8jR+cM2vJr6zxl6/az7hG6AAaAGa2llhL6fP/PmBd017sb5Nr2PCN0AB0AI0teuAruG97rCEb4ACoAVo3HuA/d4/f/9m42rSTMhL0/cP3wAFQAvQDO1/h6MRvgEKgBag+Qfu+jOSBU5GcAAAAABJRU5ErkJggg==", Je = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAABOklEQVR4nO2aMQvCMBQGrTgVKjg4qJMgKLgJDoL/f3EWFERxqI4OiquuvtchQ6BXm++2iJXrkRRJk622m0/nh/l41IkhLwZR14d4Px9R1x9vdzPuRv1aC1AAWoCmF/rCcrGuw6M28uJkxsnPAAWgBWgqz4C2rXnPdDIz4+RngALQAjQKQAvQKAAtQKMAtACNAtACNApAC9AoAC1AowC0AI0C0AI0lT3BS2n3zf0e2r/j7y/5GaAAtABN73XP7CdzO/RrJvR+vunnAzzJzwAFoAVogucDruXZjId9u8bpd4n+GRXy9SQ/AxSAFqDJ/DlBjz83SK/5EPvDzoz9uUBP8jNAAWgBmsr/gNizwk3D34/OCjsUgBagUQBagEYBaAEaBaAFaBSAFqBRAFqARgFoARoFoAVoFIAWoPkCQOwuh7kvX8IAAAAASUVORK5CYII=", Ye = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAABLElEQVR4nO2asQrCMAAFq/gT6iQIFZ0UHAT/f3FwUiwITuroILjqal6HUFJ61b7bAlauRxJom95qu3lnX+SjYZbCYrZOuj7G4bRLur643YNxP+nf/gAHoAVoBrEf6JpZ5vNgPBlP6zWKoHvM5XoOxvviGIxje1rnZ4AD0AI0pT1A17yuoabXfAz1eT0fwVjvR+n8DHAAWoCmtAekPgu0Db0fPwsIDkAL0DgALUDjALQAjQPQAjQOQAvQOAAtQOMAtABN9LuAou/h6XeE6lOVzs8AB6AFaCrvAfreXb/Xt/18gNL5GeAAtACNzwfUo/W7OAAtQOPzAbUb/RgOQAvQ+HxAkzJtxAFoARoHoAVoHIAWoHEAWoDGAWgBGgegBWgcgBagcQBagMYBaAGaD9C3Qmb46VC5AAAAAElFTkSuQmCC", ie = {
1
+ import { jsxs as m, jsx as o, Fragment as Ue } from "react/jsx-runtime";
2
+ import { useState as R, useMemo as P, useRef as z, useEffect as J, useCallback as E } from "react";
3
+ import { C as Fe, u as Oe, g as Se, s as He } from "./index-DOLbMWw6.js";
4
+ const De = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAA4ElEQVR4nO3bvQrCMAAAYRUnwcFn7PvjILjq4JalCDYf0ru5P8eRhNCf47Isr8NEno/7V8dfrreNTD6cNr36H1AALaA5z77hOKfHNWHrOT+y+xFQAC2gKYAW0BRAC2gKoAU0BdACmgJoAU0BtICmAFpAUwAtoCmAFtAUQAtoCqAFNAXQAprp7wZHZr8LHNn9CCiAFtAUQAtoCqAFNAXQApoCaAFNAbSApgBaQMOfB/StMKYAWkBTAC2gKYAW0EzfB6z9Nzh7X7D7EVAALaDZfA349l/hX5+/xu5HQAG0gOYNTj4XivrBP34AAAAASUVORK5CYII=", Me = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABABAMAAABYR2ztAAAAIGNIUk0AAHomAACAhAAA+gAAAIDoAAB1MAAA6mAAADqYAAAXcJy6UTwAAAAVUExURWY5MXlWQkUoPJVoVKx3USYjOv///88sd78AAAABYktHRAZhZrh9AAAAB3RJTUUH6gUWFB4FeZ3ViwAAAHVJREFUSMflk8kNwCAMBLcFWnALtEAL6b+VgMyKCHG8skHKfMBoHsYHgJABrIPvkAhxwZ+EE3qRHnhqLf5CoEJJJZzRi83ASIS5ohHMwoJcMIkAeKvGp0bwZAockRYphavS35UCl8XXZfqL1wWWiLFawACZcANvCQaAiP6VCQAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAyNi0wNS0yMlQyMDoyMTo0MSswMDowMGeGF3AAAAAldEVYdGRhdGU6bW9kaWZ5ADIwMjYtMDUtMjJUMjA6MjE6NDErMDA6MDAW26/MAAAAKHRFWHRkYXRlOnRpbWVzdGFtcAAyMDI2LTA1LTIyVDIwOjMwOjA1KzAwOjAwH4cQBAAAAABJRU5ErkJggg==", We = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAABXUlEQVR4nO2awUrDUBBFrcxKUOjChboSBIXuBBcFv7q/IeJKMSC4aiMILWgo7ux6RrA8THvsm3t2MwRyc7mZvCRvcH07/t6riK4dFB2/vyEdO4MMoAXQ2OXpiWscHA5dfX52sU09vfP4fOfqZta6On0CZAAtgMZqu+cjo6sbVzeziavTJ0AG0AJoZAAtgEYG0AJorLbnfinpEyADaAE0MoAWQCMDaAE09jp9cY1s64L0CZABtAAaW34uXKO2mRCvJ5I+ATKAFkBjsRFnQvy39t+J/znWkT4BMoAWQPNjBuw6cYbFmRD3EKVPgAygBdBUNwMiD81T6GgGOGQALYDG3j8Wvx5wfFS2ti6l7/PHfYDrSJ8AGUALoLFN3+Ol/FVP3PscuW/fXJ0+ATKAFkCz9XeB+Nyn1xnpEyADaAE01X8PmHdfoaPvAQ4ZQAugsdL3576Zd+z50ydABtACaFan50Bii49pkgAAAABJRU5ErkJggg==", Le = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAABV0lEQVR4nO2aPWsCQRRFY9gqJIKFhbGQfBDBLm3+f5ciVYKCKCk2FhaBKLZavzvFMmziyTL3dE+W5bzLm3HY3d7Tw8vxIoPrUdblZ2e/6WVdf/lHHp3BAdACNJWu6efpLNR348dz+vw663oZ6rfFR6iLnwAHQAvQVPpD19e8ov14DxAcAC1A4wBoARoHQAvQOABagMYB0AI0DoAWoHEAtACNA6AFaBwALUBT6bs0fY7e9WeE2o/2W/wEOABagCZ5L3DYfYf6ff6adcOrm0E7owbUry3FT4ADoAVoku8DlO1PXHOT8X2o6XOC/s9/1qtQD/txT9J+i58AB0AL0CTngMXXJtTT21Go6TWvqI+eE7QfpfgJcAC0AE2yB+ia7zraj+4JxU+AA6AFaBwALUDjAGgBGgdAC9A4AFqAxgHQAjQOgBagSZ4HNPHfvh9Qn1yKnwAHQAvQnAB0ZD6cfejf/wAAAABJRU5ErkJggg==", Te = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAABgUlEQVR4nO2aMUsDQRCFL5JCRIUIFmolCBHsBAvBX+3fELFSPBCszAlCAhqCnbbOLGQZvLvvwr6vm2RZ3j5m5vb2dnR5c/1T/WF6fFRF2NmbhMa3zeprERpfzxoTb7UpZhORAbQAmnFuwMX5VR86OuPx+W7t/8VngAygBdAkPWDTa97j11PPbk1cfAbIAFoAjQygBdDIAFoAjQygBdDIAFoAjQygBdDIAFoAjQygBdDIAFoATXIm+Pr2YuLTk7PexHSBX4+n+AyQAbQAmuy3QV9D0e/xfRO9r1B8BsgAWgDNeNmM7C9TGw695j1er+8Jfr3FZ4AMoAXQJPuAh/rJxNF7g0PDr6eq1AMMMoAWQJN9F/B3a9vuCX5+z8HutokP99fv9XPzeYrPABlAC6BJekDfz/1ojefI6b9v3k1cfAbIAFoATXYf0DYfn8M6Xyg+A2QALYAm6QG+Rv/7XM7R9fy5nlN8BsgAWgBN0gPmy28Xx96vo3Q9f4rOBA0ygBZA8wuEsEaUV+FlQgAAAABJRU5ErkJggg==", Ve = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAABUklEQVR4nO2bv4vCQBBGL0cKCxEULNRKlFOwvub+/95OEAQrtRAUPJHrznpmi7D442nme90ESR4fs5vNxhRfo5//jwyavayfvzyftACNAqAFaEo/pif9nqln0+9n+jyc9WZl6vAdoABoAZrSH6jbmPcMB2NTh+8ABUAL0CgAWoBGAdACNAqAFqBRALQAjQKgBWgUAC1AowBoARoFQAvQJHuCft/c76G9O3ov4FAAtABNMgd4/Ji5/B4fJkMQvgMUAC1AU553hT0ysWXdxrwnfAcoAFqAJlkHzJcLU/v/DNWN8B2gAGgBmspngeV2Z+pOs2Hqbqt9k8D+lLfOyL1e1fnDd4ACoAVokjmAvu/fOqfkni98BygAWoAmmQP8ffPeY/LVCN8BCoAWoEnmgMP5z9Td1n0v6J8t6HVH+A5QALQATeG/Ha7bt8FVhO8ABUAL0FwBfpsww2cW0LwAAAAASUVORK5CYII=", Pe = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAABh0lEQVR4nO2asUvDQBTGL9JBpBYUOrROojSCm+Cg+P8vDk6KhUIn7SBU0CJudfXeYY/wkvxM3vtt1+Saj4/vLu8uV1zd3WzDL8rpJGg4ODxS9c/x9fmu6j9/XUXtPdW/9QA3gBZAM8jdcHlx3YaOxli+LKJ2OY2vm0+AG0ALoEnmgK6PecnpyXnUlnOC+QS4AbQAGjeAFkDjBtACaLJrgb4h6wLzCXADaAE0bgAtgMYNoAXQJHWAXC/L92bX8f0AgRtAC6DJrgW6PidI/fLbovkEuAG0AJrK+wGPz/dN6MAwnwA3gBZAM9isiviXMm5qz+TkkGd2tGeUqmI+AW4ALYAmqQMe5k9Ru+0x2facYD4BbgAtgKaYnd1GZ4WHk+1f94YQQjge7qseuN58q/pXJafXfALcAFoATVIHyDEzHtV7/n882n397WP32qNuPeYT4AbQAmj+/Rmhuse8xHwC3ABaAE0yB6S1evxebnpMyufn6gYt5hPgBtACaCrvB/QN8wlwA2gBND+5n0Dr51yy0gAAAABJRU5ErkJggg==", qe = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAABdUlEQVR4nO2bPUvEQBCGc7KV4IHFFWolCB7YCRbC/er7GxZWigHByrtCOEGDaHW2NxNwCfl4vMz7dLNhN29eZiebTTK5Xtxuix0uT0+KNhweHbfqn+Pr871V/3K1NvFBq9FGgAygBdAkP+f9HD4/uxhST+c8PN39eTx8BsgAWgBNGtuc91zNb0xcrpYmDp8BMoAWQCMDaAE0MoAWQJPGdt9vSvgMkAG0ABoZQAugkQG0AJr08vpsGsa2LvDX5wmfATKAFkCT/Lu2fa8JuTnvCZ8BMoAWQJN8g68JuXdr/42m3yeEzwAZQAugqdWAfcfXMF8TqvXExOEzQAbQAmjS24edM7Npv9/5Dc19+ehaVAMMMoAWQFNbB/ia4GlaI3LjdT3+pvpu1D98BsgAWgBN6vu+78fvet3h+8+m9rg/X1X8mDh8BsgAWgCNDKAF0MgAWgBN73uC9H5D/dlA+wEGGUALoEn+X9q+2VTDni9H+AyQAbQAml8slkzMIBNZowAAAABJRU5ErkJggg==", Ge = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAABQ0lEQVR4nO2asQ4BQRRFka2EQolKiE10Wv/fKVTEJhIVSgXR0po7iY2sONbc071NVs7cvJnZjGlOx4t744lOPyj/nhYtQOMAaAGaTOf8PJ8F9Wg4+abPx9kfdkF9u5yDOvkOcAC0AE2mD+o+5xUdj64JyXeAA6AFaBwALUDjAGgBGgdAC9A4AFqAxgHQAjQOgBagic4D/h2fCQoOgBagya6nZvBAz8zqfkao41GS7wAHQAvQRN8Buk+ut8u3frDd7VUzKkH9qpJ8BzgAWoAmuh+gFMdTUP/a/QHd51fFJqjzQf/l+8l3gAOgBWii7wCd8zqH6DmvqI9+J+h4lOQ7wAHQAjTRGlC2b9YNHY+uCcl3gAOgBWgcAC1A4wBoARoHQAvQOABagMYB0AI0DoAWoHn7jtCv3R8o+/+/jOQ7wAHQAjQPMsI9FqsxS7oAAAAASUVORK5CYII=", Xe = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAABQUlEQVR4nO2aoQoCQRRFVSaJBuNqEgTBpk3w/4thk+KCYFKjQbFqfneDCItHnXva27CcubwZhplpL1bLRysjbud2qDuQx9fgAGgBmjQdFuFDtz8I9Xg0+aRP4xyO+1CXrW2os+8AB0AL0KR/m/OKjqesvAYEHAAtQOMAaAEaB0AL0DgAWoDGAdACNA6AFqBxALQATbpfL7QDSvYd4ABoAZqkH/Qc/dfPCHU8vhsUHAAtQFNbA3RfsNmt3/qh3jM0TdP7luw7wAHQAjS1NUCpTudQz6ezUNP7hNr9v9z96fuHXhGfRGXfAQ6AFqBJOscVnUP0nFfUR/cJr8aXfQc4AFqAprYP0Dn/6+h4dE3IvgMcAC1A4wBoARoHQAvQOABagMYB0AI0DoAWoHEAtADNy3sB5dveD6jPu2TfAQ6AFqB5AmmUO6FIXs0fAAAAAElFTkSuQmCC", Ie = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAABRklEQVR4nO2asWoCQRRFTZhKsEipqYSAEisDFoH8f5PCKkFBsDKWFoKttpm7xTDE7Fl993SzLMuZy3vD7O48vH28n3u/mIyGvRr6g6eq+6/N6Xioun/9s8/Gj9eUuUUcAC1Ak7TntafHzy9t+vw7/cEmG4evAAdAC9Cke+95RecXvgIcAC1Ak+6950uErwAHQAvQOABagMYB0AI0DoAWoHEAtABN2u7yb2TR3g3CV4ADoAVokv5bi7YmhK8AB0AL0CS9oGvC1+qz6oGz6eJvRgVqfUqErwAHQAvQNNYARc/UzCev2bjtfYKuMbpvWa6/s3HpzFP4CnAAtABN0h5XtIe69m6gPrqPKc0vfAU4AFqAprEPqD0r3HV0Pj4rLDgAWoDGAdACNA6AFqBxALQAjQOgBWgcAC1A4wBoARoHQAvQOABagOYCVgAynQlZGFoAAAAASUVORK5CYII=", je = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAABOElEQVR4nO2bwQsBQRSH0RwkFLUHnJSi3JSD8v9fnBWlnHBQFJIb53lbatrsl97vu83s1n79evt2ZtutzpaLd8UxNVqARgHQAjRh3O9FE9PJHFIph/1hF43dV4ACoAVoQqPVoR1KZTgYRWP3FaAAaAGaYO8Jb7ivAAVAC9AoAFqARgHQAjQKgBagUQC0AE2w78i87Q3cV4ACoAVowvN+jSa89QT3FaAAaAGaYCdsT1hvVqXJELivAAVAC9AoAFqARgHQAjThfIuf+1nb1/cC7itAAdACNLm9gO0JlsvjlXSBbrP+9Xhqz9keT0nnW6yP+wpQALQATUi9B7N2PC57HWG/bS56ffcVoABoAZrcOuDfKNpz3FeAAqAFaJJ7gH3u2r2BXSf8Gq0DCqIAaAGaqv4ddo4CoAVoPpR0Me34gHFfAAAAAElFTkSuQmCC", ze = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAABeklEQVR4nO2asUoDQRRFN7KVaMAiRbQSxQjWNn62vyFipbggpDIrCAoaxE7ruVMMg7N7XOae7oUlOXN583ay7Ozs5OqnyWBvmXX56Gz7Wdb1OwN5TAYHQAvQtLqnV4fLoL44vxzTpzj3jzdB3W36oK6+AxwALUDT6gdT3/OKrqfbXAd19R3gAGgBGgdAC9A4AFqAxgHQAjQOgBagcQC0AI0DoAVooucB6+enoD4+Oh1NZgh0PUr1HeAAaAEaB0AL0DgAWoAmOgcoeh/9+nwfTKYEu/sHWddX3wEOgBagaaN3alZh+d/3vKK+OhN0vdV3gAOgBWiic8Bd9xDU+s7Q1ND1NI1nQIADoAVokv8F9L26v86E14+8c8Vinne2V98U1XeAA6AFaKIZMPR9X/e0zoTcPa+k/G/7l6CuvgMcAC1AE82A0nuSJnXuqL4DHAAtQBPNgLftd1Av5mV/sPR/ixS6Hj8PEBwALUCT/TygNEN/f4rqO8AB0AI0v8NqTSVA9X9QAAAAAElFTkSuQmCC", Je = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAABUElEQVR4nO2asWoCQRRF3TCVYJEyWogSSMAuYCH41f5GakFBDCnUIoWQiK22zhWyyIQc2XdP91ZWz17ejAvzqrfp5NS64KX71Cqh3Xksur+O48++6P7ldpfVD0Xf1gAcAC1Ak3TN6xoe9J7/0+fPmS/ef/08fAc4AFqAJjVtzSuj13FWL7ezrA7fAQ6AFqBxALQAjQOgBWhS0/73byV8BzgAWoDGAdACNA6AFqBJH5tVdiHae0H4DnAAtABN0rO2pu0J+jxK+A5wALQATdILuifUna0p9HxA3e8fdlVWh+8AB0AL0FztAcrXd77m+r1hVtPvCbpHfW7WWa2+SvgOcAC0AE2lc4KKzhDpefu9oXuCzgUq4TvAAdACNFfvAaWzwveGPo9nhQUHQAvQOABagMYB0AI0DoAWoHEAtACNA6AFaBwALUDjAGgBGgdAC9CcAYDuOTwDN8emAAAAAElFTkSuQmCC", Ye = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAABNElEQVR4nO2aQQsBURRG0VspysKCWYgUZacslP+/sVaUyGLGwkJRtqzfnZppFubQ/c7uvaQzX9/c3hjN5Wb9bjimRQvQKABagCbMhoNoYzFfQSr1cE6P0dp9AxQALUAT2p0e7VAr42Qard03QAHQAjTB3hPecN8ABUAL0CgAWoBGAdACNAqAFqBRALQATbC/kXl7NnDfAAVAC9CE1/MebXibCe4boABoAZpgN+xM2O23lb7w2+8Wq/qU4b4BCoAWoMnNAMvtEc+EUTKJ1nWfE+yMseeWS3qK1v1u8btP9w1QALQATThk18IP2P8Q/dqzgfWx55iy63PfAAVAC9DkzgH2nv937PXYmeC+AQqAFqBRALQAjQKgBWgUAC1AowBoARoFQAvQKABagEYB0AI0CoAWoPkA1dkt6kUtkpYAAAAASUVORK5CYII=", Ke = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAABUUlEQVR4nO2bMWvCQBiGVW4owQgtZFCnQqF7N6H/f3EWFAQndRAstKV0a1fvyyAf0Twk3/tsJwc+vrx3JvEcvr0v/gYXvM6mAw9F+eiaf2t+vj5c8zeHYzYe3VKmiygAWoAm2TVv1/Tz/KVNn7tTlNtsHL4BCoAWoEl9X/MW+/nCN0AB0AI0qe9r/hrhG6AAaAEaBUAL0CgAWoBGAdACNAqAFqBJu33+jCzavUH4BigAWoAm2d/Wou0J4RugAGgBmmRfsHvCar1sTYYgfAMUAC1AowBoARoFQAvQJHtuzntOsOuEb4ACoAVoavcCdk/w8jR+cM2vJr6zxl6/az7hG6AAaAGa2llhL6fP/PmBd017sb5Nr2PCN0AB0AI0teuAruG97rCEb4ACoAVo3HuA/d4/f/9m42rSTMhL0/cP3wAFQAvQDO1/h6MRvgEKgBag+Qfu+jOSBU5GcAAAAABJRU5ErkJggg==", $e = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAABOklEQVR4nO2aMQvCMBQGrTgVKjg4qJMgKLgJDoL/f3EWFERxqI4OiquuvtchQ6BXm++2iJXrkRRJk622m0/nh/l41IkhLwZR14d4Px9R1x9vdzPuRv1aC1AAWoCmF/rCcrGuw6M28uJkxsnPAAWgBWgqz4C2rXnPdDIz4+RngALQAjQKQAvQKAAtQKMAtACNAtACNApAC9AoAC1AowC0AI0C0AI0lT3BS2n3zf0e2r/j7y/5GaAAtABN73XP7CdzO/RrJvR+vunnAzzJzwAFoAVogucDruXZjId9u8bpd4n+GRXy9SQ/AxSAFqDJ/DlBjz83SK/5EPvDzoz9uUBP8jNAAWgBmsr/gNizwk3D34/OCjsUgBagUQBagEYBaAEaBaAFaBSAFqBRAFqARgFoARoFoAVoFIAWoPkCQOwuh7kvX8IAAAAASUVORK5CYII=", Ze = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAABLElEQVR4nO2asQrCMAAFq/gT6iQIFZ0UHAT/f3FwUiwITuroILjqal6HUFJ61b7bAlauRxJom95qu3lnX+SjYZbCYrZOuj7G4bRLur643YNxP+nf/gAHoAVoBrEf6JpZ5vNgPBlP6zWKoHvM5XoOxvviGIxje1rnZ4AD0AI0pT1A17yuoabXfAz1eT0fwVjvR+n8DHAAWoCmtAekPgu0Db0fPwsIDkAL0DgALUDjALQAjQPQAjQOQAvQOAAtQOMAtABN9LuAou/h6XeE6lOVzs8AB6AFaCrvAfreXb/Xt/18gNL5GeAAtACNzwfUo/W7OAAtQOPzAbUb/RgOQAvQ+HxAkzJtxAFoARoHoAVoHIAWoHEAWoDGAWgBGgegBWgcgBagcQBagMYBaAGaD9C3Qmb46VC5AAAAAElFTkSuQmCC", ce = {
5
5
  2: [11, 9],
6
6
  3: [11, 9],
7
7
  4: [13, 11],
@@ -11,7 +11,7 @@ const Oe = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAA
11
11
  8: [19, 17],
12
12
  9: [19, 17],
13
13
  10: [21, 19]
14
- }, G = "123456789A", Z = ye.slice(0, G.length), Ke = [[1, 0], [-1, 0], [0, 1], [0, -1]], $e = [[1, 1], [1, -1], [-1, 1], [-1, -1]], Ze = 2, et = [
14
+ }, q = "123456789A", te = Fe.slice(0, q.length), et = [[1, 0], [-1, 0], [0, 1], [0, -1]], tt = [[1, 1], [1, -1], [-1, 1], [-1, -1]], At = 2, at = [
15
15
  "floor",
16
16
  "soft_block",
17
17
  "wall_iso",
@@ -31,15 +31,15 @@ const Oe = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAA
31
31
  "wall_t_e",
32
32
  "wall_t_w"
33
33
  ];
34
- function tt(c) {
34
+ function nt(c) {
35
35
  return c === "A" ? 9 : parseInt(c, 10) - 1;
36
36
  }
37
- function At(c) {
38
- return Z[tt(c) % Z.length];
37
+ function rt(c) {
38
+ return te[nt(c) % te.length];
39
39
  }
40
- function at(c, m, b) {
41
- const n = c[0]?.length ?? 0, w = c.length, i = (r, d) => r >= 0 && d >= 0 && r < n && d < w && c[d][r] === "H", C = i(m, b - 1) ? 1 : 0, B = i(m + 1, b) ? 1 : 0, D = i(m, b + 1) ? 1 : 0, _ = i(m - 1, b) ? 1 : 0;
42
- switch (C << 3 | B << 2 | D << 1 | _) {
40
+ function st(c, g, b) {
41
+ const a = c[0]?.length ?? 0, u = c.length, l = (r, f) => r >= 0 && f >= 0 && r < a && f < u && c[f][r] === "H", C = l(g, b - 1) ? 1 : 0, B = l(g + 1, b) ? 1 : 0, H = l(g, b + 1) ? 1 : 0, _ = l(g - 1, b) ? 1 : 0;
42
+ switch (C << 3 | B << 2 | H << 1 | _) {
43
43
  case 0:
44
44
  return "wall_iso";
45
45
  case 1:
@@ -76,422 +76,416 @@ function at(c, m, b) {
76
76
  return "wall_iso";
77
77
  }
78
78
  }
79
- function nt(c, m, b) {
80
- const n = c[0]?.length ?? 0, w = c.length;
81
- let i = (m | 1) >>> 0;
82
- const C = () => (i ^= i << 13, i >>>= 0, i ^= i >>> 17, i ^= i << 5, i >>>= 0, i), B = [];
83
- for (let r = 0; r < w; r++)
84
- for (let d = 0; d < n; d++)
85
- /^[1-9A]$/.test(c[r][d]) && B.push({ c: d, r, digit: c[r][d] });
86
- B.sort((r, d) => G.indexOf(r.digit) - G.indexOf(d.digit));
79
+ function ot(c, g, b) {
80
+ const a = c[0]?.length ?? 0, u = c.length;
81
+ let l = (g | 1) >>> 0;
82
+ const C = () => (l ^= l << 13, l >>>= 0, l ^= l >>> 17, l ^= l << 5, l >>>= 0, l), B = [];
83
+ for (let r = 0; r < u; r++)
84
+ for (let f = 0; f < a; f++)
85
+ /^[1-9A]$/.test(c[r][f]) && B.push({ c: f, r, digit: c[r][f] });
86
+ B.sort((r, f) => q.indexOf(r.digit) - q.indexOf(f.digit));
87
87
  for (let r = B.length - 1; r >= 1; r--) {
88
- const d = C() % (r + 1);
89
- [B[r], B[d]] = [B[d], B[r]];
88
+ const f = C() % (r + 1);
89
+ [B[r], B[f]] = [B[f], B[r]];
90
90
  }
91
- const D = B.slice(0, Math.max(0, Math.min(b, B.length))), _ = /* @__PURE__ */ new Set();
92
- for (const { c: r, r: d } of D) {
93
- _.add(`${r},${d}`);
94
- for (const [Q, S] of Ke)
95
- for (let k = 1; k <= Ze; k++)
96
- _.add(`${r + Q * k},${d + S * k}`);
97
- for (const [Q, S] of $e)
98
- _.add(`${r + Q},${d + S}`);
91
+ const H = B.slice(0, Math.max(0, Math.min(b, B.length))), _ = /* @__PURE__ */ new Set();
92
+ for (const { c: r, r: f } of H) {
93
+ _.add(`${r},${f}`);
94
+ for (const [Q, O] of et)
95
+ for (let k = 1; k <= At; k++)
96
+ _.add(`${r + Q * k},${f + O * k}`);
97
+ for (const [Q, O] of tt)
98
+ _.add(`${r + Q},${f + O}`);
99
99
  }
100
- const O = /* @__PURE__ */ new Set();
101
- for (let r = 0; r < w; r++)
102
- for (let d = 0; d < n; d++) {
103
- if (c[r][d] !== ".") continue;
104
- const Q = `${d},${r}`;
105
- _.has(Q) || C() % 100 < 80 && O.add(Q);
100
+ const F = /* @__PURE__ */ new Set();
101
+ for (let r = 0; r < u; r++)
102
+ for (let f = 0; f < a; f++) {
103
+ if (c[r][f] !== ".") continue;
104
+ const Q = `${f},${r}`;
105
+ _.has(Q) || C() % 100 < 80 && F.add(Q);
106
106
  }
107
- return O;
107
+ return F;
108
108
  }
109
- function rt(c) {
110
- const m = c.split(/\r?\n/).filter((w) => !w.startsWith("#") && w.trim().length > 0);
111
- if (m.length < 5)
109
+ function lt(c) {
110
+ const g = c.split(/\r?\n/).filter((u) => !u.startsWith("#") && u.trim().length > 0);
111
+ if (g.length < 5)
112
112
  return { ok: !1, error: "Need at least 5 non-comment lines." };
113
- const b = m[0].length;
114
- if (!m.every((w) => w.length === b))
113
+ const b = g[0].length;
114
+ if (!g.every((u) => u.length === b))
115
115
  return { ok: !1, error: "All rows must have the same width." };
116
- const n = m.map(
117
- (w) => w.split("").map((i) => i === "H" || i === "." ? i : /^[1-9Aa]$/.test(i) ? i.toUpperCase() : ".")
116
+ const a = g.map(
117
+ (u) => u.split("").map((l) => l === "H" || l === "." ? l : /^[1-9Aa]$/.test(l) ? l.toUpperCase() : ".")
118
118
  );
119
- return { ok: !0, map: { width: b, height: m.length, grid: n } };
119
+ return { ok: !0, map: { width: b, height: g.length, grid: a } };
120
120
  }
121
- function ce(c, m) {
121
+ function de(c, g) {
122
122
  const b = [];
123
- for (let n = 0; n < m; n++) {
124
- const w = [];
125
- for (let i = 0; i < c; i++) {
126
- const C = n === 0 || n === m - 1 || i === 0 || i === c - 1;
127
- w.push(C ? "H" : ".");
123
+ for (let a = 0; a < g; a++) {
124
+ const u = [];
125
+ for (let l = 0; l < c; l++) {
126
+ const C = a === 0 || a === g - 1 || l === 0 || l === c - 1;
127
+ u.push(C ? "H" : ".");
128
128
  }
129
- b.push(w);
129
+ b.push(u);
130
130
  }
131
- return { width: c, height: m, grid: b };
131
+ return { width: c, height: g, grid: b };
132
132
  }
133
- function st(c) {
134
- const m = /* @__PURE__ */ new Set();
133
+ function it(c) {
134
+ const g = /* @__PURE__ */ new Set();
135
135
  for (const b of c)
136
- for (const n of b)
137
- /^[1-9A]$/.test(n) && m.add(n);
138
- for (const b of G)
139
- if (!m.has(b)) return b;
136
+ for (const a of b)
137
+ /^[1-9A]$/.test(a) && g.add(a);
138
+ for (const b of q)
139
+ if (!g.has(b)) return b;
140
140
  return null;
141
141
  }
142
- async function de(c) {
142
+ async function ge(c) {
143
143
  try {
144
- const m = await c.json();
145
- if (typeof m.message == "string" && m.message) return m.message;
144
+ const g = await c.json();
145
+ if (typeof g.message == "string" && g.message) return g.message;
146
146
  } catch {
147
147
  }
148
148
  return `HTTP ${c.status}`;
149
149
  }
150
- const ot = /* @__PURE__ */ Object.assign({
151
- "../assets/games/bomberman/tiles/floor.png": Oe,
152
- "../assets/games/bomberman/tiles/soft_block.png": Se,
153
- "../assets/games/bomberman/tiles/wall_cap_e.png": He,
154
- "../assets/games/bomberman/tiles/wall_cap_n.png": De,
155
- "../assets/games/bomberman/tiles/wall_cap_s.png": Me,
156
- "../assets/games/bomberman/tiles/wall_cap_w.png": We,
157
- "../assets/games/bomberman/tiles/wall_corner_ne.png": Le,
158
- "../assets/games/bomberman/tiles/wall_corner_nw.png": Te,
159
- "../assets/games/bomberman/tiles/wall_corner_se.png": Ve,
160
- "../assets/games/bomberman/tiles/wall_corner_sw.png": Pe,
161
- "../assets/games/bomberman/tiles/wall_cross.png": qe,
162
- "../assets/games/bomberman/tiles/wall_h.png": Ge,
163
- "../assets/games/bomberman/tiles/wall_iso.png": Xe,
164
- "../assets/games/bomberman/tiles/wall_t_e.png": Ie,
165
- "../assets/games/bomberman/tiles/wall_t_n.png": je,
166
- "../assets/games/bomberman/tiles/wall_t_s.png": ze,
167
- "../assets/games/bomberman/tiles/wall_t_w.png": Je,
168
- "../assets/games/bomberman/tiles/wall_v.png": Ye
150
+ const ct = /* @__PURE__ */ Object.assign({
151
+ "../assets/games/bomberman/tiles/floor.png": De,
152
+ "../assets/games/bomberman/tiles/soft_block.png": Me,
153
+ "../assets/games/bomberman/tiles/wall_cap_e.png": We,
154
+ "../assets/games/bomberman/tiles/wall_cap_n.png": Le,
155
+ "../assets/games/bomberman/tiles/wall_cap_s.png": Te,
156
+ "../assets/games/bomberman/tiles/wall_cap_w.png": Ve,
157
+ "../assets/games/bomberman/tiles/wall_corner_ne.png": Pe,
158
+ "../assets/games/bomberman/tiles/wall_corner_nw.png": qe,
159
+ "../assets/games/bomberman/tiles/wall_corner_se.png": Ge,
160
+ "../assets/games/bomberman/tiles/wall_corner_sw.png": Xe,
161
+ "../assets/games/bomberman/tiles/wall_cross.png": Ie,
162
+ "../assets/games/bomberman/tiles/wall_h.png": je,
163
+ "../assets/games/bomberman/tiles/wall_iso.png": ze,
164
+ "../assets/games/bomberman/tiles/wall_t_e.png": Je,
165
+ "../assets/games/bomberman/tiles/wall_t_n.png": Ye,
166
+ "../assets/games/bomberman/tiles/wall_t_s.png": Ke,
167
+ "../assets/games/bomberman/tiles/wall_t_w.png": $e,
168
+ "../assets/games/bomberman/tiles/wall_v.png": Ze
169
169
  });
170
- function lt(c) {
171
- return ot[`../assets/games/bomberman/tiles/${c}.png`] ?? null;
170
+ function dt(c) {
171
+ return ct[`../assets/games/bomberman/tiles/${c}.png`] ?? null;
172
172
  }
173
- function gt() {
174
- const c = ke(), [m, b] = R(4), [n, w] = R(() => {
175
- const [e, t] = ie[4];
176
- return ce(e, t);
177
- }), [i, C] = R(/* @__PURE__ */ new Set()), [B, D] = R([]), [_, O] = R(!1), [r, d] = R(""), [Q, S] = R(""), [k, u] = R(null), U = P(() => Ue(), []), ee = z({}), [J, ge] = R(!1);
178
- q(() => {
173
+ function gt(c, g) {
174
+ const b = c.find((u) => u.players === g)?.files ?? [], a = new Set(b);
175
+ for (let u = 1; u <= 99; u++) {
176
+ const l = `m${String(u).padStart(2, "0")}.map`;
177
+ if (!a.has(l)) return l.replace(/\.map$/, "");
178
+ }
179
+ return "custom";
180
+ }
181
+ function pt() {
182
+ const c = Oe(), [g, b] = R(4), [a, u] = R(() => {
183
+ const [e, t] = ce[4];
184
+ return de(e, t);
185
+ }), [l, C] = R(/* @__PURE__ */ new Set()), [B, H] = R([]), [_, F] = R(!0), [r, f] = R(""), [Q, O] = R(""), [k, h] = R(null), U = P(() => Se(), []), Ae = z({}), [Y, fe] = R(!1);
186
+ J(() => {
179
187
  let e = !0;
180
- function t(A, a) {
181
- return a ? new Promise((s) => {
182
- const l = new Image();
183
- l.onload = () => {
184
- e && (ee.current[A] = l), s();
185
- }, l.onerror = () => {
186
- console.warn("[MapEditor] sprite failed to load", { key: A, url: a }), s();
187
- }, l.src = a;
188
+ function t(A, n) {
189
+ return n ? new Promise((s) => {
190
+ const i = new Image();
191
+ i.onload = () => {
192
+ e && (Ae.current[A] = i), s();
193
+ }, i.onerror = () => {
194
+ console.warn("[MapEditor] sprite failed to load", { key: A, url: n }), s();
195
+ }, i.src = n;
188
196
  }) : Promise.resolve();
189
197
  }
190
198
  return Promise.all([
191
- ...et.map((A) => t(A, lt(A))),
199
+ ...at.map((A) => t(A, dt(A))),
192
200
  // Characters come from the server like every other avatar in the app.
193
- ...Z.map((A) => t(`char:${A}`, Fe(A)))
201
+ ...te.map((A) => t(`char:${A}`, He(A)))
194
202
  ]).then(() => {
195
- e && ge(!0);
203
+ e && fe(!0);
196
204
  }), () => {
197
205
  e = !1;
198
206
  };
199
207
  }, []);
200
- const X = E((e, t) => {
201
- e.length !== 0 && (w((A) => {
202
- const a = A.grid.map((s) => [...s]);
203
- for (const { c: s, r: l } of e)
204
- if (!(l < 0 || l >= A.height || s < 0 || s >= A.width)) {
208
+ const G = E((e, t) => {
209
+ e.length !== 0 && (u((A) => {
210
+ const n = A.grid.map((s) => [...s]);
211
+ for (const { c: s, r: i } of e)
212
+ if (!(i < 0 || i >= A.height || s < 0 || s >= A.width)) {
205
213
  if (t === "wall")
206
- a[l][s] = "H";
214
+ n[i][s] = "H";
207
215
  else if (t === "floor")
208
- a[l][s] = ".";
216
+ n[i][s] = ".";
209
217
  else if (t === "spawn") {
210
- if (/^[1-9A]$/.test(a[l][s]))
211
- a[l][s] = ".";
212
- else if (a[l][s] === ".") {
213
- const h = /* @__PURE__ */ new Set();
214
- for (const x of a)
218
+ if (/^[1-9A]$/.test(n[i][s]))
219
+ n[i][s] = ".";
220
+ else if (n[i][s] === ".") {
221
+ const w = /* @__PURE__ */ new Set();
222
+ for (const x of n)
215
223
  for (const y of x)
216
- /^[1-9A]$/.test(y) && h.add(y);
224
+ /^[1-9A]$/.test(y) && w.add(y);
217
225
  let N = null;
218
- for (const x of G)
219
- if (!h.has(x)) {
226
+ for (const x of q)
227
+ if (!w.has(x)) {
220
228
  N = x;
221
229
  break;
222
230
  }
223
- N && (a[l][s] = N);
231
+ N && (n[i][s] = N);
224
232
  }
225
233
  }
226
234
  }
227
- return { ...A, grid: a };
235
+ return { ...A, grid: n };
228
236
  }), C((A) => A.size === 0 ? A : /* @__PURE__ */ new Set()));
229
- }, []), Y = z(null), H = z(null), M = z(null), te = E((e) => {
230
- const t = Y.current;
237
+ }, []), K = z(null), S = z(null), D = z(null), ae = E((e) => {
238
+ const t = K.current;
231
239
  if (!t) return null;
232
- const A = t.getBoundingClientRect(), a = e.clientX - A.left, s = e.clientY - A.top;
233
- if (a < 0 || s < 0 || a >= A.width || s >= A.height) return null;
234
- const l = A.width / n.width, h = A.height / n.height;
235
- return { c: Math.floor(a / l), r: Math.floor(s / h) };
236
- }, [n.width, n.height]), fe = E((e, t, A) => {
237
- const a = Math.abs(t.c - e.c), s = Math.abs(t.r - e.r), l = Math.max(a, s), h = [];
238
- if (l === 0)
239
- h.push({ c: t.c, r: t.r });
240
+ const A = t.getBoundingClientRect(), n = e.clientX - A.left, s = e.clientY - A.top;
241
+ if (n < 0 || s < 0 || n >= A.width || s >= A.height) return null;
242
+ const i = A.width / a.width, w = A.height / a.height;
243
+ return { c: Math.floor(n / i), r: Math.floor(s / w) };
244
+ }, [a.width, a.height]), me = E((e, t, A) => {
245
+ const n = Math.abs(t.c - e.c), s = Math.abs(t.r - e.r), i = Math.max(n, s), w = [];
246
+ if (i === 0)
247
+ w.push({ c: t.c, r: t.r });
240
248
  else
241
- for (let N = 0; N <= l; N++) {
242
- const x = N / l;
243
- h.push({
249
+ for (let N = 0; N <= i; N++) {
250
+ const x = N / i;
251
+ w.push({
244
252
  c: Math.round(e.c + (t.c - e.c) * x),
245
253
  r: Math.round(e.r + (t.r - e.r) * x)
246
254
  });
247
255
  }
248
- X(h, A);
249
- }, [X]), me = (e) => {
256
+ G(w, A);
257
+ }, [G]), ue = (e) => {
250
258
  let t = null;
251
259
  if (e.button === 0 ? t = e.shiftKey ? "spawn" : "wall" : e.button === 2 && (t = "floor"), !t) return;
252
- e.preventDefault(), M.current = t;
253
- const A = te(e);
254
- A && (e.currentTarget.setPointerCapture?.(e.pointerId), X([A], t), H.current = A);
255
- }, ue = (e) => {
256
- const t = M.current;
260
+ e.preventDefault(), D.current = t;
261
+ const A = ae(e);
262
+ A && (e.currentTarget.setPointerCapture?.(e.pointerId), G([A], t), S.current = A);
263
+ }, pe = (e) => {
264
+ const t = D.current;
257
265
  if (!t) return;
258
266
  if ((e.buttons & 3) === 0) {
259
- M.current = null, H.current = null;
267
+ D.current = null, S.current = null;
260
268
  return;
261
269
  }
262
270
  if (t === "spawn") return;
263
- const A = te(e);
271
+ const A = ae(e);
264
272
  if (!A) return;
265
- const a = H.current;
266
- if (a) {
267
- if (a.c === A.c && a.r === A.r) return;
268
- fe(a, A, t);
273
+ const n = S.current;
274
+ if (n) {
275
+ if (n.c === A.c && n.r === A.r) return;
276
+ me(n, A, t);
269
277
  } else
270
- X([A], t);
271
- H.current = A;
272
- }, pe = (e) => {
273
- e.currentTarget.releasePointerCapture?.(e.pointerId), M.current = null, H.current = null;
278
+ G([A], t);
279
+ S.current = A;
280
+ }, he = (e) => {
281
+ e.currentTarget.releasePointerCapture?.(e.pointerId), D.current = null, S.current = null;
274
282
  };
275
- q(() => {
283
+ J(() => {
276
284
  const e = () => {
277
- M.current = null, H.current = null;
285
+ D.current = null, S.current = null;
278
286
  };
279
287
  return window.addEventListener("mouseup", e), window.addEventListener("blur", e), () => {
280
288
  window.removeEventListener("mouseup", e), window.removeEventListener("blur", e);
281
289
  };
282
290
  }, []);
283
- const he = (e) => {
291
+ const be = (e) => {
284
292
  b(e);
285
- const [t, A] = ie[e];
286
- w(ce(t, A)), C(/* @__PURE__ */ new Set());
287
- }, Ae = (e, t) => {
288
- e < 5 || e > 31 || t < 5 || t > 31 || (w((A) => {
289
- const a = [];
293
+ const [t, A] = ce[e];
294
+ u(de(t, A)), C(/* @__PURE__ */ new Set());
295
+ }, ne = (e, t) => {
296
+ e < 5 || e > 31 || t < 5 || t > 31 || (u((A) => {
297
+ const n = [];
290
298
  for (let s = 0; s < t; s++) {
291
- const l = [];
292
- for (let h = 0; h < e; h++)
293
- s === 0 || s === t - 1 || h === 0 || h === e - 1 ? l.push("H") : s < A.height && h < A.width ? l.push(A.grid[s][h]) : l.push(".");
294
- a.push(l);
299
+ const i = [];
300
+ for (let w = 0; w < e; w++)
301
+ s === 0 || s === t - 1 || w === 0 || w === e - 1 ? i.push("H") : s < A.height && w < A.width ? i.push(A.grid[s][w]) : i.push(".");
302
+ n.push(i);
295
303
  }
296
- return { width: e, height: t, grid: a };
304
+ return { width: e, height: t, grid: n };
297
305
  }), C(/* @__PURE__ */ new Set()));
298
306
  }, we = () => {
299
- w((e) => {
307
+ u((e) => {
300
308
  const t = e.grid.map(
301
- (A, a) => A.map((s, l) => a === 0 || a === e.height - 1 || l === 0 || l === e.width - 1 ? "H" : ".")
309
+ (A, n) => A.map((s, i) => n === 0 || n === e.height - 1 || i === 0 || i === e.width - 1 ? "H" : ".")
302
310
  );
303
311
  return { ...e, grid: t };
304
312
  }), C(/* @__PURE__ */ new Set());
305
- }, g = P(() => {
313
+ }, d = P(() => {
306
314
  let e = 0;
307
- for (const t of n.grid)
315
+ for (const t of a.grid)
308
316
  for (const A of t)
309
317
  /^[1-9A]$/.test(A) && (e += 1);
310
318
  return e;
311
- }, [n]), [p, ae] = R(4);
312
- q(() => {
313
- ae((e) => g < 2 ? 2 : e > g ? g : e);
314
- }, [g]);
315
- const be = E(() => {
319
+ }, [a]), [p, $] = R(4), [Be, ve] = R(void 0);
320
+ d !== Be && (ve(d), d < 2 ? $(2) : p > d && $(d));
321
+ const Ce = E(() => {
316
322
  const e = (Math.floor(performance.now() * 1e3) ^ 2654435769) >>> 0;
317
- C(nt(n.grid, e || 1, p));
318
- }, [n.grid, p]), Be = () => C(/* @__PURE__ */ new Set()), ne = P(() => {
319
- const e = Math.min(p, g), t = g > e ? ` (${g} spawn variants)` : "", A = `# ${e}-player map${t} · custom · edited via map editor
320
- # dims: ${n.width}x${n.height} · spawns: ${g}`, a = n.grid.map((s) => s.join("")).join(`
323
+ C(ot(a.grid, e || 1, p));
324
+ }, [a.grid, p]), xe = () => C(/* @__PURE__ */ new Set()), re = P(() => {
325
+ const e = Math.min(p, d), t = d > e ? ` (${d} spawn variants)` : "", A = `# ${e}-player map${t} · custom · edited via map editor
326
+ # dims: ${a.width}x${a.height} · spawns: ${d}`, n = a.grid.map((s) => s.join("")).join(`
321
327
  `);
322
328
  return `${A}
323
- ${a}
329
+ ${n}
324
330
  `;
325
- }, [n, g, p]), F = E(async () => {
326
- O(!0);
327
- try {
328
- const e = await fetch(`${U}/api/maps`);
329
- if (!e.ok) {
330
- u({ kind: "err", text: `List failed: HTTP ${e.status}` });
331
- return;
332
- }
333
- const t = await e.json();
334
- D(t.groups ?? []);
335
- } catch (e) {
336
- const t = e instanceof Error ? e.message : "network error";
337
- u({ kind: "err", text: `List failed: ${t}` });
338
- } finally {
339
- O(!1);
331
+ }, [a, d, p]), X = E(() => fetch(`${U}/api/maps`).then((e) => {
332
+ if (!e.ok) {
333
+ h({ kind: "err", text: `List failed: HTTP ${e.status}` });
334
+ return;
340
335
  }
341
- }, [U]);
342
- q(() => {
343
- F();
344
- }, [F]);
345
- const K = (e) => {
336
+ return e.json().then((t) => H(t.groups ?? []));
337
+ }).catch((e) => {
338
+ const t = e instanceof Error ? e.message : "network error";
339
+ h({ kind: "err", text: `List failed: ${t}` });
340
+ }).finally(() => F(!1)), [U]), M = E(() => (F(!0), X()), [X]);
341
+ J(() => {
342
+ X();
343
+ }, [X]);
344
+ const Z = (e) => {
346
345
  const t = e.match(/^p(0[2-9]|10)\/([A-Za-z0-9_-]+)\.map$/);
347
346
  return t ? { nn: t[1], name: t[2] } : null;
348
- }, ve = E(async () => {
349
- u(null);
350
- const e = K(r);
347
+ }, Qe = E(async () => {
348
+ h(null);
349
+ const e = Z(r);
351
350
  if (!e) {
352
- u({ kind: "err", text: "Pick a map first." });
351
+ h({ kind: "err", text: "Pick a map first." });
353
352
  return;
354
353
  }
355
354
  try {
356
355
  const t = await fetch(`${U}/api/maps/p${e.nn}/${e.name}`);
357
356
  if (!t.ok) {
358
- u({ kind: "err", text: `Load failed: HTTP ${t.status}` });
357
+ h({ kind: "err", text: `Load failed: HTTP ${t.status}` });
359
358
  return;
360
359
  }
361
- const A = await t.text(), a = rt(A);
362
- if (!a.ok) {
363
- u({ kind: "err", text: `Parse failed: ${a.error}` });
360
+ const A = await t.text(), n = lt(A);
361
+ if (!n.ok) {
362
+ h({ kind: "err", text: `Parse failed: ${n.error}` });
364
363
  return;
365
364
  }
366
- w(a.map), C(/* @__PURE__ */ new Set()), u({ kind: "ok", text: `Loaded ${r}` });
365
+ u(n.map), C(/* @__PURE__ */ new Set()), h({ kind: "ok", text: `Loaded ${r}` });
367
366
  } catch (t) {
368
367
  const A = t instanceof Error ? t.message : "network error";
369
- u({ kind: "err", text: `Load failed: ${A}` });
368
+ h({ kind: "err", text: `Load failed: ${A}` });
370
369
  }
371
370
  }, [U, r]), I = E(async (e, t, A = {}) => {
372
371
  if (A.confirmText && !window.confirm(A.confirmText)) return !1;
373
- u(null);
372
+ h(null);
374
373
  try {
375
- const a = await fetch(`${U}/api/maps/p${e}/${t}`, {
374
+ const n = await fetch(`${U}/api/maps/p${e}/${t}`, {
376
375
  method: "PUT",
377
376
  headers: { "Content-Type": "text/plain" },
378
- body: ne
377
+ body: re
379
378
  });
380
- return a.ok ? (u({ kind: "ok", text: `Saved p${e}/${t}.map` }), d(`p${e}/${t}.map`), await F(), !0) : (u({ kind: "err", text: `Save failed: ${await de(a)}` }), !1);
381
- } catch (a) {
382
- const s = a instanceof Error ? a.message : "network error";
383
- return u({ kind: "err", text: `Save failed: ${s}` }), !1;
379
+ return n.ok ? (h({ kind: "ok", text: `Saved p${e}/${t}.map` }), f(`p${e}/${t}.map`), await M(), !0) : (h({ kind: "err", text: `Save failed: ${await ge(n)}` }), !1);
380
+ } catch (n) {
381
+ const s = n instanceof Error ? n.message : "network error";
382
+ return h({ kind: "err", text: `Save failed: ${s}` }), !1;
384
383
  }
385
- }, [U, ne, F]), Ce = E(async () => {
386
- const e = K(r);
384
+ }, [U, re, M]), Ne = E(async () => {
385
+ const e = Z(r);
387
386
  if (!e) {
388
- u({ kind: "err", text: 'Pick a map first or use "Save as new".' });
387
+ h({ kind: "err", text: 'Pick a map first or use "Save as new".' });
389
388
  return;
390
389
  }
391
390
  const t = parseInt(e.nn, 10);
392
- if (g < t) {
393
- u({
391
+ if (d < t) {
392
+ h({
394
393
  kind: "err",
395
- text: `p${e.nn} maps need ≥${t} spawns — current map has ${g}.`
394
+ text: `p${e.nn} maps need ≥${t} spawns — current map has ${d}.`
396
395
  });
397
396
  return;
398
397
  }
399
398
  await I(e.nn, e.name, { confirmText: `Overwrite ${r}?` });
400
- }, [r, g, I]), xe = E(async () => {
401
- if (g < 2) {
402
- u({ kind: "err", text: `Place at least 2 spawns before saving (have ${g}).` });
399
+ }, [r, d, I]), Re = E(async () => {
400
+ if (d < 2) {
401
+ h({ kind: "err", text: `Place at least 2 spawns before saving (have ${d}).` });
403
402
  return;
404
403
  }
405
- if (p < 2 || p > g || p > 10) {
406
- u({
404
+ if (p < 2 || p > d || p > 10) {
405
+ h({
407
406
  kind: "err",
408
- text: `Target ${p} invalid — must be 2..${Math.min(10, g)} for this map.`
407
+ text: `Target ${p} invalid — must be 2..${Math.min(10, d)} for this map.`
409
408
  });
410
409
  return;
411
410
  }
412
411
  const e = String(p).padStart(2, "0"), t = Q.trim();
413
412
  if (!/^[A-Za-z0-9_-]+$/.test(t)) {
414
- u({ kind: "err", text: "New name: alphanumeric / underscore / hyphen, no .map suffix." });
413
+ h({ kind: "err", text: "New name: alphanumeric / underscore / hyphen, no .map suffix." });
415
414
  return;
416
415
  }
417
- const A = `p${e}/${t}.map`, s = (B.find((h) => h.players === p)?.files ?? []).includes(`${t}.map`) ? `Overwrite ${A}?` : void 0;
418
- await I(e, t, { confirmText: s }) && S("");
419
- }, [g, p, Q, B, I]), Qe = E(async () => {
420
- const e = K(r);
416
+ const A = `p${e}/${t}.map`, s = (B.find((w) => w.players === p)?.files ?? []).includes(`${t}.map`) ? `Overwrite ${A}?` : void 0;
417
+ await I(e, t, { confirmText: s }) && O("");
418
+ }, [d, p, Q, B, I]), Ee = E(async () => {
419
+ const e = Z(r);
421
420
  if (!e) {
422
- u({ kind: "err", text: "Pick a map first." });
421
+ h({ kind: "err", text: "Pick a map first." });
423
422
  return;
424
423
  }
425
424
  if (window.confirm(`Delete ${r}?`)) {
426
- u(null);
425
+ h(null);
427
426
  try {
428
427
  const t = await fetch(`${U}/api/maps/p${e.nn}/${e.name}`, { method: "DELETE" });
429
428
  if (!t.ok) {
430
- u({ kind: "err", text: `Delete failed: ${await de(t)}` });
429
+ h({ kind: "err", text: `Delete failed: ${await ge(t)}` });
431
430
  return;
432
431
  }
433
- u({ kind: "ok", text: `Deleted ${r}` }), d(""), await F();
432
+ h({ kind: "ok", text: `Deleted ${r}` }), f(""), await M();
434
433
  } catch (t) {
435
434
  const A = t instanceof Error ? t.message : "network error";
436
- u({ kind: "err", text: `Delete failed: ${A}` });
435
+ h({ kind: "err", text: `Delete failed: ${A}` });
437
436
  }
438
437
  }
439
- }, [U, r, F]), Ne = P(() => {
440
- const e = B.find((A) => A.players === p)?.files ?? [], t = new Set(e);
441
- for (let A = 1; A <= 99; A++) {
442
- const a = `m${String(A).padStart(2, "0")}.map`;
443
- if (!t.has(a)) return a.replace(/\.map$/, "");
444
- }
445
- return "custom";
446
- }, [B, p]), v = P(() => {
438
+ }, [U, r, M]), _e = P(() => gt(B, p), [B, p]), v = P(() => {
447
439
  if (typeof window > "u") return 32;
448
- const e = (window.innerWidth - 360) / n.width, t = (window.innerHeight - 160) / n.height;
440
+ const e = (window.innerWidth - 360) / a.width, t = (window.innerHeight - 160) / a.height;
449
441
  return Math.max(16, Math.floor(Math.min(e, t)));
450
- }, [n.width, n.height]);
451
- q(() => {
452
- if (!J) return;
453
- const e = Y.current;
442
+ }, [a.width, a.height]);
443
+ J(() => {
444
+ if (!Y) return;
445
+ const e = K.current;
454
446
  if (!e) return;
455
447
  const t = e.getContext("2d");
456
448
  if (!t) return;
457
- const A = typeof window < "u" && window.devicePixelRatio || 1, a = n.width * v, s = n.height * v;
458
- (e.width !== a * A || e.height !== s * A) && (e.width = a * A, e.height = s * A), e.style.width = `${a}px`, e.style.height = `${s}px`, t.setTransform(A, 0, 0, A, 0, 0), t.imageSmoothingEnabled = !1, t.clearRect(0, 0, a, s);
459
- const l = ee.current, h = l.floor, N = l.soft_block;
460
- for (let x = 0; x < n.height; x++)
461
- for (let y = 0; y < n.width; y++) {
462
- const W = y * v, L = x * v, T = n.grid[x][y], re = T === "H", se = /^[1-9A]$/.test(T), Re = !re && !se && i.has(`${y},${x}`);
463
- if (h && t.drawImage(h, W, L, v, v), re) {
464
- const V = l[at(n.grid, y, x)];
449
+ const A = typeof window < "u" && window.devicePixelRatio || 1, n = a.width * v, s = a.height * v;
450
+ (e.width !== n * A || e.height !== s * A) && (e.width = n * A, e.height = s * A), e.style.width = `${n}px`, e.style.height = `${s}px`, t.setTransform(A, 0, 0, A, 0, 0), t.imageSmoothingEnabled = !1, t.clearRect(0, 0, n, s);
451
+ const i = Ae.current, w = i.floor, N = i.soft_block;
452
+ for (let x = 0; x < a.height; x++)
453
+ for (let y = 0; y < a.width; y++) {
454
+ const W = y * v, L = x * v, T = a.grid[x][y], se = T === "H", oe = /^[1-9A]$/.test(T), ye = !se && !oe && l.has(`${y},${x}`);
455
+ if (w && t.drawImage(w, W, L, v, v), se) {
456
+ const V = i[st(a.grid, y, x)];
465
457
  V && t.drawImage(V, W, L, v, v);
466
- } else if (Re)
458
+ } else if (ye)
467
459
  N && t.drawImage(N, W, L, v, v);
468
- else if (se) {
469
- const V = l[`char:${At(T)}`];
460
+ else if (oe) {
461
+ const V = i[`char:${rt(T)}`];
470
462
  V && t.drawImage(V, W, L, v, v);
471
- const Ee = Math.max(10, Math.floor(v / 4));
472
- t.font = `800 ${Ee}px ui-sans-serif, system-ui, sans-serif`, t.textAlign = "right", t.textBaseline = "top", t.lineWidth = 3, t.strokeStyle = "#000", t.fillStyle = "#fff";
473
- const oe = W + v - 2, le = L + 2;
474
- t.strokeText(T, oe, le), t.fillText(T, oe, le);
463
+ const ke = Math.max(10, Math.floor(v / 4));
464
+ t.font = `800 ${ke}px ui-sans-serif, system-ui, sans-serif`, t.textAlign = "right", t.textBaseline = "top", t.lineWidth = 3, t.strokeStyle = "#000", t.fillStyle = "#fff";
465
+ const le = W + v - 2, ie = L + 2;
466
+ t.strokeText(T, le, ie), t.fillText(T, le, ie);
475
467
  }
476
468
  }
477
- }, [n, i, v, J]);
478
- const $ = "px-3 py-1.5 text-sm bg-bg-card border border-border rounded hover:bg-bg-hover whitespace-nowrap", j = "inline-block min-w-[20px] px-1.5 py-0.5 mx-0.5 bg-bg border border-border rounded text-[11px] font-mono font-semibold text-text";
479
- return /* @__PURE__ */ f("div", { className: "flex w-full h-full overflow-hidden bg-bg text-text", children: [
480
- /* @__PURE__ */ f("div", { className: "flex-1 flex flex-col items-center min-w-0 overflow-auto p-4", children: [
481
- /* @__PURE__ */ f("div", { className: "w-full max-w-6xl flex items-center gap-3 mb-3 flex-nowrap overflow-x-auto", children: [
482
- /* @__PURE__ */ f("div", { className: "flex items-center gap-2 shrink-0", children: [
483
- /* @__PURE__ */ o("button", { onClick: () => c("/"), className: $, children: "← Home" }),
469
+ }, [a, l, v, Y]);
470
+ const ee = "px-3 py-1.5 text-sm bg-bg-card border border-border rounded hover:bg-bg-hover whitespace-nowrap", j = "inline-block min-w-[20px] px-1.5 py-0.5 mx-0.5 bg-bg border border-border rounded text-[11px] font-mono font-semibold text-text";
471
+ return /* @__PURE__ */ m("div", { className: "flex w-full h-full overflow-hidden bg-bg text-text", children: [
472
+ /* @__PURE__ */ m("div", { className: "flex-1 flex flex-col items-center min-w-0 overflow-auto p-4", children: [
473
+ /* @__PURE__ */ m("div", { className: "w-full max-w-6xl flex items-center gap-3 mb-3 flex-nowrap overflow-x-auto", children: [
474
+ /* @__PURE__ */ m("div", { className: "flex items-center gap-2 shrink-0", children: [
475
+ /* @__PURE__ */ o("button", { onClick: () => {
476
+ c("/");
477
+ }, className: ee, children: "← Home" }),
484
478
  /* @__PURE__ */ o("h1", { className: "text-xl font-bold ml-1", children: "Map Editor" })
485
479
  ] }),
486
- /* @__PURE__ */ f("div", { className: "flex items-center gap-2 shrink-0", children: [
480
+ /* @__PURE__ */ m("div", { className: "flex items-center gap-2 shrink-0", children: [
487
481
  /* @__PURE__ */ o("label", { className: "text-sm text-text-secondary", children: "Default for:" }),
488
482
  /* @__PURE__ */ o(
489
483
  "select",
490
484
  {
491
- value: m,
492
- onChange: (e) => he(parseInt(e.target.value, 10)),
485
+ value: g,
486
+ onChange: (e) => be(parseInt(e.target.value, 10)),
493
487
  className: "px-2 py-1 bg-bg-card border border-border rounded text-sm",
494
- children: [2, 3, 4, 5, 6, 7, 8, 9, 10].map((e) => /* @__PURE__ */ f("option", { value: e, children: [
488
+ children: [2, 3, 4, 5, 6, 7, 8, 9, 10].map((e) => /* @__PURE__ */ m("option", { value: e, children: [
495
489
  e,
496
490
  " players"
497
491
  ] }, e))
@@ -504,8 +498,8 @@ ${a}
504
498
  type: "number",
505
499
  min: 5,
506
500
  max: 31,
507
- value: n.width,
508
- onChange: (e) => Ae(parseInt(e.target.value, 10) || n.width, n.height),
501
+ value: a.width,
502
+ onChange: (e) => ne(parseInt(e.target.value, 10) || a.width, a.height),
509
503
  className: "w-16 px-2 py-1 bg-bg-card border border-border rounded text-sm"
510
504
  }
511
505
  ),
@@ -516,52 +510,52 @@ ${a}
516
510
  type: "number",
517
511
  min: 5,
518
512
  max: 31,
519
- value: n.height,
520
- onChange: (e) => Ae(n.width, parseInt(e.target.value, 10) || n.height),
513
+ value: a.height,
514
+ onChange: (e) => ne(a.width, parseInt(e.target.value, 10) || a.height),
521
515
  className: "w-16 px-2 py-1 bg-bg-card border border-border rounded text-sm"
522
516
  }
523
517
  )
524
518
  ] }),
525
- /* @__PURE__ */ f("div", { className: "flex items-center gap-2 shrink-0 ml-auto", children: [
526
- /* @__PURE__ */ f("span", { className: "text-sm text-text-secondary whitespace-nowrap", children: [
519
+ /* @__PURE__ */ m("div", { className: "flex items-center gap-2 shrink-0 ml-auto", children: [
520
+ /* @__PURE__ */ m("span", { className: "text-sm text-text-secondary whitespace-nowrap", children: [
527
521
  "Spawns: ",
528
- /* @__PURE__ */ o("span", { className: "font-bold text-text", children: g }),
522
+ /* @__PURE__ */ o("span", { className: "font-bold text-text", children: d }),
529
523
  "/10"
530
524
  ] }),
531
- /* @__PURE__ */ o("button", { onClick: we, className: $, children: "Clear interior" }),
525
+ /* @__PURE__ */ o("button", { onClick: we, className: ee, children: "Clear interior" }),
532
526
  /* @__PURE__ */ o(
533
527
  "button",
534
528
  {
535
- onClick: i.size > 0 ? Be : be,
536
- className: $,
529
+ onClick: l.size > 0 ? xe : Ce,
530
+ className: ee,
537
531
  title: "Preview a random soft-block layout. Re-click to re-roll.",
538
- children: i.size > 0 ? `Hide softs (${i.size})` : "Roll softs"
532
+ children: l.size > 0 ? `Hide softs (${l.size})` : "Roll softs"
539
533
  }
540
534
  )
541
535
  ] })
542
536
  ] }),
543
- /* @__PURE__ */ f("div", { className: "text-xs text-text-secondary mb-2 max-w-6xl w-full flex flex-wrap items-center gap-x-4 gap-y-1", children: [
544
- /* @__PURE__ */ f("span", { children: [
537
+ /* @__PURE__ */ m("div", { className: "text-xs text-text-secondary mb-2 max-w-6xl w-full flex flex-wrap items-center gap-x-4 gap-y-1", children: [
538
+ /* @__PURE__ */ m("span", { children: [
545
539
  /* @__PURE__ */ o("span", { className: j, children: "LMB" }),
546
540
  " wall  ·  drag to paint"
547
541
  ] }),
548
- /* @__PURE__ */ f("span", { children: [
542
+ /* @__PURE__ */ m("span", { children: [
549
543
  /* @__PURE__ */ o("span", { className: j, children: "RMB" }),
550
544
  " floor (erase)  ·  drag to wipe"
551
545
  ] }),
552
- /* @__PURE__ */ f("span", { children: [
546
+ /* @__PURE__ */ m("span", { children: [
553
547
  /* @__PURE__ */ o("span", { className: j, children: "Shift" }),
554
548
  "+",
555
549
  /* @__PURE__ */ o("span", { className: j, children: "LMB" }),
556
550
  " place spawn ",
557
- st(n.grid) ?? "—",
551
+ it(a.grid) ?? "—",
558
552
  "  ·  click an existing spawn to remove"
559
553
  ] })
560
554
  ] }),
561
555
  /* @__PURE__ */ o(
562
556
  "canvas",
563
557
  {
564
- ref: Y,
558
+ ref: K,
565
559
  className: "border border-border rounded select-none",
566
560
  style: {
567
561
  background: "#1a1a1a",
@@ -569,22 +563,22 @@ ${a}
569
563
  imageRendering: "pixelated"
570
564
  },
571
565
  onContextMenu: (e) => e.preventDefault(),
572
- onMouseDown: me,
573
- onMouseMove: ue,
574
- onMouseUp: pe
566
+ onMouseDown: ue,
567
+ onMouseMove: pe,
568
+ onMouseUp: he
575
569
  }
576
570
  ),
577
- !J && /* @__PURE__ */ o("div", { className: "text-xs text-text-secondary mt-2", children: "Loading tiles…" })
571
+ !Y && /* @__PURE__ */ o("div", { className: "text-xs text-text-secondary mt-2", children: "Loading tiles…" })
578
572
  ] }),
579
- /* @__PURE__ */ f("div", { className: "w-80 flex flex-col gap-4 p-4 border-l border-border bg-bg-card overflow-auto shrink-0", children: [
580
- /* @__PURE__ */ f("div", { children: [
581
- /* @__PURE__ */ f("div", { className: "flex items-center justify-between mb-2", children: [
573
+ /* @__PURE__ */ m("div", { className: "w-80 flex flex-col gap-4 p-4 border-l border-border bg-bg-card overflow-auto shrink-0", children: [
574
+ /* @__PURE__ */ m("div", { children: [
575
+ /* @__PURE__ */ m("div", { className: "flex items-center justify-between mb-2", children: [
582
576
  /* @__PURE__ */ o("h2", { className: "text-base font-bold", children: "Saved maps" }),
583
577
  /* @__PURE__ */ o(
584
578
  "button",
585
579
  {
586
580
  onClick: () => {
587
- F();
581
+ M();
588
582
  },
589
583
  disabled: _,
590
584
  className: "text-xs px-2 py-0.5 bg-bg border border-border rounded hover:bg-bg-hover disabled:opacity-50",
@@ -593,11 +587,11 @@ ${a}
593
587
  }
594
588
  )
595
589
  ] }),
596
- /* @__PURE__ */ f(
590
+ /* @__PURE__ */ m(
597
591
  "select",
598
592
  {
599
593
  value: r,
600
- onChange: (e) => d(e.target.value),
594
+ onChange: (e) => f(e.target.value),
601
595
  size: 10,
602
596
  className: "w-full p-2 bg-bg border border-border rounded font-mono text-xs",
603
597
  children: [
@@ -609,12 +603,12 @@ ${a}
609
603
  ]
610
604
  }
611
605
  ),
612
- /* @__PURE__ */ f("div", { className: "mt-2 grid grid-cols-3 gap-2", children: [
606
+ /* @__PURE__ */ m("div", { className: "mt-2 grid grid-cols-3 gap-2", children: [
613
607
  /* @__PURE__ */ o(
614
608
  "button",
615
609
  {
616
610
  onClick: () => {
617
- ve();
611
+ Qe();
618
612
  },
619
613
  disabled: !r,
620
614
  className: "px-2 py-1.5 bg-accent text-bg rounded text-sm font-semibold hover:opacity-90 disabled:opacity-40",
@@ -625,7 +619,7 @@ ${a}
625
619
  "button",
626
620
  {
627
621
  onClick: () => {
628
- Ce();
622
+ Ne();
629
623
  },
630
624
  disabled: !r,
631
625
  className: "px-2 py-1.5 bg-bg border border-border rounded text-sm font-semibold hover:bg-bg-hover disabled:opacity-40",
@@ -636,7 +630,7 @@ ${a}
636
630
  "button",
637
631
  {
638
632
  onClick: () => {
639
- Qe();
633
+ Ee();
640
634
  },
641
635
  disabled: !r,
642
636
  className: "px-2 py-1.5 bg-bg border border-error text-error rounded text-sm font-semibold hover:bg-bg-hover disabled:opacity-40",
@@ -645,34 +639,34 @@ ${a}
645
639
  )
646
640
  ] })
647
641
  ] }),
648
- /* @__PURE__ */ f("div", { children: [
642
+ /* @__PURE__ */ m("div", { children: [
649
643
  /* @__PURE__ */ o("h3", { className: "text-sm font-bold mb-2", children: "Save as new" }),
650
- /* @__PURE__ */ f("label", { className: "flex items-center gap-2 mb-2 text-xs text-text-secondary", children: [
644
+ /* @__PURE__ */ m("label", { className: "flex items-center gap-2 mb-2 text-xs text-text-secondary", children: [
651
645
  /* @__PURE__ */ o("span", { className: "shrink-0", children: "Save under group:" }),
652
646
  /* @__PURE__ */ o(
653
647
  "select",
654
648
  {
655
649
  value: p,
656
- onChange: (e) => ae(parseInt(e.target.value, 10)),
650
+ onChange: (e) => $(parseInt(e.target.value, 10)),
657
651
  className: "flex-1 min-w-0 px-2 py-1 bg-bg border border-border rounded font-mono text-xs",
658
- disabled: g < 2,
652
+ disabled: d < 2,
659
653
  children: [2, 3, 4, 5, 6, 7, 8, 9, 10].map((e) => {
660
- const t = e > g;
661
- return /* @__PURE__ */ f("option", { value: e, disabled: t, children: [
654
+ const t = e > d;
655
+ return /* @__PURE__ */ m("option", { value: e, disabled: t, children: [
662
656
  "p",
663
657
  String(e).padStart(2, "0"),
664
658
  " (",
665
659
  e,
666
660
  "-player",
667
- t ? ` — need ${e} spawns` : e < g ? `, ${g - e} extra` : "",
661
+ t ? ` — need ${e} spawns` : e < d ? `, ${d - e} extra` : "",
668
662
  ")"
669
663
  ] }, e);
670
664
  })
671
665
  }
672
666
  )
673
667
  ] }),
674
- /* @__PURE__ */ f("div", { className: "flex items-center gap-2", children: [
675
- /* @__PURE__ */ f("code", { className: "text-xs bg-bg border border-border rounded px-2 py-1 font-mono", children: [
668
+ /* @__PURE__ */ m("div", { className: "flex items-center gap-2", children: [
669
+ /* @__PURE__ */ m("code", { className: "text-xs bg-bg border border-border rounded px-2 py-1 font-mono", children: [
676
670
  "p",
677
671
  String(p).padStart(2, "0"),
678
672
  "/"
@@ -682,8 +676,8 @@ ${a}
682
676
  {
683
677
  type: "text",
684
678
  value: Q,
685
- onChange: (e) => S(e.target.value),
686
- placeholder: Ne,
679
+ onChange: (e) => O(e.target.value),
680
+ placeholder: _e,
687
681
  className: "flex-1 min-w-0 px-2 py-1 bg-bg border border-border rounded font-mono text-xs"
688
682
  }
689
683
  ),
@@ -693,38 +687,38 @@ ${a}
693
687
  "button",
694
688
  {
695
689
  onClick: () => {
696
- xe();
690
+ Re();
697
691
  },
698
- disabled: Q.trim().length === 0 || g < p || p < 2,
692
+ disabled: Q.trim().length === 0 || d < p || p < 2,
699
693
  className: "mt-2 w-full px-3 py-1.5 bg-bg border border-border rounded text-sm font-semibold hover:bg-bg-hover disabled:opacity-50",
700
694
  children: "Save as new"
701
695
  }
702
696
  ),
703
- /* @__PURE__ */ f("p", { className: "mt-1 text-xs text-text-secondary leading-tight", children: [
697
+ /* @__PURE__ */ m("p", { className: "mt-1 text-xs text-text-secondary leading-tight", children: [
704
698
  "Writes to ",
705
- /* @__PURE__ */ f("code", { className: "bg-bg px-1 rounded", children: [
699
+ /* @__PURE__ */ m("code", { className: "bg-bg px-1 rounded", children: [
706
700
  "game/assets/maps/p",
707
701
  String(p).padStart(2, "0"),
708
702
  "/<name>.map"
709
703
  ] }),
710
704
  ".",
711
- g > p && /* @__PURE__ */ f(_e, { children: [
705
+ d > p && /* @__PURE__ */ m(Ue, { children: [
712
706
  " ",
713
- g - p,
707
+ d - p,
714
708
  " extra spawn",
715
- g - p === 1 ? "" : "s",
709
+ d - p === 1 ? "" : "s",
716
710
  " — the game shuffles + picks ",
717
711
  p,
718
712
  " of ",
719
- g,
713
+ d,
720
714
  " each round."
721
715
  ] })
722
716
  ] })
723
717
  ] }),
724
718
  k && /* @__PURE__ */ o("div", { className: `text-xs px-2 py-1 rounded border ${k.kind === "ok" ? "text-success border-success/30 bg-success/10" : "text-error border-error/30 bg-error/10"}`, children: k.text }),
725
- /* @__PURE__ */ f("div", { className: "text-xs text-text-secondary leading-snug", children: [
719
+ /* @__PURE__ */ m("div", { className: "text-xs text-text-secondary leading-snug", children: [
726
720
  /* @__PURE__ */ o("h3", { className: "font-bold text-text mb-1", children: "Notes" }),
727
- /* @__PURE__ */ f("ul", { className: "list-disc pl-4 space-y-1", children: [
721
+ /* @__PURE__ */ m("ul", { className: "list-disc pl-4 space-y-1", children: [
728
722
  /* @__PURE__ */ o("li", { children: "Load / Save / Delete hit the server directly. The operator git-commits the resulting diff." }),
729
723
  /* @__PURE__ */ o("li", { children: "Roll softs previews the world-build layout (80% softs on floor, with a 13-cell hashtag-shaped safety pattern at every spawn)." }),
730
724
  /* @__PURE__ */ o("li", { children: "Any grid edit invalidates the soft preview — re-roll to see the new layout." })
@@ -734,6 +728,6 @@ ${a}
734
728
  ] });
735
729
  }
736
730
  export {
737
- gt as default
731
+ pt as default
738
732
  };
739
- //# sourceMappingURL=MapEditor-DgbOaCT2.js.map
733
+ //# sourceMappingURL=MapEditor-yvJbXXgw.js.map