@florasync/leaflet-geokit 0.5.0 → 0.6.0

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.
@@ -1 +1 @@
1
- {"version":3,"file":"leaflet-geokit.external.es.js","sources":["../src/utils/logger.ts","../node_modules/leaflet/dist/images/marker-icon-2x.png","../node_modules/leaflet/dist/images/marker-icon.png","../node_modules/leaflet/dist/images/marker-shadow.png","../src/assets/cog.svg?url","../src/assets/layer-cake.svg?url","../node_modules/leaflet-ruler/dist/icon.png","../node_modules/leaflet-ruler/dist/icon-colored.png","../src/lib/leaflet-assets.ts","../node_modules/uuid/dist/esm-browser/rng.js","../node_modules/uuid/dist/esm-browser/stringify.js","../node_modules/uuid/dist/esm-browser/native.js","../node_modules/uuid/dist/esm-browser/v4.js","../src/utils/geojson.ts","../src/lib/FeatureStore.ts","../src/lib/draw/toolbar-patch.ts","../src/lib/draw/L.Draw.Cake.ts","../src/lib/draw/L.Draw.Move.ts","../src/lib/layer-cake/CakeBaker.ts","../src/lib/layer-cake/bindCakeControls.ts","../src/lib/layer-cake/ensureCircleEditable.ts","../src/lib/layer-cake/LayerCakeManager.ts","../src/assets/layer-cake.svg?raw","../src/assets/move-tool.svg?raw","../src/utils/geodesic.ts","../src/utils/ruler.ts","../src/utils/leaflet-guards.ts","../src/lib/MapController.ts","../src/components/LeafletDrawMapElement.ts","../src/types/events.ts","../src/external.ts"],"sourcesContent":["export type LogLevel = \"trace\" | \"debug\" | \"info\" | \"warn\" | \"error\" | \"silent\";\n\nexport interface Logger {\n level: LogLevel;\n trace: (...args: unknown[]) => void;\n debug: (...args: unknown[]) => void;\n info: (...args: unknown[]) => void;\n warn: (...args: unknown[]) => void;\n error: (...args: unknown[]) => void;\n child: (childName: string) => Logger;\n setLevel: (level: LogLevel) => void;\n}\n\nconst levelWeight: Record<Exclude<LogLevel, \"silent\">, number> = {\n trace: 10,\n debug: 20,\n info: 30,\n warn: 40,\n error: 50,\n};\n\nfunction shouldLog(\n current: LogLevel,\n msgLevel: Exclude<LogLevel, \"silent\">,\n): boolean {\n if (current === \"silent\") return false;\n return (\n levelWeight[msgLevel] >= levelWeight[current as Exclude<LogLevel, \"silent\">]\n );\n}\n\nfunction nowISO(): string {\n try {\n return new Date().toISOString();\n } catch {\n return \"\";\n }\n}\n\nexport function createLogger(\n name: string,\n level: LogLevel = \"debug\",\n sink: Console = console,\n): Logger {\n let currentLevel: LogLevel = level;\n\n const base =\n (lvl: Exclude<LogLevel, \"silent\">) =>\n (...args: unknown[]) => {\n try {\n if (!shouldLog(currentLevel, lvl)) return;\n const prefix = `[${nowISO()}][${name}][${lvl.toUpperCase()}]`;\n // Route to appropriate console method if exists, otherwise fallback to console.log\n const method = (sink as any)[lvl] as\n | ((...args: unknown[]) => void)\n | undefined;\n if (typeof method === \"function\") {\n method(prefix, ...args);\n } else {\n sink.log(prefix, ...args);\n }\n } catch {\n // Never throw from logger\n }\n };\n\n const api: Logger = {\n get level() {\n return currentLevel;\n },\n setLevel(lvl: LogLevel) {\n currentLevel = lvl;\n },\n trace: base(\"trace\"),\n debug: base(\"debug\"),\n info: base(\"info\"),\n warn: base(\"warn\"),\n error: base(\"error\"),\n child(childName: string) {\n return createLogger(`${name}:${childName}`, currentLevel, sink);\n },\n };\n\n return api;\n}\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAABSCAMAAAAhFXfZAAAC91BMVEVMaXEzeak2f7I4g7g3g7cua5gzeKg8hJo3grY4g7c3grU0gLI2frE0daAubJc2gbQwd6QzeKk2gLMtd5sxdKIua5g1frA2f7IydaM0e6w2fq41fK01eqo3grgubJgta5cxdKI1f7AydaQydaMxc6EubJgvbJkwcZ4ubZkwcJwubZgubJcydqUydKIxapgubJctbJcubZcubJcvbJYubJcvbZkubJctbJctbZcubJg2f7AubJcrbZcubJcubJcua5g3grY0fq8ubJcubJdEkdEwhsw6i88vhswuhcsuhMtBjMgthMsrg8srgss6is8qgcs8i9A9iMYtg8spgcoogMo7hcMngMonf8olfso4gr8kfck5iM8jfMk4iM8he8k1fro7itAgesk2hs8eecgzfLcofssdeMg0hc4cd8g2hcsxeLQbdsgZdcgxeLImfcszhM0vda4xgckzhM4xg84wf8Yxgs4udKsvfcQucqhUndROmdM1fK0wcZ8vb5w0eqpQm9MzeKhXoNVcpdYydKNWn9VZotVKltJFjsIwcJ1Rms9OlslLmtH///8+kc9epdYzd6dbo9VHkMM2f7FHmNBClM8ydqVcpNY9hro3gLM9hLczealQmcw3fa46f7A8gLMxc6I3eagyc6FIldJMl9JSnNRSntNNl9JPnNJFi75UnM9ZodVKksg8kM45jc09e6ZHltFBk883gbRBh7pDk9EwcaBzn784g7dKkcY2i81Om9M7j85Llc81is09g7Q4grY/j9A0eqxKmdFFltBEjcXf6fFImdBCiLxJl9FGlNFBi78yiMxVndEvbpo6js74+vx+psPP3+o/ks5HkcpGmNCjwdZCkNDM3ehYoNJEls+lxNkxh8xHks0+jdC1zd5Lg6r+/v/H2ufz9/o3jM3t8/edvdM/k89Th61OiLBSjbZklbaTt9BfptdjmL1AicBHj8hGk9FAgK1dkLNTjLRekrdClc/k7fM0icy0y9tgp9c4jc2NtM9Dlc8zicxeXZn3AAAAQ3RSTlMAHDdTb4yPA+LtnEQmC4L2EmHqB7XA0d0sr478x4/Yd5i1zOfyPkf1sLVq4Nh3FvjxopQ2/STNuFzUwFIwxKaejILpIBEV9wAABhVJREFUeF6s1NdyFEcYBeBeoQIhRAkLlRDGrhIgY3BJL8CVeKzuyXFzzjkn5ZxzzuScg3PO8cKzu70JkO0LfxdTU//pM9vTu7Xgf6KqOVTb9X7toRrVEfBf1HTVjZccrT/2by1VV928Yty9ZbVuucdz90frG8DBjl9pVApbOstvmMuvVgaNXSfAAd6pGxpy6yxf5ph43pS/4f3uoaGm2rdu72S9xzOvMymkZFq/ptDrk90mhW7e4zl7HLzhxGWPR20xmSxJ/VqldG5m9XhaVOA1DadsNh3Pu5L2N6QtPO/32JpqQBVVk20oy/Pi2s23WEvyfHbe1thadVQttvm7Llf65gGmXK67XtupyoM7HQhmXdLS8oGWJNeOJ3C5fG5XCEJnkez3/oFdsvgJ4l2ANZwhrJKk/7OSXa+3Vw2WJMlKnGkobouYk6T0TyX30klOUnTD9HJ5qpckL3EW/w4XF3Xd0FGywXUrstrclVsqz5Pd/sXFYyDnPdrLcQODmGOK47IZb4CmibmMn+MYRzFZ5jg33ZL/EJrWcszHmANy3ARBK/IXtciJy8VsitPSdE3uuHxzougojcUdr8/32atnz/ev3f/K5wtpxUTpcaI45zusVDpYtZi+jg0oU9b3x74h7+n9ABvYEZeKaVq0sh0AtLKsFtqNBdeT0MrSzwwlq9+x6xAO4tgOtSzbCjrNQQiNvQUbUEubvzBUeGw26yDCsRHCoLkTHDa7IdOLIThs/gHvChszh2CimE8peRs47cxANI0lYNB5y1DljpOF0IhzBDPOZnDOqYYbeGKECbPzWnXludPphw5c2YBq5zlwXphIbO4VDCZ0gnPfUO1TwZoYwAs2ExPCedAu9DAjfQUjzITQb3jNj0KG2Sgt6BHaQUdYzWz+XmBktOHwanXjaSTcwwziBcuMOtwBmqPrTOxFQR/DRKKPqyur0aiW6cULYsx6tBm0jXpR/AUWR6HRq9WVW6MRhIq5jLyjbaCTDCijyYJNpCajdyobP/eTw0iexBAKkJ3gA5KcQb2zBXsIBckn+xVv8jkZSaEFHE+jFEleAEfayRU0MouNoBmB/L50Ai/HSLIHxcrpCvnhSQAuakKp2C/YbCylJjXRVy/z3+Kv/RrNcCo+WUzlVEhzKffnTQnxeN9fWF88fiNCUdSTsaufaChKWInHeysygfpIqagoakW+vV20J8uyl6TyNKEZWV4oRSPyCkWpgOLSbkCObT8o2r6tlG58HQquf6O0v50tB7JM7F4EORd2dx/K0w/KHsVkLPaoYrwgP/y7krr3SSMA4zj+OBgmjYkxcdIJQyQRKgg2viX9Hddi9UBb29LrKR7CVVEEEXWojUkXNyfTNDE14W9gbHJNuhjDettN3ZvbOvdOqCD3Jp/9l+/wJE+9PkYGjx/fqkys3S2rMozM/o2106rfMUINo6hVqz+eu/hd1c4xTg0TAfy5kV+4UG6+IthHTU9woWmxuKNbTfuCSfovBCxq7EtHqvYL4Sm6F8GVxsSXHMQ07TOi1DKtZxjWaaIyi4CXWjxPccUw8WVbMYY5wxC1mzEyXMJWkllpRloi+Kkoq69sxBTlElF6aAxYUbjXNlhlDZilDnM4U5SlN5biRsRHnbx3mbeWjEh4mEyiuJDl5XcWVmX5GvNkFgLWZM5qwsop4/AWfLhU1cR7k1VVvcYCWRkOI6Xy5gmnphCYIkvzuNYzHzosq2oNk2RtSs8khfUOfHIDgR6ysYBaMpl4uEgk2U/oJTs9AaTSwma7dT69geAE2ZpEjUsn2ieJNHeKfrI3EcAGJ2ZaNgVuC8EBctCLc57P5u5led6IOBkIYkuQMrmmjChs4VkfOerHqSBkPzZlhe06RslZ3zMjk2sscqKwY0RcjKK+LWbzd7KiHhkncs/siFJ+V5eXxD34B8nVuJEpGJNmxN2gH3vSvp7J70tF+D1Ej8qUJD1TkErAND2GZwTFg/LubvmgiBG3SOvdlsqFQrkEzJCL1rstlnVFROixZoDDSuXQFHESwVGlcuQcMb/b42NgjLowh5MTDFE3vNB5qStRIErdCQEh6pLPR92anSUb/wAIhldAaDMpGgAAAABJRU5ErkJggg==\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAApCAYAAADAk4LOAAAFgUlEQVR4Aa1XA5BjWRTN2oW17d3YaZtr2962HUzbDNpjszW24mRt28p47v7zq/bXZtrp/lWnXr337j3nPCe85NcypgSFdugCpW5YoDAMRaIMqRi6aKq5E3YqDQO3qAwjVWrD8Ncq/RBpykd8oZUb/kaJutow8r1aP9II0WmLKLIsJyv1w/kqw9Ch2MYdB++12Onxee/QMwvf4/Dk/Lfp/i4nxTXtOoQ4pW5Aj7wpici1A9erdAN2OH64x8OSP9j3Ft3b7aWkTg/Fm91siTra0f9on5sQr9INejH6CUUUpavjFNq1B+Oadhxmnfa8RfEmN8VNAsQhPqF55xHkMzz3jSmChWU6f7/XZKNH+9+hBLOHYozuKQPxyMPUKkrX/K0uWnfFaJGS1QPRtZsOPtr3NsW0uyh6NNCOkU3Yz+bXbT3I8G3xE5EXLXtCXbbqwCO9zPQYPRTZ5vIDXD7U+w7rFDEoUUf7ibHIR4y6bLVPXrz8JVZEql13trxwue/uDivd3fkWRbS6/IA2bID4uk0UpF1N8qLlbBlXs4Ee7HLTfV1j54APvODnSfOWBqtKVvjgLKzF5YdEk5ewRkGlK0i33Eofffc7HT56jD7/6U+qH3Cx7SBLNntH5YIPvODnyfIXZYRVDPqgHtLs5ABHD3YzLuespb7t79FY34DjMwrVrcTuwlT55YMPvOBnRrJ4VXTdNnYug5ucHLBjEpt30701A3Ts+HEa73u6dT3FNWwflY86eMHPk+Yu+i6pzUpRrW7SNDg5JHR4KapmM5Wv2E8Tfcb1HoqqHMHU+uWDD7zg54mz5/2BSnizi9T1Dg4QQXLToGNCkb6tb1NU+QAlGr1++eADrzhn/u8Q2YZhQVlZ5+CAOtqfbhmaUCS1ezNFVm2imDbPmPng5wmz+gwh+oHDce0eUtQ6OGDIyR0uUhUsoO3vfDmmgOezH0mZN59x7MBi++WDL1g/eEiU3avlidO671bkLfwbw5XV2P8Pzo0ydy4t2/0eu33xYSOMOD8hTf4CrBtGMSoXfPLchX+J0ruSePw3LZeK0juPJbYzrhkH0io7B3k164hiGvawhOKMLkrQLyVpZg8rHFW7E2uHOL888IBPlNZ1FPzstSJM694fWr6RwpvcJK60+0HCILTBzZLFNdtAzJaohze60T8qBzyh5ZuOg5e7uwQppofEmf2++DYvmySqGBuKaicF1blQjhuHdvCIMvp8whTTfZzI7RldpwtSzL+F1+wkdZ2TBOW2gIF88PBTzD/gpeREAMEbxnJcaJHNHrpzji0gQCS6hdkEeYt9DF/2qPcEC8RM28Hwmr3sdNyht00byAut2k3gufWNtgtOEOFGUwcXWNDbdNbpgBGxEvKkOQsxivJx33iow0Vw5S6SVTrpVq11ysA2Rp7gTfPfktc6zhtXBBC+adRLshf6sG2RfHPZ5EAc4sVZ83yCN00Fk/4kggu40ZTvIEm5g24qtU4KjBrx/BTTH8ifVASAG7gKrnWxJDcU7x8X6Ecczhm3o6YicvsLXWfh3Ch1W0k8x0nXF+0fFxgt4phz8QvypiwCCFKMqXCnqXExjq10beH+UUA7+nG6mdG/Pu0f3LgFcGrl2s0kNNjpmoJ9o4B29CMO8dMT4Q5ox8uitF6fqsrJOr8qnwNbRzv6hSnG5wP+64C7h9lp30hKNtKdWjtdkbuPA19nJ7Tz3zR/ibgARbhb4AlhavcBebmTHcFl2fvYEnW0ox9xMxKBS8btJ+KiEbq9zA4RthQXDhPa0T9TEe69gWupwc6uBUphquXgf+/FrIjweHQS4/pduMe5ERUMHUd9xv8ZR98CxkS4F2n3EUrUZ10EYNw7BWm9x1GiPssi3GgiGRDKWRYZfXlON+dfNbM+GgIwYdwAAAAASUVORK5CYII=\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACkAAAApCAQAAAACach9AAACMUlEQVR4Ae3ShY7jQBAE0Aoz/f9/HTMzhg1zrdKUrJbdx+Kd2nD8VNudfsL/Th///dyQN2TH6f3y/BGpC379rV+S+qqetBOxImNQXL8JCAr2V4iMQXHGNJxeCfZXhSRBcQMfvkOWUdtfzlLgAENmZDcmo2TVmt8OSM2eXxBp3DjHSMFutqS7SbmemzBiR+xpKCNUIRkdkkYxhAkyGoBvyQFEJEefwSmmvBfJuJ6aKqKWnAkvGZOaZXTUgFqYULWNSHUckZuR1HIIimUExutRxwzOLROIG4vKmCKQt364mIlhSyzAf1m9lHZHJZrlAOMMztRRiKimp/rpdJDc9Awry5xTZCte7FHtuS8wJgeYGrex28xNTd086Dik7vUMscQOa8y4DoGtCCSkAKlNwpgNtphjrC6MIHUkR6YWxxs6Sc5xqn222mmCRFzIt8lEdKx+ikCtg91qS2WpwVfBelJCiQJwvzixfI9cxZQWgiSJelKnwBElKYtDOb2MFbhmUigbReQBV0Cg4+qMXSxXSyGUn4UbF8l+7qdSGnTC0XLCmahIgUHLhLOhpVCtw4CzYXvLQWQbJNmxoCsOKAxSgBJno75avolkRw8iIAFcsdc02e9iyCd8tHwmeSSoKTowIgvscSGZUOA7PuCN5b2BX9mQM7S0wYhMNU74zgsPBj3HU7wguAfnxxjFQGBE6pwN+GjME9zHY7zGp8wVxMShYX9NXvEWD3HbwJf4giO4CFIQxXScH1/TM+04kkBiAAAAAElFTkSuQmCC\"","export default \"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='430'%20height='430'%20style='width:100%25;height:100%25;transform:translate3d(0,0,0);content-visibility:visible'%20viewBox='0%200%20430%20430'%3e%3cdefs%3e%3cclipPath%20id='i'%3e%3cpath%20d='M0%200h430v430H0z'/%3e%3c/clipPath%3e%3cclipPath%20id='s'%3e%3cpath%20d='M0%200h430v430H0z'/%3e%3c/clipPath%3e%3cclipPath%20id='e'%3e%3cpath%20d='M0%200h430v430H0z'/%3e%3c/clipPath%3e%3cclipPath%20id='p'%3e%3cpath%20d='M0%200h430v430H0z'/%3e%3c/clipPath%3e%3cclipPath%20id='f'%3e%3cpath%20d='M0%200h430v430H0z'/%3e%3c/clipPath%3e%3cclipPath%20id='m'%3e%3cpath%20d='M0%200h430v430H0z'/%3e%3c/clipPath%3e%3cclipPath%20id='g'%3e%3cpath%20d='M0%200h430v430H0z'/%3e%3c/clipPath%3e%3cclipPath%20id='j'%3e%3cpath%20d='M0%200h430v430H0z'/%3e%3c/clipPath%3e%3cclipPath%20id='h'%3e%3cpath%20d='M0%200h430v430H0z'/%3e%3c/clipPath%3e%3cfilter%20id='t'%20width='300%25'%20height='300%25'%20x='-100%25'%20y='-100%25'%3e%3cfeGaussianBlur%20result='filter_result_0'/%3e%3c/filter%3e%3cfilter%20id='r'%20width='300%25'%20height='300%25'%20x='-100%25'%20y='-100%25'%3e%3cfeGaussianBlur%20result='filter_result_0'%20stdDeviation='52.5%2052.5'/%3e%3c/filter%3e%3cfilter%20id='n'%20width='300%25'%20height='300%25'%20x='-100%25'%20y='-100%25'%3e%3cfeGaussianBlur%20result='filter_result_0'/%3e%3c/filter%3e%3cfilter%20id='k'%20width='300%25'%20height='300%25'%20x='-100%25'%20y='-100%25'%3e%3cfeGaussianBlur%20result='filter_result_0'/%3e%3c/filter%3e%3cmask%20id='u'%20mask-type='alpha'%3e%3cuse%20xmlns:ns1='http://www.w3.org/1999/xlink'%20ns1:href='%23a'/%3e%3c/mask%3e%3cmask%20id='q'%20mask-type='alpha'%3e%3cuse%20xmlns:ns2='http://www.w3.org/1999/xlink'%20ns2:href='%23b'/%3e%3c/mask%3e%3cmask%20id='o'%20mask-type='alpha'%3e%3cuse%20xmlns:ns3='http://www.w3.org/1999/xlink'%20ns3:href='%23c'/%3e%3c/mask%3e%3cmask%20id='l'%20mask-type='alpha'%3e%3cuse%20xmlns:ns4='http://www.w3.org/1999/xlink'%20ns4:href='%23d'/%3e%3c/mask%3e%3cg%20id='a'%20fill-opacity='0'%20stroke-linecap='round'%20stroke-linejoin='round'%20clip-path='url(%23e)'%20style='display:none'%3e%3cpath%20class='secondary'%20style='display:none'/%3e%3cpath%20class='primary'%20style='display:none'/%3e%3c/g%3e%3cg%20id='b'%20fill-opacity='0'%20stroke-linecap='round'%20stroke-linejoin='round'%20stroke-width='12'%20clip-path='url(%23f)'%20style='display:block'%3e%3cpath%20stroke='%2308A88A'%20d='M44.446-66.518a79.998%2079.998%200%200%200-101.012%209.952A79.998%2079.998%200%201%200%2056.569%2056.569%2080.005%2080.005%200%200%200%2073.91-30.615a80.001%2080.001%200%200%200-29.464-35.903z'%20class='secondary'%20style='display:block'%20transform='translate(215%20214)'/%3e%3cpath%20stroke='%23121331'%20d='m141.409%2025.241%208.727%205.041s0%200%200%200a22.3%2022.3%200%200%201%2010.411%2013.542%2022.32%2022.32%200%200%201-2.221%2016.937l-26.515%2045.924a22.325%2022.325%200%200%201-30.497%208.172l-8.754-5.059a143.414%20143.414%200%200%201-43.718%2025.286v10.108a22.302%2022.302%200%200%201-13.778%2020.612%2022.303%2022.303%200%200%201-8.539%201.696h-53.029a22.303%2022.303%200%200%201-15.779-6.531%2022.302%2022.302%200%200%201-6.537-15.777v-10.073a143.416%20143.416%200%200%201-43.719-25.285l-8.754%205.059a22.325%2022.325%200%200%201-30.497-8.172l-26.523-45.924a22.315%2022.315%200%200%201-2.238-16.943A22.31%2022.31%200%200%201-150.142%2030.3l8.727-5.041a145.097%20145.097%200%200%201%200-50.518l-8.727-5.041a22.294%2022.294%200%200%201-10.409-13.554%2022.306%2022.306%200%200%201%202.238-16.943l26.514-45.924a22.325%2022.325%200%200%201%2030.497-8.172l8.754%205.059a143.416%20143.416%200%200%201%2043.719-25.285v-10.073a22.302%2022.302%200%200%201%206.537-15.777%2022.3%2022.3%200%200%201%2015.779-6.531h53.02a22.307%2022.307%200%200%201%2022.317%2022.308v10.037a143.41%20143.41%200%200%201%2043.718%2025.285l8.754-5.059a22.325%2022.325%200%200%201%2030.497%208.172l26.515%2045.942a22.313%2022.313%200%200%201-1.618%2024.757%2022.294%2022.294%200%200%201-6.554%205.74l-8.727%205.041a145.097%20145.097%200%200%201%200%2050.518z'%20class='primary'%20style='display:block'%20transform='rotate(-120%20169.576%2045.095)'/%3e%3c/g%3e%3cg%20id='c'%20fill-opacity='0'%20stroke-linecap='round'%20stroke-linejoin='round'%20clip-path='url(%23g)'%20style='display:none'%3e%3cpath%20class='secondary'%20style='display:none'/%3e%3cpath%20class='primary'%20style='display:none'/%3e%3c/g%3e%3cg%20id='d'%20fill-opacity='0'%20stroke-linecap='round'%20stroke-linejoin='round'%20clip-path='url(%23h)'%20style='display:none'%3e%3cpath%20class='secondary'%20style='display:none'/%3e%3cpath%20class='primary'%20style='display:none'/%3e%3c/g%3e%3c/defs%3e%3cg%20clip-path='url(%23i)'%3e%3cg%20clip-path='url(%23j)'%20filter='url(%23k)'%20mask='url(%23l)'%20style='display:none'%3e%3cg%20class='design'%3e%3cpath%20class='primary'/%3e%3c/g%3e%3cg%20class='design'%3e%3cpath%20class='secondary'/%3e%3c/g%3e%3c/g%3e%3cg%20clip-path='url(%23m)'%20filter='url(%23n)'%20mask='url(%23o)'%20style='display:none'%3e%3cg%20class='design'%3e%3cpath%20class='primary'/%3e%3c/g%3e%3cg%20class='design'%3e%3cpath%20class='secondary'/%3e%3c/g%3e%3c/g%3e%3cg%20clip-path='url(%23p)'%20mask='url(%23q)'%20style='display:block'%3e%3cg%20filter='url(%23r)'%20transform='rotate(-94%20238.762%20-16.565)%20scale(2.4)'%3e%3cg%20class='design'%3e%3cpath%20fill='%234BE1EC'%20d='M0-250c137.975%200%20250%20112.025%20250%20250S137.975%20250%200%20250-250%20137.975-250%200-137.975-250%200-250z'%20class='primary'/%3e%3c/g%3e%3cg%20class='design'%3e%3cpath%20fill='%23CB5EEE'%20d='M113.242-295.384c97.478%200%20176.5%2079.022%20176.5%20176.5s-79.022%20176.5-176.5%20176.5c-43.948%200-74.396-34.057-105.29-60.631-37.631-32.369-71.21-62.338-71.21-115.869%200-97.478%2079.022-176.5%20176.5-176.5z'%20class='secondary'/%3e%3c/g%3e%3c/g%3e%3c/g%3e%3cg%20clip-path='url(%23s)'%20filter='url(%23t)'%20mask='url(%23u)'%20style='display:none'%3e%3cg%20class='design'%3e%3cpath%20class='primary'/%3e%3c/g%3e%3cg%20class='design'%3e%3cpath%20class='secondary'/%3e%3c/g%3e%3c/g%3e%3c/g%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3c?xml%20version='1.0'%20encoding='utf-8'?%3e%3c!--%20Uploaded%20to:%20SVG%20Repo,%20www.svgrepo.com,%20Generator:%20SVG%20Repo%20Mixer%20Tools%20--%3e%3csvg%20width='800px'%20height='800px'%20viewBox='0%20-1.67%2047.336%2047.336'%20xmlns='http://www.w3.org/2000/svg'%3e%3cg%20id='Group_42'%20data-name='Group%2042'%20transform='translate(-172.455%20-364.36)'%3e%3cpath%20id='Rectangle_17'%20data-name='Rectangle%2017'%20d='M4.351,0H40.984a4.351,4.351,0,0,1,4.351,4.351V22.117a1,1,0,0,1-1,1H1a1,1,0,0,1-1-1V4.351A4.351,4.351,0,0,1,4.351,0Z'%20transform='translate(173.455%20384.243)'%20fill='none'%20stroke='%23000000'%20stroke-linecap='round'%20stroke-linejoin='round'%20stroke-width='2'/%3e%3cpath%20id='Path_90'%20data-name='Path%2090'%20d='M218.79,390.249a3.778,3.778,0,0,1-3.778,3.778h0a3.779,3.779,0,0,1-3.778-3.778,3.778,3.778,0,0,1-3.778,3.778h0a3.779,3.779,0,0,1-3.778-3.778,3.778,3.778,0,0,1-3.778,3.778h0a3.779,3.779,0,0,1-3.778-3.778,3.778,3.778,0,0,1-3.778,3.778h0a3.779,3.779,0,0,1-3.778-3.778,3.778,3.778,0,0,1-3.778,3.778h0a3.779,3.779,0,0,1-3.778-3.778,3.778,3.778,0,0,1-3.778,3.778h0a3.778,3.778,0,0,1-3.777-3.778'%20fill='none'%20stroke='%23000000'%20stroke-linecap='round'%20stroke-linejoin='round'%20stroke-width='2'/%3e%3cg%20id='Group_41'%20data-name='Group%2041'%3e%3cpath%20id='Rectangle_18'%20data-name='Rectangle%2018'%20d='M4.351,0H26.473a4.351,4.351,0,0,1,4.351,4.351V17.883a1,1,0,0,1-1,1H1a1,1,0,0,1-1-1V4.351A4.351,4.351,0,0,1,4.351,0Z'%20transform='translate(180.71%20365.36)'%20fill='none'%20stroke='%23000000'%20stroke-linecap='round'%20stroke-linejoin='round'%20stroke-width='2'/%3e%3cpath%20id='Path_91'%20data-name='Path%2091'%20d='M211.234,370.794a3.778,3.778,0,0,1-3.778,3.778h0a3.779,3.779,0,0,1-3.778-3.778,3.778,3.778,0,0,1-3.778,3.778h0a3.779,3.779,0,0,1-3.778-3.778,3.778,3.778,0,0,1-3.778,3.778h0a3.779,3.779,0,0,1-3.778-3.778,3.778,3.778,0,0,1-3.778,3.778h0a3.779,3.779,0,0,1-3.778-3.778'%20fill='none'%20stroke='%23000000'%20stroke-linecap='round'%20stroke-linejoin='round'%20stroke-width='2'/%3e%3c/g%3e%3c/g%3e%3c/svg%3e\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAQAAABKfvVzAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAAmJLR0QAAKqNIzIAAAAJcEhZcwAADdcAAA3XAUIom3gAAAAHdElNRQfhBQoMHg6McuYvAAABwklEQVQ4y43TP0jUYRgH8M/daQpqdujhnwShGiwyipCIoIgWxyIwrqEhnCQoGqKhpoYMg1qCQjg8TC2JCtSkjCgaKisIhyQUwpJssD9KZWRZg6d450/yGV54n/fzfd53eUOCaoNa5QpNGNPr9cKjUAatdsB++co0G1XiiHd+uqnTq8VzI874o9s2Ic1iiEpii9tmnJOdfkOldt/dU+HYolHnjdmpRNzbuVaNL86m4sXqNOrz3kMXHFKYMqd8VREGBToMifqLgwY1yNZirya5knaBqH16fJjNJiWEFSlxy4g980+pMuZkir/UJjLbrvNRPnINaLUygK/yQpuImHp47LOjuKJPOJA/1y4iZsAlyozLs8IO42L/4QlhGrSCy5oCeKH+dM59vVbL9sn6AP5MRzpnVKtN1viRxit1WRvEmVKFrQbTpoddNR3E+aYKuw1lPOapa0GcEf22KzOtejmcG1rkYdjEAn59KU5cDzjt+HI4BSZtVJTazfIsMQOmFAusLr/E53lniickJYIDNcaUL+JhMZPWBUdOeCCaweGOw5k0lFrv2uyRuBxPlLpoBtTK0p3mh+f+dKl6jX6LapRj6XrzD+1bmkFA/dTVAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDE3LTA1LTEwVDEyOjMwOjE0KzAyOjAwUNH5TAAAACV0RVh0ZGF0ZTptb2RpZnkAMjAxNy0wNS0xMFQxMjozMDoxNCswMjowMCGMQfAAAAAZdEVYdFNvZnR3YXJlAHd3dy5pbmtzY2FwZS5vcmeb7jwaAAAAAElFTkSuQmCC\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAMAAADXqc3KAAAAA3NCSVQICAjb4U/gAAAACXBIWXMAAACmAAAApgHdff84AAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAAn9QTFRF////AAAAAAAAAAAAAAAAAAAzABcXABQUABIkDhwrAA0aAAwYABUgABQfABIbABAZAA8fABUcABMaABMfABIeABEcABAbABQeABMdABIdABEbABIbABIbABEdABEcABIcBxsoABEdABIdABIdABEcABMbABMdFBwgERofAhIbEhsfAhIdBxUeEhsgEBofAhMbAhMdBRMdAhIbAhIdAhMdCRceARIcDBgfDBgfDBcfDBcfFhwgDBceDBceCxceFCs5HTdGAxMcDxofGTFAHDRDHDVDHDVEHTZFDRkfEBofERogCh0oERsgARIcEhsfEhsgCh4pDCEsDRkfDRkfEBofBhQdDSMvDRgfDBgfCBUeBxUeDyUyECYzUDktPTAqCRceCRYeChYeDxkfEBkgLCgmWj4wCBYdW0AwGh4hHCAiHSAiTDctBhUdBxYdEBkfLyonMConBhUdJiUkLCclLSgmLigmOzApPTEpDBgfBRQdDBgfERsgWT8wBBMdCBYeChceQjMrSzctZEUyBBMdERsgXUAxXkExY0QzglQ5AxUfBxolSjcthlU6hlY7h1Y7AxMcSDUsSjYsd042g1Q5hlY6jVo8AhIcAxMcBBQdLEpcOVpvARIcAhIcBhQdDSIuEhsgJ0NUNS0oNi0oO11yTTgtUXmSUnqUXEAxXUExYEIyZUUzaEYzb0o1cEo1dEw2i1g8jFk8jcfskFs9mdX9mmA/mtf/pmZCqGdCsWxEvnJHxHVJxnZJyHdJzHlK0XxM031M139N3IFO3YJO4INP5IVQ5YZQ5oZQ6ohR7IlS7opS74tS8ItT841T9I1T9o5U949U+ZBV+pBV/ZJW/pJW/5NWIYcOagAAAJt0Uk5TAAECAwQFCw0OEhQVGBkcHyEkKCkqLTAzNUZLVFZZW2RnanJzeHl8f4uMjY6Pj5KVl52eoKGprKytrq+vsLGytLu9vb/BwsLDxcXP0NDS09bf4uPk5OXl5ufo6enq7O3u7+/x8fHy8/P09PT09fX19fX29vb29vb29/j4+Pj5+fn5+fn6+vr6+vr7/Pz8/Pz9/f39/f39/v7+/v7Td3FlAAABgklEQVQoU2NggAMRJU1DTWURBlQgqhWUND11Tfr05GBdMYQws8a07j2XVx2/cnLl5T0T5+ixQsX5/RrWr70CA+s2NPoLgMUlciddvnLl3PbslMysmi2ngXKTc/iA4uwRC1dfudRT76UtJy5lMHvHlSsni82ZgBLWbZdOHCuPlARpForvBYszA9ky1WeunC8y5YCI9125cqrEnJlbnoHBZ/6mK+0eTAjxUgtmbl99Bt6Ksxd2pXGDxRPg4kZMDIqxV6406cDFT8PEGRwnHLlYJQwSTwSJ51tCxRmiVuw7VAsRP7zkIEKcofnAlb0hEPWXls9AiDNUHriyMxwoPgVoToEVQpwhdNHuY/2imOIMZq1nr2QUgsVtkMUZZOOuXOmYiinOwF63/8QVsDgLd0wnFwMCOM3dBhK3ZeGOXjzLHklCIu8oRDxs8eaNXYJIMuplJ0HigYs3b906UwFJgtGzxY6FLWDe0mXLli3wVoEAaZAMjxoLA6eDu5urq4uziTEEqAIAvamx163e5EoAAAAASUVORK5CYII=\"","import * as L from \"leaflet\";\n\n// Inline CSS strings (bundled by Vite) so we can inject into Shadow DOM\nimport leafletCSS from \"leaflet/dist/leaflet.css?inline\";\nimport leafletDrawCSS from \"leaflet-draw/dist/leaflet.draw.css?inline\";\nimport leafletRulerCSS from \"leaflet-ruler/src/leaflet-ruler.css?inline\";\n\n// Resolve Leaflet's default marker assets as URLs\nimport iconRetinaUrl from \"leaflet/dist/images/marker-icon-2x.png\";\nimport iconUrl from \"leaflet/dist/images/marker-icon.png\";\n\nimport shadowUrl from \"leaflet/dist/images/marker-shadow.png\";\nimport cogIconUrl from \"@src/assets/cog.svg?url\";\nimport layerCakeIconUrl from \"@src/assets/layer-cake.svg?url\";\n\nimport rulerIconUrl from \"leaflet-ruler/dist/icon.png\";\nimport rulerIconColoredUrl from \"leaflet-ruler/dist/icon-colored.png\";\n\n/**\n * Inject Leaflet and Leaflet.draw CSS into the given ShadowRoot.\n * Idempotent: does nothing if already injected for this root.\n */\nexport function injectLeafletStyles(root: ShadowRoot): void {\n // Avoid duplicate injection in HMR or reconnection\n const marker = \"data-leaflet-styles\";\n if (root.querySelector(`style[${marker}]`)) return;\n\n const style = document.createElement(\"style\");\n style.setAttribute(marker, \"true\");\n style.textContent = `\n/* --- Leaflet core CSS --- */\n${leafletCSS}\n\n/* --- Leaflet.draw CSS --- */\n${leafletDrawCSS}\n\n/* --- Leaflet.ruler CSS --- */\n${leafletRulerCSS}\n\n/* --- Fix Leaflet.ruler icons (broken relative paths in inlined CSS) --- */\n.leaflet-ruler {\n width: 30px !important; /* Match Leaflet Draw default size approx */\n height: 30px !important;\n background-color: #fff; /* Ensure visibility */\n background-image: url(${rulerIconUrl}) !important;\n background-size: 16px 16px; /* Scale icon to fit */\n}\n.leaflet-ruler:hover,\n.leaflet-ruler-clicked {\n background-image: url(${rulerIconColoredUrl}) !important;\n}\n\n/* --- Custom overrides for marker/handle sizes --- */\n.leaflet-draw-handle,\n.leaflet-editing-icon,\n.leaflet-draw-marker-icon {\n width: 12px !important;\n height: 12px !important;\n margin-left: -6px !important;\n margin-top: -6px !important;\n}\n\n/* --- Ruler settings control --- */\n.leaflet-ruler-settings-control {\n display: flex;\n flex-direction: column;\n}\n.leaflet-ruler-settings-button {\n width: 30px;\n height: 30px;\n border: none;\n background-color: #fff;\n background-repeat: no-repeat;\n background-position: center;\n background-size: 22px 22px;\n cursor: pointer;\n padding: 0;\n border-radius: 4px;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25);\n background-image: url(${cogIconUrl});\n transition: background-color 0.15s ease, box-shadow 0.15s ease;\n}\n.leaflet-ruler-settings-button:hover {\n background-color: #f4f4f4;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.3);\n}\n.leaflet-ruler-settings-button:focus-visible {\n outline: 2px solid #2c7be5;\n outline-offset: 2px;\n}\n\n/* --- Measurement modal --- */\n.leaflet-ruler-modal-overlay {\n position: absolute;\n inset: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n background: rgba(0, 0, 0, 0.4);\n z-index: 500;\n opacity: 0;\n pointer-events: none;\n transition: opacity 0.2s ease;\n padding: 16px;\n}\n.leaflet-ruler-modal-overlay.is-open {\n opacity: 1;\n pointer-events: auto;\n}\n.leaflet-ruler-modal {\n background: #fff;\n border-radius: 8px;\n width: min(320px, 100%);\n padding: 16px;\n box-shadow: 0 12px 30px rgba(0, 0, 0, 0.25);\n}\n.leaflet-ruler-modal-title {\n margin: 0 0 8px;\n font-size: 16px;\n font-weight: 600;\n}\n.leaflet-ruler-modal-description {\n margin: 0 0 12px;\n font-size: 13px;\n color: #444;\n}\n.leaflet-ruler-modal-options {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n.leaflet-ruler-modal-option {\n display: flex;\n gap: 8px;\n align-items: flex-start;\n font-size: 14px;\n}\n.leaflet-ruler-modal-option input[type=\"radio\"] {\n margin-top: 4px;\n}\n.leaflet-ruler-modal-option span {\n line-height: 1.25;\n}\n.leaflet-ruler-modal-actions {\n margin-top: 16px;\n display: flex;\n justify-content: flex-end;\n}\n.leaflet-ruler-modal-close {\n border: none;\n background: #2c7be5;\n color: #fff;\n border-radius: 4px;\n padding: 6px 12px;\n cursor: pointer;\n font-size: 14px;\n}\n.leaflet-ruler-modal-close:hover {\n background: #1a56c2;\n}\n\n/* --- Layer Cake draw tool icon + manager UI --- */\n.leaflet-draw-toolbar a.leaflet-draw-draw-cake {\n background-image: url(${layerCakeIconUrl}) !important;\n background-size: 18px 18px !important;\n background-position: 50% 50% !important;\n background-repeat: no-repeat !important;\n background-color: #fff;\n}\n\n.layer-cake-controls__container {\n display: flex;\n gap: 6px;\n background: white;\n padding: 5px;\n border-radius: 4px;\n box-shadow: 0 2px 5px rgba(0, 0, 0, 0.3);\n}\n\n.layer-cake-controls button {\n border: 1px solid #ccc;\n background: white;\n padding: 4px 8px;\n border-radius: 3px;\n font-size: 12px;\n cursor: pointer;\n}\n\n.layer-cake-controls button:hover {\n background: #f4f4f4;\n}\n\n/* --- Layer Cake measurement tooltips --- */\n.cake-label {\n background-color: rgba(255, 255, 255, 0.95) !important;\n border: 2px solid #8A2BE2 !important;\n border-radius: 4px !important;\n color: #333 !important;\n font-size: 13px !important;\n font-weight: 600 !important;\n padding: 4px 8px !important;\n white-space: nowrap !important;\n box-shadow: 0 2px 6px rgba(0, 0, 0, 0.2) !important;\n}\n\n.cake-label::before {\n border-right-color: #8A2BE2 !important;\n}\n\n/* --- Move tool mode cursor styles --- */\n.leaflet-draw-move-mode {\n cursor: default !important;\n}\n\n.leaflet-draw-move-mode .leaflet-interactive {\n cursor: grab !important;\n}\n\n.leaflet-draw-move-mode .leaflet-interactive:active {\n cursor: grabbing !important;\n}\n`;\n root.appendChild(style);\n}\n\n/**\n * Inject only project-specific style overrides that must exist even when\n * consumers provide external Leaflet CSS.\n * Idempotent: does nothing if already injected for this root.\n */\nexport function injectLeafletCustomStyles(root: ShadowRoot): void {\n const marker = \"data-leaflet-custom-styles\";\n if (root.querySelector(`style[${marker}]`)) return;\n\n const style = document.createElement(\"style\");\n style.setAttribute(marker, \"true\");\n style.textContent = `\n/* Ensure Layer Cake toolbar icon uses project asset instead of draw sprite sheet */\n.leaflet-draw-toolbar a.leaflet-draw-draw-cake {\n background-image: url(${layerCakeIconUrl}) !important;\n background-size: 18px 18px !important;\n background-position: 50% 50% !important;\n background-repeat: no-repeat !important;\n background-color: #fff;\n}\n`;\n\n root.appendChild(style);\n}\n\n/**\n * Ensure Leaflet default marker icons resolve via the bundler.\n * Safe to call multiple times.\n */\nexport function configureLeafletDefaultIcons(): void {\n // Merge options so Leaflet's default icon paths point to bundled URLs\n (L.Icon.Default as any).mergeOptions?.({\n iconRetinaUrl,\n iconUrl,\n shadowUrl,\n });\n}\n\n/**\n * Conditional helper: apply styles and icon wiring only if not skipped.\n */\nexport function applyLeafletStylingIfNeeded(options: {\n root: ShadowRoot;\n skipStyles?: boolean;\n}): void {\n const { root, skipStyles } = options;\n try {\n if (!skipStyles) {\n injectLeafletStyles(root);\n configureLeafletDefaultIcons();\n }\n // Always apply project-specific draw icon overrides, including external mode.\n injectLeafletCustomStyles(root);\n } catch {\n // Swallow styling errors; caller logs at higher level\n }\n}\n","// Unique ID creation requires a high quality random # generator. In the browser we therefore\n// require the crypto API and do not support built-in fallback to lower quality random number\n// generators (like Math.random()).\nlet getRandomValues;\nconst rnds8 = new Uint8Array(16);\nexport default function rng() {\n // lazy load so that environments that need to polyfill have a chance to do so\n if (!getRandomValues) {\n // getRandomValues needs to be invoked in a context where \"this\" is a Crypto implementation.\n getRandomValues = typeof crypto !== 'undefined' && crypto.getRandomValues && crypto.getRandomValues.bind(crypto);\n\n if (!getRandomValues) {\n throw new Error('crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported');\n }\n }\n\n return getRandomValues(rnds8);\n}","import validate from './validate.js';\n/**\n * Convert array of 16 byte values to UUID string format of the form:\n * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX\n */\n\nconst byteToHex = [];\n\nfor (let i = 0; i < 256; ++i) {\n byteToHex.push((i + 0x100).toString(16).slice(1));\n}\n\nexport function unsafeStringify(arr, offset = 0) {\n // Note: Be careful editing this code! It's been tuned for performance\n // and works in ways you may not expect. See https://github.com/uuidjs/uuid/pull/434\n return byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + '-' + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + '-' + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + '-' + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + '-' + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]];\n}\n\nfunction stringify(arr, offset = 0) {\n const uuid = unsafeStringify(arr, offset); // Consistency check for valid UUID. If this throws, it's likely due to one\n // of the following:\n // - One or more input array values don't map to a hex octet (leading to\n // \"undefined\" in the uuid)\n // - Invalid input values for the RFC `version` or `variant` fields\n\n if (!validate(uuid)) {\n throw TypeError('Stringified UUID is invalid');\n }\n\n return uuid;\n}\n\nexport default stringify;","const randomUUID = typeof crypto !== 'undefined' && crypto.randomUUID && crypto.randomUUID.bind(crypto);\nexport default {\n randomUUID\n};","import native from './native.js';\nimport rng from './rng.js';\nimport { unsafeStringify } from './stringify.js';\n\nfunction v4(options, buf, offset) {\n if (native.randomUUID && !buf && !options) {\n return native.randomUUID();\n }\n\n options = options || {};\n const rnds = options.random || (options.rng || rng)(); // Per 4.4, set bits for version and `clock_seq_hi_and_reserved`\n\n rnds[6] = rnds[6] & 0x0f | 0x40;\n rnds[8] = rnds[8] & 0x3f | 0x80; // Copy bytes to buffer, if provided\n\n if (buf) {\n offset = offset || 0;\n\n for (let i = 0; i < 16; ++i) {\n buf[offset + i] = rnds[i];\n }\n\n return buf;\n }\n\n return unsafeStringify(rnds);\n}\n\nexport default v4;","import type {\n Feature,\n FeatureCollection,\n Geometry,\n Position,\n Polygon,\n MultiPolygon,\n GeoJsonProperties,\n} from \"geojson\";\n\nexport type BBox = [\n minLng: number,\n minLat: number,\n maxLng: number,\n maxLat: number,\n];\nexport type BoundsPair = [[number, number], [number, number]]; // [[south, west], [north, east]]\n\nexport function normalizeId(feature: Feature): string | undefined {\n const id = (feature as any).id ?? (feature.properties as any)?.id;\n if (id == null) return undefined;\n return String(id);\n}\n\n/**\n * Callback function for processing a single coordinate position\n */\nexport type CoordinateProcessor = (coord: Position) => void;\n\n/**\n * Iterate all coordinates of a Geometry and call the processor function for each Position.\n */\nexport function eachCoord(geom: Geometry, cb: CoordinateProcessor): void {\n const walk = (g: Geometry) => {\n switch (g.type) {\n case \"Point\":\n cb(g.coordinates);\n break;\n case \"MultiPoint\":\n case \"LineString\":\n for (const c of g.coordinates) cb(c);\n break;\n case \"MultiLineString\":\n case \"Polygon\":\n for (const ring of g.coordinates as Position[][]) {\n for (const c of ring) cb(c);\n }\n break;\n case \"MultiPolygon\":\n for (const poly of g.coordinates as Position[][][]) {\n for (const ring of poly) {\n for (const c of ring) cb(c);\n }\n }\n break;\n case \"GeometryCollection\":\n for (const child of g.geometries) walk(child);\n break;\n default:\n // Unsupported geometry type\n break;\n }\n };\n walk(geom);\n}\n\n/**\n * Compute bounding box [minLng, minLat, maxLng, maxLat] for a single feature.\n * Returns null when the feature has no geometry.\n */\nexport function bboxOfFeature(feature: Feature): BBox | null {\n const geom = feature.geometry;\n if (!geom) return null;\n\n let minLng = Infinity,\n minLat = Infinity,\n maxLng = -Infinity,\n maxLat = -Infinity;\n let seen = false;\n\n eachCoord(geom, (coord) => {\n // GeoJSON Position is [lng, lat, ...]\n const [lng, lat] = coord;\n if (typeof lng !== \"number\" || typeof lat !== \"number\") return;\n seen = true;\n if (lng < minLng) minLng = lng;\n if (lat < minLat) minLat = lat;\n if (lng > maxLng) maxLng = lng;\n if (lat > maxLat) maxLat = lat;\n });\n\n if (!seen) return null;\n return [minLng, minLat, maxLng, maxLat];\n}\n\n/**\n * Compute bounding box for a FeatureCollection. Returns null if no features have geometry.\n */\nexport function bboxOfFeatureCollection(fc: FeatureCollection): BBox | null {\n let minLng = Infinity,\n minLat = Infinity,\n maxLng = -Infinity,\n maxLat = -Infinity;\n let seen = false;\n\n for (const f of fc.features) {\n const b = bboxOfFeature(f);\n if (!b) continue;\n seen = true;\n minLng = Math.min(minLng, b[0]);\n minLat = Math.min(minLat, b[1]);\n maxLng = Math.max(maxLng, b[2]);\n maxLat = Math.max(maxLat, b[3]);\n }\n\n if (!seen) return null;\n return [minLng, minLat, maxLng, maxLat];\n}\n\n/**\n * Convert a bbox to [[south, west], [north, east]] tuple.\n */\nexport function bboxToBoundsPair(b: BBox): BoundsPair {\n const [minLng, minLat, maxLng, maxLat] = b;\n return [\n [minLat, minLng],\n [maxLat, maxLng],\n ];\n}\n\n/**\n * Expand Multi* geometries and GeometryCollections into multiple single-geometry Features.\n * - MultiPolygon → multiple Polygon features\n * - MultiLineString → multiple LineString features\n * - MultiPoint → multiple Point features\n * - GeometryCollection → one feature per child geometry\n * Other geometry types are returned unchanged.\n */\nexport function expandMultiGeometries(\n fc: FeatureCollection,\n): FeatureCollection {\n const out: Feature[] = [];\n for (const f of fc.features) {\n if (!f || f.type !== \"Feature\") continue;\n const baseProps = f.properties ?? {};\n const geom = f.geometry;\n if (!geom) continue; // skip null geometry\n switch (geom.type) {\n case \"MultiPolygon\":\n for (const poly of geom.coordinates) {\n out.push({\n type: \"Feature\",\n properties: { ...baseProps },\n geometry: { type: \"Polygon\", coordinates: poly },\n });\n }\n break;\n case \"MultiLineString\":\n for (const line of geom.coordinates) {\n out.push({\n type: \"Feature\",\n properties: { ...baseProps },\n geometry: { type: \"LineString\", coordinates: line },\n });\n }\n break;\n case \"MultiPoint\":\n for (const pt of geom.coordinates) {\n out.push({\n type: \"Feature\",\n properties: { ...baseProps },\n geometry: { type: \"Point\", coordinates: pt },\n });\n }\n break;\n case \"GeometryCollection\":\n for (const child of geom.geometries) {\n out.push({\n type: \"Feature\",\n properties: { ...baseProps },\n geometry: child,\n });\n }\n break;\n default:\n out.push(f);\n break;\n }\n }\n return { type: \"FeatureCollection\", features: out };\n}\n\n/**\n * Check if a geometry is a Polygon\n */\nexport function isPolygon(geometry: Geometry | null): geometry is Polygon {\n return geometry?.type === \"Polygon\";\n}\n\n/**\n * Check if a geometry is a MultiPolygon\n */\nexport function isMultiPolygon(\n geometry: Geometry | null,\n): geometry is MultiPolygon {\n return geometry?.type === \"MultiPolygon\";\n}\n\n/**\n * Extract polygon coordinates from a feature\n * Returns array of rings for each polygon (outer + inner rings)\n */\nexport function extractPolygonCoordinates(feature: Feature): Position[][][] {\n const geometry = feature.geometry;\n\n if (!geometry) return [];\n\n if (isPolygon(geometry)) {\n // Single polygon: return its rings as a one-element array\n return [geometry.coordinates];\n } else if (isMultiPolygon(geometry)) {\n // MultiPolygon: return all polygon rings\n return geometry.coordinates;\n }\n\n return []; // Not a polygon feature\n}\n\n/**\n * Merge multiple polygon features into a single polygon feature.\n * Attempts to create a topological union of the polygons, falling back to\n * a MultiPolygon if the union operation fails.\n *\n * @param features Array of features to merge (only polygon features will be used)\n * @param properties Properties for the resulting feature (defaults to first feature's properties)\n * @returns A new Feature with a unified Polygon or MultiPolygon, or null if no valid polygons found\n */\nexport function mergePolygons(\n features: Feature[],\n properties?: GeoJsonProperties,\n): Feature | null {\n // Extract all polygon coordinates\n const allPolygons: Position[][][] = [];\n\n for (const feature of features) {\n const coords = extractPolygonCoordinates(feature);\n if (coords.length > 0) {\n allPolygons.push(...coords);\n }\n }\n\n if (allPolygons.length === 0) return null;\n\n const baseProps = properties ?? features[0]?.properties ?? {};\n\n // If only one polygon, return it directly as a Polygon\n if (allPolygons.length === 1) {\n return {\n type: \"Feature\",\n properties: { ...baseProps },\n geometry: {\n type: \"Polygon\",\n coordinates: allPolygons[0],\n },\n };\n }\n\n // Otherwise, return a MultiPolygon\n return {\n type: \"Feature\",\n properties: { ...baseProps },\n geometry: {\n type: \"MultiPolygon\",\n coordinates: allPolygons,\n },\n };\n}\n\n/**\n * Merge polygons from a FeatureCollection into a single polygon feature.\n *\n * @param fc FeatureCollection containing polygons to merge\n * @param properties Properties for the resulting feature (defaults to first feature's properties)\n * @returns A Feature with a merged Polygon/MultiPolygon, or null if no polygon features found\n */\nexport function mergePolygonsFromCollection(\n fc: FeatureCollection,\n properties?: GeoJsonProperties,\n): Feature | null {\n if (!fc?.features?.length) return null;\n\n // Filter to only include polygon features\n const polygonFeatures = fc.features.filter((feature) => {\n const geom = feature.geometry;\n return geom && (isPolygon(geom) || isMultiPolygon(geom));\n });\n\n return mergePolygons(polygonFeatures, properties);\n}\n","import type { Feature, FeatureCollection } from \"geojson\";\nimport { v4 as uuidv4 } from \"uuid\";\nimport {\n bboxOfFeatureCollection,\n bboxToBoundsPair,\n type BoundsPair,\n normalizeId,\n} from \"@src/utils/geojson\";\nimport { createLogger, type Logger } from \"@src/utils/logger\";\n\n/**\n * FeatureStore\n * - Maintains a stable, id-centric in-memory FeatureCollection\n * - IDs are sourced from feature.id, feature.properties.id, or generated (uuid v4)\n * - Provides CRUD and export helpers\n *\n * Note: Leaflet layer bindings will be handled by the controller; this store is map-agnostic.\n */\nexport class FeatureStore {\n private log: Logger;\n private features: Map<string, Feature>;\n\n constructor(logger: Logger = createLogger(\"feature-store\", \"debug\")) {\n this.log = logger;\n this.features = new Map();\n }\n\n size(): number {\n return this.features.size;\n }\n\n has(id: string): boolean {\n return this.features.has(id);\n }\n\n get(id: string): Feature | undefined {\n return this.features.get(id);\n }\n\n /**\n * Add features to the store; returns the assigned/normalized ids in order.\n */\n add(fc: FeatureCollection): string[] {\n const ids: string[] = [];\n const t0 = performance.now?.() ?? Date.now();\n for (const f of fc.features) {\n const id = this.ensureId(f);\n // Store a shallow copy with id normalized on the Feature root for consistency\n const stored: Feature = { ...f, id };\n this.features.set(id, stored);\n ids.push(id);\n }\n const elapsed = (performance.now?.() ?? Date.now()) - t0;\n this.log.debug(\"add\", {\n count: fc.features.length,\n ids,\n elapsedMs: Math.round(elapsed),\n });\n return ids;\n }\n\n /**\n * Update a feature by id. If the feature does not exist, this is a no-op.\n * The provided feature will overwrite the stored one with the given id.\n */\n update(id: string, feature: Feature): void {\n if (!this.features.has(id)) {\n this.log.warn(\"update:missing\", { id });\n return;\n }\n const updated: Feature = { ...feature, id };\n this.features.set(id, updated);\n this.log.debug(\"update\", { id });\n }\n\n /**\n * Remove a feature by id. No-op if missing.\n */\n remove(id: string): void {\n if (this.features.delete(id)) {\n this.log.debug(\"remove\", { id });\n } else {\n this.log.warn(\"remove:missing\", { id });\n }\n }\n\n /**\n * Clear all features.\n */\n clear(): void {\n const count = this.features.size;\n this.features.clear();\n this.log.debug(\"clear\", { count });\n }\n\n /**\n * Export snapshot as FeatureCollection.\n */\n toFeatureCollection(): FeatureCollection {\n return {\n type: \"FeatureCollection\",\n features: Array.from(this.features.values()),\n };\n }\n\n /**\n * Compute bounds for current data as [[south, west], [north, east]] or null if empty.\n */\n bounds(): BoundsPair | null {\n const fc = this.toFeatureCollection();\n if (fc.features.length === 0) return null;\n const b = bboxOfFeatureCollection(fc);\n if (!b) return null;\n return bboxToBoundsPair(b);\n }\n\n /**\n * Ensure the feature has an id; returns the resolved id.\n */\n private ensureId(f: Feature): string {\n const existing = normalizeId(f);\n if (existing) return String(existing);\n const id = uuidv4();\n // Assign on both standard positions for compatibility\n (f as any).id = id;\n if (f.properties && typeof f.properties === \"object\") {\n (f.properties as any).id = id;\n }\n return id;\n }\n}\n","import * as L from \"leaflet\";\n\nconst patchedNamespaces = new WeakSet<object>();\n\nexport function registerLayerCakeTool(Lns: typeof L = L): void {\n if (patchedNamespaces.has(Lns as object)) return;\n const DrawToolbarCtor = (Lns as any).DrawToolbar;\n if (!DrawToolbarCtor?.prototype?.getModeHandlers) return;\n\n const originalGetModeHandlers = DrawToolbarCtor.prototype.getModeHandlers;\n\n DrawToolbarCtor.prototype.getModeHandlers = function (map: L.Map) {\n const modes = originalGetModeHandlers.call(this, map);\n\n if ((this as any).options?.cake) {\n const CakeCtor = (Lns as any).Draw?.Cake;\n if (!CakeCtor) return modes;\n modes.push({\n enabled: true,\n handler: new CakeCtor(map, (this as any).options.cake),\n title: \"Draw Layer Cake (Subtractive Zones)\",\n });\n }\n\n if ((this as any).options?.move) {\n const MoveCtor = (Lns as any).Draw?.Move;\n if (!MoveCtor) return modes;\n modes.push({\n enabled: true,\n handler: new MoveCtor(map, (this as any).options.move),\n title: \"Move/Translate Features\",\n });\n }\n\n return modes;\n };\n\n patchedNamespaces.add(Lns as object);\n}\n","import * as L from \"leaflet\";\n\nexport class DrawCake extends (L as any).Draw.Circle {\n public static TYPE = \"cake\";\n\n constructor(map: L.Map, options?: L.DrawOptions.CircleOptions) {\n super(map, options);\n this.type = DrawCake.TYPE;\n }\n\n addHooks(): void {\n super.addHooks();\n const tooltip = (this as any)._tooltip;\n if (tooltip?.updateContent) {\n tooltip.updateContent({\n text: \"Click and drag to draw the Layer Cake base\",\n subtext: \"Release mouse to finish base layer\",\n });\n }\n }\n}\n\n(L as any).Draw.Cake = DrawCake;\n\nexport function ensureDrawCakeRegistered(Lns: typeof L): void {\n const DrawNs = (Lns as any).Draw;\n if (!DrawNs) return;\n if (DrawNs.Cake) return;\n\n class RuntimeDrawCake extends DrawNs.Circle {\n public static TYPE = \"cake\";\n\n constructor(map: L.Map, options?: L.DrawOptions.CircleOptions) {\n super(map, options);\n this.type = RuntimeDrawCake.TYPE;\n }\n\n addHooks(): void {\n super.addHooks();\n const tooltip = (this as any)._tooltip;\n if (tooltip?.updateContent) {\n tooltip.updateContent({\n text: \"Click and drag to draw the Layer Cake base\",\n subtext: \"Release mouse to finish base layer\",\n });\n }\n }\n }\n\n DrawNs.Cake = RuntimeDrawCake;\n}\n","import * as L from \"leaflet\";\n\n/**\n * DrawMove: A custom Leaflet.draw handler that enables moving/translating existing features.\n * This handler activates a \"move mode\" where users can click and drag features to new positions.\n */\nexport class DrawMove extends (L as any).Draw.Feature {\n public static TYPE = \"move\";\n\n private _featureGroup: L.FeatureGroup;\n private _selectedLayer: L.Layer | null = null;\n private _originalLatLngs: any = null;\n private _dragStartLatLng: L.LatLng | null = null;\n private _isDragging = false;\n private _pendingMove: {\n layer: L.Layer;\n originalGeoJSON: GeoJSON.Feature;\n newGeoJSON: GeoJSON.Feature;\n } | null = null;\n\n constructor(map: L.Map, options?: { featureGroup: L.FeatureGroup } & any) {\n super(map, options);\n this.type = DrawMove.TYPE;\n this._featureGroup = options?.featureGroup || new L.FeatureGroup();\n }\n\n enable(): void {\n if (this._enabled) return;\n super.enable();\n }\n\n disable(): void {\n if (!this._enabled) return;\n this._cleanupDragging();\n super.disable();\n }\n\n addHooks(): void {\n const map = this._map;\n if (!map) return;\n\n // Set cursor style for the map container\n L.DomUtil.addClass(map.getContainer(), \"leaflet-draw-move-mode\");\n\n // Add mouseover/mouseout handlers for all layers in featureGroup\n this._featureGroup.eachLayer((layer: L.Layer) => {\n this._enableLayerHover(layer);\n });\n\n // Update tooltip\n const tooltip = (this as any)._tooltip;\n if (tooltip?.updateContent) {\n tooltip.updateContent({\n text: \"Click and drag a feature to move it\",\n subtext: \"\",\n });\n }\n }\n\n removeHooks(): void {\n const map = this._map;\n if (!map) return;\n\n // Remove cursor style\n L.DomUtil.removeClass(map.getContainer(), \"leaflet-draw-move-mode\");\n\n // Remove hover handlers\n this._featureGroup.eachLayer((layer: L.Layer) => {\n this._disableLayerHover(layer);\n });\n\n this._cleanupDragging();\n }\n\n private _enableLayerHover(layer: L.Layer): void {\n if (!(layer as any).on) return;\n\n (layer as any).on(\"mouseover\", this._onLayerMouseOver, this);\n (layer as any).on(\"mouseout\", this._onLayerMouseOut, this);\n (layer as any).on(\"mousedown\", this._onLayerMouseDown, this);\n }\n\n private _disableLayerHover(layer: L.Layer): void {\n if (!(layer as any).off) return;\n\n (layer as any).off(\"mouseover\", this._onLayerMouseOver, this);\n (layer as any).off(\"mouseout\", this._onLayerMouseOut, this);\n (layer as any).off(\"mousedown\", this._onLayerMouseDown, this);\n }\n\n private _onLayerMouseOver(e: L.LeafletMouseEvent): void {\n if (this._isDragging) return;\n const layer = e.target;\n\n // Change cursor to grab\n if ((layer as any).getElement) {\n const element = (layer as any).getElement();\n if (element) {\n element.style.cursor = \"grab\";\n }\n } else if ((layer as any)._path) {\n (layer as any)._path.style.cursor = \"grab\";\n }\n }\n\n private _onLayerMouseOut(e: L.LeafletMouseEvent): void {\n if (this._isDragging) return;\n const layer = e.target;\n\n // Reset cursor\n if ((layer as any).getElement) {\n const element = (layer as any).getElement();\n if (element) {\n element.style.cursor = \"\";\n }\n } else if ((layer as any)._path) {\n (layer as any)._path.style.cursor = \"\";\n }\n }\n\n private _onLayerMouseDown(e: L.LeafletMouseEvent): void {\n if (this._isDragging) return;\n\n L.DomEvent.stopPropagation(e.originalEvent);\n L.DomEvent.preventDefault(e.originalEvent);\n\n const selectedLayer = e.target;\n this._selectedLayer = selectedLayer;\n this._isDragging = true;\n this._dragStartLatLng = e.latlng;\n\n // Store original position\n this._storeOriginalLatLngs(selectedLayer);\n\n // Change cursor to grabbing\n if ((selectedLayer as any).getElement) {\n const element = (selectedLayer as any).getElement();\n if (element) {\n element.style.cursor = \"grabbing\";\n }\n } else if ((selectedLayer as any)._path) {\n (selectedLayer as any)._path.style.cursor = \"grabbing\";\n }\n\n // Attach move and up handlers\n this._map.on(\"mousemove\", this._onMouseMove, this);\n this._map.on(\"mouseup\", this._onMouseUp, this);\n\n // Store original GeoJSON for potential cancel\n const originalGeoJSON = (selectedLayer as any).toGeoJSON();\n this._pendingMove = {\n layer: selectedLayer,\n originalGeoJSON,\n newGeoJSON: originalGeoJSON, // Will be updated on mouseup\n };\n }\n\n private _storeOriginalLatLngs(layer: L.Layer): void {\n if ((layer as any).getLatLng) {\n // Marker or Circle\n this._originalLatLngs = (layer as any).getLatLng();\n } else if ((layer as any).getLatLngs) {\n // Polygon, Polyline, etc.\n this._originalLatLngs = JSON.parse(\n JSON.stringify((layer as any).getLatLngs()),\n );\n }\n }\n\n private _onMouseMove(e: L.LeafletMouseEvent): void {\n if (!this._isDragging || !this._selectedLayer || !this._dragStartLatLng)\n return;\n\n const layer = this._selectedLayer;\n const offset = {\n lat: e.latlng.lat - this._dragStartLatLng.lat,\n lng: e.latlng.lng - this._dragStartLatLng.lng,\n };\n\n // Apply offset to move the layer\n if ((layer as any).setLatLng) {\n // Marker or Circle\n const newLatLng = L.latLng(\n this._originalLatLngs.lat + offset.lat,\n this._originalLatLngs.lng + offset.lng,\n );\n (layer as any).setLatLng(newLatLng);\n } else if ((layer as any).setLatLngs) {\n // Polygon, Polyline, etc.\n const newLatLngs = this._offsetLatLngs(this._originalLatLngs, offset);\n (layer as any).setLatLngs(newLatLngs);\n }\n }\n\n private _offsetLatLngs(\n latLngs: any,\n offset: { lat: number; lng: number },\n ): any {\n if (\n latLngs instanceof L.LatLng ||\n (latLngs.lat !== undefined && latLngs.lng !== undefined)\n ) {\n return L.latLng(latLngs.lat + offset.lat, latLngs.lng + offset.lng);\n }\n if (Array.isArray(latLngs)) {\n return latLngs.map((ll: any) => this._offsetLatLngs(ll, offset));\n }\n return latLngs;\n }\n\n private _onMouseUp(e: L.LeafletMouseEvent): void {\n if (!this._isDragging || !this._selectedLayer) return;\n\n // Update pending move with new GeoJSON\n if (this._pendingMove) {\n this._pendingMove.newGeoJSON = (this._selectedLayer as any).toGeoJSON();\n }\n\n // Reset cursor\n const layer = this._selectedLayer;\n if ((layer as any).getElement) {\n const element = (layer as any).getElement();\n if (element) {\n element.style.cursor = \"grab\";\n }\n } else if ((layer as any)._path) {\n (layer as any)._path.style.cursor = \"grab\";\n }\n\n // Fire moveend event with pending move data\n this._map.fire(\"draw:moveend\", {\n layer: this._selectedLayer,\n originalGeoJSON: this._pendingMove?.originalGeoJSON,\n newGeoJSON: this._pendingMove?.newGeoJSON,\n });\n\n // Cleanup\n this._map.off(\"mousemove\", this._onMouseMove, this);\n this._map.off(\"mouseup\", this._onMouseUp, this);\n\n this._isDragging = false;\n // Keep _pendingMove and _selectedLayer for Save/Cancel UI\n }\n\n private _cleanupDragging(): void {\n if (this._selectedLayer) {\n // Reset cursor\n const layer = this._selectedLayer;\n if ((layer as any).getElement) {\n const element = (layer as any).getElement();\n if (element) {\n element.style.cursor = \"\";\n }\n } else if ((layer as any)._path) {\n (layer as any)._path.style.cursor = \"\";\n }\n }\n\n this._map.off(\"mousemove\", this._onMouseMove, this);\n this._map.off(\"mouseup\", this._onMouseUp, this);\n\n this._selectedLayer = null;\n this._originalLatLngs = null;\n this._dragStartLatLng = null;\n this._isDragging = false;\n this._pendingMove = null;\n }\n\n /**\n * Confirm the pending move and dispatch the final event.\n */\n public confirmMove(): void {\n if (!this._pendingMove) return;\n\n this._map.fire(\"draw:moveconfirmed\", {\n layer: this._pendingMove.layer,\n originalGeoJSON: this._pendingMove.originalGeoJSON,\n newGeoJSON: this._pendingMove.newGeoJSON,\n });\n\n this._cleanupDragging();\n }\n\n /**\n * Cancel the pending move and revert the layer to its original position.\n */\n public cancelMove(): void {\n if (!this._pendingMove) return;\n\n const layer = this._pendingMove.layer;\n\n // Revert to original position\n if ((layer as any).setLatLng && this._originalLatLngs) {\n (layer as any).setLatLng(this._originalLatLngs);\n } else if ((layer as any).setLatLngs && this._originalLatLngs) {\n (layer as any).setLatLngs(this._originalLatLngs);\n }\n\n this._cleanupDragging();\n }\n\n /**\n * Check if there's a pending move awaiting confirmation.\n */\n public hasPendingMove(): boolean {\n return this._pendingMove !== null;\n }\n}\n\n// Register with bundled Leaflet\n(L as any).Draw.Move = DrawMove;\n\n/**\n * Ensure DrawMove is registered with a given Leaflet namespace.\n */\nexport function ensureDrawMoveRegistered(Lns: typeof L): void {\n const DrawNs = (Lns as any).Draw;\n if (!DrawNs) return;\n if (DrawNs.Move) return;\n\n class RuntimeDrawMove extends DrawNs.Feature {\n public static TYPE = \"move\";\n private _featureGroup: L.FeatureGroup;\n private _selectedLayer: L.Layer | null = null;\n private _originalLatLngs: any = null;\n private _dragStartLatLng: L.LatLng | null = null;\n private _isDragging = false;\n private _pendingMove: {\n layer: L.Layer;\n originalGeoJSON: GeoJSON.Feature;\n newGeoJSON: GeoJSON.Feature;\n } | null = null;\n\n constructor(map: L.Map, options?: { featureGroup: L.FeatureGroup } & any) {\n super(map, options);\n this.type = RuntimeDrawMove.TYPE;\n this._featureGroup = options?.featureGroup || new L.FeatureGroup();\n }\n\n enable(): void {\n if ((this as any)._enabled) return;\n super.enable();\n }\n\n disable(): void {\n if (!(this as any)._enabled) return;\n this._cleanupDragging();\n super.disable();\n }\n\n addHooks(): void {\n const map = (this as any)._map;\n if (!map) return;\n\n Lns.DomUtil.addClass(map.getContainer(), \"leaflet-draw-move-mode\");\n\n this._featureGroup.eachLayer((layer: L.Layer) => {\n this._enableLayerHover(layer);\n });\n\n const tooltip = (this as any)._tooltip;\n if (tooltip?.updateContent) {\n tooltip.updateContent({\n text: \"Click and drag a feature to move it\",\n subtext: \"\",\n });\n }\n }\n\n removeHooks(): void {\n const map = (this as any)._map;\n if (!map) return;\n\n Lns.DomUtil.removeClass(map.getContainer(), \"leaflet-draw-move-mode\");\n\n this._featureGroup.eachLayer((layer: L.Layer) => {\n this._disableLayerHover(layer);\n });\n\n this._cleanupDragging();\n }\n\n private _enableLayerHover(layer: L.Layer): void {\n if (!(layer as any).on) return;\n (layer as any).on(\"mouseover\", this._onLayerMouseOver, this);\n (layer as any).on(\"mouseout\", this._onLayerMouseOut, this);\n (layer as any).on(\"mousedown\", this._onLayerMouseDown, this);\n }\n\n private _disableLayerHover(layer: L.Layer): void {\n if (!(layer as any).off) return;\n (layer as any).off(\"mouseover\", this._onLayerMouseOver, this);\n (layer as any).off(\"mouseout\", this._onLayerMouseOut, this);\n (layer as any).off(\"mousedown\", this._onLayerMouseDown, this);\n }\n\n private _onLayerMouseOver(e: L.LeafletMouseEvent): void {\n if (this._isDragging) return;\n const layer = e.target;\n if ((layer as any).getElement) {\n const element = (layer as any).getElement();\n if (element) element.style.cursor = \"grab\";\n } else if ((layer as any)._path) {\n (layer as any)._path.style.cursor = \"grab\";\n }\n }\n\n private _onLayerMouseOut(e: L.LeafletMouseEvent): void {\n if (this._isDragging) return;\n const layer = e.target;\n if ((layer as any).getElement) {\n const element = (layer as any).getElement();\n if (element) element.style.cursor = \"\";\n } else if ((layer as any)._path) {\n (layer as any)._path.style.cursor = \"\";\n }\n }\n\n private _onLayerMouseDown(e: L.LeafletMouseEvent): void {\n if (this._isDragging) return;\n Lns.DomEvent.stopPropagation(e.originalEvent);\n Lns.DomEvent.preventDefault(e.originalEvent);\n\n const selectedLayer = e.target;\n this._selectedLayer = selectedLayer;\n this._isDragging = true;\n this._dragStartLatLng = e.latlng;\n this._storeOriginalLatLngs(selectedLayer);\n\n if ((selectedLayer as any).getElement) {\n const element = (selectedLayer as any).getElement();\n if (element) element.style.cursor = \"grabbing\";\n } else if ((selectedLayer as any)._path) {\n (selectedLayer as any)._path.style.cursor = \"grabbing\";\n }\n\n (this as any)._map.on(\"mousemove\", this._onMouseMove, this);\n (this as any)._map.on(\"mouseup\", this._onMouseUp, this);\n\n const originalGeoJSON = (selectedLayer as any).toGeoJSON();\n this._pendingMove = {\n layer: selectedLayer,\n originalGeoJSON,\n newGeoJSON: originalGeoJSON,\n };\n }\n\n private _storeOriginalLatLngs(layer: L.Layer): void {\n if ((layer as any).getLatLng) {\n this._originalLatLngs = (layer as any).getLatLng();\n } else if ((layer as any).getLatLngs) {\n this._originalLatLngs = JSON.parse(\n JSON.stringify((layer as any).getLatLngs()),\n );\n }\n }\n\n private _onMouseMove(e: L.LeafletMouseEvent): void {\n if (!this._isDragging || !this._selectedLayer || !this._dragStartLatLng)\n return;\n\n const layer = this._selectedLayer;\n const offset = {\n lat: e.latlng.lat - this._dragStartLatLng.lat,\n lng: e.latlng.lng - this._dragStartLatLng.lng,\n };\n\n if ((layer as any).setLatLng) {\n const newLatLng = Lns.latLng(\n this._originalLatLngs.lat + offset.lat,\n this._originalLatLngs.lng + offset.lng,\n );\n (layer as any).setLatLng(newLatLng);\n } else if ((layer as any).setLatLngs) {\n const newLatLngs = this._offsetLatLngs(this._originalLatLngs, offset);\n (layer as any).setLatLngs(newLatLngs);\n }\n }\n\n private _offsetLatLngs(\n latLngs: any,\n offset: { lat: number; lng: number },\n ): any {\n if (\n latLngs instanceof Lns.LatLng ||\n (latLngs.lat !== undefined && latLngs.lng !== undefined)\n ) {\n return Lns.latLng(latLngs.lat + offset.lat, latLngs.lng + offset.lng);\n }\n if (Array.isArray(latLngs)) {\n return latLngs.map((ll: any) => this._offsetLatLngs(ll, offset));\n }\n return latLngs;\n }\n\n private _onMouseUp(e: L.LeafletMouseEvent): void {\n if (!this._isDragging || !this._selectedLayer) return;\n\n if (this._pendingMove) {\n this._pendingMove.newGeoJSON = (this._selectedLayer as any).toGeoJSON();\n }\n\n const layer = this._selectedLayer;\n if ((layer as any).getElement) {\n const element = (layer as any).getElement();\n if (element) element.style.cursor = \"grab\";\n } else if ((layer as any)._path) {\n (layer as any)._path.style.cursor = \"grab\";\n }\n\n (this as any)._map.fire(\"draw:moveend\", {\n layer: this._selectedLayer,\n originalGeoJSON: this._pendingMove?.originalGeoJSON,\n newGeoJSON: this._pendingMove?.newGeoJSON,\n });\n\n (this as any)._map.off(\"mousemove\", this._onMouseMove, this);\n (this as any)._map.off(\"mouseup\", this._onMouseUp, this);\n\n this._isDragging = false;\n }\n\n private _cleanupDragging(): void {\n if (this._selectedLayer) {\n const layer = this._selectedLayer;\n if ((layer as any).getElement) {\n const element = (layer as any).getElement();\n if (element) element.style.cursor = \"\";\n } else if ((layer as any)._path) {\n (layer as any)._path.style.cursor = \"\";\n }\n }\n\n (this as any)._map.off(\"mousemove\", this._onMouseMove, this);\n (this as any)._map.off(\"mouseup\", this._onMouseUp, this);\n\n this._selectedLayer = null;\n this._originalLatLngs = null;\n this._dragStartLatLng = null;\n this._isDragging = false;\n this._pendingMove = null;\n }\n\n public confirmMove(): void {\n if (!this._pendingMove) return;\n\n (this as any)._map.fire(\"draw:moveconfirmed\", {\n layer: this._pendingMove.layer,\n originalGeoJSON: this._pendingMove.originalGeoJSON,\n newGeoJSON: this._pendingMove.newGeoJSON,\n });\n\n this._cleanupDragging();\n }\n\n public cancelMove(): void {\n if (!this._pendingMove) return;\n\n const layer = this._pendingMove.layer;\n\n if ((layer as any).setLatLng && this._originalLatLngs) {\n (layer as any).setLatLng(this._originalLatLngs);\n } else if ((layer as any).setLatLngs && this._originalLatLngs) {\n (layer as any).setLatLngs(this._originalLatLngs);\n }\n\n this._cleanupDragging();\n }\n\n public hasPendingMove(): boolean {\n return this._pendingMove !== null;\n }\n }\n\n DrawNs.Move = RuntimeDrawMove;\n}\n","import { v4 as uuidv4 } from \"uuid\";\n\nexport interface CircleLike {\n getLatLng(): { lat: number; lng: number };\n getRadius(): number; // meters\n}\n\nexport interface CakeLayerOptions {\n circles: CircleLike[];\n steps?: number;\n}\n\ntype Position = [number, number]; // [lng, lat]\n\nconst EARTH_RADIUS_METERS = 6_371_008.8;\n\nfunction toRadians(deg: number): number {\n return (deg * Math.PI) / 180;\n}\n\nfunction toDegrees(rad: number): number {\n return (rad * 180) / Math.PI;\n}\n\nfunction destinationPoint(\n center: { lat: number; lng: number },\n distanceMeters: number,\n bearingDegrees: number,\n): { lat: number; lng: number } {\n const angularDistance = distanceMeters / EARTH_RADIUS_METERS;\n const bearing = toRadians(bearingDegrees);\n const lat1 = toRadians(center.lat);\n const lon1 = toRadians(center.lng);\n\n const sinLat1 = Math.sin(lat1);\n const cosLat1 = Math.cos(lat1);\n const sinAngular = Math.sin(angularDistance);\n const cosAngular = Math.cos(angularDistance);\n\n const sinLat2 =\n sinLat1 * cosAngular + cosLat1 * sinAngular * Math.cos(bearing);\n const lat2 = Math.asin(sinLat2);\n\n const y = Math.sin(bearing) * sinAngular * cosLat1;\n const x = cosAngular - sinLat1 * sinLat2;\n const lon2 = lon1 + Math.atan2(y, x);\n\n return { lat: toDegrees(lat2), lng: toDegrees(lon2) };\n}\n\nfunction signedRingArea(coords: Position[]): number {\n let sum = 0;\n for (let i = 0; i < coords.length - 1; i++) {\n const [x1, y1] = coords[i];\n const [x2, y2] = coords[i + 1];\n sum += x1 * y2 - x2 * y1;\n }\n return sum / 2;\n}\n\nfunction ensureClosedRing(coords: Position[]): Position[] {\n const first = coords[0];\n const last = coords.at(-1);\n if (!first || !last) return coords;\n if (first[0] === last[0] && first[1] === last[1]) return coords;\n return [...coords, first];\n}\n\nfunction ensureWinding(coords: Position[], clockwise: boolean): Position[] {\n const closed = ensureClosedRing(coords);\n const area = signedRingArea(closed);\n const isClockwise = area < 0;\n if (isClockwise === clockwise) return closed;\n const reversed = [...closed].reverse();\n return ensureClosedRing(reversed);\n}\n\nfunction circleToRing(\n center: { lat: number; lng: number },\n radiusMeters: number,\n steps: number,\n): Position[] {\n if (steps < 4) throw new Error(\"steps must be >= 4\");\n const pts: Position[] = [];\n for (let i = 0; i < steps; i++) {\n const bearing = (i / steps) * 360;\n const p = destinationPoint(center, radiusMeters, bearing);\n pts.push([p.lng, p.lat]);\n }\n return ensureClosedRing(pts);\n}\n\nfunction bakeCoreFeature(args: {\n id: string;\n center: { lat: number; lng: number };\n radiusMeters: number;\n layerIndex: number;\n steps: number;\n}): GeoJSON.Feature {\n const { id, center, radiusMeters, layerIndex, steps } = args;\n const outer = ensureWinding(circleToRing(center, radiusMeters, steps), false);\n\n return {\n type: \"Feature\",\n properties: {\n id,\n layer_index: layerIndex,\n radius_outer: radiusMeters,\n type: \"core\",\n _meta: {\n lat: center.lat,\n lng: center.lng,\n radius: radiusMeters,\n },\n },\n geometry: { type: \"Polygon\", coordinates: [outer] },\n };\n}\n\nfunction bakeRingFeature(args: {\n id: string;\n center: { lat: number; lng: number };\n radiusOuterMeters: number;\n radiusInnerMeters: number;\n layerIndex: number;\n steps: number;\n}): GeoJSON.Feature {\n const {\n id,\n center,\n radiusOuterMeters,\n radiusInnerMeters,\n layerIndex,\n steps,\n } = args;\n const outer = ensureWinding(\n circleToRing(center, radiusOuterMeters, steps),\n false,\n );\n const inner = ensureWinding(\n circleToRing(center, radiusInnerMeters, steps),\n true,\n );\n\n return {\n type: \"Feature\",\n properties: {\n id,\n layer_index: layerIndex,\n radius_outer: radiusOuterMeters,\n type: \"ring\",\n _meta: {\n lat: center.lat,\n lng: center.lng,\n radius: radiusOuterMeters,\n },\n },\n geometry: { type: \"Polygon\", coordinates: [outer, inner] },\n };\n}\n\nexport function bakeLayerCake(\n options: CakeLayerOptions,\n): GeoJSON.FeatureCollection {\n const { circles, steps = 64 } = options;\n\n const sorted = [...circles].sort((a, b) => a.getRadius() - b.getRadius());\n const features: GeoJSON.Feature[] = [];\n\n sorted.forEach((circle, index) => {\n const center = circle.getLatLng();\n const radiusMeters = circle.getRadius();\n const id = uuidv4();\n\n if (index === 0) {\n features.push(\n bakeCoreFeature({ id, center, radiusMeters, layerIndex: index, steps }),\n );\n return;\n }\n\n const prev = sorted[index - 1];\n const prevRadiusMeters = prev.getRadius();\n\n features.push(\n bakeRingFeature({\n id,\n center,\n radiusOuterMeters: radiusMeters,\n radiusInnerMeters: prevRadiusMeters,\n layerIndex: index,\n steps,\n }),\n );\n });\n\n return { type: \"FeatureCollection\", features };\n}\n","export interface BindCakeControlsOptions {\n root: ParentNode;\n addButtonId: string;\n saveButtonId: string;\n onAddRing: () => void;\n onSave: () => void;\n}\n\nfunction stopEvent(e: Event): void {\n e.preventDefault();\n e.stopPropagation();\n}\n\nexport function bindCakeControls(options: BindCakeControlsOptions): void {\n const { root, addButtonId, saveButtonId, onAddRing, onSave } = options;\n\n const addBtn = root.querySelector?.(`#${addButtonId}`);\n const saveBtn = root.querySelector?.(`#${saveButtonId}`);\n if (!addBtn || !saveBtn) return;\n\n // renderControls() may run frequently (edit events, addRing, etc.). Prevent\n // accidental multi-binding which would cause one click to create multiple rings.\n const boundKey = \"data-cake-controls-bound\";\n if (\n (addBtn as HTMLElement).hasAttribute(boundKey) ||\n (saveBtn as HTMLElement).hasAttribute(boundKey)\n ) {\n return;\n }\n (addBtn as HTMLElement).setAttribute(boundKey, \"true\");\n (saveBtn as HTMLElement).setAttribute(boundKey, \"true\");\n\n // Prevent Leaflet from treating button interaction as map/circle interaction.\n for (const el of [addBtn, saveBtn]) {\n el.addEventListener(\"pointerdown\", stopEvent);\n el.addEventListener(\"mousedown\", stopEvent);\n el.addEventListener(\"touchstart\", stopEvent);\n }\n\n addBtn.addEventListener(\"click\", (e) => {\n stopEvent(e);\n onAddRing();\n });\n\n saveBtn.addEventListener(\"click\", (e) => {\n stopEvent(e);\n onSave();\n });\n}\n","import type * as L from \"leaflet\";\n\nexport function ensureCircleEditable(circle: L.Circle): void {\n const options: any = (circle as any).options ?? {};\n\n // Leaflet.draw editing expects both `options.original` and `options.editing` to exist.\n // When we create circles programmatically (L.circle), these may be missing which can\n // cause editing.enable() to fail or create detached/incorrect markers.\n if (!options.original) {\n options.original = { ...options };\n }\n if (!options.editing) {\n options.editing = { ...options };\n }\n}\n","import * as L from \"leaflet\";\nimport { v4 as uuidv4 } from \"uuid\";\nimport { bakeLayerCake } from \"@src/lib/layer-cake/CakeBaker\";\nimport { bindCakeControls } from \"@src/lib/layer-cake/bindCakeControls\";\nimport { ensureCircleEditable } from \"@src/lib/layer-cake/ensureCircleEditable\";\nimport type { MeasurementSystem } from \"@src/types/public\";\n\n/**\n * Format distance in meters to a friendly string based on measurement system.\n * Metric: meters (m) or kilometers (km)\n * Imperial: feet (ft) or miles (mi)\n */\nfunction formatDistance(meters: number, system: MeasurementSystem): string {\n if (system === \"imperial\") {\n const feet = meters * 3.28084;\n if (feet >= 5280) {\n const miles = feet / 5280;\n return `${miles.toFixed(2)} mi`;\n }\n return `${Math.round(feet)} ft`;\n }\n\n // Metric (default)\n if (meters >= 1000) {\n return `${(meters / 1000).toFixed(2)} km`;\n }\n return `${Math.round(meters)} m`;\n}\n\nexport class LayerCakeManager {\n private map: L.Map;\n private layers: L.Circle[] = [];\n private controlsGroup: L.LayerGroup;\n private onSave: (geojson: GeoJSON.FeatureCollection) => void;\n private sessionId = uuidv4().slice(0, 8);\n private baseCircleOptions: L.CircleMarkerOptions;\n private detachMapListeners: (() => void)[] = [];\n private renderScheduled = false;\n private measurementSystem: MeasurementSystem;\n\n constructor(\n map: L.Map,\n initialCircle: L.Circle,\n onSave: (geojson: GeoJSON.FeatureCollection) => void,\n measurementSystem: MeasurementSystem = \"metric\",\n ) {\n this.map = map;\n this.onSave = onSave;\n this.measurementSystem = measurementSystem;\n this.controlsGroup = L.layerGroup().addTo(map);\n this.baseCircleOptions = { ...(initialCircle.options as any) };\n delete (this.baseCircleOptions as any).editing;\n delete (this.baseCircleOptions as any).original;\n\n this.addLayer(initialCircle);\n this.installEditEventBridges();\n this.renderControls();\n }\n\n private installEditEventBridges(): void {\n const anyL: any = L as any;\n const EDITMOVE = anyL?.Draw?.Event?.EDITMOVE;\n const EDITRESIZE = anyL?.Draw?.Event?.EDITRESIZE;\n const EDITSTART = anyL?.Draw?.Event?.EDITSTART;\n const EDITSTOP = anyL?.Draw?.Event?.EDITSTOP;\n if (!EDITMOVE || !EDITRESIZE) return;\n\n const onMove = (e: any) => {\n const layer = e?.layer as L.Layer | undefined;\n if (!layer) return;\n if (!this.layers.includes(layer as any)) return;\n this.syncCenters(layer as any);\n };\n\n const onResize = (e: any) => {\n const layer = e?.layer as L.Layer | undefined;\n if (!layer) return;\n if (!this.layers.includes(layer as any)) return;\n this.updateLabels(layer as any);\n this.requestRenderControls();\n };\n\n const onEditStart = (e: any) => {\n const layer = e?.layer as L.Layer | undefined;\n if (!layer) return;\n if (!this.layers.includes(layer as any)) return;\n // Make the tooltip follow the resize handle by updating its position\n const circle = layer as L.Circle;\n const tooltip = (circle as any).getTooltip?.();\n if (tooltip) {\n // Update immediately to show we're in edit mode\n this.updateLabels(circle);\n }\n };\n\n const onEditStop = () => {\n // Reset all labels to simple format (total radius only) and standard position\n this.layers.forEach((circle) => {\n const tooltip = (circle as any).getTooltip?.();\n if (tooltip) {\n circle.setTooltipContent(\n formatDistance(circle.getRadius(), this.measurementSystem),\n );\n // Reset tooltip to standard right-side position\n tooltip.options.offset = [10, 0];\n tooltip.options.direction = \"right\";\n circle.closeTooltip();\n circle.openTooltip();\n }\n });\n };\n\n this.map.on(EDITMOVE, onMove);\n this.map.on(EDITRESIZE, onResize);\n if (EDITSTART) {\n this.map.on(EDITSTART, onEditStart);\n this.detachMapListeners.push(() => this.map.off(EDITSTART, onEditStart));\n }\n if (EDITSTOP) {\n this.map.on(EDITSTOP, onEditStop);\n this.detachMapListeners.push(() => this.map.off(EDITSTOP, onEditStop));\n }\n this.detachMapListeners.push(() => this.map.off(EDITMOVE, onMove));\n this.detachMapListeners.push(() => this.map.off(EDITRESIZE, onResize));\n }\n\n private requestRenderControls(): void {\n if (this.renderScheduled) return;\n this.renderScheduled = true;\n\n const schedule =\n typeof requestAnimationFrame === \"function\"\n ? requestAnimationFrame\n : (cb: FrameRequestCallback) => setTimeout(() => cb(0), 0);\n\n schedule(() => {\n this.renderScheduled = false;\n this.renderControls();\n });\n }\n\n private addLayer(circle: L.Circle): void {\n this.layers.push(circle);\n circle.addTo(this.map);\n\n // Bind a permanent tooltip showing the total radius\n circle.bindTooltip(\n formatDistance(circle.getRadius(), this.measurementSystem),\n {\n permanent: true,\n direction: \"right\",\n className: \"cake-label\",\n offset: [10, 0],\n },\n );\n\n const editing: any = (circle as any).editing;\n // For programmatically-created circles, Leaflet.draw can compute resize handle points\n // from `_radius` (pixel radius). Ensure the circle has been projected/rendered first.\n // Deferring to the next tick stabilizes handle placement in Shadow DOM + Canvas paths.\n setTimeout(() => {\n try {\n circle.redraw?.();\n ensureCircleEditable(circle);\n if (editing?.enabled?.()) {\n editing.updateMarkers?.();\n this.requestRenderControls();\n return;\n }\n editing?.enable?.();\n editing?.updateMarkers?.();\n this.requestRenderControls();\n } catch {\n // Ignore editing setup failures; cake circles should still exist even without handles.\n }\n }, 0);\n }\n\n public addRing(): void {\n if (this.layers.length >= 10) return;\n const largest = this.getLargestCircle();\n if (!largest) return;\n\n const newRadius = largest.getRadius() * 1.5;\n const newCircle = L.circle(largest.getLatLng(), {\n ...(this.baseCircleOptions as any),\n radius: newRadius,\n });\n this.addLayer(newCircle);\n this.renderControls();\n }\n\n public save(): void {\n const geojson = bakeLayerCake({ circles: this.layers });\n this.onSave(geojson);\n this.destroy();\n }\n\n private getLargestCircle(): L.Circle | null {\n if (this.layers.length === 0) return null;\n return this.layers.reduce((prev, current) =>\n prev.getRadius() > current.getRadius() ? prev : current,\n );\n }\n\n private syncCenters(sourceCircle: L.Circle): void {\n const newCenter = sourceCircle.getLatLng();\n this.layers.forEach((layer) => {\n if (layer === sourceCircle) return;\n layer.setLatLng(newCenter);\n layer.redraw?.();\n (layer as any).editing?.updateMarkers?.();\n });\n this.requestRenderControls();\n }\n\n /**\n * Update the label for the active circle being resized.\n * Shows both total radius and delta (ring width) from the next smaller circle.\n * Positions the tooltip on the left side to avoid toolbar interference.\n */\n private updateLabels(activeCircle: L.Circle): void {\n const currentRadius = activeCircle.getRadius();\n let labelText = formatDistance(currentRadius, this.measurementSystem);\n\n // Find all circles smaller than this one\n const smallerCircles = this.layers.filter(\n (c) => c !== activeCircle && c.getRadius() < currentRadius,\n );\n\n if (smallerCircles.length > 0) {\n // Find the largest of the smaller circles (the immediate inner neighbor)\n const innerNeighbor = smallerCircles.reduce((prev, curr) =>\n prev.getRadius() > curr.getRadius() ? prev : curr,\n );\n\n const delta = currentRadius - innerNeighbor.getRadius();\n const deltaStr = formatDistance(delta, this.measurementSystem);\n // Show both total and delta during editing\n labelText = `${formatDistance(currentRadius, this.measurementSystem)} (+${deltaStr})`;\n }\n\n // Update the tooltip content and position\n const tooltip = (activeCircle as any).getTooltip?.();\n if (tooltip) {\n activeCircle.setTooltipContent(labelText);\n\n // Position tooltip on the LEFT (West) side to avoid toolbar at NorthEast\n const bounds = activeCircle.getBounds();\n const westPoint = bounds.getSouthWest();\n westPoint.lat = activeCircle.getLatLng().lat; // Center it vertically\n\n tooltip.options.direction = \"left\";\n tooltip.options.offset = [-10, 0];\n tooltip.setLatLng(westPoint);\n\n // Ensure tooltip is open and visible during editing\n activeCircle.closeTooltip();\n activeCircle.openTooltip();\n }\n }\n\n private renderControls(): void {\n this.controlsGroup.clearLayers();\n const largest = this.getLargestCircle();\n if (!largest) return;\n\n const bounds = largest.getBounds();\n const anchor = bounds.getNorthEast();\n\n const addId = `cake-add-${this.sessionId}`;\n const saveId = `cake-save-${this.sessionId}`;\n\n const uiIcon = L.divIcon({\n className: \"layer-cake-controls\",\n html: `\n <div class=\"layer-cake-controls__container\">\n <button id=\"${addId}\" type=\"button\">➕ Ring</button>\n <button id=\"${saveId}\" type=\"button\" class=\"layer-cake-controls__save\">💾 Save</button>\n </div>\n `,\n iconSize: [140, 40],\n iconAnchor: [-10, 20],\n });\n\n L.marker(anchor, {\n icon: uiIcon,\n interactive: true,\n keyboard: false,\n bubblingMouseEvents: false,\n }).addTo(this.controlsGroup);\n\n setTimeout(() => {\n // Important: the map likely lives in a ShadowRoot; document.getElementById won't find these.\n const root: ParentNode = this.map.getContainer();\n bindCakeControls({\n root,\n addButtonId: addId,\n saveButtonId: saveId,\n onAddRing: () => this.addRing(),\n onSave: () => this.save(),\n });\n }, 0);\n }\n\n public destroy(): void {\n this.detachMapListeners.forEach((fn) => {\n try {\n fn();\n } catch {\n // Ignore listener cleanup errors during teardown\n }\n });\n this.detachMapListeners = [];\n\n this.layers.forEach((l) => this.map.removeLayer(l));\n this.layers = [];\n this.controlsGroup.clearLayers();\n this.map.removeLayer(this.controlsGroup);\n }\n}\n","export default \"<?xml version=\\\"1.0\\\" encoding=\\\"utf-8\\\"?>\\n\\r<!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->\\n<svg width=\\\"800px\\\" height=\\\"800px\\\" viewBox=\\\"0 -1.67 47.336 47.336\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\">\\r\\n <g id=\\\"Group_42\\\" data-name=\\\"Group 42\\\" transform=\\\"translate(-172.455 -364.36)\\\">\\r\\n <path id=\\\"Rectangle_17\\\" data-name=\\\"Rectangle 17\\\" d=\\\"M4.351,0H40.984a4.351,4.351,0,0,1,4.351,4.351V22.117a1,1,0,0,1-1,1H1a1,1,0,0,1-1-1V4.351A4.351,4.351,0,0,1,4.351,0Z\\\" transform=\\\"translate(173.455 384.243)\\\" fill=\\\"none\\\" stroke=\\\"#000000\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"/>\\r\\n <path id=\\\"Path_90\\\" data-name=\\\"Path 90\\\" d=\\\"M218.79,390.249a3.778,3.778,0,0,1-3.778,3.778h0a3.779,3.779,0,0,1-3.778-3.778,3.778,3.778,0,0,1-3.778,3.778h0a3.779,3.779,0,0,1-3.778-3.778,3.778,3.778,0,0,1-3.778,3.778h0a3.779,3.779,0,0,1-3.778-3.778,3.778,3.778,0,0,1-3.778,3.778h0a3.779,3.779,0,0,1-3.778-3.778,3.778,3.778,0,0,1-3.778,3.778h0a3.779,3.779,0,0,1-3.778-3.778,3.778,3.778,0,0,1-3.778,3.778h0a3.778,3.778,0,0,1-3.777-3.778\\\" fill=\\\"none\\\" stroke=\\\"#000000\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"/>\\r\\n <g id=\\\"Group_41\\\" data-name=\\\"Group 41\\\">\\r\\n <path id=\\\"Rectangle_18\\\" data-name=\\\"Rectangle 18\\\" d=\\\"M4.351,0H26.473a4.351,4.351,0,0,1,4.351,4.351V17.883a1,1,0,0,1-1,1H1a1,1,0,0,1-1-1V4.351A4.351,4.351,0,0,1,4.351,0Z\\\" transform=\\\"translate(180.71 365.36)\\\" fill=\\\"none\\\" stroke=\\\"#000000\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"/>\\r\\n <path id=\\\"Path_91\\\" data-name=\\\"Path 91\\\" d=\\\"M211.234,370.794a3.778,3.778,0,0,1-3.778,3.778h0a3.779,3.779,0,0,1-3.778-3.778,3.778,3.778,0,0,1-3.778,3.778h0a3.779,3.779,0,0,1-3.778-3.778,3.778,3.778,0,0,1-3.778,3.778h0a3.779,3.779,0,0,1-3.778-3.778,3.778,3.778,0,0,1-3.778,3.778h0a3.779,3.779,0,0,1-3.778-3.778\\\" fill=\\\"none\\\" stroke=\\\"#000000\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"/>\\r\\n </g>\\r\\n </g>\\r\\n</svg>\"","export default \"<?xml version=\\\"1.0\\\" encoding=\\\"utf-8\\\"?>\\n<!-- Four-way directional arrow icon for move tool -->\\n<svg width=\\\"800px\\\" height=\\\"800px\\\" viewBox=\\\"0 0 24 24\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\">\\n <g fill=\\\"none\\\" stroke=\\\"#000000\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\">\\n <!-- Up arrow -->\\n <path d=\\\"M12 2 L12 22\\\"/>\\n <path d=\\\"M12 2 L9 5\\\"/>\\n <path d=\\\"M12 2 L15 5\\\"/>\\n <!-- Down arrow -->\\n <path d=\\\"M12 22 L9 19\\\"/>\\n <path d=\\\"M12 22 L15 19\\\"/>\\n <!-- Left arrow -->\\n <path d=\\\"M2 12 L22 12\\\"/>\\n <path d=\\\"M2 12 L5 9\\\"/>\\n <path d=\\\"M2 12 L5 15\\\"/>\\n <!-- Right arrow -->\\n <path d=\\\"M22 12 L19 9\\\"/>\\n <path d=\\\"M22 12 L19 15\\\"/>\\n </g>\\n</svg>\\n\"","const WGS84_A = 6378137.0;\nconst WGS84_B = 6356752.314245;\nconst WGS84_F = 1 / 298.257223563;\nconst DEG_TO_RAD = Math.PI / 180;\nconst RAD_TO_DEG = 180 / Math.PI;\n\nconst MAGIC_SCALE = 1_000_000_000;\n\nfunction toPrecise(value: number): number {\n const scaled = BigInt(Math.round(value * MAGIC_SCALE));\n return Number(scaled) / MAGIC_SCALE;\n}\n\nfunction toRadians(value: number): number {\n return toPrecise(value) * DEG_TO_RAD;\n}\n\nfunction normalizeBearing(rad: number): number {\n const deg = (rad * RAD_TO_DEG) % 360;\n return deg < 0 ? deg + 360 : deg;\n}\n\nexport function magicRound(value: number): number {\n const scaled = BigInt(Math.round(value * MAGIC_SCALE));\n return Number(scaled) / MAGIC_SCALE;\n}\n\ninterface VincentyResult {\n distanceMeters: number;\n bearingRad: number;\n iterations: number;\n converged: boolean;\n}\n\ninterface KarneyResult {\n distanceMeters: number;\n bearingRad: number;\n}\n\nexport interface PreciseDistanceResult {\n meters: number;\n bearingDegrees: number;\n algorithm: \"vincenty\" | \"karney\";\n iterations: number;\n}\n\nexport function computePreciseDistance(\n lat1: number,\n lon1: number,\n lat2: number,\n lon2: number,\n): PreciseDistanceResult {\n const vincenty = vincentyDistance(lat1, lon1, lat2, lon2);\n if (vincenty.converged) {\n return {\n meters: magicRound(vincenty.distanceMeters),\n bearingDegrees: normalizeBearing(vincenty.bearingRad),\n algorithm: \"vincenty\",\n iterations: vincenty.iterations,\n };\n }\n\n const karney = karneyDistance(lat1, lon1, lat2, lon2);\n return {\n meters: magicRound(karney.distanceMeters),\n bearingDegrees: normalizeBearing(karney.bearingRad),\n algorithm: \"karney\",\n iterations: vincenty.iterations,\n };\n}\n\nfunction vincentyDistance(\n lat1: number,\n lon1: number,\n lat2: number,\n lon2: number,\n): VincentyResult {\n const phi1 = toRadians(lat1);\n const phi2 = toRadians(lat2);\n const L = toRadians(lon2 - lon1);\n\n const U1 = Math.atan((1 - WGS84_F) * Math.tan(phi1));\n const U2 = Math.atan((1 - WGS84_F) * Math.tan(phi2));\n const sinU1 = Math.sin(U1);\n const cosU1 = Math.cos(U1);\n const sinU2 = Math.sin(U2);\n const cosU2 = Math.cos(U2);\n\n let lambda = L;\n let lambdaPrev = 0;\n let iterations = 0;\n const MAX = 200;\n let sinSigma = 0;\n let cosSigma = 0;\n let sigma = 0;\n let sinAlpha = 0;\n let cosSqAlpha = 0;\n let cos2SigmaM = 0;\n\n while (Math.abs(lambda - lambdaPrev) > 1e-12 && iterations < MAX) {\n const sinLambda = Math.sin(lambda);\n const cosLambda = Math.cos(lambda);\n\n sinSigma = Math.sqrt(\n (cosU2 * sinLambda) ** 2 +\n (cosU1 * sinU2 - sinU1 * cosU2 * cosLambda) ** 2,\n );\n\n if (sinSigma === 0) {\n return {\n distanceMeters: 0,\n bearingRad: 0,\n iterations,\n converged: true,\n };\n }\n\n cosSigma = sinU1 * sinU2 + cosU1 * cosU2 * cosLambda;\n sigma = Math.atan2(sinSigma, cosSigma);\n\n sinAlpha = (cosU1 * cosU2 * sinLambda) / sinSigma;\n cosSqAlpha = 1 - sinAlpha ** 2;\n\n cos2SigmaM =\n cosSqAlpha === 0 ? 0 : cosSigma - (2 * sinU1 * sinU2) / cosSqAlpha;\n\n const C =\n (WGS84_F / 16) * cosSqAlpha * (4 + WGS84_F * (4 - 3 * cosSqAlpha));\n\n lambdaPrev = lambda;\n lambda =\n L +\n (1 - C) *\n WGS84_F *\n sinAlpha *\n (sigma +\n C *\n sinSigma *\n (cos2SigmaM + C * cosSigma * (-1 + 2 * cos2SigmaM ** 2)));\n\n iterations += 1;\n }\n\n if (iterations >= MAX) {\n return {\n distanceMeters: Number.NaN,\n bearingRad: 0,\n iterations,\n converged: false,\n };\n }\n\n const uSq = ((WGS84_A ** 2 - WGS84_B ** 2) / WGS84_B ** 2) * cosSqAlpha;\n\n const A = 1 + (uSq / 16384) * (4096 + uSq * (-768 + uSq * (320 - 175 * uSq)));\n const B = (uSq / 1024) * (256 + uSq * (-128 + uSq * (74 - 47 * uSq)));\n\n const deltaSigma =\n B *\n sinSigma *\n (cos2SigmaM +\n (B / 4) *\n (cosSigma * (-1 + 2 * cos2SigmaM ** 2) -\n (B / 6) *\n cos2SigmaM *\n (-3 + 4 * sinSigma ** 2) *\n (-3 + 4 * cos2SigmaM ** 2)));\n\n const s = WGS84_B * A * (sigma - deltaSigma);\n\n const bearing = Math.atan2(\n cosU2 * Math.sin(lambda),\n cosU1 * sinU2 - sinU1 * cosU2 * Math.cos(lambda),\n );\n\n return {\n distanceMeters: s,\n bearingRad: bearing,\n iterations,\n converged: true,\n };\n}\n\nfunction karneyDistance(\n lat1: number,\n lon1: number,\n lat2: number,\n lon2: number,\n): KarneyResult {\n const phi1 = toRadians(lat1);\n const phi2 = toRadians(lat2);\n const L = toRadians(lon2 - lon1);\n\n const U1 = Math.atan((1 - WGS84_F) * Math.tan(phi1));\n const U2 = Math.atan((1 - WGS84_F) * Math.tan(phi2));\n\n const sinU1 = Math.sin(U1);\n const cosU1 = Math.cos(U1);\n const sinU2 = Math.sin(U2);\n const cosU2 = Math.cos(U2);\n\n const sinSigma = Math.sqrt(\n (cosU2 * Math.sin(L)) ** 2 +\n (cosU1 * sinU2 - sinU1 * cosU2 * Math.cos(L)) ** 2,\n );\n const cosSigma = sinU1 * sinU2 + cosU1 * cosU2 * Math.cos(L);\n const sigma = Math.atan2(sinSigma, cosSigma);\n if (sigma === 0) {\n return { distanceMeters: 0, bearingRad: 0 };\n }\n\n const sinAlpha = (cosU1 * cosU2 * Math.sin(L)) / Math.sin(sigma);\n const cosSqAlpha = 1 - sinAlpha ** 2;\n const cos2SigmaM =\n cosSqAlpha === 0 ? 0 : cosSigma - (2 * sinU1 * sinU2) / cosSqAlpha;\n\n const uSq = ((WGS84_A ** 2 - WGS84_B ** 2) / WGS84_B ** 2) * cosSqAlpha;\n\n const A = 1 + (uSq / 16384) * (4096 + uSq * (-768 + uSq * (320 - 175 * uSq)));\n const B = (uSq / 1024) * (256 + uSq * (-128 + uSq * (74 - 47 * uSq)));\n const deltaSigma =\n B *\n sinSigma *\n (cos2SigmaM +\n (B / 4) *\n (cosSigma * (-1 + 2 * cos2SigmaM ** 2) -\n (B / 6) *\n cos2SigmaM *\n (-3 + 4 * sinSigma ** 2) *\n (-3 + 4 * cos2SigmaM ** 2)));\n\n const s = WGS84_B * A * (sigma - deltaSigma);\n const bearing = Math.atan2(\n cosU2 * Math.sin(L),\n cosU1 * sinU2 - sinU1 * cosU2 * Math.cos(L),\n );\n\n return { distanceMeters: s, bearingRad: bearing };\n}\n","export type MeasurementSystem = \"metric\" | \"imperial\";\n\nexport interface RulerLengthUnitOptions {\n display: string;\n decimal: number;\n factor: number | null;\n label: string;\n}\n\nexport interface RulerAngleUnitOptions {\n display: string;\n decimal: number;\n factor: number | null;\n label: string;\n}\n\nexport interface RulerOptions {\n position: string;\n circleMarker: {\n color: string;\n radius: number;\n };\n lineStyle: {\n color: string;\n dashArray: string;\n };\n lengthUnit: RulerLengthUnitOptions;\n angleUnit: RulerAngleUnitOptions;\n}\n\nconst BASE_OPTIONS: Omit<RulerOptions, \"lengthUnit\"> = {\n position: \"topleft\",\n circleMarker: {\n color: \"red\",\n radius: 2,\n },\n lineStyle: {\n color: \"red\",\n dashArray: \"1,6\",\n },\n angleUnit: {\n display: \"°\",\n decimal: 2,\n factor: null,\n label: \"Bearing:\",\n },\n};\n\nconst METRIC_LENGTH: RulerLengthUnitOptions = {\n display: \"km\",\n decimal: 2,\n factor: null,\n label: \"Distance (km):\",\n};\n\nconst IMPERIAL_LENGTH: RulerLengthUnitOptions = {\n display: \"mi\",\n decimal: 2,\n factor: 0.621371,\n label: \"Distance (mi):\",\n};\n\n/**\n * Build Leaflet-ruler options for a given measurement system.\n */\nexport function getRulerOptions(system: MeasurementSystem): RulerOptions {\n const lengthUnit =\n system === \"imperial\" ? { ...IMPERIAL_LENGTH } : { ...METRIC_LENGTH };\n\n return {\n ...BASE_OPTIONS,\n lengthUnit,\n };\n}\n\nexport const measurementSystemDescriptions: Record<MeasurementSystem, string> =\n {\n metric: \"Meters / Kilometers\",\n imperial: \"Feet / Miles\",\n };\n","import type * as LType from \"leaflet\";\n\nexport interface AssertDrawOptions {\n onError?: (message: string) => void;\n}\n\n/**\n * Validate that Leaflet.draw APIs exist on the provided Leaflet namespace.\n * Returns true when present, false otherwise.\n */\nexport function assertDrawPresent(\n L: typeof LType,\n opts: AssertDrawOptions = {},\n): boolean {\n const hasControlDraw = Boolean((L?.Control as any)?.Draw);\n const hasDrawNamespace = Boolean((L as any).draw);\n const ok = hasControlDraw && hasDrawNamespace;\n if (!ok) {\n opts.onError?.(\n \"Leaflet.draw is not available on the provided Leaflet instance\",\n );\n }\n return ok;\n}\n","import * as BundledL from \"leaflet\";\nimport \"leaflet-draw\";\nimport \"leaflet-ruler\";\nimport type { Feature, FeatureCollection } from \"geojson\";\nimport type {\n DrawControlsConfig,\n MapConfig,\n MeasurementSystem,\n} from \"@src/types/public\";\nimport { createLogger, type Logger } from \"@src/utils/logger\";\nimport { FeatureStore } from \"@src/lib/FeatureStore\";\nimport { registerLayerCakeTool } from \"@src/lib/draw/toolbar-patch\";\nimport { DrawCake, ensureDrawCakeRegistered } from \"@src/lib/draw/L.Draw.Cake\";\nimport { ensureDrawMoveRegistered } from \"@src/lib/draw/L.Draw.Move\";\nimport type { DrawMove } from \"@src/lib/draw/L.Draw.Move\";\nimport { LayerCakeManager } from \"@src/lib/layer-cake/LayerCakeManager\";\nimport layerCakeIconSvg from \"@src/assets/layer-cake.svg?raw\";\nimport moveToolIconSvg from \"@src/assets/move-tool.svg?raw\";\nimport {\n expandMultiGeometries,\n mergePolygons,\n isPolygon,\n isMultiPolygon,\n} from \"@src/utils/geojson\";\nimport { computePreciseDistance, magicRound } from \"@src/utils/geodesic\";\nimport {\n getRulerOptions,\n measurementSystemDescriptions,\n} from \"@src/utils/ruler\";\nimport { assertDrawPresent } from \"@src/utils/leaflet-guards\";\n\nlet rulerPrecisionPatched = false;\n\nexport interface MapControllerCallbacks {\n onReady?: (detail: { bounds?: [[number, number], [number, number]] }) => void;\n onCreated?: (detail: {\n id: string;\n layerType: \"polygon\" | \"polyline\" | \"rectangle\" | \"circle\" | \"marker\";\n geoJSON: Feature;\n }) => void;\n onEdited?: (detail: { ids: string[]; geoJSON: FeatureCollection }) => void;\n onDeleted?: (detail: { ids: string[]; geoJSON: FeatureCollection }) => void;\n onError?: (detail: { message: string; cause?: unknown }) => void;\n}\n\nexport interface MapControllerOptions {\n container: HTMLElement;\n map: MapConfig;\n controls: DrawControlsConfig;\n readOnly?: boolean;\n logger?: Logger;\n callbacks?: MapControllerCallbacks;\n /** Optional injected Leaflet namespace to use instead of bundled import. */\n leaflet?: typeof BundledL;\n /** Prefer external Leaflet if available (falls back to bundled if missing/invalid). */\n useExternalLeaflet?: boolean;\n}\n\n/**\n * MapController: initializes Leaflet map + Draw, bridges events, and manages data via FeatureStore.\n */\nexport class MapController {\n private container: HTMLElement;\n private logger: Logger;\n private options: MapControllerOptions;\n\n // Active Leaflet namespace (injected or bundled fallback)\n private L: typeof BundledL;\n\n // Data store (id-centric)\n private store: FeatureStore;\n\n // Leaflet entities\n private map: BundledL.Map | null = null;\n private drawnItems: BundledL.FeatureGroup | null = null;\n // Keep 'any' here to avoid type friction across different @types/leaflet-draw versions\n private drawControl: any | null = null;\n private rulerControl: BundledL.Control.Ruler | null = null;\n private measurementControl: BundledL.Control | null = null;\n private measurementSystem: MeasurementSystem = \"metric\";\n private measurementModalOverlay: HTMLDivElement | null = null;\n private measurementModalDialog: HTMLDivElement | null = null;\n private measurementModalRadios: Partial<\n Record<MeasurementSystem, HTMLInputElement>\n > = {};\n private measurementModalKeydownHandler: ((e: KeyboardEvent) => void) | null =\n null;\n\n // Detacher for our polygon close-on-first-vertex patch\n private detachPolygonFinishPatch: (() => void) | null = null;\n\n // Context menu for vertex deletion\n private vertexMenuEl: HTMLDivElement | null = null;\n private vertexMenuCleanup: (() => void) | null = null;\n private activeCakeSession: LayerCakeManager | null = null;\n\n // Move tool UI elements\n private moveConfirmationUI: HTMLDivElement | null = null;\n private activeMoveHandler: DrawMove | null = null;\n\n constructor(opts: MapControllerOptions) {\n this.options = opts;\n this.container = opts.container;\n this.logger = (opts.logger ?? createLogger(\"controller\", \"debug\")).child(\n \"map\",\n );\n this.L = this.resolveLeaflet(opts);\n this.store = new FeatureStore(this.logger.child(\"store\"));\n this.logger.debug(\"ctor\", {\n config: opts.map,\n controls: opts.controls,\n readOnly: opts.readOnly,\n useExternalLeaflet: opts.useExternalLeaflet,\n });\n\n ensureDrawCakeRegistered(this.L);\n ensureDrawMoveRegistered(this.L);\n registerLayerCakeTool(this.L);\n }\n\n private resolveLeaflet(opts: MapControllerOptions): typeof BundledL {\n const preferExternal = opts.useExternalLeaflet;\n if (!preferExternal) {\n return BundledL;\n }\n\n if (opts.leaflet && assertDrawPresent(opts.leaflet)) {\n this.logger.debug(\"leaflet-runtime:external-injected\");\n return opts.leaflet;\n }\n\n const globalL = (globalThis as any).L as typeof BundledL | undefined;\n if (globalL && assertDrawPresent(globalL)) {\n this.logger.debug(\"leaflet-runtime:external-global\");\n return globalL;\n }\n\n this.logger.warn(\"leaflet-runtime:external-fallback-bundled\", {\n message:\n \"External Leaflet requested but Draw APIs were missing; falling back to bundled Leaflet/Draw\",\n });\n return BundledL;\n }\n\n // ---------------- Lifecycle ----------------\n\n async init(): Promise<void> {\n const t0 = performance.now?.() ?? Date.now();\n try {\n // Remove any previous instance\n await this.destroy();\n\n // Create the map\n const {\n latitude,\n longitude,\n zoom,\n minZoom,\n maxZoom,\n tileUrl,\n tileAttribution,\n preferCanvas = true, // Default to Canvas rendering for better performance\n useExternalLeaflet,\n } = this.options.map;\n const center: [number, number] = [latitude, longitude];\n const Lns = this.L;\n\n if (useExternalLeaflet) {\n assertDrawPresent(Lns, {\n onError: (message: string) =>\n this.logger.warn(\"external-leaflet-missing-draw\", { message }),\n });\n }\n this.map = Lns.map(this.container, {\n zoomControl: true,\n preferCanvas,\n }).setView(center, zoom);\n\n // Add tile layer\n Lns.tileLayer(tileUrl, {\n attribution: tileAttribution,\n minZoom,\n maxZoom,\n }).addTo(this.map);\n\n // FeatureGroup for all drawn layers\n this.drawnItems = Lns.featureGroup().addTo(this.map);\n\n // Draw control\n const drawOptions = this.buildDrawOptions(\n this.options.controls,\n !!this.options.readOnly,\n );\n const DrawCtor = (Lns.Control as any).Draw; // tolerate type friction\n this.drawControl = new DrawCtor(drawOptions);\n this.map.addControl(this.drawControl);\n this.applyLayerCakeToolbarIcon();\n this.applyMoveToolbarIcon();\n\n if (this.options.controls.ruler) {\n this.logger.debug(\"init:ruler\", {\n available: typeof Lns.control.ruler === \"function\",\n });\n if (typeof Lns.control.ruler === \"function\") {\n this.addRulerControl();\n this.installMeasurementSettingsControl();\n } else {\n this.logger.warn(\"init:ruler:missing\", {\n msg: \"L.control.ruler is not defined\",\n });\n }\n }\n\n // Patch known Leaflet.draw bugs (e.g., readableArea strict-mode variable)\n this.patchLeafletDrawBugs();\n\n // Patch: reliably allow closing polygons by clicking the first vertex (Shadow DOM safe)\n this.installPolygonFinishPatch();\n\n // Ensure Leaflet measures the container after layout\n this.map.invalidateSize();\n setTimeout(() => {\n try {\n this.map?.invalidateSize();\n } catch {\n // Ignore invalidateSize errors - this is just a UI refresh\n }\n }, 0);\n\n // Bind draw events\n this.bindDrawEvents();\n\n const elapsed = (performance.now?.() ?? Date.now()) - t0;\n this.logger.debug(\"init:ready\", { elapsedMs: Math.round(elapsed) });\n\n // Announce ready with current bounds (if any)\n const b = this.store.bounds();\n this.options.callbacks?.onReady?.(b ? { bounds: b } : {});\n } catch (err) {\n this._error(\"Failed to initialize Leaflet map\", err);\n }\n }\n\n async destroy(): Promise<void> {\n try {\n if (this.map) {\n this.map.off();\n this.map.remove();\n }\n } catch (err) {\n this._error(\"Failed to remove Leaflet map\", err);\n }\n\n // Detach polygon finish patch (if installed)\n try {\n this.detachPolygonFinishPatch?.();\n } catch {\n // Ignore errors when detaching polygon finish patch during cleanup\n }\n this.detachPolygonFinishPatch = null;\n\n // Cleanup vertex menu if present\n try {\n this.vertexMenuCleanup?.();\n } catch {\n // Ignore errors when cleaning up vertex menu during destruction\n }\n this.vertexMenuEl = null;\n this.vertexMenuCleanup = null;\n\n // Cleanup move confirmation UI if present\n try {\n this.hideMoveConfirmationUI();\n } catch {\n // Ignore errors when cleaning up move confirmation UI during destruction\n }\n\n this.drawControl = null;\n this.rulerControl = null;\n this.measurementControl = null;\n this.removeMeasurementModal();\n this.drawnItems = null;\n\n try {\n this.activeCakeSession?.destroy();\n } catch {\n // Ignore errors when cleaning up an in-progress cake session\n }\n this.activeCakeSession = null;\n\n this.map = null;\n }\n\n // ---------------- Public API (data) ----------------\n\n async getGeoJSON(): Promise<FeatureCollection> {\n return this.store.toFeatureCollection();\n }\n\n async loadGeoJSON(\n fc: FeatureCollection,\n fitToData: boolean = false,\n ): Promise<void> {\n if (!this.map || !this.drawnItems) return;\n // Clear existing\n await this.clearLayers();\n\n // Add new features into store + map layers\n const normalized = expandMultiGeometries(fc);\n const ids = this.store.add(normalized);\n const layers = this.L.geoJSON(normalized);\n let i = 0;\n layers.eachLayer((layer: any) => {\n (layer as any)._fid = ids[i] ?? ids[ids.length - 1];\n this.drawnItems!.addLayer(layer);\n this.installVertexContextMenu(layer);\n i++;\n });\n\n this.logger.debug(\"loadGeoJSON\", {\n count: normalized.features.length,\n ids,\n });\n\n if (fitToData) {\n await this.fitBoundsToData();\n }\n }\n\n async clearLayers(): Promise<void> {\n if (this.drawnItems) {\n this.drawnItems.clearLayers();\n }\n this.store.clear();\n }\n\n async addFeatures(fc: FeatureCollection): Promise<string[]> {\n if (!this.map || !this.drawnItems) return [];\n const normalized = expandMultiGeometries(fc);\n const ids = this.store.add(normalized);\n const layers = this.L.geoJSON(normalized);\n let i = 0;\n layers.eachLayer((layer: any) => {\n (layer as any)._fid = ids[i] ?? ids[ids.length - 1];\n this.drawnItems!.addLayer(layer);\n this.installVertexContextMenu(layer);\n i++;\n });\n return ids;\n }\n\n async updateFeature(id: string, feature: Feature): Promise<void> {\n this.store.update(id, feature);\n // Replace layer visually if present: naive approach is to re-add a new layer, but for now we only update store;\n // a later pass will sync layer geometries precisely.\n }\n\n async removeFeature(id: string): Promise<void> {\n // Remove matching layer(s)\n if (this.drawnItems) {\n this.drawnItems.eachLayer((layer: any) => {\n if ((layer as any)._fid === id) {\n this.drawnItems!.removeLayer(layer);\n }\n });\n }\n this.store.remove(id);\n }\n\n // ---------------- Public API (map) ----------------\n\n async fitBoundsToData(paddingRatio: number = 0.05): Promise<void> {\n if (!this.map) return;\n const b = this.store.bounds();\n if (!b) return;\n const boundsLiteral = b as unknown as BundledL.LatLngBoundsLiteral;\n const bounds = this.L.latLngBounds(boundsLiteral);\n // Compute padded bounds by interpolating\n if (paddingRatio > 0) {\n const sw = bounds.getSouthWest();\n const ne = bounds.getNorthEast();\n const latPad = (ne.lat - sw.lat) * paddingRatio;\n const lngPad = (ne.lng - sw.lng) * paddingRatio;\n const padded = this.L.latLngBounds(\n this.L.latLng(sw.lat - latPad, sw.lng - lngPad),\n this.L.latLng(ne.lat + latPad, ne.lng + lngPad),\n );\n this.map.fitBounds(padded);\n } else {\n this.map.fitBounds(bounds);\n }\n }\n\n async fitBounds(\n boundsTuple: [[number, number], [number, number]],\n paddingRatio: number = 0.05,\n ): Promise<void> {\n if (!this.map) return;\n const bounds = (this.L as any).latLngBounds(boundsTuple as any);\n if (paddingRatio > 0) {\n const sw = bounds.getSouthWest();\n const ne = bounds.getNorthEast();\n const latPad = (ne.lat - sw.lat) * paddingRatio;\n const lngPad = (ne.lng - sw.lng) * paddingRatio;\n const padded = (this.L as any).latLngBounds(\n (this.L as any).latLng(sw.lat - latPad, sw.lng - lngPad),\n (this.L as any).latLng(ne.lat + latPad, ne.lng + lngPad),\n );\n this.map.fitBounds(padded);\n } else {\n this.map.fitBounds(bounds);\n }\n }\n\n async setView(lat: number, lng: number, zoom?: number): Promise<void> {\n if (!this.map) return;\n this.map.setView([lat, lng], zoom ?? this.map.getZoom());\n }\n\n /**\n * Merge all visible polygon features into a single polygon feature.\n * This removes the original features and adds a new feature with the merged geometry.\n *\n * @param options Optional configuration for the merge operation\n * @returns The ID of the newly created merged feature, or null if no polygons to merge\n */\n async mergeVisiblePolygons(options?: {\n /** Properties to apply to the merged feature (defaults to properties from first polygon) */\n properties?: Record<string, any>;\n }): Promise<string | null> {\n if (!this.map || !this.drawnItems) return null;\n\n // Get all current features\n const fc = await this.getGeoJSON();\n\n // Filter for polygon features only\n const polygonFeatures = fc.features.filter((feature) => {\n const geom = feature.geometry;\n return geom && (isPolygon(geom) || isMultiPolygon(geom));\n });\n\n if (polygonFeatures.length <= 1) {\n // No polygons or just one polygon - nothing to merge\n if (polygonFeatures.length === 1) {\n const existingId = (polygonFeatures[0] as any).id;\n return existingId ? String(existingId) : null;\n }\n return null;\n }\n\n // Merge the polygons\n const mergedFeature = mergePolygons(polygonFeatures, options?.properties);\n if (!mergedFeature) return null;\n\n // Get IDs of original polygons to remove - extract from feature.id\n const idsToRemove: string[] = [];\n for (const feature of polygonFeatures) {\n const id = (feature as any).id;\n if (id) idsToRemove.push(String(id));\n }\n\n // Remove original polygons\n for (const id of idsToRemove) {\n await this.removeFeature(id);\n }\n\n // Add the merged polygon as a new feature\n const [newFeatureId] = await this.addFeatures({\n type: \"FeatureCollection\",\n features: [mergedFeature],\n });\n\n return newFeatureId || null;\n }\n\n setRulerUnits(system: MeasurementSystem): void {\n if (this.measurementSystem === system) return;\n this.measurementSystem = system;\n this.logger.debug(\"ruler:units\", { system });\n this.syncMeasurementModalState();\n this.rebuildRulerControl();\n }\n\n // ---------------- Internals ----------------\n\n private buildDrawOptions(\n controls: DrawControlsConfig,\n readOnly: boolean,\n ): BundledL.Control.DrawOptions {\n // Define explicit options for each tool to ensure consistent behavior.\n const draw: Record<string, any> = {\n polygon: controls.polygon\n ? {\n allowIntersection:\n this.options.map.polygonAllowIntersection ?? false, // Disallow self-intersections by default\n showArea: true, // Display area tooltip while drawing\n shapeOptions: {\n color: \"#3388ff\", // Default shape color\n },\n }\n : false,\n polyline: controls.polyline\n ? {\n shapeOptions: {\n color: \"#3388ff\",\n },\n }\n : false,\n rectangle: controls.rectangle\n ? {\n shapeOptions: {\n color: \"#3388ff\",\n },\n }\n : false,\n circle: controls.circle\n ? {\n shapeOptions: {\n color: \"#3388ff\",\n },\n }\n : false,\n cake: controls.cake\n ? {\n shapeOptions: {\n color: \"#8A2BE2\", // Violet color for distinction\n fillOpacity: 0.2,\n },\n }\n : false,\n marker: controls.marker ? {} : false,\n move: controls.move\n ? {\n featureGroup: this.drawnItems as any,\n }\n : false,\n };\n\n // Edit toolbar\n let edit: any = {\n featureGroup: this.drawnItems as any,\n };\n if (!controls.edit) {\n edit = false;\n } else {\n if (controls.delete === false) {\n edit.remove = false;\n }\n }\n\n if (readOnly) {\n // Disable all drawing/editing/removing\n return {\n draw: false,\n edit: false,\n } as any;\n }\n\n return { draw, edit } as any;\n }\n\n private applyLayerCakeToolbarIcon(): void {\n if (!this.container) return;\n\n const applyIcon = () => {\n const button = this.container.querySelector(\n \"a.leaflet-draw-draw-cake\",\n ) as HTMLAnchorElement | null;\n if (!button) return;\n\n // Disable Leaflet.draw sprite sheet background for this button.\n button.style.setProperty(\"background-image\", \"none\", \"important\");\n button.style.setProperty(\"background-color\", \"#fff\", \"important\");\n\n // Render our custom icon as an explicit child element so it cannot fall back to sprites.\n button.style.setProperty(\"position\", \"relative\", \"important\");\n let icon = button.querySelector(\n \".leaflet-geokit-cake-icon\",\n ) as HTMLSpanElement | null;\n if (!icon) {\n icon = document.createElement(\"span\");\n icon.className = \"leaflet-geokit-cake-icon\";\n icon.setAttribute(\"aria-hidden\", \"true\");\n button.appendChild(icon);\n }\n\n icon.style.setProperty(\"position\", \"absolute\", \"important\");\n icon.style.setProperty(\"display\", \"block\", \"important\");\n icon.style.setProperty(\"left\", \"50%\", \"important\");\n icon.style.setProperty(\"top\", \"50%\", \"important\");\n icon.style.setProperty(\"width\", \"18px\", \"important\");\n icon.style.setProperty(\"height\", \"18px\", \"important\");\n icon.style.setProperty(\"transform\", \"translate(-50%, -50%)\", \"important\");\n icon.style.setProperty(\"pointer-events\", \"none\", \"important\");\n\n // Use inline SVG markup so rendering does not depend on URL asset resolution.\n if (!icon.firstElementChild) {\n icon.innerHTML = layerCakeIconSvg;\n }\n const svg = icon.firstElementChild as SVGElement | null;\n if (svg) {\n svg.style.setProperty(\"width\", \"100%\", \"important\");\n svg.style.setProperty(\"height\", \"100%\", \"important\");\n svg.style.setProperty(\"display\", \"block\", \"important\");\n }\n };\n\n applyIcon();\n setTimeout(applyIcon, 0);\n }\n\n private applyMoveToolbarIcon(): void {\n if (!this.container) return;\n\n const applyIcon = () => {\n const button = this.container.querySelector(\n \"a.leaflet-draw-draw-move\",\n ) as HTMLAnchorElement | null;\n if (!button) return;\n\n // Disable Leaflet.draw sprite sheet background for this button.\n button.style.setProperty(\"background-image\", \"none\", \"important\");\n button.style.setProperty(\"background-color\", \"#fff\", \"important\");\n\n // Render our custom icon as an explicit child element so it cannot fall back to sprites.\n button.style.setProperty(\"position\", \"relative\", \"important\");\n let icon = button.querySelector(\n \".leaflet-geokit-move-icon\",\n ) as HTMLSpanElement | null;\n if (!icon) {\n icon = document.createElement(\"span\");\n icon.className = \"leaflet-geokit-move-icon\";\n icon.setAttribute(\"aria-hidden\", \"true\");\n button.appendChild(icon);\n }\n\n icon.style.setProperty(\"position\", \"absolute\", \"important\");\n icon.style.setProperty(\"display\", \"block\", \"important\");\n icon.style.setProperty(\"left\", \"50%\", \"important\");\n icon.style.setProperty(\"top\", \"50%\", \"important\");\n icon.style.setProperty(\"width\", \"18px\", \"important\");\n icon.style.setProperty(\"height\", \"18px\", \"important\");\n icon.style.setProperty(\"transform\", \"translate(-50%, -50%)\", \"important\");\n icon.style.setProperty(\"pointer-events\", \"none\", \"important\");\n\n // Use inline SVG markup so rendering does not depend on URL asset resolution.\n if (!icon.firstElementChild) {\n icon.innerHTML = moveToolIconSvg;\n }\n const svg = icon.firstElementChild as SVGElement | null;\n if (svg) {\n svg.style.setProperty(\"width\", \"100%\", \"important\");\n svg.style.setProperty(\"height\", \"100%\", \"important\");\n svg.style.setProperty(\"display\", \"block\", \"important\");\n }\n };\n\n applyIcon();\n setTimeout(applyIcon, 0);\n }\n\n /* c8 ignore start */\n private addRulerControl(): void {\n if (!this.map) return;\n this.installRulerPrecisionPatch();\n const options = getRulerOptions(this.measurementSystem);\n this.rulerControl = this.L.control.ruler(options);\n this.map.addControl(this.rulerControl);\n }\n\n private installRulerPrecisionPatch(): void {\n if (rulerPrecisionPatched) return;\n const RulerCtor = (this.L.Control as any).Ruler;\n if (!RulerCtor || typeof RulerCtor !== \"function\") return;\n const proto = RulerCtor.prototype;\n const original = proto._calculateBearingAndDistance;\n if (typeof original !== \"function\") return;\n\n const logger = this.logger;\n\n proto._calculateBearingAndDistance = function patchedPrecision() {\n original.call(this);\n try {\n const start = this._clickedLatLong;\n const end = this._movingLatLong ?? this._clickedLatLong;\n if (!start || !end) return;\n\n const { meters, bearingDegrees } = computePreciseDistance(\n start.lat,\n start.lng,\n end.lat,\n end.lng,\n );\n const kilometers = meters / 1000;\n const conversion =\n typeof this.options?.lengthUnit?.factor === \"number\"\n ? this.options.lengthUnit.factor\n : 1;\n const distance = magicRound(kilometers * conversion);\n\n this._result = this._result || {};\n this._result.Distance = distance;\n this._result.Bearing = bearingDegrees;\n this._result.meters = meters;\n } catch (err) {\n logger?.warn(\"ruler:precision-patch\", err as any);\n }\n };\n\n rulerPrecisionPatched = true;\n }\n\n private rebuildRulerControl(): void {\n if (!this.map || !this.options.controls.ruler) return;\n if (this.rulerControl) {\n try {\n this.map.removeControl(this.rulerControl);\n } catch (err) {\n this.logger.warn(\"ruler:remove-failed\", err as any);\n }\n this.rulerControl = null;\n }\n this.addRulerControl();\n }\n\n /* c8 ignore next */\n private installMeasurementSettingsControl(): void {\n if (!this.map || this.measurementControl) return;\n const controller = this;\n const SettingsControl = (this.L.Control as any).extend({\n options: { position: \"topleft\" },\n onAdd() {\n const container = controller.L.DomUtil.create(\n \"div\",\n \"leaflet-bar leaflet-ruler-settings-control\",\n );\n const button = controller.L.DomUtil.create(\n \"button\",\n \"leaflet-ruler-settings-button\",\n container,\n );\n button.type = \"button\";\n button.title = \"Measurement settings\";\n button.setAttribute(\"aria-label\", \"Measurement settings\");\n button.addEventListener(\"click\", (event: MouseEvent) => {\n event.preventDefault();\n event.stopPropagation();\n controller.toggleMeasurementModal(true);\n });\n controller.L.DomEvent.disableClickPropagation(container);\n controller.L.DomEvent.disableScrollPropagation(container);\n return container;\n },\n }) as typeof BundledL.Control;\n this.measurementControl = new SettingsControl();\n this.map.addControl(this.measurementControl);\n }\n\n /* c8 ignore next */\n private ensureMeasurementModal(): HTMLDivElement {\n if (this.measurementModalOverlay) return this.measurementModalOverlay;\n if (typeof document === \"undefined\") {\n throw new Error(\"Measurement modal requires a browser environment\");\n }\n const overlay = document.createElement(\"div\");\n overlay.className = \"leaflet-ruler-modal-overlay\";\n overlay.setAttribute(\"aria-hidden\", \"true\");\n const dialog = document.createElement(\"div\");\n dialog.className = \"leaflet-ruler-modal\";\n dialog.setAttribute(\"role\", \"dialog\");\n dialog.setAttribute(\"aria-modal\", \"true\");\n dialog.tabIndex = -1;\n\n overlay.addEventListener(\"click\", (event) => {\n if (event.target === overlay) {\n this.toggleMeasurementModal(false);\n }\n });\n\n const title = document.createElement(\"h2\");\n title.className = \"leaflet-ruler-modal-title\";\n title.textContent = \"Measurement Units\";\n dialog.appendChild(title);\n\n const description = document.createElement(\"p\");\n description.className = \"leaflet-ruler-modal-description\";\n description.textContent =\n \"Choose how the measurement tool reports distances.\";\n dialog.appendChild(description);\n\n const optionsList = document.createElement(\"div\");\n optionsList.className = \"leaflet-ruler-modal-options\";\n dialog.appendChild(optionsList);\n\n ([\"metric\", \"imperial\"] as MeasurementSystem[]).forEach((system) => {\n const label = document.createElement(\"label\");\n label.className = \"leaflet-ruler-modal-option\";\n\n const input = document.createElement(\"input\");\n input.type = \"radio\";\n input.name = \"leaflet-ruler-units\";\n input.value = system;\n input.addEventListener(\"change\", () => {\n if (input.checked) {\n this.setRulerUnits(system);\n }\n });\n\n const span = document.createElement(\"span\");\n span.textContent = measurementSystemDescriptions[system];\n\n label.appendChild(input);\n label.appendChild(span);\n optionsList.appendChild(label);\n this.measurementModalRadios[system] = input;\n });\n\n const actions = document.createElement(\"div\");\n actions.className = \"leaflet-ruler-modal-actions\";\n const close = document.createElement(\"button\");\n close.type = \"button\";\n close.className = \"leaflet-ruler-modal-close\";\n close.textContent = \"Close\";\n close.addEventListener(\"click\", () => this.toggleMeasurementModal(false));\n actions.appendChild(close);\n dialog.appendChild(actions);\n\n overlay.appendChild(dialog);\n this.container.appendChild(overlay);\n this.measurementModalOverlay = overlay;\n this.measurementModalDialog = dialog;\n this.syncMeasurementModalState();\n return overlay;\n }\n\n /* c8 ignore next */\n private toggleMeasurementModal(show: boolean): void {\n if (!show) {\n if (this.measurementModalOverlay) {\n this.measurementModalOverlay.classList.remove(\"is-open\");\n this.measurementModalOverlay.setAttribute(\"aria-hidden\", \"true\");\n }\n this.detachMeasurementModalKeydown();\n return;\n }\n\n const overlay = this.ensureMeasurementModal();\n overlay.classList.add(\"is-open\");\n overlay.setAttribute(\"aria-hidden\", \"false\");\n this.syncMeasurementModalState();\n this.attachMeasurementModalKeydown();\n this.measurementModalDialog?.focus();\n }\n\n private syncMeasurementModalState(): void {\n for (const [system, input] of Object.entries(this.measurementModalRadios)) {\n if (input) {\n input.checked = system === this.measurementSystem;\n }\n }\n }\n\n /* c8 ignore next */\n private removeMeasurementModal(): void {\n if (this.measurementModalOverlay) {\n this.measurementModalOverlay.remove();\n }\n this.measurementModalOverlay = null;\n this.measurementModalDialog = null;\n this.measurementModalRadios = {};\n this.detachMeasurementModalKeydown();\n }\n\n /* c8 ignore next */\n private attachMeasurementModalKeydown(): void {\n if (\n this.measurementModalKeydownHandler ||\n typeof document === \"undefined\"\n ) {\n return;\n }\n this.measurementModalKeydownHandler = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") {\n this.toggleMeasurementModal(false);\n }\n };\n document.addEventListener(\"keydown\", this.measurementModalKeydownHandler);\n }\n\n /* c8 ignore next */\n private detachMeasurementModalKeydown(): void {\n if (\n !this.measurementModalKeydownHandler ||\n typeof document === \"undefined\"\n ) {\n return;\n }\n document.removeEventListener(\n \"keydown\",\n this.measurementModalKeydownHandler,\n );\n this.measurementModalKeydownHandler = null;\n }\n /* c8 ignore end */\n\n /**\n * Workaround: In some environments (notably within Shadow DOM), clicking the first vertex\n * to close a polygon can be unreliable due to event retargeting/hit testing.\n * This patch listens for map clicks while the polygon draw handler is enabled and,\n * if the click is within a small pixel radius of the first vertex, it triggers finishShape().\n */\n private installPolygonFinishPatch(): void {\n if (!this.map || !this.drawControl) return;\n\n // Remove any existing patch first\n try {\n this.detachPolygonFinishPatch?.();\n } catch {\n // Ignore errors when detaching existing polygon patch\n }\n this.detachPolygonFinishPatch = null;\n\n const map: any = this.map as any;\n const drawTb: any = (this.drawControl as any)?._toolbars?.draw;\n if (!drawTb) return;\n\n // Guard if polygon mode isn't available\n const hasPolygon = !!drawTb._modes?.polygon?.handler;\n if (!hasPolygon) return;\n\n const CLICK_HIT_PX = 10; // be conservative to avoid accidental closes\n\n const onClick = (e: any) => {\n try {\n const handler: any = drawTb._modes?.polygon?.handler;\n if (!handler || !handler._enabled) return;\n\n const markers: any[] = handler._markers;\n // Only activate after 4+ vertices to avoid premature closures on early points\n if (!Array.isArray(markers) || markers.length < 4) return;\n\n const firstLL = markers[0]?.getLatLng?.();\n if (!firstLL) return;\n\n const pFirst = map.latLngToContainerPoint(firstLL);\n const pClick = map.latLngToContainerPoint(e.latlng);\n const dist = Math.hypot(pFirst.x - pClick.x, pFirst.y - pClick.y);\n\n if (\n dist <= CLICK_HIT_PX &&\n typeof handler._finishShape === \"function\"\n ) {\n // Prevent Draw from adding an extra vertex; finish the polygon instead\n e.originalEvent?.preventDefault?.();\n e.originalEvent?.stopPropagation?.();\n handler._finishShape();\n }\n } catch (err) {\n this._error(\"polygon-finish-patch\", err);\n }\n };\n\n map.on(\"click\", onClick);\n this.detachPolygonFinishPatch = () => {\n try {\n map.off(\"click\", onClick);\n } catch {\n // Ignore errors when removing map click event listener\n }\n };\n }\n\n private patchLeafletDrawBugs(): void {\n try {\n const anyL: any = this.L as any;\n const GU = anyL.GeometryUtil;\n if (!GU) return;\n // Replace readableArea with a strict-mode safe implementation\n const defaults = {\n km: 2,\n ha: 2,\n m: 0,\n mi: 2,\n ac: 2,\n yd: 0,\n ft: 0,\n nm: 2,\n };\n const fmt =\n GU.formattedNumber?.bind(GU) ??\n ((num: number, p: number) => Number(num).toFixed(p));\n GU.readableArea = (\n area: number,\n metric?: boolean | string | string[],\n precision?: any,\n ): string => {\n const opts = anyL.Util?.extend\n ? anyL.Util.extend({}, defaults, precision || {})\n : { ...defaults, ...(precision || {}) };\n let out: string;\n if (metric) {\n let units: string[] = [\"ha\", \"m\"];\n const t = typeof metric;\n if (t === \"string\") units = [metric as string];\n else if (t !== \"boolean\")\n units = Array.isArray(metric) ? (metric as string[]) : units;\n if (area >= 1e6 && units.indexOf(\"km\") !== -1)\n out = `${fmt(1e-6 * area, opts.km)} km²`;\n else if (area >= 1e4 && units.indexOf(\"ha\") !== -1)\n out = `${fmt(1e-4 * area, opts.ha)} ha`;\n else out = `${fmt(area, opts.m)} m²`;\n } else {\n area = area / 0.836127; // square yards\n if (area >= 3097600) out = `${fmt(area / 3097600, opts.mi)} mi²`;\n else if (area >= 4840) out = `${fmt(area / 4840, opts.ac)} acres`;\n else out = `${fmt(area, opts.yd)} yd²`;\n }\n return out;\n };\n } catch (err) {\n this.logger.warn(\"leaflet-draw-patch:readableArea\", err as any);\n }\n\n // Patch Leaflet.draw circle editing strict-mode bug:\n // L.Edit.Circle.prototype._resize assigns to an undeclared `radius` variable.\n try {\n const anyL: any = this.L as any;\n const EditCircle = anyL.Edit?.Circle;\n const DrawEvent = anyL.Draw?.Event;\n const GU = anyL.GeometryUtil;\n if (!EditCircle?.prototype?._resize || !DrawEvent || !GU) return;\n\n EditCircle.prototype._resize = function patchedCircleResize(latlng: any) {\n const center = this._moveMarker.getLatLng();\n const radius = GU.isVersion07x()\n ? center.distanceTo(latlng)\n : this._map.distance(center, latlng);\n\n this._shape.setRadius(radius);\n\n try {\n if (\n this._map?.editTooltip &&\n this._map?._editTooltip?.updateContent\n ) {\n this._map._editTooltip.updateContent({\n text:\n anyL.drawLocal.edit.handlers.edit.tooltip.subtext +\n \"<br />\" +\n anyL.drawLocal.edit.handlers.edit.tooltip.text,\n subtext:\n anyL.drawLocal.draw.handlers.circle.radius +\n \": \" +\n GU.readableDistance(\n radius,\n true,\n this.options.feet,\n this.options.nautic,\n ),\n });\n }\n } catch {\n // Ignore tooltip update errors in patched circle resize\n }\n\n this._map.fire(DrawEvent.EDITRESIZE, { layer: this._shape });\n };\n } catch (err) {\n this.logger.warn(\"leaflet-draw-patch:circle-resize\", err as any);\n }\n }\n\n private bindDrawEvents(): void {\n if (!this.map || !this.drawnItems) return;\n\n // CREATED: single layer with layerType\n this.map.on((this.L as any).Draw.Event.CREATED, (e: any) => {\n try {\n const { layer, layerType } = e;\n\n if (layerType === DrawCake.TYPE) {\n try {\n this.activeCakeSession?.destroy();\n } catch {\n // Ignore previous session cleanup failures\n }\n\n this.activeCakeSession = new LayerCakeManager(\n this.map!,\n layer as BundledL.Circle,\n (featureCollection) => {\n if (!this.drawnItems) return;\n const ids = this.store.add(featureCollection);\n const layers = this.L.geoJSON(featureCollection);\n\n let i = 0;\n layers.eachLayer((createdLayer: any) => {\n const id = ids[i] ?? ids[ids.length - 1];\n (createdLayer as any)._fid = id;\n this.drawnItems!.addLayer(createdLayer);\n this.installVertexContextMenu(createdLayer);\n this.options.callbacks?.onCreated?.({\n id,\n layerType: \"polygon\",\n geoJSON: createdLayer.toGeoJSON(),\n });\n i++;\n });\n\n this.activeCakeSession = null;\n },\n this.measurementSystem,\n );\n\n return;\n }\n\n this.drawnItems!.addLayer(layer);\n const feat = layer.toGeoJSON() as Feature;\n const ids = this.store.add({\n type: \"FeatureCollection\",\n features: [feat],\n });\n const id = ids[0];\n (layer as any)._fid = id;\n this.installVertexContextMenu(layer);\n\n this.options.callbacks?.onCreated?.({ id, layerType, geoJSON: feat });\n } catch (err) {\n this._error(\"onCreated handler failed\", err);\n }\n });\n\n // EDITED: multiple layers in a LayerGroup\n this.map.on((this.L as any).Draw.Event.EDITED, (e: any) => {\n try {\n const ids: string[] = [];\n const layers: any = e.layers;\n layers.eachLayer((layer: any) => {\n const feat = layer.toGeoJSON() as Feature;\n const id = (layer as any)._fid as string | undefined;\n if (id) {\n this.store.update(id, feat);\n ids.push(id);\n } else {\n // unknown layer, add it\n const newId = this.store.add({\n type: \"FeatureCollection\",\n features: [feat],\n })[0];\n (layer as any)._fid = newId;\n ids.push(newId);\n }\n });\n\n this.options.callbacks?.onEdited?.({\n ids,\n geoJSON: this.store.toFeatureCollection(),\n });\n } catch (err) {\n this._error(\"onEdited handler failed\", err);\n }\n });\n\n // DELETED: multiple layers in a LayerGroup\n this.map.on((this.L as any).Draw.Event.DELETED, (e: any) => {\n try {\n const ids: string[] = [];\n const layers: any = e.layers;\n layers.eachLayer((layer: any) => {\n const id = (layer as any)._fid as string | undefined;\n if (id) {\n ids.push(id);\n this.store.remove(id);\n }\n });\n\n this.options.callbacks?.onDeleted?.({\n ids,\n geoJSON: this.store.toFeatureCollection(),\n });\n } catch (err) {\n this._error(\"onDeleted handler failed\", err);\n }\n });\n\n // MOVEEND: user has finished dragging a feature, show Save/Cancel UI\n this.map.on(\"draw:moveend\", (e: any) => {\n try {\n this.showMoveConfirmationUI(e.layer, e.originalGeoJSON, e.newGeoJSON);\n } catch (err) {\n this._error(\"draw:moveend handler failed\", err);\n }\n });\n\n // MOVECONFIRMED: user clicked Save, update the store and emit event\n this.map.on(\"draw:moveconfirmed\", (e: any) => {\n try {\n const layer = e.layer;\n const id = (layer as any)._fid as string | undefined;\n if (id) {\n const feat = layer.toGeoJSON() as Feature;\n this.store.update(id, feat);\n\n // Emit custom event for move confirmed\n this.options.callbacks?.onEdited?.({\n ids: [id],\n geoJSON: this.store.toFeatureCollection(),\n });\n }\n\n this.hideMoveConfirmationUI();\n } catch (err) {\n this._error(\"draw:moveconfirmed handler failed\", err);\n }\n });\n }\n\n private _error(message: string, cause: unknown): void {\n this.logger.error(\"error\", { message, cause });\n this.options.callbacks?.onError?.({ message, cause });\n }\n\n // -------- Vertex deletion context menu --------\n\n private installVertexContextMenu(layer: any): void {\n if (!layer || typeof layer.on !== \"function\") return;\n const handleContext = (evt: any) => {\n try {\n evt?.originalEvent?.preventDefault?.();\n evt?.originalEvent?.stopPropagation?.();\n } catch {\n // Ignore errors when preventing default context menu behavior\n }\n this.openVertexMenu(layer, evt);\n };\n const handleClick = (evt: any) => {\n const oe = evt?.originalEvent;\n if (oe && (oe.ctrlKey || oe.metaKey)) {\n this.openVertexMenu(layer, evt);\n }\n };\n try {\n layer.on(\"contextmenu\", handleContext);\n layer.on(\"click\", handleClick);\n } catch {\n // Ignore errors when attaching event handlers to the layer\n }\n }\n\n private openVertexMenu(layer: any, evt: any): void {\n try {\n if (!this.map) return;\n // Only for Polygon/Polyline-like layers\n const isPoly =\n typeof layer.getLatLngs === \"function\" &&\n (layer instanceof (this.L as any).Polygon ||\n layer instanceof (this.L as any).Polyline);\n if (!isPoly) return;\n\n // Only when editing is enabled on the layer (avoid accidental deletes)\n const editing = (layer as any).editing;\n if (\n !editing ||\n typeof editing.enabled !== \"function\" ||\n !editing.enabled()\n )\n return;\n\n const latlng = evt?.latlng;\n const containerPt = this.map.latLngToContainerPoint(latlng);\n\n const nearest = this.findNearestVertex(layer, latlng, 12); // 12px tolerance\n if (!nearest) return;\n\n this.showVertexMenu(containerPt, async () => {\n await this.deleteVertex(layer, nearest.pathIndex, nearest.vertexIndex);\n });\n } catch (err) {\n this._error(\"openVertexMenu\", err);\n }\n }\n\n private showVertexMenu(pt: any, onDelete: () => void): void {\n try {\n // Cleanup existing\n try {\n this.vertexMenuCleanup?.();\n } catch {\n // Ignore errors when cleaning up previous vertex menu\n }\n this.vertexMenuCleanup = null;\n if (!this.container) return;\n\n const menu = document.createElement(\"div\");\n menu.style.position = \"absolute\";\n menu.style.top = `${pt.y}px`;\n menu.style.left = `${pt.x}px`;\n menu.style.transform = \"translate(-50%, -100%)\";\n menu.style.background = \"#fff\";\n menu.style.border = \"1px solid rgba(0,0,0,0.15)\";\n menu.style.borderRadius = \"6px\";\n menu.style.boxShadow = \"0 4px 12px rgba(0,0,0,0.15)\";\n menu.style.padding = \"6px\";\n menu.style.zIndex = \"10000\";\n menu.style.fontSize = \"12px\";\n menu.style.userSelect = \"none\";\n\n const btn = document.createElement(\"button\");\n btn.textContent = \"Delete vertex\";\n btn.style.padding = \"6px 10px\";\n btn.style.border = \"none\";\n btn.style.background = \"#da1e28\";\n btn.style.color = \"#fff\";\n btn.style.borderRadius = \"4px\";\n btn.style.cursor = \"pointer\";\n btn.addEventListener(\"click\", (e) => {\n e.stopPropagation();\n e.preventDefault();\n try {\n onDelete();\n } finally {\n cleanup();\n }\n });\n menu.appendChild(btn);\n\n const cleanup = () => {\n try {\n window.removeEventListener(\"pointerdown\", onDoc);\n this.container.removeEventListener(\"scroll\", cleanup, true);\n menu.remove();\n } catch {\n // Ignore errors during menu cleanup operations\n }\n this.vertexMenuEl = null;\n this.vertexMenuCleanup = null;\n };\n\n const onDoc = (e: any) => {\n // Close if clicking elsewhere\n if (!menu.contains(e.target)) cleanup();\n };\n\n window.addEventListener(\"pointerdown\", onDoc, { capture: true });\n this.container.addEventListener(\"scroll\", cleanup, true);\n this.container.appendChild(menu);\n this.vertexMenuEl = menu;\n this.vertexMenuCleanup = cleanup;\n } catch (err) {\n this._error(\"showVertexMenu\", err);\n }\n }\n\n private findNearestVertex(\n layer: any,\n latlng: BundledL.LatLng,\n tolerancePx: number,\n ): { pathIndex: number; vertexIndex: number } | null {\n if (!this.map) return null;\n const llToPoint = (ll: BundledL.LatLng) =>\n this.map!.latLngToContainerPoint(ll);\n const dist = (a: any, b: any) => Math.hypot(a.x - b.x, a.y - b.y);\n const targetPt = llToPoint(latlng);\n\n let bestD = Infinity;\n let bestPath = -1;\n let bestVertex = -1;\n const latlngs: any = layer.getLatLngs();\n // Normalize: Polyline -> LatLng[], Polygon -> LatLng[][] (rings)\n const paths: BundledL.LatLng[][] = Array.isArray(latlngs[0])\n ? (latlngs as BundledL.LatLng[][])\n : [latlngs as BundledL.LatLng[]];\n\n paths.forEach((path, pathIndex) => {\n path.forEach((v, vertexIndex) => {\n const p = llToPoint(v);\n const d = dist(p, targetPt);\n if (d < bestD) {\n bestD = d;\n bestPath = pathIndex;\n bestVertex = vertexIndex;\n }\n });\n });\n\n if (bestPath === -1 || bestD > tolerancePx) return null;\n return { pathIndex: bestPath, vertexIndex: bestVertex };\n }\n\n private async deleteVertex(\n layer: any,\n pathIndex: number,\n vertexIndex: number,\n ): Promise<void> {\n try {\n // Only for polygon/polyline\n const isPoly =\n typeof layer.getLatLngs === \"function\" &&\n (layer instanceof (this.L as any).Polygon ||\n layer instanceof (this.L as any).Polyline);\n if (!isPoly) return;\n\n const latlngs: any = layer.getLatLngs();\n const paths: BundledL.LatLng[][] = Array.isArray(latlngs[0])\n ? (latlngs as BundledL.LatLng[][])\n : [latlngs as BundledL.LatLng[]];\n const path = paths[pathIndex];\n if (!path) return;\n\n // Enforce minimal vertices: polygon needs >= 3, polyline >= 2\n const isPolygon = layer instanceof (this.L as any).Polygon;\n const minVerts = isPolygon ? 3 : 2;\n if (path.length <= minVerts) return;\n\n path.splice(vertexIndex, 1);\n // Apply back\n if (paths.length === 1) {\n layer.setLatLngs(path);\n } else {\n const newPaths = paths.map((p, i) => (i === pathIndex ? path : p));\n layer.setLatLngs(newPaths as any);\n }\n layer.redraw?.();\n\n // Update store + emit edited callback\n const fid = (layer as any)._fid as string | undefined;\n if (fid) {\n const feat = layer.toGeoJSON() as Feature;\n this.store.update(fid, feat);\n this.options.callbacks?.onEdited?.({\n ids: [fid],\n geoJSON: this.store.toFeatureCollection(),\n });\n }\n } catch (err) {\n this._error(\"deleteVertex\", err);\n }\n }\n\n // -------- Move tool Save/Cancel UI --------\n\n private showMoveConfirmationUI(\n layer: any,\n originalGeoJSON: GeoJSON.Feature,\n newGeoJSON: GeoJSON.Feature,\n ): void {\n try {\n // Clean up any existing UI\n this.hideMoveConfirmationUI();\n\n if (!this.container || !this.map) return;\n\n // Get the move handler from the draw control\n const drawControl = this.drawControl;\n if (!drawControl) return;\n\n const drawToolbar = (drawControl as any)?._toolbars?.draw;\n if (!drawToolbar) return;\n\n // Find the move handler\n const handlers = drawToolbar._modes || {};\n let moveHandler: any = null;\n for (const key in handlers) {\n const mode = handlers[key];\n if (mode?.handler?.type === \"move\") {\n moveHandler = mode.handler;\n break;\n }\n }\n\n this.activeMoveHandler = moveHandler;\n\n // Create a floating UI with Save and Cancel buttons\n const ui = document.createElement(\"div\");\n ui.style.position = \"absolute\";\n ui.style.bottom = \"60px\";\n ui.style.left = \"50%\";\n ui.style.transform = \"translateX(-50%)\";\n ui.style.display = \"flex\";\n ui.style.gap = \"8px\";\n ui.style.background = \"#fff\";\n ui.style.border = \"2px solid #3388ff\";\n ui.style.borderRadius = \"8px\";\n ui.style.padding = \"12px 16px\";\n ui.style.boxShadow = \"0 4px 12px rgba(0,0,0,0.2)\";\n ui.style.zIndex = \"10000\";\n ui.style.fontSize = \"14px\";\n ui.style.fontFamily = \"system-ui, sans-serif\";\n\n const saveBtn = document.createElement(\"button\");\n saveBtn.textContent = \"✓ Save\";\n saveBtn.style.padding = \"8px 16px\";\n saveBtn.style.border = \"none\";\n saveBtn.style.background = \"#28a745\";\n saveBtn.style.color = \"#fff\";\n saveBtn.style.borderRadius = \"4px\";\n saveBtn.style.cursor = \"pointer\";\n saveBtn.style.fontWeight = \"600\";\n saveBtn.style.fontSize = \"14px\";\n saveBtn.addEventListener(\"click\", (e) => {\n e.stopPropagation();\n e.preventDefault();\n if (moveHandler?.confirmMove) {\n moveHandler.confirmMove();\n }\n });\n\n const cancelBtn = document.createElement(\"button\");\n cancelBtn.textContent = \"✕ Cancel\";\n cancelBtn.style.padding = \"8px 16px\";\n cancelBtn.style.border = \"1px solid #ccc\";\n cancelBtn.style.background = \"#fff\";\n cancelBtn.style.color = \"#333\";\n cancelBtn.style.borderRadius = \"4px\";\n cancelBtn.style.cursor = \"pointer\";\n cancelBtn.style.fontWeight = \"600\";\n cancelBtn.style.fontSize = \"14px\";\n cancelBtn.addEventListener(\"click\", (e) => {\n e.stopPropagation();\n e.preventDefault();\n if (moveHandler?.cancelMove) {\n moveHandler.cancelMove();\n }\n this.hideMoveConfirmationUI();\n });\n\n ui.appendChild(saveBtn);\n ui.appendChild(cancelBtn);\n\n this.container.appendChild(ui);\n this.moveConfirmationUI = ui;\n\n this.logger.debug(\"showMoveConfirmationUI\", {\n layerId: (layer as any)._fid,\n });\n } catch (err) {\n this._error(\"showMoveConfirmationUI\", err);\n }\n }\n\n private hideMoveConfirmationUI(): void {\n try {\n if (this.moveConfirmationUI) {\n this.moveConfirmationUI.remove();\n this.moveConfirmationUI = null;\n }\n this.activeMoveHandler = null;\n } catch (err) {\n this._error(\"hideMoveConfirmationUI\", err);\n }\n }\n}\n","import type { Feature, FeatureCollection } from \"geojson\";\nimport type {\n LeafletDrawMapElementAPI,\n MapConfig,\n DrawControlsConfig,\n MeasurementSystem,\n} from \"@src/types/public\";\nimport { createLogger, type Logger, type LogLevel } from \"@src/utils/logger\";\nimport { applyLeafletStylingIfNeeded } from \"@src/lib/leaflet-assets\";\nimport { MapController } from \"@src/lib/MapController\";\nimport type * as LeafletNS from \"leaflet\";\n\nexport class LeafletDrawMapElement\n extends HTMLElement\n implements LeafletDrawMapElementAPI\n{\n // Shadow DOM and container references\n private _root: ShadowRoot;\n private _container: HTMLDivElement;\n\n // Logging\n private _logger: Logger = createLogger(\"component:leaflet-geokit\", \"debug\");\n\n // Internal state mirrors for attributes/properties\n private _latitude = 0;\n private _longitude = 0;\n private _zoom = 2;\n private _minZoom?: number;\n private _maxZoom?: number;\n private _tileUrl = \"https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png\";\n private _tileAttribution?: string;\n private _readOnly = false;\n private _logLevel: LogLevel = \"debug\";\n private _devOverlay = false;\n private _polygonAllowIntersection = false;\n private _preferCanvas = true; // Default to Canvas for performance\n\n // Theming\n private _themeUrl?: string;\n private _themeCss = \"\";\n private _themeLinkEl: HTMLLinkElement | null = null;\n private _themeStyleEl: HTMLStyleElement | null = null;\n\n // Controller\n private _controller: MapController | null = null;\n\n // External Leaflet configuration\n private _useExternalLeaflet = false;\n private _skipLeafletStyles = false;\n private _leafletInstance: typeof LeafletNS | undefined;\n\n constructor() {\n super();\n this._root = this.attachShadow({ mode: \"open\" });\n\n // Basic internal styles and map container; real CSS injection will be added in controller milestone\n this._root.innerHTML = `\n <style>\n :host {\n display: block;\n contain: content;\n }\n .map-container {\n width: 100%;\n height: 100%;\n position: relative;\n }\n </style>\n <div class=\"map-container\" part=\"map\"></div>\n `;\n\n const container = this._root.querySelector(\".map-container\");\n if (!(container instanceof HTMLDivElement)) {\n throw new Error(\"Failed to initialize map container\");\n }\n this._container = container;\n\n // Initialize logger level from attribute if present\n const ll = this.getAttribute(\"log-level\") as LogLevel | null;\n if (ll) {\n this._logLevel = ll;\n this._logger.setLevel(ll);\n }\n }\n\n // Build DrawControlsConfig from boolean attributes\n private _controlsFromAttributes(): DrawControlsConfig {\n return {\n polygon: this.hasAttribute(\"draw-polygon\"),\n polyline: this.hasAttribute(\"draw-polyline\"),\n rectangle: this.hasAttribute(\"draw-rectangle\"),\n circle: this.hasAttribute(\"draw-circle\"),\n cake: this.hasAttribute(\"draw-layer-cake\"),\n marker: this.hasAttribute(\"draw-marker\"),\n move: this.hasAttribute(\"draw-move\"),\n edit: this.hasAttribute(\"edit-features\"),\n delete: this.hasAttribute(\"delete-features\"),\n ruler: this.hasAttribute(\"draw-ruler\"),\n };\n }\n\n private _mapConfig(): MapConfig {\n return {\n latitude: this._latitude,\n longitude: this._longitude,\n zoom: this._zoom,\n minZoom: this._minZoom,\n maxZoom: this._maxZoom,\n tileUrl: this._tileUrl,\n tileAttribution: this._tileAttribution,\n readOnly: this._readOnly,\n fitToDataOnLoad: false,\n logLevel: this._logLevel,\n devOverlay: this._devOverlay,\n polygonAllowIntersection: this._polygonAllowIntersection,\n preferCanvas: this._preferCanvas,\n useExternalLeaflet: this._useExternalLeaflet,\n skipLeafletStyles: this._skipLeafletStyles,\n };\n }\n\n // Lifecycle\n async connectedCallback(): Promise<void> {\n this._logger.debug(\"connectedCallback\", this._currentConfig());\n // Inject Leaflet CSS/icons unless skipped\n applyLeafletStylingIfNeeded({\n root: this._root,\n skipStyles: this._skipLeafletStyles,\n });\n\n this._applyThemeStyles();\n\n // Initialize controller\n this._controller = new MapController({\n container: this._container,\n map: this._mapConfig(),\n controls: this._controlsFromAttributes(),\n readOnly: this._readOnly,\n logger: this._logger.child(\"controller\"),\n callbacks: {\n onReady: (detail) => {\n this.dispatchEvent(new CustomEvent(\"leaflet-draw:ready\", { detail }));\n },\n onCreated: (detail) => {\n this.dispatchEvent(\n new CustomEvent(\"leaflet-draw:created\", { detail }),\n );\n },\n onEdited: (detail) => {\n this.dispatchEvent(\n new CustomEvent(\"leaflet-draw:edited\", { detail }),\n );\n },\n onDeleted: (detail) => {\n this.dispatchEvent(\n new CustomEvent(\"leaflet-draw:deleted\", { detail }),\n );\n },\n onError: (detail) => {\n this.dispatchEvent(new CustomEvent(\"leaflet-draw:error\", { detail }));\n },\n },\n leaflet: this._leafletInstance ?? undefined,\n useExternalLeaflet: this._useExternalLeaflet,\n });\n\n await this._controller.init();\n }\n\n async disconnectedCallback(): Promise<void> {\n this._logger.debug(\"disconnectedCallback\");\n if (this._controller) {\n await this._controller.destroy();\n this._controller = null;\n }\n }\n // Observed attributes and reflection\n static get observedAttributes(): string[] {\n return [\n \"latitude\",\n \"longitude\",\n \"zoom\",\n \"min-zoom\",\n \"max-zoom\",\n \"tile-url\",\n \"tile-attribution\",\n \"read-only\",\n \"log-level\",\n \"dev-overlay\",\n \"prefer-canvas\",\n \"use-external-leaflet\",\n \"skip-leaflet-styles\",\n \"theme-url\",\n // draw controls\n \"draw-polygon\",\n \"draw-polyline\",\n \"draw-rectangle\",\n \"draw-circle\",\n \"draw-layer-cake\",\n \"draw-marker\",\n \"draw-move\",\n \"draw-ruler\",\n \"edit-features\",\n \"delete-features\",\n \"polygon-allow-intersection\",\n ];\n }\n\n attributeChangedCallback(\n name: string,\n _old: string | null,\n value: string | null,\n ): void {\n this._logger.debug(\"attributeChanged\", { name, value });\n\n switch (name) {\n case \"latitude\":\n this._latitude = this._coerceNumber(value, 0);\n break;\n case \"longitude\":\n this._longitude = this._coerceNumber(value, 0);\n break;\n case \"zoom\":\n this._zoom = this._coerceNumber(value, 2);\n break;\n case \"min-zoom\":\n this._minZoom = value != null ? this._coerceNumber(value) : undefined;\n break;\n case \"max-zoom\":\n this._maxZoom = value != null ? this._coerceNumber(value) : undefined;\n break;\n case \"tile-url\":\n this._tileUrl = value ?? this._tileUrl;\n break;\n case \"tile-attribution\":\n this._tileAttribution = value ?? undefined;\n break;\n case \"theme-url\":\n this._themeUrl = value ?? undefined;\n if (this.isConnected) {\n this._applyThemeStyles();\n }\n break;\n case \"read-only\":\n this._readOnly = value !== null;\n break;\n case \"log-level\":\n this._logLevel = (value as LogLevel) ?? this._logLevel;\n this._logger.setLevel(this._logLevel);\n break;\n case \"dev-overlay\":\n this._devOverlay = value !== null;\n break;\n case \"polygon-allow-intersection\":\n this._polygonAllowIntersection = value !== null;\n break;\n case \"prefer-canvas\":\n this._preferCanvas = value !== null;\n break;\n case \"use-external-leaflet\":\n this._useExternalLeaflet = value !== null;\n break;\n case \"skip-leaflet-styles\":\n this._skipLeafletStyles = value !== null;\n break;\n default:\n break;\n }\n\n // If controller exists, propagate relevant changes\n if (this._controller) {\n if (name === \"latitude\" || name === \"longitude\" || name === \"zoom\") {\n // Update view without full re-init\n void this._controller.setView(\n this._latitude,\n this._longitude,\n this._zoom,\n );\n } else if (\n name === \"tile-url\" ||\n name === \"tile-attribution\" ||\n name === \"min-zoom\" ||\n name === \"max-zoom\" ||\n name === \"read-only\" ||\n name === \"dev-overlay\" ||\n name === \"log-level\" ||\n name === \"prefer-canvas\" ||\n name === \"use-external-leaflet\" ||\n name === \"skip-leaflet-styles\" ||\n name.startsWith(\"draw-\") ||\n name === \"edit-features\" ||\n name === \"delete-features\"\n ) {\n // For now, re-init controller to apply structural changes\n void this._controller.destroy().then(() => this._controller!.init());\n }\n }\n }\n\n // Properties (reflect attributes)\n get latitude(): number {\n return this._latitude;\n }\n set latitude(v: number) {\n this._latitude = Number(v);\n this._reflect(\"latitude\", String(this._latitude));\n }\n\n get longitude(): number {\n return this._longitude;\n }\n set longitude(v: number) {\n this._longitude = Number(v);\n this._reflect(\"longitude\", String(this._longitude));\n }\n\n get zoom(): number {\n return this._zoom;\n }\n set zoom(v: number) {\n this._zoom = Number(v);\n this._reflect(\"zoom\", String(this._zoom));\n }\n\n get minZoom(): number | undefined {\n return this._minZoom;\n }\n set minZoom(v: number | undefined) {\n this._minZoom = v;\n this._reflect(\"min-zoom\", v != null ? String(v) : null);\n }\n\n get maxZoom(): number | undefined {\n return this._maxZoom;\n }\n set maxZoom(v: number | undefined) {\n this._maxZoom = v;\n this._reflect(\"max-zoom\", v != null ? String(v) : null);\n }\n\n get tileUrl(): string {\n return this._tileUrl;\n }\n set tileUrl(v: string) {\n this._tileUrl = v;\n this._reflect(\"tile-url\", v);\n }\n\n get tileAttribution(): string | undefined {\n return this._tileAttribution;\n }\n set tileAttribution(v: string | undefined) {\n this._tileAttribution = v;\n this._reflect(\"tile-attribution\", v ?? null);\n }\n\n get readOnly(): boolean {\n return this._readOnly;\n }\n set readOnly(v: boolean) {\n this._readOnly = Boolean(v);\n this._booleanReflect(\"read-only\", this._readOnly);\n }\n\n get logLevel(): LogLevel {\n return this._logLevel;\n }\n set logLevel(v: LogLevel) {\n this._logLevel = v;\n this._logger.setLevel(v);\n this._reflect(\"log-level\", v);\n }\n\n get devOverlay(): boolean {\n return this._devOverlay;\n }\n set devOverlay(v: boolean) {\n this._devOverlay = Boolean(v);\n this._booleanReflect(\"dev-overlay\", this._devOverlay);\n }\n\n get preferCanvas(): boolean {\n return this._preferCanvas;\n }\n set preferCanvas(v: boolean) {\n this._preferCanvas = Boolean(v);\n this._booleanReflect(\"prefer-canvas\", this._preferCanvas);\n }\n\n get useExternalLeaflet(): boolean {\n return this._useExternalLeaflet;\n }\n set useExternalLeaflet(v: boolean) {\n this._useExternalLeaflet = Boolean(v);\n this._booleanReflect(\"use-external-leaflet\", this._useExternalLeaflet);\n }\n\n get skipLeafletStyles(): boolean {\n return this._skipLeafletStyles;\n }\n set skipLeafletStyles(v: boolean) {\n this._skipLeafletStyles = Boolean(v);\n this._booleanReflect(\"skip-leaflet-styles\", this._skipLeafletStyles);\n }\n\n get leafletInstance(): typeof LeafletNS | undefined {\n return this._leafletInstance;\n }\n set leafletInstance(v: typeof LeafletNS | undefined) {\n this._leafletInstance = v;\n }\n\n get themeCss(): string {\n return this._themeCss;\n }\n set themeCss(v: string) {\n this._themeCss = typeof v === \"string\" ? v : \"\";\n if (this.isConnected) {\n this._applyThemeStyles();\n }\n }\n\n // Public API methods (delegating to controller)\n async getGeoJSON(): Promise<FeatureCollection> {\n this._logger.debug(\"getGeoJSON\");\n if (!this._controller) return { type: \"FeatureCollection\", features: [] };\n return this._controller.getGeoJSON();\n }\n\n async loadGeoJSON(fc: FeatureCollection): Promise<void> {\n this._logger.debug(\"loadGeoJSON\", { features: fc?.features?.length ?? 0 });\n if (!this._controller) return;\n const detail = { fc, mode: \"load\" as const };\n this.dispatchEvent(new CustomEvent(\"leaflet-draw:ingest\", { detail }));\n const finalFc =\n detail.fc && detail.fc.type === \"FeatureCollection\" ? detail.fc : fc;\n await this._controller.loadGeoJSON(finalFc, false);\n }\n\n async clearLayers(): Promise<void> {\n this._logger.debug(\"clearLayers\");\n if (!this._controller) return;\n await this._controller.clearLayers();\n }\n\n async addFeatures(fc: FeatureCollection): Promise<string[]> {\n this._logger.debug(\"addFeatures\", { count: fc?.features?.length ?? 0 });\n if (!this._controller) return [];\n const detail = { fc, mode: \"add\" as const };\n this.dispatchEvent(new CustomEvent(\"leaflet-draw:ingest\", { detail }));\n const finalFc =\n detail.fc && detail.fc.type === \"FeatureCollection\" ? detail.fc : fc;\n return this._controller.addFeatures(finalFc);\n }\n\n async updateFeature(id: string, feature: Feature): Promise<void> {\n this._logger.debug(\"updateFeature\", { id });\n if (!this._controller) return;\n await this._controller.updateFeature(id, feature);\n }\n\n async removeFeature(id: string): Promise<void> {\n this._logger.debug(\"removeFeature\", { id });\n if (!this._controller) return;\n await this._controller.removeFeature(id);\n }\n\n async fitBoundsToData(padding?: number): Promise<void> {\n this._logger.debug(\"fitBoundsToData\", { padding });\n if (!this._controller) return;\n await this._controller.fitBoundsToData(\n typeof padding === \"number\" ? padding : 0.05,\n );\n }\n\n async fitBounds(\n bounds: [[number, number], [number, number]],\n padding?: number,\n ): Promise<void> {\n this._logger.debug(\"fitBounds\", { bounds, padding });\n if (!this._controller) return;\n await this._controller.fitBounds(\n bounds,\n typeof padding === \"number\" ? padding : 0.05,\n );\n }\n\n async setView(lat: number, lng: number, zoom?: number): Promise<void> {\n this._logger.debug(\"setView\", { lat, lng, zoom });\n // Reflect properties to maintain consistency\n this.latitude = lat;\n this.longitude = lng;\n if (typeof zoom === \"number\") this.zoom = zoom;\n if (this._controller) {\n await this._controller.setView(lat, lng, zoom);\n }\n }\n\n async exportGeoJSON(): Promise<FeatureCollection> {\n this._logger.debug(\"exportGeoJSON\");\n if (!this._controller) return { type: \"FeatureCollection\", features: [] };\n const fc = await this._controller.getGeoJSON();\n const detail = { geoJSON: fc, featureCount: fc.features.length };\n this.dispatchEvent(new CustomEvent(\"leaflet-draw:export\", { detail }));\n return fc;\n }\n\n /**\n * Merge all visible polygon layers into a single polygon.\n * This removes the original polygon features and adds a new merged feature.\n *\n * @param options Optional configuration for the merge operation\n * @returns Promise resolving to the ID of the newly created merged feature, or null if no polygons to merge\n */\n async mergePolygons(options?: {\n properties?: Record<string, any>;\n }): Promise<string | null> {\n this._logger.debug(\"mergePolygons\");\n if (!this._controller) return null;\n\n // Get current state before merge for event detail\n const preState = await this._controller.getGeoJSON();\n const preCount = preState.features.length;\n\n // Perform the merge operation\n const newFeatureId = await this._controller.mergeVisiblePolygons(options);\n\n if (newFeatureId) {\n // Get state after merge to provide in the event\n const postState = await this._controller.getGeoJSON();\n const detail = {\n id: newFeatureId,\n mergedFeatureCount: preCount - postState.features.length + 1,\n geoJSON: postState,\n };\n\n // Dispatch event to notify listeners\n this.dispatchEvent(new CustomEvent(\"leaflet-draw:merged\", { detail }));\n }\n\n return newFeatureId;\n }\n\n async setMeasurementUnits(system: MeasurementSystem): Promise<void> {\n this._logger.debug(\"setMeasurementUnits\", { system });\n if (!this._controller) return;\n this._controller.setRulerUnits(system);\n }\n\n async loadGeoJSONFromUrl(url: string): Promise<void> {\n this._logger.debug(\"loadGeoJSONFromUrl\", { url });\n if (!this._controller) return;\n const res = await fetch(url, { headers: { Accept: \"application/json\" } });\n if (!res.ok) {\n const err = new Error(\n `Failed to fetch GeoJSON from ${url}: ${res.status} ${res.statusText}`,\n );\n this.dispatchEvent(\n new CustomEvent(\"leaflet-draw:error\", {\n detail: { message: err.message, cause: err },\n }),\n );\n throw err;\n }\n const data = await res.json();\n const detail = { fc: data, mode: \"load\" as const };\n this.dispatchEvent(new CustomEvent(\"leaflet-draw:ingest\", { detail }));\n const finalFc =\n detail.fc && detail.fc.type === \"FeatureCollection\" ? detail.fc : data;\n await this._controller.loadGeoJSON(finalFc, true);\n }\n\n async loadGeoJSONFromText(text: string): Promise<void> {\n this._logger.debug(\"loadGeoJSONFromText\", { length: text?.length ?? 0 });\n if (!this._controller) return;\n let data: FeatureCollection;\n try {\n data = JSON.parse(text);\n } catch (cause) {\n const err = new Error(\"Failed to parse GeoJSON text\");\n this.dispatchEvent(\n new CustomEvent(\"leaflet-draw:error\", {\n detail: { message: err.message, cause },\n }),\n );\n throw err;\n }\n const detail = { fc: data, mode: \"load\" as const };\n this.dispatchEvent(new CustomEvent(\"leaflet-draw:ingest\", { detail }));\n const finalFc =\n detail.fc && detail.fc.type === \"FeatureCollection\" ? detail.fc : data;\n await this._controller.loadGeoJSON(finalFc, true);\n }\n // Helpers\n private _currentConfig(): MapConfig {\n return {\n latitude: this._latitude,\n longitude: this._longitude,\n zoom: this._zoom,\n minZoom: this._minZoom,\n maxZoom: this._maxZoom,\n tileUrl: this._tileUrl,\n tileAttribution: this._tileAttribution,\n readOnly: this._readOnly,\n fitToDataOnLoad: false,\n logLevel: this._logLevel,\n devOverlay: this._devOverlay,\n polygonAllowIntersection: this._polygonAllowIntersection,\n preferCanvas: this._preferCanvas,\n useExternalLeaflet: this._useExternalLeaflet,\n skipLeafletStyles: this._skipLeafletStyles,\n };\n }\n\n private _applyThemeStyles(): void {\n const themeUrl = this._themeUrl?.trim();\n if (themeUrl) {\n if (!this._themeLinkEl) {\n const link = document.createElement(\"link\");\n link.setAttribute(\"rel\", \"stylesheet\");\n link.setAttribute(\"data-geokit-theme-url\", \"true\");\n this._root.appendChild(link);\n this._themeLinkEl = link;\n }\n if (this._themeLinkEl.getAttribute(\"href\") !== themeUrl) {\n this._themeLinkEl.setAttribute(\"href\", themeUrl);\n }\n } else if (this._themeLinkEl) {\n this._themeLinkEl.remove();\n this._themeLinkEl = null;\n }\n\n const themeCss = this._themeCss;\n if (themeCss.trim().length > 0) {\n if (!this._themeStyleEl) {\n const style = document.createElement(\"style\");\n style.setAttribute(\"data-geokit-theme-css\", \"true\");\n this._root.appendChild(style);\n this._themeStyleEl = style;\n }\n if (this._themeStyleEl.textContent !== themeCss) {\n this._themeStyleEl.textContent = themeCss;\n }\n } else if (this._themeStyleEl) {\n this._themeStyleEl.remove();\n this._themeStyleEl = null;\n }\n }\n\n private _reflect(name: string, value: string | null): void {\n if (value === null) {\n this.removeAttribute(name);\n } else {\n if (this.getAttribute(name) !== value) {\n this.setAttribute(name, value);\n }\n }\n }\n\n private _booleanReflect(name: string, present: boolean): void {\n if (present) {\n if (!this.hasAttribute(name)) this.setAttribute(name, \"\");\n } else {\n if (this.hasAttribute(name)) this.removeAttribute(name);\n }\n }\n\n private _coerceNumber(v: string | null, fallback?: number): number {\n if (v == null) return fallback ?? NaN;\n const n = Number(v);\n return Number.isFinite(n) ? n : (fallback ?? NaN);\n }\n}\n","import type { Feature, FeatureCollection } from \"geojson\";\n\n/**\n * Details for the 'leaflet-draw:ready' event.\n * bounds: optional southwest/northeast LatLng pairs.\n */\nexport interface ReadyEventDetail {\n bounds?: [[number, number], [number, number]];\n}\n\n/**\n * Details for the 'leaflet-draw:created' event.\n * id: the stable feature id assigned by the FeatureStore.\n */\nexport interface CreatedEventDetail {\n id: string;\n layerType: \"polygon\" | \"polyline\" | \"rectangle\" | \"circle\" | \"marker\";\n geoJSON: Feature;\n}\n\n/**\n * Details for the 'leaflet-draw:edited' event.\n * ids: array of feature ids that were edited.\n */\nexport interface EditedEventDetail {\n ids: string[];\n geoJSON: FeatureCollection;\n}\n\n/**\n * Details for the 'leaflet-draw:deleted' event.\n * ids: array of feature ids that were deleted.\n */\nexport interface DeletedEventDetail {\n ids: string[];\n geoJSON: FeatureCollection;\n}\n\n/**\n * Details for error events emitted as 'leaflet-draw:error'.\n */\nexport interface ErrorEventDetail {\n message: string;\n cause?: unknown;\n}\n\n/**\n * Details for 'leaflet-draw:ingest' event. Fired before data is added to the map.\n * Listeners may mutate detail.fc to transform incoming data (e.g., flatten MultiPolygon).\n */\nexport interface IngestEventDetail {\n fc: FeatureCollection;\n mode: \"load\" | \"add\";\n}\n\n/**\n * Details for 'leaflet-draw:export' event.\n */\nexport interface ExportEventDetail {\n geoJSON: FeatureCollection;\n featureCount: number;\n}\n\n/**\n * Event name constants for convenience (non-enforced).\n */\nexport const DrawEvent = {\n Ready: \"leaflet-draw:ready\",\n Created: \"leaflet-draw:created\",\n Edited: \"leaflet-draw:edited\",\n Deleted: \"leaflet-draw:deleted\",\n Error: \"leaflet-draw:error\",\n Ingest: \"leaflet-draw:ingest\",\n Export: \"leaflet-draw:export\",\n DrawStart: \"leaflet-draw:drawstart\",\n DrawStop: \"leaflet-draw:drawstop\",\n EditStart: \"leaflet-draw:editstart\",\n EditStop: \"leaflet-draw:editstop\",\n} as const;\n","import { LeafletDrawMapElement } from \"@src/components/LeafletDrawMapElement\";\n\nconst CANONICAL_TAG_NAME = \"leaflet-geokit\";\nif (!customElements.get(CANONICAL_TAG_NAME)) {\n customElements.define(CANONICAL_TAG_NAME, LeafletDrawMapElement);\n}\n\nconst LEGACY_TAG_NAME = \"leaflet-draw-map\";\nif (!customElements.get(LEGACY_TAG_NAME)) {\n class LeafletDrawMapElementLegacy extends LeafletDrawMapElement {}\n customElements.define(LEGACY_TAG_NAME, LeafletDrawMapElementLegacy);\n}\n\nexport { LeafletDrawMapElement };\nexport * from \"@src/types/public\";\nexport * from \"@src/types/events\";\n"],"names":["levelWeight","shouldLog","current","msgLevel","nowISO","createLogger","name","level","sink","currentLevel","base","lvl","args","prefix","method","childName","iconRetinaUrl","iconUrl","shadowUrl","cogIconUrl","layerCakeIconUrl","rulerIconUrl","rulerIconColoredUrl","injectLeafletStyles","root","marker","style","leafletCSS","leafletDrawCSS","leafletRulerCSS","injectLeafletCustomStyles","configureLeafletDefaultIcons","_b","_a","L","applyLeafletStylingIfNeeded","options","skipStyles","getRandomValues","rnds8","rng","byteToHex","i","unsafeStringify","arr","offset","randomUUID","native","v4","buf","rnds","normalizeId","feature","id","eachCoord","geom","cb","walk","g","c","ring","poly","child","bboxOfFeature","minLng","minLat","maxLng","maxLat","seen","coord","lng","lat","bboxOfFeatureCollection","fc","f","b","bboxToBoundsPair","expandMultiGeometries","out","baseProps","line","pt","isPolygon","geometry","isMultiPolygon","extractPolygonCoordinates","mergePolygons","features","properties","allPolygons","coords","FeatureStore","logger","__publicField","ids","t0","stored","elapsed","_d","_c","updated","count","existing","uuidv4","patchedNamespaces","registerLayerCakeTool","Lns","DrawToolbarCtor","originalGetModeHandlers","map","modes","CakeCtor","MoveCtor","_DrawCake","tooltip","DrawCake","ensureDrawCakeRegistered","DrawNs","_RuntimeDrawCake","RuntimeDrawCake","_DrawMove","layer","element","selectedLayer","originalGeoJSON","newLatLng","newLatLngs","latLngs","ll","DrawMove","ensureDrawMoveRegistered","_RuntimeDrawMove","e","RuntimeDrawMove","EARTH_RADIUS_METERS","toRadians","deg","toDegrees","rad","destinationPoint","center","distanceMeters","bearingDegrees","angularDistance","bearing","lat1","lon1","sinLat1","cosLat1","sinAngular","cosAngular","sinLat2","lat2","y","x","lon2","signedRingArea","sum","x1","y1","x2","y2","ensureClosedRing","first","last","ensureWinding","clockwise","closed","reversed","circleToRing","radiusMeters","steps","pts","p","bakeCoreFeature","layerIndex","outer","bakeRingFeature","radiusOuterMeters","radiusInnerMeters","inner","bakeLayerCake","circles","sorted","a","circle","index","prevRadiusMeters","stopEvent","bindCakeControls","addButtonId","saveButtonId","onAddRing","onSave","addBtn","saveBtn","boundKey","el","ensureCircleEditable","formatDistance","meters","system","feet","LayerCakeManager","initialCircle","measurementSystem","anyL","EDITMOVE","EDITRESIZE","EDITSTART","_f","_e","EDITSTOP","_h","_g","onMove","onResize","onEditStart","onEditStop","editing","largest","newRadius","newCircle","geojson","prev","sourceCircle","newCenter","activeCircle","currentRadius","labelText","smallerCircles","innerNeighbor","curr","delta","deltaStr","westPoint","anchor","addId","saveId","uiIcon","fn","l","layerCakeIconSvg","moveToolIconSvg","WGS84_A","WGS84_B","WGS84_F","DEG_TO_RAD","RAD_TO_DEG","MAGIC_SCALE","toPrecise","value","scaled","normalizeBearing","magicRound","computePreciseDistance","vincenty","vincentyDistance","karney","karneyDistance","phi1","phi2","U1","U2","sinU1","cosU1","sinU2","cosU2","lambda","lambdaPrev","iterations","MAX","sinSigma","cosSigma","sigma","sinAlpha","cosSqAlpha","cos2SigmaM","sinLambda","cosLambda","C","uSq","A","B","deltaSigma","s","BASE_OPTIONS","METRIC_LENGTH","IMPERIAL_LENGTH","getRulerOptions","lengthUnit","measurementSystemDescriptions","assertDrawPresent","opts","hasControlDraw","hasDrawNamespace","ok","rulerPrecisionPatched","MapController","BundledL","globalL","latitude","longitude","zoom","minZoom","maxZoom","tileUrl","tileAttribution","preferCanvas","useExternalLeaflet","message","drawOptions","DrawCtor","err","fitToData","normalized","layers","paddingRatio","boundsLiteral","bounds","sw","ne","latPad","lngPad","padded","boundsTuple","polygonFeatures","existingId","mergedFeature","idsToRemove","newFeatureId","controls","readOnly","draw","edit","applyIcon","button","icon","svg","RulerCtor","proto","original","start","end","kilometers","conversion","distance","controller","SettingsControl","container","event","overlay","dialog","title","description","optionsList","label","input","span","actions","close","show","drawTb","CLICK_HIT_PX","onClick","handler","markers","firstLL","pFirst","pClick","GU","defaults","fmt","num","area","metric","precision","units","t","EditCircle","DrawEvent","latlng","radius","layerType","featureCollection","createdLayer","feat","newId","cause","handleContext","evt","handleClick","oe","containerPt","nearest","onDelete","menu","btn","cleanup","onDoc","tolerancePx","llToPoint","dist","targetPt","bestD","bestPath","bestVertex","latlngs","path","pathIndex","v","vertexIndex","d","paths","minVerts","newPaths","fid","newGeoJSON","drawControl","drawToolbar","handlers","moveHandler","key","mode","ui","cancelBtn","LeafletDrawMapElement","detail","_old","finalFc","padding","preCount","postState","url","res","data","text","themeUrl","link","themeCss","present","fallback","n","CANONICAL_TAG_NAME","LEGACY_TAG_NAME","LeafletDrawMapElementLegacy"],"mappings":"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","x_google_ignoreList":[1,2,3,6,7,9,10,11,12]}
1
+ {"version":3,"file":"leaflet-geokit.external.es.js","sources":["../src/utils/logger.ts","../node_modules/leaflet/dist/images/marker-icon-2x.png","../node_modules/leaflet/dist/images/marker-icon.png","../node_modules/leaflet/dist/images/marker-shadow.png","../src/assets/cog.svg?url","../src/assets/layer-cake.svg?url","../node_modules/leaflet-ruler/dist/icon.png","../node_modules/leaflet-ruler/dist/icon-colored.png","../src/lib/leaflet-assets.ts","../node_modules/uuid/dist/esm-browser/rng.js","../node_modules/uuid/dist/esm-browser/stringify.js","../node_modules/uuid/dist/esm-browser/native.js","../node_modules/uuid/dist/esm-browser/v4.js","../src/utils/geojson.ts","../src/lib/FeatureStore.ts","../src/lib/draw/toolbar-patch.ts","../src/lib/draw/L.Draw.Cake.ts","../src/lib/draw/L.Draw.Move.ts","../src/lib/layer-cake/CakeBaker.ts","../src/lib/layer-cake/bindCakeControls.ts","../src/lib/layer-cake/ensureCircleEditable.ts","../src/lib/layer-cake/LayerCakeManager.ts","../src/assets/layer-cake.svg?raw","../src/assets/move-tool.svg?raw","../src/utils/geodesic.ts","../src/utils/ruler.ts","../src/utils/leaflet-guards.ts","../src/lib/MapController.ts","../src/components/LeafletDrawMapElement.ts","../src/types/events.ts","../src/external.ts"],"sourcesContent":["export type LogLevel = \"trace\" | \"debug\" | \"info\" | \"warn\" | \"error\" | \"silent\";\n\nexport interface Logger {\n level: LogLevel;\n trace: (...args: unknown[]) => void;\n debug: (...args: unknown[]) => void;\n info: (...args: unknown[]) => void;\n warn: (...args: unknown[]) => void;\n error: (...args: unknown[]) => void;\n child: (childName: string) => Logger;\n setLevel: (level: LogLevel) => void;\n}\n\nconst levelWeight: Record<Exclude<LogLevel, \"silent\">, number> = {\n trace: 10,\n debug: 20,\n info: 30,\n warn: 40,\n error: 50,\n};\n\nfunction shouldLog(\n current: LogLevel,\n msgLevel: Exclude<LogLevel, \"silent\">,\n): boolean {\n if (current === \"silent\") return false;\n return (\n levelWeight[msgLevel] >= levelWeight[current as Exclude<LogLevel, \"silent\">]\n );\n}\n\nfunction nowISO(): string {\n try {\n return new Date().toISOString();\n } catch {\n return \"\";\n }\n}\n\nexport function createLogger(\n name: string,\n level: LogLevel = \"debug\",\n sink: Console = console,\n): Logger {\n let currentLevel: LogLevel = level;\n\n const base =\n (lvl: Exclude<LogLevel, \"silent\">) =>\n (...args: unknown[]) => {\n try {\n if (!shouldLog(currentLevel, lvl)) return;\n const prefix = `[${nowISO()}][${name}][${lvl.toUpperCase()}]`;\n // Route to appropriate console method if exists, otherwise fallback to console.log\n const method = (sink as any)[lvl] as\n | ((...args: unknown[]) => void)\n | undefined;\n if (typeof method === \"function\") {\n method(prefix, ...args);\n } else {\n sink.log(prefix, ...args);\n }\n } catch {\n // Never throw from logger\n }\n };\n\n const api: Logger = {\n get level() {\n return currentLevel;\n },\n setLevel(lvl: LogLevel) {\n currentLevel = lvl;\n },\n trace: base(\"trace\"),\n debug: base(\"debug\"),\n info: base(\"info\"),\n warn: base(\"warn\"),\n error: base(\"error\"),\n child(childName: string) {\n return createLogger(`${name}:${childName}`, currentLevel, sink);\n },\n };\n\n return api;\n}\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAABSCAMAAAAhFXfZAAAC91BMVEVMaXEzeak2f7I4g7g3g7cua5gzeKg8hJo3grY4g7c3grU0gLI2frE0daAubJc2gbQwd6QzeKk2gLMtd5sxdKIua5g1frA2f7IydaM0e6w2fq41fK01eqo3grgubJgta5cxdKI1f7AydaQydaMxc6EubJgvbJkwcZ4ubZkwcJwubZgubJcydqUydKIxapgubJctbJcubZcubJcvbJYubJcvbZkubJctbJctbZcubJg2f7AubJcrbZcubJcubJcua5g3grY0fq8ubJcubJdEkdEwhsw6i88vhswuhcsuhMtBjMgthMsrg8srgss6is8qgcs8i9A9iMYtg8spgcoogMo7hcMngMonf8olfso4gr8kfck5iM8jfMk4iM8he8k1fro7itAgesk2hs8eecgzfLcofssdeMg0hc4cd8g2hcsxeLQbdsgZdcgxeLImfcszhM0vda4xgckzhM4xg84wf8Yxgs4udKsvfcQucqhUndROmdM1fK0wcZ8vb5w0eqpQm9MzeKhXoNVcpdYydKNWn9VZotVKltJFjsIwcJ1Rms9OlslLmtH///8+kc9epdYzd6dbo9VHkMM2f7FHmNBClM8ydqVcpNY9hro3gLM9hLczealQmcw3fa46f7A8gLMxc6I3eagyc6FIldJMl9JSnNRSntNNl9JPnNJFi75UnM9ZodVKksg8kM45jc09e6ZHltFBk883gbRBh7pDk9EwcaBzn784g7dKkcY2i81Om9M7j85Llc81is09g7Q4grY/j9A0eqxKmdFFltBEjcXf6fFImdBCiLxJl9FGlNFBi78yiMxVndEvbpo6js74+vx+psPP3+o/ks5HkcpGmNCjwdZCkNDM3ehYoNJEls+lxNkxh8xHks0+jdC1zd5Lg6r+/v/H2ufz9/o3jM3t8/edvdM/k89Th61OiLBSjbZklbaTt9BfptdjmL1AicBHj8hGk9FAgK1dkLNTjLRekrdClc/k7fM0icy0y9tgp9c4jc2NtM9Dlc8zicxeXZn3AAAAQ3RSTlMAHDdTb4yPA+LtnEQmC4L2EmHqB7XA0d0sr478x4/Yd5i1zOfyPkf1sLVq4Nh3FvjxopQ2/STNuFzUwFIwxKaejILpIBEV9wAABhVJREFUeF6s1NdyFEcYBeBeoQIhRAkLlRDGrhIgY3BJL8CVeKzuyXFzzjkn5ZxzzuScg3PO8cKzu70JkO0LfxdTU//pM9vTu7Xgf6KqOVTb9X7toRrVEfBf1HTVjZccrT/2by1VV928Yty9ZbVuucdz90frG8DBjl9pVApbOstvmMuvVgaNXSfAAd6pGxpy6yxf5ph43pS/4f3uoaGm2rdu72S9xzOvMymkZFq/ptDrk90mhW7e4zl7HLzhxGWPR20xmSxJ/VqldG5m9XhaVOA1DadsNh3Pu5L2N6QtPO/32JpqQBVVk20oy/Pi2s23WEvyfHbe1thadVQttvm7Llf65gGmXK67XtupyoM7HQhmXdLS8oGWJNeOJ3C5fG5XCEJnkez3/oFdsvgJ4l2ANZwhrJKk/7OSXa+3Vw2WJMlKnGkobouYk6T0TyX30klOUnTD9HJ5qpckL3EW/w4XF3Xd0FGywXUrstrclVsqz5Pd/sXFYyDnPdrLcQODmGOK47IZb4CmibmMn+MYRzFZ5jg33ZL/EJrWcszHmANy3ARBK/IXtciJy8VsitPSdE3uuHxzougojcUdr8/32atnz/ev3f/K5wtpxUTpcaI45zusVDpYtZi+jg0oU9b3x74h7+n9ABvYEZeKaVq0sh0AtLKsFtqNBdeT0MrSzwwlq9+x6xAO4tgOtSzbCjrNQQiNvQUbUEubvzBUeGw26yDCsRHCoLkTHDa7IdOLIThs/gHvChszh2CimE8peRs47cxANI0lYNB5y1DljpOF0IhzBDPOZnDOqYYbeGKECbPzWnXludPphw5c2YBq5zlwXphIbO4VDCZ0gnPfUO1TwZoYwAs2ExPCedAu9DAjfQUjzITQb3jNj0KG2Sgt6BHaQUdYzWz+XmBktOHwanXjaSTcwwziBcuMOtwBmqPrTOxFQR/DRKKPqyur0aiW6cULYsx6tBm0jXpR/AUWR6HRq9WVW6MRhIq5jLyjbaCTDCijyYJNpCajdyobP/eTw0iexBAKkJ3gA5KcQb2zBXsIBckn+xVv8jkZSaEFHE+jFEleAEfayRU0MouNoBmB/L50Ai/HSLIHxcrpCvnhSQAuakKp2C/YbCylJjXRVy/z3+Kv/RrNcCo+WUzlVEhzKffnTQnxeN9fWF88fiNCUdSTsaufaChKWInHeysygfpIqagoakW+vV20J8uyl6TyNKEZWV4oRSPyCkWpgOLSbkCObT8o2r6tlG58HQquf6O0v50tB7JM7F4EORd2dx/K0w/KHsVkLPaoYrwgP/y7krr3SSMA4zj+OBgmjYkxcdIJQyQRKgg2viX9Hddi9UBb29LrKR7CVVEEEXWojUkXNyfTNDE14W9gbHJNuhjDettN3ZvbOvdOqCD3Jp/9l+/wJE+9PkYGjx/fqkys3S2rMozM/o2106rfMUINo6hVqz+eu/hd1c4xTg0TAfy5kV+4UG6+IthHTU9woWmxuKNbTfuCSfovBCxq7EtHqvYL4Sm6F8GVxsSXHMQ07TOi1DKtZxjWaaIyi4CXWjxPccUw8WVbMYY5wxC1mzEyXMJWkllpRloi+Kkoq69sxBTlElF6aAxYUbjXNlhlDZilDnM4U5SlN5biRsRHnbx3mbeWjEh4mEyiuJDl5XcWVmX5GvNkFgLWZM5qwsop4/AWfLhU1cR7k1VVvcYCWRkOI6Xy5gmnphCYIkvzuNYzHzosq2oNk2RtSs8khfUOfHIDgR6ysYBaMpl4uEgk2U/oJTs9AaTSwma7dT69geAE2ZpEjUsn2ieJNHeKfrI3EcAGJ2ZaNgVuC8EBctCLc57P5u5led6IOBkIYkuQMrmmjChs4VkfOerHqSBkPzZlhe06RslZ3zMjk2sscqKwY0RcjKK+LWbzd7KiHhkncs/siFJ+V5eXxD34B8nVuJEpGJNmxN2gH3vSvp7J70tF+D1Ej8qUJD1TkErAND2GZwTFg/LubvmgiBG3SOvdlsqFQrkEzJCL1rstlnVFROixZoDDSuXQFHESwVGlcuQcMb/b42NgjLowh5MTDFE3vNB5qStRIErdCQEh6pLPR92anSUb/wAIhldAaDMpGgAAAABJRU5ErkJggg==\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAApCAYAAADAk4LOAAAFgUlEQVR4Aa1XA5BjWRTN2oW17d3YaZtr2962HUzbDNpjszW24mRt28p47v7zq/bXZtrp/lWnXr337j3nPCe85NcypgSFdugCpW5YoDAMRaIMqRi6aKq5E3YqDQO3qAwjVWrD8Ncq/RBpykd8oZUb/kaJutow8r1aP9II0WmLKLIsJyv1w/kqw9Ch2MYdB++12Onxee/QMwvf4/Dk/Lfp/i4nxTXtOoQ4pW5Aj7wpici1A9erdAN2OH64x8OSP9j3Ft3b7aWkTg/Fm91siTra0f9on5sQr9INejH6CUUUpavjFNq1B+Oadhxmnfa8RfEmN8VNAsQhPqF55xHkMzz3jSmChWU6f7/XZKNH+9+hBLOHYozuKQPxyMPUKkrX/K0uWnfFaJGS1QPRtZsOPtr3NsW0uyh6NNCOkU3Yz+bXbT3I8G3xE5EXLXtCXbbqwCO9zPQYPRTZ5vIDXD7U+w7rFDEoUUf7ibHIR4y6bLVPXrz8JVZEql13trxwue/uDivd3fkWRbS6/IA2bID4uk0UpF1N8qLlbBlXs4Ee7HLTfV1j54APvODnSfOWBqtKVvjgLKzF5YdEk5ewRkGlK0i33Eofffc7HT56jD7/6U+qH3Cx7SBLNntH5YIPvODnyfIXZYRVDPqgHtLs5ABHD3YzLuespb7t79FY34DjMwrVrcTuwlT55YMPvOBnRrJ4VXTdNnYug5ucHLBjEpt30701A3Ts+HEa73u6dT3FNWwflY86eMHPk+Yu+i6pzUpRrW7SNDg5JHR4KapmM5Wv2E8Tfcb1HoqqHMHU+uWDD7zg54mz5/2BSnizi9T1Dg4QQXLToGNCkb6tb1NU+QAlGr1++eADrzhn/u8Q2YZhQVlZ5+CAOtqfbhmaUCS1ezNFVm2imDbPmPng5wmz+gwh+oHDce0eUtQ6OGDIyR0uUhUsoO3vfDmmgOezH0mZN59x7MBi++WDL1g/eEiU3avlidO671bkLfwbw5XV2P8Pzo0ydy4t2/0eu33xYSOMOD8hTf4CrBtGMSoXfPLchX+J0ruSePw3LZeK0juPJbYzrhkH0io7B3k164hiGvawhOKMLkrQLyVpZg8rHFW7E2uHOL888IBPlNZ1FPzstSJM694fWr6RwpvcJK60+0HCILTBzZLFNdtAzJaohze60T8qBzyh5ZuOg5e7uwQppofEmf2++DYvmySqGBuKaicF1blQjhuHdvCIMvp8whTTfZzI7RldpwtSzL+F1+wkdZ2TBOW2gIF88PBTzD/gpeREAMEbxnJcaJHNHrpzji0gQCS6hdkEeYt9DF/2qPcEC8RM28Hwmr3sdNyht00byAut2k3gufWNtgtOEOFGUwcXWNDbdNbpgBGxEvKkOQsxivJx33iow0Vw5S6SVTrpVq11ysA2Rp7gTfPfktc6zhtXBBC+adRLshf6sG2RfHPZ5EAc4sVZ83yCN00Fk/4kggu40ZTvIEm5g24qtU4KjBrx/BTTH8ifVASAG7gKrnWxJDcU7x8X6Ecczhm3o6YicvsLXWfh3Ch1W0k8x0nXF+0fFxgt4phz8QvypiwCCFKMqXCnqXExjq10beH+UUA7+nG6mdG/Pu0f3LgFcGrl2s0kNNjpmoJ9o4B29CMO8dMT4Q5ox8uitF6fqsrJOr8qnwNbRzv6hSnG5wP+64C7h9lp30hKNtKdWjtdkbuPA19nJ7Tz3zR/ibgARbhb4AlhavcBebmTHcFl2fvYEnW0ox9xMxKBS8btJ+KiEbq9zA4RthQXDhPa0T9TEe69gWupwc6uBUphquXgf+/FrIjweHQS4/pduMe5ERUMHUd9xv8ZR98CxkS4F2n3EUrUZ10EYNw7BWm9x1GiPssi3GgiGRDKWRYZfXlON+dfNbM+GgIwYdwAAAAASUVORK5CYII=\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACkAAAApCAQAAAACach9AAACMUlEQVR4Ae3ShY7jQBAE0Aoz/f9/HTMzhg1zrdKUrJbdx+Kd2nD8VNudfsL/Th///dyQN2TH6f3y/BGpC379rV+S+qqetBOxImNQXL8JCAr2V4iMQXHGNJxeCfZXhSRBcQMfvkOWUdtfzlLgAENmZDcmo2TVmt8OSM2eXxBp3DjHSMFutqS7SbmemzBiR+xpKCNUIRkdkkYxhAkyGoBvyQFEJEefwSmmvBfJuJ6aKqKWnAkvGZOaZXTUgFqYULWNSHUckZuR1HIIimUExutRxwzOLROIG4vKmCKQt364mIlhSyzAf1m9lHZHJZrlAOMMztRRiKimp/rpdJDc9Awry5xTZCte7FHtuS8wJgeYGrex28xNTd086Dik7vUMscQOa8y4DoGtCCSkAKlNwpgNtphjrC6MIHUkR6YWxxs6Sc5xqn222mmCRFzIt8lEdKx+ikCtg91qS2WpwVfBelJCiQJwvzixfI9cxZQWgiSJelKnwBElKYtDOb2MFbhmUigbReQBV0Cg4+qMXSxXSyGUn4UbF8l+7qdSGnTC0XLCmahIgUHLhLOhpVCtw4CzYXvLQWQbJNmxoCsOKAxSgBJno75avolkRw8iIAFcsdc02e9iyCd8tHwmeSSoKTowIgvscSGZUOA7PuCN5b2BX9mQM7S0wYhMNU74zgsPBj3HU7wguAfnxxjFQGBE6pwN+GjME9zHY7zGp8wVxMShYX9NXvEWD3HbwJf4giO4CFIQxXScH1/TM+04kkBiAAAAAElFTkSuQmCC\"","export default \"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='430'%20height='430'%20style='width:100%25;height:100%25;transform:translate3d(0,0,0);content-visibility:visible'%20viewBox='0%200%20430%20430'%3e%3cdefs%3e%3cclipPath%20id='i'%3e%3cpath%20d='M0%200h430v430H0z'/%3e%3c/clipPath%3e%3cclipPath%20id='s'%3e%3cpath%20d='M0%200h430v430H0z'/%3e%3c/clipPath%3e%3cclipPath%20id='e'%3e%3cpath%20d='M0%200h430v430H0z'/%3e%3c/clipPath%3e%3cclipPath%20id='p'%3e%3cpath%20d='M0%200h430v430H0z'/%3e%3c/clipPath%3e%3cclipPath%20id='f'%3e%3cpath%20d='M0%200h430v430H0z'/%3e%3c/clipPath%3e%3cclipPath%20id='m'%3e%3cpath%20d='M0%200h430v430H0z'/%3e%3c/clipPath%3e%3cclipPath%20id='g'%3e%3cpath%20d='M0%200h430v430H0z'/%3e%3c/clipPath%3e%3cclipPath%20id='j'%3e%3cpath%20d='M0%200h430v430H0z'/%3e%3c/clipPath%3e%3cclipPath%20id='h'%3e%3cpath%20d='M0%200h430v430H0z'/%3e%3c/clipPath%3e%3cfilter%20id='t'%20width='300%25'%20height='300%25'%20x='-100%25'%20y='-100%25'%3e%3cfeGaussianBlur%20result='filter_result_0'/%3e%3c/filter%3e%3cfilter%20id='r'%20width='300%25'%20height='300%25'%20x='-100%25'%20y='-100%25'%3e%3cfeGaussianBlur%20result='filter_result_0'%20stdDeviation='52.5%2052.5'/%3e%3c/filter%3e%3cfilter%20id='n'%20width='300%25'%20height='300%25'%20x='-100%25'%20y='-100%25'%3e%3cfeGaussianBlur%20result='filter_result_0'/%3e%3c/filter%3e%3cfilter%20id='k'%20width='300%25'%20height='300%25'%20x='-100%25'%20y='-100%25'%3e%3cfeGaussianBlur%20result='filter_result_0'/%3e%3c/filter%3e%3cmask%20id='u'%20mask-type='alpha'%3e%3cuse%20xmlns:ns1='http://www.w3.org/1999/xlink'%20ns1:href='%23a'/%3e%3c/mask%3e%3cmask%20id='q'%20mask-type='alpha'%3e%3cuse%20xmlns:ns2='http://www.w3.org/1999/xlink'%20ns2:href='%23b'/%3e%3c/mask%3e%3cmask%20id='o'%20mask-type='alpha'%3e%3cuse%20xmlns:ns3='http://www.w3.org/1999/xlink'%20ns3:href='%23c'/%3e%3c/mask%3e%3cmask%20id='l'%20mask-type='alpha'%3e%3cuse%20xmlns:ns4='http://www.w3.org/1999/xlink'%20ns4:href='%23d'/%3e%3c/mask%3e%3cg%20id='a'%20fill-opacity='0'%20stroke-linecap='round'%20stroke-linejoin='round'%20clip-path='url(%23e)'%20style='display:none'%3e%3cpath%20class='secondary'%20style='display:none'/%3e%3cpath%20class='primary'%20style='display:none'/%3e%3c/g%3e%3cg%20id='b'%20fill-opacity='0'%20stroke-linecap='round'%20stroke-linejoin='round'%20stroke-width='12'%20clip-path='url(%23f)'%20style='display:block'%3e%3cpath%20stroke='%2308A88A'%20d='M44.446-66.518a79.998%2079.998%200%200%200-101.012%209.952A79.998%2079.998%200%201%200%2056.569%2056.569%2080.005%2080.005%200%200%200%2073.91-30.615a80.001%2080.001%200%200%200-29.464-35.903z'%20class='secondary'%20style='display:block'%20transform='translate(215%20214)'/%3e%3cpath%20stroke='%23121331'%20d='m141.409%2025.241%208.727%205.041s0%200%200%200a22.3%2022.3%200%200%201%2010.411%2013.542%2022.32%2022.32%200%200%201-2.221%2016.937l-26.515%2045.924a22.325%2022.325%200%200%201-30.497%208.172l-8.754-5.059a143.414%20143.414%200%200%201-43.718%2025.286v10.108a22.302%2022.302%200%200%201-13.778%2020.612%2022.303%2022.303%200%200%201-8.539%201.696h-53.029a22.303%2022.303%200%200%201-15.779-6.531%2022.302%2022.302%200%200%201-6.537-15.777v-10.073a143.416%20143.416%200%200%201-43.719-25.285l-8.754%205.059a22.325%2022.325%200%200%201-30.497-8.172l-26.523-45.924a22.315%2022.315%200%200%201-2.238-16.943A22.31%2022.31%200%200%201-150.142%2030.3l8.727-5.041a145.097%20145.097%200%200%201%200-50.518l-8.727-5.041a22.294%2022.294%200%200%201-10.409-13.554%2022.306%2022.306%200%200%201%202.238-16.943l26.514-45.924a22.325%2022.325%200%200%201%2030.497-8.172l8.754%205.059a143.416%20143.416%200%200%201%2043.719-25.285v-10.073a22.302%2022.302%200%200%201%206.537-15.777%2022.3%2022.3%200%200%201%2015.779-6.531h53.02a22.307%2022.307%200%200%201%2022.317%2022.308v10.037a143.41%20143.41%200%200%201%2043.718%2025.285l8.754-5.059a22.325%2022.325%200%200%201%2030.497%208.172l26.515%2045.942a22.313%2022.313%200%200%201-1.618%2024.757%2022.294%2022.294%200%200%201-6.554%205.74l-8.727%205.041a145.097%20145.097%200%200%201%200%2050.518z'%20class='primary'%20style='display:block'%20transform='rotate(-120%20169.576%2045.095)'/%3e%3c/g%3e%3cg%20id='c'%20fill-opacity='0'%20stroke-linecap='round'%20stroke-linejoin='round'%20clip-path='url(%23g)'%20style='display:none'%3e%3cpath%20class='secondary'%20style='display:none'/%3e%3cpath%20class='primary'%20style='display:none'/%3e%3c/g%3e%3cg%20id='d'%20fill-opacity='0'%20stroke-linecap='round'%20stroke-linejoin='round'%20clip-path='url(%23h)'%20style='display:none'%3e%3cpath%20class='secondary'%20style='display:none'/%3e%3cpath%20class='primary'%20style='display:none'/%3e%3c/g%3e%3c/defs%3e%3cg%20clip-path='url(%23i)'%3e%3cg%20clip-path='url(%23j)'%20filter='url(%23k)'%20mask='url(%23l)'%20style='display:none'%3e%3cg%20class='design'%3e%3cpath%20class='primary'/%3e%3c/g%3e%3cg%20class='design'%3e%3cpath%20class='secondary'/%3e%3c/g%3e%3c/g%3e%3cg%20clip-path='url(%23m)'%20filter='url(%23n)'%20mask='url(%23o)'%20style='display:none'%3e%3cg%20class='design'%3e%3cpath%20class='primary'/%3e%3c/g%3e%3cg%20class='design'%3e%3cpath%20class='secondary'/%3e%3c/g%3e%3c/g%3e%3cg%20clip-path='url(%23p)'%20mask='url(%23q)'%20style='display:block'%3e%3cg%20filter='url(%23r)'%20transform='rotate(-94%20238.762%20-16.565)%20scale(2.4)'%3e%3cg%20class='design'%3e%3cpath%20fill='%234BE1EC'%20d='M0-250c137.975%200%20250%20112.025%20250%20250S137.975%20250%200%20250-250%20137.975-250%200-137.975-250%200-250z'%20class='primary'/%3e%3c/g%3e%3cg%20class='design'%3e%3cpath%20fill='%23CB5EEE'%20d='M113.242-295.384c97.478%200%20176.5%2079.022%20176.5%20176.5s-79.022%20176.5-176.5%20176.5c-43.948%200-74.396-34.057-105.29-60.631-37.631-32.369-71.21-62.338-71.21-115.869%200-97.478%2079.022-176.5%20176.5-176.5z'%20class='secondary'/%3e%3c/g%3e%3c/g%3e%3c/g%3e%3cg%20clip-path='url(%23s)'%20filter='url(%23t)'%20mask='url(%23u)'%20style='display:none'%3e%3cg%20class='design'%3e%3cpath%20class='primary'/%3e%3c/g%3e%3cg%20class='design'%3e%3cpath%20class='secondary'/%3e%3c/g%3e%3c/g%3e%3c/g%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3c?xml%20version='1.0'%20encoding='utf-8'?%3e%3c!--%20Uploaded%20to:%20SVG%20Repo,%20www.svgrepo.com,%20Generator:%20SVG%20Repo%20Mixer%20Tools%20--%3e%3csvg%20width='800px'%20height='800px'%20viewBox='0%20-1.67%2047.336%2047.336'%20xmlns='http://www.w3.org/2000/svg'%3e%3cg%20id='Group_42'%20data-name='Group%2042'%20transform='translate(-172.455%20-364.36)'%3e%3cpath%20id='Rectangle_17'%20data-name='Rectangle%2017'%20d='M4.351,0H40.984a4.351,4.351,0,0,1,4.351,4.351V22.117a1,1,0,0,1-1,1H1a1,1,0,0,1-1-1V4.351A4.351,4.351,0,0,1,4.351,0Z'%20transform='translate(173.455%20384.243)'%20fill='none'%20stroke='%23000000'%20stroke-linecap='round'%20stroke-linejoin='round'%20stroke-width='2'/%3e%3cpath%20id='Path_90'%20data-name='Path%2090'%20d='M218.79,390.249a3.778,3.778,0,0,1-3.778,3.778h0a3.779,3.779,0,0,1-3.778-3.778,3.778,3.778,0,0,1-3.778,3.778h0a3.779,3.779,0,0,1-3.778-3.778,3.778,3.778,0,0,1-3.778,3.778h0a3.779,3.779,0,0,1-3.778-3.778,3.778,3.778,0,0,1-3.778,3.778h0a3.779,3.779,0,0,1-3.778-3.778,3.778,3.778,0,0,1-3.778,3.778h0a3.779,3.779,0,0,1-3.778-3.778,3.778,3.778,0,0,1-3.778,3.778h0a3.778,3.778,0,0,1-3.777-3.778'%20fill='none'%20stroke='%23000000'%20stroke-linecap='round'%20stroke-linejoin='round'%20stroke-width='2'/%3e%3cg%20id='Group_41'%20data-name='Group%2041'%3e%3cpath%20id='Rectangle_18'%20data-name='Rectangle%2018'%20d='M4.351,0H26.473a4.351,4.351,0,0,1,4.351,4.351V17.883a1,1,0,0,1-1,1H1a1,1,0,0,1-1-1V4.351A4.351,4.351,0,0,1,4.351,0Z'%20transform='translate(180.71%20365.36)'%20fill='none'%20stroke='%23000000'%20stroke-linecap='round'%20stroke-linejoin='round'%20stroke-width='2'/%3e%3cpath%20id='Path_91'%20data-name='Path%2091'%20d='M211.234,370.794a3.778,3.778,0,0,1-3.778,3.778h0a3.779,3.779,0,0,1-3.778-3.778,3.778,3.778,0,0,1-3.778,3.778h0a3.779,3.779,0,0,1-3.778-3.778,3.778,3.778,0,0,1-3.778,3.778h0a3.779,3.779,0,0,1-3.778-3.778,3.778,3.778,0,0,1-3.778,3.778h0a3.779,3.779,0,0,1-3.778-3.778'%20fill='none'%20stroke='%23000000'%20stroke-linecap='round'%20stroke-linejoin='round'%20stroke-width='2'/%3e%3c/g%3e%3c/g%3e%3c/svg%3e\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAQAAABKfvVzAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAAmJLR0QAAKqNIzIAAAAJcEhZcwAADdcAAA3XAUIom3gAAAAHdElNRQfhBQoMHg6McuYvAAABwklEQVQ4y43TP0jUYRgH8M/daQpqdujhnwShGiwyipCIoIgWxyIwrqEhnCQoGqKhpoYMg1qCQjg8TC2JCtSkjCgaKisIhyQUwpJssD9KZWRZg6d450/yGV54n/fzfd53eUOCaoNa5QpNGNPr9cKjUAatdsB++co0G1XiiHd+uqnTq8VzI874o9s2Ic1iiEpii9tmnJOdfkOldt/dU+HYolHnjdmpRNzbuVaNL86m4sXqNOrz3kMXHFKYMqd8VREGBToMifqLgwY1yNZirya5knaBqH16fJjNJiWEFSlxy4g980+pMuZkir/UJjLbrvNRPnINaLUygK/yQpuImHp47LOjuKJPOJA/1y4iZsAlyozLs8IO42L/4QlhGrSCy5oCeKH+dM59vVbL9sn6AP5MRzpnVKtN1viRxit1WRvEmVKFrQbTpoddNR3E+aYKuw1lPOapa0GcEf22KzOtejmcG1rkYdjEAn59KU5cDzjt+HI4BSZtVJTazfIsMQOmFAusLr/E53lniickJYIDNcaUL+JhMZPWBUdOeCCaweGOw5k0lFrv2uyRuBxPlLpoBtTK0p3mh+f+dKl6jX6LapRj6XrzD+1bmkFA/dTVAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDE3LTA1LTEwVDEyOjMwOjE0KzAyOjAwUNH5TAAAACV0RVh0ZGF0ZTptb2RpZnkAMjAxNy0wNS0xMFQxMjozMDoxNCswMjowMCGMQfAAAAAZdEVYdFNvZnR3YXJlAHd3dy5pbmtzY2FwZS5vcmeb7jwaAAAAAElFTkSuQmCC\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAMAAADXqc3KAAAAA3NCSVQICAjb4U/gAAAACXBIWXMAAACmAAAApgHdff84AAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAAn9QTFRF////AAAAAAAAAAAAAAAAAAAzABcXABQUABIkDhwrAA0aAAwYABUgABQfABIbABAZAA8fABUcABMaABMfABIeABEcABAbABQeABMdABIdABEbABIbABIbABEdABEcABIcBxsoABEdABIdABIdABEcABMbABMdFBwgERofAhIbEhsfAhIdBxUeEhsgEBofAhMbAhMdBRMdAhIbAhIdAhMdCRceARIcDBgfDBgfDBcfDBcfFhwgDBceDBceCxceFCs5HTdGAxMcDxofGTFAHDRDHDVDHDVEHTZFDRkfEBofERogCh0oERsgARIcEhsfEhsgCh4pDCEsDRkfDRkfEBofBhQdDSMvDRgfDBgfCBUeBxUeDyUyECYzUDktPTAqCRceCRYeChYeDxkfEBkgLCgmWj4wCBYdW0AwGh4hHCAiHSAiTDctBhUdBxYdEBkfLyonMConBhUdJiUkLCclLSgmLigmOzApPTEpDBgfBRQdDBgfERsgWT8wBBMdCBYeChceQjMrSzctZEUyBBMdERsgXUAxXkExY0QzglQ5AxUfBxolSjcthlU6hlY7h1Y7AxMcSDUsSjYsd042g1Q5hlY6jVo8AhIcAxMcBBQdLEpcOVpvARIcAhIcBhQdDSIuEhsgJ0NUNS0oNi0oO11yTTgtUXmSUnqUXEAxXUExYEIyZUUzaEYzb0o1cEo1dEw2i1g8jFk8jcfskFs9mdX9mmA/mtf/pmZCqGdCsWxEvnJHxHVJxnZJyHdJzHlK0XxM031M139N3IFO3YJO4INP5IVQ5YZQ5oZQ6ohR7IlS7opS74tS8ItT841T9I1T9o5U949U+ZBV+pBV/ZJW/pJW/5NWIYcOagAAAJt0Uk5TAAECAwQFCw0OEhQVGBkcHyEkKCkqLTAzNUZLVFZZW2RnanJzeHl8f4uMjY6Pj5KVl52eoKGprKytrq+vsLGytLu9vb/BwsLDxcXP0NDS09bf4uPk5OXl5ufo6enq7O3u7+/x8fHy8/P09PT09fX19fX29vb29vb29/j4+Pj5+fn5+fn6+vr6+vr7/Pz8/Pz9/f39/f39/v7+/v7Td3FlAAABgklEQVQoU2NggAMRJU1DTWURBlQgqhWUND11Tfr05GBdMYQws8a07j2XVx2/cnLl5T0T5+ixQsX5/RrWr70CA+s2NPoLgMUlciddvnLl3PbslMysmi2ngXKTc/iA4uwRC1dfudRT76UtJy5lMHvHlSsni82ZgBLWbZdOHCuPlARpForvBYszA9ky1WeunC8y5YCI9125cqrEnJlbnoHBZ/6mK+0eTAjxUgtmbl99Bt6Ksxd2pXGDxRPg4kZMDIqxV6406cDFT8PEGRwnHLlYJQwSTwSJ51tCxRmiVuw7VAsRP7zkIEKcofnAlb0hEPWXls9AiDNUHriyMxwoPgVoToEVQpwhdNHuY/2imOIMZq1nr2QUgsVtkMUZZOOuXOmYiinOwF63/8QVsDgLd0wnFwMCOM3dBhK3ZeGOXjzLHklCIu8oRDxs8eaNXYJIMuplJ0HigYs3b906UwFJgtGzxY6FLWDe0mXLli3wVoEAaZAMjxoLA6eDu5urq4uziTEEqAIAvamx163e5EoAAAAASUVORK5CYII=\"","import * as L from \"leaflet\";\n\n// Inline CSS strings (bundled by Vite) so we can inject into Shadow DOM\nimport leafletCSS from \"leaflet/dist/leaflet.css?inline\";\nimport leafletDrawCSS from \"leaflet-draw/dist/leaflet.draw.css?inline\";\nimport leafletRulerCSS from \"leaflet-ruler/src/leaflet-ruler.css?inline\";\n\n// Resolve Leaflet's default marker assets as URLs\nimport iconRetinaUrl from \"leaflet/dist/images/marker-icon-2x.png\";\nimport iconUrl from \"leaflet/dist/images/marker-icon.png\";\n\nimport shadowUrl from \"leaflet/dist/images/marker-shadow.png\";\nimport cogIconUrl from \"@src/assets/cog.svg?url\";\nimport layerCakeIconUrl from \"@src/assets/layer-cake.svg?url\";\n\nimport rulerIconUrl from \"leaflet-ruler/dist/icon.png\";\nimport rulerIconColoredUrl from \"leaflet-ruler/dist/icon-colored.png\";\n\n/**\n * Inject Leaflet and Leaflet.draw CSS into the given ShadowRoot.\n * Idempotent: does nothing if already injected for this root.\n */\nexport function injectLeafletStyles(root: ShadowRoot): void {\n // Avoid duplicate injection in HMR or reconnection\n const marker = \"data-leaflet-styles\";\n if (root.querySelector(`style[${marker}]`)) return;\n\n const style = document.createElement(\"style\");\n style.setAttribute(marker, \"true\");\n style.textContent = `\n/* --- Leaflet core CSS --- */\n${leafletCSS}\n\n/* --- Leaflet.draw CSS --- */\n${leafletDrawCSS}\n\n/* --- Leaflet.ruler CSS --- */\n${leafletRulerCSS}\n\n/* --- Fix Leaflet.ruler icons (broken relative paths in inlined CSS) --- */\n.leaflet-ruler {\n width: 30px !important; /* Match Leaflet Draw default size approx */\n height: 30px !important;\n background-color: #fff; /* Ensure visibility */\n background-image: url(${rulerIconUrl}) !important;\n background-size: 16px 16px; /* Scale icon to fit */\n}\n.leaflet-ruler:hover,\n.leaflet-ruler-clicked {\n background-image: url(${rulerIconColoredUrl}) !important;\n}\n\n/* --- Custom overrides for marker/handle sizes --- */\n.leaflet-draw-handle,\n.leaflet-editing-icon,\n.leaflet-draw-marker-icon {\n width: 12px !important;\n height: 12px !important;\n margin-left: -6px !important;\n margin-top: -6px !important;\n}\n\n/* --- Ruler settings control --- */\n.leaflet-ruler-settings-control {\n display: flex;\n flex-direction: column;\n}\n.leaflet-ruler-settings-button {\n width: 30px;\n height: 30px;\n border: none;\n background-color: #fff;\n background-repeat: no-repeat;\n background-position: center;\n background-size: 22px 22px;\n cursor: pointer;\n padding: 0;\n border-radius: 4px;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25);\n background-image: url(${cogIconUrl});\n transition: background-color 0.15s ease, box-shadow 0.15s ease;\n}\n.leaflet-ruler-settings-button:hover {\n background-color: #f4f4f4;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.3);\n}\n.leaflet-ruler-settings-button:focus-visible {\n outline: 2px solid #2c7be5;\n outline-offset: 2px;\n}\n\n/* --- Measurement modal --- */\n.leaflet-ruler-modal-overlay {\n position: absolute;\n inset: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n background: rgba(0, 0, 0, 0.4);\n z-index: 500;\n opacity: 0;\n pointer-events: none;\n transition: opacity 0.2s ease;\n padding: 16px;\n}\n.leaflet-ruler-modal-overlay.is-open {\n opacity: 1;\n pointer-events: auto;\n}\n.leaflet-ruler-modal {\n background: #fff;\n border-radius: 8px;\n width: min(320px, 100%);\n padding: 16px;\n box-shadow: 0 12px 30px rgba(0, 0, 0, 0.25);\n}\n.leaflet-ruler-modal-title {\n margin: 0 0 8px;\n font-size: 16px;\n font-weight: 600;\n}\n.leaflet-ruler-modal-description {\n margin: 0 0 12px;\n font-size: 13px;\n color: #444;\n}\n.leaflet-ruler-modal-options {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n.leaflet-ruler-modal-option {\n display: flex;\n gap: 8px;\n align-items: flex-start;\n font-size: 14px;\n}\n.leaflet-ruler-modal-option input[type=\"radio\"] {\n margin-top: 4px;\n}\n.leaflet-ruler-modal-option span {\n line-height: 1.25;\n}\n.leaflet-ruler-modal-actions {\n margin-top: 16px;\n display: flex;\n justify-content: flex-end;\n}\n.leaflet-ruler-modal-close {\n border: none;\n background: #2c7be5;\n color: #fff;\n border-radius: 4px;\n padding: 6px 12px;\n cursor: pointer;\n font-size: 14px;\n}\n.leaflet-ruler-modal-close:hover {\n background: #1a56c2;\n}\n\n/* --- Layer Cake draw tool icon + manager UI --- */\n.leaflet-draw-toolbar a.leaflet-draw-draw-cake {\n background-image: url(${layerCakeIconUrl}) !important;\n background-size: 18px 18px !important;\n background-position: 50% 50% !important;\n background-repeat: no-repeat !important;\n background-color: #fff;\n}\n\n.layer-cake-controls__container {\n display: flex;\n gap: 6px;\n background: white;\n padding: 5px;\n border-radius: 4px;\n box-shadow: 0 2px 5px rgba(0, 0, 0, 0.3);\n}\n\n.layer-cake-controls button {\n border: 1px solid #ccc;\n background: white;\n padding: 4px 8px;\n border-radius: 3px;\n font-size: 12px;\n cursor: pointer;\n}\n\n.layer-cake-controls button:hover {\n background: #f4f4f4;\n}\n\n/* --- Layer Cake measurement tooltips --- */\n.cake-label {\n background-color: rgba(255, 255, 255, 0.95) !important;\n border: 2px solid #8A2BE2 !important;\n border-radius: 4px !important;\n color: #333 !important;\n font-size: 13px !important;\n font-weight: 600 !important;\n padding: 4px 8px !important;\n white-space: nowrap !important;\n box-shadow: 0 2px 6px rgba(0, 0, 0, 0.2) !important;\n}\n\n.cake-label::before {\n border-right-color: #8A2BE2 !important;\n}\n\n/* --- Move tool mode cursor styles --- */\n.leaflet-draw-move-mode {\n cursor: default !important;\n}\n\n.leaflet-draw-move-mode .leaflet-interactive {\n cursor: grab !important;\n}\n\n.leaflet-draw-move-mode .leaflet-interactive:active {\n cursor: grabbing !important;\n}\n`;\n root.appendChild(style);\n}\n\n/**\n * Inject only project-specific style overrides that must exist even when\n * consumers provide external Leaflet CSS.\n * Idempotent: does nothing if already injected for this root.\n */\nexport function injectLeafletCustomStyles(root: ShadowRoot): void {\n const marker = \"data-leaflet-custom-styles\";\n if (root.querySelector(`style[${marker}]`)) return;\n\n const style = document.createElement(\"style\");\n style.setAttribute(marker, \"true\");\n style.textContent = `\n/* Ensure Layer Cake toolbar icon uses project asset instead of draw sprite sheet */\n.leaflet-draw-toolbar a.leaflet-draw-draw-cake {\n background-image: url(${layerCakeIconUrl}) !important;\n background-size: 18px 18px !important;\n background-position: 50% 50% !important;\n background-repeat: no-repeat !important;\n background-color: #fff;\n}\n`;\n\n root.appendChild(style);\n}\n\n/**\n * Ensure Leaflet default marker icons resolve via the bundler.\n * Safe to call multiple times.\n */\nexport function configureLeafletDefaultIcons(): void {\n // Merge options so Leaflet's default icon paths point to bundled URLs\n (L.Icon.Default as any).mergeOptions?.({\n iconRetinaUrl,\n iconUrl,\n shadowUrl,\n });\n}\n\n/**\n * Conditional helper: apply styles and icon wiring only if not skipped.\n */\nexport function applyLeafletStylingIfNeeded(options: {\n root: ShadowRoot;\n skipStyles?: boolean;\n}): void {\n const { root, skipStyles } = options;\n try {\n if (!skipStyles) {\n injectLeafletStyles(root);\n configureLeafletDefaultIcons();\n }\n // Always apply project-specific draw icon overrides, including external mode.\n injectLeafletCustomStyles(root);\n } catch {\n // Swallow styling errors; caller logs at higher level\n }\n}\n","// Unique ID creation requires a high quality random # generator. In the browser we therefore\n// require the crypto API and do not support built-in fallback to lower quality random number\n// generators (like Math.random()).\nlet getRandomValues;\nconst rnds8 = new Uint8Array(16);\nexport default function rng() {\n // lazy load so that environments that need to polyfill have a chance to do so\n if (!getRandomValues) {\n // getRandomValues needs to be invoked in a context where \"this\" is a Crypto implementation.\n getRandomValues = typeof crypto !== 'undefined' && crypto.getRandomValues && crypto.getRandomValues.bind(crypto);\n\n if (!getRandomValues) {\n throw new Error('crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported');\n }\n }\n\n return getRandomValues(rnds8);\n}","import validate from './validate.js';\n/**\n * Convert array of 16 byte values to UUID string format of the form:\n * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX\n */\n\nconst byteToHex = [];\n\nfor (let i = 0; i < 256; ++i) {\n byteToHex.push((i + 0x100).toString(16).slice(1));\n}\n\nexport function unsafeStringify(arr, offset = 0) {\n // Note: Be careful editing this code! It's been tuned for performance\n // and works in ways you may not expect. See https://github.com/uuidjs/uuid/pull/434\n return byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + '-' + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + '-' + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + '-' + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + '-' + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]];\n}\n\nfunction stringify(arr, offset = 0) {\n const uuid = unsafeStringify(arr, offset); // Consistency check for valid UUID. If this throws, it's likely due to one\n // of the following:\n // - One or more input array values don't map to a hex octet (leading to\n // \"undefined\" in the uuid)\n // - Invalid input values for the RFC `version` or `variant` fields\n\n if (!validate(uuid)) {\n throw TypeError('Stringified UUID is invalid');\n }\n\n return uuid;\n}\n\nexport default stringify;","const randomUUID = typeof crypto !== 'undefined' && crypto.randomUUID && crypto.randomUUID.bind(crypto);\nexport default {\n randomUUID\n};","import native from './native.js';\nimport rng from './rng.js';\nimport { unsafeStringify } from './stringify.js';\n\nfunction v4(options, buf, offset) {\n if (native.randomUUID && !buf && !options) {\n return native.randomUUID();\n }\n\n options = options || {};\n const rnds = options.random || (options.rng || rng)(); // Per 4.4, set bits for version and `clock_seq_hi_and_reserved`\n\n rnds[6] = rnds[6] & 0x0f | 0x40;\n rnds[8] = rnds[8] & 0x3f | 0x80; // Copy bytes to buffer, if provided\n\n if (buf) {\n offset = offset || 0;\n\n for (let i = 0; i < 16; ++i) {\n buf[offset + i] = rnds[i];\n }\n\n return buf;\n }\n\n return unsafeStringify(rnds);\n}\n\nexport default v4;","import type {\n Feature,\n FeatureCollection,\n Geometry,\n Position,\n Polygon,\n MultiPolygon,\n GeoJsonProperties,\n} from \"geojson\";\n\nexport type BBox = [\n minLng: number,\n minLat: number,\n maxLng: number,\n maxLat: number,\n];\nexport type BoundsPair = [[number, number], [number, number]]; // [[south, west], [north, east]]\n\nexport function normalizeId(feature: Feature): string | undefined {\n const id = (feature as any).id ?? (feature.properties as any)?.id;\n if (id == null) return undefined;\n return String(id);\n}\n\n/**\n * Callback function for processing a single coordinate position\n */\nexport type CoordinateProcessor = (coord: Position) => void;\n\n/**\n * Iterate all coordinates of a Geometry and call the processor function for each Position.\n */\nexport function eachCoord(geom: Geometry, cb: CoordinateProcessor): void {\n const walk = (g: Geometry) => {\n switch (g.type) {\n case \"Point\":\n cb(g.coordinates);\n break;\n case \"MultiPoint\":\n case \"LineString\":\n for (const c of g.coordinates) cb(c);\n break;\n case \"MultiLineString\":\n case \"Polygon\":\n for (const ring of g.coordinates as Position[][]) {\n for (const c of ring) cb(c);\n }\n break;\n case \"MultiPolygon\":\n for (const poly of g.coordinates as Position[][][]) {\n for (const ring of poly) {\n for (const c of ring) cb(c);\n }\n }\n break;\n case \"GeometryCollection\":\n for (const child of g.geometries) walk(child);\n break;\n default:\n // Unsupported geometry type\n break;\n }\n };\n walk(geom);\n}\n\n/**\n * Compute bounding box [minLng, minLat, maxLng, maxLat] for a single feature.\n * Returns null when the feature has no geometry.\n */\nexport function bboxOfFeature(feature: Feature): BBox | null {\n const geom = feature.geometry;\n if (!geom) return null;\n\n let minLng = Infinity,\n minLat = Infinity,\n maxLng = -Infinity,\n maxLat = -Infinity;\n let seen = false;\n\n eachCoord(geom, (coord) => {\n // GeoJSON Position is [lng, lat, ...]\n const [lng, lat] = coord;\n if (typeof lng !== \"number\" || typeof lat !== \"number\") return;\n seen = true;\n if (lng < minLng) minLng = lng;\n if (lat < minLat) minLat = lat;\n if (lng > maxLng) maxLng = lng;\n if (lat > maxLat) maxLat = lat;\n });\n\n if (!seen) return null;\n return [minLng, minLat, maxLng, maxLat];\n}\n\n/**\n * Compute bounding box for a FeatureCollection. Returns null if no features have geometry.\n */\nexport function bboxOfFeatureCollection(fc: FeatureCollection): BBox | null {\n let minLng = Infinity,\n minLat = Infinity,\n maxLng = -Infinity,\n maxLat = -Infinity;\n let seen = false;\n\n for (const f of fc.features) {\n const b = bboxOfFeature(f);\n if (!b) continue;\n seen = true;\n minLng = Math.min(minLng, b[0]);\n minLat = Math.min(minLat, b[1]);\n maxLng = Math.max(maxLng, b[2]);\n maxLat = Math.max(maxLat, b[3]);\n }\n\n if (!seen) return null;\n return [minLng, minLat, maxLng, maxLat];\n}\n\n/**\n * Convert a bbox to [[south, west], [north, east]] tuple.\n */\nexport function bboxToBoundsPair(b: BBox): BoundsPair {\n const [minLng, minLat, maxLng, maxLat] = b;\n return [\n [minLat, minLng],\n [maxLat, maxLng],\n ];\n}\n\n/**\n * Expand Multi* geometries and GeometryCollections into multiple single-geometry Features.\n * - MultiPolygon → multiple Polygon features\n * - MultiLineString → multiple LineString features\n * - MultiPoint → multiple Point features\n * - GeometryCollection → one feature per child geometry\n * Other geometry types are returned unchanged.\n */\nexport function expandMultiGeometries(\n fc: FeatureCollection,\n): FeatureCollection {\n const out: Feature[] = [];\n for (const f of fc.features) {\n if (!f || f.type !== \"Feature\") continue;\n const baseProps = f.properties ?? {};\n const geom = f.geometry;\n if (!geom) continue; // skip null geometry\n switch (geom.type) {\n case \"MultiPolygon\":\n for (const poly of geom.coordinates) {\n out.push({\n type: \"Feature\",\n properties: { ...baseProps },\n geometry: { type: \"Polygon\", coordinates: poly },\n });\n }\n break;\n case \"MultiLineString\":\n for (const line of geom.coordinates) {\n out.push({\n type: \"Feature\",\n properties: { ...baseProps },\n geometry: { type: \"LineString\", coordinates: line },\n });\n }\n break;\n case \"MultiPoint\":\n for (const pt of geom.coordinates) {\n out.push({\n type: \"Feature\",\n properties: { ...baseProps },\n geometry: { type: \"Point\", coordinates: pt },\n });\n }\n break;\n case \"GeometryCollection\":\n for (const child of geom.geometries) {\n out.push({\n type: \"Feature\",\n properties: { ...baseProps },\n geometry: child,\n });\n }\n break;\n default:\n out.push(f);\n break;\n }\n }\n return { type: \"FeatureCollection\", features: out };\n}\n\n/**\n * Check if a geometry is a Polygon\n */\nexport function isPolygon(geometry: Geometry | null): geometry is Polygon {\n return geometry?.type === \"Polygon\";\n}\n\n/**\n * Check if a geometry is a MultiPolygon\n */\nexport function isMultiPolygon(\n geometry: Geometry | null,\n): geometry is MultiPolygon {\n return geometry?.type === \"MultiPolygon\";\n}\n\n/**\n * Extract polygon coordinates from a feature\n * Returns array of rings for each polygon (outer + inner rings)\n */\nexport function extractPolygonCoordinates(feature: Feature): Position[][][] {\n const geometry = feature.geometry;\n\n if (!geometry) return [];\n\n if (isPolygon(geometry)) {\n // Single polygon: return its rings as a one-element array\n return [geometry.coordinates];\n } else if (isMultiPolygon(geometry)) {\n // MultiPolygon: return all polygon rings\n return geometry.coordinates;\n }\n\n return []; // Not a polygon feature\n}\n\n/**\n * Merge multiple polygon features into a single polygon feature.\n * Attempts to create a topological union of the polygons, falling back to\n * a MultiPolygon if the union operation fails.\n *\n * @param features Array of features to merge (only polygon features will be used)\n * @param properties Properties for the resulting feature (defaults to first feature's properties)\n * @returns A new Feature with a unified Polygon or MultiPolygon, or null if no valid polygons found\n */\nexport function mergePolygons(\n features: Feature[],\n properties?: GeoJsonProperties,\n): Feature | null {\n // Extract all polygon coordinates\n const allPolygons: Position[][][] = [];\n\n for (const feature of features) {\n const coords = extractPolygonCoordinates(feature);\n if (coords.length > 0) {\n allPolygons.push(...coords);\n }\n }\n\n if (allPolygons.length === 0) return null;\n\n const baseProps = properties ?? features[0]?.properties ?? {};\n\n // If only one polygon, return it directly as a Polygon\n if (allPolygons.length === 1) {\n return {\n type: \"Feature\",\n properties: { ...baseProps },\n geometry: {\n type: \"Polygon\",\n coordinates: allPolygons[0],\n },\n };\n }\n\n // Otherwise, return a MultiPolygon\n return {\n type: \"Feature\",\n properties: { ...baseProps },\n geometry: {\n type: \"MultiPolygon\",\n coordinates: allPolygons,\n },\n };\n}\n\n/**\n * Merge polygons from a FeatureCollection into a single polygon feature.\n *\n * @param fc FeatureCollection containing polygons to merge\n * @param properties Properties for the resulting feature (defaults to first feature's properties)\n * @returns A Feature with a merged Polygon/MultiPolygon, or null if no polygon features found\n */\nexport function mergePolygonsFromCollection(\n fc: FeatureCollection,\n properties?: GeoJsonProperties,\n): Feature | null {\n if (!fc?.features?.length) return null;\n\n // Filter to only include polygon features\n const polygonFeatures = fc.features.filter((feature) => {\n const geom = feature.geometry;\n return geom && (isPolygon(geom) || isMultiPolygon(geom));\n });\n\n return mergePolygons(polygonFeatures, properties);\n}\n","import type { Feature, FeatureCollection } from \"geojson\";\nimport { v4 as uuidv4 } from \"uuid\";\nimport {\n bboxOfFeatureCollection,\n bboxToBoundsPair,\n type BoundsPair,\n normalizeId,\n} from \"@src/utils/geojson\";\nimport { createLogger, type Logger } from \"@src/utils/logger\";\n\n/**\n * FeatureStore\n * - Maintains a stable, id-centric in-memory FeatureCollection\n * - IDs are sourced from feature.id, feature.properties.id, or generated (uuid v4)\n * - Provides CRUD and export helpers\n *\n * Note: Leaflet layer bindings will be handled by the controller; this store is map-agnostic.\n */\nexport class FeatureStore {\n private log: Logger;\n private features: Map<string, Feature>;\n\n constructor(logger: Logger = createLogger(\"feature-store\", \"debug\")) {\n this.log = logger;\n this.features = new Map();\n }\n\n size(): number {\n return this.features.size;\n }\n\n has(id: string): boolean {\n return this.features.has(id);\n }\n\n get(id: string): Feature | undefined {\n return this.features.get(id);\n }\n\n /**\n * Add features to the store; returns the assigned/normalized ids in order.\n */\n add(fc: FeatureCollection): string[] {\n const ids: string[] = [];\n const t0 = performance.now?.() ?? Date.now();\n for (const f of fc.features) {\n const id = this.ensureId(f);\n // Store a shallow copy with id normalized on the Feature root for consistency\n const stored: Feature = { ...f, id };\n this.features.set(id, stored);\n ids.push(id);\n }\n const elapsed = (performance.now?.() ?? Date.now()) - t0;\n this.log.debug(\"add\", {\n count: fc.features.length,\n ids,\n elapsedMs: Math.round(elapsed),\n });\n return ids;\n }\n\n /**\n * Update a feature by id. If the feature does not exist, this is a no-op.\n * The provided feature will overwrite the stored one with the given id.\n */\n update(id: string, feature: Feature): void {\n if (!this.features.has(id)) {\n this.log.warn(\"update:missing\", { id });\n return;\n }\n const updated: Feature = { ...feature, id };\n this.features.set(id, updated);\n this.log.debug(\"update\", { id });\n }\n\n /**\n * Remove a feature by id. No-op if missing.\n */\n remove(id: string): void {\n if (this.features.delete(id)) {\n this.log.debug(\"remove\", { id });\n } else {\n this.log.warn(\"remove:missing\", { id });\n }\n }\n\n /**\n * Clear all features.\n */\n clear(): void {\n const count = this.features.size;\n this.features.clear();\n this.log.debug(\"clear\", { count });\n }\n\n /**\n * Export snapshot as FeatureCollection.\n */\n toFeatureCollection(): FeatureCollection {\n return {\n type: \"FeatureCollection\",\n features: Array.from(this.features.values()),\n };\n }\n\n /**\n * Compute bounds for current data as [[south, west], [north, east]] or null if empty.\n */\n bounds(): BoundsPair | null {\n const fc = this.toFeatureCollection();\n if (fc.features.length === 0) return null;\n const b = bboxOfFeatureCollection(fc);\n if (!b) return null;\n return bboxToBoundsPair(b);\n }\n\n /**\n * Ensure the feature has an id; returns the resolved id.\n */\n private ensureId(f: Feature): string {\n const existing = normalizeId(f);\n if (existing) return String(existing);\n const id = uuidv4();\n // Assign on both standard positions for compatibility\n (f as any).id = id;\n if (f.properties && typeof f.properties === \"object\") {\n (f.properties as any).id = id;\n }\n return id;\n }\n}\n","import * as L from \"leaflet\";\n\nconst patchedNamespaces = new WeakSet<object>();\n\nexport function registerLayerCakeTool(Lns: typeof L = L): void {\n if (patchedNamespaces.has(Lns as object)) return;\n const DrawToolbarCtor = (Lns as any).DrawToolbar;\n if (!DrawToolbarCtor?.prototype?.getModeHandlers) return;\n\n const originalGetModeHandlers = DrawToolbarCtor.prototype.getModeHandlers;\n\n DrawToolbarCtor.prototype.getModeHandlers = function (map: L.Map) {\n const modes = originalGetModeHandlers.call(this, map);\n\n if ((this as any).options?.cake) {\n const CakeCtor = (Lns as any).Draw?.Cake;\n if (!CakeCtor) return modes;\n modes.push({\n enabled: true,\n handler: new CakeCtor(map, (this as any).options.cake),\n title: \"Draw Layer Cake (Subtractive Zones)\",\n });\n }\n\n if ((this as any).options?.move) {\n const MoveCtor = (Lns as any).Draw?.Move;\n if (!MoveCtor) return modes;\n modes.push({\n enabled: true,\n handler: new MoveCtor(map, (this as any).options.move),\n title: \"Move/Translate Features\",\n });\n }\n\n return modes;\n };\n\n patchedNamespaces.add(Lns as object);\n}\n","import * as L from \"leaflet\";\n\nexport class DrawCake extends (L as any).Draw.Circle {\n public static TYPE = \"cake\";\n\n constructor(map: L.Map, options?: L.DrawOptions.CircleOptions) {\n super(map, options);\n this.type = DrawCake.TYPE;\n }\n\n addHooks(): void {\n super.addHooks();\n const tooltip = (this as any)._tooltip;\n if (tooltip?.updateContent) {\n tooltip.updateContent({\n text: \"Click and drag to draw the Layer Cake base\",\n subtext: \"Release mouse to finish base layer\",\n });\n }\n }\n}\n\n(L as any).Draw.Cake = DrawCake;\n\nexport function ensureDrawCakeRegistered(Lns: typeof L): void {\n const DrawNs = (Lns as any).Draw;\n if (!DrawNs) return;\n if (DrawNs.Cake) return;\n\n class RuntimeDrawCake extends DrawNs.Circle {\n public static TYPE = \"cake\";\n\n constructor(map: L.Map, options?: L.DrawOptions.CircleOptions) {\n super(map, options);\n this.type = RuntimeDrawCake.TYPE;\n }\n\n addHooks(): void {\n super.addHooks();\n const tooltip = (this as any)._tooltip;\n if (tooltip?.updateContent) {\n tooltip.updateContent({\n text: \"Click and drag to draw the Layer Cake base\",\n subtext: \"Release mouse to finish base layer\",\n });\n }\n }\n }\n\n DrawNs.Cake = RuntimeDrawCake;\n}\n","import * as L from \"leaflet\";\n\n/**\n * DrawMove: A custom Leaflet.draw handler that enables moving/translating existing features.\n * This handler activates a \"move mode\" where users can click and drag features to new positions.\n */\nexport class DrawMove extends (L as any).Draw.Feature {\n public static TYPE = \"move\";\n\n private _featureGroup: L.FeatureGroup;\n private _selectedLayer: L.Layer | null = null;\n private _originalLatLngs: any = null;\n private _dragStartLatLng: L.LatLng | null = null;\n private _isDragging = false;\n private _pendingMove: {\n layer: L.Layer;\n originalGeoJSON: GeoJSON.Feature;\n newGeoJSON: GeoJSON.Feature;\n } | null = null;\n\n constructor(map: L.Map, options?: { featureGroup: L.FeatureGroup } & any) {\n super(map, options);\n this.type = DrawMove.TYPE;\n this._featureGroup = options?.featureGroup || new L.FeatureGroup();\n }\n\n enable(): void {\n if (this._enabled) return;\n super.enable();\n }\n\n disable(): void {\n if (!this._enabled) return;\n this._cleanupDragging();\n super.disable();\n }\n\n addHooks(): void {\n const map = this._map;\n if (!map) return;\n\n // Set cursor style for the map container\n L.DomUtil.addClass(map.getContainer(), \"leaflet-draw-move-mode\");\n\n // Add mouseover/mouseout handlers for all layers in featureGroup\n this._featureGroup.eachLayer((layer: L.Layer) => {\n this._enableLayerHover(layer);\n });\n\n // Update tooltip\n const tooltip = (this as any)._tooltip;\n if (tooltip?.updateContent) {\n tooltip.updateContent({\n text: \"Click and drag a feature to move it\",\n subtext: \"\",\n });\n }\n }\n\n removeHooks(): void {\n const map = this._map;\n if (!map) return;\n\n // Remove cursor style\n L.DomUtil.removeClass(map.getContainer(), \"leaflet-draw-move-mode\");\n\n // Remove hover handlers\n this._featureGroup.eachLayer((layer: L.Layer) => {\n this._disableLayerHover(layer);\n });\n\n this._cleanupDragging();\n }\n\n private _enableLayerHover(layer: L.Layer): void {\n if (!(layer as any).on) return;\n\n (layer as any).on(\"mouseover\", this._onLayerMouseOver, this);\n (layer as any).on(\"mouseout\", this._onLayerMouseOut, this);\n (layer as any).on(\"mousedown\", this._onLayerMouseDown, this);\n }\n\n private _disableLayerHover(layer: L.Layer): void {\n if (!(layer as any).off) return;\n\n (layer as any).off(\"mouseover\", this._onLayerMouseOver, this);\n (layer as any).off(\"mouseout\", this._onLayerMouseOut, this);\n (layer as any).off(\"mousedown\", this._onLayerMouseDown, this);\n }\n\n private _onLayerMouseOver(e: L.LeafletMouseEvent): void {\n if (this._isDragging) return;\n const layer = e.target;\n\n // Change cursor to grab\n if ((layer as any).getElement) {\n const element = (layer as any).getElement();\n if (element) {\n element.style.cursor = \"grab\";\n }\n } else if ((layer as any)._path) {\n (layer as any)._path.style.cursor = \"grab\";\n }\n }\n\n private _onLayerMouseOut(e: L.LeafletMouseEvent): void {\n if (this._isDragging) return;\n const layer = e.target;\n\n // Reset cursor\n if ((layer as any).getElement) {\n const element = (layer as any).getElement();\n if (element) {\n element.style.cursor = \"\";\n }\n } else if ((layer as any)._path) {\n (layer as any)._path.style.cursor = \"\";\n }\n }\n\n private _onLayerMouseDown(e: L.LeafletMouseEvent): void {\n if (this._isDragging) return;\n\n L.DomEvent.stopPropagation(e.originalEvent);\n L.DomEvent.preventDefault(e.originalEvent);\n\n const selectedLayer = e.target;\n this._selectedLayer = selectedLayer;\n this._isDragging = true;\n this._dragStartLatLng = e.latlng;\n\n // Store original position\n this._storeOriginalLatLngs(selectedLayer);\n\n // Change cursor to grabbing\n if ((selectedLayer as any).getElement) {\n const element = (selectedLayer as any).getElement();\n if (element) {\n element.style.cursor = \"grabbing\";\n }\n } else if ((selectedLayer as any)._path) {\n (selectedLayer as any)._path.style.cursor = \"grabbing\";\n }\n\n // Attach move and up handlers\n this._map.on(\"mousemove\", this._onMouseMove, this);\n this._map.on(\"mouseup\", this._onMouseUp, this);\n\n // Store original GeoJSON for potential cancel\n const originalGeoJSON = (selectedLayer as any).toGeoJSON();\n this._pendingMove = {\n layer: selectedLayer,\n originalGeoJSON,\n newGeoJSON: originalGeoJSON, // Will be updated on mouseup\n };\n }\n\n private _storeOriginalLatLngs(layer: L.Layer): void {\n if ((layer as any).getLatLng) {\n // Marker or Circle\n this._originalLatLngs = (layer as any).getLatLng();\n } else if ((layer as any).getLatLngs) {\n // Polygon, Polyline, etc.\n this._originalLatLngs = JSON.parse(\n JSON.stringify((layer as any).getLatLngs()),\n );\n }\n }\n\n private _onMouseMove(e: L.LeafletMouseEvent): void {\n if (!this._isDragging || !this._selectedLayer || !this._dragStartLatLng)\n return;\n\n const layer = this._selectedLayer;\n const offset = {\n lat: e.latlng.lat - this._dragStartLatLng.lat,\n lng: e.latlng.lng - this._dragStartLatLng.lng,\n };\n\n // Apply offset to move the layer\n if ((layer as any).setLatLng) {\n // Marker or Circle\n const newLatLng = L.latLng(\n this._originalLatLngs.lat + offset.lat,\n this._originalLatLngs.lng + offset.lng,\n );\n (layer as any).setLatLng(newLatLng);\n } else if ((layer as any).setLatLngs) {\n // Polygon, Polyline, etc.\n const newLatLngs = this._offsetLatLngs(this._originalLatLngs, offset);\n (layer as any).setLatLngs(newLatLngs);\n }\n }\n\n private _offsetLatLngs(\n latLngs: any,\n offset: { lat: number; lng: number },\n ): any {\n if (\n latLngs instanceof L.LatLng ||\n (latLngs.lat !== undefined && latLngs.lng !== undefined)\n ) {\n return L.latLng(latLngs.lat + offset.lat, latLngs.lng + offset.lng);\n }\n if (Array.isArray(latLngs)) {\n return latLngs.map((ll: any) => this._offsetLatLngs(ll, offset));\n }\n return latLngs;\n }\n\n private _onMouseUp(e: L.LeafletMouseEvent): void {\n if (!this._isDragging || !this._selectedLayer) return;\n\n // Update pending move with new GeoJSON\n if (this._pendingMove) {\n this._pendingMove.newGeoJSON = (this._selectedLayer as any).toGeoJSON();\n }\n\n // Reset cursor\n const layer = this._selectedLayer;\n if ((layer as any).getElement) {\n const element = (layer as any).getElement();\n if (element) {\n element.style.cursor = \"grab\";\n }\n } else if ((layer as any)._path) {\n (layer as any)._path.style.cursor = \"grab\";\n }\n\n // Fire moveend event with pending move data\n this._map.fire(\"draw:moveend\", {\n layer: this._selectedLayer,\n originalGeoJSON: this._pendingMove?.originalGeoJSON,\n newGeoJSON: this._pendingMove?.newGeoJSON,\n });\n\n // Cleanup\n this._map.off(\"mousemove\", this._onMouseMove, this);\n this._map.off(\"mouseup\", this._onMouseUp, this);\n\n this._isDragging = false;\n // Keep _pendingMove and _selectedLayer for Save/Cancel UI\n }\n\n private _cleanupDragging(): void {\n if (this._selectedLayer) {\n // Reset cursor\n const layer = this._selectedLayer;\n if ((layer as any).getElement) {\n const element = (layer as any).getElement();\n if (element) {\n element.style.cursor = \"\";\n }\n } else if ((layer as any)._path) {\n (layer as any)._path.style.cursor = \"\";\n }\n }\n\n this._map.off(\"mousemove\", this._onMouseMove, this);\n this._map.off(\"mouseup\", this._onMouseUp, this);\n\n this._selectedLayer = null;\n this._originalLatLngs = null;\n this._dragStartLatLng = null;\n this._isDragging = false;\n this._pendingMove = null;\n }\n\n /**\n * Confirm the pending move and dispatch the final event.\n */\n public confirmMove(): void {\n if (!this._pendingMove) return;\n\n this._map.fire(\"draw:moveconfirmed\", {\n layer: this._pendingMove.layer,\n originalGeoJSON: this._pendingMove.originalGeoJSON,\n newGeoJSON: this._pendingMove.newGeoJSON,\n });\n\n this._cleanupDragging();\n }\n\n /**\n * Cancel the pending move and revert the layer to its original position.\n */\n public cancelMove(): void {\n if (!this._pendingMove) return;\n\n const layer = this._pendingMove.layer;\n\n // Revert to original position\n if ((layer as any).setLatLng && this._originalLatLngs) {\n (layer as any).setLatLng(this._originalLatLngs);\n } else if ((layer as any).setLatLngs && this._originalLatLngs) {\n (layer as any).setLatLngs(this._originalLatLngs);\n }\n\n this._cleanupDragging();\n }\n\n /**\n * Check if there's a pending move awaiting confirmation.\n */\n public hasPendingMove(): boolean {\n return this._pendingMove !== null;\n }\n}\n\n// Register with bundled Leaflet\n(L as any).Draw.Move = DrawMove;\n\n/**\n * Ensure DrawMove is registered with a given Leaflet namespace.\n */\nexport function ensureDrawMoveRegistered(Lns: typeof L): void {\n const DrawNs = (Lns as any).Draw;\n if (!DrawNs) return;\n if (DrawNs.Move) return;\n\n class RuntimeDrawMove extends DrawNs.Feature {\n public static TYPE = \"move\";\n private _featureGroup: L.FeatureGroup;\n private _selectedLayer: L.Layer | null = null;\n private _originalLatLngs: any = null;\n private _dragStartLatLng: L.LatLng | null = null;\n private _isDragging = false;\n private _pendingMove: {\n layer: L.Layer;\n originalGeoJSON: GeoJSON.Feature;\n newGeoJSON: GeoJSON.Feature;\n } | null = null;\n\n constructor(map: L.Map, options?: { featureGroup: L.FeatureGroup } & any) {\n super(map, options);\n this.type = RuntimeDrawMove.TYPE;\n this._featureGroup = options?.featureGroup || new L.FeatureGroup();\n }\n\n enable(): void {\n if ((this as any)._enabled) return;\n super.enable();\n }\n\n disable(): void {\n if (!(this as any)._enabled) return;\n this._cleanupDragging();\n super.disable();\n }\n\n addHooks(): void {\n const map = (this as any)._map;\n if (!map) return;\n\n Lns.DomUtil.addClass(map.getContainer(), \"leaflet-draw-move-mode\");\n\n this._featureGroup.eachLayer((layer: L.Layer) => {\n this._enableLayerHover(layer);\n });\n\n const tooltip = (this as any)._tooltip;\n if (tooltip?.updateContent) {\n tooltip.updateContent({\n text: \"Click and drag a feature to move it\",\n subtext: \"\",\n });\n }\n }\n\n removeHooks(): void {\n const map = (this as any)._map;\n if (!map) return;\n\n Lns.DomUtil.removeClass(map.getContainer(), \"leaflet-draw-move-mode\");\n\n this._featureGroup.eachLayer((layer: L.Layer) => {\n this._disableLayerHover(layer);\n });\n\n this._cleanupDragging();\n }\n\n private _enableLayerHover(layer: L.Layer): void {\n if (!(layer as any).on) return;\n (layer as any).on(\"mouseover\", this._onLayerMouseOver, this);\n (layer as any).on(\"mouseout\", this._onLayerMouseOut, this);\n (layer as any).on(\"mousedown\", this._onLayerMouseDown, this);\n }\n\n private _disableLayerHover(layer: L.Layer): void {\n if (!(layer as any).off) return;\n (layer as any).off(\"mouseover\", this._onLayerMouseOver, this);\n (layer as any).off(\"mouseout\", this._onLayerMouseOut, this);\n (layer as any).off(\"mousedown\", this._onLayerMouseDown, this);\n }\n\n private _onLayerMouseOver(e: L.LeafletMouseEvent): void {\n if (this._isDragging) return;\n const layer = e.target;\n if ((layer as any).getElement) {\n const element = (layer as any).getElement();\n if (element) element.style.cursor = \"grab\";\n } else if ((layer as any)._path) {\n (layer as any)._path.style.cursor = \"grab\";\n }\n }\n\n private _onLayerMouseOut(e: L.LeafletMouseEvent): void {\n if (this._isDragging) return;\n const layer = e.target;\n if ((layer as any).getElement) {\n const element = (layer as any).getElement();\n if (element) element.style.cursor = \"\";\n } else if ((layer as any)._path) {\n (layer as any)._path.style.cursor = \"\";\n }\n }\n\n private _onLayerMouseDown(e: L.LeafletMouseEvent): void {\n if (this._isDragging) return;\n Lns.DomEvent.stopPropagation(e.originalEvent);\n Lns.DomEvent.preventDefault(e.originalEvent);\n\n const selectedLayer = e.target;\n this._selectedLayer = selectedLayer;\n this._isDragging = true;\n this._dragStartLatLng = e.latlng;\n this._storeOriginalLatLngs(selectedLayer);\n\n if ((selectedLayer as any).getElement) {\n const element = (selectedLayer as any).getElement();\n if (element) element.style.cursor = \"grabbing\";\n } else if ((selectedLayer as any)._path) {\n (selectedLayer as any)._path.style.cursor = \"grabbing\";\n }\n\n (this as any)._map.on(\"mousemove\", this._onMouseMove, this);\n (this as any)._map.on(\"mouseup\", this._onMouseUp, this);\n\n const originalGeoJSON = (selectedLayer as any).toGeoJSON();\n this._pendingMove = {\n layer: selectedLayer,\n originalGeoJSON,\n newGeoJSON: originalGeoJSON,\n };\n }\n\n private _storeOriginalLatLngs(layer: L.Layer): void {\n if ((layer as any).getLatLng) {\n this._originalLatLngs = (layer as any).getLatLng();\n } else if ((layer as any).getLatLngs) {\n this._originalLatLngs = JSON.parse(\n JSON.stringify((layer as any).getLatLngs()),\n );\n }\n }\n\n private _onMouseMove(e: L.LeafletMouseEvent): void {\n if (!this._isDragging || !this._selectedLayer || !this._dragStartLatLng)\n return;\n\n const layer = this._selectedLayer;\n const offset = {\n lat: e.latlng.lat - this._dragStartLatLng.lat,\n lng: e.latlng.lng - this._dragStartLatLng.lng,\n };\n\n if ((layer as any).setLatLng) {\n const newLatLng = Lns.latLng(\n this._originalLatLngs.lat + offset.lat,\n this._originalLatLngs.lng + offset.lng,\n );\n (layer as any).setLatLng(newLatLng);\n } else if ((layer as any).setLatLngs) {\n const newLatLngs = this._offsetLatLngs(this._originalLatLngs, offset);\n (layer as any).setLatLngs(newLatLngs);\n }\n }\n\n private _offsetLatLngs(\n latLngs: any,\n offset: { lat: number; lng: number },\n ): any {\n if (\n latLngs instanceof Lns.LatLng ||\n (latLngs.lat !== undefined && latLngs.lng !== undefined)\n ) {\n return Lns.latLng(latLngs.lat + offset.lat, latLngs.lng + offset.lng);\n }\n if (Array.isArray(latLngs)) {\n return latLngs.map((ll: any) => this._offsetLatLngs(ll, offset));\n }\n return latLngs;\n }\n\n private _onMouseUp(e: L.LeafletMouseEvent): void {\n if (!this._isDragging || !this._selectedLayer) return;\n\n if (this._pendingMove) {\n this._pendingMove.newGeoJSON = (this._selectedLayer as any).toGeoJSON();\n }\n\n const layer = this._selectedLayer;\n if ((layer as any).getElement) {\n const element = (layer as any).getElement();\n if (element) element.style.cursor = \"grab\";\n } else if ((layer as any)._path) {\n (layer as any)._path.style.cursor = \"grab\";\n }\n\n (this as any)._map.fire(\"draw:moveend\", {\n layer: this._selectedLayer,\n originalGeoJSON: this._pendingMove?.originalGeoJSON,\n newGeoJSON: this._pendingMove?.newGeoJSON,\n });\n\n (this as any)._map.off(\"mousemove\", this._onMouseMove, this);\n (this as any)._map.off(\"mouseup\", this._onMouseUp, this);\n\n this._isDragging = false;\n }\n\n private _cleanupDragging(): void {\n if (this._selectedLayer) {\n const layer = this._selectedLayer;\n if ((layer as any).getElement) {\n const element = (layer as any).getElement();\n if (element) element.style.cursor = \"\";\n } else if ((layer as any)._path) {\n (layer as any)._path.style.cursor = \"\";\n }\n }\n\n (this as any)._map.off(\"mousemove\", this._onMouseMove, this);\n (this as any)._map.off(\"mouseup\", this._onMouseUp, this);\n\n this._selectedLayer = null;\n this._originalLatLngs = null;\n this._dragStartLatLng = null;\n this._isDragging = false;\n this._pendingMove = null;\n }\n\n public confirmMove(): void {\n if (!this._pendingMove) return;\n\n (this as any)._map.fire(\"draw:moveconfirmed\", {\n layer: this._pendingMove.layer,\n originalGeoJSON: this._pendingMove.originalGeoJSON,\n newGeoJSON: this._pendingMove.newGeoJSON,\n });\n\n this._cleanupDragging();\n }\n\n public cancelMove(): void {\n if (!this._pendingMove) return;\n\n const layer = this._pendingMove.layer;\n\n if ((layer as any).setLatLng && this._originalLatLngs) {\n (layer as any).setLatLng(this._originalLatLngs);\n } else if ((layer as any).setLatLngs && this._originalLatLngs) {\n (layer as any).setLatLngs(this._originalLatLngs);\n }\n\n this._cleanupDragging();\n }\n\n public hasPendingMove(): boolean {\n return this._pendingMove !== null;\n }\n }\n\n DrawNs.Move = RuntimeDrawMove;\n}\n","import { v4 as uuidv4 } from \"uuid\";\n\nexport interface CircleLike {\n getLatLng(): { lat: number; lng: number };\n getRadius(): number; // meters\n}\n\nexport interface CakeLayerOptions {\n circles: CircleLike[];\n steps?: number;\n}\n\ntype Position = [number, number]; // [lng, lat]\n\nconst EARTH_RADIUS_METERS = 6_371_008.8;\n\nfunction toRadians(deg: number): number {\n return (deg * Math.PI) / 180;\n}\n\nfunction toDegrees(rad: number): number {\n return (rad * 180) / Math.PI;\n}\n\nfunction destinationPoint(\n center: { lat: number; lng: number },\n distanceMeters: number,\n bearingDegrees: number,\n): { lat: number; lng: number } {\n const angularDistance = distanceMeters / EARTH_RADIUS_METERS;\n const bearing = toRadians(bearingDegrees);\n const lat1 = toRadians(center.lat);\n const lon1 = toRadians(center.lng);\n\n const sinLat1 = Math.sin(lat1);\n const cosLat1 = Math.cos(lat1);\n const sinAngular = Math.sin(angularDistance);\n const cosAngular = Math.cos(angularDistance);\n\n const sinLat2 =\n sinLat1 * cosAngular + cosLat1 * sinAngular * Math.cos(bearing);\n const lat2 = Math.asin(sinLat2);\n\n const y = Math.sin(bearing) * sinAngular * cosLat1;\n const x = cosAngular - sinLat1 * sinLat2;\n const lon2 = lon1 + Math.atan2(y, x);\n\n return { lat: toDegrees(lat2), lng: toDegrees(lon2) };\n}\n\nfunction signedRingArea(coords: Position[]): number {\n let sum = 0;\n for (let i = 0; i < coords.length - 1; i++) {\n const [x1, y1] = coords[i];\n const [x2, y2] = coords[i + 1];\n sum += x1 * y2 - x2 * y1;\n }\n return sum / 2;\n}\n\nfunction ensureClosedRing(coords: Position[]): Position[] {\n const first = coords[0];\n const last = coords.at(-1);\n if (!first || !last) return coords;\n if (first[0] === last[0] && first[1] === last[1]) return coords;\n return [...coords, first];\n}\n\nfunction ensureWinding(coords: Position[], clockwise: boolean): Position[] {\n const closed = ensureClosedRing(coords);\n const area = signedRingArea(closed);\n const isClockwise = area < 0;\n if (isClockwise === clockwise) return closed;\n const reversed = [...closed].reverse();\n return ensureClosedRing(reversed);\n}\n\nfunction circleToRing(\n center: { lat: number; lng: number },\n radiusMeters: number,\n steps: number,\n): Position[] {\n if (steps < 4) throw new Error(\"steps must be >= 4\");\n const pts: Position[] = [];\n for (let i = 0; i < steps; i++) {\n const bearing = (i / steps) * 360;\n const p = destinationPoint(center, radiusMeters, bearing);\n pts.push([p.lng, p.lat]);\n }\n return ensureClosedRing(pts);\n}\n\nfunction bakeCoreFeature(args: {\n id: string;\n center: { lat: number; lng: number };\n radiusMeters: number;\n layerIndex: number;\n steps: number;\n}): GeoJSON.Feature {\n const { id, center, radiusMeters, layerIndex, steps } = args;\n const outer = ensureWinding(circleToRing(center, radiusMeters, steps), false);\n\n return {\n type: \"Feature\",\n properties: {\n id,\n layer_index: layerIndex,\n radius_outer: radiusMeters,\n type: \"core\",\n _meta: {\n lat: center.lat,\n lng: center.lng,\n radius: radiusMeters,\n },\n },\n geometry: { type: \"Polygon\", coordinates: [outer] },\n };\n}\n\nfunction bakeRingFeature(args: {\n id: string;\n center: { lat: number; lng: number };\n radiusOuterMeters: number;\n radiusInnerMeters: number;\n layerIndex: number;\n steps: number;\n}): GeoJSON.Feature {\n const {\n id,\n center,\n radiusOuterMeters,\n radiusInnerMeters,\n layerIndex,\n steps,\n } = args;\n const outer = ensureWinding(\n circleToRing(center, radiusOuterMeters, steps),\n false,\n );\n const inner = ensureWinding(\n circleToRing(center, radiusInnerMeters, steps),\n true,\n );\n\n return {\n type: \"Feature\",\n properties: {\n id,\n layer_index: layerIndex,\n radius_outer: radiusOuterMeters,\n type: \"ring\",\n _meta: {\n lat: center.lat,\n lng: center.lng,\n radius: radiusOuterMeters,\n },\n },\n geometry: { type: \"Polygon\", coordinates: [outer, inner] },\n };\n}\n\nexport function bakeLayerCake(\n options: CakeLayerOptions,\n): GeoJSON.FeatureCollection {\n const { circles, steps = 64 } = options;\n\n const sorted = [...circles].sort((a, b) => a.getRadius() - b.getRadius());\n const features: GeoJSON.Feature[] = [];\n\n sorted.forEach((circle, index) => {\n const center = circle.getLatLng();\n const radiusMeters = circle.getRadius();\n const id = uuidv4();\n\n if (index === 0) {\n features.push(\n bakeCoreFeature({ id, center, radiusMeters, layerIndex: index, steps }),\n );\n return;\n }\n\n const prev = sorted[index - 1];\n const prevRadiusMeters = prev.getRadius();\n\n features.push(\n bakeRingFeature({\n id,\n center,\n radiusOuterMeters: radiusMeters,\n radiusInnerMeters: prevRadiusMeters,\n layerIndex: index,\n steps,\n }),\n );\n });\n\n return { type: \"FeatureCollection\", features };\n}\n","export interface BindCakeControlsOptions {\n root: ParentNode;\n addButtonId: string;\n saveButtonId: string;\n onAddRing: () => void;\n onSave: () => void;\n}\n\nfunction stopEvent(e: Event): void {\n e.preventDefault();\n e.stopPropagation();\n}\n\nexport function bindCakeControls(options: BindCakeControlsOptions): void {\n const { root, addButtonId, saveButtonId, onAddRing, onSave } = options;\n\n const addBtn = root.querySelector?.(`#${addButtonId}`);\n const saveBtn = root.querySelector?.(`#${saveButtonId}`);\n if (!addBtn || !saveBtn) return;\n\n // renderControls() may run frequently (edit events, addRing, etc.). Prevent\n // accidental multi-binding which would cause one click to create multiple rings.\n const boundKey = \"data-cake-controls-bound\";\n if (\n (addBtn as HTMLElement).hasAttribute(boundKey) ||\n (saveBtn as HTMLElement).hasAttribute(boundKey)\n ) {\n return;\n }\n (addBtn as HTMLElement).setAttribute(boundKey, \"true\");\n (saveBtn as HTMLElement).setAttribute(boundKey, \"true\");\n\n // Prevent Leaflet from treating button interaction as map/circle interaction.\n for (const el of [addBtn, saveBtn]) {\n el.addEventListener(\"pointerdown\", stopEvent);\n el.addEventListener(\"mousedown\", stopEvent);\n el.addEventListener(\"touchstart\", stopEvent);\n }\n\n addBtn.addEventListener(\"click\", (e) => {\n stopEvent(e);\n onAddRing();\n });\n\n saveBtn.addEventListener(\"click\", (e) => {\n stopEvent(e);\n onSave();\n });\n}\n","import type * as L from \"leaflet\";\n\nexport function ensureCircleEditable(circle: L.Circle): void {\n const options: any = (circle as any).options ?? {};\n\n // Leaflet.draw editing expects both `options.original` and `options.editing` to exist.\n // When we create circles programmatically (L.circle), these may be missing which can\n // cause editing.enable() to fail or create detached/incorrect markers.\n if (!options.original) {\n options.original = { ...options };\n }\n if (!options.editing) {\n options.editing = { ...options };\n }\n}\n","import * as L from \"leaflet\";\nimport { v4 as uuidv4 } from \"uuid\";\nimport { bakeLayerCake } from \"@src/lib/layer-cake/CakeBaker\";\nimport { bindCakeControls } from \"@src/lib/layer-cake/bindCakeControls\";\nimport { ensureCircleEditable } from \"@src/lib/layer-cake/ensureCircleEditable\";\nimport type { MeasurementSystem } from \"@src/types/public\";\n\n/**\n * Format distance in meters to a friendly string based on measurement system.\n * Metric: meters (m) or kilometers (km)\n * Imperial: feet (ft) or miles (mi)\n */\nfunction formatDistance(meters: number, system: MeasurementSystem): string {\n if (system === \"imperial\") {\n const feet = meters * 3.28084;\n if (feet >= 5280) {\n const miles = feet / 5280;\n return `${miles.toFixed(2)} mi`;\n }\n return `${Math.round(feet)} ft`;\n }\n\n // Metric (default)\n if (meters >= 1000) {\n return `${(meters / 1000).toFixed(2)} km`;\n }\n return `${Math.round(meters)} m`;\n}\n\nexport class LayerCakeManager {\n private map: L.Map;\n private layers: L.Circle[] = [];\n private controlsGroup: L.LayerGroup;\n private onSave: (geojson: GeoJSON.FeatureCollection) => void;\n private sessionId = uuidv4().slice(0, 8);\n private baseCircleOptions: L.CircleMarkerOptions;\n private detachMapListeners: (() => void)[] = [];\n private renderScheduled = false;\n private measurementSystem: MeasurementSystem;\n\n constructor(\n map: L.Map,\n initialCircle: L.Circle,\n onSave: (geojson: GeoJSON.FeatureCollection) => void,\n measurementSystem: MeasurementSystem = \"metric\",\n ) {\n this.map = map;\n this.onSave = onSave;\n this.measurementSystem = measurementSystem;\n this.controlsGroup = L.layerGroup().addTo(map);\n this.baseCircleOptions = { ...(initialCircle.options as any) };\n delete (this.baseCircleOptions as any).editing;\n delete (this.baseCircleOptions as any).original;\n\n this.addLayer(initialCircle);\n this.installEditEventBridges();\n this.renderControls();\n }\n\n private installEditEventBridges(): void {\n const anyL: any = L as any;\n const EDITMOVE = anyL?.Draw?.Event?.EDITMOVE;\n const EDITRESIZE = anyL?.Draw?.Event?.EDITRESIZE;\n const EDITSTART = anyL?.Draw?.Event?.EDITSTART;\n const EDITSTOP = anyL?.Draw?.Event?.EDITSTOP;\n if (!EDITMOVE || !EDITRESIZE) return;\n\n const onMove = (e: any) => {\n const layer = e?.layer as L.Layer | undefined;\n if (!layer) return;\n if (!this.layers.includes(layer as any)) return;\n this.syncCenters(layer as any);\n };\n\n const onResize = (e: any) => {\n const layer = e?.layer as L.Layer | undefined;\n if (!layer) return;\n if (!this.layers.includes(layer as any)) return;\n this.updateLabels(layer as any);\n this.requestRenderControls();\n };\n\n const onEditStart = (e: any) => {\n const layer = e?.layer as L.Layer | undefined;\n if (!layer) return;\n if (!this.layers.includes(layer as any)) return;\n // Make the tooltip follow the resize handle by updating its position\n const circle = layer as L.Circle;\n const tooltip = (circle as any).getTooltip?.();\n if (tooltip) {\n // Update immediately to show we're in edit mode\n this.updateLabels(circle);\n }\n };\n\n const onEditStop = () => {\n // Reset all labels to simple format (total radius only) and standard position\n this.layers.forEach((circle) => {\n const tooltip = (circle as any).getTooltip?.();\n if (tooltip) {\n circle.setTooltipContent(\n formatDistance(circle.getRadius(), this.measurementSystem),\n );\n // Reset tooltip to standard right-side position\n tooltip.options.offset = [10, 0];\n tooltip.options.direction = \"right\";\n circle.closeTooltip();\n circle.openTooltip();\n }\n });\n };\n\n this.map.on(EDITMOVE, onMove);\n this.map.on(EDITRESIZE, onResize);\n if (EDITSTART) {\n this.map.on(EDITSTART, onEditStart);\n this.detachMapListeners.push(() => this.map.off(EDITSTART, onEditStart));\n }\n if (EDITSTOP) {\n this.map.on(EDITSTOP, onEditStop);\n this.detachMapListeners.push(() => this.map.off(EDITSTOP, onEditStop));\n }\n this.detachMapListeners.push(() => this.map.off(EDITMOVE, onMove));\n this.detachMapListeners.push(() => this.map.off(EDITRESIZE, onResize));\n }\n\n private requestRenderControls(): void {\n if (this.renderScheduled) return;\n this.renderScheduled = true;\n\n const schedule =\n typeof requestAnimationFrame === \"function\"\n ? requestAnimationFrame\n : (cb: FrameRequestCallback) => setTimeout(() => cb(0), 0);\n\n schedule(() => {\n this.renderScheduled = false;\n this.renderControls();\n });\n }\n\n private addLayer(circle: L.Circle): void {\n this.layers.push(circle);\n circle.addTo(this.map);\n\n // Bind a permanent tooltip showing the total radius\n circle.bindTooltip(\n formatDistance(circle.getRadius(), this.measurementSystem),\n {\n permanent: true,\n direction: \"right\",\n className: \"cake-label\",\n offset: [10, 0],\n },\n );\n\n const editing: any = (circle as any).editing;\n // For programmatically-created circles, Leaflet.draw can compute resize handle points\n // from `_radius` (pixel radius). Ensure the circle has been projected/rendered first.\n // Deferring to the next tick stabilizes handle placement in Shadow DOM + Canvas paths.\n setTimeout(() => {\n try {\n circle.redraw?.();\n ensureCircleEditable(circle);\n if (editing?.enabled?.()) {\n editing.updateMarkers?.();\n this.requestRenderControls();\n return;\n }\n editing?.enable?.();\n editing?.updateMarkers?.();\n this.requestRenderControls();\n } catch {\n // Ignore editing setup failures; cake circles should still exist even without handles.\n }\n }, 0);\n }\n\n public addRing(): void {\n if (this.layers.length >= 10) return;\n const largest = this.getLargestCircle();\n if (!largest) return;\n\n const newRadius = largest.getRadius() * 1.5;\n const newCircle = L.circle(largest.getLatLng(), {\n ...(this.baseCircleOptions as any),\n radius: newRadius,\n });\n this.addLayer(newCircle);\n this.renderControls();\n }\n\n public save(): void {\n const geojson = bakeLayerCake({ circles: this.layers });\n this.onSave(geojson);\n this.destroy();\n }\n\n private getLargestCircle(): L.Circle | null {\n if (this.layers.length === 0) return null;\n return this.layers.reduce((prev, current) =>\n prev.getRadius() > current.getRadius() ? prev : current,\n );\n }\n\n private syncCenters(sourceCircle: L.Circle): void {\n const newCenter = sourceCircle.getLatLng();\n this.layers.forEach((layer) => {\n if (layer === sourceCircle) return;\n layer.setLatLng(newCenter);\n layer.redraw?.();\n (layer as any).editing?.updateMarkers?.();\n });\n this.requestRenderControls();\n }\n\n /**\n * Update the label for the active circle being resized.\n * Shows both total radius and delta (ring width) from the next smaller circle.\n * Positions the tooltip on the left side to avoid toolbar interference.\n */\n private updateLabels(activeCircle: L.Circle): void {\n const currentRadius = activeCircle.getRadius();\n let labelText = formatDistance(currentRadius, this.measurementSystem);\n\n // Find all circles smaller than this one\n const smallerCircles = this.layers.filter(\n (c) => c !== activeCircle && c.getRadius() < currentRadius,\n );\n\n if (smallerCircles.length > 0) {\n // Find the largest of the smaller circles (the immediate inner neighbor)\n const innerNeighbor = smallerCircles.reduce((prev, curr) =>\n prev.getRadius() > curr.getRadius() ? prev : curr,\n );\n\n const delta = currentRadius - innerNeighbor.getRadius();\n const deltaStr = formatDistance(delta, this.measurementSystem);\n // Show both total and delta during editing\n labelText = `${formatDistance(currentRadius, this.measurementSystem)} (+${deltaStr})`;\n }\n\n // Update the tooltip content and position\n const tooltip = (activeCircle as any).getTooltip?.();\n if (tooltip) {\n activeCircle.setTooltipContent(labelText);\n\n // Position tooltip on the LEFT (West) side to avoid toolbar at NorthEast\n const bounds = activeCircle.getBounds();\n const westPoint = bounds.getSouthWest();\n westPoint.lat = activeCircle.getLatLng().lat; // Center it vertically\n\n tooltip.options.direction = \"left\";\n tooltip.options.offset = [-10, 0];\n tooltip.setLatLng(westPoint);\n\n // Ensure tooltip is open and visible during editing\n activeCircle.closeTooltip();\n activeCircle.openTooltip();\n }\n }\n\n private renderControls(): void {\n this.controlsGroup.clearLayers();\n const largest = this.getLargestCircle();\n if (!largest) return;\n\n const bounds = largest.getBounds();\n const anchor = bounds.getNorthEast();\n\n const addId = `cake-add-${this.sessionId}`;\n const saveId = `cake-save-${this.sessionId}`;\n\n const uiIcon = L.divIcon({\n className: \"layer-cake-controls\",\n html: `\n <div class=\"layer-cake-controls__container\">\n <button id=\"${addId}\" type=\"button\">➕ Ring</button>\n <button id=\"${saveId}\" type=\"button\" class=\"layer-cake-controls__save\">💾 Save</button>\n </div>\n `,\n iconSize: [140, 40],\n iconAnchor: [-10, 20],\n });\n\n L.marker(anchor, {\n icon: uiIcon,\n interactive: true,\n keyboard: false,\n bubblingMouseEvents: false,\n }).addTo(this.controlsGroup);\n\n setTimeout(() => {\n // Important: the map likely lives in a ShadowRoot; document.getElementById won't find these.\n const root: ParentNode = this.map.getContainer();\n bindCakeControls({\n root,\n addButtonId: addId,\n saveButtonId: saveId,\n onAddRing: () => this.addRing(),\n onSave: () => this.save(),\n });\n }, 0);\n }\n\n public destroy(): void {\n this.detachMapListeners.forEach((fn) => {\n try {\n fn();\n } catch {\n // Ignore listener cleanup errors during teardown\n }\n });\n this.detachMapListeners = [];\n\n this.layers.forEach((l) => this.map.removeLayer(l));\n this.layers = [];\n this.controlsGroup.clearLayers();\n this.map.removeLayer(this.controlsGroup);\n }\n}\n","export default \"<?xml version=\\\"1.0\\\" encoding=\\\"utf-8\\\"?>\\n\\r<!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->\\n<svg width=\\\"800px\\\" height=\\\"800px\\\" viewBox=\\\"0 -1.67 47.336 47.336\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\">\\r\\n <g id=\\\"Group_42\\\" data-name=\\\"Group 42\\\" transform=\\\"translate(-172.455 -364.36)\\\">\\r\\n <path id=\\\"Rectangle_17\\\" data-name=\\\"Rectangle 17\\\" d=\\\"M4.351,0H40.984a4.351,4.351,0,0,1,4.351,4.351V22.117a1,1,0,0,1-1,1H1a1,1,0,0,1-1-1V4.351A4.351,4.351,0,0,1,4.351,0Z\\\" transform=\\\"translate(173.455 384.243)\\\" fill=\\\"none\\\" stroke=\\\"#000000\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"/>\\r\\n <path id=\\\"Path_90\\\" data-name=\\\"Path 90\\\" d=\\\"M218.79,390.249a3.778,3.778,0,0,1-3.778,3.778h0a3.779,3.779,0,0,1-3.778-3.778,3.778,3.778,0,0,1-3.778,3.778h0a3.779,3.779,0,0,1-3.778-3.778,3.778,3.778,0,0,1-3.778,3.778h0a3.779,3.779,0,0,1-3.778-3.778,3.778,3.778,0,0,1-3.778,3.778h0a3.779,3.779,0,0,1-3.778-3.778,3.778,3.778,0,0,1-3.778,3.778h0a3.779,3.779,0,0,1-3.778-3.778,3.778,3.778,0,0,1-3.778,3.778h0a3.778,3.778,0,0,1-3.777-3.778\\\" fill=\\\"none\\\" stroke=\\\"#000000\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"/>\\r\\n <g id=\\\"Group_41\\\" data-name=\\\"Group 41\\\">\\r\\n <path id=\\\"Rectangle_18\\\" data-name=\\\"Rectangle 18\\\" d=\\\"M4.351,0H26.473a4.351,4.351,0,0,1,4.351,4.351V17.883a1,1,0,0,1-1,1H1a1,1,0,0,1-1-1V4.351A4.351,4.351,0,0,1,4.351,0Z\\\" transform=\\\"translate(180.71 365.36)\\\" fill=\\\"none\\\" stroke=\\\"#000000\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"/>\\r\\n <path id=\\\"Path_91\\\" data-name=\\\"Path 91\\\" d=\\\"M211.234,370.794a3.778,3.778,0,0,1-3.778,3.778h0a3.779,3.779,0,0,1-3.778-3.778,3.778,3.778,0,0,1-3.778,3.778h0a3.779,3.779,0,0,1-3.778-3.778,3.778,3.778,0,0,1-3.778,3.778h0a3.779,3.779,0,0,1-3.778-3.778,3.778,3.778,0,0,1-3.778,3.778h0a3.779,3.779,0,0,1-3.778-3.778\\\" fill=\\\"none\\\" stroke=\\\"#000000\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"/>\\r\\n </g>\\r\\n </g>\\r\\n</svg>\"","export default \"<?xml version=\\\"1.0\\\" encoding=\\\"utf-8\\\"?>\\n<!-- Four-way directional arrow icon for move tool -->\\n<svg width=\\\"800px\\\" height=\\\"800px\\\" viewBox=\\\"0 0 24 24\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\">\\n <g fill=\\\"none\\\" stroke=\\\"#000000\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\">\\n <!-- Up arrow -->\\n <path d=\\\"M12 2 L12 22\\\"/>\\n <path d=\\\"M12 2 L9 5\\\"/>\\n <path d=\\\"M12 2 L15 5\\\"/>\\n <!-- Down arrow -->\\n <path d=\\\"M12 22 L9 19\\\"/>\\n <path d=\\\"M12 22 L15 19\\\"/>\\n <!-- Left arrow -->\\n <path d=\\\"M2 12 L22 12\\\"/>\\n <path d=\\\"M2 12 L5 9\\\"/>\\n <path d=\\\"M2 12 L5 15\\\"/>\\n <!-- Right arrow -->\\n <path d=\\\"M22 12 L19 9\\\"/>\\n <path d=\\\"M22 12 L19 15\\\"/>\\n </g>\\n</svg>\\n\"","const WGS84_A = 6378137.0;\nconst WGS84_B = 6356752.314245;\nconst WGS84_F = 1 / 298.257223563;\nconst DEG_TO_RAD = Math.PI / 180;\nconst RAD_TO_DEG = 180 / Math.PI;\n\nconst MAGIC_SCALE = 1_000_000_000;\n\nfunction toPrecise(value: number): number {\n const scaled = BigInt(Math.round(value * MAGIC_SCALE));\n return Number(scaled) / MAGIC_SCALE;\n}\n\nfunction toRadians(value: number): number {\n return toPrecise(value) * DEG_TO_RAD;\n}\n\nfunction normalizeBearing(rad: number): number {\n const deg = (rad * RAD_TO_DEG) % 360;\n return deg < 0 ? deg + 360 : deg;\n}\n\nexport function magicRound(value: number): number {\n const scaled = BigInt(Math.round(value * MAGIC_SCALE));\n return Number(scaled) / MAGIC_SCALE;\n}\n\ninterface VincentyResult {\n distanceMeters: number;\n bearingRad: number;\n iterations: number;\n converged: boolean;\n}\n\ninterface KarneyResult {\n distanceMeters: number;\n bearingRad: number;\n}\n\nexport interface PreciseDistanceResult {\n meters: number;\n bearingDegrees: number;\n algorithm: \"vincenty\" | \"karney\";\n iterations: number;\n}\n\nexport function computePreciseDistance(\n lat1: number,\n lon1: number,\n lat2: number,\n lon2: number,\n): PreciseDistanceResult {\n const vincenty = vincentyDistance(lat1, lon1, lat2, lon2);\n if (vincenty.converged) {\n return {\n meters: magicRound(vincenty.distanceMeters),\n bearingDegrees: normalizeBearing(vincenty.bearingRad),\n algorithm: \"vincenty\",\n iterations: vincenty.iterations,\n };\n }\n\n const karney = karneyDistance(lat1, lon1, lat2, lon2);\n return {\n meters: magicRound(karney.distanceMeters),\n bearingDegrees: normalizeBearing(karney.bearingRad),\n algorithm: \"karney\",\n iterations: vincenty.iterations,\n };\n}\n\nfunction vincentyDistance(\n lat1: number,\n lon1: number,\n lat2: number,\n lon2: number,\n): VincentyResult {\n const phi1 = toRadians(lat1);\n const phi2 = toRadians(lat2);\n const L = toRadians(lon2 - lon1);\n\n const U1 = Math.atan((1 - WGS84_F) * Math.tan(phi1));\n const U2 = Math.atan((1 - WGS84_F) * Math.tan(phi2));\n const sinU1 = Math.sin(U1);\n const cosU1 = Math.cos(U1);\n const sinU2 = Math.sin(U2);\n const cosU2 = Math.cos(U2);\n\n let lambda = L;\n let lambdaPrev = 0;\n let iterations = 0;\n const MAX = 200;\n let sinSigma = 0;\n let cosSigma = 0;\n let sigma = 0;\n let cosSqAlpha = 0;\n let cos2SigmaM = 0;\n\n while (Math.abs(lambda - lambdaPrev) > 1e-12 && iterations < MAX) {\n const sinLambda = Math.sin(lambda);\n const cosLambda = Math.cos(lambda);\n\n sinSigma = Math.sqrt(\n (cosU2 * sinLambda) ** 2 +\n (cosU1 * sinU2 - sinU1 * cosU2 * cosLambda) ** 2,\n );\n\n if (sinSigma === 0) {\n return {\n distanceMeters: 0,\n bearingRad: 0,\n iterations,\n converged: true,\n };\n }\n\n cosSigma = sinU1 * sinU2 + cosU1 * cosU2 * cosLambda;\n sigma = Math.atan2(sinSigma, cosSigma);\n\n const sinAlpha = (cosU1 * cosU2 * sinLambda) / sinSigma;\n cosSqAlpha = 1 - sinAlpha ** 2;\n\n cos2SigmaM =\n cosSqAlpha === 0 ? 0 : cosSigma - (2 * sinU1 * sinU2) / cosSqAlpha;\n\n const C =\n (WGS84_F / 16) * cosSqAlpha * (4 + WGS84_F * (4 - 3 * cosSqAlpha));\n\n lambdaPrev = lambda;\n lambda =\n L +\n (1 - C) *\n WGS84_F *\n sinAlpha *\n (sigma +\n C *\n sinSigma *\n (cos2SigmaM + C * cosSigma * (-1 + 2 * cos2SigmaM ** 2)));\n\n iterations += 1;\n }\n\n if (iterations >= MAX) {\n return {\n distanceMeters: Number.NaN,\n bearingRad: 0,\n iterations,\n converged: false,\n };\n }\n\n const uSq = ((WGS84_A ** 2 - WGS84_B ** 2) / WGS84_B ** 2) * cosSqAlpha;\n\n const A = 1 + (uSq / 16384) * (4096 + uSq * (-768 + uSq * (320 - 175 * uSq)));\n const B = (uSq / 1024) * (256 + uSq * (-128 + uSq * (74 - 47 * uSq)));\n\n const deltaSigma =\n B *\n sinSigma *\n (cos2SigmaM +\n (B / 4) *\n (cosSigma * (-1 + 2 * cos2SigmaM ** 2) -\n (B / 6) *\n cos2SigmaM *\n (-3 + 4 * sinSigma ** 2) *\n (-3 + 4 * cos2SigmaM ** 2)));\n\n const s = WGS84_B * A * (sigma - deltaSigma);\n\n const bearing = Math.atan2(\n cosU2 * Math.sin(lambda),\n cosU1 * sinU2 - sinU1 * cosU2 * Math.cos(lambda),\n );\n\n return {\n distanceMeters: s,\n bearingRad: bearing,\n iterations,\n converged: true,\n };\n}\n\nfunction karneyDistance(\n lat1: number,\n lon1: number,\n lat2: number,\n lon2: number,\n): KarneyResult {\n const phi1 = toRadians(lat1);\n const phi2 = toRadians(lat2);\n const L = toRadians(lon2 - lon1);\n\n const U1 = Math.atan((1 - WGS84_F) * Math.tan(phi1));\n const U2 = Math.atan((1 - WGS84_F) * Math.tan(phi2));\n\n const sinU1 = Math.sin(U1);\n const cosU1 = Math.cos(U1);\n const sinU2 = Math.sin(U2);\n const cosU2 = Math.cos(U2);\n\n const sinSigma = Math.sqrt(\n (cosU2 * Math.sin(L)) ** 2 +\n (cosU1 * sinU2 - sinU1 * cosU2 * Math.cos(L)) ** 2,\n );\n const cosSigma = sinU1 * sinU2 + cosU1 * cosU2 * Math.cos(L);\n const sigma = Math.atan2(sinSigma, cosSigma);\n if (sigma === 0) {\n return { distanceMeters: 0, bearingRad: 0 };\n }\n\n const sinAlpha = (cosU1 * cosU2 * Math.sin(L)) / Math.sin(sigma);\n const cosSqAlpha = 1 - sinAlpha ** 2;\n const cos2SigmaM =\n cosSqAlpha === 0 ? 0 : cosSigma - (2 * sinU1 * sinU2) / cosSqAlpha;\n\n const uSq = ((WGS84_A ** 2 - WGS84_B ** 2) / WGS84_B ** 2) * cosSqAlpha;\n\n const A = 1 + (uSq / 16384) * (4096 + uSq * (-768 + uSq * (320 - 175 * uSq)));\n const B = (uSq / 1024) * (256 + uSq * (-128 + uSq * (74 - 47 * uSq)));\n const deltaSigma =\n B *\n sinSigma *\n (cos2SigmaM +\n (B / 4) *\n (cosSigma * (-1 + 2 * cos2SigmaM ** 2) -\n (B / 6) *\n cos2SigmaM *\n (-3 + 4 * sinSigma ** 2) *\n (-3 + 4 * cos2SigmaM ** 2)));\n\n const s = WGS84_B * A * (sigma - deltaSigma);\n const bearing = Math.atan2(\n cosU2 * Math.sin(L),\n cosU1 * sinU2 - sinU1 * cosU2 * Math.cos(L),\n );\n\n return { distanceMeters: s, bearingRad: bearing };\n}\n","export type MeasurementSystem = \"metric\" | \"imperial\";\n\nexport interface RulerLengthUnitOptions {\n display: string;\n decimal: number;\n factor: number | null;\n label: string;\n}\n\nexport interface RulerAngleUnitOptions {\n display: string;\n decimal: number;\n factor: number | null;\n label: string;\n}\n\nexport interface RulerOptions {\n position: string;\n circleMarker: {\n color: string;\n radius: number;\n };\n lineStyle: {\n color: string;\n dashArray: string;\n };\n lengthUnit: RulerLengthUnitOptions;\n angleUnit: RulerAngleUnitOptions;\n}\n\nconst BASE_OPTIONS: Omit<RulerOptions, \"lengthUnit\"> = {\n position: \"topleft\",\n circleMarker: {\n color: \"red\",\n radius: 2,\n },\n lineStyle: {\n color: \"red\",\n dashArray: \"1,6\",\n },\n angleUnit: {\n display: \"°\",\n decimal: 2,\n factor: null,\n label: \"Bearing:\",\n },\n};\n\nconst METRIC_LENGTH: RulerLengthUnitOptions = {\n display: \"km\",\n decimal: 2,\n factor: null,\n label: \"Distance (km):\",\n};\n\nconst IMPERIAL_LENGTH: RulerLengthUnitOptions = {\n display: \"mi\",\n decimal: 2,\n factor: 0.621371,\n label: \"Distance (mi):\",\n};\n\n/**\n * Build Leaflet-ruler options for a given measurement system.\n */\nexport function getRulerOptions(system: MeasurementSystem): RulerOptions {\n const lengthUnit =\n system === \"imperial\" ? { ...IMPERIAL_LENGTH } : { ...METRIC_LENGTH };\n\n return {\n ...BASE_OPTIONS,\n lengthUnit,\n };\n}\n\nexport const measurementSystemDescriptions: Record<MeasurementSystem, string> =\n {\n metric: \"Meters / Kilometers\",\n imperial: \"Feet / Miles\",\n };\n","import type * as LType from \"leaflet\";\n\nexport interface AssertDrawOptions {\n onError?: (message: string) => void;\n}\n\n/**\n * Validate that Leaflet.draw APIs exist on the provided Leaflet namespace.\n * Returns true when present, false otherwise.\n */\nexport function assertDrawPresent(\n L: typeof LType,\n opts: AssertDrawOptions = {},\n): boolean {\n const hasControlDraw = Boolean((L?.Control as any)?.Draw);\n const hasDrawNamespace = Boolean((L as any).draw);\n const ok = hasControlDraw && hasDrawNamespace;\n if (!ok) {\n opts.onError?.(\n \"Leaflet.draw is not available on the provided Leaflet instance\",\n );\n }\n return ok;\n}\n","import * as BundledL from \"leaflet\";\nimport \"leaflet-draw\";\nimport \"leaflet-ruler\";\nimport type { Feature, FeatureCollection } from \"geojson\";\nimport type {\n DrawControlsConfig,\n MapConfig,\n MeasurementSystem,\n} from \"@src/types/public\";\nimport { createLogger, type Logger } from \"@src/utils/logger\";\nimport { FeatureStore } from \"@src/lib/FeatureStore\";\nimport { registerLayerCakeTool } from \"@src/lib/draw/toolbar-patch\";\nimport { DrawCake, ensureDrawCakeRegistered } from \"@src/lib/draw/L.Draw.Cake\";\nimport { ensureDrawMoveRegistered } from \"@src/lib/draw/L.Draw.Move\";\nimport type { DrawMove } from \"@src/lib/draw/L.Draw.Move\";\nimport { LayerCakeManager } from \"@src/lib/layer-cake/LayerCakeManager\";\nimport layerCakeIconSvg from \"@src/assets/layer-cake.svg?raw\";\nimport moveToolIconSvg from \"@src/assets/move-tool.svg?raw\";\nimport {\n expandMultiGeometries,\n mergePolygons,\n isPolygon,\n isMultiPolygon,\n} from \"@src/utils/geojson\";\nimport { computePreciseDistance, magicRound } from \"@src/utils/geodesic\";\nimport {\n getRulerOptions,\n measurementSystemDescriptions,\n} from \"@src/utils/ruler\";\nimport { assertDrawPresent } from \"@src/utils/leaflet-guards\";\n\nlet rulerPrecisionPatched = false;\n\nexport interface MapControllerCallbacks {\n onReady?: (detail: { bounds?: [[number, number], [number, number]] }) => void;\n onCreated?: (detail: {\n id: string;\n layerType: \"polygon\" | \"polyline\" | \"rectangle\" | \"circle\" | \"marker\";\n geoJSON: Feature;\n }) => void;\n onEdited?: (detail: { ids: string[]; geoJSON: FeatureCollection }) => void;\n onDeleted?: (detail: { ids: string[]; geoJSON: FeatureCollection }) => void;\n onError?: (detail: { message: string; cause?: unknown }) => void;\n}\n\nexport interface MapControllerOptions {\n container: HTMLElement;\n map: MapConfig;\n controls: DrawControlsConfig;\n readOnly?: boolean;\n logger?: Logger;\n callbacks?: MapControllerCallbacks;\n /** Optional injected Leaflet namespace to use instead of bundled import. */\n leaflet?: typeof BundledL;\n /** Prefer external Leaflet if available (falls back to bundled if missing/invalid). */\n useExternalLeaflet?: boolean;\n}\n\n/**\n * MapController: initializes Leaflet map + Draw, bridges events, and manages data via FeatureStore.\n */\nexport class MapController {\n private container: HTMLElement;\n private logger: Logger;\n private options: MapControllerOptions;\n\n // Active Leaflet namespace (injected or bundled fallback)\n private L: typeof BundledL;\n\n // Data store (id-centric)\n private store: FeatureStore;\n\n // Leaflet entities\n private map: BundledL.Map | null = null;\n private drawnItems: BundledL.FeatureGroup | null = null;\n // Keep 'any' here to avoid type friction across different @types/leaflet-draw versions\n private drawControl: any | null = null;\n private rulerControl: BundledL.Control.Ruler | null = null;\n private measurementControl: BundledL.Control | null = null;\n private measurementSystem: MeasurementSystem = \"metric\";\n private measurementModalOverlay: HTMLDivElement | null = null;\n private measurementModalDialog: HTMLDivElement | null = null;\n private measurementModalRadios: Partial<\n Record<MeasurementSystem, HTMLInputElement>\n > = {};\n private measurementModalKeydownHandler: ((e: KeyboardEvent) => void) | null =\n null;\n\n // Detacher for our polygon close-on-first-vertex patch\n private detachPolygonFinishPatch: (() => void) | null = null;\n\n // Context menu for vertex deletion\n private vertexMenuEl: HTMLDivElement | null = null;\n private vertexMenuCleanup: (() => void) | null = null;\n private activeCakeSession: LayerCakeManager | null = null;\n\n // Move tool UI elements\n private moveConfirmationUI: HTMLDivElement | null = null;\n private activeMoveHandler: DrawMove | null = null;\n\n constructor(opts: MapControllerOptions) {\n this.options = opts;\n this.container = opts.container;\n this.logger = (opts.logger ?? createLogger(\"controller\", \"debug\")).child(\n \"map\",\n );\n this.L = this.resolveLeaflet(opts);\n this.store = new FeatureStore(this.logger.child(\"store\"));\n this.logger.debug(\"ctor\", {\n config: opts.map,\n controls: opts.controls,\n readOnly: opts.readOnly,\n useExternalLeaflet: opts.useExternalLeaflet,\n });\n\n ensureDrawCakeRegistered(this.L);\n ensureDrawMoveRegistered(this.L);\n registerLayerCakeTool(this.L);\n }\n\n private resolveLeaflet(opts: MapControllerOptions): typeof BundledL {\n const preferExternal = opts.useExternalLeaflet;\n if (!preferExternal) {\n return BundledL;\n }\n\n if (opts.leaflet && assertDrawPresent(opts.leaflet)) {\n this.logger.debug(\"leaflet-runtime:external-injected\");\n return opts.leaflet;\n }\n\n const globalL = (globalThis as any).L as typeof BundledL | undefined;\n if (globalL && assertDrawPresent(globalL)) {\n this.logger.debug(\"leaflet-runtime:external-global\");\n return globalL;\n }\n\n this.logger.warn(\"leaflet-runtime:external-fallback-bundled\", {\n message:\n \"External Leaflet requested but Draw APIs were missing; falling back to bundled Leaflet/Draw\",\n });\n return BundledL;\n }\n\n // ---------------- Lifecycle ----------------\n\n async init(): Promise<void> {\n const t0 = performance.now?.() ?? Date.now();\n try {\n // Remove any previous instance\n await this.destroy();\n\n // Create the map\n const {\n latitude,\n longitude,\n zoom,\n minZoom,\n maxZoom,\n tileUrl,\n tileAttribution,\n preferCanvas = true, // Default to Canvas rendering for better performance\n useExternalLeaflet,\n } = this.options.map;\n const center: [number, number] = [latitude, longitude];\n const Lns = this.L;\n\n if (useExternalLeaflet) {\n assertDrawPresent(Lns, {\n onError: (message: string) =>\n this.logger.warn(\"external-leaflet-missing-draw\", { message }),\n });\n }\n this.map = Lns.map(this.container, {\n zoomControl: true,\n preferCanvas,\n }).setView(center, zoom);\n\n // Add tile layer\n Lns.tileLayer(tileUrl, {\n attribution: tileAttribution,\n minZoom,\n maxZoom,\n }).addTo(this.map);\n\n // FeatureGroup for all drawn layers\n this.drawnItems = Lns.featureGroup().addTo(this.map);\n\n // Draw control\n const drawOptions = this.buildDrawOptions(\n this.options.controls,\n !!this.options.readOnly,\n );\n const DrawCtor = (Lns.Control as any).Draw; // tolerate type friction\n this.drawControl = new DrawCtor(drawOptions);\n this.map.addControl(this.drawControl);\n this.applyLayerCakeToolbarIcon();\n this.applyMoveToolbarIcon();\n\n if (this.options.controls.ruler) {\n this.logger.debug(\"init:ruler\", {\n available: typeof Lns.control.ruler === \"function\",\n });\n if (typeof Lns.control.ruler === \"function\") {\n this.addRulerControl();\n this.installMeasurementSettingsControl();\n } else {\n this.logger.warn(\"init:ruler:missing\", {\n msg: \"L.control.ruler is not defined\",\n });\n }\n }\n\n // Patch known Leaflet.draw bugs (e.g., readableArea strict-mode variable)\n this.patchLeafletDrawBugs();\n\n // Patch: reliably allow closing polygons by clicking the first vertex (Shadow DOM safe)\n this.installPolygonFinishPatch();\n\n // Ensure Leaflet measures the container after layout\n this.map.invalidateSize();\n setTimeout(() => {\n try {\n this.map?.invalidateSize();\n } catch {\n // Ignore invalidateSize errors - this is just a UI refresh\n }\n }, 0);\n\n // Bind draw events\n this.bindDrawEvents();\n\n const elapsed = (performance.now?.() ?? Date.now()) - t0;\n this.logger.debug(\"init:ready\", { elapsedMs: Math.round(elapsed) });\n\n // Announce ready with current bounds (if any)\n const b = this.store.bounds();\n this.options.callbacks?.onReady?.(b ? { bounds: b } : {});\n } catch (err) {\n this._error(\"Failed to initialize Leaflet map\", err);\n }\n }\n\n async destroy(): Promise<void> {\n try {\n if (this.map) {\n this.map.off();\n this.map.remove();\n }\n } catch (err) {\n this._error(\"Failed to remove Leaflet map\", err);\n }\n\n // Detach polygon finish patch (if installed)\n try {\n this.detachPolygonFinishPatch?.();\n } catch {\n // Ignore errors when detaching polygon finish patch during cleanup\n }\n this.detachPolygonFinishPatch = null;\n\n // Cleanup vertex menu if present\n try {\n this.vertexMenuCleanup?.();\n } catch {\n // Ignore errors when cleaning up vertex menu during destruction\n }\n this.vertexMenuEl = null;\n this.vertexMenuCleanup = null;\n\n // Cleanup move confirmation UI if present\n try {\n this.hideMoveConfirmationUI();\n } catch {\n // Ignore errors when cleaning up move confirmation UI during destruction\n }\n\n this.drawControl = null;\n this.rulerControl = null;\n this.measurementControl = null;\n this.removeMeasurementModal();\n this.drawnItems = null;\n\n try {\n this.activeCakeSession?.destroy();\n } catch {\n // Ignore errors when cleaning up an in-progress cake session\n }\n this.activeCakeSession = null;\n\n this.map = null;\n }\n\n // ---------------- Public API (data) ----------------\n\n async getGeoJSON(): Promise<FeatureCollection> {\n return this.store.toFeatureCollection();\n }\n\n async loadGeoJSON(\n fc: FeatureCollection,\n fitToData: boolean = false,\n ): Promise<void> {\n if (!this.map || !this.drawnItems) return;\n // Clear existing\n await this.clearLayers();\n\n // Add new features into store + map layers\n const normalized = expandMultiGeometries(fc);\n const ids = this.store.add(normalized);\n const layers = this.L.geoJSON(normalized);\n let i = 0;\n layers.eachLayer((layer: any) => {\n (layer as any)._fid = ids[i] ?? ids[ids.length - 1];\n this.drawnItems!.addLayer(layer);\n this.installVertexContextMenu(layer);\n i++;\n });\n\n this.logger.debug(\"loadGeoJSON\", {\n count: normalized.features.length,\n ids,\n });\n\n if (fitToData) {\n await this.fitBoundsToData();\n }\n }\n\n async clearLayers(): Promise<void> {\n if (this.drawnItems) {\n this.drawnItems.clearLayers();\n }\n this.store.clear();\n }\n\n async addFeatures(fc: FeatureCollection): Promise<string[]> {\n if (!this.map || !this.drawnItems) return [];\n const normalized = expandMultiGeometries(fc);\n const ids = this.store.add(normalized);\n const layers = this.L.geoJSON(normalized);\n let i = 0;\n layers.eachLayer((layer: any) => {\n (layer as any)._fid = ids[i] ?? ids[ids.length - 1];\n this.drawnItems!.addLayer(layer);\n this.installVertexContextMenu(layer);\n i++;\n });\n return ids;\n }\n\n async updateFeature(id: string, feature: Feature): Promise<void> {\n this.store.update(id, feature);\n // Replace layer visually if present: naive approach is to re-add a new layer, but for now we only update store;\n // a later pass will sync layer geometries precisely.\n }\n\n async removeFeature(id: string): Promise<void> {\n // Remove matching layer(s)\n if (this.drawnItems) {\n this.drawnItems.eachLayer((layer: any) => {\n if ((layer as any)._fid === id) {\n this.drawnItems!.removeLayer(layer);\n }\n });\n }\n this.store.remove(id);\n }\n\n // ---------------- Public API (map) ----------------\n\n async fitBoundsToData(paddingRatio: number = 0.05): Promise<void> {\n if (!this.map) return;\n const b = this.store.bounds();\n if (!b) return;\n const boundsLiteral = b as unknown as BundledL.LatLngBoundsLiteral;\n const bounds = this.L.latLngBounds(boundsLiteral);\n // Compute padded bounds by interpolating\n if (paddingRatio > 0) {\n const sw = bounds.getSouthWest();\n const ne = bounds.getNorthEast();\n const latPad = (ne.lat - sw.lat) * paddingRatio;\n const lngPad = (ne.lng - sw.lng) * paddingRatio;\n const padded = this.L.latLngBounds(\n this.L.latLng(sw.lat - latPad, sw.lng - lngPad),\n this.L.latLng(ne.lat + latPad, ne.lng + lngPad),\n );\n this.map.fitBounds(padded);\n } else {\n this.map.fitBounds(bounds);\n }\n }\n\n async fitBounds(\n boundsTuple: [[number, number], [number, number]],\n paddingRatio: number = 0.05,\n ): Promise<void> {\n if (!this.map) return;\n const bounds = (this.L as any).latLngBounds(boundsTuple as any);\n if (paddingRatio > 0) {\n const sw = bounds.getSouthWest();\n const ne = bounds.getNorthEast();\n const latPad = (ne.lat - sw.lat) * paddingRatio;\n const lngPad = (ne.lng - sw.lng) * paddingRatio;\n const padded = (this.L as any).latLngBounds(\n (this.L as any).latLng(sw.lat - latPad, sw.lng - lngPad),\n (this.L as any).latLng(ne.lat + latPad, ne.lng + lngPad),\n );\n this.map.fitBounds(padded);\n } else {\n this.map.fitBounds(bounds);\n }\n }\n\n async setView(lat: number, lng: number, zoom?: number): Promise<void> {\n if (!this.map) return;\n this.map.setView([lat, lng], zoom ?? this.map.getZoom());\n }\n\n /**\n * Merge all visible polygon features into a single polygon feature.\n * This removes the original features and adds a new feature with the merged geometry.\n *\n * @param options Optional configuration for the merge operation\n * @returns The ID of the newly created merged feature, or null if no polygons to merge\n */\n async mergeVisiblePolygons(options?: {\n /** Properties to apply to the merged feature (defaults to properties from first polygon) */\n properties?: Record<string, any>;\n }): Promise<string | null> {\n if (!this.map || !this.drawnItems) return null;\n\n // Get all current features\n const fc = await this.getGeoJSON();\n\n // Filter for polygon features only\n const polygonFeatures = fc.features.filter((feature) => {\n const geom = feature.geometry;\n return geom && (isPolygon(geom) || isMultiPolygon(geom));\n });\n\n if (polygonFeatures.length <= 1) {\n // No polygons or just one polygon - nothing to merge\n if (polygonFeatures.length === 1) {\n const existingId = (polygonFeatures[0] as any).id;\n return existingId ? String(existingId) : null;\n }\n return null;\n }\n\n // Merge the polygons\n const mergedFeature = mergePolygons(polygonFeatures, options?.properties);\n if (!mergedFeature) return null;\n\n // Get IDs of original polygons to remove - extract from feature.id\n const idsToRemove: string[] = [];\n for (const feature of polygonFeatures) {\n const id = (feature as any).id;\n if (id) idsToRemove.push(String(id));\n }\n\n // Remove original polygons\n for (const id of idsToRemove) {\n await this.removeFeature(id);\n }\n\n // Add the merged polygon as a new feature\n const [newFeatureId] = await this.addFeatures({\n type: \"FeatureCollection\",\n features: [mergedFeature],\n });\n\n return newFeatureId || null;\n }\n\n setRulerUnits(system: MeasurementSystem): void {\n if (this.measurementSystem === system) return;\n this.measurementSystem = system;\n this.logger.debug(\"ruler:units\", { system });\n this.syncMeasurementModalState();\n this.rebuildRulerControl();\n }\n\n // ---------------- Internals ----------------\n\n private buildDrawOptions(\n controls: DrawControlsConfig,\n readOnly: boolean,\n ): BundledL.Control.DrawOptions {\n // Define explicit options for each tool to ensure consistent behavior.\n const draw: Record<string, any> = {\n polygon: controls.polygon\n ? {\n allowIntersection:\n this.options.map.polygonAllowIntersection ?? false, // Disallow self-intersections by default\n showArea: true, // Display area tooltip while drawing\n shapeOptions: {\n color: \"#3388ff\", // Default shape color\n },\n }\n : false,\n polyline: controls.polyline\n ? {\n shapeOptions: {\n color: \"#3388ff\",\n },\n }\n : false,\n rectangle: controls.rectangle\n ? {\n shapeOptions: {\n color: \"#3388ff\",\n },\n }\n : false,\n circle: controls.circle\n ? {\n shapeOptions: {\n color: \"#3388ff\",\n },\n }\n : false,\n cake: controls.cake\n ? {\n shapeOptions: {\n color: \"#8A2BE2\", // Violet color for distinction\n fillOpacity: 0.2,\n },\n }\n : false,\n marker: controls.marker ? {} : false,\n move: controls.move\n ? {\n featureGroup: this.drawnItems as any,\n }\n : false,\n };\n\n // Edit toolbar\n let edit: any = {\n featureGroup: this.drawnItems as any,\n };\n if (!controls.edit) {\n edit = false;\n } else {\n if (controls.delete === false) {\n edit.remove = false;\n }\n }\n\n if (readOnly) {\n // Disable all drawing/editing/removing\n return {\n draw: false,\n edit: false,\n } as any;\n }\n\n return { draw, edit } as any;\n }\n\n private applyLayerCakeToolbarIcon(): void {\n if (!this.container) return;\n\n const applyIcon = () => {\n const button = this.container.querySelector(\n \"a.leaflet-draw-draw-cake\",\n ) as HTMLAnchorElement | null;\n if (!button) return;\n\n // Disable Leaflet.draw sprite sheet background for this button.\n button.style.setProperty(\"background-image\", \"none\", \"important\");\n button.style.setProperty(\"background-color\", \"#fff\", \"important\");\n\n // Render our custom icon as an explicit child element so it cannot fall back to sprites.\n button.style.setProperty(\"position\", \"relative\", \"important\");\n let icon = button.querySelector(\n \".leaflet-geokit-cake-icon\",\n ) as HTMLSpanElement | null;\n if (!icon) {\n icon = document.createElement(\"span\");\n icon.className = \"leaflet-geokit-cake-icon\";\n icon.setAttribute(\"aria-hidden\", \"true\");\n button.appendChild(icon);\n }\n\n icon.style.setProperty(\"position\", \"absolute\", \"important\");\n icon.style.setProperty(\"display\", \"block\", \"important\");\n icon.style.setProperty(\"left\", \"50%\", \"important\");\n icon.style.setProperty(\"top\", \"50%\", \"important\");\n icon.style.setProperty(\"width\", \"18px\", \"important\");\n icon.style.setProperty(\"height\", \"18px\", \"important\");\n icon.style.setProperty(\"transform\", \"translate(-50%, -50%)\", \"important\");\n icon.style.setProperty(\"pointer-events\", \"none\", \"important\");\n\n // Use inline SVG markup so rendering does not depend on URL asset resolution.\n if (!icon.firstElementChild) {\n icon.innerHTML = layerCakeIconSvg;\n }\n const svg = icon.firstElementChild as SVGElement | null;\n if (svg) {\n svg.style.setProperty(\"width\", \"100%\", \"important\");\n svg.style.setProperty(\"height\", \"100%\", \"important\");\n svg.style.setProperty(\"display\", \"block\", \"important\");\n }\n };\n\n applyIcon();\n setTimeout(applyIcon, 0);\n }\n\n private applyMoveToolbarIcon(): void {\n if (!this.container) return;\n\n const applyIcon = () => {\n const button = this.container.querySelector(\n \"a.leaflet-draw-draw-move\",\n ) as HTMLAnchorElement | null;\n if (!button) return;\n\n // Disable Leaflet.draw sprite sheet background for this button.\n button.style.setProperty(\"background-image\", \"none\", \"important\");\n button.style.setProperty(\"background-color\", \"#fff\", \"important\");\n\n // Render our custom icon as an explicit child element so it cannot fall back to sprites.\n button.style.setProperty(\"position\", \"relative\", \"important\");\n let icon = button.querySelector(\n \".leaflet-geokit-move-icon\",\n ) as HTMLSpanElement | null;\n if (!icon) {\n icon = document.createElement(\"span\");\n icon.className = \"leaflet-geokit-move-icon\";\n icon.setAttribute(\"aria-hidden\", \"true\");\n button.appendChild(icon);\n }\n\n icon.style.setProperty(\"position\", \"absolute\", \"important\");\n icon.style.setProperty(\"display\", \"block\", \"important\");\n icon.style.setProperty(\"left\", \"50%\", \"important\");\n icon.style.setProperty(\"top\", \"50%\", \"important\");\n icon.style.setProperty(\"width\", \"18px\", \"important\");\n icon.style.setProperty(\"height\", \"18px\", \"important\");\n icon.style.setProperty(\"transform\", \"translate(-50%, -50%)\", \"important\");\n icon.style.setProperty(\"pointer-events\", \"none\", \"important\");\n\n // Use inline SVG markup so rendering does not depend on URL asset resolution.\n if (!icon.firstElementChild) {\n icon.innerHTML = moveToolIconSvg;\n }\n const svg = icon.firstElementChild as SVGElement | null;\n if (svg) {\n svg.style.setProperty(\"width\", \"100%\", \"important\");\n svg.style.setProperty(\"height\", \"100%\", \"important\");\n svg.style.setProperty(\"display\", \"block\", \"important\");\n }\n };\n\n applyIcon();\n setTimeout(applyIcon, 0);\n }\n\n /* c8 ignore start */\n private addRulerControl(): void {\n if (!this.map) return;\n this.installRulerPrecisionPatch();\n const options = getRulerOptions(this.measurementSystem);\n this.rulerControl = this.L.control.ruler(options);\n this.map.addControl(this.rulerControl);\n }\n\n private installRulerPrecisionPatch(): void {\n if (rulerPrecisionPatched) return;\n const RulerCtor = (this.L.Control as any).Ruler;\n if (!RulerCtor || typeof RulerCtor !== \"function\") return;\n const proto = RulerCtor.prototype;\n const original = proto._calculateBearingAndDistance;\n if (typeof original !== \"function\") return;\n\n const logger = this.logger;\n\n proto._calculateBearingAndDistance = function patchedPrecision() {\n original.call(this);\n try {\n const start = this._clickedLatLong;\n const end = this._movingLatLong ?? this._clickedLatLong;\n if (!start || !end) return;\n\n const { meters, bearingDegrees } = computePreciseDistance(\n start.lat,\n start.lng,\n end.lat,\n end.lng,\n );\n const kilometers = meters / 1000;\n const conversion =\n typeof this.options?.lengthUnit?.factor === \"number\"\n ? this.options.lengthUnit.factor\n : 1;\n const distance = magicRound(kilometers * conversion);\n\n this._result = this._result || {};\n this._result.Distance = distance;\n this._result.Bearing = bearingDegrees;\n this._result.meters = meters;\n } catch (err) {\n logger?.warn(\"ruler:precision-patch\", err as any);\n }\n };\n\n rulerPrecisionPatched = true;\n }\n\n private rebuildRulerControl(): void {\n if (!this.map || !this.options.controls.ruler) return;\n if (this.rulerControl) {\n try {\n this.map.removeControl(this.rulerControl);\n } catch (err) {\n this.logger.warn(\"ruler:remove-failed\", err as any);\n }\n this.rulerControl = null;\n }\n this.addRulerControl();\n }\n\n /* c8 ignore next */\n private installMeasurementSettingsControl(): void {\n if (!this.map || this.measurementControl) return;\n const controller = this;\n const SettingsControl = (this.L.Control as any).extend({\n options: { position: \"topleft\" },\n onAdd() {\n const container = controller.L.DomUtil.create(\n \"div\",\n \"leaflet-bar leaflet-ruler-settings-control\",\n );\n const button = controller.L.DomUtil.create(\n \"button\",\n \"leaflet-ruler-settings-button\",\n container,\n );\n button.type = \"button\";\n button.title = \"Measurement settings\";\n button.setAttribute(\"aria-label\", \"Measurement settings\");\n button.addEventListener(\"click\", (event: MouseEvent) => {\n event.preventDefault();\n event.stopPropagation();\n controller.toggleMeasurementModal(true);\n });\n controller.L.DomEvent.disableClickPropagation(container);\n controller.L.DomEvent.disableScrollPropagation(container);\n return container;\n },\n }) as typeof BundledL.Control;\n this.measurementControl = new SettingsControl();\n this.map.addControl(this.measurementControl);\n }\n\n /* c8 ignore next */\n private ensureMeasurementModal(): HTMLDivElement {\n if (this.measurementModalOverlay) return this.measurementModalOverlay;\n if (typeof document === \"undefined\") {\n throw new Error(\"Measurement modal requires a browser environment\");\n }\n const overlay = document.createElement(\"div\");\n overlay.className = \"leaflet-ruler-modal-overlay\";\n overlay.setAttribute(\"aria-hidden\", \"true\");\n const dialog = document.createElement(\"div\");\n dialog.className = \"leaflet-ruler-modal\";\n dialog.setAttribute(\"role\", \"dialog\");\n dialog.setAttribute(\"aria-modal\", \"true\");\n dialog.tabIndex = -1;\n\n overlay.addEventListener(\"click\", (event) => {\n if (event.target === overlay) {\n this.toggleMeasurementModal(false);\n }\n });\n\n const title = document.createElement(\"h2\");\n title.className = \"leaflet-ruler-modal-title\";\n title.textContent = \"Measurement Units\";\n dialog.appendChild(title);\n\n const description = document.createElement(\"p\");\n description.className = \"leaflet-ruler-modal-description\";\n description.textContent =\n \"Choose how the measurement tool reports distances.\";\n dialog.appendChild(description);\n\n const optionsList = document.createElement(\"div\");\n optionsList.className = \"leaflet-ruler-modal-options\";\n dialog.appendChild(optionsList);\n\n ([\"metric\", \"imperial\"] as MeasurementSystem[]).forEach((system) => {\n const label = document.createElement(\"label\");\n label.className = \"leaflet-ruler-modal-option\";\n\n const input = document.createElement(\"input\");\n input.type = \"radio\";\n input.name = \"leaflet-ruler-units\";\n input.value = system;\n input.addEventListener(\"change\", () => {\n if (input.checked) {\n this.setRulerUnits(system);\n }\n });\n\n const span = document.createElement(\"span\");\n span.textContent = measurementSystemDescriptions[system];\n\n label.appendChild(input);\n label.appendChild(span);\n optionsList.appendChild(label);\n this.measurementModalRadios[system] = input;\n });\n\n const actions = document.createElement(\"div\");\n actions.className = \"leaflet-ruler-modal-actions\";\n const close = document.createElement(\"button\");\n close.type = \"button\";\n close.className = \"leaflet-ruler-modal-close\";\n close.textContent = \"Close\";\n close.addEventListener(\"click\", () => this.toggleMeasurementModal(false));\n actions.appendChild(close);\n dialog.appendChild(actions);\n\n overlay.appendChild(dialog);\n this.container.appendChild(overlay);\n this.measurementModalOverlay = overlay;\n this.measurementModalDialog = dialog;\n this.syncMeasurementModalState();\n return overlay;\n }\n\n /* c8 ignore next */\n private toggleMeasurementModal(show: boolean): void {\n if (!show) {\n if (this.measurementModalOverlay) {\n this.measurementModalOverlay.classList.remove(\"is-open\");\n this.measurementModalOverlay.setAttribute(\"aria-hidden\", \"true\");\n }\n this.detachMeasurementModalKeydown();\n return;\n }\n\n const overlay = this.ensureMeasurementModal();\n overlay.classList.add(\"is-open\");\n overlay.setAttribute(\"aria-hidden\", \"false\");\n this.syncMeasurementModalState();\n this.attachMeasurementModalKeydown();\n this.measurementModalDialog?.focus();\n }\n\n private syncMeasurementModalState(): void {\n for (const [system, input] of Object.entries(this.measurementModalRadios)) {\n if (input) {\n input.checked = system === this.measurementSystem;\n }\n }\n }\n\n /* c8 ignore next */\n private removeMeasurementModal(): void {\n if (this.measurementModalOverlay) {\n this.measurementModalOverlay.remove();\n }\n this.measurementModalOverlay = null;\n this.measurementModalDialog = null;\n this.measurementModalRadios = {};\n this.detachMeasurementModalKeydown();\n }\n\n /* c8 ignore next */\n private attachMeasurementModalKeydown(): void {\n if (\n this.measurementModalKeydownHandler ||\n typeof document === \"undefined\"\n ) {\n return;\n }\n this.measurementModalKeydownHandler = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") {\n this.toggleMeasurementModal(false);\n }\n };\n document.addEventListener(\"keydown\", this.measurementModalKeydownHandler);\n }\n\n /* c8 ignore next */\n private detachMeasurementModalKeydown(): void {\n if (\n !this.measurementModalKeydownHandler ||\n typeof document === \"undefined\"\n ) {\n return;\n }\n document.removeEventListener(\n \"keydown\",\n this.measurementModalKeydownHandler,\n );\n this.measurementModalKeydownHandler = null;\n }\n /* c8 ignore end */\n\n /**\n * Workaround: In some environments (notably within Shadow DOM), clicking the first vertex\n * to close a polygon can be unreliable due to event retargeting/hit testing.\n * This patch listens for map clicks while the polygon draw handler is enabled and,\n * if the click is within a small pixel radius of the first vertex, it triggers finishShape().\n */\n private installPolygonFinishPatch(): void {\n if (!this.map || !this.drawControl) return;\n\n // Remove any existing patch first\n try {\n this.detachPolygonFinishPatch?.();\n } catch {\n // Ignore errors when detaching existing polygon patch\n }\n this.detachPolygonFinishPatch = null;\n\n const map: any = this.map as any;\n const drawTb: any = (this.drawControl as any)?._toolbars?.draw;\n if (!drawTb) return;\n\n // Guard if polygon mode isn't available\n const hasPolygon = !!drawTb._modes?.polygon?.handler;\n if (!hasPolygon) return;\n\n const CLICK_HIT_PX = 10; // be conservative to avoid accidental closes\n\n const onClick = (e: any) => {\n try {\n const handler: any = drawTb._modes?.polygon?.handler;\n if (!handler || !handler._enabled) return;\n\n const markers: any[] = handler._markers;\n // Only activate after 4+ vertices to avoid premature closures on early points\n if (!Array.isArray(markers) || markers.length < 4) return;\n\n const firstLL = markers[0]?.getLatLng?.();\n if (!firstLL) return;\n\n const pFirst = map.latLngToContainerPoint(firstLL);\n const pClick = map.latLngToContainerPoint(e.latlng);\n const dist = Math.hypot(pFirst.x - pClick.x, pFirst.y - pClick.y);\n\n if (\n dist <= CLICK_HIT_PX &&\n typeof handler._finishShape === \"function\"\n ) {\n // Prevent Draw from adding an extra vertex; finish the polygon instead\n e.originalEvent?.preventDefault?.();\n e.originalEvent?.stopPropagation?.();\n handler._finishShape();\n }\n } catch (err) {\n this._error(\"polygon-finish-patch\", err);\n }\n };\n\n map.on(\"click\", onClick);\n this.detachPolygonFinishPatch = () => {\n try {\n map.off(\"click\", onClick);\n } catch {\n // Ignore errors when removing map click event listener\n }\n };\n }\n\n private patchLeafletDrawBugs(): void {\n try {\n const anyL: any = this.L as any;\n const GU = anyL.GeometryUtil;\n if (!GU) return;\n // Replace readableArea with a strict-mode safe implementation\n const defaults = {\n km: 2,\n ha: 2,\n m: 0,\n mi: 2,\n ac: 2,\n yd: 0,\n ft: 0,\n nm: 2,\n };\n const fmt =\n GU.formattedNumber?.bind(GU) ??\n ((num: number, p: number) => Number(num).toFixed(p));\n GU.readableArea = (\n area: number,\n metric?: boolean | string | string[],\n precision?: any,\n ): string => {\n const opts = anyL.Util?.extend\n ? anyL.Util.extend({}, defaults, precision || {})\n : { ...defaults, ...(precision || {}) };\n let out: string;\n if (metric) {\n let units: string[] = [\"ha\", \"m\"];\n const t = typeof metric;\n if (t === \"string\") units = [metric as string];\n else if (t !== \"boolean\")\n units = Array.isArray(metric) ? (metric as string[]) : units;\n if (area >= 1e6 && units.indexOf(\"km\") !== -1)\n out = `${fmt(1e-6 * area, opts.km)} km²`;\n else if (area >= 1e4 && units.indexOf(\"ha\") !== -1)\n out = `${fmt(1e-4 * area, opts.ha)} ha`;\n else out = `${fmt(area, opts.m)} m²`;\n } else {\n area = area / 0.836127; // square yards\n if (area >= 3097600) out = `${fmt(area / 3097600, opts.mi)} mi²`;\n else if (area >= 4840) out = `${fmt(area / 4840, opts.ac)} acres`;\n else out = `${fmt(area, opts.yd)} yd²`;\n }\n return out;\n };\n } catch (err) {\n this.logger.warn(\"leaflet-draw-patch:readableArea\", err as any);\n }\n\n // Patch Leaflet.draw circle editing strict-mode bug:\n // L.Edit.Circle.prototype._resize assigns to an undeclared `radius` variable.\n try {\n const anyL: any = this.L as any;\n const EditCircle = anyL.Edit?.Circle;\n const DrawEvent = anyL.Draw?.Event;\n const GU = anyL.GeometryUtil;\n if (!EditCircle?.prototype?._resize || !DrawEvent || !GU) return;\n\n EditCircle.prototype._resize = function patchedCircleResize(latlng: any) {\n const center = this._moveMarker.getLatLng();\n const radius = GU.isVersion07x()\n ? center.distanceTo(latlng)\n : this._map.distance(center, latlng);\n\n this._shape.setRadius(radius);\n\n try {\n if (\n this._map?.editTooltip &&\n this._map?._editTooltip?.updateContent\n ) {\n this._map._editTooltip.updateContent({\n text:\n anyL.drawLocal.edit.handlers.edit.tooltip.subtext +\n \"<br />\" +\n anyL.drawLocal.edit.handlers.edit.tooltip.text,\n subtext:\n anyL.drawLocal.draw.handlers.circle.radius +\n \": \" +\n GU.readableDistance(\n radius,\n true,\n this.options.feet,\n this.options.nautic,\n ),\n });\n }\n } catch {\n // Ignore tooltip update errors in patched circle resize\n }\n\n this._map.fire(DrawEvent.EDITRESIZE, { layer: this._shape });\n };\n } catch (err) {\n this.logger.warn(\"leaflet-draw-patch:circle-resize\", err as any);\n }\n }\n\n private bindDrawEvents(): void {\n if (!this.map || !this.drawnItems) return;\n\n // CREATED: single layer with layerType\n this.map.on((this.L as any).Draw.Event.CREATED, (e: any) => {\n try {\n const { layer, layerType } = e;\n\n if (layerType === DrawCake.TYPE) {\n try {\n this.activeCakeSession?.destroy();\n } catch {\n // Ignore previous session cleanup failures\n }\n\n this.activeCakeSession = new LayerCakeManager(\n this.map!,\n layer as BundledL.Circle,\n (featureCollection) => {\n if (!this.drawnItems) return;\n const ids = this.store.add(featureCollection);\n const layers = this.L.geoJSON(featureCollection);\n\n let i = 0;\n layers.eachLayer((createdLayer: any) => {\n const id = ids[i] ?? ids[ids.length - 1];\n (createdLayer as any)._fid = id;\n this.drawnItems!.addLayer(createdLayer);\n this.installVertexContextMenu(createdLayer);\n this.options.callbacks?.onCreated?.({\n id,\n layerType: \"polygon\",\n geoJSON: createdLayer.toGeoJSON(),\n });\n i++;\n });\n\n this.activeCakeSession = null;\n },\n this.measurementSystem,\n );\n\n return;\n }\n\n this.drawnItems!.addLayer(layer);\n const feat = layer.toGeoJSON() as Feature;\n const ids = this.store.add({\n type: \"FeatureCollection\",\n features: [feat],\n });\n const id = ids[0];\n (layer as any)._fid = id;\n this.installVertexContextMenu(layer);\n\n this.options.callbacks?.onCreated?.({ id, layerType, geoJSON: feat });\n } catch (err) {\n this._error(\"onCreated handler failed\", err);\n }\n });\n\n // EDITED: multiple layers in a LayerGroup\n this.map.on((this.L as any).Draw.Event.EDITED, (e: any) => {\n try {\n const ids: string[] = [];\n const layers: any = e.layers;\n layers.eachLayer((layer: any) => {\n const feat = layer.toGeoJSON() as Feature;\n const id = (layer as any)._fid as string | undefined;\n if (id) {\n this.store.update(id, feat);\n ids.push(id);\n } else {\n // unknown layer, add it\n const newId = this.store.add({\n type: \"FeatureCollection\",\n features: [feat],\n })[0];\n (layer as any)._fid = newId;\n ids.push(newId);\n }\n });\n\n this.options.callbacks?.onEdited?.({\n ids,\n geoJSON: this.store.toFeatureCollection(),\n });\n } catch (err) {\n this._error(\"onEdited handler failed\", err);\n }\n });\n\n // DELETED: multiple layers in a LayerGroup\n this.map.on((this.L as any).Draw.Event.DELETED, (e: any) => {\n try {\n const ids: string[] = [];\n const layers: any = e.layers;\n layers.eachLayer((layer: any) => {\n const id = (layer as any)._fid as string | undefined;\n if (id) {\n ids.push(id);\n this.store.remove(id);\n }\n });\n\n this.options.callbacks?.onDeleted?.({\n ids,\n geoJSON: this.store.toFeatureCollection(),\n });\n } catch (err) {\n this._error(\"onDeleted handler failed\", err);\n }\n });\n\n // MOVEEND: user has finished dragging a feature, show Save/Cancel UI\n this.map.on(\"draw:moveend\", (e: any) => {\n try {\n this.showMoveConfirmationUI(e.layer, e.originalGeoJSON, e.newGeoJSON);\n } catch (err) {\n this._error(\"draw:moveend handler failed\", err);\n }\n });\n\n // MOVECONFIRMED: user clicked Save, update the store and emit event\n this.map.on(\"draw:moveconfirmed\", (e: any) => {\n try {\n const layer = e.layer;\n const id = (layer as any)._fid as string | undefined;\n if (id) {\n const feat = layer.toGeoJSON() as Feature;\n this.store.update(id, feat);\n\n // Emit custom event for move confirmed\n this.options.callbacks?.onEdited?.({\n ids: [id],\n geoJSON: this.store.toFeatureCollection(),\n });\n }\n\n this.hideMoveConfirmationUI();\n } catch (err) {\n this._error(\"draw:moveconfirmed handler failed\", err);\n }\n });\n }\n\n private _error(message: string, cause: unknown): void {\n this.logger.error(\"error\", { message, cause });\n this.options.callbacks?.onError?.({ message, cause });\n }\n\n // -------- Vertex deletion context menu --------\n\n private installVertexContextMenu(layer: any): void {\n if (!layer || typeof layer.on !== \"function\") return;\n const handleContext = (evt: any) => {\n try {\n evt?.originalEvent?.preventDefault?.();\n evt?.originalEvent?.stopPropagation?.();\n } catch {\n // Ignore errors when preventing default context menu behavior\n }\n this.openVertexMenu(layer, evt);\n };\n const handleClick = (evt: any) => {\n const oe = evt?.originalEvent;\n if (oe && (oe.ctrlKey || oe.metaKey)) {\n this.openVertexMenu(layer, evt);\n }\n };\n try {\n layer.on(\"contextmenu\", handleContext);\n layer.on(\"click\", handleClick);\n } catch {\n // Ignore errors when attaching event handlers to the layer\n }\n }\n\n private openVertexMenu(layer: any, evt: any): void {\n try {\n if (!this.map) return;\n // Only for Polygon/Polyline-like layers\n const isPoly =\n typeof layer.getLatLngs === \"function\" &&\n (layer instanceof (this.L as any).Polygon ||\n layer instanceof (this.L as any).Polyline);\n if (!isPoly) return;\n\n // Only when editing is enabled on the layer (avoid accidental deletes)\n const editing = (layer as any).editing;\n if (\n !editing ||\n typeof editing.enabled !== \"function\" ||\n !editing.enabled()\n )\n return;\n\n const latlng = evt?.latlng;\n const containerPt = this.map.latLngToContainerPoint(latlng);\n\n const nearest = this.findNearestVertex(layer, latlng, 12); // 12px tolerance\n if (!nearest) return;\n\n this.showVertexMenu(containerPt, async () => {\n await this.deleteVertex(layer, nearest.pathIndex, nearest.vertexIndex);\n });\n } catch (err) {\n this._error(\"openVertexMenu\", err);\n }\n }\n\n private showVertexMenu(pt: any, onDelete: () => void): void {\n try {\n // Cleanup existing\n try {\n this.vertexMenuCleanup?.();\n } catch {\n // Ignore errors when cleaning up previous vertex menu\n }\n this.vertexMenuCleanup = null;\n if (!this.container) return;\n\n const menu = document.createElement(\"div\");\n menu.style.position = \"absolute\";\n menu.style.top = `${pt.y}px`;\n menu.style.left = `${pt.x}px`;\n menu.style.transform = \"translate(-50%, -100%)\";\n menu.style.background = \"#fff\";\n menu.style.border = \"1px solid rgba(0,0,0,0.15)\";\n menu.style.borderRadius = \"6px\";\n menu.style.boxShadow = \"0 4px 12px rgba(0,0,0,0.15)\";\n menu.style.padding = \"6px\";\n menu.style.zIndex = \"10000\";\n menu.style.fontSize = \"12px\";\n menu.style.userSelect = \"none\";\n\n const btn = document.createElement(\"button\");\n btn.textContent = \"Delete vertex\";\n btn.style.padding = \"6px 10px\";\n btn.style.border = \"none\";\n btn.style.background = \"#da1e28\";\n btn.style.color = \"#fff\";\n btn.style.borderRadius = \"4px\";\n btn.style.cursor = \"pointer\";\n btn.addEventListener(\"click\", (e) => {\n e.stopPropagation();\n e.preventDefault();\n try {\n onDelete();\n } finally {\n cleanup();\n }\n });\n menu.appendChild(btn);\n\n const cleanup = () => {\n try {\n window.removeEventListener(\"pointerdown\", onDoc);\n this.container.removeEventListener(\"scroll\", cleanup, true);\n menu.remove();\n } catch {\n // Ignore errors during menu cleanup operations\n }\n this.vertexMenuEl = null;\n this.vertexMenuCleanup = null;\n };\n\n const onDoc = (e: any) => {\n // Close if clicking elsewhere\n if (!menu.contains(e.target)) cleanup();\n };\n\n window.addEventListener(\"pointerdown\", onDoc, { capture: true });\n this.container.addEventListener(\"scroll\", cleanup, true);\n this.container.appendChild(menu);\n this.vertexMenuEl = menu;\n this.vertexMenuCleanup = cleanup;\n } catch (err) {\n this._error(\"showVertexMenu\", err);\n }\n }\n\n private findNearestVertex(\n layer: any,\n latlng: BundledL.LatLng,\n tolerancePx: number,\n ): { pathIndex: number; vertexIndex: number } | null {\n if (!this.map) return null;\n const llToPoint = (ll: BundledL.LatLng) =>\n this.map!.latLngToContainerPoint(ll);\n const dist = (a: any, b: any) => Math.hypot(a.x - b.x, a.y - b.y);\n const targetPt = llToPoint(latlng);\n\n let bestD = Infinity;\n let bestPath = -1;\n let bestVertex = -1;\n const latlngs: any = layer.getLatLngs();\n // Normalize: Polyline -> LatLng[], Polygon -> LatLng[][] (rings)\n const paths: BundledL.LatLng[][] = Array.isArray(latlngs[0])\n ? (latlngs as BundledL.LatLng[][])\n : [latlngs as BundledL.LatLng[]];\n\n paths.forEach((path, pathIndex) => {\n path.forEach((v, vertexIndex) => {\n const p = llToPoint(v);\n const d = dist(p, targetPt);\n if (d < bestD) {\n bestD = d;\n bestPath = pathIndex;\n bestVertex = vertexIndex;\n }\n });\n });\n\n if (bestPath === -1 || bestD > tolerancePx) return null;\n return { pathIndex: bestPath, vertexIndex: bestVertex };\n }\n\n private async deleteVertex(\n layer: any,\n pathIndex: number,\n vertexIndex: number,\n ): Promise<void> {\n try {\n // Only for polygon/polyline\n const isPoly =\n typeof layer.getLatLngs === \"function\" &&\n (layer instanceof (this.L as any).Polygon ||\n layer instanceof (this.L as any).Polyline);\n if (!isPoly) return;\n\n const latlngs: any = layer.getLatLngs();\n const paths: BundledL.LatLng[][] = Array.isArray(latlngs[0])\n ? (latlngs as BundledL.LatLng[][])\n : [latlngs as BundledL.LatLng[]];\n const path = paths[pathIndex];\n if (!path) return;\n\n // Enforce minimal vertices: polygon needs >= 3, polyline >= 2\n const isPolygon = layer instanceof (this.L as any).Polygon;\n const minVerts = isPolygon ? 3 : 2;\n if (path.length <= minVerts) return;\n\n path.splice(vertexIndex, 1);\n // Apply back\n if (paths.length === 1) {\n layer.setLatLngs(path);\n } else {\n const newPaths = paths.map((p, i) => (i === pathIndex ? path : p));\n layer.setLatLngs(newPaths as any);\n }\n layer.redraw?.();\n\n // Update store + emit edited callback\n const fid = (layer as any)._fid as string | undefined;\n if (fid) {\n const feat = layer.toGeoJSON() as Feature;\n this.store.update(fid, feat);\n this.options.callbacks?.onEdited?.({\n ids: [fid],\n geoJSON: this.store.toFeatureCollection(),\n });\n }\n } catch (err) {\n this._error(\"deleteVertex\", err);\n }\n }\n\n // -------- Move tool Save/Cancel UI --------\n\n private showMoveConfirmationUI(\n layer: any,\n originalGeoJSON: GeoJSON.Feature,\n newGeoJSON: GeoJSON.Feature,\n ): void {\n try {\n // Clean up any existing UI\n this.hideMoveConfirmationUI();\n\n if (!this.container || !this.map) return;\n\n // Get the move handler from the draw control\n const drawControl = this.drawControl;\n if (!drawControl) return;\n\n const drawToolbar = (drawControl as any)?._toolbars?.draw;\n if (!drawToolbar) return;\n\n // Find the move handler\n const handlers = drawToolbar._modes || {};\n let moveHandler: any = null;\n for (const key in handlers) {\n const mode = handlers[key];\n if (mode?.handler?.type === \"move\") {\n moveHandler = mode.handler;\n break;\n }\n }\n\n this.activeMoveHandler = moveHandler;\n\n // Create a floating UI with Save and Cancel buttons\n const ui = document.createElement(\"div\");\n ui.style.position = \"absolute\";\n ui.style.bottom = \"60px\";\n ui.style.left = \"50%\";\n ui.style.transform = \"translateX(-50%)\";\n ui.style.display = \"flex\";\n ui.style.gap = \"8px\";\n ui.style.background = \"#fff\";\n ui.style.border = \"2px solid #3388ff\";\n ui.style.borderRadius = \"8px\";\n ui.style.padding = \"12px 16px\";\n ui.style.boxShadow = \"0 4px 12px rgba(0,0,0,0.2)\";\n ui.style.zIndex = \"10000\";\n ui.style.fontSize = \"14px\";\n ui.style.fontFamily = \"system-ui, sans-serif\";\n\n const saveBtn = document.createElement(\"button\");\n saveBtn.textContent = \"✓ Save\";\n saveBtn.style.padding = \"8px 16px\";\n saveBtn.style.border = \"none\";\n saveBtn.style.background = \"#28a745\";\n saveBtn.style.color = \"#fff\";\n saveBtn.style.borderRadius = \"4px\";\n saveBtn.style.cursor = \"pointer\";\n saveBtn.style.fontWeight = \"600\";\n saveBtn.style.fontSize = \"14px\";\n saveBtn.addEventListener(\"click\", (e) => {\n e.stopPropagation();\n e.preventDefault();\n if (moveHandler?.confirmMove) {\n moveHandler.confirmMove();\n }\n });\n\n const cancelBtn = document.createElement(\"button\");\n cancelBtn.textContent = \"✕ Cancel\";\n cancelBtn.style.padding = \"8px 16px\";\n cancelBtn.style.border = \"1px solid #ccc\";\n cancelBtn.style.background = \"#fff\";\n cancelBtn.style.color = \"#333\";\n cancelBtn.style.borderRadius = \"4px\";\n cancelBtn.style.cursor = \"pointer\";\n cancelBtn.style.fontWeight = \"600\";\n cancelBtn.style.fontSize = \"14px\";\n cancelBtn.addEventListener(\"click\", (e) => {\n e.stopPropagation();\n e.preventDefault();\n if (moveHandler?.cancelMove) {\n moveHandler.cancelMove();\n }\n this.hideMoveConfirmationUI();\n });\n\n ui.appendChild(saveBtn);\n ui.appendChild(cancelBtn);\n\n this.container.appendChild(ui);\n this.moveConfirmationUI = ui;\n\n this.logger.debug(\"showMoveConfirmationUI\", {\n layerId: (layer as any)._fid,\n });\n } catch (err) {\n this._error(\"showMoveConfirmationUI\", err);\n }\n }\n\n private hideMoveConfirmationUI(): void {\n try {\n if (this.moveConfirmationUI) {\n this.moveConfirmationUI.remove();\n this.moveConfirmationUI = null;\n }\n this.activeMoveHandler = null;\n } catch (err) {\n this._error(\"hideMoveConfirmationUI\", err);\n }\n }\n}\n","import type { Feature, FeatureCollection } from \"geojson\";\nimport type {\n LeafletDrawMapElementAPI,\n MapConfig,\n DrawControlsConfig,\n MeasurementSystem,\n} from \"@src/types/public\";\nimport { createLogger, type Logger, type LogLevel } from \"@src/utils/logger\";\nimport { applyLeafletStylingIfNeeded } from \"@src/lib/leaflet-assets\";\nimport { MapController } from \"@src/lib/MapController\";\nimport type * as LeafletNS from \"leaflet\";\n\nexport class LeafletDrawMapElement\n extends HTMLElement\n implements LeafletDrawMapElementAPI\n{\n // Shadow DOM and container references\n private _root: ShadowRoot;\n private _container: HTMLDivElement;\n\n // Logging\n private _logger: Logger = createLogger(\"component:leaflet-geokit\", \"debug\");\n\n // Internal state mirrors for attributes/properties\n private _latitude = 0;\n private _longitude = 0;\n private _zoom = 2;\n private _minZoom?: number;\n private _maxZoom?: number;\n private _tileUrl = \"https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png\";\n private _tileAttribution?: string;\n private _readOnly = false;\n private _logLevel: LogLevel = \"debug\";\n private _devOverlay = false;\n private _polygonAllowIntersection = false;\n private _preferCanvas = true; // Default to Canvas for performance\n\n // Theming\n private _themeUrl?: string;\n private _themeCss = \"\";\n private _themeLinkEl: HTMLLinkElement | null = null;\n private _themeStyleEl: HTMLStyleElement | null = null;\n\n // Controller\n private _controller: MapController | null = null;\n\n // External Leaflet configuration\n private _useExternalLeaflet = false;\n private _skipLeafletStyles = false;\n private _leafletInstance: typeof LeafletNS | undefined;\n\n constructor() {\n super();\n this._root = this.attachShadow({ mode: \"open\" });\n\n // Basic internal styles and map container; real CSS injection will be added in controller milestone\n this._root.innerHTML = `\n <style>\n :host {\n display: block;\n contain: content;\n }\n .map-container {\n width: 100%;\n height: 100%;\n position: relative;\n }\n </style>\n <div class=\"map-container\" part=\"map\"></div>\n `;\n\n const container = this._root.querySelector(\".map-container\");\n if (!(container instanceof HTMLDivElement)) {\n throw new Error(\"Failed to initialize map container\");\n }\n this._container = container;\n\n // Initialize logger level from attribute if present\n const ll = this.getAttribute(\"log-level\") as LogLevel | null;\n if (ll) {\n this._logLevel = ll;\n this._logger.setLevel(ll);\n }\n }\n\n // Build DrawControlsConfig from boolean attributes\n private _controlsFromAttributes(): DrawControlsConfig {\n return {\n polygon: this.hasAttribute(\"draw-polygon\"),\n polyline: this.hasAttribute(\"draw-polyline\"),\n rectangle: this.hasAttribute(\"draw-rectangle\"),\n circle: this.hasAttribute(\"draw-circle\"),\n cake: this.hasAttribute(\"draw-layer-cake\"),\n marker: this.hasAttribute(\"draw-marker\"),\n move: this.hasAttribute(\"draw-move\"),\n edit: this.hasAttribute(\"edit-features\"),\n delete: this.hasAttribute(\"delete-features\"),\n ruler: this.hasAttribute(\"draw-ruler\"),\n };\n }\n\n private _mapConfig(): MapConfig {\n return {\n latitude: this._latitude,\n longitude: this._longitude,\n zoom: this._zoom,\n minZoom: this._minZoom,\n maxZoom: this._maxZoom,\n tileUrl: this._tileUrl,\n tileAttribution: this._tileAttribution,\n readOnly: this._readOnly,\n fitToDataOnLoad: false,\n logLevel: this._logLevel,\n devOverlay: this._devOverlay,\n polygonAllowIntersection: this._polygonAllowIntersection,\n preferCanvas: this._preferCanvas,\n useExternalLeaflet: this._useExternalLeaflet,\n skipLeafletStyles: this._skipLeafletStyles,\n };\n }\n\n // Lifecycle\n async connectedCallback(): Promise<void> {\n this._logger.debug(\"connectedCallback\", this._currentConfig());\n // Inject Leaflet CSS/icons unless skipped\n applyLeafletStylingIfNeeded({\n root: this._root,\n skipStyles: this._skipLeafletStyles,\n });\n\n this._applyThemeStyles();\n\n // Initialize controller\n this._controller = new MapController({\n container: this._container,\n map: this._mapConfig(),\n controls: this._controlsFromAttributes(),\n readOnly: this._readOnly,\n logger: this._logger.child(\"controller\"),\n callbacks: {\n onReady: (detail) => {\n this.dispatchEvent(new CustomEvent(\"leaflet-draw:ready\", { detail }));\n },\n onCreated: (detail) => {\n this.dispatchEvent(\n new CustomEvent(\"leaflet-draw:created\", { detail }),\n );\n },\n onEdited: (detail) => {\n this.dispatchEvent(\n new CustomEvent(\"leaflet-draw:edited\", { detail }),\n );\n },\n onDeleted: (detail) => {\n this.dispatchEvent(\n new CustomEvent(\"leaflet-draw:deleted\", { detail }),\n );\n },\n onError: (detail) => {\n this.dispatchEvent(new CustomEvent(\"leaflet-draw:error\", { detail }));\n },\n },\n leaflet: this._leafletInstance ?? undefined,\n useExternalLeaflet: this._useExternalLeaflet,\n });\n\n await this._controller.init();\n }\n\n async disconnectedCallback(): Promise<void> {\n this._logger.debug(\"disconnectedCallback\");\n if (this._controller) {\n await this._controller.destroy();\n this._controller = null;\n }\n }\n // Observed attributes and reflection\n static get observedAttributes(): string[] {\n return [\n \"latitude\",\n \"longitude\",\n \"zoom\",\n \"min-zoom\",\n \"max-zoom\",\n \"tile-url\",\n \"tile-attribution\",\n \"read-only\",\n \"log-level\",\n \"dev-overlay\",\n \"prefer-canvas\",\n \"use-external-leaflet\",\n \"skip-leaflet-styles\",\n \"theme-url\",\n // draw controls\n \"draw-polygon\",\n \"draw-polyline\",\n \"draw-rectangle\",\n \"draw-circle\",\n \"draw-layer-cake\",\n \"draw-marker\",\n \"draw-move\",\n \"draw-ruler\",\n \"edit-features\",\n \"delete-features\",\n \"polygon-allow-intersection\",\n ];\n }\n\n attributeChangedCallback(\n name: string,\n _old: string | null,\n value: string | null,\n ): void {\n this._logger.debug(\"attributeChanged\", { name, value });\n\n switch (name) {\n case \"latitude\":\n this._latitude = this._coerceNumber(value, 0);\n break;\n case \"longitude\":\n this._longitude = this._coerceNumber(value, 0);\n break;\n case \"zoom\":\n this._zoom = this._coerceNumber(value, 2);\n break;\n case \"min-zoom\":\n this._minZoom = value != null ? this._coerceNumber(value) : undefined;\n break;\n case \"max-zoom\":\n this._maxZoom = value != null ? this._coerceNumber(value) : undefined;\n break;\n case \"tile-url\":\n this._tileUrl = value ?? this._tileUrl;\n break;\n case \"tile-attribution\":\n this._tileAttribution = value ?? undefined;\n break;\n case \"theme-url\":\n this._themeUrl = value ?? undefined;\n if (this.isConnected) {\n this._applyThemeStyles();\n }\n break;\n case \"read-only\":\n this._readOnly = value !== null;\n break;\n case \"log-level\":\n this._logLevel = (value as LogLevel) ?? this._logLevel;\n this._logger.setLevel(this._logLevel);\n break;\n case \"dev-overlay\":\n this._devOverlay = value !== null;\n break;\n case \"polygon-allow-intersection\":\n this._polygonAllowIntersection = value !== null;\n break;\n case \"prefer-canvas\":\n this._preferCanvas = value !== null;\n break;\n case \"use-external-leaflet\":\n this._useExternalLeaflet = value !== null;\n break;\n case \"skip-leaflet-styles\":\n this._skipLeafletStyles = value !== null;\n break;\n default:\n break;\n }\n\n // If controller exists, propagate relevant changes\n if (this._controller) {\n if (name === \"latitude\" || name === \"longitude\" || name === \"zoom\") {\n // Update view without full re-init\n void this._controller.setView(\n this._latitude,\n this._longitude,\n this._zoom,\n );\n } else if (\n name === \"tile-url\" ||\n name === \"tile-attribution\" ||\n name === \"min-zoom\" ||\n name === \"max-zoom\" ||\n name === \"read-only\" ||\n name === \"dev-overlay\" ||\n name === \"log-level\" ||\n name === \"prefer-canvas\" ||\n name === \"use-external-leaflet\" ||\n name === \"skip-leaflet-styles\" ||\n name.startsWith(\"draw-\") ||\n name === \"edit-features\" ||\n name === \"delete-features\"\n ) {\n // For now, re-init controller to apply structural changes\n void this._controller.destroy().then(() => this._controller!.init());\n }\n }\n }\n\n // Properties (reflect attributes)\n get latitude(): number {\n return this._latitude;\n }\n set latitude(v: number) {\n this._latitude = Number(v);\n this._reflect(\"latitude\", String(this._latitude));\n }\n\n get longitude(): number {\n return this._longitude;\n }\n set longitude(v: number) {\n this._longitude = Number(v);\n this._reflect(\"longitude\", String(this._longitude));\n }\n\n get zoom(): number {\n return this._zoom;\n }\n set zoom(v: number) {\n this._zoom = Number(v);\n this._reflect(\"zoom\", String(this._zoom));\n }\n\n get minZoom(): number | undefined {\n return this._minZoom;\n }\n set minZoom(v: number | undefined) {\n this._minZoom = v;\n this._reflect(\"min-zoom\", v != null ? String(v) : null);\n }\n\n get maxZoom(): number | undefined {\n return this._maxZoom;\n }\n set maxZoom(v: number | undefined) {\n this._maxZoom = v;\n this._reflect(\"max-zoom\", v != null ? String(v) : null);\n }\n\n get tileUrl(): string {\n return this._tileUrl;\n }\n set tileUrl(v: string) {\n this._tileUrl = v;\n this._reflect(\"tile-url\", v);\n }\n\n get tileAttribution(): string | undefined {\n return this._tileAttribution;\n }\n set tileAttribution(v: string | undefined) {\n this._tileAttribution = v;\n this._reflect(\"tile-attribution\", v ?? null);\n }\n\n get readOnly(): boolean {\n return this._readOnly;\n }\n set readOnly(v: boolean) {\n this._readOnly = Boolean(v);\n this._booleanReflect(\"read-only\", this._readOnly);\n }\n\n get logLevel(): LogLevel {\n return this._logLevel;\n }\n set logLevel(v: LogLevel) {\n this._logLevel = v;\n this._logger.setLevel(v);\n this._reflect(\"log-level\", v);\n }\n\n get devOverlay(): boolean {\n return this._devOverlay;\n }\n set devOverlay(v: boolean) {\n this._devOverlay = Boolean(v);\n this._booleanReflect(\"dev-overlay\", this._devOverlay);\n }\n\n get preferCanvas(): boolean {\n return this._preferCanvas;\n }\n set preferCanvas(v: boolean) {\n this._preferCanvas = Boolean(v);\n this._booleanReflect(\"prefer-canvas\", this._preferCanvas);\n }\n\n get useExternalLeaflet(): boolean {\n return this._useExternalLeaflet;\n }\n set useExternalLeaflet(v: boolean) {\n this._useExternalLeaflet = Boolean(v);\n this._booleanReflect(\"use-external-leaflet\", this._useExternalLeaflet);\n }\n\n get skipLeafletStyles(): boolean {\n return this._skipLeafletStyles;\n }\n set skipLeafletStyles(v: boolean) {\n this._skipLeafletStyles = Boolean(v);\n this._booleanReflect(\"skip-leaflet-styles\", this._skipLeafletStyles);\n }\n\n get leafletInstance(): typeof LeafletNS | undefined {\n return this._leafletInstance;\n }\n set leafletInstance(v: typeof LeafletNS | undefined) {\n this._leafletInstance = v;\n }\n\n get themeCss(): string {\n return this._themeCss;\n }\n set themeCss(v: string) {\n this._themeCss = typeof v === \"string\" ? v : \"\";\n if (this.isConnected) {\n this._applyThemeStyles();\n }\n }\n\n // Public API methods (delegating to controller)\n async getGeoJSON(): Promise<FeatureCollection> {\n this._logger.debug(\"getGeoJSON\");\n if (!this._controller) return { type: \"FeatureCollection\", features: [] };\n return this._controller.getGeoJSON();\n }\n\n async loadGeoJSON(fc: FeatureCollection): Promise<void> {\n this._logger.debug(\"loadGeoJSON\", { features: fc?.features?.length ?? 0 });\n if (!this._controller) return;\n const detail = { fc, mode: \"load\" as const };\n this.dispatchEvent(new CustomEvent(\"leaflet-draw:ingest\", { detail }));\n const finalFc =\n detail.fc && detail.fc.type === \"FeatureCollection\" ? detail.fc : fc;\n await this._controller.loadGeoJSON(finalFc, false);\n }\n\n async clearLayers(): Promise<void> {\n this._logger.debug(\"clearLayers\");\n if (!this._controller) return;\n await this._controller.clearLayers();\n }\n\n async addFeatures(fc: FeatureCollection): Promise<string[]> {\n this._logger.debug(\"addFeatures\", { count: fc?.features?.length ?? 0 });\n if (!this._controller) return [];\n const detail = { fc, mode: \"add\" as const };\n this.dispatchEvent(new CustomEvent(\"leaflet-draw:ingest\", { detail }));\n const finalFc =\n detail.fc && detail.fc.type === \"FeatureCollection\" ? detail.fc : fc;\n return this._controller.addFeatures(finalFc);\n }\n\n async updateFeature(id: string, feature: Feature): Promise<void> {\n this._logger.debug(\"updateFeature\", { id });\n if (!this._controller) return;\n await this._controller.updateFeature(id, feature);\n }\n\n async removeFeature(id: string): Promise<void> {\n this._logger.debug(\"removeFeature\", { id });\n if (!this._controller) return;\n await this._controller.removeFeature(id);\n }\n\n async fitBoundsToData(padding?: number): Promise<void> {\n this._logger.debug(\"fitBoundsToData\", { padding });\n if (!this._controller) return;\n await this._controller.fitBoundsToData(\n typeof padding === \"number\" ? padding : 0.05,\n );\n }\n\n async fitBounds(\n bounds: [[number, number], [number, number]],\n padding?: number,\n ): Promise<void> {\n this._logger.debug(\"fitBounds\", { bounds, padding });\n if (!this._controller) return;\n await this._controller.fitBounds(\n bounds,\n typeof padding === \"number\" ? padding : 0.05,\n );\n }\n\n async setView(lat: number, lng: number, zoom?: number): Promise<void> {\n this._logger.debug(\"setView\", { lat, lng, zoom });\n // Reflect properties to maintain consistency\n this.latitude = lat;\n this.longitude = lng;\n if (typeof zoom === \"number\") this.zoom = zoom;\n if (this._controller) {\n await this._controller.setView(lat, lng, zoom);\n }\n }\n\n async exportGeoJSON(): Promise<FeatureCollection> {\n this._logger.debug(\"exportGeoJSON\");\n if (!this._controller) return { type: \"FeatureCollection\", features: [] };\n const fc = await this._controller.getGeoJSON();\n const detail = { geoJSON: fc, featureCount: fc.features.length };\n this.dispatchEvent(new CustomEvent(\"leaflet-draw:export\", { detail }));\n return fc;\n }\n\n /**\n * Merge all visible polygon layers into a single polygon.\n * This removes the original polygon features and adds a new merged feature.\n *\n * @param options Optional configuration for the merge operation\n * @returns Promise resolving to the ID of the newly created merged feature, or null if no polygons to merge\n */\n async mergePolygons(options?: {\n properties?: Record<string, any>;\n }): Promise<string | null> {\n this._logger.debug(\"mergePolygons\");\n if (!this._controller) return null;\n\n // Get current state before merge for event detail\n const preState = await this._controller.getGeoJSON();\n const preCount = preState.features.length;\n\n // Perform the merge operation\n const newFeatureId = await this._controller.mergeVisiblePolygons(options);\n\n if (newFeatureId) {\n // Get state after merge to provide in the event\n const postState = await this._controller.getGeoJSON();\n const detail = {\n id: newFeatureId,\n mergedFeatureCount: preCount - postState.features.length + 1,\n geoJSON: postState,\n };\n\n // Dispatch event to notify listeners\n this.dispatchEvent(new CustomEvent(\"leaflet-draw:merged\", { detail }));\n }\n\n return newFeatureId;\n }\n\n async setMeasurementUnits(system: MeasurementSystem): Promise<void> {\n this._logger.debug(\"setMeasurementUnits\", { system });\n if (!this._controller) return;\n this._controller.setRulerUnits(system);\n }\n\n async loadGeoJSONFromUrl(url: string): Promise<void> {\n this._logger.debug(\"loadGeoJSONFromUrl\", { url });\n if (!this._controller) return;\n const res = await fetch(url, { headers: { Accept: \"application/json\" } });\n if (!res.ok) {\n const err = new Error(\n `Failed to fetch GeoJSON from ${url}: ${res.status} ${res.statusText}`,\n );\n this.dispatchEvent(\n new CustomEvent(\"leaflet-draw:error\", {\n detail: { message: err.message, cause: err },\n }),\n );\n throw err;\n }\n const data = await res.json();\n const detail = { fc: data, mode: \"load\" as const };\n this.dispatchEvent(new CustomEvent(\"leaflet-draw:ingest\", { detail }));\n const finalFc =\n detail.fc && detail.fc.type === \"FeatureCollection\" ? detail.fc : data;\n await this._controller.loadGeoJSON(finalFc, true);\n }\n\n async loadGeoJSONFromText(text: string): Promise<void> {\n this._logger.debug(\"loadGeoJSONFromText\", { length: text?.length ?? 0 });\n if (!this._controller) return;\n let data: FeatureCollection;\n try {\n data = JSON.parse(text);\n } catch (cause) {\n const err = new Error(\"Failed to parse GeoJSON text\");\n this.dispatchEvent(\n new CustomEvent(\"leaflet-draw:error\", {\n detail: { message: err.message, cause },\n }),\n );\n throw err;\n }\n const detail = { fc: data, mode: \"load\" as const };\n this.dispatchEvent(new CustomEvent(\"leaflet-draw:ingest\", { detail }));\n const finalFc =\n detail.fc && detail.fc.type === \"FeatureCollection\" ? detail.fc : data;\n await this._controller.loadGeoJSON(finalFc, true);\n }\n // Helpers\n private _currentConfig(): MapConfig {\n return {\n latitude: this._latitude,\n longitude: this._longitude,\n zoom: this._zoom,\n minZoom: this._minZoom,\n maxZoom: this._maxZoom,\n tileUrl: this._tileUrl,\n tileAttribution: this._tileAttribution,\n readOnly: this._readOnly,\n fitToDataOnLoad: false,\n logLevel: this._logLevel,\n devOverlay: this._devOverlay,\n polygonAllowIntersection: this._polygonAllowIntersection,\n preferCanvas: this._preferCanvas,\n useExternalLeaflet: this._useExternalLeaflet,\n skipLeafletStyles: this._skipLeafletStyles,\n };\n }\n\n private _applyThemeStyles(): void {\n const themeUrl = this._themeUrl?.trim();\n if (themeUrl) {\n if (!this._themeLinkEl) {\n const link = document.createElement(\"link\");\n link.setAttribute(\"rel\", \"stylesheet\");\n link.setAttribute(\"data-geokit-theme-url\", \"true\");\n this._root.appendChild(link);\n this._themeLinkEl = link;\n }\n if (this._themeLinkEl.getAttribute(\"href\") !== themeUrl) {\n this._themeLinkEl.setAttribute(\"href\", themeUrl);\n }\n } else if (this._themeLinkEl) {\n this._themeLinkEl.remove();\n this._themeLinkEl = null;\n }\n\n const themeCss = this._themeCss;\n if (themeCss.trim().length > 0) {\n if (!this._themeStyleEl) {\n const style = document.createElement(\"style\");\n style.setAttribute(\"data-geokit-theme-css\", \"true\");\n this._root.appendChild(style);\n this._themeStyleEl = style;\n }\n if (this._themeStyleEl.textContent !== themeCss) {\n this._themeStyleEl.textContent = themeCss;\n }\n } else if (this._themeStyleEl) {\n this._themeStyleEl.remove();\n this._themeStyleEl = null;\n }\n }\n\n private _reflect(name: string, value: string | null): void {\n if (value === null) {\n this.removeAttribute(name);\n } else {\n if (this.getAttribute(name) !== value) {\n this.setAttribute(name, value);\n }\n }\n }\n\n private _booleanReflect(name: string, present: boolean): void {\n if (present) {\n if (!this.hasAttribute(name)) this.setAttribute(name, \"\");\n } else {\n if (this.hasAttribute(name)) this.removeAttribute(name);\n }\n }\n\n private _coerceNumber(v: string | null, fallback?: number): number {\n if (v == null) return fallback ?? NaN;\n const n = Number(v);\n return Number.isFinite(n) ? n : (fallback ?? NaN);\n }\n}\n","import type { Feature, FeatureCollection } from \"geojson\";\n\n/**\n * Details for the 'leaflet-draw:ready' event.\n * bounds: optional southwest/northeast LatLng pairs.\n */\nexport interface ReadyEventDetail {\n bounds?: [[number, number], [number, number]];\n}\n\n/**\n * Details for the 'leaflet-draw:created' event.\n * id: the stable feature id assigned by the FeatureStore.\n */\nexport interface CreatedEventDetail {\n id: string;\n layerType: \"polygon\" | \"polyline\" | \"rectangle\" | \"circle\" | \"marker\";\n geoJSON: Feature;\n}\n\n/**\n * Details for the 'leaflet-draw:edited' event.\n * ids: array of feature ids that were edited.\n */\nexport interface EditedEventDetail {\n ids: string[];\n geoJSON: FeatureCollection;\n}\n\n/**\n * Details for the 'leaflet-draw:deleted' event.\n * ids: array of feature ids that were deleted.\n */\nexport interface DeletedEventDetail {\n ids: string[];\n geoJSON: FeatureCollection;\n}\n\n/**\n * Details for error events emitted as 'leaflet-draw:error'.\n */\nexport interface ErrorEventDetail {\n message: string;\n cause?: unknown;\n}\n\n/**\n * Details for 'leaflet-draw:ingest' event. Fired before data is added to the map.\n * Listeners may mutate detail.fc to transform incoming data (e.g., flatten MultiPolygon).\n */\nexport interface IngestEventDetail {\n fc: FeatureCollection;\n mode: \"load\" | \"add\";\n}\n\n/**\n * Details for 'leaflet-draw:export' event.\n */\nexport interface ExportEventDetail {\n geoJSON: FeatureCollection;\n featureCount: number;\n}\n\n/**\n * Event name constants for convenience (non-enforced).\n */\nexport const DrawEvent = {\n Ready: \"leaflet-draw:ready\",\n Created: \"leaflet-draw:created\",\n Edited: \"leaflet-draw:edited\",\n Deleted: \"leaflet-draw:deleted\",\n Error: \"leaflet-draw:error\",\n Ingest: \"leaflet-draw:ingest\",\n Export: \"leaflet-draw:export\",\n DrawStart: \"leaflet-draw:drawstart\",\n DrawStop: \"leaflet-draw:drawstop\",\n EditStart: \"leaflet-draw:editstart\",\n EditStop: \"leaflet-draw:editstop\",\n} as const;\n","import { LeafletDrawMapElement } from \"@src/components/LeafletDrawMapElement\";\n\nconst CANONICAL_TAG_NAME = \"leaflet-geokit\";\nif (!customElements.get(CANONICAL_TAG_NAME)) {\n customElements.define(CANONICAL_TAG_NAME, LeafletDrawMapElement);\n}\n\nconst LEGACY_TAG_NAME = \"leaflet-draw-map\";\nif (!customElements.get(LEGACY_TAG_NAME)) {\n class LeafletDrawMapElementLegacy extends LeafletDrawMapElement {}\n customElements.define(LEGACY_TAG_NAME, LeafletDrawMapElementLegacy);\n}\n\nexport { LeafletDrawMapElement };\nexport * from \"@src/types/public\";\nexport * from \"@src/types/events\";\n"],"names":["levelWeight","shouldLog","current","msgLevel","nowISO","createLogger","name","level","sink","currentLevel","base","lvl","args","prefix","method","childName","iconRetinaUrl","iconUrl","shadowUrl","cogIconUrl","layerCakeIconUrl","rulerIconUrl","rulerIconColoredUrl","injectLeafletStyles","root","marker","style","leafletCSS","leafletDrawCSS","leafletRulerCSS","injectLeafletCustomStyles","configureLeafletDefaultIcons","_b","_a","L","applyLeafletStylingIfNeeded","options","skipStyles","getRandomValues","rnds8","rng","byteToHex","i","unsafeStringify","arr","offset","randomUUID","native","v4","buf","rnds","normalizeId","feature","id","eachCoord","geom","cb","walk","g","c","ring","poly","child","bboxOfFeature","minLng","minLat","maxLng","maxLat","seen","coord","lng","lat","bboxOfFeatureCollection","fc","f","b","bboxToBoundsPair","expandMultiGeometries","out","baseProps","line","pt","isPolygon","geometry","isMultiPolygon","extractPolygonCoordinates","mergePolygons","features","properties","allPolygons","coords","FeatureStore","logger","__publicField","ids","t0","stored","elapsed","_d","_c","updated","count","existing","uuidv4","patchedNamespaces","registerLayerCakeTool","Lns","DrawToolbarCtor","originalGetModeHandlers","map","modes","CakeCtor","MoveCtor","_DrawCake","tooltip","DrawCake","ensureDrawCakeRegistered","DrawNs","_RuntimeDrawCake","RuntimeDrawCake","_DrawMove","layer","element","selectedLayer","originalGeoJSON","newLatLng","newLatLngs","latLngs","ll","DrawMove","ensureDrawMoveRegistered","_RuntimeDrawMove","e","RuntimeDrawMove","EARTH_RADIUS_METERS","toRadians","deg","toDegrees","rad","destinationPoint","center","distanceMeters","bearingDegrees","angularDistance","bearing","lat1","lon1","sinLat1","cosLat1","sinAngular","cosAngular","sinLat2","lat2","y","x","lon2","signedRingArea","sum","x1","y1","x2","y2","ensureClosedRing","first","last","ensureWinding","clockwise","closed","reversed","circleToRing","radiusMeters","steps","pts","p","bakeCoreFeature","layerIndex","outer","bakeRingFeature","radiusOuterMeters","radiusInnerMeters","inner","bakeLayerCake","circles","sorted","a","circle","index","prevRadiusMeters","stopEvent","bindCakeControls","addButtonId","saveButtonId","onAddRing","onSave","addBtn","saveBtn","boundKey","el","ensureCircleEditable","formatDistance","meters","system","feet","LayerCakeManager","initialCircle","measurementSystem","anyL","EDITMOVE","EDITRESIZE","EDITSTART","_f","_e","EDITSTOP","_h","_g","onMove","onResize","onEditStart","onEditStop","editing","largest","newRadius","newCircle","geojson","prev","sourceCircle","newCenter","activeCircle","currentRadius","labelText","smallerCircles","innerNeighbor","curr","delta","deltaStr","westPoint","anchor","addId","saveId","uiIcon","fn","l","layerCakeIconSvg","moveToolIconSvg","WGS84_A","WGS84_B","WGS84_F","DEG_TO_RAD","RAD_TO_DEG","MAGIC_SCALE","toPrecise","value","scaled","normalizeBearing","magicRound","computePreciseDistance","vincenty","vincentyDistance","karney","karneyDistance","phi1","phi2","U1","U2","sinU1","cosU1","sinU2","cosU2","lambda","lambdaPrev","iterations","MAX","sinSigma","cosSigma","sigma","cosSqAlpha","cos2SigmaM","sinLambda","cosLambda","sinAlpha","C","uSq","A","B","deltaSigma","s","BASE_OPTIONS","METRIC_LENGTH","IMPERIAL_LENGTH","getRulerOptions","lengthUnit","measurementSystemDescriptions","assertDrawPresent","opts","hasControlDraw","hasDrawNamespace","ok","rulerPrecisionPatched","MapController","BundledL","globalL","latitude","longitude","zoom","minZoom","maxZoom","tileUrl","tileAttribution","preferCanvas","useExternalLeaflet","message","drawOptions","DrawCtor","err","fitToData","normalized","layers","paddingRatio","boundsLiteral","bounds","sw","ne","latPad","lngPad","padded","boundsTuple","polygonFeatures","existingId","mergedFeature","idsToRemove","newFeatureId","controls","readOnly","draw","edit","applyIcon","button","icon","svg","RulerCtor","proto","original","start","end","kilometers","conversion","distance","controller","SettingsControl","container","event","overlay","dialog","title","description","optionsList","label","input","span","actions","close","show","drawTb","CLICK_HIT_PX","onClick","handler","markers","firstLL","pFirst","pClick","GU","defaults","fmt","num","area","metric","precision","units","t","EditCircle","DrawEvent","latlng","radius","layerType","featureCollection","createdLayer","feat","newId","cause","handleContext","evt","handleClick","oe","containerPt","nearest","onDelete","menu","btn","cleanup","onDoc","tolerancePx","llToPoint","dist","targetPt","bestD","bestPath","bestVertex","latlngs","path","pathIndex","v","vertexIndex","d","paths","minVerts","newPaths","fid","newGeoJSON","drawControl","drawToolbar","handlers","moveHandler","key","mode","ui","cancelBtn","LeafletDrawMapElement","detail","_old","finalFc","padding","preCount","postState","url","res","data","text","themeUrl","link","themeCss","present","fallback","n","CANONICAL_TAG_NAME","LEGACY_TAG_NAME","LeafletDrawMapElementLegacy"],"mappings":"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","x_google_ignoreList":[1,2,3,6,7,9,10,11,12]}