@snowcone-app/canvas 0.27.0 → 0.29.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.
Files changed (73) hide show
  1. package/ERROR_CONTRACT.md +13 -0
  2. package/dist/{CanvasRenderer-yszzrDfo.js → CanvasRenderer-_lFoIoz5.js} +916 -848
  3. package/dist/CanvasRenderer-_lFoIoz5.js.map +1 -0
  4. package/dist/{CanvasStateV1-BTbCD_xC.js → CanvasStateV1-BMxr6xb8.js} +7 -4
  5. package/dist/{CanvasStateV1-BTbCD_xC.js.map → CanvasStateV1-BMxr6xb8.js.map} +1 -1
  6. package/dist/ContextualToolbars-0jWvnQgp.js +5833 -0
  7. package/dist/ContextualToolbars-0jWvnQgp.js.map +1 -0
  8. package/dist/{EditorCanvasImpl-Ui8Ceb-h.js → EditorCanvasImpl-BNz8TPFs.js} +8 -8
  9. package/dist/{EditorCanvasImpl-Ui8Ceb-h.js.map → EditorCanvasImpl-BNz8TPFs.js.map} +1 -1
  10. package/dist/{ExportManager-BTcyj4cf.js → ExportManager-B8Td7uR5.js} +1051 -976
  11. package/dist/ExportManager-B8Td7uR5.js.map +1 -0
  12. package/dist/{FontAnalyzer-EF3gLPr8.js → FontAnalyzer-D4Sg-P6_.js} +1410 -1329
  13. package/dist/FontAnalyzer-D4Sg-P6_.js.map +1 -0
  14. package/dist/{ImagePanel-CIk6z41z.js → ImagePanel-CN2Bu3hf.js} +6 -6
  15. package/dist/{ImagePanel-CIk6z41z.js.map → ImagePanel-CN2Bu3hf.js.map} +1 -1
  16. package/dist/{SnowconeCanvas-DuWALOAt.js → SnowconeCanvas-CR_LdRFP.js} +27 -27
  17. package/dist/{SnowconeCanvas-DuWALOAt.js.map → SnowconeCanvas-CR_LdRFP.js.map} +1 -1
  18. package/dist/{UnifiedFontService-CHVYDBDW.js → UnifiedFontService-CgYnYTj7.js} +755 -713
  19. package/dist/UnifiedFontService-CgYnYTj7.js.map +1 -0
  20. package/dist/advanced.mjs +14 -14
  21. package/dist/components/MultiSelectionToolbar.d.ts +18 -0
  22. package/dist/components/toolbars/SecondaryPanels.d.ts +11 -0
  23. package/dist/components/ui/toolbar-button.d.ts +2 -0
  24. package/dist/core/GestureConstraints.d.ts +92 -0
  25. package/dist/core/InteractionStateMachine.d.ts +16 -2
  26. package/dist/core/ResizeHandler.d.ts +4 -1
  27. package/dist/core/ResizePipeline.d.ts +3 -0
  28. package/dist/core/TextElement.d.ts +13 -0
  29. package/dist/core/TextMetrics.d.ts +17 -3
  30. package/dist/core/rich-text-layout.d.ts +2 -0
  31. package/dist/core/text-spacing.d.ts +74 -0
  32. package/dist/{custom-icons-CcLMyybv.js → custom-icons-B5TRC1Ed.js} +2 -2
  33. package/dist/{custom-icons-CcLMyybv.js.map → custom-icons-B5TRC1Ed.js.map} +1 -1
  34. package/dist/{design-builder-cZY958Rw.js → design-builder-COj0zkxu.js} +2 -2
  35. package/dist/{design-builder-cZY958Rw.js.map → design-builder-COj0zkxu.js.map} +1 -1
  36. package/dist/{editorErrors-BhrZ_nwj.js → editorErrors-CCvoKj_P.js} +2 -2
  37. package/dist/editorErrors-CCvoKj_P.js.map +1 -0
  38. package/dist/{embed-CJswRZte.js → embed-BTRtoktw.js} +10 -10
  39. package/dist/{embed-CJswRZte.js.map → embed-BTRtoktw.js.map} +1 -1
  40. package/dist/embed.mjs +6 -6
  41. package/dist/errors/editorError.d.ts +7 -1
  42. package/dist/{guards-DIX8aXWM.js → guards-uQtEQJbs.js} +2 -2
  43. package/dist/{guards-DIX8aXWM.js.map → guards-uQtEQJbs.js.map} +1 -1
  44. package/dist/hooks/index.d.ts +2 -0
  45. package/dist/hooks/useAlignDistribute.d.ts +19 -0
  46. package/dist/hooks/useTextToolbar.d.ts +8 -0
  47. package/dist/index.mjs +8 -8
  48. package/dist/internals.mjs +5 -5
  49. package/dist/rendering/renderer-types.d.ts +4 -0
  50. package/dist/rendering/rich-text-renderer.d.ts +4 -0
  51. package/dist/rendering/text-renderer.d.ts +4 -1
  52. package/dist/state/CanvasStateV1.d.ts +3 -0
  53. package/dist/{template-fields-BXl29sgh.js → template-fields-BLRp84Ny.js} +6 -6
  54. package/dist/{template-fields-BXl29sgh.js.map → template-fields-BLRp84Ny.js.map} +1 -1
  55. package/dist/testing.mjs +4 -4
  56. package/dist/types/index.d.ts +26 -0
  57. package/dist/{usePieceGuideBundle-DE21DQGZ.js → usePieceGuideBundle-CTQszfKA.js} +2 -2
  58. package/dist/{usePieceGuideBundle-DE21DQGZ.js.map → usePieceGuideBundle-CTQszfKA.js.map} +1 -1
  59. package/dist/utils/alignDistribute.d.ts +41 -0
  60. package/dist/utils/featureApplied.d.ts +6 -0
  61. package/dist/{validation-DGXAQmUC.js → validation-eCebhplp.js} +2991 -2956
  62. package/dist/validation-eCebhplp.js.map +1 -0
  63. package/dist/workers/export-worker.bundle.string.d.ts +1 -1
  64. package/example/package.json +1 -1
  65. package/package.json +1 -1
  66. package/dist/CanvasRenderer-yszzrDfo.js.map +0 -1
  67. package/dist/ContextualToolbars-BHjYsril.js +0 -5556
  68. package/dist/ContextualToolbars-BHjYsril.js.map +0 -1
  69. package/dist/ExportManager-BTcyj4cf.js.map +0 -1
  70. package/dist/FontAnalyzer-EF3gLPr8.js.map +0 -1
  71. package/dist/UnifiedFontService-CHVYDBDW.js.map +0 -1
  72. package/dist/editorErrors-BhrZ_nwj.js.map +0 -1
  73. package/dist/validation-DGXAQmUC.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"UnifiedFontService-CHVYDBDW.js","sources":["../src/icons/icon-data.ts","../src/icons/registry.ts","../src/hooks/useLayers.ts","../../../node_modules/.pnpm/@iconify+react@6.0.2_react@18.3.1/node_modules/@iconify/react/dist/iconify.js","../src/utils/clickProtection.ts","../src/vendor/ui/lib/utils.ts","../src/vendor/ui/primitives/surface.tsx","../src/vendor/ui/primitives/Button.tsx","../src/vendor/ui/primitives/drawer.tsx","../src/vendor/ui/primitives/tooltip.tsx","../src/lib/utils.ts","../src/components/ui/normalized-icon.tsx","../src/components/ui/toolbar-button.tsx","../src/components/ui/icons.ts","../src/hooks/useArtboards.ts","../../../node_modules/.pnpm/@dnd-kit+utilities@3.2.2_react@18.3.1/node_modules/@dnd-kit/utilities/dist/utilities.esm.js","../../../node_modules/.pnpm/@dnd-kit+accessibility@3.1.1_react@18.3.1/node_modules/@dnd-kit/accessibility/dist/accessibility.esm.js","../../../node_modules/.pnpm/@dnd-kit+core@6.3.1_react-dom@18.3.1_react@18.3.1__react@18.3.1/node_modules/@dnd-kit/core/dist/core.esm.js","../../../node_modules/.pnpm/@dnd-kit+sortable@10.0.0_@dnd-kit+core@6.3.1_react-dom@18.3.1_react@18.3.1__react@18.3.1__react@18.3.1/node_modules/@dnd-kit/sortable/dist/sortable.esm.js","../src/hooks/useLayerDndKit.ts","../src/components/embed/LayersPanel.tsx","../src/components/editor/RootInternals.ts","../src/components/editor/EditorLayers.tsx","../src/components/primitives/Dropdown.tsx","../src/components/primitives/DropdownMenu.tsx","../src/components/primitives/MenuItem.tsx","../src/components/embed/addElementTypes.tsx","../src/components/Drawer.tsx","../src/components/ShapeTypeDrawer.tsx","../src/components/embed/MenuButton.tsx","../src/components/editor/LazyImageBrowser.tsx","../src/components/editor/EditorMenu.tsx","../src/components/embed/UndoRedoControls.tsx","../src/components/editor/EditorHistory.tsx","../src/components/editor/EditorAdd.tsx","../src/hooks/useExport.ts","../src/services/imageSearch.ts","../src/contexts/CanvasServicesContext.tsx","../src/utils/GoogleFontsService.ts","../src/utils/UnifiedFontService.ts"],"sourcesContent":["// AUTO-GENERATED FILE - DO NOT EDIT\n// Generated by: pnpm generate:icons\n// Icons included: 93\n// Approximate size: 34.2 KB\n//\n// To regenerate this file after adding new icons:\n// pnpm generate:icons\n\nimport type { IconifyIcon } from '@iconify/react';\n\nexport const canvasIcons: Record<string, IconifyIcon> = {\n \"eos-icons:loading\": {\n \"body\": \"<path fill=\\\"currentColor\\\" d=\\\"M12 2A10 10 0 1 0 22 12A10 10 0 0 0 12 2Zm0 18a8 8 0 1 1 8-8A8 8 0 0 1 12 20Z\\\" opacity=\\\".5\\\"/><path fill=\\\"currentColor\\\" d=\\\"M20 12h2A10 10 0 0 0 12 2V4A8 8 0 0 1 20 12Z\\\"><animateTransform attributeName=\\\"transform\\\" dur=\\\"1s\\\" from=\\\"0 12 12\\\" repeatCount=\\\"indefinite\\\" to=\\\"360 12 12\\\" type=\\\"rotate\\\"/></path>\",\n \"width\": 24,\n \"height\": 24\n },\n \"fa6-solid:icons\": {\n \"body\": \"<path fill=\\\"currentColor\\\" d=\\\"M500.3 7.3c7.4 6 11.7 15.1 11.7 24.7v144c0 26.5-28.7 48-64 48s-64-21.5-64-48s28.7-48 64-48V71l-96 19.2V208c0 26.5-28.7 48-64 48s-64-21.5-64-48s28.7-48 64-48V64c0-15.3 10.8-28.4 25.7-31.4l160-32c9.4-1.9 19.1.6 26.6 6.6zM74.7 304l11.8-17.8c5.9-8.9 15.9-14.2 26.6-14.2h61.7c10.7 0 20.7 5.3 26.6 14.2l11.9 17.8H240c26.5 0 48 21.5 48 48v112c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V352c0-26.5 21.5-48 48-48zM192 408a48 48 0 1 0-96 0a48 48 0 1 0 96 0m286.7-129.7L440.3 368H496c6.7 0 12.6 4.1 15 10.4s.6 13.3-4.4 17.7l-128 112c-5.6 4.9-13.9 5.3-19.9.9s-8.2-12.4-5.3-19.2l38.3-89.8H336c-6.7 0-12.6-4.1-15-10.4s-.6-13.3 4.4-17.7l128-112c5.6-4.9 13.9-5.3 19.9-.9s8.2 12.4 5.3 19.2zm-339-59.2c-6.5 6.5-17 6.5-23 0l-96.8-99.9c-28-29-26.5-76.9 5-103.9c27-23.5 68.4-19 93.4 6.5l10 10.5l9.5-10.5c25-25.5 65.9-30 93.9-6.5c31 27 32.5 74.9 4.5 103.9l-96.4 99.9z\\\"/>\",\n \"width\": 512,\n \"height\": 512\n },\n \"gravity-ui:arrow-down-to-square\": {\n \"body\": \"<path fill=\\\"currentColor\\\" fill-rule=\\\"evenodd\\\" d=\\\"M8.53 11.78a.75.75 0 0 1-1.06 0l-2.5-2.5a.75.75 0 0 1 1.06-1.06l1.22 1.22V1.75a.75.75 0 0 1 1.5 0v7.69l1.22-1.22a.75.75 0 1 1 1.06 1.06zM4.25 4a.75.75 0 1 1 0 1.5H4A1.5 1.5 0 0 0 2.5 7v5A1.5 1.5 0 0 0 4 13.5h8a1.5 1.5 0 0 0 1.5-1.5V7A1.5 1.5 0 0 0 12 5.5h-.25a.75.75 0 0 1 0-1.5H12a3 3 0 0 1 3 3v5a3 3 0 0 1-3 3H4a3 3 0 0 1-3-3V7a3 3 0 0 1 3-3z\\\" clip-rule=\\\"evenodd\\\"/>\",\n \"width\": 24,\n \"height\": 24\n },\n \"gravity-ui:arrow-left\": {\n \"body\": \"<path fill=\\\"currentColor\\\" fill-rule=\\\"evenodd\\\" d=\\\"M14.75 8a.75.75 0 0 1-.75.75H3.81l2.72 2.72a.75.75 0 1 1-1.06 1.06l-4-4a.75.75 0 0 1 0-1.06l4-4a.75.75 0 0 1 1.06 1.06L3.81 7.25H14a.75.75 0 0 1 .75.75\\\" clip-rule=\\\"evenodd\\\"/>\",\n \"width\": 24,\n \"height\": 24\n },\n \"gravity-ui:arrow-rotate-left\": {\n \"body\": \"<path fill=\\\"currentColor\\\" fill-rule=\\\"evenodd\\\" d=\\\"M8 1.5a6.5 6.5 0 1 1-6.445 7.348a.75.75 0 1 1 1.487-.194A5.001 5.001 0 1 0 4.43 4.5h1.32a.75.75 0 0 1 0 1.5h-3A.75.75 0 0 1 2 5.25v-3a.75.75 0 0 1 1.5 0v1.06A6.48 6.48 0 0 1 8 1.5\\\" clip-rule=\\\"evenodd\\\"/>\",\n \"width\": 24,\n \"height\": 24\n },\n \"gravity-ui:bars\": {\n \"body\": \"<path fill=\\\"currentColor\\\" fill-rule=\\\"evenodd\\\" d=\\\"M1.25 3.25A.75.75 0 0 1 2 2.5h12A.75.75 0 0 1 14 4H2a.75.75 0 0 1-.75-.75m0 4.75A.75.75 0 0 1 2 7.25h12a.75.75 0 0 1 0 1.5H2A.75.75 0 0 1 1.25 8M2 12a.75.75 0 0 0 0 1.5h12a.75.75 0 0 0 0-1.5z\\\" clip-rule=\\\"evenodd\\\"/>\",\n \"width\": 24,\n \"height\": 24\n },\n \"gravity-ui:bold\": {\n \"body\": \"<path fill=\\\"currentColor\\\" fill-rule=\\\"evenodd\\\" d=\\\"M4.25 2.25A.75.75 0 0 0 3.5 3v10c0 .414.336.75.75.75H9.5a3.25 3.25 0 0 0 1.477-6.146A3.25 3.25 0 0 0 8.5 2.25zm3.5 5a1.75 1.75 0 1 0 0-3.5h-2v3.5zm-2 1.5v3.5h3a1.75 1.75 0 1 0 0-3.5z\\\" clip-rule=\\\"evenodd\\\"/>\",\n \"width\": 24,\n \"height\": 24\n },\n \"gravity-ui:check\": {\n \"body\": \"<path fill=\\\"currentColor\\\" fill-rule=\\\"evenodd\\\" d=\\\"M13.488 3.43a.75.75 0 0 1 .081 1.058l-6 7a.75.75 0 0 1-1.1.042l-3.5-3.5A.75.75 0 0 1 4.03 6.97l2.928 2.927l5.473-6.385a.75.75 0 0 1 1.057-.081\\\" clip-rule=\\\"evenodd\\\"/>\",\n \"width\": 24,\n \"height\": 24\n },\n \"gravity-ui:chevron-down\": {\n \"body\": \"<path fill=\\\"currentColor\\\" fill-rule=\\\"evenodd\\\" d=\\\"M2.97 5.47a.75.75 0 0 1 1.06 0L8 9.44l3.97-3.97a.75.75 0 1 1 1.06 1.06l-4.5 4.5a.75.75 0 0 1-1.06 0l-4.5-4.5a.75.75 0 0 1 0-1.06\\\" clip-rule=\\\"evenodd\\\"/>\",\n \"width\": 24,\n \"height\": 24\n },\n \"gravity-ui:chevron-right\": {\n \"body\": \"<path fill=\\\"currentColor\\\" fill-rule=\\\"evenodd\\\" d=\\\"M5.47 13.03a.75.75 0 0 1 0-1.06L9.44 8L5.47 4.03a.75.75 0 0 1 1.06-1.06l4.5 4.5a.75.75 0 0 1 0 1.06l-4.5 4.5a.75.75 0 0 1-1.06 0\\\" clip-rule=\\\"evenodd\\\"/>\",\n \"width\": 24,\n \"height\": 24\n },\n \"gravity-ui:chevron-up\": {\n \"body\": \"<path fill=\\\"currentColor\\\" fill-rule=\\\"evenodd\\\" d=\\\"M13.03 10.53a.75.75 0 0 1-1.06 0L8 6.56l-3.97 3.97a.75.75 0 1 1-1.06-1.06l4.5-4.5a.75.75 0 0 1 1.06 0l4.5 4.5a.75.75 0 0 1 0 1.06\\\" clip-rule=\\\"evenodd\\\"/>\",\n \"width\": 24,\n \"height\": 24\n },\n \"gravity-ui:circle-fill\": {\n \"body\": \"<path fill=\\\"currentColor\\\" fill-rule=\\\"evenodd\\\" d=\\\"M8 15A7 7 0 1 0 8 1a7 7 0 0 0 0 14\\\" clip-rule=\\\"evenodd\\\"/>\",\n \"width\": 24,\n \"height\": 24\n },\n \"gravity-ui:copy\": {\n \"body\": \"<path fill=\\\"currentColor\\\" fill-rule=\\\"evenodd\\\" d=\\\"M12 2.5H8A1.5 1.5 0 0 0 6.5 4v1H8a3 3 0 0 1 3 3v1.5h1A1.5 1.5 0 0 0 13.5 8V4A1.5 1.5 0 0 0 12 2.5M11 11h1a3 3 0 0 0 3-3V4a3 3 0 0 0-3-3H8a3 3 0 0 0-3 3v1H4a3 3 0 0 0-3 3v4a3 3 0 0 0 3 3h4a3 3 0 0 0 3-3zM4 6.5h4A1.5 1.5 0 0 1 9.5 8v4A1.5 1.5 0 0 1 8 13.5H4A1.5 1.5 0 0 1 2.5 12V8A1.5 1.5 0 0 1 4 6.5\\\" clip-rule=\\\"evenodd\\\"/>\",\n \"width\": 24,\n \"height\": 24\n },\n \"gravity-ui:italic\": {\n \"body\": \"<path fill=\\\"currentColor\\\" fill-rule=\\\"evenodd\\\" d=\\\"M7.25 2a.75.75 0 0 0 0 1.5h1.317l-2.7 9H4.25a.75.75 0 1 0 0 1.5h4.5a.75.75 0 0 0 0-1.5H7.433l2.7-9h1.617a.75.75 0 0 0 0-1.5z\\\" clip-rule=\\\"evenodd\\\"/>\",\n \"width\": 24,\n \"height\": 24\n },\n \"gravity-ui:layers\": {\n \"body\": \"<path fill=\\\"currentColor\\\" fill-rule=\\\"evenodd\\\" d=\\\"m2.789 5.283l4.037-2.02A2.5 2.5 0 0 1 7.944 3h.112c.388 0 .77.09 1.118.264l4.037 2.019a.522.522 0 0 1 0 .934l-4.037 2.02a2.5 2.5 0 0 1-1.118.263h-.112a2.5 2.5 0 0 1-1.118-.264L2.79 6.217a.523.523 0 0 1 0-.934M1 5.75c0-.766.433-1.466 1.118-1.809l4.037-2.019a4 4 0 0 1 1.79-.422h.11a4 4 0 0 1 1.79.422l4.037 2.019a2.023 2.023 0 0 1 0 3.618l-.882.44l.882.442a2.023 2.023 0 0 1 0 3.618l-4.037 2.019a4 4 0 0 1-1.79.422h-.11a4 4 0 0 1-1.79-.422l-4.037-2.02a2.023 2.023 0 0 1 0-3.617L3 8l-.882-.441A2.02 2.02 0 0 1 1 5.75m3.677 3.088l-1.888.945a.523.523 0 0 0 0 .934l4.037 2.019A2.5 2.5 0 0 0 7.944 13h.112a2.5 2.5 0 0 0 1.118-.264l4.037-2.019a.523.523 0 0 0 0-.934l-1.888-.945l-1.478.74a4 4 0 0 1-1.79.422h-.11a4 4 0 0 1-1.79-.422z\\\" clip-rule=\\\"evenodd\\\"/>\",\n \"width\": 24,\n \"height\": 24\n },\n \"gravity-ui:magic-wand\": {\n \"body\": \"<path fill=\\\"currentColor\\\" fill-rule=\\\"evenodd\\\" d=\\\"m11.1 5.894l-.412.903l.671.732l1.356 1.48l-1.994-.227l-.986-.113l-.49.864l-.987 1.747l-.4-1.967l-.198-.972l-.973-.198l-1.966-.4l1.746-.989l.864-.489l-.112-.986l-.227-1.994L8.47 4.641l.732.67l.903-.411l1.826-.832zM7.02 1.276l2.465 2.26l3.043-1.387c.842-.384 1.708.483 1.325 1.324l-1.387 3.043l2.259 2.465c.625.682.069 1.774-.85 1.67l-3.323-.38l-1.646 2.911c-.456.805-1.666.613-1.85-.293l-.667-3.277l-3.277-.666c-.906-.185-1.098-1.395-.293-1.85l2.91-1.647l-.378-3.322c-.105-.92.987-1.476 1.669-.85M5.53 11.53a.75.75 0 1 0-1.06-1.06l-3.5 3.5a.75.75 0 1 0 1.06 1.06z\\\" clip-rule=\\\"evenodd\\\"/>\",\n \"width\": 24,\n \"height\": 24\n },\n \"gravity-ui:magnifier\": {\n \"body\": \"<path fill=\\\"currentColor\\\" fill-rule=\\\"evenodd\\\" d=\\\"M11.5 7a4.5 4.5 0 1 1-9 0a4.5 4.5 0 0 1 9 0m-.82 4.74a6 6 0 1 1 1.06-1.06l2.79 2.79a.75.75 0 1 1-1.06 1.06z\\\" clip-rule=\\\"evenodd\\\"/>\",\n \"width\": 24,\n \"height\": 24\n },\n \"gravity-ui:minus\": {\n \"body\": \"<path fill=\\\"currentColor\\\" fill-rule=\\\"evenodd\\\" d=\\\"M1.75 8a.75.75 0 0 1 .75-.75h11a.75.75 0 0 1 0 1.5h-11A.75.75 0 0 1 1.75 8\\\" clip-rule=\\\"evenodd\\\"/>\",\n \"width\": 24,\n \"height\": 24\n },\n \"gravity-ui:pencil\": {\n \"body\": \"<path fill=\\\"currentColor\\\" fill-rule=\\\"evenodd\\\" d=\\\"M11.423 1A3.577 3.577 0 0 1 15 4.577c0 .27-.108.53-.3.722l-.528.529l-1.971 1.971l-5.059 5.059a3 3 0 0 1-1.533.82l-2.638.528a1 1 0 0 1-1.177-1.177l.528-2.638a3 3 0 0 1 .82-1.533l5.059-5.059l2.5-2.5c.191-.191.451-.299.722-.299m-2.31 4.009l-4.91 4.91a1.5 1.5 0 0 0-.41.766l-.38 1.903l1.902-.38a1.5 1.5 0 0 0 .767-.41l4.91-4.91a2.08 2.08 0 0 0-1.88-1.88m3.098.658a3.6 3.6 0 0 0-1.878-1.879l1.28-1.28c.995.09 1.788.884 1.878 1.88z\\\" clip-rule=\\\"evenodd\\\"/>\",\n \"width\": 24,\n \"height\": 24\n },\n \"gravity-ui:picture\": {\n \"body\": \"<path fill=\\\"currentColor\\\" fill-rule=\\\"evenodd\\\" d=\\\"M11.5 3h-7A1.5 1.5 0 0 0 3 4.5v5.027l.962-.7a1.75 1.75 0 0 1 2.079.016l.928.696l2.368-2.03a1.75 1.75 0 0 1 2.325.043L13 8.787V4.5A1.5 1.5 0 0 0 11.5 3m3 7.498V4.5a3 3 0 0 0-3-3h-7a3 3 0 0 0-3 3v7a3 3 0 0 0 3 3h7a3 3 0 0 0 3-3zm-1.5.33l-2.355-2.174a.25.25 0 0 0-.332-.006L7.488 11.07l-.457.392l-.481-.361l-1.41-1.057a.25.25 0 0 0-.296-.002L3 11.381v.119A1.5 1.5 0 0 0 4.5 13h7a1.5 1.5 0 0 0 1.5-1.5zM7.5 6a1.5 1.5 0 1 1-3 0a1.5 1.5 0 0 1 3 0\\\" clip-rule=\\\"evenodd\\\"/>\",\n \"width\": 24,\n \"height\": 24\n },\n \"gravity-ui:plus\": {\n \"body\": \"<path fill=\\\"currentColor\\\" fill-rule=\\\"evenodd\\\" d=\\\"M8 1.75a.75.75 0 0 1 .75.75v4.75h4.75a.75.75 0 0 1 0 1.5H8.75v4.75a.75.75 0 0 1-1.5 0V8.75H2.5a.75.75 0 0 1 0-1.5h4.75V2.5A.75.75 0 0 1 8 1.75\\\" clip-rule=\\\"evenodd\\\"/>\",\n \"width\": 24,\n \"height\": 24\n },\n \"gravity-ui:scissors\": {\n \"body\": \"<path fill=\\\"currentColor\\\" fill-rule=\\\"evenodd\\\" d=\\\"M4.5 6a1.5 1.5 0 1 0 0-3a1.5 1.5 0 0 0 0 3m-3-1.5a3 3 0 0 0 4.524 2.585L6.939 8l-.915.915a3 3 0 1 0 1.06 1.06L8.122 8.94l5.501 3.209a.75.75 0 1 0 .756-1.296L9.488 8l4.89-2.852a.75.75 0 0 0-.756-1.296l-5.5 3.209l-1.037-1.037A3 3 0 1 0 1.5 4.5m3 5.5a1.5 1.5 0 1 1 0 3a1.5 1.5 0 0 1 0-3\\\" clip-rule=\\\"evenodd\\\"/>\",\n \"width\": 24,\n \"height\": 24\n },\n \"gravity-ui:sparkles\": {\n \"body\": \"<path fill=\\\"currentColor\\\" d=\\\"M13 10a.75.75 0 0 1 .725.556a2.37 2.37 0 0 0 1.72 1.72a.75.75 0 0 1 0 1.449a2.37 2.37 0 0 0-1.72 1.72a.75.75 0 0 1-1.45 0a2.37 2.37 0 0 0-1.72-1.72a.75.75 0 0 1 0-1.45a2.37 2.37 0 0 0 1.72-1.72l.043-.117A.75.75 0 0 1 13 10M7 0a1.5 1.5 0 0 1 1.48 1.253c.242 1.455.696 2.364 1.3 2.968c.603.603 1.512 1.057 2.967 1.3a1.5 1.5 0 0 1 0 2.958c-1.455.243-2.364.697-2.968 1.3c-.603.604-1.057 1.513-1.3 2.968a1.5 1.5 0 0 1-2.958 0c-.243-1.455-.697-2.364-1.3-2.968c-.604-.603-1.513-1.057-2.968-1.3a1.5 1.5 0 0 1 0-2.958c1.455-.243 2.364-.697 2.968-1.3c.603-.604 1.057-1.513 1.3-2.968l.028-.133A1.5 1.5 0 0 1 7 0m0 1.5C6.45 4.8 4.8 6.45 1.5 7c3.3.55 4.95 2.2 5.5 5.5c.55-3.3 2.2-4.95 5.5-5.5C9.2 6.45 7.55 4.8 7 1.5\\\"/>\",\n \"width\": 24,\n \"height\": 24\n },\n \"gravity-ui:text\": {\n \"body\": \"<path fill=\\\"currentColor\\\" fill-rule=\\\"evenodd\\\" d=\\\"M3.279 2.544A.75.75 0 0 1 4 2h8a.75.75 0 0 1 .721.544l.5 1.75a.75.75 0 1 1-1.442.412L11.434 3.5H8.75l-.004 9H9.5a.75.75 0 0 1 0 1.5h-3a.75.75 0 0 1 0-1.5h.746l.004-9H4.566L4.22 4.706a.75.75 0 1 1-1.442-.412z\\\" clip-rule=\\\"evenodd\\\"/>\",\n \"width\": 24,\n \"height\": 24\n },\n \"gravity-ui:text-align-center\": {\n \"body\": \"<path fill=\\\"currentColor\\\" fill-rule=\\\"evenodd\\\" d=\\\"M2.75 2a.75.75 0 0 0 0 1.5h10.5a.75.75 0 0 0 0-1.5zm0 7a.75.75 0 0 0 0 1.5h10.5a.75.75 0 0 0 0-1.5zm2 3.5a.75.75 0 0 0 0 1.5h6.5a.75.75 0 0 0 0-1.5zM4 6.25a.75.75 0 0 1 .75-.75h6.5a.75.75 0 0 1 0 1.5h-6.5A.75.75 0 0 1 4 6.25\\\" clip-rule=\\\"evenodd\\\"/>\",\n \"width\": 24,\n \"height\": 24\n },\n \"gravity-ui:text-align-justify\": {\n \"body\": \"<path fill=\\\"currentColor\\\" fill-rule=\\\"evenodd\\\" d=\\\"M2.75 2a.75.75 0 0 0 0 1.5h10.5a.75.75 0 0 0 0-1.5zM2 6.25a.75.75 0 0 1 .75-.75h10.5a.75.75 0 0 1 0 1.5H2.75A.75.75 0 0 1 2 6.25M2.75 9a.75.75 0 0 0 0 1.5h10.5a.75.75 0 0 0 0-1.5zm0 3.5a.75.75 0 0 0 0 1.5h10.5a.75.75 0 0 0 0-1.5z\\\" clip-rule=\\\"evenodd\\\"/>\",\n \"width\": 24,\n \"height\": 24\n },\n \"gravity-ui:text-align-left\": {\n \"body\": \"<path fill=\\\"currentColor\\\" fill-rule=\\\"evenodd\\\" d=\\\"M2.75 2a.75.75 0 0 0 0 1.5h10.5a.75.75 0 0 0 0-1.5zm0 7a.75.75 0 0 0 0 1.5h10.5a.75.75 0 0 0 0-1.5zm0 3.5a.75.75 0 0 0 0 1.5h6.5a.75.75 0 0 0 0-1.5zM2 6.25a.75.75 0 0 1 .75-.75h6.5a.75.75 0 0 1 0 1.5h-6.5A.75.75 0 0 1 2 6.25\\\" clip-rule=\\\"evenodd\\\"/>\",\n \"width\": 24,\n \"height\": 24\n },\n \"gravity-ui:text-align-right\": {\n \"body\": \"<path fill=\\\"currentColor\\\" fill-rule=\\\"evenodd\\\" d=\\\"M2.75 2a.75.75 0 0 0 0 1.5h10.5a.75.75 0 0 0 0-1.5zM6 6.25a.75.75 0 0 1 .75-.75h6.5a.75.75 0 0 1 0 1.5h-6.5A.75.75 0 0 1 6 6.25M2.75 9a.75.75 0 0 0 0 1.5h10.5a.75.75 0 0 0 0-1.5zm4 3.5a.75.75 0 0 0 0 1.5h6.5a.75.75 0 0 0 0-1.5z\\\" clip-rule=\\\"evenodd\\\"/>\",\n \"width\": 24,\n \"height\": 24\n },\n \"gravity-ui:underline\": {\n \"body\": \"<path fill=\\\"currentColor\\\" fill-rule=\\\"evenodd\\\" d=\\\"M5 2.75a.75.75 0 0 0-1.5 0V7a4.5 4.5 0 0 0 9 0V2.75a.75.75 0 0 0-1.5 0V7a3 3 0 0 1-6 0zm-.75 9.75a.75.75 0 0 0 0 1.5h7.5a.75.75 0 0 0 0-1.5z\\\" clip-rule=\\\"evenodd\\\"/>\",\n \"width\": 24,\n \"height\": 24\n },\n \"healthicons:polygon\": {\n \"body\": \"<path fill=\\\"currentColor\\\" fill-rule=\\\"evenodd\\\" d=\\\"M28 10c0 .507-.094.992-.266 1.438l7.696 5.497a4 4 0 1 1 2.706 7.063l-2.32 10.437A4 4 0 1 1 30.126 39H17.874A4.002 4.002 0 0 1 10 38a4 4 0 0 1 2.184-3.565l-2.32-10.437a4 4 0 1 1 2.706-7.063l7.696-5.497A4 4 0 1 1 28 10m-6.57 3.065l-7.696 5.497a4 4 0 0 1-1.917 5.003l2.319 10.437A4 4 0 0 1 17.874 37h12.252a4 4 0 0 1 3.738-2.998l2.32-10.437a4 4 0 0 1-1.918-5.003l-7.695-5.497A3.98 3.98 0 0 1 24 14a3.98 3.98 0 0 1-2.57-.935\\\" clip-rule=\\\"evenodd\\\"/>\",\n \"width\": 48,\n \"height\": 48\n },\n \"heroicons:swatch\": {\n \"body\": \"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"1.5\\\" d=\\\"M4.098 19.902a3.75 3.75 0 0 0 5.304 0l6.401-6.402M6.75 21A3.75 3.75 0 0 1 3 17.25V4.125C3 3.504 3.504 3 4.125 3h5.25c.621 0 1.125.504 1.125 1.125v4.072M6.75 21a3.75 3.75 0 0 0 3.75-3.75V8.197M6.75 21h13.125c.621 0 1.125-.504 1.125-1.125v-5.25c0-.621-.504-1.125-1.125-1.125h-4.072M10.5 8.197l2.88-2.88a1.124 1.124 0 0 1 1.59 0l3.712 3.713c.44.44.44 1.152 0 1.59l-2.879 2.88M6.75 17.25h.008v.008H6.75z\\\"/>\",\n \"width\": 24,\n \"height\": 24\n },\n \"hugeicons:layer-bring-forward\": {\n \"body\": \"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"1.5\\\" d=\\\"m15.89 11.5l3.397 1.56C21.096 13.892 22 14.308 22 15s-.904 1.109-2.713 1.94l-4.893 2.247c-1.18.542-1.77.813-2.394.813s-1.214-.271-2.394-.813l-4.893-2.248C2.904 16.11 2 15.693 2 15s.904-1.109 2.713-1.94L8.11 11.5m3.89-7V15m3-8c-.59-.607-2.16-3-3-3S9.59 6.393 9 7\\\"/>\",\n \"width\": 24,\n \"height\": 24\n },\n \"hugeicons:layer-send-backward\": {\n \"body\": \"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"1.5\\\" d=\\\"m15.89 12.5l3.397-1.56C21.096 10.108 22 9.692 22 9s-.904-1.109-2.713-1.94l-4.893-2.247C13.214 4.271 12.624 4 12 4s-1.214.271-2.394.813L4.713 7.061C2.904 7.89 2 8.307 2 9s.904 1.109 2.713 1.94L8.11 12.5m3.89 7V9m3 8c-.59.607-2.16 3-3 3s-2.41-2.393-3-3\\\"/>\",\n \"width\": 24,\n \"height\": 24\n },\n \"lucide:a-large-small\": {\n \"body\": \"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"m15 16l2.536-7.328a1.02 1.02 1 0 1 1.928 0L22 16m-6.303-2h5.606M2 16l4.039-9.69a.5.5 0 0 1 .923 0L11 16m-7.696-3h6.392\\\"/>\",\n \"width\": 24,\n \"height\": 24\n },\n \"lucide:aperture\": {\n \"body\": \"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><circle cx=\\\"12\\\" cy=\\\"12\\\" r=\\\"10\\\"/><path d=\\\"m14.31 8l5.74 9.94M9.69 8h11.48M7.38 12l5.74-9.94M9.69 16L3.95 6.06M14.31 16H2.83m13.79-4l-5.74 9.94\\\"/></g>\",\n \"width\": 24,\n \"height\": 24\n },\n \"lucide:arrow-left\": {\n \"body\": \"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"m12 19l-7-7l7-7m7 7H5\\\"/>\",\n \"width\": 24,\n \"height\": 24\n },\n \"lucide:arrow-up-from-dot\": {\n \"body\": \"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><path d=\\\"m5 9l7-7l7 7m-7 7V2\\\"/><circle cx=\\\"12\\\" cy=\\\"21\\\" r=\\\"1\\\"/></g>\",\n \"width\": 24,\n \"height\": 24\n },\n \"lucide:blend\": {\n \"body\": \"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><circle cx=\\\"9\\\" cy=\\\"9\\\" r=\\\"7\\\"/><circle cx=\\\"15\\\" cy=\\\"15\\\" r=\\\"7\\\"/></g>\",\n \"width\": 24,\n \"height\": 24\n },\n \"lucide:case-upper\": {\n \"body\": \"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"M15 11h4.5a1 1 0 0 1 0 5h-4a.5.5 0 0 1-.5-.5v-9a.5.5 0 0 1 .5-.5h3a1 1 0 0 1 0 5M2 16l4.039-9.69a.5.5 0 0 1 .923 0L11 16m-7.696-3h6.392\\\"/>\",\n \"width\": 24,\n \"height\": 24\n },\n \"lucide:circle\": {\n \"body\": \"<circle cx=\\\"12\\\" cy=\\\"12\\\" r=\\\"10\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"/>\",\n \"width\": 24,\n \"height\": 24\n },\n \"lucide:circle-dashed\": {\n \"body\": \"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"M10.1 2.182a10 10 0 0 1 3.8 0m0 19.636a10 10 0 0 1-3.8 0m7.509-18.097a10 10 0 0 1 2.69 2.7M2.182 13.9a10 10 0 0 1 0-3.8m18.097 7.509a10 10 0 0 1-2.7 2.69M21.818 10.1a10 10 0 0 1 0 3.8M3.721 6.391a10 10 0 0 1 2.7-2.69m-.03 16.578a10 10 0 0 1-2.69-2.7\\\"/>\",\n \"width\": 24,\n \"height\": 24\n },\n \"lucide:cloud\": {\n \"body\": \"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"M17.5 19H9a7 7 0 1 1 6.71-9h1.79a4.5 4.5 0 1 1 0 9\\\"/>\",\n \"width\": 24,\n \"height\": 24\n },\n \"lucide:copy\": {\n \"body\": \"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><rect width=\\\"14\\\" height=\\\"14\\\" x=\\\"8\\\" y=\\\"8\\\" rx=\\\"2\\\" ry=\\\"2\\\"/><path d=\\\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\\\"/></g>\",\n \"width\": 24,\n \"height\": 24\n },\n \"lucide:credit-card\": {\n \"body\": \"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><rect width=\\\"20\\\" height=\\\"14\\\" x=\\\"2\\\" y=\\\"5\\\" rx=\\\"2\\\"/><path d=\\\"M2 10h20\\\"/></g>\",\n \"width\": 24,\n \"height\": 24\n },\n \"lucide:crop\": {\n \"body\": \"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><path d=\\\"M6 2v14a2 2 0 0 0 2 2h14\\\"/><path d=\\\"M18 22V8a2 2 0 0 0-2-2H2\\\"/></g>\",\n \"width\": 24,\n \"height\": 24\n },\n \"lucide:ellipsis-vertical\": {\n \"body\": \"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><circle cx=\\\"12\\\" cy=\\\"12\\\" r=\\\"1\\\"/><circle cx=\\\"12\\\" cy=\\\"5\\\" r=\\\"1\\\"/><circle cx=\\\"12\\\" cy=\\\"19\\\" r=\\\"1\\\"/></g>\",\n \"width\": 24,\n \"height\": 24\n },\n \"lucide:flag\": {\n \"body\": \"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"M4 22V4a1 1 0 0 1 .4-.8A6 6 0 0 1 8 2c3 0 5 2 7.333 2q2 0 3.067-.8A1 1 0 0 1 20 4v10a1 1 0 0 1-.4.8A6 6 0 0 1 16 16c-3 0-5-2-8-2a6 6 0 0 0-4 1.528\\\"/>\",\n \"width\": 24,\n \"height\": 24\n },\n \"lucide:flip-horizontal-2\": {\n \"body\": \"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"m3 7l5 5l-5 5zm18 0l-5 5l5 5zm-9 13v2m0-8v2m0-8v2m0-8v2\\\"/>\",\n \"width\": 24,\n \"height\": 24\n },\n \"lucide:flip-vertical-2\": {\n \"body\": \"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"m17 3l-5 5l-5-5zm0 18l-5-5l-5 5zM4 12H2m8 0H8m8 0h-2m8 0h-2\\\"/>\",\n \"width\": 24,\n \"height\": 24\n },\n \"lucide:folder-open\": {\n \"body\": \"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"m6 14l1.5-2.9A2 2 0 0 1 9.24 10H20a2 2 0 0 1 1.94 2.5l-1.54 6a2 2 0 0 1-1.95 1.5H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h3.9a2 2 0 0 1 1.69.9l.81 1.2a2 2 0 0 0 1.67.9H18a2 2 0 0 1 2 2v2\\\"/>\",\n \"width\": 24,\n \"height\": 24\n },\n \"lucide:folder-plus\": {\n \"body\": \"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"M12 10v6m-3-3h6m5 7a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.69-.9L9.6 3.9A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2Z\\\"/>\",\n \"width\": 24,\n \"height\": 24\n },\n \"lucide:grid-2x2\": {\n \"body\": \"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><path d=\\\"M12 3v18m-9-9h18\\\"/><rect width=\\\"18\\\" height=\\\"18\\\" x=\\\"3\\\" y=\\\"3\\\" rx=\\\"2\\\"/></g>\",\n \"width\": 24,\n \"height\": 24\n },\n \"lucide:grid-3x3\": {\n \"body\": \"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><rect width=\\\"18\\\" height=\\\"18\\\" x=\\\"3\\\" y=\\\"3\\\" rx=\\\"2\\\"/><path d=\\\"M3 9h18M3 15h18M9 3v18m6-18v18\\\"/></g>\",\n \"width\": 24,\n \"height\": 24\n },\n \"lucide:grip-vertical\": {\n \"body\": \"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><circle cx=\\\"9\\\" cy=\\\"12\\\" r=\\\"1\\\"/><circle cx=\\\"9\\\" cy=\\\"5\\\" r=\\\"1\\\"/><circle cx=\\\"9\\\" cy=\\\"19\\\" r=\\\"1\\\"/><circle cx=\\\"15\\\" cy=\\\"12\\\" r=\\\"1\\\"/><circle cx=\\\"15\\\" cy=\\\"5\\\" r=\\\"1\\\"/><circle cx=\\\"15\\\" cy=\\\"19\\\" r=\\\"1\\\"/></g>\",\n \"width\": 24,\n \"height\": 24\n },\n \"lucide:hexagon\": {\n \"body\": \"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"M21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16\\\"/>\",\n \"width\": 24,\n \"height\": 24\n },\n \"lucide:image\": {\n \"body\": \"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><rect width=\\\"18\\\" height=\\\"18\\\" x=\\\"3\\\" y=\\\"3\\\" rx=\\\"2\\\" ry=\\\"2\\\"/><circle cx=\\\"9\\\" cy=\\\"9\\\" r=\\\"2\\\"/><path d=\\\"m21 15l-3.086-3.086a2 2 0 0 0-2.828 0L6 21\\\"/></g>\",\n \"width\": 24,\n \"height\": 24\n },\n \"lucide:italic\": {\n \"body\": \"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"M19 4h-9m4 16H5M15 4L9 20\\\"/>\",\n \"width\": 24,\n \"height\": 24\n },\n \"lucide:layout-grid\": {\n \"body\": \"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><rect width=\\\"7\\\" height=\\\"7\\\" x=\\\"3\\\" y=\\\"3\\\" rx=\\\"1\\\"/><rect width=\\\"7\\\" height=\\\"7\\\" x=\\\"14\\\" y=\\\"3\\\" rx=\\\"1\\\"/><rect width=\\\"7\\\" height=\\\"7\\\" x=\\\"14\\\" y=\\\"14\\\" rx=\\\"1\\\"/><rect width=\\\"7\\\" height=\\\"7\\\" x=\\\"3\\\" y=\\\"14\\\" rx=\\\"1\\\"/></g>\",\n \"width\": 24,\n \"height\": 24\n },\n \"lucide:lightbulb\": {\n \"body\": \"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"M15 14c.2-1 .7-1.7 1.5-2.5c1-.9 1.5-2.2 1.5-3.5A6 6 0 0 0 6 8c0 1 .2 2.2 1.5 3.5c.7.7 1.3 1.5 1.5 2.5m0 4h6m-5 4h4\\\"/>\",\n \"width\": 24,\n \"height\": 24\n },\n \"lucide:loader-circle\": {\n \"body\": \"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"M21 12a9 9 0 1 1-6.219-8.56\\\"/>\",\n \"width\": 24,\n \"height\": 24\n },\n \"lucide:minus\": {\n \"body\": \"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"M5 12h14\\\"/>\",\n \"width\": 24,\n \"height\": 24\n },\n \"lucide:moon\": {\n \"body\": \"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"M20.985 12.486a9 9 0 1 1-9.473-9.472c.405-.022.617.46.402.803a6 6 0 0 0 8.268 8.268c.344-.215.825-.004.803.401\\\"/>\",\n \"width\": 24,\n \"height\": 24\n },\n \"lucide:move-vertical\": {\n \"body\": \"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"M12 2v20m-4-4l4 4l4-4M8 6l4-4l4 4\\\"/>\",\n \"width\": 24,\n \"height\": 24\n },\n \"lucide:paint-bucket\": {\n \"body\": \"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"M11 7L6 2m12.992 10H2.041m19.104 6.38A3.34 3.34 0 0 1 20 16.5a3.3 3.3 0 0 1-1.145 1.88c-.575.46-.855 1.02-.855 1.595A2 2 0 0 0 20 22a2 2 0 0 0 2-2.025c0-.58-.285-1.13-.855-1.595M8.5 4.5l2.148-2.148a1.205 1.205 0 0 1 1.704 0l7.296 7.296a1.205 1.205 0 0 1 0 1.704l-7.592 7.592a3.615 3.615 0 0 1-5.112 0l-3.888-3.888a3.615 3.615 0 0 1 0-5.112L5.67 7.33\\\"/>\",\n \"width\": 24,\n \"height\": 24\n },\n \"lucide:palette\": {\n \"body\": \"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><path d=\\\"M12 22a1 1 0 0 1 0-20a10 9 0 0 1 10 9a5 5 0 0 1-5 5h-2.25a1.75 1.75 0 0 0-1.4 2.8l.3.4a1.75 1.75 0 0 1-1.4 2.8z\\\"/><circle cx=\\\"13.5\\\" cy=\\\"6.5\\\" r=\\\".5\\\" fill=\\\"currentColor\\\"/><circle cx=\\\"17.5\\\" cy=\\\"10.5\\\" r=\\\".5\\\" fill=\\\"currentColor\\\"/><circle cx=\\\"6.5\\\" cy=\\\"12.5\\\" r=\\\".5\\\" fill=\\\"currentColor\\\"/><circle cx=\\\"8.5\\\" cy=\\\"7.5\\\" r=\\\".5\\\" fill=\\\"currentColor\\\"/></g>\",\n \"width\": 24,\n \"height\": 24\n },\n \"lucide:pen-line\": {\n \"body\": \"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"M13 21h8m.174-14.188a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z\\\"/>\",\n \"width\": 24,\n \"height\": 24\n },\n \"lucide:pen-tool\": {\n \"body\": \"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><path d=\\\"M15.707 21.293a1 1 0 0 1-1.414 0l-1.586-1.586a1 1 0 0 1 0-1.414l5.586-5.586a1 1 0 0 1 1.414 0l1.586 1.586a1 1 0 0 1 0 1.414z\\\"/><path d=\\\"m18 13l-1.375-6.874a1 1 0 0 0-.746-.776L3.235 2.028a1 1 0 0 0-1.207 1.207L5.35 15.879a1 1 0 0 0 .776.746L13 18M2.3 2.3l7.286 7.286\\\"/><circle cx=\\\"11\\\" cy=\\\"11\\\" r=\\\"2\\\"/></g>\",\n \"width\": 24,\n \"height\": 24\n },\n \"lucide:redo-2\": {\n \"body\": \"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><path d=\\\"m15 14l5-5l-5-5\\\"/><path d=\\\"M20 9H9.5A5.5 5.5 0 0 0 4 14.5A5.5 5.5 0 0 0 9.5 20H13\\\"/></g>\",\n \"width\": 24,\n \"height\": 24\n },\n \"lucide:rotate-ccw\": {\n \"body\": \"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><path d=\\\"M3 12a9 9 0 1 0 9-9a9.75 9.75 0 0 0-6.74 2.74L3 8\\\"/><path d=\\\"M3 3v5h5\\\"/></g>\",\n \"width\": 24,\n \"height\": 24\n },\n \"lucide:rotate-cw\": {\n \"body\": \"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><path d=\\\"M21 12a9 9 0 1 1-9-9c2.52 0 4.93 1 6.74 2.74L21 8\\\"/><path d=\\\"M21 3v5h-5\\\"/></g>\",\n \"width\": 24,\n \"height\": 24\n },\n \"lucide:scissors\": {\n \"body\": \"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><circle cx=\\\"6\\\" cy=\\\"6\\\" r=\\\"3\\\"/><path d=\\\"M8.12 8.12L12 12m8-8L8.12 15.88\\\"/><circle cx=\\\"6\\\" cy=\\\"18\\\" r=\\\"3\\\"/><path d=\\\"M14.8 14.8L20 20\\\"/></g>\",\n \"width\": 24,\n \"height\": 24\n },\n \"lucide:settings\": {\n \"body\": \"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><path d=\\\"M9.671 4.136a2.34 2.34 0 0 1 4.659 0a2.34 2.34 0 0 0 3.319 1.915a2.34 2.34 0 0 1 2.33 4.033a2.34 2.34 0 0 0 0 3.831a2.34 2.34 0 0 1-2.33 4.033a2.34 2.34 0 0 0-3.319 1.915a2.34 2.34 0 0 1-4.659 0a2.34 2.34 0 0 0-3.32-1.915a2.34 2.34 0 0 1-2.33-4.033a2.34 2.34 0 0 0 0-3.831A2.34 2.34 0 0 1 6.35 6.051a2.34 2.34 0 0 0 3.319-1.915\\\"/><circle cx=\\\"12\\\" cy=\\\"12\\\" r=\\\"3\\\"/></g>\",\n \"width\": 24,\n \"height\": 24\n },\n \"lucide:shapes\": {\n \"body\": \"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><path d=\\\"M8.3 10a.7.7 0 0 1-.626-1.079L11.4 3a.7.7 0 0 1 1.198-.043L16.3 8.9a.7.7 0 0 1-.572 1.1Z\\\"/><rect width=\\\"7\\\" height=\\\"7\\\" x=\\\"3\\\" y=\\\"14\\\" rx=\\\"1\\\"/><circle cx=\\\"17.5\\\" cy=\\\"17.5\\\" r=\\\"3.5\\\"/></g>\",\n \"width\": 24,\n \"height\": 24\n },\n \"lucide:sparkles\": {\n \"body\": \"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><path d=\\\"M11.017 2.814a1 1 0 0 1 1.966 0l1.051 5.558a2 2 0 0 0 1.594 1.594l5.558 1.051a1 1 0 0 1 0 1.966l-5.558 1.051a2 2 0 0 0-1.594 1.594l-1.051 5.558a1 1 0 0 1-1.966 0l-1.051-5.558a2 2 0 0 0-1.594-1.594l-5.558-1.051a1 1 0 0 1 0-1.966l5.558-1.051a2 2 0 0 0 1.594-1.594zM20 2v4m2-2h-4\\\"/><circle cx=\\\"4\\\" cy=\\\"20\\\" r=\\\"2\\\"/></g>\",\n \"width\": 24,\n \"height\": 24\n },\n \"lucide:square\": {\n \"body\": \"<rect width=\\\"18\\\" height=\\\"18\\\" x=\\\"3\\\" y=\\\"3\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" rx=\\\"2\\\"/>\",\n \"width\": 24,\n \"height\": 24\n },\n \"lucide:square-round-corner\": {\n \"body\": \"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"M21 11a8 8 0 0 0-8-8m8 12v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4\\\"/>\",\n \"width\": 24,\n \"height\": 24\n },\n \"lucide:stamp\": {\n \"body\": \"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"M14 13V8.5C14 7 15 7 15 5a3 3 0 0 0-6 0c0 2 1 2 1 3.5V13m10 2.5a2.5 2.5 0 0 0-2.5-2.5h-11A2.5 2.5 0 0 0 4 15.5V17a1 1 0 0 0 1 1h14a1 1 0 0 0 1-1zM5 22h14\\\"/>\",\n \"width\": 24,\n \"height\": 24\n },\n \"lucide:star\": {\n \"body\": \"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"M11.525 2.295a.53.53 0 0 1 .95 0l2.31 4.679a2.12 2.12 0 0 0 1.595 1.16l5.166.756a.53.53 0 0 1 .294.904l-3.736 3.638a2.12 2.12 0 0 0-.611 1.878l.882 5.14a.53.53 0 0 1-.771.56l-4.618-2.428a2.12 2.12 0 0 0-1.973 0L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.12 2.12 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.12 2.12 0 0 0 1.597-1.16z\\\"/>\",\n \"width\": 24,\n \"height\": 24\n },\n \"lucide:sun\": {\n \"body\": \"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><circle cx=\\\"12\\\" cy=\\\"12\\\" r=\\\"4\\\"/><path d=\\\"M12 2v2m0 16v2M4.93 4.93l1.41 1.41m11.32 11.32l1.41 1.41M2 12h2m16 0h2M6.34 17.66l-1.41 1.41M19.07 4.93l-1.41 1.41\\\"/></g>\",\n \"width\": 24,\n \"height\": 24\n },\n \"lucide:text-cursor\": {\n \"body\": \"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"M17 22h-1a4 4 0 0 1-4-4V6a4 4 0 0 1 4-4h1M7 22h1a4 4 0 0 0 4-4M7 2h1a4 4 0 0 1 4 4\\\"/>\",\n \"width\": 24,\n \"height\": 24\n },\n \"lucide:trash\": {\n \"body\": \"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6M3 6h18M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2\\\"/>\",\n \"width\": 24,\n \"height\": 24\n },\n \"lucide:trending-up\": {\n \"body\": \"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><path d=\\\"M16 7h6v6\\\"/><path d=\\\"m22 7l-8.5 8.5l-5-5L2 17\\\"/></g>\",\n \"width\": 24,\n \"height\": 24\n },\n \"lucide:triangle\": {\n \"body\": \"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"M13.73 4a2 2 0 0 0-3.46 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3Z\\\"/>\",\n \"width\": 24,\n \"height\": 24\n },\n \"lucide:type\": {\n \"body\": \"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"M12 4v16M4 7V5a1 1 0 0 1 1-1h14a1 1 0 0 1 1 1v2M9 20h6\\\"/>\",\n \"width\": 24,\n \"height\": 24\n },\n \"lucide:undo-2\": {\n \"body\": \"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><path d=\\\"M9 14L4 9l5-5\\\"/><path d=\\\"M4 9h10.5a5.5 5.5 0 0 1 5.5 5.5a5.5 5.5 0 0 1-5.5 5.5H11\\\"/></g>\",\n \"width\": 24,\n \"height\": 24\n },\n \"lucide:venetian-mask\": {\n \"body\": \"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><path d=\\\"M18 11c-1.5 0-2.5.5-3 2\\\"/><path d=\\\"M4 6a2 2 0 0 0-2 2v4a5 5 0 0 0 5 5a8 8 0 0 1 5 2a8 8 0 0 1 5-2a5 5 0 0 0 5-5V8a2 2 0 0 0-2-2h-3a8 8 0 0 0-5 2a8 8 0 0 0-5-2z\\\"/><path d=\\\"M6 11c1.5 0 2.5.5 3 2\\\"/></g>\",\n \"width\": 24,\n \"height\": 24\n },\n \"lucide:waves\": {\n \"body\": \"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"M2 6c.6.5 1.2 1 2.5 1C7 7 7 5 9.5 5c2.6 0 2.4 2 5 2c2.5 0 2.5-2 5-2c1.3 0 1.9.5 2.5 1M2 12c.6.5 1.2 1 2.5 1c2.5 0 2.5-2 5-2c2.6 0 2.4 2 5 2c2.5 0 2.5-2 5-2c1.3 0 1.9.5 2.5 1M2 18c.6.5 1.2 1 2.5 1c2.5 0 2.5-2 5-2c2.6 0 2.4 2 5 2c2.5 0 2.5-2 5-2c1.3 0 1.9.5 2.5 1\\\"/>\",\n \"width\": 24,\n \"height\": 24\n },\n \"material-symbols:award-star-outline\": {\n \"body\": \"<path fill=\\\"currentColor\\\" d=\\\"M9.075 16.25L12 14.475l2.925 1.775l-.775-3.325l2.6-2.25l-3.425-.275L12 7.25l-1.325 3.15l-3.425.275l2.6 2.25zM12 23.3L8.65 20H4v-4.65L.7 12L4 8.65V4h4.65L12 .7L15.35 4H20v4.65L23.3 12L20 15.35V20h-4.65zm0-2.8l2.5-2.5H18v-3.5l2.5-2.5L18 9.5V6h-3.5L12 3.5L9.5 6H6v3.5L3.5 12L6 14.5V18h3.5zm0-8.5\\\"/>\",\n \"width\": 24,\n \"height\": 24\n },\n \"mdi:cube-outline\": {\n \"body\": \"<path fill=\\\"currentColor\\\" d=\\\"M21 16.5c0 .38-.21.71-.53.88l-7.9 4.44c-.16.12-.36.18-.57.18s-.41-.06-.57-.18l-7.9-4.44A.99.99 0 0 1 3 16.5v-9c0-.38.21-.71.53-.88l7.9-4.44c.16-.12.36-.18.57-.18s.41.06.57.18l7.9 4.44c.32.17.53.5.53.88zM12 4.15L6.04 7.5L12 10.85l5.96-3.35zM5 15.91l6 3.38v-6.71L5 9.21zm14 0v-6.7l-6 3.37v6.71z\\\"/>\",\n \"width\": 24,\n \"height\": 24\n },\n \"mdi:format-color-fill\": {\n \"body\": \"<path fill=\\\"currentColor\\\" d=\\\"M19 11.5s-2 2.17-2 3.5a2 2 0 0 0 2 2a2 2 0 0 0 2-2c0-1.33-2-3.5-2-3.5M5.21 10L10 5.21L14.79 10m1.77-1.06L7.62 0L6.21 1.41l2.38 2.38l-5.15 5.15c-.59.56-.59 1.53 0 2.12l5.5 5.5c.29.29.68.44 1.06.44s.77-.15 1.06-.44l5.5-5.5c.59-.59.59-1.56 0-2.12\\\"/>\",\n \"width\": 24,\n \"height\": 24\n },\n \"mdi:image-remove\": {\n \"body\": \"<path fill=\\\"currentColor\\\" d=\\\"M13.3 21H5c-1.1 0-2-.9-2-2V5c0-1.1.9-2 2-2h14c1.1 0 2 .9 2 2v8.3c-.6-.2-1.3-.3-2-.3c-1.1 0-2.2.3-3.1.9L14.5 12L11 16.5l-2.5-3L5 18h8.1c-.1.3-.1.7-.1 1c0 .7.1 1.4.3 2m7.1-2l2.1 2.1l-1.4 1.4l-2.1-2.1l-2.1 2.1l-1.4-1.4l2.1-2.1l-2.1-2.1l1.4-1.4l2.1 2.1l2.1-2.1l1.4 1.4z\\\"/>\",\n \"width\": 24,\n \"height\": 24\n },\n \"ph:monitor-fill\": {\n \"body\": \"<path fill=\\\"currentColor\\\" d=\\\"M232 64v112a24 24 0 0 1-24 24H48a24 24 0 0 1-24-24V64a24 24 0 0 1 24-24h160a24 24 0 0 1 24 24m-72 152H96a8 8 0 0 0 0 16h64a8 8 0 0 0 0-16\\\"/>\",\n \"width\": 256,\n \"height\": 256\n },\n \"radix-icons:font-size\": {\n \"body\": \"<path fill=\\\"currentColor\\\" d=\\\"M2.5 2.1a.4.4 0 0 1 .283.117l2 2l.05.064a.4.4 0 0 1-.05.503a.4.4 0 0 1-.503.05l-.063-.05L2.9 3.467v8.067l1.317-1.317a.4.4 0 0 1 .566.566l-2 2a.4.4 0 0 1-.566 0l-2-2l-.051-.063a.4.4 0 0 1 .554-.554l.063.051l1.316 1.316V3.467L.783 4.784a.401.401 0 0 1-.566-.567l2-2l.061-.05A.4.4 0 0 1 2.5 2.1m5.47 9.64a.501.501 0 0 1-.94-.34zm2.53-8.99a.5.5 0 0 1 .47.33l3 8.32a.5.5 0 0 1-.94.34l-.983-2.724H8.953l-.982 2.724l-.471-.17l-.47-.17l3-8.32l.031-.07a.5.5 0 0 1 .439-.26M9.259 8.166h2.482L10.5 4.725z\\\"/>\",\n \"width\": 15,\n \"height\": 15\n }\n};\n","/**\n * Icon Registry - Registers only the icons actually used in the canvas package\n *\n * This ensures icons work when the canvas package is bundled and used in\n * consuming applications (like Next.js) where CDN icon loading may fail.\n *\n * Icons are auto-generated by scripts/generate-icons.ts which scans the source\n * files and extracts only the SVG data for icons that are actually used.\n * This dramatically reduces bundle size compared to bundling entire icon sets.\n *\n * To regenerate after adding new icons:\n * pnpm generate:icons\n *\n * ## SSR safety (load-bearing)\n *\n * `@iconify/react` is a *browser* dependency: importing it can evaluate\n * browser-only globals (e.g. `window`) at module-evaluation time. Because the\n * package barrels (`api/stable.ts`, `api/advanced.ts`, `components/embed`) call\n * {@link ensureIconsRegistered} as a top-level side effect, a *static*\n * `import '@iconify/react'` in this file would run iconify the instant any\n * consumer `import`s `@snowcone-app/canvas` — crashing Next.js App Router /\n * any SSR/RSC context with `ReferenceError: window is not defined` even for a\n * pure server-only import of `serializeStateForServer`.\n *\n * To keep the barrel side-effect-free w.r.t. browser globals, iconify is loaded\n * via a *dynamic* `import()` that only runs in a browser. On the server\n * {@link ensureIconsRegistered} is a no-op; in the browser it registers icons\n * asynchronously on first call. The `Icon` component reads icon data lazily, so\n * registration completing on the first client microtask is fine.\n *\n * @see https://iconify.design/docs/icons/json.html\n */\n\nimport { canvasIcons } from './icon-data.js';\n\n/** True only in a real browser/DOM context. */\nconst isBrowser = typeof window !== 'undefined';\n\n/**\n * Registers all icons used in the canvas package.\n *\n * Loads `@iconify/react` via dynamic `import()` so the module is never touched\n * during server-side module evaluation. No-op (resolves immediately) outside a\n * browser.\n *\n * This registers only the ~100-150 icons actually used, rather than ~20,000+\n * icons from the full icon sets.\n */\nexport async function registerCanvasIcons(): Promise<void> {\n if (!isBrowser) return;\n const { addIcon } = await import('@iconify/react');\n for (const [name, data] of Object.entries(canvasIcons)) {\n addIcon(name, data);\n }\n}\n\n// Track registration so we only kick it off once.\nlet registrationStarted = false;\n\n/**\n * Ensures icons are registered exactly once.\n *\n * Safe to call at module-evaluation time and on the server: on the server it\n * does nothing; in the browser it kicks off async registration on the first\n * call. Subsequent calls are no-ops.\n */\nexport function ensureIconsRegistered(): void {\n if (registrationStarted || !isBrowser) return;\n registrationStarted = true;\n // Fire-and-forget: registration runs on the first client microtask. Swallow\n // failures so a transient iconify load error never takes down the editor.\n void registerCanvasIcons().catch(() => {\n // Allow a retry on a later call if the dynamic import failed.\n registrationStarted = false;\n });\n}\n","/**\n * useLayers - Hook for accessing layer data with hierarchy and operations\n * Provides layer tree with preview images for custom layer panels\n */\n\nimport { useMemo, useCallback, useRef, useState, useEffect } from 'react';\nimport { useEditor } from '../contexts/EditorContext.js';\nimport { GroupElement } from '../core/GroupElement.js';\nimport { TextElement } from '../core/TextElement.js';\nimport { ImageElement } from '../core/ImageElement.js';\nimport { getElementPreviewPainter } from '../core/preview-registry.js';\nimport { createLogger } from '../utils/logger.js';\nimport type { EditorElement } from '../contexts/EditorContext.js';\nimport type { TransformType } from '../types/index.js';\nimport type { ArtboardManager } from '../core/ArtboardManager.js';\n\nconst log = createLogger('Layers');\n\n/** Debounce window for autoRefreshPreviews so rapid edits coalesce. */\nconst AUTO_REFRESH_PREVIEWS_DEBOUNCE_MS = 150;\n\nexport interface LayerInfo {\n id: string;\n name: string;\n type: TransformType;\n visible: boolean;\n locked: boolean;\n isSelected: boolean;\n isGroup: boolean;\n depth: number;\n parentId: string | null;\n children?: LayerInfo[];\n\n // Preview image generation (implemented in Sprint 2)\n previewUrl: string | null; // Data URL for thumbnail\n refreshPreview: () => Promise<void>;\n}\n\nexport interface UseLayersOptions {\n artboardId?: string | null; // Filter by artboard (default: active)\n includeHidden?: boolean; // Include hidden layers (default: true)\n previewSize?: number; // Preview thumbnail size (default: 64)\n previewBackgroundColor?: string; // Preview background color (default: the artboard's backgroundColor, falling back to transparent)\n autoRefreshPreviews?: boolean; // Auto-regenerate previews when elements change (default: false)\n}\n\nexport interface UseLayersReturn {\n // Hierarchical layer tree\n layers: LayerInfo[];\n flatLayers: LayerInfo[]; // Flat list for simple rendering\n\n // Selection\n selectedLayers: LayerInfo[];\n selectLayer: (id: string, addToSelection?: boolean) => void;\n selectMultipleLayers: (ids: string[]) => void;\n clearSelection: () => void;\n\n // Operations\n toggleVisibility: (id: string) => void;\n toggleLock: (id: string) => void;\n renameLayer: (id: string, name: string) => void;\n deleteLayer: (id: string) => void;\n duplicateLayer: (id: string) => void;\n reorderLayers: (fromIndex: number, toIndex: number) => void;\n reorderById: (draggedId: string, targetId: string, position: 'before' | 'after') => void;\n reorderWithinGroup: (draggedId: string, targetId: string, position: 'before' | 'after', groupId: string) => void;\n moveLayerForward: (id: string) => void;\n moveLayerBackward: (id: string) => void;\n groupLayers: (ids: string[]) => void;\n ungroupLayer: (id: string) => void;\n addToGroup: (elementId: string, groupId: string) => void;\n removeFromGroup: (elementId: string, targetId?: string, position?: 'before' | 'after') => void;\n createEmptyGroup: () => void;\n findElementById: (id: string) => EditorElement | null;\n findParentGroup: (id: string) => GroupElement | null;\n\n // Preview management (implemented in Sprint 2)\n generateAllPreviews: (size?: number) => Promise<void>;\n clearPreviewCache: () => void;\n\n // Artboard filtering\n artboardId: string | null; // Current artboard\n artboardManager: ArtboardManager; // Access to artboard manager for advanced use cases\n layerCount: number;\n}\n\n/**\n * Generate preview image for an element (async wrapper for shared utility)\n * Uses the shared ElementPreviewRenderer for consistency\n */\nasync function generateElementPreviewAsync(\n element: EditorElement,\n size: number = 64,\n backgroundColor: string = 'transparent'\n): Promise<string | null> {\n try {\n // Preview painting goes through the preview registry (Editor.Layers must\n // stay renderer-free — D9): the heavy side registers the shared renderer;\n // no painter = rendering engine not loaded (canvas-free composition) and\n // the panel shows its icon placeholder instead.\n const paint = getElementPreviewPainter();\n if (!paint) return null;\n const preview = paint(element, {\n width: size,\n height: size,\n padding: 8,\n backgroundColor,\n });\n return preview || null;\n } catch (error) {\n log.error('Failed to generate preview:', error);\n return null;\n }\n}\n\n/**\n * Build hierarchical layer tree from flat element list\n */\nfunction buildLayerTree(\n elements: EditorElement[],\n selectedId: string | null,\n multiSelection: string[],\n previewCache: Map<string, string | null>,\n generatePreview: (id: string) => Promise<void>,\n depth: number = 0,\n parentId: string | null = null\n): LayerInfo[] {\n // Find elements at this level.\n // At depth > 0, `elements` is already the direct children array from\n // GroupElement.children — no filtering needed.\n // At depth 0 (top level), filter to elements that aren't nested in a group.\n const layersAtLevel = depth > 0 ? elements : elements.filter(el => {\n const elParentId = (el as unknown as Record<string, unknown>).parentId as string | null ?? null;\n if (el instanceof GroupElement) {\n return elParentId === null;\n }\n return elParentId === null;\n });\n\n return layersAtLevel.map(element => {\n const isGroup = element instanceof GroupElement;\n const isSelected = selectedId === element.id || multiSelection.includes(element.id);\n\n const layerInfo: LayerInfo = {\n id: element.id,\n name: element.name || `Layer ${element.id.slice(0, 8)}`,\n type: element.transformType,\n visible: element.visible ?? true,\n locked: element.locked ?? false,\n isSelected,\n isGroup,\n depth,\n parentId,\n previewUrl: previewCache.get(element.id) || null,\n refreshPreview: async () => {\n await generatePreview(element.id);\n },\n };\n\n // Recursively build children for groups\n if (isGroup && element instanceof GroupElement) {\n layerInfo.children = buildLayerTree(\n element.children,\n selectedId,\n multiSelection,\n previewCache,\n generatePreview,\n depth + 1,\n element.id\n );\n }\n\n return layerInfo;\n });\n}\n\n/**\n * Flatten hierarchical layer tree\n */\nfunction flattenLayerTree(layers: LayerInfo[]): LayerInfo[] {\n const result: LayerInfo[] = [];\n for (const layer of layers) {\n result.push(layer);\n if (layer.children) {\n result.push(...flattenLayerTree(layer.children));\n }\n }\n return result;\n}\n\n/**\n * Hook for accessing layer data and operations\n * Must be used within EditorProvider\n *\n * @example\n * ```tsx\n * function CustomLayersPanel() {\n * const { layers, selectLayer, toggleVisibility, deleteLayer } = useLayers({\n * previewSize: 80,\n * autoRefreshPreviews: true\n * });\n *\n * return (\n * <div className=\"layers-panel\">\n * {layers.map(layer => (\n * <div\n * key={layer.id}\n * className={layer.isSelected ? 'selected' : ''}\n * style={{ paddingLeft: layer.depth * 20 }}\n * >\n * {layer.previewUrl && (\n * <img src={layer.previewUrl} alt={layer.name} width={40} />\n * )}\n * <span onClick={() => selectLayer(layer.id)}>{layer.name}</span>\n * <button onClick={() => toggleVisibility(layer.id)}>\n * {layer.visible ? '👁' : '🚫'}\n * </button>\n * <button onClick={() => deleteLayer(layer.id)}>🗑</button>\n * </div>\n * ))}\n * </div>\n * );\n * }\n * ```\n */\nexport function useLayers(options: UseLayersOptions = {}): UseLayersReturn {\n const {\n artboardId: filterArtboardId,\n includeHidden = true,\n previewSize = 64,\n previewBackgroundColor,\n autoRefreshPreviews = false,\n } = options;\n\n const {\n elements,\n selectedId,\n multiSelection,\n artboardManager,\n handleSelectionChange,\n handleElementUpdate,\n setMultiSelection,\n executeAddElement,\n executeRemoveElement,\n executeReorderElement,\n } = useEditor();\n\n // Preview cache and version for triggering re-renders\n const previewCache = useRef<Map<string, string | null>>(new Map());\n const [previewVersion, setPreviewVersion] = useState(0);\n\n // Determine which artboard to filter by\n const activeArtboardId = artboardManager.getActiveArtboardId();\n const effectiveArtboardId = filterArtboardId !== undefined ? filterArtboardId : activeArtboardId;\n\n // Resolve the preview background. An explicit option always wins (including\n // explicit 'transparent'); otherwise default to the artboard's own\n // backgroundColor so dark layers stay visible as thumbnails on dark UIs.\n const effectiveArtboard = effectiveArtboardId\n ? artboardManager.getArtboard?.(effectiveArtboardId)\n : null;\n const resolvedPreviewBackgroundColor =\n previewBackgroundColor ?? effectiveArtboard?.backgroundColor ?? 'transparent';\n\n // Generate preview for a specific element\n const generatePreview = useCallback(async (elementId: string) => {\n const element = elements.find(el => el.id === elementId);\n if (!element) return;\n\n const preview = await generateElementPreviewAsync(element, previewSize, resolvedPreviewBackgroundColor);\n previewCache.current.set(elementId, preview);\n // Trigger re-render by updating version\n setPreviewVersion(v => v + 1);\n }, [elements, previewSize, resolvedPreviewBackgroundColor]);\n\n // Filter elements by artboard\n const filteredElements = useMemo(() => {\n let filtered = elements;\n\n // Filter by artboard using ArtboardManager\n if (effectiveArtboardId) {\n const elementIds = artboardManager.getElementsOnArtboard(effectiveArtboardId);\n filtered = filtered.filter(el => elementIds.includes(el.id));\n }\n\n // Filter hidden elements if needed\n if (!includeHidden) {\n filtered = filtered.filter(el => el.visible !== false);\n }\n\n return filtered;\n }, [elements, effectiveArtboardId, includeHidden, artboardManager]);\n\n // Build hierarchical layer tree\n const layers = useMemo(() => {\n return buildLayerTree(\n filteredElements,\n selectedId,\n multiSelection,\n previewCache.current,\n generatePreview\n );\n }, [filteredElements, selectedId, multiSelection, generatePreview, previewVersion]);\n\n // Flatten layer tree\n const flatLayers = useMemo(() => {\n return flattenLayerTree(layers);\n }, [layers]);\n\n // Get selected layers\n const selectedLayers = useMemo(() => {\n return flatLayers.filter(layer => layer.isSelected);\n }, [flatLayers]);\n\n // Select layer\n const selectLayer = useCallback((id: string, addToSelection: boolean = false) => {\n if (addToSelection) {\n // Add to multi-selection\n if (multiSelection.includes(id)) {\n // Deselect if already selected\n setMultiSelection(multiSelection.filter(sid => sid !== id));\n } else {\n // Add to selection\n setMultiSelection([...multiSelection, id]);\n }\n } else {\n // Single selection\n handleSelectionChange(id);\n }\n }, [multiSelection, setMultiSelection, handleSelectionChange]);\n\n // Select multiple layers\n const selectMultipleLayers = useCallback((ids: string[]) => {\n setMultiSelection(ids);\n }, [setMultiSelection]);\n\n // Clear selection\n const clearSelection = useCallback(() => {\n handleSelectionChange(null);\n setMultiSelection([]);\n }, [handleSelectionChange, setMultiSelection]);\n\n // Toggle visibility\n const toggleVisibility = useCallback((id: string) => {\n const element = elements.find(el => el.id === id);\n if (!element) return;\n\n const updated = element.clone();\n updated.visible = !(element.visible ?? true);\n handleElementUpdate(updated);\n }, [elements, handleElementUpdate]);\n\n // Toggle lock\n const toggleLock = useCallback((id: string) => {\n const element = elements.find(el => el.id === id);\n if (!element) return;\n\n const updated = element.clone();\n updated.locked = !(element.locked ?? false);\n handleElementUpdate(updated);\n }, [elements, handleElementUpdate]);\n\n // Rename layer\n const renameLayer = useCallback((id: string, name: string) => {\n const element = elements.find(el => el.id === id);\n if (!element) return;\n\n const updated = element.clone();\n updated.name = name;\n handleElementUpdate(updated);\n }, [elements, handleElementUpdate]);\n\n // Delete layer\n const deleteLayer = useCallback((id: string) => {\n const element = elements.find(el => el.id === id);\n if (!element) {\n log.warn(`Element ${id} not found for deletion`);\n return;\n }\n\n executeRemoveElement(element);\n\n // Clear selection if deleted element was selected\n if (selectedId === id || multiSelection.includes(id)) {\n handleSelectionChange(null);\n setMultiSelection(multiSelection.filter(sid => sid !== id));\n }\n }, [elements, executeRemoveElement, selectedId, multiSelection, handleSelectionChange, setMultiSelection]);\n\n // Duplicate layer\n const duplicateLayer = useCallback((id: string) => {\n const element = elements.find(el => el.id === id);\n if (!element) {\n log.warn(`Element ${id} not found for duplication`);\n return;\n }\n\n // Clone the element and reconstruct with a new ID\n const cloned = element.clone();\n const json = cloned.toJSON();\n // Remove old ID so constructor generates a new one\n delete (json as Record<string, unknown>).id;\n // Reconstruct to get a new ID\n const Constructor = element.constructor as new (config: Record<string, unknown>) => EditorElement;\n const clonedWithNewId = new Constructor(json as Record<string, unknown>);\n\n // Offset position slightly so it's visible\n clonedWithNewId.x = element.x + 20;\n clonedWithNewId.y = element.y + 20;\n\n // Get artboard for this element\n const artboardId = artboardManager.getArtboardIdForElement(id);\n if (!artboardId) {\n log.warn(`Element ${id} not associated with any artboard`);\n return;\n }\n\n // Add cloned element after the original\n executeAddElement(clonedWithNewId, artboardId, id);\n\n // Select the duplicated element\n handleSelectionChange(clonedWithNewId.id);\n }, [elements, artboardManager, executeAddElement, handleSelectionChange]);\n\n // Reorder layers\n const reorderLayers = useCallback((fromIndex: number, toIndex: number) => {\n if (fromIndex === toIndex) return;\n if (fromIndex < 0 || fromIndex >= filteredElements.length) {\n log.warn(`Invalid fromIndex: ${fromIndex}`);\n return;\n }\n if (toIndex < 0 || toIndex >= filteredElements.length) {\n log.warn(`Invalid toIndex: ${toIndex}`);\n return;\n }\n\n const draggedElement = filteredElements[fromIndex];\n const targetElement = filteredElements[toIndex];\n\n // Determine position based on direction\n const position = fromIndex < toIndex ? 'after' : 'before';\n\n executeReorderElement(draggedElement.id, targetElement.id, position);\n }, [filteredElements, executeReorderElement]);\n\n // Move layer one position forward (toward front/top of stack)\n // In the element array, higher index = rendered on top = \"forward\"\n const moveLayerForward = useCallback((id: string) => {\n const index = flatLayers.findIndex(l => l.id === id);\n if (index < 0) {\n log.warn(`Layer ${id} not found`);\n return;\n }\n if (index >= flatLayers.length - 1) {\n // Already at the front (last in array = top of stack)\n return;\n }\n reorderLayers(index, index + 1);\n }, [flatLayers, reorderLayers]);\n\n // Move layer one position backward (toward back/bottom of stack)\n // In the element array, lower index = rendered first = \"backward\"\n const moveLayerBackward = useCallback((id: string) => {\n const index = flatLayers.findIndex(l => l.id === id);\n if (index < 0) {\n log.warn(`Layer ${id} not found`);\n return;\n }\n if (index <= 0) {\n // Already at the back (first in array = bottom of stack)\n return;\n }\n reorderLayers(index, index - 1);\n }, [flatLayers, reorderLayers]);\n\n // Group layers\n const groupLayers = useCallback((ids: string[]) => {\n if (ids.length < 2) {\n log.warn('Need at least 2 elements to create a group');\n return;\n }\n\n // Find all elements to group (filter out ShapeElements - they can't be grouped)\n const elementsToGroup = elements.filter(el =>\n ids.includes(el.id) && el.transformType !== 'shape'\n ) as (TextElement | ImageElement | GroupElement)[];\n\n if (elementsToGroup.length < 2) {\n log.warn('Need at least 2 groupable elements (shapes cannot be grouped)');\n return;\n }\n\n // All elements must be on the same artboard\n const artboardIds = elementsToGroup.map(el => artboardManager.getArtboardIdForElement(el.id));\n const uniqueArtboardIds = [...new Set(artboardIds)];\n if (uniqueArtboardIds.length !== 1 || !uniqueArtboardIds[0]) {\n log.warn('All elements must be on the same artboard to group');\n return;\n }\n const artboardId = uniqueArtboardIds[0];\n\n // Calculate group bounding box\n const bboxes = elementsToGroup.map(el => el.getBoundingBox()).filter(Boolean);\n if (bboxes.length === 0) {\n log.warn('Could not calculate bounding boxes for group');\n return;\n }\n\n const minX = Math.min(...bboxes.map(b => b!.x));\n const minY = Math.min(...bboxes.map(b => b!.y));\n\n // Create group element\n const group = new GroupElement({\n x: minX,\n y: minY,\n });\n\n // Set children manually (GroupElement constructor accepts instances but type is for configs)\n group.children = elementsToGroup.map(el => {\n const clone = el.clone() as TextElement | ImageElement | GroupElement;\n // Convert to relative positioning\n clone.x = el.x - minX;\n clone.y = el.y - minY;\n return clone;\n });\n\n // Remove individual elements and add group\n elementsToGroup.forEach(el => executeRemoveElement(el));\n executeAddElement(group, artboardId);\n\n // Select the new group\n handleSelectionChange(group.id);\n setMultiSelection([]);\n }, [elements, artboardManager, executeRemoveElement, executeAddElement, handleSelectionChange, setMultiSelection]);\n\n // Ungroup layer\n const ungroupLayer = useCallback((id: string) => {\n const element = elements.find(el => el.id === id);\n if (!element) {\n log.warn(`Element ${id} not found for ungrouping`);\n return;\n }\n\n if (!(element instanceof GroupElement)) {\n log.warn(`Element ${id} is not a group`);\n return;\n }\n\n const group = element as GroupElement;\n if (!group.children || group.children.length === 0) {\n log.warn(`Group ${id} has no children`);\n return;\n }\n\n // Get artboard for this group\n const artboardId = artboardManager.getArtboardIdForElement(id);\n if (!artboardId) {\n log.warn(`Group ${id} not associated with any artboard`);\n return;\n }\n\n // Extract children and convert to absolute positioning\n const extractedChildren = group.children.map(child => {\n const clone = child.clone();\n clone.x = child.x + group.x;\n clone.y = child.y + group.y;\n return clone;\n });\n\n // Remove group and add children\n executeRemoveElement(group);\n extractedChildren.forEach(child => executeAddElement(child, artboardId));\n\n // Select first extracted child\n if (extractedChildren.length > 0) {\n handleSelectionChange(extractedChildren[0].id);\n }\n setMultiSelection([]);\n }, [elements, artboardManager, executeRemoveElement, executeAddElement, handleSelectionChange, setMultiSelection]);\n\n // Generate all previews\n const generateAllPreviews = useCallback(async (size: number = previewSize) => {\n\n // Generate previews for all elements, including group children\n const generateForElements = async (elements: EditorElement[]) => {\n for (const element of elements) {\n const preview = await generateElementPreviewAsync(element, size, resolvedPreviewBackgroundColor);\n previewCache.current.set(element.id, preview);\n // Recurse into group children\n if (element instanceof GroupElement && element.children.length > 0) {\n await generateForElements(element.children as unknown as EditorElement[]);\n }\n }\n };\n await generateForElements(filteredElements);\n\n // Trigger re-render by updating version\n setPreviewVersion(v => v + 1);\n }, [previewSize, resolvedPreviewBackgroundColor, filteredElements]);\n\n // Auto-refresh previews: regenerate whenever the elements (or preview\n // settings) change. `generateAllPreviews` gets a new identity exactly when\n // `filteredElements`, `previewSize`, or the resolved background change, so\n // it doubles as the version key. Debounced so rapid edits (drag, typing)\n // coalesce into one regeneration.\n useEffect(() => {\n if (!autoRefreshPreviews) return;\n\n const timer = setTimeout(() => {\n void generateAllPreviews();\n }, AUTO_REFRESH_PREVIEWS_DEBOUNCE_MS);\n\n return () => clearTimeout(timer);\n }, [autoRefreshPreviews, generateAllPreviews]);\n\n // Clear preview cache\n const clearPreviewCache = useCallback(() => {\n previewCache.current.clear();\n }, []);\n\n // ── ID-based helpers for drag-drop ─────────────────────────────────────\n\n /** Reorder by element IDs (wraps executeReorderElement) */\n const reorderById = useCallback(\n (draggedId: string, targetId: string, position: 'before' | 'after') => {\n executeReorderElement(draggedId, targetId, position);\n },\n [executeReorderElement]\n );\n\n /** Reorder children within a group */\n const reorderWithinGroup = useCallback(\n (draggedId: string, targetId: string, position: 'before' | 'after', groupId: string) => {\n const group = elements.find(el => el.id === groupId);\n if (!group || !(group instanceof GroupElement)) {\n log.warn(`Group ${groupId} not found for reorder`);\n return;\n }\n\n const newGroup = group.clone() as GroupElement;\n const draggedIndex = newGroup.children.findIndex(c => c.id === draggedId);\n const targetIndex = newGroup.children.findIndex(c => c.id === targetId);\n if (draggedIndex === -1 || targetIndex === -1) {\n log.warn(`Children not found in group for reorder: ${draggedId}, ${targetId}`);\n return;\n }\n\n // Remove dragged child and re-insert at target position\n const [dragged] = newGroup.children.splice(draggedIndex, 1);\n const newTargetIndex = newGroup.children.findIndex(c => c.id === targetId);\n const insertIndex = position === 'before' ? newTargetIndex : newTargetIndex + 1;\n newGroup.children.splice(insertIndex, 0, dragged);\n\n handleElementUpdate(newGroup);\n },\n [elements, handleElementUpdate]\n );\n\n /** Find an element by ID */\n const findElementById = useCallback(\n (id: string): EditorElement | null => {\n // Check top-level elements\n for (const el of elements) {\n if (el.id === id) return el;\n // Check group children\n if (el instanceof GroupElement) {\n const child = el.children.find(c => c.id === id);\n if (child) return child as unknown as EditorElement;\n }\n }\n return null;\n },\n [elements]\n );\n\n /** Find the parent group of an element */\n const findParentGroup = useCallback(\n (id: string): GroupElement | null => {\n for (const el of elements) {\n if (el instanceof GroupElement) {\n if (el.children.some(child => child.id === id)) {\n return el;\n }\n }\n }\n return null;\n },\n [elements]\n );\n\n /** Add an element into a group */\n const addToGroup = useCallback(\n (elementId: string, groupId: string) => {\n const element = elements.find(el => el.id === elementId);\n const group = elements.find(el => el.id === groupId);\n if (!element || !group || !(group instanceof GroupElement)) {\n log.warn(`Cannot add ${elementId} to group ${groupId}`);\n return;\n }\n\n const artboardId = artboardManager.getArtboardIdForElement(elementId);\n if (!artboardId) return;\n\n // Clone group and add element as child.\n // Children in a GroupElement use WORLD coordinates (not relative to group center).\n // addChild() calls updateBoundsFromChildren() which recalculates group.x/y\n // to the center of the bounding box, but children positions stay unchanged.\n const newGroup = group.clone() as GroupElement;\n const childClone = element.clone() as TextElement | ImageElement | GroupElement;\n childClone.x = element.x;\n childClone.y = element.y;\n newGroup.addChild(childClone);\n\n // Remove original element and update group\n executeRemoveElement(element);\n handleElementUpdate(newGroup);\n },\n [elements, artboardManager, executeRemoveElement, handleElementUpdate]\n );\n\n /** Remove an element from its parent group (promote to top level).\n * Optional targetId + position specify where to insert in the top-level array.\n * Without them, inserts before the group (= below it visually). */\n const removeFromGroup = useCallback(\n (elementId: string, targetId?: string, position?: 'before' | 'after') => {\n const parentGroup = findParentGroup(elementId);\n if (!parentGroup) {\n log.warn(`Element ${elementId} is not inside a group`);\n return;\n }\n\n const child = parentGroup.children.find(c => c.id === elementId);\n if (!child) return;\n\n const artboardId = artboardManager.getArtboardIdForElement(parentGroup.id!);\n if (!artboardId) return;\n\n // Clone the child — children already use world coordinates, no conversion needed\n const promoted = child.clone();\n\n // Update group without this child\n const newGroup = parentGroup.clone() as GroupElement;\n newGroup.removeChild(elementId);\n\n handleElementUpdate(newGroup);\n\n // Insert at the specified position, or default to before the group\n if (targetId && position) {\n // position is already in array terms (inverted by caller)\n const insertAfter = position === 'after' ? targetId : undefined;\n const insertBefore = position === 'before' ? targetId : undefined;\n executeAddElement(promoted, artboardId, insertAfter, insertBefore);\n } else {\n // Default: insert before the group in array = below it visually\n executeAddElement(promoted, artboardId, undefined, parentGroup.id!);\n }\n handleSelectionChange(promoted.id);\n },\n [findParentGroup, artboardManager, executeRemoveElement, handleElementUpdate, executeAddElement, handleSelectionChange]\n );\n\n /** Create an empty group on the active artboard */\n const createEmptyGroup = useCallback(() => {\n const artboardId = artboardManager.getActiveArtboardId();\n if (!artboardId) {\n log.warn('No active artboard for creating a group');\n return;\n }\n\n const group = new GroupElement({\n x: 0,\n y: 0,\n name: 'New Group',\n });\n\n executeAddElement(group, artboardId);\n handleSelectionChange(group.id);\n }, [artboardManager, executeAddElement, handleSelectionChange]);\n\n return {\n layers,\n flatLayers,\n selectedLayers,\n selectLayer,\n selectMultipleLayers,\n clearSelection,\n toggleVisibility,\n toggleLock,\n renameLayer,\n deleteLayer,\n duplicateLayer,\n reorderLayers,\n reorderById,\n reorderWithinGroup,\n moveLayerForward,\n moveLayerBackward,\n groupLayers,\n ungroupLayer,\n addToGroup,\n removeFromGroup,\n createEmptyGroup,\n findElementById,\n findParentGroup,\n generateAllPreviews,\n clearPreviewCache,\n artboardId: effectiveArtboardId,\n artboardManager,\n layerCount: flatLayers.length,\n };\n}\n","'use client';\n\nimport { createElement, forwardRef, useState, useEffect } from 'react';\n\n/**\n* Resolve icon set icons\n*\n* Returns parent icon for each icon\n*/\nfunction getIconsTree(data, names) {\n\tconst icons = data.icons;\n\tconst aliases = data.aliases || Object.create(null);\n\tconst resolved = Object.create(null);\n\tfunction resolve(name) {\n\t\tif (icons[name]) return resolved[name] = [];\n\t\tif (!(name in resolved)) {\n\t\t\tresolved[name] = null;\n\t\t\tconst parent = aliases[name] && aliases[name].parent;\n\t\t\tconst value = parent && resolve(parent);\n\t\t\tif (value) resolved[name] = [parent].concat(value);\n\t\t}\n\t\treturn resolved[name];\n\t}\n\t(Object.keys(icons).concat(Object.keys(aliases))).forEach(resolve);\n\treturn resolved;\n}\n\n/**\n* Default values for dimensions\n*/\nconst defaultIconDimensions = Object.freeze({\n\tleft: 0,\n\ttop: 0,\n\twidth: 16,\n\theight: 16\n});\n/**\n* Default values for transformations\n*/\nconst defaultIconTransformations = Object.freeze({\n\trotate: 0,\n\tvFlip: false,\n\thFlip: false\n});\n/**\n* Default values for all optional IconifyIcon properties\n*/\nconst defaultIconProps = Object.freeze({\n\t...defaultIconDimensions,\n\t...defaultIconTransformations\n});\n/**\n* Default values for all properties used in ExtendedIconifyIcon\n*/\nconst defaultExtendedIconProps = Object.freeze({\n\t...defaultIconProps,\n\tbody: \"\",\n\thidden: false\n});\n\n/**\n* Merge transformations\n*/\nfunction mergeIconTransformations(obj1, obj2) {\n\tconst result = {};\n\tif (!obj1.hFlip !== !obj2.hFlip) result.hFlip = true;\n\tif (!obj1.vFlip !== !obj2.vFlip) result.vFlip = true;\n\tconst rotate = ((obj1.rotate || 0) + (obj2.rotate || 0)) % 4;\n\tif (rotate) result.rotate = rotate;\n\treturn result;\n}\n\n/**\n* Merge icon and alias\n*\n* Can also be used to merge default values and icon\n*/\nfunction mergeIconData(parent, child) {\n\tconst result = mergeIconTransformations(parent, child);\n\tfor (const key in defaultExtendedIconProps) if (key in defaultIconTransformations) {\n\t\tif (key in parent && !(key in result)) result[key] = defaultIconTransformations[key];\n\t} else if (key in child) result[key] = child[key];\n\telse if (key in parent) result[key] = parent[key];\n\treturn result;\n}\n\n/**\n* Get icon data, using prepared aliases tree\n*/\nfunction internalGetIconData(data, name, tree) {\n\tconst icons = data.icons;\n\tconst aliases = data.aliases || Object.create(null);\n\tlet currentProps = {};\n\tfunction parse(name$1) {\n\t\tcurrentProps = mergeIconData(icons[name$1] || aliases[name$1], currentProps);\n\t}\n\tparse(name);\n\ttree.forEach(parse);\n\treturn mergeIconData(data, currentProps);\n}\n\n/**\n* Extract icons from an icon set\n*\n* Returns list of icons that were found in icon set\n*/\nfunction parseIconSet(data, callback) {\n\tconst names = [];\n\tif (typeof data !== \"object\" || typeof data.icons !== \"object\") return names;\n\tif (data.not_found instanceof Array) data.not_found.forEach((name) => {\n\t\tcallback(name, null);\n\t\tnames.push(name);\n\t});\n\tconst tree = getIconsTree(data);\n\tfor (const name in tree) {\n\t\tconst item = tree[name];\n\t\tif (item) {\n\t\t\tcallback(name, internalGetIconData(data, name, item));\n\t\t\tnames.push(name);\n\t\t}\n\t}\n\treturn names;\n}\n\n/**\n* Optional properties\n*/\nconst optionalPropertyDefaults = {\n\tprovider: \"\",\n\taliases: {},\n\tnot_found: {},\n\t...defaultIconDimensions\n};\n/**\n* Check props\n*/\nfunction checkOptionalProps(item, defaults) {\n\tfor (const prop in defaults) if (prop in item && typeof item[prop] !== typeof defaults[prop]) return false;\n\treturn true;\n}\n/**\n* Validate icon set, return it as IconifyJSON on success, null on failure\n*\n* Unlike validateIconSet(), this function is very basic.\n* It does not throw exceptions, it does not check metadata, it does not fix stuff.\n*/\nfunction quicklyValidateIconSet(obj) {\n\tif (typeof obj !== \"object\" || obj === null) return null;\n\tconst data = obj;\n\tif (typeof data.prefix !== \"string\" || !obj.icons || typeof obj.icons !== \"object\") return null;\n\tif (!checkOptionalProps(obj, optionalPropertyDefaults)) return null;\n\tconst icons = data.icons;\n\tfor (const name in icons) {\n\t\tconst icon = icons[name];\n\t\tif (!name || typeof icon.body !== \"string\" || !checkOptionalProps(icon, defaultExtendedIconProps)) return null;\n\t}\n\tconst aliases = data.aliases || Object.create(null);\n\tfor (const name in aliases) {\n\t\tconst icon = aliases[name];\n\t\tconst parent = icon.parent;\n\t\tif (!name || typeof parent !== \"string\" || !icons[parent] && !aliases[parent] || !checkOptionalProps(icon, defaultExtendedIconProps)) return null;\n\t}\n\treturn data;\n}\n\n/**\n* Storage by provider and prefix\n*/\nconst dataStorage = Object.create(null);\n/**\n* Create new storage\n*/\nfunction newStorage(provider, prefix) {\n\treturn {\n\t\tprovider,\n\t\tprefix,\n\t\ticons: Object.create(null),\n\t\tmissing: /* @__PURE__ */ new Set()\n\t};\n}\n/**\n* Get storage for provider and prefix\n*/\nfunction getStorage(provider, prefix) {\n\tconst providerStorage = dataStorage[provider] || (dataStorage[provider] = Object.create(null));\n\treturn providerStorage[prefix] || (providerStorage[prefix] = newStorage(provider, prefix));\n}\n/**\n* Add icon set to storage\n*\n* Returns array of added icons\n*/\nfunction addIconSet(storage, data) {\n\tif (!quicklyValidateIconSet(data)) return [];\n\treturn parseIconSet(data, (name, icon) => {\n\t\tif (icon) storage.icons[name] = icon;\n\t\telse storage.missing.add(name);\n\t});\n}\n/**\n* Add icon to storage\n*/\nfunction addIconToStorage(storage, name, icon) {\n\ttry {\n\t\tif (typeof icon.body === \"string\") {\n\t\t\tstorage.icons[name] = { ...icon };\n\t\t\treturn true;\n\t\t}\n\t} catch (err) {}\n\treturn false;\n}\n/**\n* List available icons\n*/\nfunction listIcons(provider, prefix) {\n\tlet allIcons = [];\n\tconst providers = typeof provider === \"string\" ? [provider] : Object.keys(dataStorage);\n\tproviders.forEach((provider$1) => {\n\t\tconst prefixes = typeof provider$1 === \"string\" && typeof prefix === \"string\" ? [prefix] : Object.keys(dataStorage[provider$1] || {});\n\t\tprefixes.forEach((prefix$1) => {\n\t\t\tconst storage = getStorage(provider$1, prefix$1);\n\t\t\tallIcons = allIcons.concat(Object.keys(storage.icons).map((name) => (provider$1 !== \"\" ? \"@\" + provider$1 + \":\" : \"\") + prefix$1 + \":\" + name));\n\t\t});\n\t});\n\treturn allIcons;\n}\n\n/**\n* Expression to test part of icon name.\n*\n* Used when loading icons from Iconify API due to project naming convension.\n* Ignored when using custom icon sets - convension does not apply.\n*/\nconst matchIconName = /^[a-z0-9]+(-[a-z0-9]+)*$/;\n/**\n* Convert string icon name to IconifyIconName object.\n*/\nconst stringToIcon = (value, validate, allowSimpleName, provider = \"\") => {\n\tconst colonSeparated = value.split(\":\");\n\tif (value.slice(0, 1) === \"@\") {\n\t\tif (colonSeparated.length < 2 || colonSeparated.length > 3) return null;\n\t\tprovider = colonSeparated.shift().slice(1);\n\t}\n\tif (colonSeparated.length > 3 || !colonSeparated.length) return null;\n\tif (colonSeparated.length > 1) {\n\t\tconst name$1 = colonSeparated.pop();\n\t\tconst prefix = colonSeparated.pop();\n\t\tconst result = {\n\t\t\tprovider: colonSeparated.length > 0 ? colonSeparated[0] : provider,\n\t\t\tprefix,\n\t\t\tname: name$1\n\t\t};\n\t\treturn validate && !validateIconName(result) ? null : result;\n\t}\n\tconst name = colonSeparated[0];\n\tconst dashSeparated = name.split(\"-\");\n\tif (dashSeparated.length > 1) {\n\t\tconst result = {\n\t\t\tprovider,\n\t\t\tprefix: dashSeparated.shift(),\n\t\t\tname: dashSeparated.join(\"-\")\n\t\t};\n\t\treturn validate && !validateIconName(result) ? null : result;\n\t}\n\tif (allowSimpleName && provider === \"\") {\n\t\tconst result = {\n\t\t\tprovider,\n\t\t\tprefix: \"\",\n\t\t\tname\n\t\t};\n\t\treturn validate && !validateIconName(result, allowSimpleName) ? null : result;\n\t}\n\treturn null;\n};\n/**\n* Check if icon is valid.\n*\n* This function is not part of stringToIcon because validation is not needed for most code.\n*/\nconst validateIconName = (icon, allowSimpleName) => {\n\tif (!icon) return false;\n\treturn !!((allowSimpleName && icon.prefix === \"\" || !!icon.prefix) && !!icon.name);\n};\n\n/**\n* Allow storing icons without provider or prefix, making it possible to store icons like \"home\"\n*/\nlet simpleNames = false;\nfunction allowSimpleNames(allow) {\n\tif (typeof allow === \"boolean\") simpleNames = allow;\n\treturn simpleNames;\n}\n/**\n* Get icon data\n*\n* Returns:\n* - IconifyIcon on success, object directly from storage so don't modify it\n* - null if icon is marked as missing (returned in `not_found` property from API, so don't bother sending API requests)\n* - undefined if icon is missing in storage\n*/\nfunction getIconData(name) {\n\tconst icon = typeof name === \"string\" ? stringToIcon(name, true, simpleNames) : name;\n\tif (icon) {\n\t\tconst storage = getStorage(icon.provider, icon.prefix);\n\t\tconst iconName = icon.name;\n\t\treturn storage.icons[iconName] || (storage.missing.has(iconName) ? null : void 0);\n\t}\n}\n/**\n* Add one icon\n*/\nfunction addIcon(name, data) {\n\tconst icon = stringToIcon(name, true, simpleNames);\n\tif (!icon) return false;\n\tconst storage = getStorage(icon.provider, icon.prefix);\n\tif (data) return addIconToStorage(storage, icon.name, data);\n\telse {\n\t\tstorage.missing.add(icon.name);\n\t\treturn true;\n\t}\n}\n/**\n* Add icon set\n*/\nfunction addCollection(data, provider) {\n\tif (typeof data !== \"object\") return false;\n\tif (typeof provider !== \"string\") provider = data.provider || \"\";\n\tif (simpleNames && !provider && !data.prefix) {\n\t\tlet added = false;\n\t\tif (quicklyValidateIconSet(data)) {\n\t\t\tdata.prefix = \"\";\n\t\t\tparseIconSet(data, (name, icon) => {\n\t\t\t\tif (addIcon(name, icon)) added = true;\n\t\t\t});\n\t\t}\n\t\treturn added;\n\t}\n\tconst prefix = data.prefix;\n\tif (!validateIconName({\n\t\tprefix,\n\t\tname: \"a\"\n\t})) return false;\n\tconst storage = getStorage(provider, prefix);\n\treturn !!addIconSet(storage, data);\n}\n/**\n* Check if icon data is available\n*/\nfunction iconLoaded(name) {\n\treturn !!getIconData(name);\n}\n/**\n* Get full icon\n*/\nfunction getIcon(name) {\n\tconst result = getIconData(name);\n\treturn result ? {\n\t\t...defaultIconProps,\n\t\t...result\n\t} : result;\n}\n\n/**\n* Default icon customisations values\n*/\nconst defaultIconSizeCustomisations = Object.freeze({\n\twidth: null,\n\theight: null\n});\nconst defaultIconCustomisations = Object.freeze({\n\t...defaultIconSizeCustomisations,\n\t...defaultIconTransformations\n});\n\n/**\n* Regular expressions for calculating dimensions\n*/\nconst unitsSplit = /(-?[0-9.]*[0-9]+[0-9.]*)/g;\nconst unitsTest = /^-?[0-9.]*[0-9]+[0-9.]*$/g;\nfunction calculateSize(size, ratio, precision) {\n\tif (ratio === 1) return size;\n\tprecision = precision || 100;\n\tif (typeof size === \"number\") return Math.ceil(size * ratio * precision) / precision;\n\tif (typeof size !== \"string\") return size;\n\tconst oldParts = size.split(unitsSplit);\n\tif (oldParts === null || !oldParts.length) return size;\n\tconst newParts = [];\n\tlet code = oldParts.shift();\n\tlet isNumber = unitsTest.test(code);\n\twhile (true) {\n\t\tif (isNumber) {\n\t\t\tconst num = parseFloat(code);\n\t\t\tif (isNaN(num)) newParts.push(code);\n\t\t\telse newParts.push(Math.ceil(num * ratio * precision) / precision);\n\t\t} else newParts.push(code);\n\t\tcode = oldParts.shift();\n\t\tif (code === void 0) return newParts.join(\"\");\n\t\tisNumber = !isNumber;\n\t}\n}\n\nfunction splitSVGDefs(content, tag = \"defs\") {\n\tlet defs = \"\";\n\tconst index = content.indexOf(\"<\" + tag);\n\twhile (index >= 0) {\n\t\tconst start = content.indexOf(\">\", index);\n\t\tconst end = content.indexOf(\"</\" + tag);\n\t\tif (start === -1 || end === -1) break;\n\t\tconst endEnd = content.indexOf(\">\", end);\n\t\tif (endEnd === -1) break;\n\t\tdefs += content.slice(start + 1, end).trim();\n\t\tcontent = content.slice(0, index).trim() + content.slice(endEnd + 1);\n\t}\n\treturn {\n\t\tdefs,\n\t\tcontent\n\t};\n}\n/**\n* Merge defs and content\n*/\nfunction mergeDefsAndContent(defs, content) {\n\treturn defs ? \"<defs>\" + defs + \"</defs>\" + content : content;\n}\n/**\n* Wrap SVG content, without wrapping definitions\n*/\nfunction wrapSVGContent(body, start, end) {\n\tconst split = splitSVGDefs(body);\n\treturn mergeDefsAndContent(split.defs, start + split.content + end);\n}\n\n/**\n* Check if value should be unset. Allows multiple keywords\n*/\nconst isUnsetKeyword = (value) => value === \"unset\" || value === \"undefined\" || value === \"none\";\n/**\n* Get SVG attributes and content from icon + customisations\n*\n* Does not generate style to make it compatible with frameworks that use objects for style, such as React.\n* Instead, it generates 'inline' value. If true, rendering engine should add verticalAlign: -0.125em to icon.\n*\n* Customisations should be normalised by platform specific parser.\n* Result should be converted to <svg> by platform specific parser.\n* Use replaceIDs to generate unique IDs for body.\n*/\nfunction iconToSVG(icon, customisations) {\n\tconst fullIcon = {\n\t\t...defaultIconProps,\n\t\t...icon\n\t};\n\tconst fullCustomisations = {\n\t\t...defaultIconCustomisations,\n\t\t...customisations\n\t};\n\tconst box = {\n\t\tleft: fullIcon.left,\n\t\ttop: fullIcon.top,\n\t\twidth: fullIcon.width,\n\t\theight: fullIcon.height\n\t};\n\tlet body = fullIcon.body;\n\t[fullIcon, fullCustomisations].forEach((props) => {\n\t\tconst transformations = [];\n\t\tconst hFlip = props.hFlip;\n\t\tconst vFlip = props.vFlip;\n\t\tlet rotation = props.rotate;\n\t\tif (hFlip) if (vFlip) rotation += 2;\n\t\telse {\n\t\t\ttransformations.push(\"translate(\" + (box.width + box.left).toString() + \" \" + (0 - box.top).toString() + \")\");\n\t\t\ttransformations.push(\"scale(-1 1)\");\n\t\t\tbox.top = box.left = 0;\n\t\t}\n\t\telse if (vFlip) {\n\t\t\ttransformations.push(\"translate(\" + (0 - box.left).toString() + \" \" + (box.height + box.top).toString() + \")\");\n\t\t\ttransformations.push(\"scale(1 -1)\");\n\t\t\tbox.top = box.left = 0;\n\t\t}\n\t\tlet tempValue;\n\t\tif (rotation < 0) rotation -= Math.floor(rotation / 4) * 4;\n\t\trotation = rotation % 4;\n\t\tswitch (rotation) {\n\t\t\tcase 1:\n\t\t\t\ttempValue = box.height / 2 + box.top;\n\t\t\t\ttransformations.unshift(\"rotate(90 \" + tempValue.toString() + \" \" + tempValue.toString() + \")\");\n\t\t\t\tbreak;\n\t\t\tcase 2:\n\t\t\t\ttransformations.unshift(\"rotate(180 \" + (box.width / 2 + box.left).toString() + \" \" + (box.height / 2 + box.top).toString() + \")\");\n\t\t\t\tbreak;\n\t\t\tcase 3:\n\t\t\t\ttempValue = box.width / 2 + box.left;\n\t\t\t\ttransformations.unshift(\"rotate(-90 \" + tempValue.toString() + \" \" + tempValue.toString() + \")\");\n\t\t\t\tbreak;\n\t\t}\n\t\tif (rotation % 2 === 1) {\n\t\t\tif (box.left !== box.top) {\n\t\t\t\ttempValue = box.left;\n\t\t\t\tbox.left = box.top;\n\t\t\t\tbox.top = tempValue;\n\t\t\t}\n\t\t\tif (box.width !== box.height) {\n\t\t\t\ttempValue = box.width;\n\t\t\t\tbox.width = box.height;\n\t\t\t\tbox.height = tempValue;\n\t\t\t}\n\t\t}\n\t\tif (transformations.length) body = wrapSVGContent(body, \"<g transform=\\\"\" + transformations.join(\" \") + \"\\\">\", \"</g>\");\n\t});\n\tconst customisationsWidth = fullCustomisations.width;\n\tconst customisationsHeight = fullCustomisations.height;\n\tconst boxWidth = box.width;\n\tconst boxHeight = box.height;\n\tlet width;\n\tlet height;\n\tif (customisationsWidth === null) {\n\t\theight = customisationsHeight === null ? \"1em\" : customisationsHeight === \"auto\" ? boxHeight : customisationsHeight;\n\t\twidth = calculateSize(height, boxWidth / boxHeight);\n\t} else {\n\t\twidth = customisationsWidth === \"auto\" ? boxWidth : customisationsWidth;\n\t\theight = customisationsHeight === null ? calculateSize(width, boxHeight / boxWidth) : customisationsHeight === \"auto\" ? boxHeight : customisationsHeight;\n\t}\n\tconst attributes = {};\n\tconst setAttr = (prop, value) => {\n\t\tif (!isUnsetKeyword(value)) attributes[prop] = value.toString();\n\t};\n\tsetAttr(\"width\", width);\n\tsetAttr(\"height\", height);\n\tconst viewBox = [\n\t\tbox.left,\n\t\tbox.top,\n\t\tboxWidth,\n\t\tboxHeight\n\t];\n\tattributes.viewBox = viewBox.join(\" \");\n\treturn {\n\t\tattributes,\n\t\tviewBox,\n\t\tbody\n\t};\n}\n\n/**\n* IDs usage:\n*\n* id=\"{id}\"\n* xlink:href=\"#{id}\"\n* url(#{id})\n*\n* From SVG animations:\n*\n* begin=\"0;{id}.end\"\n* begin=\"{id}.end\"\n* begin=\"{id}.click\"\n*/\n/**\n* Regular expression for finding ids\n*/\nconst regex = /\\sid=\"(\\S+)\"/g;\n/**\n* New random-ish prefix for ids\n*\n* Do not use dash, it cannot be used in SVG 2 animations\n*/\nconst randomPrefix = \"IconifyId\" + Date.now().toString(16) + (Math.random() * 16777216 | 0).toString(16);\n/**\n* Counter for ids, increasing with every replacement\n*/\nlet counter = 0;\n/**\n* Replace IDs in SVG output with unique IDs\n*/\nfunction replaceIDs(body, prefix = randomPrefix) {\n\tconst ids = [];\n\tlet match;\n\twhile (match = regex.exec(body)) ids.push(match[1]);\n\tif (!ids.length) return body;\n\tconst suffix = \"suffix\" + (Math.random() * 16777216 | Date.now()).toString(16);\n\tids.forEach((id) => {\n\t\tconst newID = typeof prefix === \"function\" ? prefix(id) : prefix + (counter++).toString();\n\t\tconst escapedID = id.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n\t\tbody = body.replace(new RegExp(\"([#;\\\"])(\" + escapedID + \")([\\\")]|\\\\.[a-z])\", \"g\"), \"$1\" + newID + suffix + \"$3\");\n\t});\n\tbody = body.replace(new RegExp(suffix, \"g\"), \"\");\n\treturn body;\n}\n\n/**\n* Local storate types and entries\n*/\nconst storage = Object.create(null);\n/**\n* Set API module\n*/\nfunction setAPIModule(provider, item) {\n\tstorage[provider] = item;\n}\n/**\n* Get API module\n*/\nfunction getAPIModule(provider) {\n\treturn storage[provider] || storage[\"\"];\n}\n\n/**\n* Create full API configuration from partial data\n*/\nfunction createAPIConfig(source) {\n\tlet resources;\n\tif (typeof source.resources === \"string\") resources = [source.resources];\n\telse {\n\t\tresources = source.resources;\n\t\tif (!(resources instanceof Array) || !resources.length) return null;\n\t}\n\tconst result = {\n\t\tresources,\n\t\tpath: source.path || \"/\",\n\t\tmaxURL: source.maxURL || 500,\n\t\trotate: source.rotate || 750,\n\t\ttimeout: source.timeout || 5e3,\n\t\trandom: source.random === true,\n\t\tindex: source.index || 0,\n\t\tdataAfterTimeout: source.dataAfterTimeout !== false\n\t};\n\treturn result;\n}\n/**\n* Local storage\n*/\nconst configStorage = Object.create(null);\n/**\n* Redundancy for API servers.\n*\n* API should have very high uptime because of implemented redundancy at server level, but\n* sometimes bad things happen. On internet 100% uptime is not possible.\n*\n* There could be routing problems. Server might go down for whatever reason, but it takes\n* few minutes to detect that downtime, so during those few minutes API might not be accessible.\n*\n* This script has some redundancy to mitigate possible network issues.\n*\n* If one host cannot be reached in 'rotate' (750 by default) ms, script will try to retrieve\n* data from different host. Hosts have different configurations, pointing to different\n* API servers hosted at different providers.\n*/\nconst fallBackAPISources = [\"https://api.simplesvg.com\", \"https://api.unisvg.com\"];\nconst fallBackAPI = [];\nwhile (fallBackAPISources.length > 0) if (fallBackAPISources.length === 1) fallBackAPI.push(fallBackAPISources.shift());\nelse if (Math.random() > .5) fallBackAPI.push(fallBackAPISources.shift());\nelse fallBackAPI.push(fallBackAPISources.pop());\nconfigStorage[\"\"] = createAPIConfig({ resources: [\"https://api.iconify.design\"].concat(fallBackAPI) });\n/**\n* Add custom config for provider\n*/\nfunction addAPIProvider(provider, customConfig) {\n\tconst config = createAPIConfig(customConfig);\n\tif (config === null) return false;\n\tconfigStorage[provider] = config;\n\treturn true;\n}\n/**\n* Get API configuration\n*/\nfunction getAPIConfig(provider) {\n\treturn configStorage[provider];\n}\n/**\n* List API providers\n*/\nfunction listAPIProviders() {\n\treturn Object.keys(configStorage);\n}\n\nconst detectFetch = () => {\n\tlet callback;\n\ttry {\n\t\tcallback = fetch;\n\t\tif (typeof callback === \"function\") return callback;\n\t} catch (err) {}\n};\n/**\n* Fetch function\n*/\nlet fetchModule = detectFetch();\n/**\n* Set custom fetch() function\n*/\nfunction setFetch(fetch$1) {\n\tfetchModule = fetch$1;\n}\n/**\n* Get fetch() function. Used by Icon Finder Core\n*/\nfunction getFetch() {\n\treturn fetchModule;\n}\n/**\n* Calculate maximum icons list length for prefix\n*/\nfunction calculateMaxLength(provider, prefix) {\n\tconst config = getAPIConfig(provider);\n\tif (!config) return 0;\n\tlet result;\n\tif (!config.maxURL) result = 0;\n\telse {\n\t\tlet maxHostLength = 0;\n\t\tconfig.resources.forEach((item) => {\n\t\t\tconst host = item;\n\t\t\tmaxHostLength = Math.max(maxHostLength, host.length);\n\t\t});\n\t\tconst url = prefix + \".json?icons=\";\n\t\tresult = config.maxURL - maxHostLength - config.path.length - url.length;\n\t}\n\treturn result;\n}\n/**\n* Should query be aborted, based on last HTTP status\n*/\nfunction shouldAbort(status) {\n\treturn status === 404;\n}\n/**\n* Prepare params\n*/\nconst prepare = (provider, prefix, icons) => {\n\tconst results = [];\n\tconst maxLength = calculateMaxLength(provider, prefix);\n\tconst type = \"icons\";\n\tlet item = {\n\t\ttype,\n\t\tprovider,\n\t\tprefix,\n\t\ticons: []\n\t};\n\tlet length = 0;\n\ticons.forEach((name, index) => {\n\t\tlength += name.length + 1;\n\t\tif (length >= maxLength && index > 0) {\n\t\t\tresults.push(item);\n\t\t\titem = {\n\t\t\t\ttype,\n\t\t\t\tprovider,\n\t\t\t\tprefix,\n\t\t\t\ticons: []\n\t\t\t};\n\t\t\tlength = name.length;\n\t\t}\n\t\titem.icons.push(name);\n\t});\n\tresults.push(item);\n\treturn results;\n};\n/**\n* Get path\n*/\nfunction getPath(provider) {\n\tif (typeof provider === \"string\") {\n\t\tconst config = getAPIConfig(provider);\n\t\tif (config) return config.path;\n\t}\n\treturn \"/\";\n}\n/**\n* Load icons\n*/\nconst send = (host, params, callback) => {\n\tif (!fetchModule) {\n\t\tcallback(\"abort\", 424);\n\t\treturn;\n\t}\n\tlet path = getPath(params.provider);\n\tswitch (params.type) {\n\t\tcase \"icons\": {\n\t\t\tconst prefix = params.prefix;\n\t\t\tconst icons = params.icons;\n\t\t\tconst iconsList = icons.join(\",\");\n\t\t\tconst urlParams = new URLSearchParams({ icons: iconsList });\n\t\t\tpath += prefix + \".json?\" + urlParams.toString();\n\t\t\tbreak;\n\t\t}\n\t\tcase \"custom\": {\n\t\t\tconst uri = params.uri;\n\t\t\tpath += uri.slice(0, 1) === \"/\" ? uri.slice(1) : uri;\n\t\t\tbreak;\n\t\t}\n\t\tdefault:\n\t\t\tcallback(\"abort\", 400);\n\t\t\treturn;\n\t}\n\tlet defaultError = 503;\n\tfetchModule(host + path).then((response) => {\n\t\tconst status = response.status;\n\t\tif (status !== 200) {\n\t\t\tsetTimeout(() => {\n\t\t\t\tcallback(shouldAbort(status) ? \"abort\" : \"next\", status);\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\t\tdefaultError = 501;\n\t\treturn response.json();\n\t}).then((data) => {\n\t\tif (typeof data !== \"object\" || data === null) {\n\t\t\tsetTimeout(() => {\n\t\t\t\tif (data === 404) callback(\"abort\", data);\n\t\t\t\telse callback(\"next\", defaultError);\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\t\tsetTimeout(() => {\n\t\t\tcallback(\"success\", data);\n\t\t});\n\t}).catch(() => {\n\t\tcallback(\"next\", defaultError);\n\t});\n};\n/**\n* Export module\n*/\nconst fetchAPIModule = {\n\tprepare,\n\tsend\n};\n\n/**\n* Remove callback\n*/\nfunction removeCallback(storages, id) {\n\tstorages.forEach((storage) => {\n\t\tconst items = storage.loaderCallbacks;\n\t\tif (items) storage.loaderCallbacks = items.filter((row) => row.id !== id);\n\t});\n}\n/**\n* Update all callbacks for provider and prefix\n*/\nfunction updateCallbacks(storage) {\n\tif (!storage.pendingCallbacksFlag) {\n\t\tstorage.pendingCallbacksFlag = true;\n\t\tsetTimeout(() => {\n\t\t\tstorage.pendingCallbacksFlag = false;\n\t\t\tconst items = storage.loaderCallbacks ? storage.loaderCallbacks.slice(0) : [];\n\t\t\tif (!items.length) return;\n\t\t\tlet hasPending = false;\n\t\t\tconst provider = storage.provider;\n\t\t\tconst prefix = storage.prefix;\n\t\t\titems.forEach((item) => {\n\t\t\t\tconst icons = item.icons;\n\t\t\t\tconst oldLength = icons.pending.length;\n\t\t\t\ticons.pending = icons.pending.filter((icon) => {\n\t\t\t\t\tif (icon.prefix !== prefix) return true;\n\t\t\t\t\tconst name = icon.name;\n\t\t\t\t\tif (storage.icons[name]) icons.loaded.push({\n\t\t\t\t\t\tprovider,\n\t\t\t\t\t\tprefix,\n\t\t\t\t\t\tname\n\t\t\t\t\t});\n\t\t\t\t\telse if (storage.missing.has(name)) icons.missing.push({\n\t\t\t\t\t\tprovider,\n\t\t\t\t\t\tprefix,\n\t\t\t\t\t\tname\n\t\t\t\t\t});\n\t\t\t\t\telse {\n\t\t\t\t\t\thasPending = true;\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t\treturn false;\n\t\t\t\t});\n\t\t\t\tif (icons.pending.length !== oldLength) {\n\t\t\t\t\tif (!hasPending) removeCallback([storage], item.id);\n\t\t\t\t\titem.callback(icons.loaded.slice(0), icons.missing.slice(0), icons.pending.slice(0), item.abort);\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n}\n/**\n* Unique id counter for callbacks\n*/\nlet idCounter = 0;\n/**\n* Add callback\n*/\nfunction storeCallback(callback, icons, pendingSources) {\n\tconst id = idCounter++;\n\tconst abort = removeCallback.bind(null, pendingSources, id);\n\tif (!icons.pending.length) return abort;\n\tconst item = {\n\t\tid,\n\t\ticons,\n\t\tcallback,\n\t\tabort\n\t};\n\tpendingSources.forEach((storage) => {\n\t\t(storage.loaderCallbacks || (storage.loaderCallbacks = [])).push(item);\n\t});\n\treturn abort;\n}\n\n/**\n* Check if icons have been loaded\n*/\nfunction sortIcons(icons) {\n\tconst result = {\n\t\tloaded: [],\n\t\tmissing: [],\n\t\tpending: []\n\t};\n\tconst storage = Object.create(null);\n\ticons.sort((a, b) => {\n\t\tif (a.provider !== b.provider) return a.provider.localeCompare(b.provider);\n\t\tif (a.prefix !== b.prefix) return a.prefix.localeCompare(b.prefix);\n\t\treturn a.name.localeCompare(b.name);\n\t});\n\tlet lastIcon = {\n\t\tprovider: \"\",\n\t\tprefix: \"\",\n\t\tname: \"\"\n\t};\n\ticons.forEach((icon) => {\n\t\tif (lastIcon.name === icon.name && lastIcon.prefix === icon.prefix && lastIcon.provider === icon.provider) return;\n\t\tlastIcon = icon;\n\t\tconst provider = icon.provider;\n\t\tconst prefix = icon.prefix;\n\t\tconst name = icon.name;\n\t\tconst providerStorage = storage[provider] || (storage[provider] = Object.create(null));\n\t\tconst localStorage = providerStorage[prefix] || (providerStorage[prefix] = getStorage(provider, prefix));\n\t\tlet list;\n\t\tif (name in localStorage.icons) list = result.loaded;\n\t\telse if (prefix === \"\" || localStorage.missing.has(name)) list = result.missing;\n\t\telse list = result.pending;\n\t\tconst item = {\n\t\t\tprovider,\n\t\t\tprefix,\n\t\t\tname\n\t\t};\n\t\tlist.push(item);\n\t});\n\treturn result;\n}\n\n/**\n* Convert icons list from string/icon mix to icons and validate them\n*/\nfunction listToIcons(list, validate = true, simpleNames = false) {\n\tconst result = [];\n\tlist.forEach((item) => {\n\t\tconst icon = typeof item === \"string\" ? stringToIcon(item, validate, simpleNames) : item;\n\t\tif (icon) result.push(icon);\n\t});\n\treturn result;\n}\n\n/**\n* Default RedundancyConfig for API calls\n*/\nconst defaultConfig = {\n\tresources: [],\n\tindex: 0,\n\ttimeout: 2e3,\n\trotate: 750,\n\trandom: false,\n\tdataAfterTimeout: false\n};\n\n/**\n* Send query\n*/\nfunction sendQuery(config, payload, query, done) {\n\tconst resourcesCount = config.resources.length;\n\tconst startIndex = config.random ? Math.floor(Math.random() * resourcesCount) : config.index;\n\tlet resources;\n\tif (config.random) {\n\t\tlet list = config.resources.slice(0);\n\t\tresources = [];\n\t\twhile (list.length > 1) {\n\t\t\tconst nextIndex = Math.floor(Math.random() * list.length);\n\t\t\tresources.push(list[nextIndex]);\n\t\t\tlist = list.slice(0, nextIndex).concat(list.slice(nextIndex + 1));\n\t\t}\n\t\tresources = resources.concat(list);\n\t} else resources = config.resources.slice(startIndex).concat(config.resources.slice(0, startIndex));\n\tconst startTime = Date.now();\n\tlet status = \"pending\";\n\tlet queriesSent = 0;\n\tlet lastError;\n\tlet timer = null;\n\tlet queue = [];\n\tlet doneCallbacks = [];\n\tif (typeof done === \"function\") doneCallbacks.push(done);\n\t/**\n\t* Reset timer\n\t*/\n\tfunction resetTimer() {\n\t\tif (timer) {\n\t\t\tclearTimeout(timer);\n\t\t\ttimer = null;\n\t\t}\n\t}\n\t/**\n\t* Abort everything\n\t*/\n\tfunction abort() {\n\t\tif (status === \"pending\") status = \"aborted\";\n\t\tresetTimer();\n\t\tqueue.forEach((item) => {\n\t\t\tif (item.status === \"pending\") item.status = \"aborted\";\n\t\t});\n\t\tqueue = [];\n\t}\n\t/**\n\t* Add / replace callback to call when execution is complete.\n\t* This can be used to abort pending query implementations when query is complete or aborted.\n\t*/\n\tfunction subscribe(callback, overwrite) {\n\t\tif (overwrite) doneCallbacks = [];\n\t\tif (typeof callback === \"function\") doneCallbacks.push(callback);\n\t}\n\t/**\n\t* Get query status\n\t*/\n\tfunction getQueryStatus() {\n\t\treturn {\n\t\t\tstartTime,\n\t\t\tpayload,\n\t\t\tstatus,\n\t\t\tqueriesSent,\n\t\t\tqueriesPending: queue.length,\n\t\t\tsubscribe,\n\t\t\tabort\n\t\t};\n\t}\n\t/**\n\t* Fail query\n\t*/\n\tfunction failQuery() {\n\t\tstatus = \"failed\";\n\t\tdoneCallbacks.forEach((callback) => {\n\t\t\tcallback(void 0, lastError);\n\t\t});\n\t}\n\t/**\n\t* Clear queue\n\t*/\n\tfunction clearQueue() {\n\t\tqueue.forEach((item) => {\n\t\t\tif (item.status === \"pending\") item.status = \"aborted\";\n\t\t});\n\t\tqueue = [];\n\t}\n\t/**\n\t* Got response from module\n\t*/\n\tfunction moduleResponse(item, response, data) {\n\t\tconst isError = response !== \"success\";\n\t\tqueue = queue.filter((queued) => queued !== item);\n\t\tswitch (status) {\n\t\t\tcase \"pending\": break;\n\t\t\tcase \"failed\":\n\t\t\t\tif (isError || !config.dataAfterTimeout) return;\n\t\t\t\tbreak;\n\t\t\tdefault: return;\n\t\t}\n\t\tif (response === \"abort\") {\n\t\t\tlastError = data;\n\t\t\tfailQuery();\n\t\t\treturn;\n\t\t}\n\t\tif (isError) {\n\t\t\tlastError = data;\n\t\t\tif (!queue.length) if (!resources.length) failQuery();\n\t\t\telse execNext();\n\t\t\treturn;\n\t\t}\n\t\tresetTimer();\n\t\tclearQueue();\n\t\tif (!config.random) {\n\t\t\tconst index = config.resources.indexOf(item.resource);\n\t\t\tif (index !== -1 && index !== config.index) config.index = index;\n\t\t}\n\t\tstatus = \"completed\";\n\t\tdoneCallbacks.forEach((callback) => {\n\t\t\tcallback(data);\n\t\t});\n\t}\n\t/**\n\t* Execute next query\n\t*/\n\tfunction execNext() {\n\t\tif (status !== \"pending\") return;\n\t\tresetTimer();\n\t\tconst resource = resources.shift();\n\t\tif (resource === void 0) {\n\t\t\tif (queue.length) {\n\t\t\t\ttimer = setTimeout(() => {\n\t\t\t\t\tresetTimer();\n\t\t\t\t\tif (status === \"pending\") {\n\t\t\t\t\t\tclearQueue();\n\t\t\t\t\t\tfailQuery();\n\t\t\t\t\t}\n\t\t\t\t}, config.timeout);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tfailQuery();\n\t\t\treturn;\n\t\t}\n\t\tconst item = {\n\t\t\tstatus: \"pending\",\n\t\t\tresource,\n\t\t\tcallback: (status$1, data) => {\n\t\t\t\tmoduleResponse(item, status$1, data);\n\t\t\t}\n\t\t};\n\t\tqueue.push(item);\n\t\tqueriesSent++;\n\t\ttimer = setTimeout(execNext, config.rotate);\n\t\tquery(resource, payload, item.callback);\n\t}\n\tsetTimeout(execNext);\n\treturn getQueryStatus;\n}\n\n/**\n* Redundancy instance\n*/\nfunction initRedundancy(cfg) {\n\tconst config = {\n\t\t...defaultConfig,\n\t\t...cfg\n\t};\n\tlet queries = [];\n\t/**\n\t* Remove aborted and completed queries\n\t*/\n\tfunction cleanup() {\n\t\tqueries = queries.filter((item) => item().status === \"pending\");\n\t}\n\t/**\n\t* Send query\n\t*/\n\tfunction query(payload, queryCallback, doneCallback) {\n\t\tconst query$1 = sendQuery(config, payload, queryCallback, (data, error) => {\n\t\t\tcleanup();\n\t\t\tif (doneCallback) doneCallback(data, error);\n\t\t});\n\t\tqueries.push(query$1);\n\t\treturn query$1;\n\t}\n\t/**\n\t* Find instance\n\t*/\n\tfunction find(callback) {\n\t\treturn queries.find((value) => {\n\t\t\treturn callback(value);\n\t\t}) || null;\n\t}\n\tconst instance = {\n\t\tquery,\n\t\tfind,\n\t\tsetIndex: (index) => {\n\t\t\tconfig.index = index;\n\t\t},\n\t\tgetIndex: () => config.index,\n\t\tcleanup\n\t};\n\treturn instance;\n}\n\nfunction emptyCallback$1() {}\nconst redundancyCache = Object.create(null);\n/**\n* Get Redundancy instance for provider\n*/\nfunction getRedundancyCache(provider) {\n\tif (!redundancyCache[provider]) {\n\t\tconst config = getAPIConfig(provider);\n\t\tif (!config) return;\n\t\tconst redundancy = initRedundancy(config);\n\t\tconst cachedReundancy = {\n\t\t\tconfig,\n\t\t\tredundancy\n\t\t};\n\t\tredundancyCache[provider] = cachedReundancy;\n\t}\n\treturn redundancyCache[provider];\n}\n/**\n* Send API query\n*/\nfunction sendAPIQuery(target, query, callback) {\n\tlet redundancy;\n\tlet send;\n\tif (typeof target === \"string\") {\n\t\tconst api = getAPIModule(target);\n\t\tif (!api) {\n\t\t\tcallback(void 0, 424);\n\t\t\treturn emptyCallback$1;\n\t\t}\n\t\tsend = api.send;\n\t\tconst cached = getRedundancyCache(target);\n\t\tif (cached) redundancy = cached.redundancy;\n\t} else {\n\t\tconst config = createAPIConfig(target);\n\t\tif (config) {\n\t\t\tredundancy = initRedundancy(config);\n\t\t\tconst moduleKey = target.resources ? target.resources[0] : \"\";\n\t\t\tconst api = getAPIModule(moduleKey);\n\t\t\tif (api) send = api.send;\n\t\t}\n\t}\n\tif (!redundancy || !send) {\n\t\tcallback(void 0, 424);\n\t\treturn emptyCallback$1;\n\t}\n\treturn redundancy.query(query, send, callback)().abort;\n}\n\nfunction emptyCallback() {}\n/**\n* Function called when new icons have been loaded\n*/\nfunction loadedNewIcons(storage) {\n\tif (!storage.iconsLoaderFlag) {\n\t\tstorage.iconsLoaderFlag = true;\n\t\tsetTimeout(() => {\n\t\t\tstorage.iconsLoaderFlag = false;\n\t\t\tupdateCallbacks(storage);\n\t\t});\n\t}\n}\n/**\n* Check icon names for API\n*/\nfunction checkIconNamesForAPI(icons) {\n\tconst valid = [];\n\tconst invalid = [];\n\ticons.forEach((name) => {\n\t\t(name.match(matchIconName) ? valid : invalid).push(name);\n\t});\n\treturn {\n\t\tvalid,\n\t\tinvalid\n\t};\n}\n/**\n* Parse loader response\n*/\nfunction parseLoaderResponse(storage, icons, data) {\n\tfunction checkMissing() {\n\t\tconst pending = storage.pendingIcons;\n\t\ticons.forEach((name) => {\n\t\t\tif (pending) pending.delete(name);\n\t\t\tif (!storage.icons[name]) storage.missing.add(name);\n\t\t});\n\t}\n\tif (data && typeof data === \"object\") try {\n\t\tconst parsed = addIconSet(storage, data);\n\t\tif (!parsed.length) {\n\t\t\tcheckMissing();\n\t\t\treturn;\n\t\t}\n\t} catch (err) {\n\t\tconsole.error(err);\n\t}\n\tcheckMissing();\n\tloadedNewIcons(storage);\n}\n/**\n* Handle response that can be async\n*/\nfunction parsePossiblyAsyncResponse(response, callback) {\n\tif (response instanceof Promise) response.then((data) => {\n\t\tcallback(data);\n\t}).catch(() => {\n\t\tcallback(null);\n\t});\n\telse callback(response);\n}\n/**\n* Load icons\n*/\nfunction loadNewIcons(storage, icons) {\n\tif (!storage.iconsToLoad) storage.iconsToLoad = icons;\n\telse storage.iconsToLoad = storage.iconsToLoad.concat(icons).sort();\n\tif (!storage.iconsQueueFlag) {\n\t\tstorage.iconsQueueFlag = true;\n\t\tsetTimeout(() => {\n\t\t\tstorage.iconsQueueFlag = false;\n\t\t\tconst { provider, prefix } = storage;\n\t\t\tconst icons$1 = storage.iconsToLoad;\n\t\t\tdelete storage.iconsToLoad;\n\t\t\tif (!icons$1 || !icons$1.length) return;\n\t\t\tconst customIconLoader = storage.loadIcon;\n\t\t\tif (storage.loadIcons && (icons$1.length > 1 || !customIconLoader)) {\n\t\t\t\tparsePossiblyAsyncResponse(storage.loadIcons(icons$1, prefix, provider), (data) => {\n\t\t\t\t\tparseLoaderResponse(storage, icons$1, data);\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (customIconLoader) {\n\t\t\t\ticons$1.forEach((name) => {\n\t\t\t\t\tconst response = customIconLoader(name, prefix, provider);\n\t\t\t\t\tparsePossiblyAsyncResponse(response, (data) => {\n\t\t\t\t\t\tconst iconSet = data ? {\n\t\t\t\t\t\t\tprefix,\n\t\t\t\t\t\t\ticons: { [name]: data }\n\t\t\t\t\t\t} : null;\n\t\t\t\t\t\tparseLoaderResponse(storage, [name], iconSet);\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst { valid, invalid } = checkIconNamesForAPI(icons$1);\n\t\t\tif (invalid.length) parseLoaderResponse(storage, invalid, null);\n\t\t\tif (!valid.length) return;\n\t\t\tconst api = prefix.match(matchIconName) ? getAPIModule(provider) : null;\n\t\t\tif (!api) {\n\t\t\t\tparseLoaderResponse(storage, valid, null);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst params = api.prepare(provider, prefix, valid);\n\t\t\tparams.forEach((item) => {\n\t\t\t\tsendAPIQuery(provider, item, (data) => {\n\t\t\t\t\tparseLoaderResponse(storage, item.icons, data);\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\t}\n}\n/**\n* Load icons\n*/\nconst loadIcons = (icons, callback) => {\n\tconst cleanedIcons = listToIcons(icons, true, allowSimpleNames());\n\tconst sortedIcons = sortIcons(cleanedIcons);\n\tif (!sortedIcons.pending.length) {\n\t\tlet callCallback = true;\n\t\tif (callback) setTimeout(() => {\n\t\t\tif (callCallback) callback(sortedIcons.loaded, sortedIcons.missing, sortedIcons.pending, emptyCallback);\n\t\t});\n\t\treturn () => {\n\t\t\tcallCallback = false;\n\t\t};\n\t}\n\tconst newIcons = Object.create(null);\n\tconst sources = [];\n\tlet lastProvider, lastPrefix;\n\tsortedIcons.pending.forEach((icon) => {\n\t\tconst { provider, prefix } = icon;\n\t\tif (prefix === lastPrefix && provider === lastProvider) return;\n\t\tlastProvider = provider;\n\t\tlastPrefix = prefix;\n\t\tsources.push(getStorage(provider, prefix));\n\t\tconst providerNewIcons = newIcons[provider] || (newIcons[provider] = Object.create(null));\n\t\tif (!providerNewIcons[prefix]) providerNewIcons[prefix] = [];\n\t});\n\tsortedIcons.pending.forEach((icon) => {\n\t\tconst { provider, prefix, name } = icon;\n\t\tconst storage = getStorage(provider, prefix);\n\t\tconst pendingQueue = storage.pendingIcons || (storage.pendingIcons = /* @__PURE__ */ new Set());\n\t\tif (!pendingQueue.has(name)) {\n\t\t\tpendingQueue.add(name);\n\t\t\tnewIcons[provider][prefix].push(name);\n\t\t}\n\t});\n\tsources.forEach((storage) => {\n\t\tconst list = newIcons[storage.provider][storage.prefix];\n\t\tif (list.length) loadNewIcons(storage, list);\n\t});\n\treturn callback ? storeCallback(callback, sortedIcons, sources) : emptyCallback;\n};\n/**\n* Load one icon using Promise\n*/\nconst loadIcon = (icon) => {\n\treturn new Promise((fulfill, reject) => {\n\t\tconst iconObj = typeof icon === \"string\" ? stringToIcon(icon, true) : icon;\n\t\tif (!iconObj) {\n\t\t\treject(icon);\n\t\t\treturn;\n\t\t}\n\t\tloadIcons([iconObj || icon], (loaded) => {\n\t\t\tif (loaded.length && iconObj) {\n\t\t\t\tconst data = getIconData(iconObj);\n\t\t\t\tif (data) {\n\t\t\t\t\tfulfill({\n\t\t\t\t\t\t...defaultIconProps,\n\t\t\t\t\t\t...data\n\t\t\t\t\t});\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\treject(icon);\n\t\t});\n\t});\n};\n\n/**\n* Set custom loader for multiple icons\n*/\nfunction setCustomIconsLoader(loader, prefix, provider) {\n\tgetStorage(provider || \"\", prefix).loadIcons = loader;\n}\n/**\n* Set custom loader for one icon\n*/\nfunction setCustomIconLoader(loader, prefix, provider) {\n\tgetStorage(provider || \"\", prefix).loadIcon = loader;\n}\n\n/**\n* Convert IconifyIconCustomisations to FullIconCustomisations, checking value types\n*/\nfunction mergeCustomisations(defaults, item) {\n\tconst result = { ...defaults };\n\tfor (const key in item) {\n\t\tconst value = item[key];\n\t\tconst valueType = typeof value;\n\t\tif (key in defaultIconSizeCustomisations) {\n\t\t\tif (value === null || value && (valueType === \"string\" || valueType === \"number\")) result[key] = value;\n\t\t} else if (valueType === typeof result[key]) result[key] = key === \"rotate\" ? value % 4 : value;\n\t}\n\treturn result;\n}\n\nconst separator = /[\\s,]+/;\n/**\n* Apply \"flip\" string to icon customisations\n*/\nfunction flipFromString(custom, flip) {\n\tflip.split(separator).forEach((str) => {\n\t\tconst value = str.trim();\n\t\tswitch (value) {\n\t\t\tcase \"horizontal\":\n\t\t\t\tcustom.hFlip = true;\n\t\t\t\tbreak;\n\t\t\tcase \"vertical\":\n\t\t\t\tcustom.vFlip = true;\n\t\t\t\tbreak;\n\t\t}\n\t});\n}\n\n/**\n* Get rotation value\n*/\nfunction rotateFromString(value, defaultValue = 0) {\n\tconst units = value.replace(/^-?[0-9.]*/, \"\");\n\tfunction cleanup(value$1) {\n\t\twhile (value$1 < 0) value$1 += 4;\n\t\treturn value$1 % 4;\n\t}\n\tif (units === \"\") {\n\t\tconst num = parseInt(value);\n\t\treturn isNaN(num) ? 0 : cleanup(num);\n\t} else if (units !== value) {\n\t\tlet split = 0;\n\t\tswitch (units) {\n\t\t\tcase \"%\":\n\t\t\t\tsplit = 25;\n\t\t\t\tbreak;\n\t\t\tcase \"deg\": split = 90;\n\t\t}\n\t\tif (split) {\n\t\t\tlet num = parseFloat(value.slice(0, value.length - units.length));\n\t\t\tif (isNaN(num)) return 0;\n\t\t\tnum = num / split;\n\t\t\treturn num % 1 === 0 ? cleanup(num) : 0;\n\t\t}\n\t}\n\treturn defaultValue;\n}\n\n/**\n* Generate <svg>\n*/\nfunction iconToHTML(body, attributes) {\n\tlet renderAttribsHTML = body.indexOf(\"xlink:\") === -1 ? \"\" : \" xmlns:xlink=\\\"http://www.w3.org/1999/xlink\\\"\";\n\tfor (const attr in attributes) renderAttribsHTML += \" \" + attr + \"=\\\"\" + attributes[attr] + \"\\\"\";\n\treturn \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\"\" + renderAttribsHTML + \">\" + body + \"</svg>\";\n}\n\n/**\n* Encode SVG for use in url()\n*\n* Short alternative to encodeURIComponent() that encodes only stuff used in SVG, generating\n* smaller code.\n*/\nfunction encodeSVGforURL(svg) {\n\treturn svg.replace(/\"/g, \"'\").replace(/%/g, \"%25\").replace(/#/g, \"%23\").replace(/</g, \"%3C\").replace(/>/g, \"%3E\").replace(/\\s+/g, \" \");\n}\n/**\n* Generate data: URL from SVG\n*/\nfunction svgToData(svg) {\n\treturn \"data:image/svg+xml,\" + encodeSVGforURL(svg);\n}\n/**\n* Generate url() from SVG\n*/\nfunction svgToURL(svg) {\n\treturn \"url(\\\"\" + svgToData(svg) + \"\\\")\";\n}\n\nlet policy;\n/**\n* Attempt to create policy\n*/\nfunction createPolicy() {\n\ttry {\n\t\tpolicy = window.trustedTypes.createPolicy(\"iconify\", { createHTML: (s) => s });\n\t} catch (err) {\n\t\tpolicy = null;\n\t}\n}\n/**\n* Clean up value for innerHTML assignment\n*\n* This code doesn't actually clean up anything.\n* It is intended be used with Iconify icon data, which has already been validated\n*/\nfunction cleanUpInnerHTML(html) {\n\tif (policy === void 0) createPolicy();\n\treturn policy ? policy.createHTML(html) : html;\n}\n\nconst defaultExtendedIconCustomisations = {\n ...defaultIconCustomisations,\n inline: false,\n};\n\n/**\n * Default SVG attributes\n */\nconst svgDefaults = {\n 'xmlns': 'http://www.w3.org/2000/svg',\n 'xmlnsXlink': 'http://www.w3.org/1999/xlink',\n 'aria-hidden': true,\n 'role': 'img',\n};\n/**\n * Style modes\n */\nconst commonProps = {\n display: 'inline-block',\n};\nconst monotoneProps = {\n backgroundColor: 'currentColor',\n};\nconst coloredProps = {\n backgroundColor: 'transparent',\n};\n// Dynamically add common props to variables above\nconst propsToAdd = {\n Image: 'var(--svg)',\n Repeat: 'no-repeat',\n Size: '100% 100%',\n};\nconst propsToAddTo = {\n WebkitMask: monotoneProps,\n mask: monotoneProps,\n background: coloredProps,\n};\nfor (const prefix in propsToAddTo) {\n const list = propsToAddTo[prefix];\n for (const prop in propsToAdd) {\n list[prefix + prop] = propsToAdd[prop];\n }\n}\n/**\n * Default values for customisations for inline icon\n */\nconst inlineDefaults = {\n ...defaultExtendedIconCustomisations,\n inline: true,\n};\n/**\n * Fix size: add 'px' to numbers\n */\nfunction fixSize(value) {\n return value + (value.match(/^[-0-9.]+$/) ? 'px' : '');\n}\n/**\n * Render icon\n */\nconst render = (\n// Icon must be validated before calling this function\nicon, \n// Partial properties\nprops, \n// Icon name\nname) => {\n // Get default properties\n const defaultProps = props.inline\n ? inlineDefaults\n : defaultExtendedIconCustomisations;\n // Get all customisations\n const customisations = mergeCustomisations(defaultProps, props);\n // Check mode\n const mode = props.mode || 'svg';\n // Create style\n const style = {};\n const customStyle = props.style || {};\n // Create SVG component properties\n const componentProps = {\n ...(mode === 'svg' ? svgDefaults : {}),\n };\n if (name) {\n const iconName = stringToIcon(name, false, true);\n if (iconName) {\n const classNames = ['iconify'];\n const props = [\n 'provider',\n 'prefix',\n ];\n for (const prop of props) {\n if (iconName[prop]) {\n classNames.push('iconify--' + iconName[prop]);\n }\n }\n componentProps.className = classNames.join(' ');\n }\n }\n // Get element properties\n for (let key in props) {\n const value = props[key];\n if (value === void 0) {\n continue;\n }\n switch (key) {\n // Properties to ignore\n case 'icon':\n case 'style':\n case 'children':\n case 'onLoad':\n case 'mode':\n case 'ssr':\n case 'fallback':\n break;\n // Forward ref\n case '_ref':\n componentProps.ref = value;\n break;\n // Merge class names\n case 'className':\n componentProps[key] =\n (componentProps[key] ? componentProps[key] + ' ' : '') +\n value;\n break;\n // Boolean attributes\n case 'inline':\n case 'hFlip':\n case 'vFlip':\n customisations[key] =\n value === true || value === 'true' || value === 1;\n break;\n // Flip as string: 'horizontal,vertical'\n case 'flip':\n if (typeof value === 'string') {\n flipFromString(customisations, value);\n }\n break;\n // Color: copy to style\n case 'color':\n style.color = value;\n break;\n // Rotation as string\n case 'rotate':\n if (typeof value === 'string') {\n customisations[key] = rotateFromString(value);\n }\n else if (typeof value === 'number') {\n customisations[key] = value;\n }\n break;\n // Remove aria-hidden\n case 'ariaHidden':\n case 'aria-hidden':\n if (value !== true && value !== 'true') {\n delete componentProps['aria-hidden'];\n }\n break;\n // Copy missing property if it does not exist in customisations\n default:\n if (defaultProps[key] === void 0) {\n componentProps[key] = value;\n }\n }\n }\n // Generate icon\n const item = iconToSVG(icon, customisations);\n const renderAttribs = item.attributes;\n // Inline display\n if (customisations.inline) {\n style.verticalAlign = '-0.125em';\n }\n if (mode === 'svg') {\n // Add style\n componentProps.style = {\n ...style,\n ...customStyle,\n };\n // Add icon stuff\n Object.assign(componentProps, renderAttribs);\n // Counter for ids based on \"id\" property to render icons consistently on server and client\n let localCounter = 0;\n let id = props.id;\n if (typeof id === 'string') {\n // Convert '-' to '_' to avoid errors in animations\n id = id.replace(/-/g, '_');\n }\n // Add icon stuff\n componentProps.dangerouslySetInnerHTML = {\n __html: cleanUpInnerHTML(replaceIDs(item.body, id ? () => id + 'ID' + localCounter++ : 'iconifyReact')),\n };\n return createElement('svg', componentProps);\n }\n // Render <span> with style\n const { body, width, height } = icon;\n const useMask = mode === 'mask' ||\n (mode === 'bg' ? false : body.indexOf('currentColor') !== -1);\n // Generate SVG\n const html = iconToHTML(body, {\n ...renderAttribs,\n width: width + '',\n height: height + '',\n });\n // Generate style\n componentProps.style = {\n ...style,\n '--svg': svgToURL(html),\n 'width': fixSize(renderAttribs.width),\n 'height': fixSize(renderAttribs.height),\n ...commonProps,\n ...(useMask ? monotoneProps : coloredProps),\n ...customStyle,\n };\n return createElement('span', componentProps);\n};\n\n/**\n * Initialise stuff\n */\n// Enable short names\nallowSimpleNames(true);\n// Set API module\nsetAPIModule('', fetchAPIModule);\n/**\n * Browser stuff\n */\nif (typeof document !== 'undefined' && typeof window !== 'undefined') {\n const _window = window;\n // Load icons from global \"IconifyPreload\"\n if (_window.IconifyPreload !== void 0) {\n const preload = _window.IconifyPreload;\n const err = 'Invalid IconifyPreload syntax.';\n if (typeof preload === 'object' && preload !== null) {\n (preload instanceof Array ? preload : [preload]).forEach((item) => {\n try {\n if (\n // Check if item is an object and not null/array\n typeof item !== 'object' ||\n item === null ||\n item instanceof Array ||\n // Check for 'icons' and 'prefix'\n typeof item.icons !== 'object' ||\n typeof item.prefix !== 'string' ||\n // Add icon set\n !addCollection(item)) {\n console.error(err);\n }\n }\n catch (e) {\n console.error(err);\n }\n });\n }\n }\n // Set API from global \"IconifyProviders\"\n if (_window.IconifyProviders !== void 0) {\n const providers = _window.IconifyProviders;\n if (typeof providers === 'object' && providers !== null) {\n for (let key in providers) {\n const err = 'IconifyProviders[' + key + '] is invalid.';\n try {\n const value = providers[key];\n if (typeof value !== 'object' ||\n !value ||\n value.resources === void 0) {\n continue;\n }\n if (!addAPIProvider(key, value)) {\n console.error(err);\n }\n }\n catch (e) {\n console.error(err);\n }\n }\n }\n }\n}\nfunction IconComponent(props) {\n const [mounted, setMounted] = useState(!!props.ssr);\n const [abort, setAbort] = useState({});\n // Get initial state\n function getInitialState(mounted) {\n if (mounted) {\n const name = props.icon;\n if (typeof name === 'object') {\n // Icon as object\n return {\n name: '',\n data: name,\n };\n }\n const data = getIconData(name);\n if (data) {\n return {\n name,\n data,\n };\n }\n }\n return {\n name: '',\n };\n }\n const [state, setState] = useState(getInitialState(!!props.ssr));\n // Cancel loading\n function cleanup() {\n const callback = abort.callback;\n if (callback) {\n callback();\n setAbort({});\n }\n }\n // Change state if it is different\n function changeState(newState) {\n if (JSON.stringify(state) !== JSON.stringify(newState)) {\n cleanup();\n setState(newState);\n return true;\n }\n }\n // Update state\n function updateState() {\n var _a;\n const name = props.icon;\n if (typeof name === 'object') {\n // Icon as object\n changeState({\n name: '',\n data: name,\n });\n return;\n }\n // New icon or got icon data\n const data = getIconData(name);\n if (changeState({\n name,\n data,\n })) {\n if (data === undefined) {\n // Load icon, update state when done\n const callback = loadIcons([name], updateState);\n setAbort({\n callback,\n });\n }\n else if (data) {\n // Icon data is available: trigger onLoad callback if present\n (_a = props.onLoad) === null || _a === void 0 ? void 0 : _a.call(props, name);\n }\n }\n }\n // Mounted state, cleanup for loader\n useEffect(() => {\n setMounted(true);\n return cleanup;\n }, []);\n // Icon changed or component mounted\n useEffect(() => {\n if (mounted) {\n updateState();\n }\n }, [props.icon, mounted]);\n // Render icon\n const { name, data } = state;\n if (!data) {\n return props.children\n ? props.children\n : props.fallback\n ? props.fallback\n : createElement('span', {});\n }\n return render({\n ...defaultIconProps,\n ...data,\n }, props, name);\n}\n/**\n * Block icon\n *\n * @param props - Component properties\n */\nconst Icon = forwardRef((props, ref) => IconComponent({\n ...props,\n _ref: ref,\n}));\n/**\n * Inline icon (has negative verticalAlign that makes it behave like icon font)\n *\n * @param props - Component properties\n */\nconst InlineIcon = forwardRef((props, ref) => IconComponent({\n inline: true,\n ...props,\n _ref: ref,\n}));\n/**\n * Internal API\n */\nconst _api = {\n getAPIConfig,\n setAPIModule,\n sendAPIQuery,\n setFetch,\n getFetch,\n listAPIProviders,\n};\n\nexport { Icon, InlineIcon, _api, addAPIProvider, addCollection, addIcon, iconToSVG as buildIcon, calculateSize, getIcon, iconLoaded, listIcons, loadIcon, loadIcons, replaceIDs, setCustomIconLoader, setCustomIconsLoader };\n","/**\n * Click Protection Utility\n *\n * Provides a mechanism to prevent deselection when clicking on overlays\n * like color pickers, context menus, etc.\n *\n * Usage:\n * 1. Call `protectNextClick()` before showing an overlay\n * 2. In your click handler, check `shouldProtectClick()` before deselecting\n * 3. The protection automatically expires after one click or a timeout\n */\n\nclass ClickProtectionManager {\n isProtectedFlag: boolean;\n timeout: ReturnType<typeof setTimeout> | null;\n timeoutDuration: number;\n\n constructor() {\n this.isProtectedFlag = false;\n this.timeout = null;\n this.timeoutDuration = 5000; // 5 seconds max protection\n }\n\n /**\n * Protect the next click from triggering deselection\n * Automatically expires after one check or timeout\n */\n protectNextClick() {\n this.isProtectedFlag = true;\n\n // Clear any existing timeout\n if (this.timeout) {\n clearTimeout(this.timeout);\n }\n\n // Set timeout to automatically clear protection\n this.timeout = setTimeout(() => {\n this.isProtectedFlag = false;\n this.timeout = null;\n }, this.timeoutDuration);\n }\n\n /**\n * Check if the current click should be protected\n * This consumes the protection (one-time use)\n * @returns {boolean} true if click should be protected, false otherwise\n */\n shouldProtectClick() {\n const wasProtected = this.isProtectedFlag;\n\n // Consume the protection\n if (this.isProtectedFlag) {\n this.isProtectedFlag = false;\n if (this.timeout) {\n clearTimeout(this.timeout);\n this.timeout = null;\n }\n }\n\n return wasProtected;\n }\n\n /**\n * Manually clear protection (useful for cleanup)\n */\n clearProtection() {\n this.isProtectedFlag = false;\n if (this.timeout) {\n clearTimeout(this.timeout);\n this.timeout = null;\n }\n }\n\n /**\n * Check if protection is currently active (without consuming it)\n * @returns {boolean} true if protection is active\n */\n isProtected() {\n return this.isProtectedFlag;\n }\n}\n\n// Export singleton instance\nexport const clickProtection = new ClickProtectionManager();\n","import { type ClassValue, clsx } from 'clsx';\nimport { extendTailwindMerge } from 'tailwind-merge';\n\n// The canvas package compiles its Tailwind with prefix(sc) (see\n// src/components/embed/embed.css), so every utility is written `sc:*`.\n// tailwind-merge must know about the prefix or conflicting utilities\n// (e.g. `sc:px-2` vs `sc:px-4`) would never be deduped.\nconst twMerge = extendTailwindMerge({ prefix: 'sc' });\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","\"use client\";\n\n'use client';\n\nimport * as React from 'react';\nimport { Slot } from '@radix-ui/react-slot';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { cn } from '../lib/utils';\n\n/**\n * Surface Context\n *\n * Provides information about the current surface variant to child components.\n * This allows form components (Input, TextArea, etc.) to automatically adapt\n * their styling based on their container's surface variant.\n *\n * Default is 'transparent' so that form fields on the page background\n * (not inside a Surface/Card) use the white/shadow style.\n */\nconst SurfaceContext = React.createContext<{\n variant: 'transparent' | 'default' | 'secondary';\n}>({ variant: 'transparent' });\n\n/**\n * Hook to access the current surface context\n */\nexport function useSurface() {\n return React.useContext(SurfaceContext);\n}\n\nconst surfaceVariants = cva('', {\n variants: {\n variant: {\n transparent: 'sc:bg-transparent',\n default: 'sc:bg-card',\n secondary: 'sc:bg-default',\n },\n },\n defaultVariants: {\n variant: 'default',\n },\n});\n\nexport interface SurfaceProps extends React.HTMLAttributes<HTMLDivElement>, VariantProps<typeof surfaceVariants> {\n /**\n * Change the default rendered element for the one passed as a child,\n * merging their props and behavior.\n */\n asChild?: boolean;\n}\n\n/**\n * Surface Component\n *\n * A semantic container that provides surface-level styling and context for child components.\n *\n * ## Variants:\n * - `transparent` - No background\n * - `default` - Card/panel surface (bg-card)\n * - `secondary` - Raised/muted surface (bg-default)\n *\n * Form fields automatically adapt their styling based on which surface they're on.\n *\n * @example\n * ```tsx\n * <Surface variant=\"default\">\n * <Input placeholder=\"On a card surface\" />\n * </Surface>\n * ```\n */\nconst Surface = React.forwardRef<HTMLDivElement, SurfaceProps>(\n ({ className, variant = 'default', asChild = false, children, ...props }, ref) => {\n const Comp = asChild ? Slot : 'div';\n\n return (\n <SurfaceContext.Provider value={{ variant: variant ?? 'default' }}>\n <Comp ref={ref} className={cn(surfaceVariants({ variant }), className)} {...props}>\n {children}\n </Comp>\n </SurfaceContext.Provider>\n );\n }\n);\nSurface.displayName = 'Surface';\n\nexport { Surface, surfaceVariants, SurfaceContext };\n","import * as React from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { cn } from '../lib/utils';\nimport { useSurface } from './surface';\n\nconst buttonVariants = cva(\n 'sc:inline-flex sc:items-center sc:justify-center sc:gap-2 sc:rounded-button sc:text-sm sc:transition-colors sc:focus-visible:outline-none sc:disabled:pointer-events-none sc:disabled:opacity-50 sc:font-button',\n {\n variants: {\n variant: {\n // Use proper Tailwind tokens — the previous `btn-primary-auto`\n // class lives in ui-react/styles/globals.css, which snowcone (and\n // any consumer using only defaults.css/base.css/utilities.css)\n // does NOT import, so primary buttons rendered with no background\n // there. `bg-primary text-primary-foreground` is universal.\n default: 'sc:bg-primary sc:text-primary-foreground sc:hover:bg-primary/90',\n primary: 'sc:bg-primary sc:text-primary-foreground sc:hover:bg-primary/90', // HeroUI alias\n secondary: 'sc:bg-default sc:text-default-foreground sc:hover:bg-default/80',\n tertiary: 'sc:hover:bg-muted', // HeroUI alias\n field: 'sc:bg-field sc:text-foreground sc:hover:bg-field/80 sc:shadow-soft sc:dark:shadow-none sc:rounded-input',\n ghost: 'sc:text-foreground/70 sc:hover:text-foreground sc:hover:bg-muted',\n destructive: 'sc:bg-destructive sc:text-destructive-foreground sc:hover:bg-destructive/90',\n outline: 'sc:border sc:border-divider sc:bg-transparent sc:hover:bg-muted',\n link: 'sc:text-primary sc:underline-offset-4 sc:hover:underline',\n // Option variants for product selectors (sizes, colors)\n 'option-text': 'sc:px-5 sc:py-2.5 sc:text-base sc:font-medium sc:rounded-full sc:border-2 sc:bg-background sc:min-w-[70px] sc:data-[selected=true]:border-primary sc:data-[selected=false]:border-border sc:hover:border-primary/50',\n 'option-swatch': 'sc:relative sc:h-12 sc:w-12 sc:shrink-0 sc:aspect-square sc:rounded-full sc:data-[selected=true]:scale-105 sc:data-[selected=true]:border-2 sc:data-[selected=true]:border-primary sc:ring-1 sc:ring-border/30',\n // Standalone action buttons (not part of a selection set)\n 'action': 'sc:px-5 sc:py-2.5 sc:text-base sc:font-medium sc:rounded-full sc:bg-card sc:shadow-sm sc:hover:shadow-md sc:transition-shadow',\n 'action-icon': 'sc:shrink-0 sc:rounded-full sc:bg-card sc:shadow-sm sc:hover:shadow-md sc:transition-shadow sc:px-3 sc:py-2.5',\n },\n size: {\n none: '',\n default: 'sc:h-10 sc:px-4 sc:py-2',\n sm: 'sc:h-9 sc:px-3',\n md: 'sc:h-10 sc:px-4 sc:py-2', // HeroUI alias\n lg: 'sc:h-11 sc:px-8',\n icon: 'sc:h-10 sc:w-10',\n // Toolbar size: 44px on mobile, 36px on desktop (md+)\n toolbar: 'sc:size-11 sc:md:size-9 sc:p-2 sc:rounded-lg',\n },\n },\n defaultVariants: {\n variant: 'default',\n size: 'default',\n },\n }\n);\n\nexport interface ButtonProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement>,\n VariantProps<typeof buttonVariants> {\n asChild?: boolean;\n // HeroUI compatibility props\n onPress?: (e?: React.MouseEvent<HTMLButtonElement>) => void;\n isPending?: boolean;\n // Option selection state (for option-text and option-swatch variants)\n selected?: boolean;\n}\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n ({ className, variant, size, onPress, isPending, onClick, disabled, selected, children, ...props }, ref) => {\n const { variant: surfaceVariant } = useSurface();\n const isOnDefaultSurface = surfaceVariant === 'default';\n const isOnSecondarySurface = surfaceVariant === 'secondary';\n\n const handleClick = (e: React.MouseEvent<HTMLButtonElement>) => {\n if (onPress) onPress(e);\n if (onClick) onClick(e);\n };\n\n // Surface-aware variant overrides\n // - On default surface (white card): dark mode needs lighter bg, light mode base color is fine\n // - On secondary surface: both modes need the raised color for contrast\n const surfaceOverrides = {\n secondary:\n variant === 'secondary' &&\n (isOnSecondarySurface\n ? 'sc:bg-[var(--color-default-on-surface)] sc:hover:bg-[var(--color-default-on-surface)]/80'\n : isOnDefaultSurface\n ? 'sc:dark:bg-[var(--color-default-on-surface)] sc:dark:hover:bg-[var(--color-default-on-surface)]/80'\n : false),\n field:\n variant === 'field' &&\n (isOnSecondarySurface\n ? 'sc:bg-[var(--color-field-on-surface)] sc:hover:bg-[var(--color-field-on-surface)]/80'\n : isOnDefaultSurface\n ? 'sc:dark:bg-[var(--color-field-on-surface)] sc:dark:hover:bg-[var(--color-field-on-surface)]/80'\n : false),\n ghost:\n variant === 'ghost' &&\n (isOnDefaultSurface || isOnSecondarySurface) &&\n 'sc:hover:bg-[var(--color-default-on-surface)]',\n outline:\n variant === 'outline' &&\n (isOnDefaultSurface || isOnSecondarySurface) &&\n 'sc:hover:bg-[var(--color-default-on-surface)]',\n };\n\n return (\n <button\n className={cn(\n buttonVariants({ variant, size }),\n surfaceOverrides.secondary,\n surfaceOverrides.field,\n surfaceOverrides.ghost,\n surfaceOverrides.outline,\n className\n )}\n ref={ref}\n onClick={handleClick}\n disabled={disabled || isPending}\n data-selected={selected}\n {...props}\n >\n {children}\n </button>\n );\n }\n);\nButton.displayName = 'Button';\n\nexport { Button, buttonVariants };\n","\"use client\";\n\nimport * as React from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { cn } from \"../lib/utils\";\nimport { Surface } from \"./surface\";\n\n/**\n * Drawer Component\n *\n * A mobile-optimized drawer component that works correctly on all platforms including iOS Safari.\n * Uses CSS animations and proper positioning for smooth, native-feeling interactions.\n *\n * Key features:\n * - CSS-based animations for smooth performance\n * - Backdrop blur overlay for modern iOS 26+ appearance\n * - Proper safe-area handling via CSS (no explicit color props needed)\n * - Native swipe-to-dismiss gesture support\n * - Works with scrollable page content\n *\n * @example Basic usage\n * <Drawer open={isOpen} onOpenChange={setIsOpen}>\n * <DrawerTrigger asChild>\n * <Button>Open Drawer</Button>\n * </DrawerTrigger>\n * <DrawerContent>\n * <DrawerHeader>\n * <DrawerTitle>Title</DrawerTitle>\n * <DrawerDescription>Description</DrawerDescription>\n * </DrawerHeader>\n * <div className=\"p-4\">Content here</div>\n * <DrawerFooter>\n * <Button>Action</Button>\n * </DrawerFooter>\n * </DrawerContent>\n * </Drawer>\n *\n * @example Custom colored drawer with blur overlay\n * <DrawerContent className=\"bg-emerald-500\">\n * <DrawerTitle className=\"sr-only\">Sheet</DrawerTitle>\n * <div className=\"p-4 text-white\">\n * Content with custom background - safe areas handled automatically\n * </div>\n * </DrawerContent>\n */\n\ninterface DrawerContextValue {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n}\n\nconst DrawerContext = React.createContext<DrawerContextValue | null>(null);\n\nfunction useDrawerContext() {\n const context = React.useContext(DrawerContext);\n if (!context) {\n throw new Error(\"Drawer components must be used within a Drawer\");\n }\n return context;\n}\n\n// ============================================================================\n// Drawer (Root)\n// ============================================================================\n\ninterface DrawerProps {\n open?: boolean;\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean) => void;\n children: React.ReactNode;\n}\n\nfunction Drawer({\n open: controlledOpen,\n defaultOpen = false,\n onOpenChange,\n children,\n}: DrawerProps) {\n const [uncontrolledOpen, setUncontrolledOpen] = React.useState(defaultOpen);\n\n const isControlled = controlledOpen !== undefined;\n const open = isControlled ? controlledOpen : uncontrolledOpen;\n\n const handleOpenChange = React.useCallback(\n (newOpen: boolean) => {\n if (!isControlled) {\n setUncontrolledOpen(newOpen);\n }\n onOpenChange?.(newOpen);\n },\n [isControlled, onOpenChange]\n );\n\n // Dispatch drawer-open/close events and manage data-drawer-open attribute\n // Note: drawer-close is also dispatched from DrawerContent.handleClose for animated closes,\n // but we handle it here too for cases where open prop changes directly (e.g., clicking \"Done\" button)\n const headerShiftDelay = 10; // ms - blur appears, then header shifts\n const wasOpen = React.useRef(false);\n React.useLayoutEffect(() => {\n if (open) {\n wasOpen.current = true;\n document.documentElement.setAttribute(\"data-drawer-open\", \"true\");\n const timer = setTimeout(() => {\n window.dispatchEvent(new CustomEvent(\"drawer-open\"));\n }, headerShiftDelay);\n return () => clearTimeout(timer);\n } else if (wasOpen.current) {\n // Only dispatch close if this drawer was actually opened\n // This prevents dispatching close for drawers that were never opened\n wasOpen.current = false;\n // Guard: Only remove attribute and dispatch event if attribute is still present\n // This prevents double-dispatch when handleClose has already removed it during animated close\n if (document.documentElement.hasAttribute(\"data-drawer-open\")) {\n document.documentElement.removeAttribute(\"data-drawer-open\");\n window.dispatchEvent(new CustomEvent(\"drawer-close\"));\n }\n }\n return undefined;\n }, [open]);\n\n return (\n <DrawerContext.Provider value={{ open, onOpenChange: handleOpenChange }}>\n {children}\n </DrawerContext.Provider>\n );\n}\nDrawer.displayName = \"Drawer\";\n\n// ============================================================================\n// DrawerTrigger\n// ============================================================================\n\ninterface DrawerTriggerProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n asChild?: boolean;\n}\n\nconst DrawerTrigger = React.forwardRef<HTMLButtonElement, DrawerTriggerProps>(\n ({ asChild, onClick, children, ...props }, ref) => {\n const { onOpenChange } = useDrawerContext();\n\n const handleClick = (e: React.MouseEvent<HTMLButtonElement>) => {\n onClick?.(e);\n onOpenChange(true);\n };\n\n if (asChild && React.isValidElement(children)) {\n return React.cloneElement(\n children as React.ReactElement<{ onClick?: React.MouseEventHandler }>,\n {\n onClick: handleClick,\n }\n );\n }\n\n return (\n <button ref={ref} onClick={handleClick} {...props}>\n {children}\n </button>\n );\n }\n);\nDrawerTrigger.displayName = \"DrawerTrigger\";\n\n// ============================================================================\n// DrawerClose\n// ============================================================================\n\ninterface DrawerCloseProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n asChild?: boolean;\n}\n\nconst DrawerClose = React.forwardRef<HTMLButtonElement, DrawerCloseProps>(\n ({ asChild, onClick, children, ...props }, ref) => {\n const { onOpenChange } = useDrawerContext();\n\n const handleClick = (e: React.MouseEvent<HTMLButtonElement>) => {\n onClick?.(e);\n onOpenChange(false);\n };\n\n if (asChild && React.isValidElement(children)) {\n return React.cloneElement(\n children as React.ReactElement<{ onClick?: React.MouseEventHandler }>,\n {\n onClick: handleClick,\n }\n );\n }\n\n return (\n <button ref={ref} onClick={handleClick} {...props}>\n {children}\n </button>\n );\n }\n);\nDrawerClose.displayName = \"DrawerClose\";\n\n// ============================================================================\n// DrawerContent\n// ============================================================================\n\ninterface DrawerContentProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Drawer placement. Default: 'bottom' */\n placement?: \"bottom\" | \"left\" | \"right\";\n /** Explicit height for bottom drawer. Use this when you want the drawer to always be a specific size. */\n height?: string;\n /** Max height for bottom drawer. Default: '80dvh'. Only used if height is not set. */\n maxHeight?: string;\n /** Width for side drawers (left/right). Can be CSS value like '400px' or '80vw'. */\n width?: string;\n /** Max width for side drawers. Default: '400px' */\n maxWidth?: string;\n /** Whether to show the overlay/backdrop. Default: true */\n showOverlay?: boolean;\n /** Whether to hide the drag handle. Default: false */\n hideHandle?: boolean;\n /** Overlay opacity (0-1). Default: 0.3 */\n overlayOpacity?: number;\n /** Whether to lock body scroll when drawer is open. Default: true */\n lockBodyScroll?: boolean;\n /** Whether to use dialog ARIA attributes (role=\"dialog\", aria-modal). Default: true */\n useDialogRole?: boolean;\n /** Disable swipe gestures for closing the drawer. Default: false. */\n disableSwipeGestures?: boolean;\n /** Animation duration in ms. Default: 300 (DEBUG: 2000) */\n animationDuration?: number;\n /** Show a gradient fade at the bottom that hides when scrolled to bottom. Default: true */\n showScrollFade?: boolean;\n /** Color for the scroll fade gradient. Should match drawer background. Default: uses CSS variable */\n scrollFadeColor?: string;\n /** Height ratio for bottom drawer (0-1). Deprecated - use height prop instead. Will set height to heightRatio * 100vh. */\n heightRatio?: number;\n /** Whether to add safe area padding at the bottom. Default: false. Deprecated - safe area is handled automatically via CSS. */\n safeAreaPadding?: boolean;\n}\n\nconst DrawerContent = React.forwardRef<HTMLDivElement, DrawerContentProps>(\n (\n {\n className,\n children,\n placement = \"bottom\",\n height,\n maxHeight = \"80dvh\",\n width,\n maxWidth = \"400px\",\n showOverlay = true,\n hideHandle = false,\n overlayOpacity = 0.3,\n lockBodyScroll = true,\n useDialogRole = true,\n disableSwipeGestures = false,\n animationDuration = 500,\n showScrollFade = true,\n scrollFadeColor,\n heightRatio,\n safeAreaPadding = false,\n ...props\n },\n ref\n ) => {\n const { open, onOpenChange } = useDrawerContext();\n const [mounted, setMounted] = React.useState(false);\n const [bodyHeight, setBodyHeight] = React.useState(0);\n const [isClosing, setIsClosing] = React.useState(false);\n const [isBlurFading, setIsBlurFading] = React.useState(false);\n const [isAtBottom, setIsAtBottom] = React.useState(false);\n const [delayedOpen, setDelayedOpen] = React.useState(false);\n const drawerRef = React.useRef<HTMLDivElement>(null);\n const contentRef = React.useRef<HTMLDivElement>(null);\n const startY = React.useRef(0);\n const currentY = React.useRef(0);\n\n // Track nested drawer state - shift down when another drawer opens on top\n const [isNestedDrawerOpen, setIsNestedDrawerOpen] = React.useState(false);\n const [showGreenBar, setShowGreenBar] = React.useState(false);\n const drawerMountedRef = React.useRef(false);\n const ignoreNextDrawerOpenRef = React.useRef(true); // Ignore our own drawer-open event\n const greenBarTimeoutRef = React.useRef<ReturnType<\n typeof setTimeout\n > | null>(null);\n\n // Delay drawer opening to allow header shift to complete first\n const openDelay = 120; // ms - must be after green bar finishes\n React.useEffect(() => {\n if (open) {\n const timer = setTimeout(() => setDelayedOpen(true), openDelay);\n return () => clearTimeout(timer);\n } else {\n setDelayedOpen(false);\n }\n return undefined;\n }, [open]);\n\n // Handle scroll to detect when at bottom\n const handleScroll = React.useCallback(\n (e: React.UIEvent<HTMLDivElement>) => {\n const target = e.target as HTMLDivElement;\n const atBottom =\n target.scrollHeight - target.scrollTop - target.clientHeight < 20;\n setIsAtBottom(atBottom);\n },\n []\n );\n\n // Merge refs\n React.useImperativeHandle(ref, () => drawerRef.current!);\n\n // Setup: mount detection and body height tracking\n React.useEffect(() => {\n setMounted(true);\n setBodyHeight(document.body.clientHeight);\n\n const updateHeight = () => setBodyHeight(document.body.clientHeight);\n window.addEventListener(\"resize\", updateHeight);\n\n return () => {\n window.removeEventListener(\"resize\", updateHeight);\n };\n }, []);\n\n // Lock body scroll when open\n React.useEffect(() => {\n if (open && lockBodyScroll) {\n document.body.style.overflow = \"hidden\";\n } else if (lockBodyScroll) {\n document.body.style.overflow = \"\";\n }\n return () => {\n if (lockBodyScroll) {\n document.body.style.overflow = \"\";\n }\n };\n }, [open, lockBodyScroll]);\n\n // Track nested drawer state - when another drawer opens on top of this one\n // Shift the sticky wrapper down to make room for iOS safe area\n React.useLayoutEffect(() => {\n if (!open) {\n // Reset when this drawer closes\n drawerMountedRef.current = false;\n ignoreNextDrawerOpenRef.current = true;\n setIsNestedDrawerOpen(false);\n return;\n }\n\n // After a delay, start listening for nested drawer events\n // (ignore our own drawer-open event which fires when we open)\n const mountTimer = setTimeout(() => {\n drawerMountedRef.current = true;\n ignoreNextDrawerOpenRef.current = false;\n }, 200); // Wait for our own drawer's open event to pass\n\n const handleNestedDrawerOpen = () => {\n if (!drawerMountedRef.current || ignoreNextDrawerOpenRef.current) {\n return; // Ignore our own drawer-open event\n }\n // A nested drawer opened on top of us - shift down for iOS safe area\n // Clear any existing green bar timeout to prevent stacking\n if (greenBarTimeoutRef.current) {\n clearTimeout(greenBarTimeoutRef.current);\n }\n // Flash green bar and shift drawer down\n setShowGreenBar(true);\n setIsNestedDrawerOpen(true);\n // Hide green bar after 60ms (triggers iOS safe area detection)\n greenBarTimeoutRef.current = setTimeout(() => {\n setShowGreenBar(false);\n greenBarTimeoutRef.current = null;\n }, 60);\n };\n\n const handleNestedDrawerClose = () => {\n if (!drawerMountedRef.current) return;\n setIsNestedDrawerOpen(false);\n };\n\n window.addEventListener(\"drawer-open\", handleNestedDrawerOpen);\n window.addEventListener(\"drawer-close\", handleNestedDrawerClose);\n\n return () => {\n clearTimeout(mountTimer);\n if (greenBarTimeoutRef.current) {\n clearTimeout(greenBarTimeoutRef.current);\n greenBarTimeoutRef.current = null;\n }\n window.removeEventListener(\"drawer-open\", handleNestedDrawerOpen);\n window.removeEventListener(\"drawer-close\", handleNestedDrawerClose);\n };\n }, [open]);\n\n // Calculate sticky wrapper top offset for nested drawer\n const stickyTopOffset = isNestedDrawerOpen ? 10 : 0;\n\n // Scroll trick to trigger blur rendering on sticky elements\n // Some browsers don't apply backdrop-filter until scroll activity occurs\n const scrollNudgeAmount = 50;\n const scrollNudgeDuration = 10; // ms\n const savedScrollY = React.useRef<number | null>(null);\n\n // Custom smooth scroll with configurable duration\n const smoothScrollTo = React.useCallback(\n (target: number, duration: number) => {\n const start = window.scrollY;\n const distance = target - start;\n const startTime = performance.now();\n\n const animate = (currentTime: number) => {\n const elapsed = currentTime - startTime;\n const progress = Math.min(elapsed / duration, 1);\n const eased = 1 - Math.pow(1 - progress, 3); // ease-out cubic\n window.scrollTo(0, start + distance * eased);\n if (progress < 1) requestAnimationFrame(animate);\n };\n requestAnimationFrame(animate);\n },\n []\n );\n\n const scrollNudgeDelay = 10; // ms - let blur appear first\n React.useEffect(() => {\n if (open && !isClosing) {\n // Save position immediately\n savedScrollY.current = document.documentElement.scrollTop;\n // Skip scroll nudge if already scrolled past the nudge amount\n if (savedScrollY.current > scrollNudgeAmount) {\n return;\n }\n // Delay scroll nudge to let blur overlay appear first\n const timer = setTimeout(() => {\n smoothScrollTo(\n savedScrollY.current! + scrollNudgeAmount,\n scrollNudgeDuration\n );\n }, scrollNudgeDelay);\n return () => clearTimeout(timer);\n }\n return undefined;\n }, [open, isClosing, smoothScrollTo]);\n\n // Restore scroll position when drawer closes via prop change (e.g., Done button)\n // This handles the case where handleClose is not called (prop-driven close vs gesture close)\n // When handleClose IS called (gesture close), it sets savedScrollY.current = null before\n // open becomes false, so this effect won't double-restore.\n React.useEffect(() => {\n if (!open && !isClosing && savedScrollY.current !== null) {\n const targetScroll = savedScrollY.current;\n savedScrollY.current = null;\n document.body.style.overflow = \"\";\n window.scrollTo(0, targetScroll);\n }\n }, [open, isClosing]);\n\n // Handle close with reversed sequence: drawer → header → blur\n // Close timings (reverse of open)\n const drawerExitDuration = 300; // ms - drawer slides down\n const headerShiftDelay = 200; // ms - header shifts after drawer mostly gone\n const blurFadeDelay = 250; // ms - blur starts fading near end\n const blurFadeDuration = 150; // ms - blur fade animation\n const totalCloseDuration = blurFadeDelay + blurFadeDuration;\n\n // Small delay before drawer starts closing visually\n const closeStartDelay = 50; // ms - give everything a moment before visual close\n\n const handleClose = React.useCallback(() => {\n // Brief pause before starting visual close\n setTimeout(() => {\n // Start drawer slide-out\n setIsClosing(true);\n\n // STEP 1: Restore scroll position FIRST (at 150ms)\n // This must happen BEFORE removing data-drawer-open, so that when\n // CSS scroll-driven animations resume, they calculate with the correct scroll position.\n // Otherwise, the hero images will be at wrong scale/position (the \"breaks half the time\" bug).\n const scrollRestoreDelay = 150;\n setTimeout(() => {\n document.body.style.overflow = \"\";\n const targetScroll = savedScrollY.current;\n if (targetScroll !== null) {\n savedScrollY.current = null;\n window.scrollTo(0, targetScroll);\n }\n }, scrollRestoreDelay);\n\n // STEP 2: After scroll restored and drawer mostly gone, remove attribute (at 200ms)\n // CSS animations will now resume with the correct scroll position\n setTimeout(() => {\n document.documentElement.removeAttribute(\"data-drawer-open\");\n window.dispatchEvent(new CustomEvent(\"drawer-close\"));\n }, headerShiftDelay);\n\n // STEP 3: Start blur fade near the end (at 250ms)\n setTimeout(() => {\n setIsBlurFading(true);\n }, blurFadeDelay);\n\n // STEP 4: Finally unmount everything (at 400ms)\n setTimeout(() => {\n setIsClosing(false);\n setIsBlurFading(false);\n onOpenChange(false);\n }, totalCloseDuration);\n }, closeStartDelay);\n }, [onOpenChange]);\n\n // Escape key handler\n React.useEffect(() => {\n const handleEscape = (e: KeyboardEvent) => {\n if (e.key === \"Escape\" && open && !isClosing) {\n handleClose();\n }\n };\n document.addEventListener(\"keydown\", handleEscape);\n return () => document.removeEventListener(\"keydown\", handleEscape);\n }, [open, isClosing, handleClose]);\n\n // Swipe gesture handlers for bottom drawer\n const handleTouchStart = React.useCallback(\n (e: React.TouchEvent) => {\n if (disableSwipeGestures) return;\n startY.current = e.touches[0].clientY;\n currentY.current = 0;\n if (drawerRef.current) {\n drawerRef.current.style.transition = \"none\";\n }\n },\n [disableSwipeGestures]\n );\n\n const handleTouchMove = React.useCallback(\n (e: React.TouchEvent) => {\n if (disableSwipeGestures) return;\n const delta = e.touches[0].clientY - startY.current;\n // Only allow dragging down (positive delta)\n currentY.current = Math.max(0, delta);\n if (drawerRef.current) {\n drawerRef.current.style.transform = `translateY(${currentY.current}px)`;\n }\n },\n [disableSwipeGestures]\n );\n\n const handleTouchEnd = React.useCallback(() => {\n if (disableSwipeGestures) return;\n if (drawerRef.current) {\n drawerRef.current.style.transition = `transform ${animationDuration}ms cubic-bezier(0.32, 0.72, 0, 1)`;\n drawerRef.current.style.transform = \"\";\n }\n\n const threshold = 100;\n if (currentY.current > threshold) {\n handleClose();\n }\n }, [disableSwipeGestures, handleClose, animationDuration]);\n\n // Show overlay immediately when open, drawer panel waits for delayedOpen\n if (!mounted || (!open && !isClosing)) return null;\n\n const showDrawerPanel = delayedOpen || isClosing;\n\n const animationStyle = {\n \"--animation-duration\": `${animationDuration}ms`,\n } as React.CSSProperties;\n\n return createPortal(\n // The .sc-root wrapper is load-bearing: a body portal escapes the\n // editor's .sc-root scope, so without it every scoped theme token\n // (--sc-spacing-*, --sc-color-*, --sc-z-*) inside the drawer resolves\n // to nothing. display:contents keeps it box-less.\n <div className=\"sc-root\" style={{ display: \"contents\" }}>\n <div\n style={{\n position: \"absolute\",\n top: 0,\n left: 0,\n width: \"100%\",\n height: bodyHeight || \"100%\",\n zIndex: 10000000,\n }}\n {...(useDialogRole ? { role: \"dialog\", \"aria-modal\": true } : {})}\n >\n {/* Overlay with blur */}\n {showOverlay && (\n <div\n onClick={handleClose}\n className={cn(\n \"sc:absolute sc:inset-0 sc:backdrop-blur-lg\",\n isBlurFading && \"sc:animate-out sc:fade-out\"\n )}\n style={{\n backgroundColor: `rgba(0,0,0,${overlayOpacity})`,\n animationDuration: isBlurFading\n ? `${blurFadeDuration}ms`\n : undefined,\n }}\n aria-hidden=\"true\"\n />\n )}\n\n {/* Safe area bar - flashes briefly when nested drawer opens to trigger iOS safe area */}\n {/* Must be above drawer overlay (z-index 10000000) */}\n {showGreenBar && (\n <div\n className=\"sc:fixed sc:w-full sc:bg-surface\"\n style={{\n top: 0,\n left: 0,\n height: stickyTopOffset || 10,\n zIndex: 10000001,\n }}\n />\n )}\n\n {/* Sticky wrapper to position drawer */}\n {showDrawerPanel && (\n <div\n className={cn(\n \"sc:sticky sc:left-0 sc:w-full sc:flex sc:pointer-events-none\",\n placement === \"bottom\" && \"sc:items-end sc:justify-center\",\n // Side drawers: stretch to full height unless custom height is set (then top-align with padding)\n placement === \"left\" && (height ? \"sc:items-start sc:justify-start sc:pt-4\" : \"sc:items-stretch sc:justify-start\"),\n placement === \"right\" && (height ? \"sc:items-start sc:justify-end sc:pt-4\" : \"sc:items-stretch sc:justify-end\")\n )}\n style={{\n height: \"100dvh\",\n top: placement === \"bottom\" ? stickyTopOffset : 0,\n transition: \"top 10ms ease-out\",\n }}\n >\n {/* Drawer Panel */}\n <Surface asChild variant=\"default\">\n <div\n ref={drawerRef}\n className={cn(\n \"sc:flex sc:flex-col sc:shadow-2xl sc:pointer-events-auto\",\n // Bottom drawer: rounded top, full width\n placement === \"bottom\" && \"sc:rounded-t-3xl sc:w-full\",\n // Left drawer: rounded right side, full height unless custom height\n placement === \"left\" && cn(\"sc:rounded-r-2xl\", !height && \"sc:h-full\"),\n // Right drawer: rounded left side, full height unless custom height\n placement === \"right\" && cn(\"sc:rounded-l-2xl\", !height && \"sc:h-full\"),\n // Animations based on placement\n placement === \"bottom\" && (isClosing\n ? \"sc:animate-out sc:slide-out-to-bottom\"\n : \"sc:animate-in sc:slide-in-from-bottom\"),\n placement === \"left\" && (isClosing\n ? \"sc:animate-out sc:slide-out-to-left\"\n : \"sc:animate-in sc:slide-in-from-left\"),\n placement === \"right\" && (isClosing\n ? \"sc:animate-out sc:slide-out-to-right\"\n : \"sc:animate-in sc:slide-in-from-right\"),\n className\n )}\n style={{\n // Bottom drawer: use height/maxHeight\n ...(placement === \"bottom\" ? {\n height: heightRatio ? `${heightRatio * 100}vh` : height,\n maxHeight: (heightRatio || height) ? undefined : maxHeight,\n } : {}),\n // Side drawers: use width/maxWidth, custom height or full height\n ...(placement !== \"bottom\" ? {\n width: width || maxWidth,\n maxWidth: maxWidth,\n height: height || \"100%\",\n } : {}),\n animationDuration: isClosing\n ? `${drawerExitDuration}ms`\n : `${animationDuration}ms`,\n animationTimingFunction: isClosing\n ? \"ease-in\"\n : \"cubic-bezier(0.32, 0.72, 0, 1)\",\n animationFillMode: \"forwards\",\n ...animationStyle,\n }}\n onClick={(e) => e.stopPropagation()}\n {...props}\n >\n {/* Drag handle zone - only for bottom drawer */}\n {placement === \"bottom\" && !disableSwipeGestures && (\n <div\n onTouchStart={handleTouchStart}\n onTouchMove={handleTouchMove}\n onTouchEnd={handleTouchEnd}\n className={cn(\n \"sc:cursor-grab sc:active:cursor-grabbing sc:flex-shrink-0\",\n hideHandle && \"sc:absolute sc:top-0 sc:left-0 sc:right-0 sc:h-8 sc:z-10\"\n )}\n style={{ touchAction: \"none\" }}\n >\n {!hideHandle && (\n <div className=\"sc:flex sc:justify-center sc:pt-3 sc:pb-2\">\n <div\n className=\"sc:h-1 sc:w-10 sc:rounded-full sc:bg-muted-foreground/30\"\n aria-hidden=\"true\"\n />\n </div>\n )}\n </div>\n )}\n\n {/* Content area with scroll fade */}\n <div className=\"sc:flex-1 sc:overflow-hidden sc:flex sc:flex-col sc:relative sc:min-h-0\">\n <div\n ref={contentRef}\n className=\"sc:flex-1 sc:flex sc:flex-col sc:overflow-y-auto sc:min-h-0\"\n style={{\n WebkitOverflowScrolling: \"touch\",\n overscrollBehavior: \"contain\",\n }}\n onScroll={handleScroll}\n >\n {children}\n </div>\n\n {/* Gradient fade - hides when scrolled to bottom */}\n {showScrollFade && (\n <div\n className={cn(\n \"sc:absolute sc:bottom-0 sc:left-0 sc:right-0 sc:h-20 sc:pointer-events-none sc:transition-opacity sc:duration-300 sc:z-10\",\n isAtBottom ? \"sc:opacity-0\" : \"sc:opacity-100\"\n )}\n style={{\n background: scrollFadeColor\n ? `linear-gradient(to top, ${scrollFadeColor}, transparent)`\n : \"linear-gradient(to top, var(--color-drawer-bg, var(--surface)), transparent)\",\n }}\n aria-hidden=\"true\"\n />\n )}\n </div>\n\n {/* Bottom safe area padding - inherits drawer background */}\n <div\n className=\"sc:flex-shrink-0\"\n style={{ paddingBottom: \"env(safe-area-inset-bottom)\" }}\n />\n </div>\n </Surface>\n </div>\n )}\n </div>\n </div>,\n document.body\n );\n }\n);\nDrawerContent.displayName = \"DrawerContent\";\n\n// ============================================================================\n// DrawerHeader\n// ============================================================================\n\nconst DrawerHeader = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn(\"sc:grid sc:gap-1.5 sc:p-4 sc:text-center sc:sm:text-left\", className)}\n {...props}\n />\n);\nDrawerHeader.displayName = \"DrawerHeader\";\n\n// ============================================================================\n// DrawerFooter\n// ============================================================================\n\nconst DrawerFooter = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn(\"sc:mt-auto sc:flex sc:flex-col sc:gap-2 sc:p-4\", className)}\n {...props}\n />\n);\nDrawerFooter.displayName = \"DrawerFooter\";\n\n// ============================================================================\n// DrawerTitle\n// ============================================================================\n\nconst DrawerTitle = React.forwardRef<\n HTMLHeadingElement,\n React.HTMLAttributes<HTMLHeadingElement>\n>(({ className, ...props }, ref) => (\n <h2\n ref={ref}\n className={cn(\n \"sc:text-lg sc:font-semibold sc:leading-none sc:tracking-tight\",\n className\n )}\n {...props}\n />\n));\nDrawerTitle.displayName = \"DrawerTitle\";\n\n// ============================================================================\n// DrawerDescription\n// ============================================================================\n\nconst DrawerDescription = React.forwardRef<\n HTMLParagraphElement,\n React.HTMLAttributes<HTMLParagraphElement>\n>(({ className, ...props }, ref) => (\n <p\n ref={ref}\n className={cn(\"sc:text-sm sc:text-muted-foreground\", className)}\n {...props}\n />\n));\nDrawerDescription.displayName = \"DrawerDescription\";\n\n// Primary exports\nexport {\n Drawer,\n DrawerTrigger,\n DrawerClose,\n DrawerContent,\n DrawerHeader,\n DrawerFooter,\n DrawerTitle,\n DrawerDescription,\n};\n\n// Legacy IOS-prefixed exports (for backwards compatibility during migration)\nexport {\n Drawer as IOSDrawer,\n DrawerTrigger as IOSDrawerTrigger,\n DrawerClose as IOSDrawerClose,\n DrawerContent as IOSDrawerContent,\n DrawerHeader as IOSDrawerHeader,\n DrawerFooter as IOSDrawerFooter,\n DrawerTitle as IOSDrawerTitle,\n DrawerDescription as IOSDrawerDescription,\n};\n","'use client';\n\nimport * as React from 'react';\nimport * as TooltipPrimitive from '@radix-ui/react-tooltip';\nimport { cn } from '../lib/utils';\n\nconst TooltipProvider = TooltipPrimitive.Provider;\n\nconst TooltipRoot = TooltipPrimitive.Root;\n\nconst TooltipTrigger = TooltipPrimitive.Trigger;\n\nconst TooltipContent = React.forwardRef<\n React.ElementRef<typeof TooltipPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Content>\n>(({ className, sideOffset = 4, ...props }, ref) => (\n <TooltipPrimitive.Portal>\n <TooltipPrimitive.Content\n ref={ref}\n sideOffset={sideOffset}\n className={cn(\n 'sc:z-tooltip sc:overflow-hidden sc:rounded-tooltip sc:bg-popover sc:px-3 sc:py-1.5 sc:text-xs sc:text-popover-foreground sc:shadow-md sc:animate-in sc:fade-in-0 sc:zoom-in-95 sc:font-caption',\n 'sc:data-[state=closed]:animate-out sc:data-[state=closed]:fade-out-0 sc:data-[state=closed]:zoom-out-95',\n 'sc:data-[side=bottom]:slide-in-from-top-2 sc:data-[side=left]:slide-in-from-right-2 sc:data-[side=right]:slide-in-from-left-2 sc:data-[side=top]:slide-in-from-bottom-2',\n className\n )}\n {...props}\n />\n </TooltipPrimitive.Portal>\n));\nTooltipContent.displayName = TooltipPrimitive.Content.displayName;\n\n// HeroUI-compatible compound component\ninterface TooltipProps {\n children: React.ReactNode;\n delayDuration?: number;\n skipDelayDuration?: number;\n disableHoverableContent?: boolean;\n // HeroUI compatibility props\n delay?: number;\n closeDelay?: number;\n}\n\nconst TooltipBase = ({ children, delayDuration, delay, ...props }: TooltipProps) => (\n <TooltipProvider>\n <TooltipRoot delayDuration={delay ?? delayDuration ?? 200} {...props}>\n {children}\n </TooltipRoot>\n </TooltipProvider>\n);\n\n// HeroUI-compatible compound component with .Trigger and .Content\nconst Tooltip = Object.assign(TooltipBase, {\n Trigger: TooltipTrigger,\n Content: TooltipContent,\n});\n\nexport { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider, TooltipRoot };\n","import { type ClassValue, clsx } from 'clsx';\nimport { extendTailwindMerge } from 'tailwind-merge';\n\n// The canvas package compiles its Tailwind with prefix(sc) (see\n// src/components/embed/embed.css), so every utility is written `sc:*`.\n// tailwind-merge must know about the prefix or conflicting utilities\n// (e.g. `sc:px-2` vs `sc:px-4`) would never be deduped.\nconst twMerge = extendTailwindMerge({ prefix: 'sc' });\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","/**\n * NormalizedIcon - Renders icons with visual size normalization across icon sets\n *\n * Different icon sets have different visual weight at the same CSS size.\n * This component applies per-set scaling factors to achieve visual consistency.\n *\n * @example\n * // Standard sizes\n * <NormalizedIcon icon=\"lucide:crop\" size=\"md\" />\n * <NormalizedIcon icon=\"gravity-ui:sparkles\" size=\"lg\" />\n *\n * @example\n * // Responsive toolbar size (24px mobile, 20px desktop)\n * <NormalizedIcon icon=\"gravity-ui:bold\" size=\"toolbar\" />\n *\n * @example\n * // With additional className\n * <NormalizedIcon icon=\"lucide:trash\" size=\"md\" className=\"text-danger\" />\n */\n\nimport React from 'react';\nimport { Icon } from '@iconify/react';\nimport { cn } from '../../lib/utils';\n\nexport interface NormalizedIconProps {\n /** Iconify icon string (e.g., \"lucide:crop\" or \"gravity-ui:bold\") */\n icon: string;\n /** Size preset - 'toolbar' is responsive (24px mobile, 20px desktop) */\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl' | 'toolbar';\n /** Additional CSS classes (e.g., for color) */\n className?: string;\n}\n\n/**\n * Scaling factors per icon set to achieve visual consistency.\n *\n * These values compensate for differences in stroke width and viewbox padding\n * across icon sets. Lucide (1.0) is the reference.\n *\n * Rationale:\n * - gravity-ui: Thinner strokes, needs +15% to match visual weight\n * - lucide: Reference set, no adjustment needed\n * - hugeicons: Similar visual weight to lucide\n * - mdi: Slightly bolder strokes, reduce by 5%\n * - fa6-solid: Solid fill is visually heavy, reduce by 20%\n */\nconst SET_SCALE_FACTORS: Record<string, number> = {\n 'gravity-ui': 1.2, // Thinner strokes need +20% (20px → 24px)\n lucide: 1.0, // Reference\n hugeicons: 1.05, // Slightly thin\n mdi: 0.95, // Slightly bolder\n 'fa6-solid': 0.7, // Solid fill is very heavy, reduce 30%\n heroicons: 1.0,\n ph: 1.0,\n 'radix-icons': 1.0,\n 'material-symbols': 0.9, // Filled variants are heavy\n 'simple-icons': 0.95,\n 'eos-icons': 1.0,\n};\n\n/** Default scale factor for unknown icon sets */\nconst DEFAULT_SCALE_FACTOR = 1.0;\n\n/**\n * Per-icon offset corrections for centering.\n * Some icons have asymmetric viewbox padding and need manual offset.\n * Values are in pixels at base size, scaled proportionally.\n */\nconst ICON_OFFSETS: Record<string, { x: number; y: number }> = {\n 'gravity-ui:arrow-rotate-left': { x: 4, y: 4 },\n 'gravity-ui:arrow-rotate-right': { x: -4, y: 4 },\n 'gravity-ui:sparkles': { x: 2, y: -2 },\n};\n\n/**\n * Base pixel sizes for each preset.\n * 'toolbar' is special - it has mobile and desktop values.\n */\nconst SIZE_PRESETS: Record<string, number | { mobile: number; desktop: number }> = {\n xs: 12,\n sm: 16,\n md: 20,\n lg: 24,\n xl: 32,\n toolbar: { mobile: 24, desktop: 20 },\n};\n\n/**\n * Extract the icon set prefix from an icon string.\n * @example getIconSet(\"gravity-ui:plus\") => \"gravity-ui\"\n * @example getIconSet(\"lucide:crop\") => \"lucide\"\n */\nfunction getIconSet(icon: string): string {\n const colonIndex = icon.indexOf(':');\n if (colonIndex === -1) return '';\n return icon.substring(0, colonIndex);\n}\n\n/**\n * Get the scale factor for an icon set.\n */\nfunction getScaleFactor(iconSet: string): number {\n return SET_SCALE_FACTORS[iconSet] ?? DEFAULT_SCALE_FACTOR;\n}\n\n/**\n * Get the offset correction for a specific icon.\n */\nfunction getIconOffset(icon: string): { x: number; y: number } | null {\n return ICON_OFFSETS[icon] ?? null;\n}\n\n/**\n * Calculate the normalized pixel size for an icon.\n */\nfunction getNormalizedSize(\n baseSize: number,\n iconSet: string\n): number {\n const scaleFactor = getScaleFactor(iconSet);\n return Math.round(baseSize * scaleFactor);\n}\n\nexport const NormalizedIcon: React.FC<NormalizedIconProps> = ({\n icon,\n size = 'md',\n className,\n}) => {\n const iconSet = getIconSet(icon);\n const sizePreset = SIZE_PRESETS[size];\n const offset = getIconOffset(icon);\n\n // Handle responsive 'toolbar' size with CSS custom properties\n if (typeof sizePreset === 'object') {\n const mobileSize = getNormalizedSize(sizePreset.mobile, iconSet);\n const desktopSize = getNormalizedSize(sizePreset.desktop, iconSet);\n // Scale offset proportionally to size (base is 20px)\n const scaledOffset = offset ? {\n x: (offset.x * mobileSize) / 20,\n y: (offset.y * mobileSize) / 20,\n } : null;\n\n return (\n <span\n className={cn('sc-normalized-icon-responsive sc:inline-flex', className)}\n style={{\n '--icon-size-mobile': `${mobileSize}px`,\n '--icon-size-desktop': `${desktopSize}px`,\n width: `${mobileSize}px`,\n height: `${mobileSize}px`,\n } as React.CSSProperties}\n >\n <Icon\n icon={icon}\n width=\"100%\"\n height=\"100%\"\n style={scaledOffset ? { transform: `translate(${scaledOffset.x}px, ${scaledOffset.y}px)` } : undefined}\n />\n </span>\n );\n }\n\n // Static size - use wrapper span with inline style (Iconify CSS classes don't work with dynamic values)\n const normalizedSize = getNormalizedSize(sizePreset, iconSet);\n // Scale offset proportionally to size (base is 20px)\n const scaledOffset = offset ? {\n x: (offset.x * normalizedSize) / 20,\n y: (offset.y * normalizedSize) / 20,\n } : null;\n\n return (\n <span\n className={cn('sc:inline-flex', className)}\n style={{ width: `${normalizedSize}px`, height: `${normalizedSize}px` }}\n >\n <Icon\n icon={icon}\n width=\"100%\"\n height=\"100%\"\n style={scaledOffset ? { transform: `translate(${scaledOffset.x}px, ${scaledOffset.y}px)` } : undefined}\n />\n </span>\n );\n};\n\nNormalizedIcon.displayName = 'NormalizedIcon';\n\n// Export utilities for advanced use cases\nexport { getIconSet, getScaleFactor, getIconOffset, getNormalizedSize, SET_SCALE_FACTORS, SIZE_PRESETS, ICON_OFFSETS };\n","/**\n * ToolbarButton - Consistent button for contextual toolbars\n *\n * Features:\n * - Responsive sizing via CSS (44px/24px mobile, 36px/20px desktop)\n * - Theme-aware active state (uses --primary color)\n * - Optional built-in Tooltip\n * - Extends Shadcn Button with toolbar presets\n *\n * @example\n * // Simple icon button\n * <ToolbarButton icon=\"lucide:crop\" onClick={handleCrop} tooltip=\"Crop\" />\n *\n * @example\n * // Toggle button with active state\n * <ToolbarButton\n * icon=\"gravity-ui:bold\"\n * active={isBold}\n * onClick={toggleBold}\n * tooltip=\"Bold\"\n * />\n */\n\nimport React from 'react';\nimport { Button } from '../../vendor/ui';\nimport { Tooltip, TooltipTrigger, TooltipContent } from './';\nimport { NormalizedIcon } from './normalized-icon';\nimport { cn } from '../../lib/utils';\n\nexport interface ToolbarButtonProps {\n /** Iconify icon string (e.g., \"lucide:crop\" or \"gravity-ui:bold\") or React node for custom icons */\n icon: string | React.ReactNode;\n /** Click handler */\n onClick?: (e: React.MouseEvent<HTMLButtonElement>) => void;\n /** Active/pressed state - applies primary color styling */\n active?: boolean;\n /** Tooltip text (if provided, wraps button in Tooltip) */\n tooltip?: string;\n /** Tooltip delay in ms (default: 300) */\n tooltipDelay?: number;\n /** Temporarily disable the tooltip (useful for preventing tooltip flicker after click) */\n tooltipDisabled?: boolean;\n /** Accessible label */\n 'aria-label'?: string;\n /** Disabled state */\n disabled?: boolean;\n /** Additional CSS classes */\n className?: string;\n /** Optional mouse leave handler (for tooltip management) */\n onMouseLeave?: (e: React.MouseEvent<HTMLButtonElement>) => void;\n}\n\n\nexport const ToolbarButton = React.forwardRef<HTMLButtonElement, ToolbarButtonProps>(\n (\n {\n icon,\n onClick,\n active = false,\n tooltip,\n tooltipDelay = 300,\n tooltipDisabled = false,\n 'aria-label': ariaLabel,\n disabled = false,\n className,\n onMouseLeave,\n },\n ref\n ) => {\n const buttonElement = (\n <Button\n ref={ref}\n variant=\"ghost\"\n size=\"toolbar\"\n onClick={onClick}\n disabled={disabled}\n aria-label={ariaLabel || tooltip}\n aria-pressed={active}\n data-active={active}\n onMouseLeave={onMouseLeave}\n className={cn(className)}\n >\n {typeof icon === 'string' ? <NormalizedIcon icon={icon} size=\"toolbar\" /> : icon}\n </Button>\n );\n\n // No tooltip requested or tooltip is temporarily disabled\n if (!tooltip || tooltipDisabled) {\n return buttonElement;\n }\n\n return (\n <Tooltip delay={tooltipDelay}>\n <TooltipTrigger asChild>{buttonElement}</TooltipTrigger>\n <TooltipContent>{tooltip}</TooltipContent>\n </Tooltip>\n );\n }\n);\n\nToolbarButton.displayName = 'ToolbarButton';\n","/**\n * Icon Constants\n *\n * Centralized icon definitions using lucide (preferred) with custom icons where needed.\n * Import icons from here instead of using iconify strings directly.\n */\n\n// =============================================================================\n// ICON STRINGS (for use with <Icon icon={...} />)\n// =============================================================================\n\nexport const icons = {\n // Navigation/Actions\n plus: 'lucide:plus',\n minus: 'lucide:minus',\n close: 'lucide:x',\n check: 'lucide:check',\n menu: 'lucide:menu',\n moreHorizontal: 'lucide:ellipsis',\n moreVertical: 'lucide:ellipsis-vertical',\n\n // Chevrons\n chevronDown: 'lucide:chevron-down',\n chevronUp: 'lucide:chevron-up',\n chevronLeft: 'lucide:chevron-left',\n chevronRight: 'lucide:chevron-right',\n\n // Objects\n text: 'lucide:type',\n image: 'lucide:image',\n layers: 'lucide:layers',\n shapes: 'lucide:shapes',\n\n // Actions\n trash: 'lucide:trash-2',\n copy: 'lucide:copy',\n pencil: 'lucide:pencil',\n scissors: 'lucide:scissors',\n\n // File operations\n save: 'lucide:save',\n folderOpen: 'lucide:folder-open',\n download: 'lucide:download',\n upload: 'lucide:upload',\n\n // Visibility\n eye: 'lucide:eye',\n eyeOff: 'lucide:eye-off',\n lock: 'lucide:lock',\n lockOpen: 'lucide:lock-open',\n\n // Search/Navigation\n search: 'lucide:search',\n link: 'lucide:link',\n settings: 'lucide:settings',\n\n // Color/Style\n palette: 'lucide:palette',\n\n // Theme\n sun: 'lucide:sun',\n moon: 'lucide:moon',\n\n // Rotate (lucide versions)\n rotateLeft: 'lucide:rotate-ccw',\n rotateRight: 'lucide:rotate-cw',\n rotateCcwSquare: 'lucide:rotate-ccw-square',\n\n // Text formatting\n bold: 'lucide:bold',\n italic: 'lucide:italic',\n underline: 'lucide:underline',\n\n // Alignment\n alignLeft: 'lucide:align-left',\n alignCenter: 'lucide:align-center',\n alignRight: 'lucide:align-right',\n alignJustify: 'lucide:align-justify',\n\n // Media controls\n play: 'lucide:play',\n pause: 'lucide:pause',\n\n // Image toolbar\n crop: 'lucide:crop',\n flipHorizontal: 'lucide:flip-horizontal-2',\n flipVertical: 'lucide:flip-vertical-2',\n blend: 'lucide:blend',\n cornerRadius: 'lucide:square-round-corner',\n\n // Misc\n grip: 'lucide:grip-vertical',\n folder: 'lucide:folder',\n file: 'lucide:file',\n fileText: 'lucide:file-text',\n\n // Layer operations\n layerForward: 'lucide:bring-to-front',\n layerBackward: 'lucide:send-to-back',\n group: 'lucide:group',\n ungroup: 'lucide:ungroup',\n\n // Undo/Redo\n undo: 'lucide:undo-2',\n redo: 'lucide:redo-2',\n\n // Zoom\n zoomIn: 'lucide:zoom-in',\n zoomOut: 'lucide:zoom-out',\n fitScreen: 'lucide:scan',\n maximize: 'lucide:maximize',\n\n // Transform\n move: 'lucide:move',\n resize: 'lucide:maximize-2',\n\n // Export/Share\n share: 'lucide:share',\n externalLink: 'lucide:external-link',\n cloudUpload: 'lucide:cloud-upload',\n\n // Info\n info: 'lucide:info',\n helpCircle: 'lucide:help-circle',\n alertCircle: 'lucide:alert-circle',\n alertTriangle: 'lucide:triangle-alert',\n checkCircle: 'lucide:circle-check',\n\n // Arrows\n arrowLeft: 'lucide:arrow-left',\n arrowRight: 'lucide:arrow-right',\n arrowUp: 'lucide:arrow-up',\n arrowDown: 'lucide:arrow-down',\n\n // Layout\n layout: 'lucide:layout-grid',\n grid: 'lucide:grid-3x3',\n list: 'lucide:list',\n\n // Droplet (color fill)\n droplet: 'lucide:droplet',\n paintBucket: 'lucide:paint-bucket',\n\n // Text specific\n letterSpacing: 'lucide:space',\n lineHeight: 'lucide:arrow-up-down',\n\n // Special purpose\n wand: 'lucide:wand-2',\n rocket: 'lucide:rocket',\n refresh: 'lucide:refresh-cw',\n circle: 'lucide:circle',\n circleFill: 'lucide:circle-dot',\n} as const;\n\n// Type for icon keys\nexport type IconName = keyof typeof icons;\n\n// =============================================================================\n// CUSTOM ICON COMPONENTS (for icons that need viewBox correction)\n// =============================================================================\n\n// Re-export custom icons that need special handling\nexport { RotateLeftIcon, RotateRightIcon, SparklesIcon } from './custom-icons';\n","/**\n * useArtboards - Hook for accessing artboard data and operations\n * Provides simplified interface for managing artboards in embed contexts\n */\n\nimport { useMemo, useCallback } from 'react';\nimport { useEditor } from '../contexts/EditorContext.js';\nimport { createLogger } from '../utils/logger.js';\nimport type { ArtboardElement } from '../core/ArtboardElement.js';\nimport type { ArtboardRole, ClipShape, ArtboardDistressTexture } from '../types/index.js';\n\nconst logger = createLogger('useArtboards');\n\nexport interface ArtboardInfo {\n id: string;\n name: string;\n x: number;\n y: number;\n width: number;\n height: number;\n backgroundColor: string;\n clipShape?: ClipShape;\n isActive: boolean;\n elementCount: number;\n}\n\nexport interface UseArtboardsReturn {\n // All artboards\n artboards: ArtboardElement[];\n\n // Artboard info (simplified for external consumption)\n artboardsInfo: ArtboardInfo[];\n\n // Active artboard\n activeArtboard: ArtboardElement | null;\n activeArtboardId: string | null;\n activeArtboardInfo: ArtboardInfo | null;\n\n // Operations\n createArtboard: (width?: number, height?: number, config?: Partial<{\n name: string;\n x: number;\n y: number;\n backgroundColor: string;\n exportBackground: boolean;\n clipShape: ClipShape;\n role: ArtboardRole;\n }>) => void;\n deleteArtboard: (artboardId: string) => void;\n duplicateArtboard: (artboardId: string) => void;\n renameArtboard: (artboardId: string, newName: string) => void;\n updateArtboard: (artboardId: string, updates: Partial<{\n name: string;\n width: number;\n height: number;\n backgroundColor: string;\n clipShape: ClipShape;\n distressTexture: ArtboardDistressTexture | undefined;\n }>) => void;\n selectArtboard: (artboardId: string) => void;\n reorderArtboards: (fromIndex: number, toIndex: number) => void;\n\n // Count\n count: number;\n}\n\n/**\n * Hook to access artboard data and operations\n * Must be used within EditorProvider\n *\n * @example\n * ```tsx\n * function ArtboardSwitcher() {\n * const { artboardsInfo, selectArtboard, createArtboard } = useArtboards();\n *\n * return (\n * <div>\n * {artboardsInfo.map(ab => (\n * <button\n * key={ab.id}\n * onClick={() => selectArtboard(ab.id)}\n * className={ab.isActive ? 'active' : ''}\n * >\n * {ab.name} ({ab.width}×{ab.height})\n * </button>\n * ))}\n * <button onClick={() => createArtboard(1200, 1200)}>\n * + New Artboard\n * </button>\n * </div>\n * );\n * }\n * ```\n */\nexport const useArtboards = (): UseArtboardsReturn => {\n const {\n artboards,\n artboardManager,\n refreshArtboards,\n setSelectedId,\n setMultiSelection,\n } = useEditor();\n\n const activeArtboardId = artboardManager.getActiveArtboardId();\n const activeArtboard = artboardManager.getActiveArtboard();\n\n // Convert artboards to simplified info objects\n const artboardsInfo = useMemo(() => {\n return artboards.map((artboard) => {\n // Count elements that belong to this artboard using ArtboardManager\n const elementIds = artboardManager.getElementsOnArtboard(artboard.id);\n const elementCount = elementIds.length;\n\n return {\n id: artboard.id,\n name: artboard.name,\n x: artboard.x,\n y: artboard.y,\n width: artboard.width,\n height: artboard.height,\n backgroundColor: artboard.backgroundColor,\n clipShape: artboard.clipShape,\n isActive: artboard.id === activeArtboardId,\n elementCount,\n };\n });\n }, [artboards, artboardManager, activeArtboardId]);\n\n // Active artboard info\n const activeArtboardInfo = useMemo(() => {\n if (!activeArtboard) return null;\n const elementIds = artboardManager.getElementsOnArtboard(activeArtboard.id);\n const elementCount = elementIds.length;\n return {\n id: activeArtboard.id,\n name: activeArtboard.name,\n x: activeArtboard.x,\n y: activeArtboard.y,\n width: activeArtboard.width,\n height: activeArtboard.height,\n backgroundColor: activeArtboard.backgroundColor,\n clipShape: activeArtboard.clipShape,\n isActive: true,\n elementCount,\n };\n }, [activeArtboard, artboardManager]);\n\n // Create new artboard\n const createArtboard = useCallback((\n width = 1200,\n height = 1200,\n config?: Partial<{\n name: string;\n x: number;\n y: number;\n backgroundColor: string;\n exportBackground: boolean;\n clipShape: ClipShape;\n role: ArtboardRole;\n }>\n ) => {\n // Build complete config object\n const artboardConfig = {\n width,\n height,\n ...config,\n };\n\n artboardManager.createArtboard(artboardConfig);\n refreshArtboards();\n }, [artboardManager, refreshArtboards]);\n\n // Delete artboard\n const deleteArtboard = useCallback((artboardId: string) => {\n artboardManager.deleteArtboard(artboardId);\n refreshArtboards();\n }, [artboardManager, refreshArtboards]);\n\n // Duplicate artboard\n const duplicateArtboard = useCallback((artboardId: string) => {\n const artboard = artboards.find(ab => ab.id === artboardId);\n if (!artboard) {\n logger.warn(`[useArtboards] Artboard ${artboardId} not found`);\n return;\n }\n\n // Create new artboard with same properties (including clipShape)\n artboardManager.createArtboard({\n width: artboard.width,\n height: artboard.height,\n name: `${artboard.name} Copy`,\n backgroundColor: artboard.backgroundColor,\n clipShape: artboard.clipShape,\n });\n\n // Note: Elements are not duplicated - only the artboard itself\n // To duplicate elements, use element operations separately\n\n refreshArtboards();\n }, [artboards, artboardManager, refreshArtboards]);\n\n // Rename artboard\n const renameArtboard = useCallback((artboardId: string, newName: string) => {\n const artboard = artboards.find(ab => ab.id === artboardId);\n if (!artboard) {\n logger.warn(`[useArtboards] Artboard ${artboardId} not found`);\n return;\n }\n\n artboard.name = newName;\n refreshArtboards();\n }, [artboards, refreshArtboards]);\n\n // Update artboard properties\n const updateArtboard = useCallback((\n artboardId: string,\n updates: Partial<{\n name: string;\n width: number;\n height: number;\n backgroundColor: string;\n clipShape: ClipShape;\n distressTexture: ArtboardDistressTexture | undefined;\n }>\n ) => {\n const artboard = artboards.find(ab => ab.id === artboardId);\n if (!artboard) {\n logger.warn(`[useArtboards] Artboard ${artboardId} not found`);\n return;\n }\n\n if (updates.name !== undefined) artboard.name = updates.name;\n if (updates.width !== undefined) artboard.width = updates.width;\n if (updates.height !== undefined) artboard.height = updates.height;\n if (updates.backgroundColor !== undefined) artboard.backgroundColor = updates.backgroundColor;\n if (updates.clipShape !== undefined) artboard.clipShape = updates.clipShape;\n if ('distressTexture' in updates) artboard.distressTexture = updates.distressTexture ? { ...updates.distressTexture } : undefined;\n\n refreshArtboards();\n }, [artboards, refreshArtboards]);\n\n // Select artboard - also clears selection to avoid stale element references\n const selectArtboard = useCallback((artboardId: string) => {\n // Clear selection before switching artboards\n // This prevents issues where selected elements from the previous artboard\n // remain visually selected on the new artboard\n setSelectedId(null);\n setMultiSelection([]);\n\n artboardManager.setActiveArtboard(artboardId);\n refreshArtboards();\n }, [artboardManager, refreshArtboards, setSelectedId, setMultiSelection]);\n\n // Reorder artboards\n const reorderArtboards = useCallback((fromIndex: number, toIndex: number) => {\n if (fromIndex === toIndex) return;\n if (fromIndex < 0 || fromIndex >= artboards.length) return;\n if (toIndex < 0 || toIndex >= artboards.length) return;\n\n const reordered = [...artboards];\n const [moved] = reordered.splice(fromIndex, 1);\n reordered.splice(toIndex, 0, moved);\n\n artboardManager.reorderArtboards(fromIndex, toIndex);\n refreshArtboards();\n }, [artboards, artboardManager, refreshArtboards]);\n\n return {\n artboards,\n artboardsInfo,\n activeArtboard,\n activeArtboardId,\n activeArtboardInfo,\n createArtboard,\n deleteArtboard,\n duplicateArtboard,\n renameArtboard,\n updateArtboard,\n selectArtboard,\n reorderArtboards,\n count: artboards.length,\n };\n};\n","import { useMemo, useLayoutEffect, useEffect, useRef, useCallback } from 'react';\n\nfunction useCombinedRefs() {\n for (var _len = arguments.length, refs = new Array(_len), _key = 0; _key < _len; _key++) {\n refs[_key] = arguments[_key];\n }\n\n return useMemo(() => node => {\n refs.forEach(ref => ref(node));\n }, // eslint-disable-next-line react-hooks/exhaustive-deps\n refs);\n}\n\n// https://github.com/facebook/react/blob/master/packages/shared/ExecutionEnvironment.js\nconst canUseDOM = typeof window !== 'undefined' && typeof window.document !== 'undefined' && typeof window.document.createElement !== 'undefined';\n\nfunction isWindow(element) {\n const elementString = Object.prototype.toString.call(element);\n return elementString === '[object Window]' || // In Electron context the Window object serializes to [object global]\n elementString === '[object global]';\n}\n\nfunction isNode(node) {\n return 'nodeType' in node;\n}\n\nfunction getWindow(target) {\n var _target$ownerDocument, _target$ownerDocument2;\n\n if (!target) {\n return window;\n }\n\n if (isWindow(target)) {\n return target;\n }\n\n if (!isNode(target)) {\n return window;\n }\n\n return (_target$ownerDocument = (_target$ownerDocument2 = target.ownerDocument) == null ? void 0 : _target$ownerDocument2.defaultView) != null ? _target$ownerDocument : window;\n}\n\nfunction isDocument(node) {\n const {\n Document\n } = getWindow(node);\n return node instanceof Document;\n}\n\nfunction isHTMLElement(node) {\n if (isWindow(node)) {\n return false;\n }\n\n return node instanceof getWindow(node).HTMLElement;\n}\n\nfunction isSVGElement(node) {\n return node instanceof getWindow(node).SVGElement;\n}\n\nfunction getOwnerDocument(target) {\n if (!target) {\n return document;\n }\n\n if (isWindow(target)) {\n return target.document;\n }\n\n if (!isNode(target)) {\n return document;\n }\n\n if (isDocument(target)) {\n return target;\n }\n\n if (isHTMLElement(target) || isSVGElement(target)) {\n return target.ownerDocument;\n }\n\n return document;\n}\n\n/**\r\n * A hook that resolves to useEffect on the server and useLayoutEffect on the client\r\n * @param callback {function} Callback function that is invoked when the dependencies of the hook change\r\n */\n\nconst useIsomorphicLayoutEffect = canUseDOM ? useLayoutEffect : useEffect;\n\nfunction useEvent(handler) {\n const handlerRef = useRef(handler);\n useIsomorphicLayoutEffect(() => {\n handlerRef.current = handler;\n });\n return useCallback(function () {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n return handlerRef.current == null ? void 0 : handlerRef.current(...args);\n }, []);\n}\n\nfunction useInterval() {\n const intervalRef = useRef(null);\n const set = useCallback((listener, duration) => {\n intervalRef.current = setInterval(listener, duration);\n }, []);\n const clear = useCallback(() => {\n if (intervalRef.current !== null) {\n clearInterval(intervalRef.current);\n intervalRef.current = null;\n }\n }, []);\n return [set, clear];\n}\n\nfunction useLatestValue(value, dependencies) {\n if (dependencies === void 0) {\n dependencies = [value];\n }\n\n const valueRef = useRef(value);\n useIsomorphicLayoutEffect(() => {\n if (valueRef.current !== value) {\n valueRef.current = value;\n }\n }, dependencies);\n return valueRef;\n}\n\nfunction useLazyMemo(callback, dependencies) {\n const valueRef = useRef();\n return useMemo(() => {\n const newValue = callback(valueRef.current);\n valueRef.current = newValue;\n return newValue;\n }, // eslint-disable-next-line react-hooks/exhaustive-deps\n [...dependencies]);\n}\n\nfunction useNodeRef(onChange) {\n const onChangeHandler = useEvent(onChange);\n const node = useRef(null);\n const setNodeRef = useCallback(element => {\n if (element !== node.current) {\n onChangeHandler == null ? void 0 : onChangeHandler(element, node.current);\n }\n\n node.current = element;\n }, //eslint-disable-next-line\n []);\n return [node, setNodeRef];\n}\n\nfunction usePrevious(value) {\n const ref = useRef();\n useEffect(() => {\n ref.current = value;\n }, [value]);\n return ref.current;\n}\n\nlet ids = {};\nfunction useUniqueId(prefix, value) {\n return useMemo(() => {\n if (value) {\n return value;\n }\n\n const id = ids[prefix] == null ? 0 : ids[prefix] + 1;\n ids[prefix] = id;\n return prefix + \"-\" + id;\n }, [prefix, value]);\n}\n\nfunction createAdjustmentFn(modifier) {\n return function (object) {\n for (var _len = arguments.length, adjustments = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n adjustments[_key - 1] = arguments[_key];\n }\n\n return adjustments.reduce((accumulator, adjustment) => {\n const entries = Object.entries(adjustment);\n\n for (const [key, valueAdjustment] of entries) {\n const value = accumulator[key];\n\n if (value != null) {\n accumulator[key] = value + modifier * valueAdjustment;\n }\n }\n\n return accumulator;\n }, { ...object\n });\n };\n}\n\nconst add = /*#__PURE__*/createAdjustmentFn(1);\nconst subtract = /*#__PURE__*/createAdjustmentFn(-1);\n\nfunction hasViewportRelativeCoordinates(event) {\n return 'clientX' in event && 'clientY' in event;\n}\n\nfunction isKeyboardEvent(event) {\n if (!event) {\n return false;\n }\n\n const {\n KeyboardEvent\n } = getWindow(event.target);\n return KeyboardEvent && event instanceof KeyboardEvent;\n}\n\nfunction isTouchEvent(event) {\n if (!event) {\n return false;\n }\n\n const {\n TouchEvent\n } = getWindow(event.target);\n return TouchEvent && event instanceof TouchEvent;\n}\n\n/**\r\n * Returns the normalized x and y coordinates for mouse and touch events.\r\n */\n\nfunction getEventCoordinates(event) {\n if (isTouchEvent(event)) {\n if (event.touches && event.touches.length) {\n const {\n clientX: x,\n clientY: y\n } = event.touches[0];\n return {\n x,\n y\n };\n } else if (event.changedTouches && event.changedTouches.length) {\n const {\n clientX: x,\n clientY: y\n } = event.changedTouches[0];\n return {\n x,\n y\n };\n }\n }\n\n if (hasViewportRelativeCoordinates(event)) {\n return {\n x: event.clientX,\n y: event.clientY\n };\n }\n\n return null;\n}\n\nconst CSS = /*#__PURE__*/Object.freeze({\n Translate: {\n toString(transform) {\n if (!transform) {\n return;\n }\n\n const {\n x,\n y\n } = transform;\n return \"translate3d(\" + (x ? Math.round(x) : 0) + \"px, \" + (y ? Math.round(y) : 0) + \"px, 0)\";\n }\n\n },\n Scale: {\n toString(transform) {\n if (!transform) {\n return;\n }\n\n const {\n scaleX,\n scaleY\n } = transform;\n return \"scaleX(\" + scaleX + \") scaleY(\" + scaleY + \")\";\n }\n\n },\n Transform: {\n toString(transform) {\n if (!transform) {\n return;\n }\n\n return [CSS.Translate.toString(transform), CSS.Scale.toString(transform)].join(' ');\n }\n\n },\n Transition: {\n toString(_ref) {\n let {\n property,\n duration,\n easing\n } = _ref;\n return property + \" \" + duration + \"ms \" + easing;\n }\n\n }\n});\n\nconst SELECTOR = 'a,frame,iframe,input:not([type=hidden]):not(:disabled),select:not(:disabled),textarea:not(:disabled),button:not(:disabled),*[tabindex]';\nfunction findFirstFocusableNode(element) {\n if (element.matches(SELECTOR)) {\n return element;\n }\n\n return element.querySelector(SELECTOR);\n}\n\nexport { CSS, add, canUseDOM, findFirstFocusableNode, getEventCoordinates, getOwnerDocument, getWindow, hasViewportRelativeCoordinates, isDocument, isHTMLElement, isKeyboardEvent, isNode, isSVGElement, isTouchEvent, isWindow, subtract, useCombinedRefs, useEvent, useInterval, useIsomorphicLayoutEffect, useLatestValue, useLazyMemo, useNodeRef, usePrevious, useUniqueId };\n//# sourceMappingURL=utilities.esm.js.map\n","import React, { useState, useCallback } from 'react';\n\nconst hiddenStyles = {\n display: 'none'\n};\nfunction HiddenText(_ref) {\n let {\n id,\n value\n } = _ref;\n return React.createElement(\"div\", {\n id: id,\n style: hiddenStyles\n }, value);\n}\n\nfunction LiveRegion(_ref) {\n let {\n id,\n announcement,\n ariaLiveType = \"assertive\"\n } = _ref;\n // Hide element visually but keep it readable by screen readers\n const visuallyHidden = {\n position: 'fixed',\n top: 0,\n left: 0,\n width: 1,\n height: 1,\n margin: -1,\n border: 0,\n padding: 0,\n overflow: 'hidden',\n clip: 'rect(0 0 0 0)',\n clipPath: 'inset(100%)',\n whiteSpace: 'nowrap'\n };\n return React.createElement(\"div\", {\n id: id,\n style: visuallyHidden,\n role: \"status\",\n \"aria-live\": ariaLiveType,\n \"aria-atomic\": true\n }, announcement);\n}\n\nfunction useAnnouncement() {\n const [announcement, setAnnouncement] = useState('');\n const announce = useCallback(value => {\n if (value != null) {\n setAnnouncement(value);\n }\n }, []);\n return {\n announce,\n announcement\n };\n}\n\nexport { HiddenText, LiveRegion, useAnnouncement };\n//# sourceMappingURL=accessibility.esm.js.map\n","import React, { createContext, useContext, useEffect, useState, useCallback, useMemo, useRef, memo, useReducer, cloneElement, forwardRef } from 'react';\nimport { createPortal, unstable_batchedUpdates } from 'react-dom';\nimport { useUniqueId, getEventCoordinates, getWindow, isDocument, isHTMLElement, isSVGElement, canUseDOM, isWindow, isNode, getOwnerDocument, add, isKeyboardEvent, subtract, useLazyMemo, useInterval, usePrevious, useLatestValue, useEvent, useIsomorphicLayoutEffect, useNodeRef, findFirstFocusableNode, CSS } from '@dnd-kit/utilities';\nimport { useAnnouncement, HiddenText, LiveRegion } from '@dnd-kit/accessibility';\n\nconst DndMonitorContext = /*#__PURE__*/createContext(null);\n\nfunction useDndMonitor(listener) {\n const registerListener = useContext(DndMonitorContext);\n useEffect(() => {\n if (!registerListener) {\n throw new Error('useDndMonitor must be used within a children of <DndContext>');\n }\n\n const unsubscribe = registerListener(listener);\n return unsubscribe;\n }, [listener, registerListener]);\n}\n\nfunction useDndMonitorProvider() {\n const [listeners] = useState(() => new Set());\n const registerListener = useCallback(listener => {\n listeners.add(listener);\n return () => listeners.delete(listener);\n }, [listeners]);\n const dispatch = useCallback(_ref => {\n let {\n type,\n event\n } = _ref;\n listeners.forEach(listener => {\n var _listener$type;\n\n return (_listener$type = listener[type]) == null ? void 0 : _listener$type.call(listener, event);\n });\n }, [listeners]);\n return [dispatch, registerListener];\n}\n\nconst defaultScreenReaderInstructions = {\n draggable: \"\\n To pick up a draggable item, press the space bar.\\n While dragging, use the arrow keys to move the item.\\n Press space again to drop the item in its new position, or press escape to cancel.\\n \"\n};\nconst defaultAnnouncements = {\n onDragStart(_ref) {\n let {\n active\n } = _ref;\n return \"Picked up draggable item \" + active.id + \".\";\n },\n\n onDragOver(_ref2) {\n let {\n active,\n over\n } = _ref2;\n\n if (over) {\n return \"Draggable item \" + active.id + \" was moved over droppable area \" + over.id + \".\";\n }\n\n return \"Draggable item \" + active.id + \" is no longer over a droppable area.\";\n },\n\n onDragEnd(_ref3) {\n let {\n active,\n over\n } = _ref3;\n\n if (over) {\n return \"Draggable item \" + active.id + \" was dropped over droppable area \" + over.id;\n }\n\n return \"Draggable item \" + active.id + \" was dropped.\";\n },\n\n onDragCancel(_ref4) {\n let {\n active\n } = _ref4;\n return \"Dragging was cancelled. Draggable item \" + active.id + \" was dropped.\";\n }\n\n};\n\nfunction Accessibility(_ref) {\n let {\n announcements = defaultAnnouncements,\n container,\n hiddenTextDescribedById,\n screenReaderInstructions = defaultScreenReaderInstructions\n } = _ref;\n const {\n announce,\n announcement\n } = useAnnouncement();\n const liveRegionId = useUniqueId(\"DndLiveRegion\");\n const [mounted, setMounted] = useState(false);\n useEffect(() => {\n setMounted(true);\n }, []);\n useDndMonitor(useMemo(() => ({\n onDragStart(_ref2) {\n let {\n active\n } = _ref2;\n announce(announcements.onDragStart({\n active\n }));\n },\n\n onDragMove(_ref3) {\n let {\n active,\n over\n } = _ref3;\n\n if (announcements.onDragMove) {\n announce(announcements.onDragMove({\n active,\n over\n }));\n }\n },\n\n onDragOver(_ref4) {\n let {\n active,\n over\n } = _ref4;\n announce(announcements.onDragOver({\n active,\n over\n }));\n },\n\n onDragEnd(_ref5) {\n let {\n active,\n over\n } = _ref5;\n announce(announcements.onDragEnd({\n active,\n over\n }));\n },\n\n onDragCancel(_ref6) {\n let {\n active,\n over\n } = _ref6;\n announce(announcements.onDragCancel({\n active,\n over\n }));\n }\n\n }), [announce, announcements]));\n\n if (!mounted) {\n return null;\n }\n\n const markup = React.createElement(React.Fragment, null, React.createElement(HiddenText, {\n id: hiddenTextDescribedById,\n value: screenReaderInstructions.draggable\n }), React.createElement(LiveRegion, {\n id: liveRegionId,\n announcement: announcement\n }));\n return container ? createPortal(markup, container) : markup;\n}\n\nvar Action;\n\n(function (Action) {\n Action[\"DragStart\"] = \"dragStart\";\n Action[\"DragMove\"] = \"dragMove\";\n Action[\"DragEnd\"] = \"dragEnd\";\n Action[\"DragCancel\"] = \"dragCancel\";\n Action[\"DragOver\"] = \"dragOver\";\n Action[\"RegisterDroppable\"] = \"registerDroppable\";\n Action[\"SetDroppableDisabled\"] = \"setDroppableDisabled\";\n Action[\"UnregisterDroppable\"] = \"unregisterDroppable\";\n})(Action || (Action = {}));\n\nfunction noop() {}\n\nfunction useSensor(sensor, options) {\n return useMemo(() => ({\n sensor,\n options: options != null ? options : {}\n }), // eslint-disable-next-line react-hooks/exhaustive-deps\n [sensor, options]);\n}\n\nfunction useSensors() {\n for (var _len = arguments.length, sensors = new Array(_len), _key = 0; _key < _len; _key++) {\n sensors[_key] = arguments[_key];\n }\n\n return useMemo(() => [...sensors].filter(sensor => sensor != null), // eslint-disable-next-line react-hooks/exhaustive-deps\n [...sensors]);\n}\n\nconst defaultCoordinates = /*#__PURE__*/Object.freeze({\n x: 0,\n y: 0\n});\n\n/**\r\n * Returns the distance between two points\r\n */\nfunction distanceBetween(p1, p2) {\n return Math.sqrt(Math.pow(p1.x - p2.x, 2) + Math.pow(p1.y - p2.y, 2));\n}\n\nfunction getRelativeTransformOrigin(event, rect) {\n const eventCoordinates = getEventCoordinates(event);\n\n if (!eventCoordinates) {\n return '0 0';\n }\n\n const transformOrigin = {\n x: (eventCoordinates.x - rect.left) / rect.width * 100,\n y: (eventCoordinates.y - rect.top) / rect.height * 100\n };\n return transformOrigin.x + \"% \" + transformOrigin.y + \"%\";\n}\n\n/**\r\n * Sort collisions from smallest to greatest value\r\n */\nfunction sortCollisionsAsc(_ref, _ref2) {\n let {\n data: {\n value: a\n }\n } = _ref;\n let {\n data: {\n value: b\n }\n } = _ref2;\n return a - b;\n}\n/**\r\n * Sort collisions from greatest to smallest value\r\n */\n\nfunction sortCollisionsDesc(_ref3, _ref4) {\n let {\n data: {\n value: a\n }\n } = _ref3;\n let {\n data: {\n value: b\n }\n } = _ref4;\n return b - a;\n}\n/**\r\n * Returns the coordinates of the corners of a given rectangle:\r\n * [TopLeft {x, y}, TopRight {x, y}, BottomLeft {x, y}, BottomRight {x, y}]\r\n */\n\nfunction cornersOfRectangle(_ref5) {\n let {\n left,\n top,\n height,\n width\n } = _ref5;\n return [{\n x: left,\n y: top\n }, {\n x: left + width,\n y: top\n }, {\n x: left,\n y: top + height\n }, {\n x: left + width,\n y: top + height\n }];\n}\nfunction getFirstCollision(collisions, property) {\n if (!collisions || collisions.length === 0) {\n return null;\n }\n\n const [firstCollision] = collisions;\n return property ? firstCollision[property] : firstCollision;\n}\n\n/**\r\n * Returns the coordinates of the center of a given ClientRect\r\n */\n\nfunction centerOfRectangle(rect, left, top) {\n if (left === void 0) {\n left = rect.left;\n }\n\n if (top === void 0) {\n top = rect.top;\n }\n\n return {\n x: left + rect.width * 0.5,\n y: top + rect.height * 0.5\n };\n}\n/**\r\n * Returns the closest rectangles from an array of rectangles to the center of a given\r\n * rectangle.\r\n */\n\n\nconst closestCenter = _ref => {\n let {\n collisionRect,\n droppableRects,\n droppableContainers\n } = _ref;\n const centerRect = centerOfRectangle(collisionRect, collisionRect.left, collisionRect.top);\n const collisions = [];\n\n for (const droppableContainer of droppableContainers) {\n const {\n id\n } = droppableContainer;\n const rect = droppableRects.get(id);\n\n if (rect) {\n const distBetween = distanceBetween(centerOfRectangle(rect), centerRect);\n collisions.push({\n id,\n data: {\n droppableContainer,\n value: distBetween\n }\n });\n }\n }\n\n return collisions.sort(sortCollisionsAsc);\n};\n\n/**\r\n * Returns the closest rectangles from an array of rectangles to the corners of\r\n * another rectangle.\r\n */\n\nconst closestCorners = _ref => {\n let {\n collisionRect,\n droppableRects,\n droppableContainers\n } = _ref;\n const corners = cornersOfRectangle(collisionRect);\n const collisions = [];\n\n for (const droppableContainer of droppableContainers) {\n const {\n id\n } = droppableContainer;\n const rect = droppableRects.get(id);\n\n if (rect) {\n const rectCorners = cornersOfRectangle(rect);\n const distances = corners.reduce((accumulator, corner, index) => {\n return accumulator + distanceBetween(rectCorners[index], corner);\n }, 0);\n const effectiveDistance = Number((distances / 4).toFixed(4));\n collisions.push({\n id,\n data: {\n droppableContainer,\n value: effectiveDistance\n }\n });\n }\n }\n\n return collisions.sort(sortCollisionsAsc);\n};\n\n/**\r\n * Returns the intersecting rectangle area between two rectangles\r\n */\n\nfunction getIntersectionRatio(entry, target) {\n const top = Math.max(target.top, entry.top);\n const left = Math.max(target.left, entry.left);\n const right = Math.min(target.left + target.width, entry.left + entry.width);\n const bottom = Math.min(target.top + target.height, entry.top + entry.height);\n const width = right - left;\n const height = bottom - top;\n\n if (left < right && top < bottom) {\n const targetArea = target.width * target.height;\n const entryArea = entry.width * entry.height;\n const intersectionArea = width * height;\n const intersectionRatio = intersectionArea / (targetArea + entryArea - intersectionArea);\n return Number(intersectionRatio.toFixed(4));\n } // Rectangles do not overlap, or overlap has an area of zero (edge/corner overlap)\n\n\n return 0;\n}\n/**\r\n * Returns the rectangles that has the greatest intersection area with a given\r\n * rectangle in an array of rectangles.\r\n */\n\nconst rectIntersection = _ref => {\n let {\n collisionRect,\n droppableRects,\n droppableContainers\n } = _ref;\n const collisions = [];\n\n for (const droppableContainer of droppableContainers) {\n const {\n id\n } = droppableContainer;\n const rect = droppableRects.get(id);\n\n if (rect) {\n const intersectionRatio = getIntersectionRatio(rect, collisionRect);\n\n if (intersectionRatio > 0) {\n collisions.push({\n id,\n data: {\n droppableContainer,\n value: intersectionRatio\n }\n });\n }\n }\n }\n\n return collisions.sort(sortCollisionsDesc);\n};\n\n/**\r\n * Check if a given point is contained within a bounding rectangle\r\n */\n\nfunction isPointWithinRect(point, rect) {\n const {\n top,\n left,\n bottom,\n right\n } = rect;\n return top <= point.y && point.y <= bottom && left <= point.x && point.x <= right;\n}\n/**\r\n * Returns the rectangles that the pointer is hovering over\r\n */\n\n\nconst pointerWithin = _ref => {\n let {\n droppableContainers,\n droppableRects,\n pointerCoordinates\n } = _ref;\n\n if (!pointerCoordinates) {\n return [];\n }\n\n const collisions = [];\n\n for (const droppableContainer of droppableContainers) {\n const {\n id\n } = droppableContainer;\n const rect = droppableRects.get(id);\n\n if (rect && isPointWithinRect(pointerCoordinates, rect)) {\n /* There may be more than a single rectangle intersecting\r\n * with the pointer coordinates. In order to sort the\r\n * colliding rectangles, we measure the distance between\r\n * the pointer and the corners of the intersecting rectangle\r\n */\n const corners = cornersOfRectangle(rect);\n const distances = corners.reduce((accumulator, corner) => {\n return accumulator + distanceBetween(pointerCoordinates, corner);\n }, 0);\n const effectiveDistance = Number((distances / 4).toFixed(4));\n collisions.push({\n id,\n data: {\n droppableContainer,\n value: effectiveDistance\n }\n });\n }\n }\n\n return collisions.sort(sortCollisionsAsc);\n};\n\nfunction adjustScale(transform, rect1, rect2) {\n return { ...transform,\n scaleX: rect1 && rect2 ? rect1.width / rect2.width : 1,\n scaleY: rect1 && rect2 ? rect1.height / rect2.height : 1\n };\n}\n\nfunction getRectDelta(rect1, rect2) {\n return rect1 && rect2 ? {\n x: rect1.left - rect2.left,\n y: rect1.top - rect2.top\n } : defaultCoordinates;\n}\n\nfunction createRectAdjustmentFn(modifier) {\n return function adjustClientRect(rect) {\n for (var _len = arguments.length, adjustments = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n adjustments[_key - 1] = arguments[_key];\n }\n\n return adjustments.reduce((acc, adjustment) => ({ ...acc,\n top: acc.top + modifier * adjustment.y,\n bottom: acc.bottom + modifier * adjustment.y,\n left: acc.left + modifier * adjustment.x,\n right: acc.right + modifier * adjustment.x\n }), { ...rect\n });\n };\n}\nconst getAdjustedRect = /*#__PURE__*/createRectAdjustmentFn(1);\n\nfunction parseTransform(transform) {\n if (transform.startsWith('matrix3d(')) {\n const transformArray = transform.slice(9, -1).split(/, /);\n return {\n x: +transformArray[12],\n y: +transformArray[13],\n scaleX: +transformArray[0],\n scaleY: +transformArray[5]\n };\n } else if (transform.startsWith('matrix(')) {\n const transformArray = transform.slice(7, -1).split(/, /);\n return {\n x: +transformArray[4],\n y: +transformArray[5],\n scaleX: +transformArray[0],\n scaleY: +transformArray[3]\n };\n }\n\n return null;\n}\n\nfunction inverseTransform(rect, transform, transformOrigin) {\n const parsedTransform = parseTransform(transform);\n\n if (!parsedTransform) {\n return rect;\n }\n\n const {\n scaleX,\n scaleY,\n x: translateX,\n y: translateY\n } = parsedTransform;\n const x = rect.left - translateX - (1 - scaleX) * parseFloat(transformOrigin);\n const y = rect.top - translateY - (1 - scaleY) * parseFloat(transformOrigin.slice(transformOrigin.indexOf(' ') + 1));\n const w = scaleX ? rect.width / scaleX : rect.width;\n const h = scaleY ? rect.height / scaleY : rect.height;\n return {\n width: w,\n height: h,\n top: y,\n right: x + w,\n bottom: y + h,\n left: x\n };\n}\n\nconst defaultOptions = {\n ignoreTransform: false\n};\n/**\r\n * Returns the bounding client rect of an element relative to the viewport.\r\n */\n\nfunction getClientRect(element, options) {\n if (options === void 0) {\n options = defaultOptions;\n }\n\n let rect = element.getBoundingClientRect();\n\n if (options.ignoreTransform) {\n const {\n transform,\n transformOrigin\n } = getWindow(element).getComputedStyle(element);\n\n if (transform) {\n rect = inverseTransform(rect, transform, transformOrigin);\n }\n }\n\n const {\n top,\n left,\n width,\n height,\n bottom,\n right\n } = rect;\n return {\n top,\n left,\n width,\n height,\n bottom,\n right\n };\n}\n/**\r\n * Returns the bounding client rect of an element relative to the viewport.\r\n *\r\n * @remarks\r\n * The ClientRect returned by this method does not take into account transforms\r\n * applied to the element it measures.\r\n *\r\n */\n\nfunction getTransformAgnosticClientRect(element) {\n return getClientRect(element, {\n ignoreTransform: true\n });\n}\n\nfunction getWindowClientRect(element) {\n const width = element.innerWidth;\n const height = element.innerHeight;\n return {\n top: 0,\n left: 0,\n right: width,\n bottom: height,\n width,\n height\n };\n}\n\nfunction isFixed(node, computedStyle) {\n if (computedStyle === void 0) {\n computedStyle = getWindow(node).getComputedStyle(node);\n }\n\n return computedStyle.position === 'fixed';\n}\n\nfunction isScrollable(element, computedStyle) {\n if (computedStyle === void 0) {\n computedStyle = getWindow(element).getComputedStyle(element);\n }\n\n const overflowRegex = /(auto|scroll|overlay)/;\n const properties = ['overflow', 'overflowX', 'overflowY'];\n return properties.some(property => {\n const value = computedStyle[property];\n return typeof value === 'string' ? overflowRegex.test(value) : false;\n });\n}\n\nfunction getScrollableAncestors(element, limit) {\n const scrollParents = [];\n\n function findScrollableAncestors(node) {\n if (limit != null && scrollParents.length >= limit) {\n return scrollParents;\n }\n\n if (!node) {\n return scrollParents;\n }\n\n if (isDocument(node) && node.scrollingElement != null && !scrollParents.includes(node.scrollingElement)) {\n scrollParents.push(node.scrollingElement);\n return scrollParents;\n }\n\n if (!isHTMLElement(node) || isSVGElement(node)) {\n return scrollParents;\n }\n\n if (scrollParents.includes(node)) {\n return scrollParents;\n }\n\n const computedStyle = getWindow(element).getComputedStyle(node);\n\n if (node !== element) {\n if (isScrollable(node, computedStyle)) {\n scrollParents.push(node);\n }\n }\n\n if (isFixed(node, computedStyle)) {\n return scrollParents;\n }\n\n return findScrollableAncestors(node.parentNode);\n }\n\n if (!element) {\n return scrollParents;\n }\n\n return findScrollableAncestors(element);\n}\nfunction getFirstScrollableAncestor(node) {\n const [firstScrollableAncestor] = getScrollableAncestors(node, 1);\n return firstScrollableAncestor != null ? firstScrollableAncestor : null;\n}\n\nfunction getScrollableElement(element) {\n if (!canUseDOM || !element) {\n return null;\n }\n\n if (isWindow(element)) {\n return element;\n }\n\n if (!isNode(element)) {\n return null;\n }\n\n if (isDocument(element) || element === getOwnerDocument(element).scrollingElement) {\n return window;\n }\n\n if (isHTMLElement(element)) {\n return element;\n }\n\n return null;\n}\n\nfunction getScrollXCoordinate(element) {\n if (isWindow(element)) {\n return element.scrollX;\n }\n\n return element.scrollLeft;\n}\nfunction getScrollYCoordinate(element) {\n if (isWindow(element)) {\n return element.scrollY;\n }\n\n return element.scrollTop;\n}\nfunction getScrollCoordinates(element) {\n return {\n x: getScrollXCoordinate(element),\n y: getScrollYCoordinate(element)\n };\n}\n\nvar Direction;\n\n(function (Direction) {\n Direction[Direction[\"Forward\"] = 1] = \"Forward\";\n Direction[Direction[\"Backward\"] = -1] = \"Backward\";\n})(Direction || (Direction = {}));\n\nfunction isDocumentScrollingElement(element) {\n if (!canUseDOM || !element) {\n return false;\n }\n\n return element === document.scrollingElement;\n}\n\nfunction getScrollPosition(scrollingContainer) {\n const minScroll = {\n x: 0,\n y: 0\n };\n const dimensions = isDocumentScrollingElement(scrollingContainer) ? {\n height: window.innerHeight,\n width: window.innerWidth\n } : {\n height: scrollingContainer.clientHeight,\n width: scrollingContainer.clientWidth\n };\n const maxScroll = {\n x: scrollingContainer.scrollWidth - dimensions.width,\n y: scrollingContainer.scrollHeight - dimensions.height\n };\n const isTop = scrollingContainer.scrollTop <= minScroll.y;\n const isLeft = scrollingContainer.scrollLeft <= minScroll.x;\n const isBottom = scrollingContainer.scrollTop >= maxScroll.y;\n const isRight = scrollingContainer.scrollLeft >= maxScroll.x;\n return {\n isTop,\n isLeft,\n isBottom,\n isRight,\n maxScroll,\n minScroll\n };\n}\n\nconst defaultThreshold = {\n x: 0.2,\n y: 0.2\n};\nfunction getScrollDirectionAndSpeed(scrollContainer, scrollContainerRect, _ref, acceleration, thresholdPercentage) {\n let {\n top,\n left,\n right,\n bottom\n } = _ref;\n\n if (acceleration === void 0) {\n acceleration = 10;\n }\n\n if (thresholdPercentage === void 0) {\n thresholdPercentage = defaultThreshold;\n }\n\n const {\n isTop,\n isBottom,\n isLeft,\n isRight\n } = getScrollPosition(scrollContainer);\n const direction = {\n x: 0,\n y: 0\n };\n const speed = {\n x: 0,\n y: 0\n };\n const threshold = {\n height: scrollContainerRect.height * thresholdPercentage.y,\n width: scrollContainerRect.width * thresholdPercentage.x\n };\n\n if (!isTop && top <= scrollContainerRect.top + threshold.height) {\n // Scroll Up\n direction.y = Direction.Backward;\n speed.y = acceleration * Math.abs((scrollContainerRect.top + threshold.height - top) / threshold.height);\n } else if (!isBottom && bottom >= scrollContainerRect.bottom - threshold.height) {\n // Scroll Down\n direction.y = Direction.Forward;\n speed.y = acceleration * Math.abs((scrollContainerRect.bottom - threshold.height - bottom) / threshold.height);\n }\n\n if (!isRight && right >= scrollContainerRect.right - threshold.width) {\n // Scroll Right\n direction.x = Direction.Forward;\n speed.x = acceleration * Math.abs((scrollContainerRect.right - threshold.width - right) / threshold.width);\n } else if (!isLeft && left <= scrollContainerRect.left + threshold.width) {\n // Scroll Left\n direction.x = Direction.Backward;\n speed.x = acceleration * Math.abs((scrollContainerRect.left + threshold.width - left) / threshold.width);\n }\n\n return {\n direction,\n speed\n };\n}\n\nfunction getScrollElementRect(element) {\n if (element === document.scrollingElement) {\n const {\n innerWidth,\n innerHeight\n } = window;\n return {\n top: 0,\n left: 0,\n right: innerWidth,\n bottom: innerHeight,\n width: innerWidth,\n height: innerHeight\n };\n }\n\n const {\n top,\n left,\n right,\n bottom\n } = element.getBoundingClientRect();\n return {\n top,\n left,\n right,\n bottom,\n width: element.clientWidth,\n height: element.clientHeight\n };\n}\n\nfunction getScrollOffsets(scrollableAncestors) {\n return scrollableAncestors.reduce((acc, node) => {\n return add(acc, getScrollCoordinates(node));\n }, defaultCoordinates);\n}\nfunction getScrollXOffset(scrollableAncestors) {\n return scrollableAncestors.reduce((acc, node) => {\n return acc + getScrollXCoordinate(node);\n }, 0);\n}\nfunction getScrollYOffset(scrollableAncestors) {\n return scrollableAncestors.reduce((acc, node) => {\n return acc + getScrollYCoordinate(node);\n }, 0);\n}\n\nfunction scrollIntoViewIfNeeded(element, measure) {\n if (measure === void 0) {\n measure = getClientRect;\n }\n\n if (!element) {\n return;\n }\n\n const {\n top,\n left,\n bottom,\n right\n } = measure(element);\n const firstScrollableAncestor = getFirstScrollableAncestor(element);\n\n if (!firstScrollableAncestor) {\n return;\n }\n\n if (bottom <= 0 || right <= 0 || top >= window.innerHeight || left >= window.innerWidth) {\n element.scrollIntoView({\n block: 'center',\n inline: 'center'\n });\n }\n}\n\nconst properties = [['x', ['left', 'right'], getScrollXOffset], ['y', ['top', 'bottom'], getScrollYOffset]];\nclass Rect {\n constructor(rect, element) {\n this.rect = void 0;\n this.width = void 0;\n this.height = void 0;\n this.top = void 0;\n this.bottom = void 0;\n this.right = void 0;\n this.left = void 0;\n const scrollableAncestors = getScrollableAncestors(element);\n const scrollOffsets = getScrollOffsets(scrollableAncestors);\n this.rect = { ...rect\n };\n this.width = rect.width;\n this.height = rect.height;\n\n for (const [axis, keys, getScrollOffset] of properties) {\n for (const key of keys) {\n Object.defineProperty(this, key, {\n get: () => {\n const currentOffsets = getScrollOffset(scrollableAncestors);\n const scrollOffsetsDeltla = scrollOffsets[axis] - currentOffsets;\n return this.rect[key] + scrollOffsetsDeltla;\n },\n enumerable: true\n });\n }\n }\n\n Object.defineProperty(this, 'rect', {\n enumerable: false\n });\n }\n\n}\n\nclass Listeners {\n constructor(target) {\n this.target = void 0;\n this.listeners = [];\n\n this.removeAll = () => {\n this.listeners.forEach(listener => {\n var _this$target;\n\n return (_this$target = this.target) == null ? void 0 : _this$target.removeEventListener(...listener);\n });\n };\n\n this.target = target;\n }\n\n add(eventName, handler, options) {\n var _this$target2;\n\n (_this$target2 = this.target) == null ? void 0 : _this$target2.addEventListener(eventName, handler, options);\n this.listeners.push([eventName, handler, options]);\n }\n\n}\n\nfunction getEventListenerTarget(target) {\n // If the `event.target` element is removed from the document events will still be targeted\n // at it, and hence won't always bubble up to the window or document anymore.\n // If there is any risk of an element being removed while it is being dragged,\n // the best practice is to attach the event listeners directly to the target.\n // https://developer.mozilla.org/en-US/docs/Web/API/EventTarget\n const {\n EventTarget\n } = getWindow(target);\n return target instanceof EventTarget ? target : getOwnerDocument(target);\n}\n\nfunction hasExceededDistance(delta, measurement) {\n const dx = Math.abs(delta.x);\n const dy = Math.abs(delta.y);\n\n if (typeof measurement === 'number') {\n return Math.sqrt(dx ** 2 + dy ** 2) > measurement;\n }\n\n if ('x' in measurement && 'y' in measurement) {\n return dx > measurement.x && dy > measurement.y;\n }\n\n if ('x' in measurement) {\n return dx > measurement.x;\n }\n\n if ('y' in measurement) {\n return dy > measurement.y;\n }\n\n return false;\n}\n\nvar EventName;\n\n(function (EventName) {\n EventName[\"Click\"] = \"click\";\n EventName[\"DragStart\"] = \"dragstart\";\n EventName[\"Keydown\"] = \"keydown\";\n EventName[\"ContextMenu\"] = \"contextmenu\";\n EventName[\"Resize\"] = \"resize\";\n EventName[\"SelectionChange\"] = \"selectionchange\";\n EventName[\"VisibilityChange\"] = \"visibilitychange\";\n})(EventName || (EventName = {}));\n\nfunction preventDefault(event) {\n event.preventDefault();\n}\nfunction stopPropagation(event) {\n event.stopPropagation();\n}\n\nvar KeyboardCode;\n\n(function (KeyboardCode) {\n KeyboardCode[\"Space\"] = \"Space\";\n KeyboardCode[\"Down\"] = \"ArrowDown\";\n KeyboardCode[\"Right\"] = \"ArrowRight\";\n KeyboardCode[\"Left\"] = \"ArrowLeft\";\n KeyboardCode[\"Up\"] = \"ArrowUp\";\n KeyboardCode[\"Esc\"] = \"Escape\";\n KeyboardCode[\"Enter\"] = \"Enter\";\n KeyboardCode[\"Tab\"] = \"Tab\";\n})(KeyboardCode || (KeyboardCode = {}));\n\nconst defaultKeyboardCodes = {\n start: [KeyboardCode.Space, KeyboardCode.Enter],\n cancel: [KeyboardCode.Esc],\n end: [KeyboardCode.Space, KeyboardCode.Enter, KeyboardCode.Tab]\n};\nconst defaultKeyboardCoordinateGetter = (event, _ref) => {\n let {\n currentCoordinates\n } = _ref;\n\n switch (event.code) {\n case KeyboardCode.Right:\n return { ...currentCoordinates,\n x: currentCoordinates.x + 25\n };\n\n case KeyboardCode.Left:\n return { ...currentCoordinates,\n x: currentCoordinates.x - 25\n };\n\n case KeyboardCode.Down:\n return { ...currentCoordinates,\n y: currentCoordinates.y + 25\n };\n\n case KeyboardCode.Up:\n return { ...currentCoordinates,\n y: currentCoordinates.y - 25\n };\n }\n\n return undefined;\n};\n\nclass KeyboardSensor {\n constructor(props) {\n this.props = void 0;\n this.autoScrollEnabled = false;\n this.referenceCoordinates = void 0;\n this.listeners = void 0;\n this.windowListeners = void 0;\n this.props = props;\n const {\n event: {\n target\n }\n } = props;\n this.props = props;\n this.listeners = new Listeners(getOwnerDocument(target));\n this.windowListeners = new Listeners(getWindow(target));\n this.handleKeyDown = this.handleKeyDown.bind(this);\n this.handleCancel = this.handleCancel.bind(this);\n this.attach();\n }\n\n attach() {\n this.handleStart();\n this.windowListeners.add(EventName.Resize, this.handleCancel);\n this.windowListeners.add(EventName.VisibilityChange, this.handleCancel);\n setTimeout(() => this.listeners.add(EventName.Keydown, this.handleKeyDown));\n }\n\n handleStart() {\n const {\n activeNode,\n onStart\n } = this.props;\n const node = activeNode.node.current;\n\n if (node) {\n scrollIntoViewIfNeeded(node);\n }\n\n onStart(defaultCoordinates);\n }\n\n handleKeyDown(event) {\n if (isKeyboardEvent(event)) {\n const {\n active,\n context,\n options\n } = this.props;\n const {\n keyboardCodes = defaultKeyboardCodes,\n coordinateGetter = defaultKeyboardCoordinateGetter,\n scrollBehavior = 'smooth'\n } = options;\n const {\n code\n } = event;\n\n if (keyboardCodes.end.includes(code)) {\n this.handleEnd(event);\n return;\n }\n\n if (keyboardCodes.cancel.includes(code)) {\n this.handleCancel(event);\n return;\n }\n\n const {\n collisionRect\n } = context.current;\n const currentCoordinates = collisionRect ? {\n x: collisionRect.left,\n y: collisionRect.top\n } : defaultCoordinates;\n\n if (!this.referenceCoordinates) {\n this.referenceCoordinates = currentCoordinates;\n }\n\n const newCoordinates = coordinateGetter(event, {\n active,\n context: context.current,\n currentCoordinates\n });\n\n if (newCoordinates) {\n const coordinatesDelta = subtract(newCoordinates, currentCoordinates);\n const scrollDelta = {\n x: 0,\n y: 0\n };\n const {\n scrollableAncestors\n } = context.current;\n\n for (const scrollContainer of scrollableAncestors) {\n const direction = event.code;\n const {\n isTop,\n isRight,\n isLeft,\n isBottom,\n maxScroll,\n minScroll\n } = getScrollPosition(scrollContainer);\n const scrollElementRect = getScrollElementRect(scrollContainer);\n const clampedCoordinates = {\n x: Math.min(direction === KeyboardCode.Right ? scrollElementRect.right - scrollElementRect.width / 2 : scrollElementRect.right, Math.max(direction === KeyboardCode.Right ? scrollElementRect.left : scrollElementRect.left + scrollElementRect.width / 2, newCoordinates.x)),\n y: Math.min(direction === KeyboardCode.Down ? scrollElementRect.bottom - scrollElementRect.height / 2 : scrollElementRect.bottom, Math.max(direction === KeyboardCode.Down ? scrollElementRect.top : scrollElementRect.top + scrollElementRect.height / 2, newCoordinates.y))\n };\n const canScrollX = direction === KeyboardCode.Right && !isRight || direction === KeyboardCode.Left && !isLeft;\n const canScrollY = direction === KeyboardCode.Down && !isBottom || direction === KeyboardCode.Up && !isTop;\n\n if (canScrollX && clampedCoordinates.x !== newCoordinates.x) {\n const newScrollCoordinates = scrollContainer.scrollLeft + coordinatesDelta.x;\n const canScrollToNewCoordinates = direction === KeyboardCode.Right && newScrollCoordinates <= maxScroll.x || direction === KeyboardCode.Left && newScrollCoordinates >= minScroll.x;\n\n if (canScrollToNewCoordinates && !coordinatesDelta.y) {\n // We don't need to update coordinates, the scroll adjustment alone will trigger\n // logic to auto-detect the new container we are over\n scrollContainer.scrollTo({\n left: newScrollCoordinates,\n behavior: scrollBehavior\n });\n return;\n }\n\n if (canScrollToNewCoordinates) {\n scrollDelta.x = scrollContainer.scrollLeft - newScrollCoordinates;\n } else {\n scrollDelta.x = direction === KeyboardCode.Right ? scrollContainer.scrollLeft - maxScroll.x : scrollContainer.scrollLeft - minScroll.x;\n }\n\n if (scrollDelta.x) {\n scrollContainer.scrollBy({\n left: -scrollDelta.x,\n behavior: scrollBehavior\n });\n }\n\n break;\n } else if (canScrollY && clampedCoordinates.y !== newCoordinates.y) {\n const newScrollCoordinates = scrollContainer.scrollTop + coordinatesDelta.y;\n const canScrollToNewCoordinates = direction === KeyboardCode.Down && newScrollCoordinates <= maxScroll.y || direction === KeyboardCode.Up && newScrollCoordinates >= minScroll.y;\n\n if (canScrollToNewCoordinates && !coordinatesDelta.x) {\n // We don't need to update coordinates, the scroll adjustment alone will trigger\n // logic to auto-detect the new container we are over\n scrollContainer.scrollTo({\n top: newScrollCoordinates,\n behavior: scrollBehavior\n });\n return;\n }\n\n if (canScrollToNewCoordinates) {\n scrollDelta.y = scrollContainer.scrollTop - newScrollCoordinates;\n } else {\n scrollDelta.y = direction === KeyboardCode.Down ? scrollContainer.scrollTop - maxScroll.y : scrollContainer.scrollTop - minScroll.y;\n }\n\n if (scrollDelta.y) {\n scrollContainer.scrollBy({\n top: -scrollDelta.y,\n behavior: scrollBehavior\n });\n }\n\n break;\n }\n }\n\n this.handleMove(event, add(subtract(newCoordinates, this.referenceCoordinates), scrollDelta));\n }\n }\n }\n\n handleMove(event, coordinates) {\n const {\n onMove\n } = this.props;\n event.preventDefault();\n onMove(coordinates);\n }\n\n handleEnd(event) {\n const {\n onEnd\n } = this.props;\n event.preventDefault();\n this.detach();\n onEnd();\n }\n\n handleCancel(event) {\n const {\n onCancel\n } = this.props;\n event.preventDefault();\n this.detach();\n onCancel();\n }\n\n detach() {\n this.listeners.removeAll();\n this.windowListeners.removeAll();\n }\n\n}\nKeyboardSensor.activators = [{\n eventName: 'onKeyDown',\n handler: (event, _ref, _ref2) => {\n let {\n keyboardCodes = defaultKeyboardCodes,\n onActivation\n } = _ref;\n let {\n active\n } = _ref2;\n const {\n code\n } = event.nativeEvent;\n\n if (keyboardCodes.start.includes(code)) {\n const activator = active.activatorNode.current;\n\n if (activator && event.target !== activator) {\n return false;\n }\n\n event.preventDefault();\n onActivation == null ? void 0 : onActivation({\n event: event.nativeEvent\n });\n return true;\n }\n\n return false;\n }\n}];\n\nfunction isDistanceConstraint(constraint) {\n return Boolean(constraint && 'distance' in constraint);\n}\n\nfunction isDelayConstraint(constraint) {\n return Boolean(constraint && 'delay' in constraint);\n}\n\nclass AbstractPointerSensor {\n constructor(props, events, listenerTarget) {\n var _getEventCoordinates;\n\n if (listenerTarget === void 0) {\n listenerTarget = getEventListenerTarget(props.event.target);\n }\n\n this.props = void 0;\n this.events = void 0;\n this.autoScrollEnabled = true;\n this.document = void 0;\n this.activated = false;\n this.initialCoordinates = void 0;\n this.timeoutId = null;\n this.listeners = void 0;\n this.documentListeners = void 0;\n this.windowListeners = void 0;\n this.props = props;\n this.events = events;\n const {\n event\n } = props;\n const {\n target\n } = event;\n this.props = props;\n this.events = events;\n this.document = getOwnerDocument(target);\n this.documentListeners = new Listeners(this.document);\n this.listeners = new Listeners(listenerTarget);\n this.windowListeners = new Listeners(getWindow(target));\n this.initialCoordinates = (_getEventCoordinates = getEventCoordinates(event)) != null ? _getEventCoordinates : defaultCoordinates;\n this.handleStart = this.handleStart.bind(this);\n this.handleMove = this.handleMove.bind(this);\n this.handleEnd = this.handleEnd.bind(this);\n this.handleCancel = this.handleCancel.bind(this);\n this.handleKeydown = this.handleKeydown.bind(this);\n this.removeTextSelection = this.removeTextSelection.bind(this);\n this.attach();\n }\n\n attach() {\n const {\n events,\n props: {\n options: {\n activationConstraint,\n bypassActivationConstraint\n }\n }\n } = this;\n this.listeners.add(events.move.name, this.handleMove, {\n passive: false\n });\n this.listeners.add(events.end.name, this.handleEnd);\n\n if (events.cancel) {\n this.listeners.add(events.cancel.name, this.handleCancel);\n }\n\n this.windowListeners.add(EventName.Resize, this.handleCancel);\n this.windowListeners.add(EventName.DragStart, preventDefault);\n this.windowListeners.add(EventName.VisibilityChange, this.handleCancel);\n this.windowListeners.add(EventName.ContextMenu, preventDefault);\n this.documentListeners.add(EventName.Keydown, this.handleKeydown);\n\n if (activationConstraint) {\n if (bypassActivationConstraint != null && bypassActivationConstraint({\n event: this.props.event,\n activeNode: this.props.activeNode,\n options: this.props.options\n })) {\n return this.handleStart();\n }\n\n if (isDelayConstraint(activationConstraint)) {\n this.timeoutId = setTimeout(this.handleStart, activationConstraint.delay);\n this.handlePending(activationConstraint);\n return;\n }\n\n if (isDistanceConstraint(activationConstraint)) {\n this.handlePending(activationConstraint);\n return;\n }\n }\n\n this.handleStart();\n }\n\n detach() {\n this.listeners.removeAll();\n this.windowListeners.removeAll(); // Wait until the next event loop before removing document listeners\n // This is necessary because we listen for `click` and `selection` events on the document\n\n setTimeout(this.documentListeners.removeAll, 50);\n\n if (this.timeoutId !== null) {\n clearTimeout(this.timeoutId);\n this.timeoutId = null;\n }\n }\n\n handlePending(constraint, offset) {\n const {\n active,\n onPending\n } = this.props;\n onPending(active, constraint, this.initialCoordinates, offset);\n }\n\n handleStart() {\n const {\n initialCoordinates\n } = this;\n const {\n onStart\n } = this.props;\n\n if (initialCoordinates) {\n this.activated = true; // Stop propagation of click events once activation constraints are met\n\n this.documentListeners.add(EventName.Click, stopPropagation, {\n capture: true\n }); // Remove any text selection from the document\n\n this.removeTextSelection(); // Prevent further text selection while dragging\n\n this.documentListeners.add(EventName.SelectionChange, this.removeTextSelection);\n onStart(initialCoordinates);\n }\n }\n\n handleMove(event) {\n var _getEventCoordinates2;\n\n const {\n activated,\n initialCoordinates,\n props\n } = this;\n const {\n onMove,\n options: {\n activationConstraint\n }\n } = props;\n\n if (!initialCoordinates) {\n return;\n }\n\n const coordinates = (_getEventCoordinates2 = getEventCoordinates(event)) != null ? _getEventCoordinates2 : defaultCoordinates;\n const delta = subtract(initialCoordinates, coordinates); // Constraint validation\n\n if (!activated && activationConstraint) {\n if (isDistanceConstraint(activationConstraint)) {\n if (activationConstraint.tolerance != null && hasExceededDistance(delta, activationConstraint.tolerance)) {\n return this.handleCancel();\n }\n\n if (hasExceededDistance(delta, activationConstraint.distance)) {\n return this.handleStart();\n }\n }\n\n if (isDelayConstraint(activationConstraint)) {\n if (hasExceededDistance(delta, activationConstraint.tolerance)) {\n return this.handleCancel();\n }\n }\n\n this.handlePending(activationConstraint, delta);\n return;\n }\n\n if (event.cancelable) {\n event.preventDefault();\n }\n\n onMove(coordinates);\n }\n\n handleEnd() {\n const {\n onAbort,\n onEnd\n } = this.props;\n this.detach();\n\n if (!this.activated) {\n onAbort(this.props.active);\n }\n\n onEnd();\n }\n\n handleCancel() {\n const {\n onAbort,\n onCancel\n } = this.props;\n this.detach();\n\n if (!this.activated) {\n onAbort(this.props.active);\n }\n\n onCancel();\n }\n\n handleKeydown(event) {\n if (event.code === KeyboardCode.Esc) {\n this.handleCancel();\n }\n }\n\n removeTextSelection() {\n var _this$document$getSel;\n\n (_this$document$getSel = this.document.getSelection()) == null ? void 0 : _this$document$getSel.removeAllRanges();\n }\n\n}\n\nconst events = {\n cancel: {\n name: 'pointercancel'\n },\n move: {\n name: 'pointermove'\n },\n end: {\n name: 'pointerup'\n }\n};\nclass PointerSensor extends AbstractPointerSensor {\n constructor(props) {\n const {\n event\n } = props; // Pointer events stop firing if the target is unmounted while dragging\n // Therefore we attach listeners to the owner document instead\n\n const listenerTarget = getOwnerDocument(event.target);\n super(props, events, listenerTarget);\n }\n\n}\nPointerSensor.activators = [{\n eventName: 'onPointerDown',\n handler: (_ref, _ref2) => {\n let {\n nativeEvent: event\n } = _ref;\n let {\n onActivation\n } = _ref2;\n\n if (!event.isPrimary || event.button !== 0) {\n return false;\n }\n\n onActivation == null ? void 0 : onActivation({\n event\n });\n return true;\n }\n}];\n\nconst events$1 = {\n move: {\n name: 'mousemove'\n },\n end: {\n name: 'mouseup'\n }\n};\nvar MouseButton;\n\n(function (MouseButton) {\n MouseButton[MouseButton[\"RightClick\"] = 2] = \"RightClick\";\n})(MouseButton || (MouseButton = {}));\n\nclass MouseSensor extends AbstractPointerSensor {\n constructor(props) {\n super(props, events$1, getOwnerDocument(props.event.target));\n }\n\n}\nMouseSensor.activators = [{\n eventName: 'onMouseDown',\n handler: (_ref, _ref2) => {\n let {\n nativeEvent: event\n } = _ref;\n let {\n onActivation\n } = _ref2;\n\n if (event.button === MouseButton.RightClick) {\n return false;\n }\n\n onActivation == null ? void 0 : onActivation({\n event\n });\n return true;\n }\n}];\n\nconst events$2 = {\n cancel: {\n name: 'touchcancel'\n },\n move: {\n name: 'touchmove'\n },\n end: {\n name: 'touchend'\n }\n};\nclass TouchSensor extends AbstractPointerSensor {\n constructor(props) {\n super(props, events$2);\n }\n\n static setup() {\n // Adding a non-capture and non-passive `touchmove` listener in order\n // to force `event.preventDefault()` calls to work in dynamically added\n // touchmove event handlers. This is required for iOS Safari.\n window.addEventListener(events$2.move.name, noop, {\n capture: false,\n passive: false\n });\n return function teardown() {\n window.removeEventListener(events$2.move.name, noop);\n }; // We create a new handler because the teardown function of another sensor\n // could remove our event listener if we use a referentially equal listener.\n\n function noop() {}\n }\n\n}\nTouchSensor.activators = [{\n eventName: 'onTouchStart',\n handler: (_ref, _ref2) => {\n let {\n nativeEvent: event\n } = _ref;\n let {\n onActivation\n } = _ref2;\n const {\n touches\n } = event;\n\n if (touches.length > 1) {\n return false;\n }\n\n onActivation == null ? void 0 : onActivation({\n event\n });\n return true;\n }\n}];\n\nvar AutoScrollActivator;\n\n(function (AutoScrollActivator) {\n AutoScrollActivator[AutoScrollActivator[\"Pointer\"] = 0] = \"Pointer\";\n AutoScrollActivator[AutoScrollActivator[\"DraggableRect\"] = 1] = \"DraggableRect\";\n})(AutoScrollActivator || (AutoScrollActivator = {}));\n\nvar TraversalOrder;\n\n(function (TraversalOrder) {\n TraversalOrder[TraversalOrder[\"TreeOrder\"] = 0] = \"TreeOrder\";\n TraversalOrder[TraversalOrder[\"ReversedTreeOrder\"] = 1] = \"ReversedTreeOrder\";\n})(TraversalOrder || (TraversalOrder = {}));\n\nfunction useAutoScroller(_ref) {\n let {\n acceleration,\n activator = AutoScrollActivator.Pointer,\n canScroll,\n draggingRect,\n enabled,\n interval = 5,\n order = TraversalOrder.TreeOrder,\n pointerCoordinates,\n scrollableAncestors,\n scrollableAncestorRects,\n delta,\n threshold\n } = _ref;\n const scrollIntent = useScrollIntent({\n delta,\n disabled: !enabled\n });\n const [setAutoScrollInterval, clearAutoScrollInterval] = useInterval();\n const scrollSpeed = useRef({\n x: 0,\n y: 0\n });\n const scrollDirection = useRef({\n x: 0,\n y: 0\n });\n const rect = useMemo(() => {\n switch (activator) {\n case AutoScrollActivator.Pointer:\n return pointerCoordinates ? {\n top: pointerCoordinates.y,\n bottom: pointerCoordinates.y,\n left: pointerCoordinates.x,\n right: pointerCoordinates.x\n } : null;\n\n case AutoScrollActivator.DraggableRect:\n return draggingRect;\n }\n }, [activator, draggingRect, pointerCoordinates]);\n const scrollContainerRef = useRef(null);\n const autoScroll = useCallback(() => {\n const scrollContainer = scrollContainerRef.current;\n\n if (!scrollContainer) {\n return;\n }\n\n const scrollLeft = scrollSpeed.current.x * scrollDirection.current.x;\n const scrollTop = scrollSpeed.current.y * scrollDirection.current.y;\n scrollContainer.scrollBy(scrollLeft, scrollTop);\n }, []);\n const sortedScrollableAncestors = useMemo(() => order === TraversalOrder.TreeOrder ? [...scrollableAncestors].reverse() : scrollableAncestors, [order, scrollableAncestors]);\n useEffect(() => {\n if (!enabled || !scrollableAncestors.length || !rect) {\n clearAutoScrollInterval();\n return;\n }\n\n for (const scrollContainer of sortedScrollableAncestors) {\n if ((canScroll == null ? void 0 : canScroll(scrollContainer)) === false) {\n continue;\n }\n\n const index = scrollableAncestors.indexOf(scrollContainer);\n const scrollContainerRect = scrollableAncestorRects[index];\n\n if (!scrollContainerRect) {\n continue;\n }\n\n const {\n direction,\n speed\n } = getScrollDirectionAndSpeed(scrollContainer, scrollContainerRect, rect, acceleration, threshold);\n\n for (const axis of ['x', 'y']) {\n if (!scrollIntent[axis][direction[axis]]) {\n speed[axis] = 0;\n direction[axis] = 0;\n }\n }\n\n if (speed.x > 0 || speed.y > 0) {\n clearAutoScrollInterval();\n scrollContainerRef.current = scrollContainer;\n setAutoScrollInterval(autoScroll, interval);\n scrollSpeed.current = speed;\n scrollDirection.current = direction;\n return;\n }\n }\n\n scrollSpeed.current = {\n x: 0,\n y: 0\n };\n scrollDirection.current = {\n x: 0,\n y: 0\n };\n clearAutoScrollInterval();\n }, // eslint-disable-next-line react-hooks/exhaustive-deps\n [acceleration, autoScroll, canScroll, clearAutoScrollInterval, enabled, interval, // eslint-disable-next-line react-hooks/exhaustive-deps\n JSON.stringify(rect), // eslint-disable-next-line react-hooks/exhaustive-deps\n JSON.stringify(scrollIntent), setAutoScrollInterval, scrollableAncestors, sortedScrollableAncestors, scrollableAncestorRects, // eslint-disable-next-line react-hooks/exhaustive-deps\n JSON.stringify(threshold)]);\n}\nconst defaultScrollIntent = {\n x: {\n [Direction.Backward]: false,\n [Direction.Forward]: false\n },\n y: {\n [Direction.Backward]: false,\n [Direction.Forward]: false\n }\n};\n\nfunction useScrollIntent(_ref2) {\n let {\n delta,\n disabled\n } = _ref2;\n const previousDelta = usePrevious(delta);\n return useLazyMemo(previousIntent => {\n if (disabled || !previousDelta || !previousIntent) {\n // Reset scroll intent tracking when auto-scrolling is disabled\n return defaultScrollIntent;\n }\n\n const direction = {\n x: Math.sign(delta.x - previousDelta.x),\n y: Math.sign(delta.y - previousDelta.y)\n }; // Keep track of the user intent to scroll in each direction for both axis\n\n return {\n x: {\n [Direction.Backward]: previousIntent.x[Direction.Backward] || direction.x === -1,\n [Direction.Forward]: previousIntent.x[Direction.Forward] || direction.x === 1\n },\n y: {\n [Direction.Backward]: previousIntent.y[Direction.Backward] || direction.y === -1,\n [Direction.Forward]: previousIntent.y[Direction.Forward] || direction.y === 1\n }\n };\n }, [disabled, delta, previousDelta]);\n}\n\nfunction useCachedNode(draggableNodes, id) {\n const draggableNode = id != null ? draggableNodes.get(id) : undefined;\n const node = draggableNode ? draggableNode.node.current : null;\n return useLazyMemo(cachedNode => {\n var _ref;\n\n if (id == null) {\n return null;\n } // In some cases, the draggable node can unmount while dragging\n // This is the case for virtualized lists. In those situations,\n // we fall back to the last known value for that node.\n\n\n return (_ref = node != null ? node : cachedNode) != null ? _ref : null;\n }, [node, id]);\n}\n\nfunction useCombineActivators(sensors, getSyntheticHandler) {\n return useMemo(() => sensors.reduce((accumulator, sensor) => {\n const {\n sensor: Sensor\n } = sensor;\n const sensorActivators = Sensor.activators.map(activator => ({\n eventName: activator.eventName,\n handler: getSyntheticHandler(activator.handler, sensor)\n }));\n return [...accumulator, ...sensorActivators];\n }, []), [sensors, getSyntheticHandler]);\n}\n\nvar MeasuringStrategy;\n\n(function (MeasuringStrategy) {\n MeasuringStrategy[MeasuringStrategy[\"Always\"] = 0] = \"Always\";\n MeasuringStrategy[MeasuringStrategy[\"BeforeDragging\"] = 1] = \"BeforeDragging\";\n MeasuringStrategy[MeasuringStrategy[\"WhileDragging\"] = 2] = \"WhileDragging\";\n})(MeasuringStrategy || (MeasuringStrategy = {}));\n\nvar MeasuringFrequency;\n\n(function (MeasuringFrequency) {\n MeasuringFrequency[\"Optimized\"] = \"optimized\";\n})(MeasuringFrequency || (MeasuringFrequency = {}));\n\nconst defaultValue = /*#__PURE__*/new Map();\nfunction useDroppableMeasuring(containers, _ref) {\n let {\n dragging,\n dependencies,\n config\n } = _ref;\n const [queue, setQueue] = useState(null);\n const {\n frequency,\n measure,\n strategy\n } = config;\n const containersRef = useRef(containers);\n const disabled = isDisabled();\n const disabledRef = useLatestValue(disabled);\n const measureDroppableContainers = useCallback(function (ids) {\n if (ids === void 0) {\n ids = [];\n }\n\n if (disabledRef.current) {\n return;\n }\n\n setQueue(value => {\n if (value === null) {\n return ids;\n }\n\n return value.concat(ids.filter(id => !value.includes(id)));\n });\n }, [disabledRef]);\n const timeoutId = useRef(null);\n const droppableRects = useLazyMemo(previousValue => {\n if (disabled && !dragging) {\n return defaultValue;\n }\n\n if (!previousValue || previousValue === defaultValue || containersRef.current !== containers || queue != null) {\n const map = new Map();\n\n for (let container of containers) {\n if (!container) {\n continue;\n }\n\n if (queue && queue.length > 0 && !queue.includes(container.id) && container.rect.current) {\n // This container does not need to be re-measured\n map.set(container.id, container.rect.current);\n continue;\n }\n\n const node = container.node.current;\n const rect = node ? new Rect(measure(node), node) : null;\n container.rect.current = rect;\n\n if (rect) {\n map.set(container.id, rect);\n }\n }\n\n return map;\n }\n\n return previousValue;\n }, [containers, queue, dragging, disabled, measure]);\n useEffect(() => {\n containersRef.current = containers;\n }, [containers]);\n useEffect(() => {\n if (disabled) {\n return;\n }\n\n measureDroppableContainers();\n }, // eslint-disable-next-line react-hooks/exhaustive-deps\n [dragging, disabled]);\n useEffect(() => {\n if (queue && queue.length > 0) {\n setQueue(null);\n }\n }, //eslint-disable-next-line react-hooks/exhaustive-deps\n [JSON.stringify(queue)]);\n useEffect(() => {\n if (disabled || typeof frequency !== 'number' || timeoutId.current !== null) {\n return;\n }\n\n timeoutId.current = setTimeout(() => {\n measureDroppableContainers();\n timeoutId.current = null;\n }, frequency);\n }, // eslint-disable-next-line react-hooks/exhaustive-deps\n [frequency, disabled, measureDroppableContainers, ...dependencies]);\n return {\n droppableRects,\n measureDroppableContainers,\n measuringScheduled: queue != null\n };\n\n function isDisabled() {\n switch (strategy) {\n case MeasuringStrategy.Always:\n return false;\n\n case MeasuringStrategy.BeforeDragging:\n return dragging;\n\n default:\n return !dragging;\n }\n }\n}\n\nfunction useInitialValue(value, computeFn) {\n return useLazyMemo(previousValue => {\n if (!value) {\n return null;\n }\n\n if (previousValue) {\n return previousValue;\n }\n\n return typeof computeFn === 'function' ? computeFn(value) : value;\n }, [computeFn, value]);\n}\n\nfunction useInitialRect(node, measure) {\n return useInitialValue(node, measure);\n}\n\n/**\r\n * Returns a new MutationObserver instance.\r\n * If `MutationObserver` is undefined in the execution environment, returns `undefined`.\r\n */\n\nfunction useMutationObserver(_ref) {\n let {\n callback,\n disabled\n } = _ref;\n const handleMutations = useEvent(callback);\n const mutationObserver = useMemo(() => {\n if (disabled || typeof window === 'undefined' || typeof window.MutationObserver === 'undefined') {\n return undefined;\n }\n\n const {\n MutationObserver\n } = window;\n return new MutationObserver(handleMutations);\n }, [handleMutations, disabled]);\n useEffect(() => {\n return () => mutationObserver == null ? void 0 : mutationObserver.disconnect();\n }, [mutationObserver]);\n return mutationObserver;\n}\n\n/**\r\n * Returns a new ResizeObserver instance bound to the `onResize` callback.\r\n * If `ResizeObserver` is undefined in the execution environment, returns `undefined`.\r\n */\n\nfunction useResizeObserver(_ref) {\n let {\n callback,\n disabled\n } = _ref;\n const handleResize = useEvent(callback);\n const resizeObserver = useMemo(() => {\n if (disabled || typeof window === 'undefined' || typeof window.ResizeObserver === 'undefined') {\n return undefined;\n }\n\n const {\n ResizeObserver\n } = window;\n return new ResizeObserver(handleResize);\n }, // eslint-disable-next-line react-hooks/exhaustive-deps\n [disabled]);\n useEffect(() => {\n return () => resizeObserver == null ? void 0 : resizeObserver.disconnect();\n }, [resizeObserver]);\n return resizeObserver;\n}\n\nfunction defaultMeasure(element) {\n return new Rect(getClientRect(element), element);\n}\n\nfunction useRect(element, measure, fallbackRect) {\n if (measure === void 0) {\n measure = defaultMeasure;\n }\n\n const [rect, setRect] = useState(null);\n\n function measureRect() {\n setRect(currentRect => {\n if (!element) {\n return null;\n }\n\n if (element.isConnected === false) {\n var _ref;\n\n // Fall back to last rect we measured if the element is\n // no longer connected to the DOM.\n return (_ref = currentRect != null ? currentRect : fallbackRect) != null ? _ref : null;\n }\n\n const newRect = measure(element);\n\n if (JSON.stringify(currentRect) === JSON.stringify(newRect)) {\n return currentRect;\n }\n\n return newRect;\n });\n }\n\n const mutationObserver = useMutationObserver({\n callback(records) {\n if (!element) {\n return;\n }\n\n for (const record of records) {\n const {\n type,\n target\n } = record;\n\n if (type === 'childList' && target instanceof HTMLElement && target.contains(element)) {\n measureRect();\n break;\n }\n }\n }\n\n });\n const resizeObserver = useResizeObserver({\n callback: measureRect\n });\n useIsomorphicLayoutEffect(() => {\n measureRect();\n\n if (element) {\n resizeObserver == null ? void 0 : resizeObserver.observe(element);\n mutationObserver == null ? void 0 : mutationObserver.observe(document.body, {\n childList: true,\n subtree: true\n });\n } else {\n resizeObserver == null ? void 0 : resizeObserver.disconnect();\n mutationObserver == null ? void 0 : mutationObserver.disconnect();\n }\n }, [element]);\n return rect;\n}\n\nfunction useRectDelta(rect) {\n const initialRect = useInitialValue(rect);\n return getRectDelta(rect, initialRect);\n}\n\nconst defaultValue$1 = [];\nfunction useScrollableAncestors(node) {\n const previousNode = useRef(node);\n const ancestors = useLazyMemo(previousValue => {\n if (!node) {\n return defaultValue$1;\n }\n\n if (previousValue && previousValue !== defaultValue$1 && node && previousNode.current && node.parentNode === previousNode.current.parentNode) {\n return previousValue;\n }\n\n return getScrollableAncestors(node);\n }, [node]);\n useEffect(() => {\n previousNode.current = node;\n }, [node]);\n return ancestors;\n}\n\nfunction useScrollOffsets(elements) {\n const [scrollCoordinates, setScrollCoordinates] = useState(null);\n const prevElements = useRef(elements); // To-do: Throttle the handleScroll callback\n\n const handleScroll = useCallback(event => {\n const scrollingElement = getScrollableElement(event.target);\n\n if (!scrollingElement) {\n return;\n }\n\n setScrollCoordinates(scrollCoordinates => {\n if (!scrollCoordinates) {\n return null;\n }\n\n scrollCoordinates.set(scrollingElement, getScrollCoordinates(scrollingElement));\n return new Map(scrollCoordinates);\n });\n }, []);\n useEffect(() => {\n const previousElements = prevElements.current;\n\n if (elements !== previousElements) {\n cleanup(previousElements);\n const entries = elements.map(element => {\n const scrollableElement = getScrollableElement(element);\n\n if (scrollableElement) {\n scrollableElement.addEventListener('scroll', handleScroll, {\n passive: true\n });\n return [scrollableElement, getScrollCoordinates(scrollableElement)];\n }\n\n return null;\n }).filter(entry => entry != null);\n setScrollCoordinates(entries.length ? new Map(entries) : null);\n prevElements.current = elements;\n }\n\n return () => {\n cleanup(elements);\n cleanup(previousElements);\n };\n\n function cleanup(elements) {\n elements.forEach(element => {\n const scrollableElement = getScrollableElement(element);\n scrollableElement == null ? void 0 : scrollableElement.removeEventListener('scroll', handleScroll);\n });\n }\n }, [handleScroll, elements]);\n return useMemo(() => {\n if (elements.length) {\n return scrollCoordinates ? Array.from(scrollCoordinates.values()).reduce((acc, coordinates) => add(acc, coordinates), defaultCoordinates) : getScrollOffsets(elements);\n }\n\n return defaultCoordinates;\n }, [elements, scrollCoordinates]);\n}\n\nfunction useScrollOffsetsDelta(scrollOffsets, dependencies) {\n if (dependencies === void 0) {\n dependencies = [];\n }\n\n const initialScrollOffsets = useRef(null);\n useEffect(() => {\n initialScrollOffsets.current = null;\n }, // eslint-disable-next-line react-hooks/exhaustive-deps\n dependencies);\n useEffect(() => {\n const hasScrollOffsets = scrollOffsets !== defaultCoordinates;\n\n if (hasScrollOffsets && !initialScrollOffsets.current) {\n initialScrollOffsets.current = scrollOffsets;\n }\n\n if (!hasScrollOffsets && initialScrollOffsets.current) {\n initialScrollOffsets.current = null;\n }\n }, [scrollOffsets]);\n return initialScrollOffsets.current ? subtract(scrollOffsets, initialScrollOffsets.current) : defaultCoordinates;\n}\n\nfunction useSensorSetup(sensors) {\n useEffect(() => {\n if (!canUseDOM) {\n return;\n }\n\n const teardownFns = sensors.map(_ref => {\n let {\n sensor\n } = _ref;\n return sensor.setup == null ? void 0 : sensor.setup();\n });\n return () => {\n for (const teardown of teardownFns) {\n teardown == null ? void 0 : teardown();\n }\n };\n }, // TO-DO: Sensors length could theoretically change which would not be a valid dependency\n // eslint-disable-next-line react-hooks/exhaustive-deps\n sensors.map(_ref2 => {\n let {\n sensor\n } = _ref2;\n return sensor;\n }));\n}\n\nfunction useSyntheticListeners(listeners, id) {\n return useMemo(() => {\n return listeners.reduce((acc, _ref) => {\n let {\n eventName,\n handler\n } = _ref;\n\n acc[eventName] = event => {\n handler(event, id);\n };\n\n return acc;\n }, {});\n }, [listeners, id]);\n}\n\nfunction useWindowRect(element) {\n return useMemo(() => element ? getWindowClientRect(element) : null, [element]);\n}\n\nconst defaultValue$2 = [];\nfunction useRects(elements, measure) {\n if (measure === void 0) {\n measure = getClientRect;\n }\n\n const [firstElement] = elements;\n const windowRect = useWindowRect(firstElement ? getWindow(firstElement) : null);\n const [rects, setRects] = useState(defaultValue$2);\n\n function measureRects() {\n setRects(() => {\n if (!elements.length) {\n return defaultValue$2;\n }\n\n return elements.map(element => isDocumentScrollingElement(element) ? windowRect : new Rect(measure(element), element));\n });\n }\n\n const resizeObserver = useResizeObserver({\n callback: measureRects\n });\n useIsomorphicLayoutEffect(() => {\n resizeObserver == null ? void 0 : resizeObserver.disconnect();\n measureRects();\n elements.forEach(element => resizeObserver == null ? void 0 : resizeObserver.observe(element));\n }, [elements]);\n return rects;\n}\n\nfunction getMeasurableNode(node) {\n if (!node) {\n return null;\n }\n\n if (node.children.length > 1) {\n return node;\n }\n\n const firstChild = node.children[0];\n return isHTMLElement(firstChild) ? firstChild : node;\n}\n\nfunction useDragOverlayMeasuring(_ref) {\n let {\n measure\n } = _ref;\n const [rect, setRect] = useState(null);\n const handleResize = useCallback(entries => {\n for (const {\n target\n } of entries) {\n if (isHTMLElement(target)) {\n setRect(rect => {\n const newRect = measure(target);\n return rect ? { ...rect,\n width: newRect.width,\n height: newRect.height\n } : newRect;\n });\n break;\n }\n }\n }, [measure]);\n const resizeObserver = useResizeObserver({\n callback: handleResize\n });\n const handleNodeChange = useCallback(element => {\n const node = getMeasurableNode(element);\n resizeObserver == null ? void 0 : resizeObserver.disconnect();\n\n if (node) {\n resizeObserver == null ? void 0 : resizeObserver.observe(node);\n }\n\n setRect(node ? measure(node) : null);\n }, [measure, resizeObserver]);\n const [nodeRef, setRef] = useNodeRef(handleNodeChange);\n return useMemo(() => ({\n nodeRef,\n rect,\n setRef\n }), [rect, nodeRef, setRef]);\n}\n\nconst defaultSensors = [{\n sensor: PointerSensor,\n options: {}\n}, {\n sensor: KeyboardSensor,\n options: {}\n}];\nconst defaultData = {\n current: {}\n};\nconst defaultMeasuringConfiguration = {\n draggable: {\n measure: getTransformAgnosticClientRect\n },\n droppable: {\n measure: getTransformAgnosticClientRect,\n strategy: MeasuringStrategy.WhileDragging,\n frequency: MeasuringFrequency.Optimized\n },\n dragOverlay: {\n measure: getClientRect\n }\n};\n\nclass DroppableContainersMap extends Map {\n get(id) {\n var _super$get;\n\n return id != null ? (_super$get = super.get(id)) != null ? _super$get : undefined : undefined;\n }\n\n toArray() {\n return Array.from(this.values());\n }\n\n getEnabled() {\n return this.toArray().filter(_ref => {\n let {\n disabled\n } = _ref;\n return !disabled;\n });\n }\n\n getNodeFor(id) {\n var _this$get$node$curren, _this$get;\n\n return (_this$get$node$curren = (_this$get = this.get(id)) == null ? void 0 : _this$get.node.current) != null ? _this$get$node$curren : undefined;\n }\n\n}\n\nconst defaultPublicContext = {\n activatorEvent: null,\n active: null,\n activeNode: null,\n activeNodeRect: null,\n collisions: null,\n containerNodeRect: null,\n draggableNodes: /*#__PURE__*/new Map(),\n droppableRects: /*#__PURE__*/new Map(),\n droppableContainers: /*#__PURE__*/new DroppableContainersMap(),\n over: null,\n dragOverlay: {\n nodeRef: {\n current: null\n },\n rect: null,\n setRef: noop\n },\n scrollableAncestors: [],\n scrollableAncestorRects: [],\n measuringConfiguration: defaultMeasuringConfiguration,\n measureDroppableContainers: noop,\n windowRect: null,\n measuringScheduled: false\n};\nconst defaultInternalContext = {\n activatorEvent: null,\n activators: [],\n active: null,\n activeNodeRect: null,\n ariaDescribedById: {\n draggable: ''\n },\n dispatch: noop,\n draggableNodes: /*#__PURE__*/new Map(),\n over: null,\n measureDroppableContainers: noop\n};\nconst InternalContext = /*#__PURE__*/createContext(defaultInternalContext);\nconst PublicContext = /*#__PURE__*/createContext(defaultPublicContext);\n\nfunction getInitialState() {\n return {\n draggable: {\n active: null,\n initialCoordinates: {\n x: 0,\n y: 0\n },\n nodes: new Map(),\n translate: {\n x: 0,\n y: 0\n }\n },\n droppable: {\n containers: new DroppableContainersMap()\n }\n };\n}\nfunction reducer(state, action) {\n switch (action.type) {\n case Action.DragStart:\n return { ...state,\n draggable: { ...state.draggable,\n initialCoordinates: action.initialCoordinates,\n active: action.active\n }\n };\n\n case Action.DragMove:\n if (state.draggable.active == null) {\n return state;\n }\n\n return { ...state,\n draggable: { ...state.draggable,\n translate: {\n x: action.coordinates.x - state.draggable.initialCoordinates.x,\n y: action.coordinates.y - state.draggable.initialCoordinates.y\n }\n }\n };\n\n case Action.DragEnd:\n case Action.DragCancel:\n return { ...state,\n draggable: { ...state.draggable,\n active: null,\n initialCoordinates: {\n x: 0,\n y: 0\n },\n translate: {\n x: 0,\n y: 0\n }\n }\n };\n\n case Action.RegisterDroppable:\n {\n const {\n element\n } = action;\n const {\n id\n } = element;\n const containers = new DroppableContainersMap(state.droppable.containers);\n containers.set(id, element);\n return { ...state,\n droppable: { ...state.droppable,\n containers\n }\n };\n }\n\n case Action.SetDroppableDisabled:\n {\n const {\n id,\n key,\n disabled\n } = action;\n const element = state.droppable.containers.get(id);\n\n if (!element || key !== element.key) {\n return state;\n }\n\n const containers = new DroppableContainersMap(state.droppable.containers);\n containers.set(id, { ...element,\n disabled\n });\n return { ...state,\n droppable: { ...state.droppable,\n containers\n }\n };\n }\n\n case Action.UnregisterDroppable:\n {\n const {\n id,\n key\n } = action;\n const element = state.droppable.containers.get(id);\n\n if (!element || key !== element.key) {\n return state;\n }\n\n const containers = new DroppableContainersMap(state.droppable.containers);\n containers.delete(id);\n return { ...state,\n droppable: { ...state.droppable,\n containers\n }\n };\n }\n\n default:\n {\n return state;\n }\n }\n}\n\nfunction RestoreFocus(_ref) {\n let {\n disabled\n } = _ref;\n const {\n active,\n activatorEvent,\n draggableNodes\n } = useContext(InternalContext);\n const previousActivatorEvent = usePrevious(activatorEvent);\n const previousActiveId = usePrevious(active == null ? void 0 : active.id); // Restore keyboard focus on the activator node\n\n useEffect(() => {\n if (disabled) {\n return;\n }\n\n if (!activatorEvent && previousActivatorEvent && previousActiveId != null) {\n if (!isKeyboardEvent(previousActivatorEvent)) {\n return;\n }\n\n if (document.activeElement === previousActivatorEvent.target) {\n // No need to restore focus\n return;\n }\n\n const draggableNode = draggableNodes.get(previousActiveId);\n\n if (!draggableNode) {\n return;\n }\n\n const {\n activatorNode,\n node\n } = draggableNode;\n\n if (!activatorNode.current && !node.current) {\n return;\n }\n\n requestAnimationFrame(() => {\n for (const element of [activatorNode.current, node.current]) {\n if (!element) {\n continue;\n }\n\n const focusableNode = findFirstFocusableNode(element);\n\n if (focusableNode) {\n focusableNode.focus();\n break;\n }\n }\n });\n }\n }, [activatorEvent, disabled, draggableNodes, previousActiveId, previousActivatorEvent]);\n return null;\n}\n\nfunction applyModifiers(modifiers, _ref) {\n let {\n transform,\n ...args\n } = _ref;\n return modifiers != null && modifiers.length ? modifiers.reduce((accumulator, modifier) => {\n return modifier({\n transform: accumulator,\n ...args\n });\n }, transform) : transform;\n}\n\nfunction useMeasuringConfiguration(config) {\n return useMemo(() => ({\n draggable: { ...defaultMeasuringConfiguration.draggable,\n ...(config == null ? void 0 : config.draggable)\n },\n droppable: { ...defaultMeasuringConfiguration.droppable,\n ...(config == null ? void 0 : config.droppable)\n },\n dragOverlay: { ...defaultMeasuringConfiguration.dragOverlay,\n ...(config == null ? void 0 : config.dragOverlay)\n }\n }), // eslint-disable-next-line react-hooks/exhaustive-deps\n [config == null ? void 0 : config.draggable, config == null ? void 0 : config.droppable, config == null ? void 0 : config.dragOverlay]);\n}\n\nfunction useLayoutShiftScrollCompensation(_ref) {\n let {\n activeNode,\n measure,\n initialRect,\n config = true\n } = _ref;\n const initialized = useRef(false);\n const {\n x,\n y\n } = typeof config === 'boolean' ? {\n x: config,\n y: config\n } : config;\n useIsomorphicLayoutEffect(() => {\n const disabled = !x && !y;\n\n if (disabled || !activeNode) {\n initialized.current = false;\n return;\n }\n\n if (initialized.current || !initialRect) {\n // Return early if layout shift scroll compensation was already attempted\n // or if there is no initialRect to compare to.\n return;\n } // Get the most up to date node ref for the active draggable\n\n\n const node = activeNode == null ? void 0 : activeNode.node.current;\n\n if (!node || node.isConnected === false) {\n // Return early if there is no attached node ref or if the node is\n // disconnected from the document.\n return;\n }\n\n const rect = measure(node);\n const rectDelta = getRectDelta(rect, initialRect);\n\n if (!x) {\n rectDelta.x = 0;\n }\n\n if (!y) {\n rectDelta.y = 0;\n } // Only perform layout shift scroll compensation once\n\n\n initialized.current = true;\n\n if (Math.abs(rectDelta.x) > 0 || Math.abs(rectDelta.y) > 0) {\n const firstScrollableAncestor = getFirstScrollableAncestor(node);\n\n if (firstScrollableAncestor) {\n firstScrollableAncestor.scrollBy({\n top: rectDelta.y,\n left: rectDelta.x\n });\n }\n }\n }, [activeNode, x, y, initialRect, measure]);\n}\n\nconst ActiveDraggableContext = /*#__PURE__*/createContext({ ...defaultCoordinates,\n scaleX: 1,\n scaleY: 1\n});\nvar Status;\n\n(function (Status) {\n Status[Status[\"Uninitialized\"] = 0] = \"Uninitialized\";\n Status[Status[\"Initializing\"] = 1] = \"Initializing\";\n Status[Status[\"Initialized\"] = 2] = \"Initialized\";\n})(Status || (Status = {}));\n\nconst DndContext = /*#__PURE__*/memo(function DndContext(_ref) {\n var _sensorContext$curren, _dragOverlay$nodeRef$, _dragOverlay$rect, _over$rect;\n\n let {\n id,\n accessibility,\n autoScroll = true,\n children,\n sensors = defaultSensors,\n collisionDetection = rectIntersection,\n measuring,\n modifiers,\n ...props\n } = _ref;\n const store = useReducer(reducer, undefined, getInitialState);\n const [state, dispatch] = store;\n const [dispatchMonitorEvent, registerMonitorListener] = useDndMonitorProvider();\n const [status, setStatus] = useState(Status.Uninitialized);\n const isInitialized = status === Status.Initialized;\n const {\n draggable: {\n active: activeId,\n nodes: draggableNodes,\n translate\n },\n droppable: {\n containers: droppableContainers\n }\n } = state;\n const node = activeId != null ? draggableNodes.get(activeId) : null;\n const activeRects = useRef({\n initial: null,\n translated: null\n });\n const active = useMemo(() => {\n var _node$data;\n\n return activeId != null ? {\n id: activeId,\n // It's possible for the active node to unmount while dragging\n data: (_node$data = node == null ? void 0 : node.data) != null ? _node$data : defaultData,\n rect: activeRects\n } : null;\n }, [activeId, node]);\n const activeRef = useRef(null);\n const [activeSensor, setActiveSensor] = useState(null);\n const [activatorEvent, setActivatorEvent] = useState(null);\n const latestProps = useLatestValue(props, Object.values(props));\n const draggableDescribedById = useUniqueId(\"DndDescribedBy\", id);\n const enabledDroppableContainers = useMemo(() => droppableContainers.getEnabled(), [droppableContainers]);\n const measuringConfiguration = useMeasuringConfiguration(measuring);\n const {\n droppableRects,\n measureDroppableContainers,\n measuringScheduled\n } = useDroppableMeasuring(enabledDroppableContainers, {\n dragging: isInitialized,\n dependencies: [translate.x, translate.y],\n config: measuringConfiguration.droppable\n });\n const activeNode = useCachedNode(draggableNodes, activeId);\n const activationCoordinates = useMemo(() => activatorEvent ? getEventCoordinates(activatorEvent) : null, [activatorEvent]);\n const autoScrollOptions = getAutoScrollerOptions();\n const initialActiveNodeRect = useInitialRect(activeNode, measuringConfiguration.draggable.measure);\n useLayoutShiftScrollCompensation({\n activeNode: activeId != null ? draggableNodes.get(activeId) : null,\n config: autoScrollOptions.layoutShiftCompensation,\n initialRect: initialActiveNodeRect,\n measure: measuringConfiguration.draggable.measure\n });\n const activeNodeRect = useRect(activeNode, measuringConfiguration.draggable.measure, initialActiveNodeRect);\n const containerNodeRect = useRect(activeNode ? activeNode.parentElement : null);\n const sensorContext = useRef({\n activatorEvent: null,\n active: null,\n activeNode,\n collisionRect: null,\n collisions: null,\n droppableRects,\n draggableNodes,\n draggingNode: null,\n draggingNodeRect: null,\n droppableContainers,\n over: null,\n scrollableAncestors: [],\n scrollAdjustedTranslate: null\n });\n const overNode = droppableContainers.getNodeFor((_sensorContext$curren = sensorContext.current.over) == null ? void 0 : _sensorContext$curren.id);\n const dragOverlay = useDragOverlayMeasuring({\n measure: measuringConfiguration.dragOverlay.measure\n }); // Use the rect of the drag overlay if it is mounted\n\n const draggingNode = (_dragOverlay$nodeRef$ = dragOverlay.nodeRef.current) != null ? _dragOverlay$nodeRef$ : activeNode;\n const draggingNodeRect = isInitialized ? (_dragOverlay$rect = dragOverlay.rect) != null ? _dragOverlay$rect : activeNodeRect : null;\n const usesDragOverlay = Boolean(dragOverlay.nodeRef.current && dragOverlay.rect); // The delta between the previous and new position of the draggable node\n // is only relevant when there is no drag overlay\n\n const nodeRectDelta = useRectDelta(usesDragOverlay ? null : activeNodeRect); // Get the window rect of the dragging node\n\n const windowRect = useWindowRect(draggingNode ? getWindow(draggingNode) : null); // Get scrollable ancestors of the dragging node\n\n const scrollableAncestors = useScrollableAncestors(isInitialized ? overNode != null ? overNode : activeNode : null);\n const scrollableAncestorRects = useRects(scrollableAncestors); // Apply modifiers\n\n const modifiedTranslate = applyModifiers(modifiers, {\n transform: {\n x: translate.x - nodeRectDelta.x,\n y: translate.y - nodeRectDelta.y,\n scaleX: 1,\n scaleY: 1\n },\n activatorEvent,\n active,\n activeNodeRect,\n containerNodeRect,\n draggingNodeRect,\n over: sensorContext.current.over,\n overlayNodeRect: dragOverlay.rect,\n scrollableAncestors,\n scrollableAncestorRects,\n windowRect\n });\n const pointerCoordinates = activationCoordinates ? add(activationCoordinates, translate) : null;\n const scrollOffsets = useScrollOffsets(scrollableAncestors); // Represents the scroll delta since dragging was initiated\n\n const scrollAdjustment = useScrollOffsetsDelta(scrollOffsets); // Represents the scroll delta since the last time the active node rect was measured\n\n const activeNodeScrollDelta = useScrollOffsetsDelta(scrollOffsets, [activeNodeRect]);\n const scrollAdjustedTranslate = add(modifiedTranslate, scrollAdjustment);\n const collisionRect = draggingNodeRect ? getAdjustedRect(draggingNodeRect, modifiedTranslate) : null;\n const collisions = active && collisionRect ? collisionDetection({\n active,\n collisionRect,\n droppableRects,\n droppableContainers: enabledDroppableContainers,\n pointerCoordinates\n }) : null;\n const overId = getFirstCollision(collisions, 'id');\n const [over, setOver] = useState(null); // When there is no drag overlay used, we need to account for the\n // window scroll delta\n\n const appliedTranslate = usesDragOverlay ? modifiedTranslate : add(modifiedTranslate, activeNodeScrollDelta);\n const transform = adjustScale(appliedTranslate, (_over$rect = over == null ? void 0 : over.rect) != null ? _over$rect : null, activeNodeRect);\n const activeSensorRef = useRef(null);\n const instantiateSensor = useCallback((event, _ref2) => {\n let {\n sensor: Sensor,\n options\n } = _ref2;\n\n if (activeRef.current == null) {\n return;\n }\n\n const activeNode = draggableNodes.get(activeRef.current);\n\n if (!activeNode) {\n return;\n }\n\n const activatorEvent = event.nativeEvent;\n const sensorInstance = new Sensor({\n active: activeRef.current,\n activeNode,\n event: activatorEvent,\n options,\n // Sensors need to be instantiated with refs for arguments that change over time\n // otherwise they are frozen in time with the stale arguments\n context: sensorContext,\n\n onAbort(id) {\n const draggableNode = draggableNodes.get(id);\n\n if (!draggableNode) {\n return;\n }\n\n const {\n onDragAbort\n } = latestProps.current;\n const event = {\n id\n };\n onDragAbort == null ? void 0 : onDragAbort(event);\n dispatchMonitorEvent({\n type: 'onDragAbort',\n event\n });\n },\n\n onPending(id, constraint, initialCoordinates, offset) {\n const draggableNode = draggableNodes.get(id);\n\n if (!draggableNode) {\n return;\n }\n\n const {\n onDragPending\n } = latestProps.current;\n const event = {\n id,\n constraint,\n initialCoordinates,\n offset\n };\n onDragPending == null ? void 0 : onDragPending(event);\n dispatchMonitorEvent({\n type: 'onDragPending',\n event\n });\n },\n\n onStart(initialCoordinates) {\n const id = activeRef.current;\n\n if (id == null) {\n return;\n }\n\n const draggableNode = draggableNodes.get(id);\n\n if (!draggableNode) {\n return;\n }\n\n const {\n onDragStart\n } = latestProps.current;\n const event = {\n activatorEvent,\n active: {\n id,\n data: draggableNode.data,\n rect: activeRects\n }\n };\n unstable_batchedUpdates(() => {\n onDragStart == null ? void 0 : onDragStart(event);\n setStatus(Status.Initializing);\n dispatch({\n type: Action.DragStart,\n initialCoordinates,\n active: id\n });\n dispatchMonitorEvent({\n type: 'onDragStart',\n event\n });\n setActiveSensor(activeSensorRef.current);\n setActivatorEvent(activatorEvent);\n });\n },\n\n onMove(coordinates) {\n dispatch({\n type: Action.DragMove,\n coordinates\n });\n },\n\n onEnd: createHandler(Action.DragEnd),\n onCancel: createHandler(Action.DragCancel)\n });\n activeSensorRef.current = sensorInstance;\n\n function createHandler(type) {\n return async function handler() {\n const {\n active,\n collisions,\n over,\n scrollAdjustedTranslate\n } = sensorContext.current;\n let event = null;\n\n if (active && scrollAdjustedTranslate) {\n const {\n cancelDrop\n } = latestProps.current;\n event = {\n activatorEvent,\n active: active,\n collisions,\n delta: scrollAdjustedTranslate,\n over\n };\n\n if (type === Action.DragEnd && typeof cancelDrop === 'function') {\n const shouldCancel = await Promise.resolve(cancelDrop(event));\n\n if (shouldCancel) {\n type = Action.DragCancel;\n }\n }\n }\n\n activeRef.current = null;\n unstable_batchedUpdates(() => {\n dispatch({\n type\n });\n setStatus(Status.Uninitialized);\n setOver(null);\n setActiveSensor(null);\n setActivatorEvent(null);\n activeSensorRef.current = null;\n const eventName = type === Action.DragEnd ? 'onDragEnd' : 'onDragCancel';\n\n if (event) {\n const handler = latestProps.current[eventName];\n handler == null ? void 0 : handler(event);\n dispatchMonitorEvent({\n type: eventName,\n event\n });\n }\n });\n };\n }\n }, // eslint-disable-next-line react-hooks/exhaustive-deps\n [draggableNodes]);\n const bindActivatorToSensorInstantiator = useCallback((handler, sensor) => {\n return (event, active) => {\n const nativeEvent = event.nativeEvent;\n const activeDraggableNode = draggableNodes.get(active);\n\n if ( // Another sensor is already instantiating\n activeRef.current !== null || // No active draggable\n !activeDraggableNode || // Event has already been captured\n nativeEvent.dndKit || nativeEvent.defaultPrevented) {\n return;\n }\n\n const activationContext = {\n active: activeDraggableNode\n };\n const shouldActivate = handler(event, sensor.options, activationContext);\n\n if (shouldActivate === true) {\n nativeEvent.dndKit = {\n capturedBy: sensor.sensor\n };\n activeRef.current = active;\n instantiateSensor(event, sensor);\n }\n };\n }, [draggableNodes, instantiateSensor]);\n const activators = useCombineActivators(sensors, bindActivatorToSensorInstantiator);\n useSensorSetup(sensors);\n useIsomorphicLayoutEffect(() => {\n if (activeNodeRect && status === Status.Initializing) {\n setStatus(Status.Initialized);\n }\n }, [activeNodeRect, status]);\n useEffect(() => {\n const {\n onDragMove\n } = latestProps.current;\n const {\n active,\n activatorEvent,\n collisions,\n over\n } = sensorContext.current;\n\n if (!active || !activatorEvent) {\n return;\n }\n\n const event = {\n active,\n activatorEvent,\n collisions,\n delta: {\n x: scrollAdjustedTranslate.x,\n y: scrollAdjustedTranslate.y\n },\n over\n };\n unstable_batchedUpdates(() => {\n onDragMove == null ? void 0 : onDragMove(event);\n dispatchMonitorEvent({\n type: 'onDragMove',\n event\n });\n });\n }, // eslint-disable-next-line react-hooks/exhaustive-deps\n [scrollAdjustedTranslate.x, scrollAdjustedTranslate.y]);\n useEffect(() => {\n const {\n active,\n activatorEvent,\n collisions,\n droppableContainers,\n scrollAdjustedTranslate\n } = sensorContext.current;\n\n if (!active || activeRef.current == null || !activatorEvent || !scrollAdjustedTranslate) {\n return;\n }\n\n const {\n onDragOver\n } = latestProps.current;\n const overContainer = droppableContainers.get(overId);\n const over = overContainer && overContainer.rect.current ? {\n id: overContainer.id,\n rect: overContainer.rect.current,\n data: overContainer.data,\n disabled: overContainer.disabled\n } : null;\n const event = {\n active,\n activatorEvent,\n collisions,\n delta: {\n x: scrollAdjustedTranslate.x,\n y: scrollAdjustedTranslate.y\n },\n over\n };\n unstable_batchedUpdates(() => {\n setOver(over);\n onDragOver == null ? void 0 : onDragOver(event);\n dispatchMonitorEvent({\n type: 'onDragOver',\n event\n });\n });\n }, // eslint-disable-next-line react-hooks/exhaustive-deps\n [overId]);\n useIsomorphicLayoutEffect(() => {\n sensorContext.current = {\n activatorEvent,\n active,\n activeNode,\n collisionRect,\n collisions,\n droppableRects,\n draggableNodes,\n draggingNode,\n draggingNodeRect,\n droppableContainers,\n over,\n scrollableAncestors,\n scrollAdjustedTranslate\n };\n activeRects.current = {\n initial: draggingNodeRect,\n translated: collisionRect\n };\n }, [active, activeNode, collisions, collisionRect, draggableNodes, draggingNode, draggingNodeRect, droppableRects, droppableContainers, over, scrollableAncestors, scrollAdjustedTranslate]);\n useAutoScroller({ ...autoScrollOptions,\n delta: translate,\n draggingRect: collisionRect,\n pointerCoordinates,\n scrollableAncestors,\n scrollableAncestorRects\n });\n const publicContext = useMemo(() => {\n const context = {\n active,\n activeNode,\n activeNodeRect,\n activatorEvent,\n collisions,\n containerNodeRect,\n dragOverlay,\n draggableNodes,\n droppableContainers,\n droppableRects,\n over,\n measureDroppableContainers,\n scrollableAncestors,\n scrollableAncestorRects,\n measuringConfiguration,\n measuringScheduled,\n windowRect\n };\n return context;\n }, [active, activeNode, activeNodeRect, activatorEvent, collisions, containerNodeRect, dragOverlay, draggableNodes, droppableContainers, droppableRects, over, measureDroppableContainers, scrollableAncestors, scrollableAncestorRects, measuringConfiguration, measuringScheduled, windowRect]);\n const internalContext = useMemo(() => {\n const context = {\n activatorEvent,\n activators,\n active,\n activeNodeRect,\n ariaDescribedById: {\n draggable: draggableDescribedById\n },\n dispatch,\n draggableNodes,\n over,\n measureDroppableContainers\n };\n return context;\n }, [activatorEvent, activators, active, activeNodeRect, dispatch, draggableDescribedById, draggableNodes, over, measureDroppableContainers]);\n return React.createElement(DndMonitorContext.Provider, {\n value: registerMonitorListener\n }, React.createElement(InternalContext.Provider, {\n value: internalContext\n }, React.createElement(PublicContext.Provider, {\n value: publicContext\n }, React.createElement(ActiveDraggableContext.Provider, {\n value: transform\n }, children)), React.createElement(RestoreFocus, {\n disabled: (accessibility == null ? void 0 : accessibility.restoreFocus) === false\n })), React.createElement(Accessibility, { ...accessibility,\n hiddenTextDescribedById: draggableDescribedById\n }));\n\n function getAutoScrollerOptions() {\n const activeSensorDisablesAutoscroll = (activeSensor == null ? void 0 : activeSensor.autoScrollEnabled) === false;\n const autoScrollGloballyDisabled = typeof autoScroll === 'object' ? autoScroll.enabled === false : autoScroll === false;\n const enabled = isInitialized && !activeSensorDisablesAutoscroll && !autoScrollGloballyDisabled;\n\n if (typeof autoScroll === 'object') {\n return { ...autoScroll,\n enabled\n };\n }\n\n return {\n enabled\n };\n }\n});\n\nconst NullContext = /*#__PURE__*/createContext(null);\nconst defaultRole = 'button';\nconst ID_PREFIX = 'Draggable';\nfunction useDraggable(_ref) {\n let {\n id,\n data,\n disabled = false,\n attributes\n } = _ref;\n const key = useUniqueId(ID_PREFIX);\n const {\n activators,\n activatorEvent,\n active,\n activeNodeRect,\n ariaDescribedById,\n draggableNodes,\n over\n } = useContext(InternalContext);\n const {\n role = defaultRole,\n roleDescription = 'draggable',\n tabIndex = 0\n } = attributes != null ? attributes : {};\n const isDragging = (active == null ? void 0 : active.id) === id;\n const transform = useContext(isDragging ? ActiveDraggableContext : NullContext);\n const [node, setNodeRef] = useNodeRef();\n const [activatorNode, setActivatorNodeRef] = useNodeRef();\n const listeners = useSyntheticListeners(activators, id);\n const dataRef = useLatestValue(data);\n useIsomorphicLayoutEffect(() => {\n draggableNodes.set(id, {\n id,\n key,\n node,\n activatorNode,\n data: dataRef\n });\n return () => {\n const node = draggableNodes.get(id);\n\n if (node && node.key === key) {\n draggableNodes.delete(id);\n }\n };\n }, // eslint-disable-next-line react-hooks/exhaustive-deps\n [draggableNodes, id]);\n const memoizedAttributes = useMemo(() => ({\n role,\n tabIndex,\n 'aria-disabled': disabled,\n 'aria-pressed': isDragging && role === defaultRole ? true : undefined,\n 'aria-roledescription': roleDescription,\n 'aria-describedby': ariaDescribedById.draggable\n }), [disabled, role, tabIndex, isDragging, roleDescription, ariaDescribedById.draggable]);\n return {\n active,\n activatorEvent,\n activeNodeRect,\n attributes: memoizedAttributes,\n isDragging,\n listeners: disabled ? undefined : listeners,\n node,\n over,\n setNodeRef,\n setActivatorNodeRef,\n transform\n };\n}\n\nfunction useDndContext() {\n return useContext(PublicContext);\n}\n\nconst ID_PREFIX$1 = 'Droppable';\nconst defaultResizeObserverConfig = {\n timeout: 25\n};\nfunction useDroppable(_ref) {\n let {\n data,\n disabled = false,\n id,\n resizeObserverConfig\n } = _ref;\n const key = useUniqueId(ID_PREFIX$1);\n const {\n active,\n dispatch,\n over,\n measureDroppableContainers\n } = useContext(InternalContext);\n const previous = useRef({\n disabled\n });\n const resizeObserverConnected = useRef(false);\n const rect = useRef(null);\n const callbackId = useRef(null);\n const {\n disabled: resizeObserverDisabled,\n updateMeasurementsFor,\n timeout: resizeObserverTimeout\n } = { ...defaultResizeObserverConfig,\n ...resizeObserverConfig\n };\n const ids = useLatestValue(updateMeasurementsFor != null ? updateMeasurementsFor : id);\n const handleResize = useCallback(() => {\n if (!resizeObserverConnected.current) {\n // ResizeObserver invokes the `handleResize` callback as soon as `observe` is called,\n // assuming the element is rendered and displayed.\n resizeObserverConnected.current = true;\n return;\n }\n\n if (callbackId.current != null) {\n clearTimeout(callbackId.current);\n }\n\n callbackId.current = setTimeout(() => {\n measureDroppableContainers(Array.isArray(ids.current) ? ids.current : [ids.current]);\n callbackId.current = null;\n }, resizeObserverTimeout);\n }, //eslint-disable-next-line react-hooks/exhaustive-deps\n [resizeObserverTimeout]);\n const resizeObserver = useResizeObserver({\n callback: handleResize,\n disabled: resizeObserverDisabled || !active\n });\n const handleNodeChange = useCallback((newElement, previousElement) => {\n if (!resizeObserver) {\n return;\n }\n\n if (previousElement) {\n resizeObserver.unobserve(previousElement);\n resizeObserverConnected.current = false;\n }\n\n if (newElement) {\n resizeObserver.observe(newElement);\n }\n }, [resizeObserver]);\n const [nodeRef, setNodeRef] = useNodeRef(handleNodeChange);\n const dataRef = useLatestValue(data);\n useEffect(() => {\n if (!resizeObserver || !nodeRef.current) {\n return;\n }\n\n resizeObserver.disconnect();\n resizeObserverConnected.current = false;\n resizeObserver.observe(nodeRef.current);\n }, [nodeRef, resizeObserver]);\n useEffect(() => {\n dispatch({\n type: Action.RegisterDroppable,\n element: {\n id,\n key,\n disabled,\n node: nodeRef,\n rect,\n data: dataRef\n }\n });\n return () => dispatch({\n type: Action.UnregisterDroppable,\n key,\n id\n });\n }, // eslint-disable-next-line react-hooks/exhaustive-deps\n [id]);\n useEffect(() => {\n if (disabled !== previous.current.disabled) {\n dispatch({\n type: Action.SetDroppableDisabled,\n id,\n key,\n disabled\n });\n previous.current.disabled = disabled;\n }\n }, [id, key, disabled, dispatch]);\n return {\n active,\n rect,\n isOver: (over == null ? void 0 : over.id) === id,\n node: nodeRef,\n over,\n setNodeRef\n };\n}\n\nfunction AnimationManager(_ref) {\n let {\n animation,\n children\n } = _ref;\n const [clonedChildren, setClonedChildren] = useState(null);\n const [element, setElement] = useState(null);\n const previousChildren = usePrevious(children);\n\n if (!children && !clonedChildren && previousChildren) {\n setClonedChildren(previousChildren);\n }\n\n useIsomorphicLayoutEffect(() => {\n if (!element) {\n return;\n }\n\n const key = clonedChildren == null ? void 0 : clonedChildren.key;\n const id = clonedChildren == null ? void 0 : clonedChildren.props.id;\n\n if (key == null || id == null) {\n setClonedChildren(null);\n return;\n }\n\n Promise.resolve(animation(id, element)).then(() => {\n setClonedChildren(null);\n });\n }, [animation, clonedChildren, element]);\n return React.createElement(React.Fragment, null, children, clonedChildren ? cloneElement(clonedChildren, {\n ref: setElement\n }) : null);\n}\n\nconst defaultTransform = {\n x: 0,\n y: 0,\n scaleX: 1,\n scaleY: 1\n};\nfunction NullifiedContextProvider(_ref) {\n let {\n children\n } = _ref;\n return React.createElement(InternalContext.Provider, {\n value: defaultInternalContext\n }, React.createElement(ActiveDraggableContext.Provider, {\n value: defaultTransform\n }, children));\n}\n\nconst baseStyles = {\n position: 'fixed',\n touchAction: 'none'\n};\n\nconst defaultTransition = activatorEvent => {\n const isKeyboardActivator = isKeyboardEvent(activatorEvent);\n return isKeyboardActivator ? 'transform 250ms ease' : undefined;\n};\n\nconst PositionedOverlay = /*#__PURE__*/forwardRef((_ref, ref) => {\n let {\n as,\n activatorEvent,\n adjustScale,\n children,\n className,\n rect,\n style,\n transform,\n transition = defaultTransition\n } = _ref;\n\n if (!rect) {\n return null;\n }\n\n const scaleAdjustedTransform = adjustScale ? transform : { ...transform,\n scaleX: 1,\n scaleY: 1\n };\n const styles = { ...baseStyles,\n width: rect.width,\n height: rect.height,\n top: rect.top,\n left: rect.left,\n transform: CSS.Transform.toString(scaleAdjustedTransform),\n transformOrigin: adjustScale && activatorEvent ? getRelativeTransformOrigin(activatorEvent, rect) : undefined,\n transition: typeof transition === 'function' ? transition(activatorEvent) : transition,\n ...style\n };\n return React.createElement(as, {\n className,\n style: styles,\n ref\n }, children);\n});\n\nconst defaultDropAnimationSideEffects = options => _ref => {\n let {\n active,\n dragOverlay\n } = _ref;\n const originalStyles = {};\n const {\n styles,\n className\n } = options;\n\n if (styles != null && styles.active) {\n for (const [key, value] of Object.entries(styles.active)) {\n if (value === undefined) {\n continue;\n }\n\n originalStyles[key] = active.node.style.getPropertyValue(key);\n active.node.style.setProperty(key, value);\n }\n }\n\n if (styles != null && styles.dragOverlay) {\n for (const [key, value] of Object.entries(styles.dragOverlay)) {\n if (value === undefined) {\n continue;\n }\n\n dragOverlay.node.style.setProperty(key, value);\n }\n }\n\n if (className != null && className.active) {\n active.node.classList.add(className.active);\n }\n\n if (className != null && className.dragOverlay) {\n dragOverlay.node.classList.add(className.dragOverlay);\n }\n\n return function cleanup() {\n for (const [key, value] of Object.entries(originalStyles)) {\n active.node.style.setProperty(key, value);\n }\n\n if (className != null && className.active) {\n active.node.classList.remove(className.active);\n }\n };\n};\n\nconst defaultKeyframeResolver = _ref2 => {\n let {\n transform: {\n initial,\n final\n }\n } = _ref2;\n return [{\n transform: CSS.Transform.toString(initial)\n }, {\n transform: CSS.Transform.toString(final)\n }];\n};\n\nconst defaultDropAnimationConfiguration = {\n duration: 250,\n easing: 'ease',\n keyframes: defaultKeyframeResolver,\n sideEffects: /*#__PURE__*/defaultDropAnimationSideEffects({\n styles: {\n active: {\n opacity: '0'\n }\n }\n })\n};\nfunction useDropAnimation(_ref3) {\n let {\n config,\n draggableNodes,\n droppableContainers,\n measuringConfiguration\n } = _ref3;\n return useEvent((id, node) => {\n if (config === null) {\n return;\n }\n\n const activeDraggable = draggableNodes.get(id);\n\n if (!activeDraggable) {\n return;\n }\n\n const activeNode = activeDraggable.node.current;\n\n if (!activeNode) {\n return;\n }\n\n const measurableNode = getMeasurableNode(node);\n\n if (!measurableNode) {\n return;\n }\n\n const {\n transform\n } = getWindow(node).getComputedStyle(node);\n const parsedTransform = parseTransform(transform);\n\n if (!parsedTransform) {\n return;\n }\n\n const animation = typeof config === 'function' ? config : createDefaultDropAnimation(config);\n scrollIntoViewIfNeeded(activeNode, measuringConfiguration.draggable.measure);\n return animation({\n active: {\n id,\n data: activeDraggable.data,\n node: activeNode,\n rect: measuringConfiguration.draggable.measure(activeNode)\n },\n draggableNodes,\n dragOverlay: {\n node,\n rect: measuringConfiguration.dragOverlay.measure(measurableNode)\n },\n droppableContainers,\n measuringConfiguration,\n transform: parsedTransform\n });\n });\n}\n\nfunction createDefaultDropAnimation(options) {\n const {\n duration,\n easing,\n sideEffects,\n keyframes\n } = { ...defaultDropAnimationConfiguration,\n ...options\n };\n return _ref4 => {\n let {\n active,\n dragOverlay,\n transform,\n ...rest\n } = _ref4;\n\n if (!duration) {\n // Do not animate if animation duration is zero.\n return;\n }\n\n const delta = {\n x: dragOverlay.rect.left - active.rect.left,\n y: dragOverlay.rect.top - active.rect.top\n };\n const scale = {\n scaleX: transform.scaleX !== 1 ? active.rect.width * transform.scaleX / dragOverlay.rect.width : 1,\n scaleY: transform.scaleY !== 1 ? active.rect.height * transform.scaleY / dragOverlay.rect.height : 1\n };\n const finalTransform = {\n x: transform.x - delta.x,\n y: transform.y - delta.y,\n ...scale\n };\n const animationKeyframes = keyframes({ ...rest,\n active,\n dragOverlay,\n transform: {\n initial: transform,\n final: finalTransform\n }\n });\n const [firstKeyframe] = animationKeyframes;\n const lastKeyframe = animationKeyframes[animationKeyframes.length - 1];\n\n if (JSON.stringify(firstKeyframe) === JSON.stringify(lastKeyframe)) {\n // The start and end keyframes are the same, infer that there is no animation needed.\n return;\n }\n\n const cleanup = sideEffects == null ? void 0 : sideEffects({\n active,\n dragOverlay,\n ...rest\n });\n const animation = dragOverlay.node.animate(animationKeyframes, {\n duration,\n easing,\n fill: 'forwards'\n });\n return new Promise(resolve => {\n animation.onfinish = () => {\n cleanup == null ? void 0 : cleanup();\n resolve();\n };\n });\n };\n}\n\nlet key = 0;\nfunction useKey(id) {\n return useMemo(() => {\n if (id == null) {\n return;\n }\n\n key++;\n return key;\n }, [id]);\n}\n\nconst DragOverlay = /*#__PURE__*/React.memo(_ref => {\n let {\n adjustScale = false,\n children,\n dropAnimation: dropAnimationConfig,\n style,\n transition,\n modifiers,\n wrapperElement = 'div',\n className,\n zIndex = 999\n } = _ref;\n const {\n activatorEvent,\n active,\n activeNodeRect,\n containerNodeRect,\n draggableNodes,\n droppableContainers,\n dragOverlay,\n over,\n measuringConfiguration,\n scrollableAncestors,\n scrollableAncestorRects,\n windowRect\n } = useDndContext();\n const transform = useContext(ActiveDraggableContext);\n const key = useKey(active == null ? void 0 : active.id);\n const modifiedTransform = applyModifiers(modifiers, {\n activatorEvent,\n active,\n activeNodeRect,\n containerNodeRect,\n draggingNodeRect: dragOverlay.rect,\n over,\n overlayNodeRect: dragOverlay.rect,\n scrollableAncestors,\n scrollableAncestorRects,\n transform,\n windowRect\n });\n const initialRect = useInitialValue(activeNodeRect);\n const dropAnimation = useDropAnimation({\n config: dropAnimationConfig,\n draggableNodes,\n droppableContainers,\n measuringConfiguration\n }); // We need to wait for the active node to be measured before connecting the drag overlay ref\n // otherwise collisions can be computed against a mispositioned drag overlay\n\n const ref = initialRect ? dragOverlay.setRef : undefined;\n return React.createElement(NullifiedContextProvider, null, React.createElement(AnimationManager, {\n animation: dropAnimation\n }, active && key ? React.createElement(PositionedOverlay, {\n key: key,\n id: active.id,\n ref: ref,\n as: wrapperElement,\n activatorEvent: activatorEvent,\n adjustScale: adjustScale,\n className: className,\n transition: transition,\n rect: initialRect,\n style: {\n zIndex,\n ...style\n },\n transform: modifiedTransform\n }, children) : null));\n});\n\nexport { AutoScrollActivator, DndContext, DragOverlay, KeyboardCode, KeyboardSensor, MeasuringFrequency, MeasuringStrategy, MouseSensor, PointerSensor, TouchSensor, TraversalOrder, applyModifiers, closestCenter, closestCorners, defaultAnnouncements, defaultCoordinates, defaultDropAnimationConfiguration as defaultDropAnimation, defaultDropAnimationSideEffects, defaultKeyboardCoordinateGetter, defaultScreenReaderInstructions, getClientRect, getFirstCollision, getScrollableAncestors, pointerWithin, rectIntersection, useDndContext, useDndMonitor, useDraggable, useDroppable, useSensor, useSensors };\n//# sourceMappingURL=core.esm.js.map\n","import React, { useMemo, useRef, useEffect, useState, useContext } from 'react';\nimport { useDndContext, getClientRect, useDroppable, useDraggable, closestCorners, getFirstCollision, getScrollableAncestors, KeyboardCode } from '@dnd-kit/core';\nimport { useUniqueId, useIsomorphicLayoutEffect, CSS, useCombinedRefs, isKeyboardEvent, subtract } from '@dnd-kit/utilities';\n\n/**\r\n * Move an array item to a different position. Returns a new array with the item moved to the new position.\r\n */\nfunction arrayMove(array, from, to) {\n const newArray = array.slice();\n newArray.splice(to < 0 ? newArray.length + to : to, 0, newArray.splice(from, 1)[0]);\n return newArray;\n}\n\n/**\r\n * Swap an array item to a different position. Returns a new array with the item swapped to the new position.\r\n */\nfunction arraySwap(array, from, to) {\n const newArray = array.slice();\n newArray[from] = array[to];\n newArray[to] = array[from];\n return newArray;\n}\n\nfunction getSortedRects(items, rects) {\n return items.reduce((accumulator, id, index) => {\n const rect = rects.get(id);\n\n if (rect) {\n accumulator[index] = rect;\n }\n\n return accumulator;\n }, Array(items.length));\n}\n\nfunction isValidIndex(index) {\n return index !== null && index >= 0;\n}\n\nfunction itemsEqual(a, b) {\n if (a === b) {\n return true;\n }\n\n if (a.length !== b.length) {\n return false;\n }\n\n for (let i = 0; i < a.length; i++) {\n if (a[i] !== b[i]) {\n return false;\n }\n }\n\n return true;\n}\n\nfunction normalizeDisabled(disabled) {\n if (typeof disabled === 'boolean') {\n return {\n draggable: disabled,\n droppable: disabled\n };\n }\n\n return disabled;\n}\n\n// To-do: We should be calculating scale transformation\nconst defaultScale = {\n scaleX: 1,\n scaleY: 1\n};\nconst horizontalListSortingStrategy = _ref => {\n var _rects$activeIndex;\n\n let {\n rects,\n activeNodeRect: fallbackActiveRect,\n activeIndex,\n overIndex,\n index\n } = _ref;\n const activeNodeRect = (_rects$activeIndex = rects[activeIndex]) != null ? _rects$activeIndex : fallbackActiveRect;\n\n if (!activeNodeRect) {\n return null;\n }\n\n const itemGap = getItemGap(rects, index, activeIndex);\n\n if (index === activeIndex) {\n const newIndexRect = rects[overIndex];\n\n if (!newIndexRect) {\n return null;\n }\n\n return {\n x: activeIndex < overIndex ? newIndexRect.left + newIndexRect.width - (activeNodeRect.left + activeNodeRect.width) : newIndexRect.left - activeNodeRect.left,\n y: 0,\n ...defaultScale\n };\n }\n\n if (index > activeIndex && index <= overIndex) {\n return {\n x: -activeNodeRect.width - itemGap,\n y: 0,\n ...defaultScale\n };\n }\n\n if (index < activeIndex && index >= overIndex) {\n return {\n x: activeNodeRect.width + itemGap,\n y: 0,\n ...defaultScale\n };\n }\n\n return {\n x: 0,\n y: 0,\n ...defaultScale\n };\n};\n\nfunction getItemGap(rects, index, activeIndex) {\n const currentRect = rects[index];\n const previousRect = rects[index - 1];\n const nextRect = rects[index + 1];\n\n if (!currentRect || !previousRect && !nextRect) {\n return 0;\n }\n\n if (activeIndex < index) {\n return previousRect ? currentRect.left - (previousRect.left + previousRect.width) : nextRect.left - (currentRect.left + currentRect.width);\n }\n\n return nextRect ? nextRect.left - (currentRect.left + currentRect.width) : currentRect.left - (previousRect.left + previousRect.width);\n}\n\nconst rectSortingStrategy = _ref => {\n let {\n rects,\n activeIndex,\n overIndex,\n index\n } = _ref;\n const newRects = arrayMove(rects, overIndex, activeIndex);\n const oldRect = rects[index];\n const newRect = newRects[index];\n\n if (!newRect || !oldRect) {\n return null;\n }\n\n return {\n x: newRect.left - oldRect.left,\n y: newRect.top - oldRect.top,\n scaleX: newRect.width / oldRect.width,\n scaleY: newRect.height / oldRect.height\n };\n};\n\nconst rectSwappingStrategy = _ref => {\n let {\n activeIndex,\n index,\n rects,\n overIndex\n } = _ref;\n let oldRect;\n let newRect;\n\n if (index === activeIndex) {\n oldRect = rects[index];\n newRect = rects[overIndex];\n }\n\n if (index === overIndex) {\n oldRect = rects[index];\n newRect = rects[activeIndex];\n }\n\n if (!newRect || !oldRect) {\n return null;\n }\n\n return {\n x: newRect.left - oldRect.left,\n y: newRect.top - oldRect.top,\n scaleX: newRect.width / oldRect.width,\n scaleY: newRect.height / oldRect.height\n };\n};\n\n// To-do: We should be calculating scale transformation\nconst defaultScale$1 = {\n scaleX: 1,\n scaleY: 1\n};\nconst verticalListSortingStrategy = _ref => {\n var _rects$activeIndex;\n\n let {\n activeIndex,\n activeNodeRect: fallbackActiveRect,\n index,\n rects,\n overIndex\n } = _ref;\n const activeNodeRect = (_rects$activeIndex = rects[activeIndex]) != null ? _rects$activeIndex : fallbackActiveRect;\n\n if (!activeNodeRect) {\n return null;\n }\n\n if (index === activeIndex) {\n const overIndexRect = rects[overIndex];\n\n if (!overIndexRect) {\n return null;\n }\n\n return {\n x: 0,\n y: activeIndex < overIndex ? overIndexRect.top + overIndexRect.height - (activeNodeRect.top + activeNodeRect.height) : overIndexRect.top - activeNodeRect.top,\n ...defaultScale$1\n };\n }\n\n const itemGap = getItemGap$1(rects, index, activeIndex);\n\n if (index > activeIndex && index <= overIndex) {\n return {\n x: 0,\n y: -activeNodeRect.height - itemGap,\n ...defaultScale$1\n };\n }\n\n if (index < activeIndex && index >= overIndex) {\n return {\n x: 0,\n y: activeNodeRect.height + itemGap,\n ...defaultScale$1\n };\n }\n\n return {\n x: 0,\n y: 0,\n ...defaultScale$1\n };\n};\n\nfunction getItemGap$1(clientRects, index, activeIndex) {\n const currentRect = clientRects[index];\n const previousRect = clientRects[index - 1];\n const nextRect = clientRects[index + 1];\n\n if (!currentRect) {\n return 0;\n }\n\n if (activeIndex < index) {\n return previousRect ? currentRect.top - (previousRect.top + previousRect.height) : nextRect ? nextRect.top - (currentRect.top + currentRect.height) : 0;\n }\n\n return nextRect ? nextRect.top - (currentRect.top + currentRect.height) : previousRect ? currentRect.top - (previousRect.top + previousRect.height) : 0;\n}\n\nconst ID_PREFIX = 'Sortable';\nconst Context = /*#__PURE__*/React.createContext({\n activeIndex: -1,\n containerId: ID_PREFIX,\n disableTransforms: false,\n items: [],\n overIndex: -1,\n useDragOverlay: false,\n sortedRects: [],\n strategy: rectSortingStrategy,\n disabled: {\n draggable: false,\n droppable: false\n }\n});\nfunction SortableContext(_ref) {\n let {\n children,\n id,\n items: userDefinedItems,\n strategy = rectSortingStrategy,\n disabled: disabledProp = false\n } = _ref;\n const {\n active,\n dragOverlay,\n droppableRects,\n over,\n measureDroppableContainers\n } = useDndContext();\n const containerId = useUniqueId(ID_PREFIX, id);\n const useDragOverlay = Boolean(dragOverlay.rect !== null);\n const items = useMemo(() => userDefinedItems.map(item => typeof item === 'object' && 'id' in item ? item.id : item), [userDefinedItems]);\n const isDragging = active != null;\n const activeIndex = active ? items.indexOf(active.id) : -1;\n const overIndex = over ? items.indexOf(over.id) : -1;\n const previousItemsRef = useRef(items);\n const itemsHaveChanged = !itemsEqual(items, previousItemsRef.current);\n const disableTransforms = overIndex !== -1 && activeIndex === -1 || itemsHaveChanged;\n const disabled = normalizeDisabled(disabledProp);\n useIsomorphicLayoutEffect(() => {\n if (itemsHaveChanged && isDragging) {\n measureDroppableContainers(items);\n }\n }, [itemsHaveChanged, items, isDragging, measureDroppableContainers]);\n useEffect(() => {\n previousItemsRef.current = items;\n }, [items]);\n const contextValue = useMemo(() => ({\n activeIndex,\n containerId,\n disabled,\n disableTransforms,\n items,\n overIndex,\n useDragOverlay,\n sortedRects: getSortedRects(items, droppableRects),\n strategy\n }), // eslint-disable-next-line react-hooks/exhaustive-deps\n [activeIndex, containerId, disabled.draggable, disabled.droppable, disableTransforms, items, overIndex, droppableRects, useDragOverlay, strategy]);\n return React.createElement(Context.Provider, {\n value: contextValue\n }, children);\n}\n\nconst defaultNewIndexGetter = _ref => {\n let {\n id,\n items,\n activeIndex,\n overIndex\n } = _ref;\n return arrayMove(items, activeIndex, overIndex).indexOf(id);\n};\nconst defaultAnimateLayoutChanges = _ref2 => {\n let {\n containerId,\n isSorting,\n wasDragging,\n index,\n items,\n newIndex,\n previousItems,\n previousContainerId,\n transition\n } = _ref2;\n\n if (!transition || !wasDragging) {\n return false;\n }\n\n if (previousItems !== items && index === newIndex) {\n return false;\n }\n\n if (isSorting) {\n return true;\n }\n\n return newIndex !== index && containerId === previousContainerId;\n};\nconst defaultTransition = {\n duration: 200,\n easing: 'ease'\n};\nconst transitionProperty = 'transform';\nconst disabledTransition = /*#__PURE__*/CSS.Transition.toString({\n property: transitionProperty,\n duration: 0,\n easing: 'linear'\n});\nconst defaultAttributes = {\n roleDescription: 'sortable'\n};\n\n/*\r\n * When the index of an item changes while sorting,\r\n * we need to temporarily disable the transforms\r\n */\n\nfunction useDerivedTransform(_ref) {\n let {\n disabled,\n index,\n node,\n rect\n } = _ref;\n const [derivedTransform, setDerivedtransform] = useState(null);\n const previousIndex = useRef(index);\n useIsomorphicLayoutEffect(() => {\n if (!disabled && index !== previousIndex.current && node.current) {\n const initial = rect.current;\n\n if (initial) {\n const current = getClientRect(node.current, {\n ignoreTransform: true\n });\n const delta = {\n x: initial.left - current.left,\n y: initial.top - current.top,\n scaleX: initial.width / current.width,\n scaleY: initial.height / current.height\n };\n\n if (delta.x || delta.y) {\n setDerivedtransform(delta);\n }\n }\n }\n\n if (index !== previousIndex.current) {\n previousIndex.current = index;\n }\n }, [disabled, index, node, rect]);\n useEffect(() => {\n if (derivedTransform) {\n setDerivedtransform(null);\n }\n }, [derivedTransform]);\n return derivedTransform;\n}\n\nfunction useSortable(_ref) {\n let {\n animateLayoutChanges = defaultAnimateLayoutChanges,\n attributes: userDefinedAttributes,\n disabled: localDisabled,\n data: customData,\n getNewIndex = defaultNewIndexGetter,\n id,\n strategy: localStrategy,\n resizeObserverConfig,\n transition = defaultTransition\n } = _ref;\n const {\n items,\n containerId,\n activeIndex,\n disabled: globalDisabled,\n disableTransforms,\n sortedRects,\n overIndex,\n useDragOverlay,\n strategy: globalStrategy\n } = useContext(Context);\n const disabled = normalizeLocalDisabled(localDisabled, globalDisabled);\n const index = items.indexOf(id);\n const data = useMemo(() => ({\n sortable: {\n containerId,\n index,\n items\n },\n ...customData\n }), [containerId, customData, index, items]);\n const itemsAfterCurrentSortable = useMemo(() => items.slice(items.indexOf(id)), [items, id]);\n const {\n rect,\n node,\n isOver,\n setNodeRef: setDroppableNodeRef\n } = useDroppable({\n id,\n data,\n disabled: disabled.droppable,\n resizeObserverConfig: {\n updateMeasurementsFor: itemsAfterCurrentSortable,\n ...resizeObserverConfig\n }\n });\n const {\n active,\n activatorEvent,\n activeNodeRect,\n attributes,\n setNodeRef: setDraggableNodeRef,\n listeners,\n isDragging,\n over,\n setActivatorNodeRef,\n transform\n } = useDraggable({\n id,\n data,\n attributes: { ...defaultAttributes,\n ...userDefinedAttributes\n },\n disabled: disabled.draggable\n });\n const setNodeRef = useCombinedRefs(setDroppableNodeRef, setDraggableNodeRef);\n const isSorting = Boolean(active);\n const displaceItem = isSorting && !disableTransforms && isValidIndex(activeIndex) && isValidIndex(overIndex);\n const shouldDisplaceDragSource = !useDragOverlay && isDragging;\n const dragSourceDisplacement = shouldDisplaceDragSource && displaceItem ? transform : null;\n const strategy = localStrategy != null ? localStrategy : globalStrategy;\n const finalTransform = displaceItem ? dragSourceDisplacement != null ? dragSourceDisplacement : strategy({\n rects: sortedRects,\n activeNodeRect,\n activeIndex,\n overIndex,\n index\n }) : null;\n const newIndex = isValidIndex(activeIndex) && isValidIndex(overIndex) ? getNewIndex({\n id,\n items,\n activeIndex,\n overIndex\n }) : index;\n const activeId = active == null ? void 0 : active.id;\n const previous = useRef({\n activeId,\n items,\n newIndex,\n containerId\n });\n const itemsHaveChanged = items !== previous.current.items;\n const shouldAnimateLayoutChanges = animateLayoutChanges({\n active,\n containerId,\n isDragging,\n isSorting,\n id,\n index,\n items,\n newIndex: previous.current.newIndex,\n previousItems: previous.current.items,\n previousContainerId: previous.current.containerId,\n transition,\n wasDragging: previous.current.activeId != null\n });\n const derivedTransform = useDerivedTransform({\n disabled: !shouldAnimateLayoutChanges,\n index,\n node,\n rect\n });\n useEffect(() => {\n if (isSorting && previous.current.newIndex !== newIndex) {\n previous.current.newIndex = newIndex;\n }\n\n if (containerId !== previous.current.containerId) {\n previous.current.containerId = containerId;\n }\n\n if (items !== previous.current.items) {\n previous.current.items = items;\n }\n }, [isSorting, newIndex, containerId, items]);\n useEffect(() => {\n if (activeId === previous.current.activeId) {\n return;\n }\n\n if (activeId != null && previous.current.activeId == null) {\n previous.current.activeId = activeId;\n return;\n }\n\n const timeoutId = setTimeout(() => {\n previous.current.activeId = activeId;\n }, 50);\n return () => clearTimeout(timeoutId);\n }, [activeId]);\n return {\n active,\n activeIndex,\n attributes,\n data,\n rect,\n index,\n newIndex,\n items,\n isOver,\n isSorting,\n isDragging,\n listeners,\n node,\n overIndex,\n over,\n setNodeRef,\n setActivatorNodeRef,\n setDroppableNodeRef,\n setDraggableNodeRef,\n transform: derivedTransform != null ? derivedTransform : finalTransform,\n transition: getTransition()\n };\n\n function getTransition() {\n if ( // Temporarily disable transitions for a single frame to set up derived transforms\n derivedTransform || // Or to prevent items jumping to back to their \"new\" position when items change\n itemsHaveChanged && previous.current.newIndex === index) {\n return disabledTransition;\n }\n\n if (shouldDisplaceDragSource && !isKeyboardEvent(activatorEvent) || !transition) {\n return undefined;\n }\n\n if (isSorting || shouldAnimateLayoutChanges) {\n return CSS.Transition.toString({ ...transition,\n property: transitionProperty\n });\n }\n\n return undefined;\n }\n}\n\nfunction normalizeLocalDisabled(localDisabled, globalDisabled) {\n var _localDisabled$dragga, _localDisabled$droppa;\n\n if (typeof localDisabled === 'boolean') {\n return {\n draggable: localDisabled,\n // Backwards compatibility\n droppable: false\n };\n }\n\n return {\n draggable: (_localDisabled$dragga = localDisabled == null ? void 0 : localDisabled.draggable) != null ? _localDisabled$dragga : globalDisabled.draggable,\n droppable: (_localDisabled$droppa = localDisabled == null ? void 0 : localDisabled.droppable) != null ? _localDisabled$droppa : globalDisabled.droppable\n };\n}\n\nfunction hasSortableData(entry) {\n if (!entry) {\n return false;\n }\n\n const data = entry.data.current;\n\n if (data && 'sortable' in data && typeof data.sortable === 'object' && 'containerId' in data.sortable && 'items' in data.sortable && 'index' in data.sortable) {\n return true;\n }\n\n return false;\n}\n\nconst directions = [KeyboardCode.Down, KeyboardCode.Right, KeyboardCode.Up, KeyboardCode.Left];\nconst sortableKeyboardCoordinates = (event, _ref) => {\n let {\n context: {\n active,\n collisionRect,\n droppableRects,\n droppableContainers,\n over,\n scrollableAncestors\n }\n } = _ref;\n\n if (directions.includes(event.code)) {\n event.preventDefault();\n\n if (!active || !collisionRect) {\n return;\n }\n\n const filteredContainers = [];\n droppableContainers.getEnabled().forEach(entry => {\n if (!entry || entry != null && entry.disabled) {\n return;\n }\n\n const rect = droppableRects.get(entry.id);\n\n if (!rect) {\n return;\n }\n\n switch (event.code) {\n case KeyboardCode.Down:\n if (collisionRect.top < rect.top) {\n filteredContainers.push(entry);\n }\n\n break;\n\n case KeyboardCode.Up:\n if (collisionRect.top > rect.top) {\n filteredContainers.push(entry);\n }\n\n break;\n\n case KeyboardCode.Left:\n if (collisionRect.left > rect.left) {\n filteredContainers.push(entry);\n }\n\n break;\n\n case KeyboardCode.Right:\n if (collisionRect.left < rect.left) {\n filteredContainers.push(entry);\n }\n\n break;\n }\n });\n const collisions = closestCorners({\n active,\n collisionRect: collisionRect,\n droppableRects,\n droppableContainers: filteredContainers,\n pointerCoordinates: null\n });\n let closestId = getFirstCollision(collisions, 'id');\n\n if (closestId === (over == null ? void 0 : over.id) && collisions.length > 1) {\n closestId = collisions[1].id;\n }\n\n if (closestId != null) {\n const activeDroppable = droppableContainers.get(active.id);\n const newDroppable = droppableContainers.get(closestId);\n const newRect = newDroppable ? droppableRects.get(newDroppable.id) : null;\n const newNode = newDroppable == null ? void 0 : newDroppable.node.current;\n\n if (newNode && newRect && activeDroppable && newDroppable) {\n const newScrollAncestors = getScrollableAncestors(newNode);\n const hasDifferentScrollAncestors = newScrollAncestors.some((element, index) => scrollableAncestors[index] !== element);\n const hasSameContainer = isSameContainer(activeDroppable, newDroppable);\n const isAfterActive = isAfter(activeDroppable, newDroppable);\n const offset = hasDifferentScrollAncestors || !hasSameContainer ? {\n x: 0,\n y: 0\n } : {\n x: isAfterActive ? collisionRect.width - newRect.width : 0,\n y: isAfterActive ? collisionRect.height - newRect.height : 0\n };\n const rectCoordinates = {\n x: newRect.left,\n y: newRect.top\n };\n const newCoordinates = offset.x && offset.y ? rectCoordinates : subtract(rectCoordinates, offset);\n return newCoordinates;\n }\n }\n }\n\n return undefined;\n};\n\nfunction isSameContainer(a, b) {\n if (!hasSortableData(a) || !hasSortableData(b)) {\n return false;\n }\n\n return a.data.current.sortable.containerId === b.data.current.sortable.containerId;\n}\n\nfunction isAfter(a, b) {\n if (!hasSortableData(a) || !hasSortableData(b)) {\n return false;\n }\n\n if (!isSameContainer(a, b)) {\n return false;\n }\n\n return a.data.current.sortable.index < b.data.current.sortable.index;\n}\n\nexport { SortableContext, arrayMove, arraySwap, defaultAnimateLayoutChanges, defaultNewIndexGetter, hasSortableData, horizontalListSortingStrategy, rectSortingStrategy, rectSwappingStrategy, sortableKeyboardCoordinates, useSortable, verticalListSortingStrategy };\n//# sourceMappingURL=sortable.esm.js.map\n","/**\n * useLayerDndKit - Touch-friendly drag-drop for layer reordering\n *\n * Replaces the HTML5-based useLayerDragDrop with @dnd-kit for proper\n * touch support on iOS Safari and mobile browsers.\n *\n * Drop position logic mirrors the original hook:\n * - Groups: top 25% = before, middle 50% = into, bottom 25% = after\n * - Non-groups: top/bottom split at midpoint\n *\n * Display order inversion is applied before callbacks (visual \"before\"\n * = array \"after\") since layers are shown in reverse z-order.\n *\n * ARCHITECTURE:\n *\n * Zone calculation (before/into/after) happens inside the custom\n * CollisionDetection function in LayersPanel.tsx. It runs on every\n * render during a drag and has direct access to pointerCoordinates\n * and droppable rects — no manual pointer tracking or React batching\n * issues.\n *\n * The zone is encoded in collision.data.zone and read here via\n * event.collisions. A ref ensures handleDragEnd always reads the\n * latest zone value.\n */\n\nimport { useState, useCallback, useRef } from 'react';\nimport {\n useSensor,\n useSensors,\n PointerSensor,\n KeyboardSensor,\n type DragStartEvent,\n type DragMoveEvent,\n type DragOverEvent,\n type DragEndEvent,\n type DragCancelEvent,\n} from '@dnd-kit/core';\nimport { sortableKeyboardCoordinates } from '@dnd-kit/sortable';\nimport { GroupElement } from '../core/GroupElement.js';\nimport type { EditorElement } from '../contexts/EditorContext.js';\n\nexport interface UseLayerDndKitOptions {\n onReorder: (draggedId: string, targetId: string, position: 'before' | 'after') => void;\n onGroupReorder?: (\n draggedId: string,\n targetId: string,\n position: 'before' | 'after',\n groupId: string\n ) => void;\n onDropIntoGroup?: (draggedId: string, groupId: string) => void;\n onDropIntoGroupAtPosition?: (\n draggedId: string,\n groupId: string,\n targetChildId: string,\n position: 'before' | 'after'\n ) => void;\n onRemoveFromGroup?: (draggedId: string) => void;\n findElement?: (id: string) => EditorElement | null;\n findParentGroup?: (id: string) => GroupElement | null;\n}\n\nexport interface UseLayerDndKitReturn {\n activeId: string | null;\n overId: string | null;\n dropPosition: 'before' | 'after' | 'into' | null;\n sensors: ReturnType<typeof useSensors>;\n onDragStart: (event: DragStartEvent) => void;\n onDragMove: (event: DragMoveEvent) => void;\n onDragOver: (event: DragOverEvent) => void;\n onDragEnd: (event: DragEndEvent) => void;\n onDragCancel: (event: DragCancelEvent) => void;\n}\n\n/** Extract zone from collision data set by layerCollisionDetection */\nfunction getZoneFromCollisions(\n collisions: DragOverEvent['collisions']\n): 'before' | 'after' | 'into' | null {\n if (!collisions || collisions.length === 0) return null;\n const zone = (collisions[0].data as Record<string, unknown>)?.zone;\n if (zone === 'before' || zone === 'after' || zone === 'into') return zone;\n return null;\n}\n\nexport function useLayerDndKit(options: UseLayerDndKitOptions): UseLayerDndKitReturn {\n const {\n onReorder,\n onGroupReorder,\n onDropIntoGroup,\n onDropIntoGroupAtPosition,\n onRemoveFromGroup,\n findParentGroup,\n } = options;\n\n // State for rendering (drives UI indicators)\n const [activeId, setActiveId] = useState<string | null>(null);\n const [overId, setOverId] = useState<string | null>(null);\n const [dropPosition, setDropPosition] = useState<'before' | 'after' | 'into' | null>(null);\n\n // Ref for synchronous access in onDragEnd (avoids React batching issues)\n const dropPositionRef = useRef<'before' | 'after' | 'into' | null>(null);\n\n const sensors = useSensors(\n useSensor(PointerSensor, {\n activationConstraint: {\n distance: 5,\n },\n }),\n useSensor(KeyboardSensor, {\n coordinateGetter: sortableKeyboardCoordinates,\n })\n );\n\n const handleDragStart = useCallback((event: DragStartEvent) => {\n setActiveId(String(event.active.id));\n }, []);\n\n // onDragOver: fires when overId changes\n const handleDragOver = useCallback(\n (event: DragOverEvent) => {\n const { over, collisions } = event;\n setOverId(over ? String(over.id) : null);\n const zone = getZoneFromCollisions(collisions);\n dropPositionRef.current = zone;\n setDropPosition(zone);\n },\n []\n );\n\n // onDragMove: fires on every pointer movement — update zone from collisions\n const handleDragMove = useCallback(\n (event: DragMoveEvent) => {\n const { collisions } = event;\n const zone = getZoneFromCollisions(collisions);\n dropPositionRef.current = zone;\n setDropPosition(zone);\n },\n []\n );\n\n const resetState = useCallback(() => {\n dropPositionRef.current = null;\n setActiveId(null);\n setOverId(null);\n setDropPosition(null);\n }, []);\n\n const handleDragEnd = useCallback(\n (event: DragEndEvent) => {\n const { active, over } = event;\n // Read from ref for guaranteed latest value\n const currentDropPosition = dropPositionRef.current;\n\n if (!over || active.id === over.id || !currentDropPosition) {\n resetState();\n return;\n }\n\n const draggedId = String(active.id);\n const targetId = String(over.id);\n\n // Group footer drop zone — below a group's children\n if (targetId.startsWith('group-footer::')) {\n const groupId = targetId.replace('group-footer::', '');\n const draggedParent = findParentGroup?.(draggedId);\n\n if (draggedParent && draggedParent.id === groupId) {\n // Dragged from inside the same group → promote to top level\n onRemoveFromGroup?.(draggedId);\n } else {\n // Dragged from outside (top-level or different group) → reorder after the group\n // Visual \"after\" (below) in reverse display = \"before\" in array order\n onReorder(draggedId, groupId, 'before');\n }\n resetState();\n return;\n }\n\n if (currentDropPosition === 'into') {\n onDropIntoGroup?.(draggedId, targetId);\n } else {\n // Invert position for display order (layers shown in reverse z-order)\n const arrayPosition = currentDropPosition === 'before' ? 'after' : 'before';\n\n const draggedParent = findParentGroup?.(draggedId);\n const targetParent = findParentGroup?.(targetId);\n\n if (draggedParent && targetParent && draggedParent.id === targetParent.id) {\n onGroupReorder?.(draggedId, targetId, arrayPosition, draggedParent.id!);\n } else if (!draggedParent && targetParent && onDropIntoGroupAtPosition) {\n onDropIntoGroupAtPosition(draggedId, targetParent.id!, targetId, arrayPosition);\n } else {\n onReorder(draggedId, targetId, arrayPosition);\n }\n }\n\n resetState();\n },\n [\n onReorder,\n onGroupReorder,\n onDropIntoGroup,\n onDropIntoGroupAtPosition,\n onRemoveFromGroup,\n findParentGroup,\n resetState,\n ]\n );\n\n const handleDragCancel = useCallback(() => {\n resetState();\n }, [resetState]);\n\n return {\n activeId,\n overId,\n dropPosition,\n sensors,\n onDragStart: handleDragStart,\n onDragMove: handleDragMove,\n onDragOver: handleDragOver,\n onDragEnd: handleDragEnd,\n onDragCancel: handleDragCancel,\n };\n}\n","/**\n * LayersPanel - Standalone layer management component\n * Uses useLayers hook for data and operations.\n * Supports touch-friendly drag-to-reorder via @dnd-kit.\n * Groups displayed as folder structure with visual indentation.\n */\n\nimport React, { useEffect, useMemo, useCallback } from 'react';\nimport { useLayers, type UseLayersOptions, type LayerInfo } from '../../hooks/useLayers.js';\nimport { useArtboards } from '../../hooks/useArtboards.js';\nimport { useIsLayerBound } from '../../contexts/BoundLayerGuardContext.js';\nimport { useLayerDndKit } from '../../hooks/useLayerDndKit.js';\nimport { Icon } from '@iconify/react';\nimport { icons } from '../ui';\nimport {\n DndContext,\n DragOverlay,\n closestCenter,\n pointerWithin,\n useDroppable,\n useDraggable,\n type CollisionDetection,\n} from '@dnd-kit/core';\n\n// Custom collision detection that computes drop zones (before/into/after)\n// and encodes them in the collision data. This runs on every pointer movement\n// during render, so the zone is always fresh — no React batching issues.\nconst layerCollisionDetection: CollisionDetection = (args) => {\n const { pointerCoordinates, droppableContainers, droppableRects } = args;\n\n // Prefer pointer-based collision (accurate for small group targets),\n // fall back to closest-center when pointer is between items.\n let collisions = pointerWithin(args);\n if (collisions.length === 0) {\n collisions = closestCenter(args);\n }\n if (collisions.length === 0 || !pointerCoordinates) return collisions;\n\n // Enrich the winning collision with zone data\n const winner = collisions[0];\n\n // Group footer drop zones don't need zone calculation\n if (String(winner.id).startsWith('group-footer::')) {\n return [{ ...winner, data: { ...winner.data, zone: 'after' } }];\n }\n\n const rect = droppableRects.get(winner.id);\n if (!rect) return collisions;\n\n const relativeY = pointerCoordinates.y - rect.top;\n const height = rect.height;\n\n // Look up isGroup from the droppable's data prop\n const container = droppableContainers.find((c) => c.id === winner.id);\n const isGroup = container?.data?.current?.isGroup === true;\n\n let zone: 'before' | 'after' | 'into';\n if (isGroup) {\n if (relativeY < height * 0.25) zone = 'before';\n else if (relativeY > height * 0.75) zone = 'after';\n else zone = 'into';\n } else {\n zone = relativeY < height / 2 ? 'before' : 'after';\n }\n\n // Return collision with zone encoded in data\n return [{\n ...winner,\n data: { ...winner.data, zone },\n }];\n};\n\nexport interface LayersPanelProps extends UseLayersOptions {\n width?: number;\n height?: number;\n showPreviewImages?: boolean;\n enableDragReorder?: boolean;\n enableGrouping?: boolean;\n style?: React.CSSProperties;\n className?: string;\n showHeader?: boolean;\n}\n\n// ── Sortable layer item ──────────────────────────────────────────────────\n\ninterface SortableLayerItemProps {\n layer: LayerInfo;\n isOver: boolean;\n dropPosition: 'before' | 'after' | 'into' | null;\n isDragActive: boolean;\n showPreviewImages: boolean;\n previewDisplaySize: number;\n onSelect: (id: string) => void;\n onToggleVisibility: (id: string) => void;\n onToggleLock: (id: string) => void;\n onDuplicate: (id: string) => void;\n onDelete: (id: string) => void;\n /** Hide the delete affordance — the layer is bound by a mounted\n * Editor.TextField (ADR-0085 §3, E_BOUND_LAYER_MUTATION). */\n deleteSuppressed?: boolean;\n}\n\nconst SortableLayerItem: React.FC<SortableLayerItemProps> = ({\n layer,\n isOver,\n dropPosition,\n isDragActive,\n showPreviewImages,\n previewDisplaySize,\n onSelect,\n onToggleVisibility,\n onToggleLock,\n onDuplicate,\n onDelete,\n deleteSuppressed,\n}) => {\n const { attributes, listeners, setNodeRef: setDragRef, isDragging } = useDraggable({ id: layer.id });\n const { setNodeRef: setDropRef } = useDroppable({ id: layer.id, data: { isGroup: !!layer.isGroup } });\n\n // Merge refs so the same DOM node is both draggable and droppable\n const setNodeRef = useCallback((node: HTMLElement | null) => {\n setDragRef(node);\n setDropRef(node);\n }, [setDragRef, setDropRef]);\n\n const isGroupRow = layer.isGroup;\n const isChild = layer.depth > 0;\n const indentPx = isChild ? layer.depth * 24 : 0;\n\n const style: React.CSSProperties = {\n opacity: isDragging ? 0.3 : 1,\n paddingLeft: indentPx + 8,\n paddingRight: 8,\n paddingTop: isGroupRow ? 6 : 8,\n paddingBottom: isGroupRow ? 6 : 8,\n minHeight: isGroupRow ? 32 : 36,\n display: 'flex',\n alignItems: 'center',\n gap: 8,\n cursor: 'pointer',\n position: 'relative',\n touchAction: 'manipulation',\n };\n\n // Group rows and children get a light gray background\n if (isChild || isGroupRow) {\n style.backgroundColor = 'var(--surface-secondary, rgba(0,0,0,0.04))';\n }\n\n // Drop indicator styles\n if (isOver && !isDragging) {\n if (dropPosition === 'before') {\n style.borderTop = '2px solid var(--primary, var(--accent-primary, #007AFF))';\n } else if (dropPosition === 'after') {\n style.borderBottom = '2px solid var(--primary, var(--accent-primary, #007AFF))';\n } else if (dropPosition === 'into') {\n style.outline = '2px solid var(--primary, var(--accent-primary, #007AFF))';\n style.outlineOffset = '-2px';\n style.backgroundColor = 'var(--accent-primary-alpha, rgba(0, 122, 255, 0.08))';\n }\n }\n\n const selectionRingStyle = layer.isSelected\n ? {\n outline: '3px solid var(--primary, var(--accent-primary, #007AFF))',\n outlineOffset: '2px',\n }\n : {};\n\n const handleClick = () => onSelect(layer.id);\n\n // Drag handle — the only element with `{...listeners}` and\n // `touchAction: 'none'`. This is what reserves a touch sequence\n // for dnd-kit. Everything outside this handle stays freely\n // tappable / scrollable, so the drawer's vertical scroll engages\n // when the user starts a touch on the rest of the row.\n const dragHandle = (\n <span\n {...listeners}\n aria-label=\"Drag to reorder\"\n title=\"Drag to reorder\"\n style={{\n touchAction: 'none',\n cursor: 'grab',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n // Wide enough to be an easy touch target on mobile (≥ 36px)\n // and visually reads as a deliberate \"grab here\" affordance\n // rather than a tiny indicator squished between the row edge\n // and the thumbnail.\n width: 36,\n alignSelf: 'stretch',\n marginLeft: -4,\n marginRight: 4,\n flexShrink: 0,\n color: 'var(--text-secondary, #888)',\n opacity: 0.6,\n }}\n >\n <Icon icon=\"lucide:grip-vertical\" style={{ fontSize: 24 }} />\n </span>\n );\n\n // Group folder row\n if (isGroupRow) {\n return (\n <div ref={setNodeRef} style={style} {...attributes}>\n {dragHandle}\n <Icon\n icon=\"lucide:folder-open\"\n style={{ fontSize: 18, color: 'var(--text-secondary, #888)', flexShrink: 0 }}\n />\n <span\n onClick={handleClick}\n style={{\n fontSize: 13,\n fontWeight: 600,\n color: 'var(--foreground, #333)',\n flex: 1,\n minWidth: 0,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n }}\n >\n {layer.name}\n </span>\n {!isDragActive && !deleteSuppressed && (!layer.children || layer.children.length === 0) && (\n <div style={{ display: 'flex', gap: 4, flexShrink: 0 }}>\n <LayerActionButton\n title=\"Delete Group\"\n onClick={() => onDelete(layer.id)}\n style={{ color: 'var(--error, #ef4444)' }}\n >\n <Icon icon={icons.trash} className=\"sc:size-6\" />\n </LayerActionButton>\n </div>\n )}\n </div>\n );\n }\n\n // Regular layer row\n return (\n <div ref={setNodeRef} style={style} {...attributes}>\n {dragHandle}\n {showPreviewImages && layer.previewUrl ? (\n <img\n src={layer.previewUrl}\n alt={layer.name}\n onClick={handleClick}\n style={{\n width: previewDisplaySize,\n height: previewDisplaySize,\n objectFit: 'contain',\n borderRadius: 4,\n border: '1px solid var(--border-primary, #e5e5e5)',\n cursor: 'pointer',\n flexShrink: 0,\n ...selectionRingStyle,\n }}\n />\n ) : (\n <div\n style={{\n width: previewDisplaySize,\n height: previewDisplaySize,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n fontSize: 24,\n opacity: 0.6,\n border: '1px solid var(--border-primary, #e5e5e5)',\n borderRadius: 4,\n cursor: 'pointer',\n flexShrink: 0,\n ...selectionRingStyle,\n }}\n onClick={handleClick}\n >\n <Icon icon={icons.fileText} />\n </div>\n )}\n {/* Spacer / tap area — drag listeners no longer span this, so\n it stays freely scrollable on touch. */}\n <div style={{ flex: 1, minWidth: 0 }} onClick={handleClick} />\n\n {/* Actions */}\n {!isDragActive && (\n <div style={{ display: 'flex', gap: 4, flexShrink: 0 }}>\n <LayerActionButton\n title={layer.visible ? 'Hide' : 'Show'}\n onClick={() => onToggleVisibility(layer.id)}\n style={{ opacity: layer.visible ? 1 : 0.4 }}\n >\n <Icon icon={layer.visible ? icons.eye : icons.eyeOff} className=\"sc:size-6\" />\n </LayerActionButton>\n <LayerActionButton\n title={layer.locked ? 'Unlock' : 'Lock'}\n onClick={() => onToggleLock(layer.id)}\n style={{ opacity: layer.locked ? 1 : 0.4 }}\n >\n <Icon icon={layer.locked ? icons.lock : icons.lockOpen} className=\"sc:size-6\" />\n </LayerActionButton>\n <LayerActionButton title=\"Duplicate\" onClick={() => onDuplicate(layer.id)}>\n <Icon icon={icons.copy} className=\"sc:size-6\" />\n </LayerActionButton>\n {!deleteSuppressed && (\n <LayerActionButton\n title=\"Delete\"\n onClick={() => onDelete(layer.id)}\n style={{ color: 'var(--error, #ef4444)' }}\n >\n <Icon icon={icons.trash} className=\"sc:size-6\" />\n </LayerActionButton>\n )}\n </div>\n )}\n </div>\n );\n};\n\n/** Small action button used in layer items */\nconst LayerActionButton: React.FC<{\n title: string;\n onClick: () => void;\n style?: React.CSSProperties;\n children: React.ReactNode;\n}> = ({ title, onClick, style: extraStyle, children }) => (\n <button\n onClick={(e) => { e.stopPropagation(); onClick(); }}\n style={{\n background: 'none',\n border: 'none',\n cursor: 'pointer',\n padding: 4,\n opacity: 0.6,\n ...extraStyle,\n }}\n title={title}\n >\n {children}\n </button>\n);\n\n// ── Group footer drop zone (allows dragging items out below a group) ─────\n\nconst GroupFooterDropZone: React.FC<{\n groupId: string;\n isOver: boolean;\n depth: number;\n}> = ({ groupId, isOver, depth }) => {\n const { setNodeRef } = useDroppable({ id: `group-footer::${groupId}` });\n const indentPx = (depth + 1) * 24;\n\n return (\n <div\n ref={setNodeRef}\n style={{\n height: 8,\n marginLeft: indentPx,\n position: 'relative',\n ...(isOver ? {\n borderBottom: '2px solid var(--primary, var(--accent-primary, #007AFF))',\n } : {}),\n }}\n />\n );\n};\n\n// ── Drag overlay content ─────────────────────────────────────────────────\n\nconst DragOverlayContent: React.FC<{\n layer: LayerInfo;\n showPreviewImages: boolean;\n previewDisplaySize: number;\n}> = ({ layer, showPreviewImages, previewDisplaySize }) => (\n <div\n style={{\n paddingLeft: 8,\n paddingRight: 8,\n paddingTop: 8,\n paddingBottom: 8,\n display: 'flex',\n alignItems: 'center',\n gap: 8,\n backgroundColor: 'var(--surface, #fff)',\n borderRadius: 8,\n boxShadow: '0 4px 16px rgba(0,0,0,0.15)',\n opacity: 0.9,\n }}\n >\n {layer.isGroup ? (\n <Icon icon=\"lucide:folder-open\" style={{ fontSize: 18, color: 'var(--text-secondary, #888)' }} />\n ) : showPreviewImages && layer.previewUrl ? (\n <img\n src={layer.previewUrl}\n alt={layer.name}\n style={{\n width: previewDisplaySize,\n height: previewDisplaySize,\n objectFit: 'contain',\n borderRadius: 4,\n border: '1px solid var(--border-primary, #e5e5e5)',\n }}\n />\n ) : (\n <div\n style={{\n width: previewDisplaySize,\n height: previewDisplaySize,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n fontSize: 24,\n opacity: 0.6,\n border: '1px solid var(--border-primary, #e5e5e5)',\n borderRadius: 4,\n }}\n >\n <Icon icon={icons.fileText} />\n </div>\n )}\n <span style={{ fontSize: 13, color: 'var(--foreground, #333)' }}>{layer.name}</span>\n </div>\n);\n\n// ── Main panel ───────────────────────────────────────────────────────────\n\nexport const LayersPanel: React.FC<LayersPanelProps> = ({\n width = 250,\n height,\n showPreviewImages = true,\n enableDragReorder = false,\n enableGrouping = false,\n style = {},\n className = '',\n showHeader = true,\n ...layerOptions\n}) => {\n const { activeArtboard } = useArtboards();\n const previewBgColor = activeArtboard?.previewBackgroundColor || activeArtboard?.backgroundColor || 'transparent';\n const previewDisplaySize = 80;\n const previewResolution = 160;\n\n const {\n layers,\n flatLayers,\n selectLayer,\n toggleVisibility,\n toggleLock,\n deleteLayer,\n duplicateLayer,\n reorderById,\n reorderWithinGroup,\n addToGroup,\n removeFromGroup,\n createEmptyGroup,\n findElementById,\n findParentGroup,\n generateAllPreviews,\n } = useLayers({\n ...layerOptions,\n previewSize: previewResolution,\n previewBackgroundColor: previewBgColor,\n });\n\n useEffect(() => {\n if (showPreviewImages && flatLayers.length > 0) {\n generateAllPreviews();\n }\n }, [showPreviewImages, flatLayers.length, previewBgColor, generateAllPreviews]);\n\n // Bound-layer suppression (ADR-0085 §3): hide the delete affordance for\n // layers a mounted <Editor.TextField> is bound to — the invalid state must\n // be unreachable from the UI (the command path additionally throws\n // E_BOUND_LAYER_MUTATION for programmatic callers). Always false outside\n // an <Editor.Root>. Uses the ELEMENT's name (LayerInfo.name carries a\n // display fallback for unnamed layers).\n const isLayerBound = useIsLayerBound();\n const isDeleteSuppressed = useCallback(\n (layer: LayerInfo) => isLayerBound(findElementById(layer.id)?.name),\n [isLayerBound, findElementById],\n );\n\n // Build a lookup map for finding layers by ID\n const layerMap = useMemo(() => {\n const map = new Map<string, LayerInfo>();\n const collect = (layerList: LayerInfo[]) => {\n for (const layer of layerList) {\n map.set(layer.id, layer);\n if (layer.children) collect(layer.children);\n }\n };\n collect(layers);\n return map;\n }, [layers]);\n\n // When a child is dragged to a top-level position, remove it from its group.\n // removeFromGroup handles everything: clones the child with absolute positioning,\n // updates/removes the group, adds the promoted element, and selects it.\n // No follow-up reorder — it causes state conflicts since removeFromGroup\n // already mutates the element list.\n const handleReorder = useCallback(\n (draggedId: string, targetId: string, position: 'before' | 'after') => {\n const draggedParent = findParentGroup(draggedId);\n const targetParent = findParentGroup(targetId);\n\n if (draggedParent && !targetParent) {\n removeFromGroup(draggedId, targetId, position);\n } else {\n reorderById(draggedId, targetId, position);\n }\n },\n [findParentGroup, removeFromGroup, reorderById]\n );\n\n // dnd-kit hook\n const activeDnd = useLayerDndKit({\n onReorder: handleReorder,\n onDropIntoGroup: addToGroup,\n onDropIntoGroupAtPosition: (draggedId, groupId) => addToGroup(draggedId, groupId),\n onGroupReorder: reorderWithinGroup,\n onRemoveFromGroup: removeFromGroup,\n findElement: findElementById,\n findParentGroup,\n });\n\n // ── Render helpers ─────────────────────────────────────────────────────\n\n const renderDraggableLayerTree = (layerList: LayerInfo[]): React.ReactNode => {\n const reversedList = [...layerList].reverse();\n return reversedList.map((layer) => (\n <React.Fragment key={layer.id}>\n <SortableLayerItem\n layer={layer}\n isOver={activeDnd.overId === layer.id}\n dropPosition={activeDnd.overId === layer.id ? activeDnd.dropPosition : null}\n isDragActive={!!activeDnd.activeId}\n showPreviewImages={showPreviewImages}\n previewDisplaySize={previewDisplaySize}\n onSelect={selectLayer}\n onToggleVisibility={toggleVisibility}\n onToggleLock={toggleLock}\n onDuplicate={duplicateLayer}\n onDelete={deleteLayer}\n deleteSuppressed={isDeleteSuppressed(layer)}\n />\n {layer.children && renderDraggableLayerTree(layer.children)}\n {layer.isGroup && (\n <GroupFooterDropZone\n groupId={layer.id}\n isOver={activeDnd.overId === `group-footer::${layer.id}`}\n depth={layer.depth}\n />\n )}\n </React.Fragment>\n ));\n };\n\n const renderStaticLayerTree = (layerList: LayerInfo[]): React.ReactNode => {\n const reversedList = [...layerList].reverse();\n return reversedList.map((layer) => (\n <React.Fragment key={layer.id}>\n <StaticLayerItem\n layer={layer}\n showPreviewImages={showPreviewImages}\n previewDisplaySize={previewDisplaySize}\n onSelect={selectLayer}\n onToggleVisibility={toggleVisibility}\n onToggleLock={toggleLock}\n onDuplicate={duplicateLayer}\n onDelete={deleteLayer}\n deleteSuppressed={isDeleteSuppressed(layer)}\n />\n {layer.children && renderStaticLayerTree(layer.children)}\n </React.Fragment>\n ));\n };\n\n // Active drag overlay\n const activeLayer = activeDnd.activeId ? layerMap.get(activeDnd.activeId) : null;\n\n // ── Layout ─────────────────────────────────────────────────────────────\n\n const { width: styleWidth, height: styleHeight, flex, ...restStyle } = style;\n const finalWidth = styleWidth ? styleWidth : className.includes('w-full') ? '100%' : width ? `${width}px` : undefined;\n const finalHeight = height || styleHeight || undefined;\n const shouldFill = finalHeight === '100%' || finalHeight === '100vh';\n const flexValue = flex !== undefined ? flex : shouldFill ? 1 : undefined;\n\n return (\n <div\n className={`sc-layers-panel ${className}`}\n style={{\n width: finalWidth,\n height: finalHeight,\n flex: flexValue,\n display: 'flex',\n flexDirection: 'column',\n backgroundColor: 'transparent',\n minHeight: 0,\n ...restStyle,\n }}\n >\n {/* Header */}\n {(showHeader || enableGrouping) && (\n <div\n style={{\n padding: '10px 16px',\n borderBottom: '1px solid var(--border-primary, #e5e5e5)',\n fontWeight: 500,\n fontSize: 13,\n color: 'var(--text-secondary, #666)',\n flexShrink: 0,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n }}\n >\n {showHeader && <span>Layers ({flatLayers.length})</span>}\n {!showHeader && <span />}\n {enableGrouping && (\n <button\n onClick={createEmptyGroup}\n style={{\n background: 'none',\n border: 'none',\n cursor: 'pointer',\n fontSize: 13,\n fontWeight: 500,\n color: 'var(--primary, var(--accent-primary, #007AFF))',\n display: 'flex',\n alignItems: 'center',\n gap: 4,\n }}\n >\n <Icon icon=\"lucide:folder-plus\" style={{ fontSize: 16 }} />\n Add Group\n </button>\n )}\n </div>\n )}\n\n <div style={{ flex: 1, overflow: 'auto', minHeight: 0 }}>\n {layers.length > 0 ? (\n enableDragReorder ? (\n <DndContext\n sensors={activeDnd.sensors}\n collisionDetection={layerCollisionDetection}\n onDragStart={activeDnd.onDragStart}\n onDragMove={activeDnd.onDragMove}\n onDragOver={activeDnd.onDragOver}\n onDragEnd={activeDnd.onDragEnd}\n onDragCancel={activeDnd.onDragCancel}\n >\n {renderDraggableLayerTree(layers)}\n <DragOverlay dropAnimation={null}>\n {activeLayer ? (\n <DragOverlayContent\n layer={activeLayer}\n showPreviewImages={showPreviewImages}\n previewDisplaySize={previewDisplaySize}\n />\n ) : null}\n </DragOverlay>\n </DndContext>\n ) : (\n renderStaticLayerTree(layers)\n )\n ) : (\n <div\n style={{\n padding: 24,\n textAlign: 'center',\n color: 'var(--text-secondary, #999)',\n fontSize: 12,\n }}\n >\n No layers\n </div>\n )}\n\n {/* Drag hint */}\n {enableDragReorder && layers.length > 1 && (\n <div\n style={{\n padding: '12px 16px',\n textAlign: 'center',\n color: 'var(--text-secondary, #aaa)',\n fontSize: 12,\n }}\n >\n Drag to reorder\n </div>\n )}\n </div>\n </div>\n );\n};\n\n// ── Static layer item (no drag) ──────────────────────────────────────────\n\nconst StaticLayerItem: React.FC<{\n layer: LayerInfo;\n showPreviewImages: boolean;\n previewDisplaySize: number;\n onSelect: (id: string) => void;\n onToggleVisibility: (id: string) => void;\n onToggleLock: (id: string) => void;\n onDuplicate: (id: string) => void;\n onDelete: (id: string) => void;\n deleteSuppressed?: boolean;\n}> = ({ layer, showPreviewImages, previewDisplaySize, onSelect, onToggleVisibility, onToggleLock, onDuplicate, onDelete, deleteSuppressed }) => {\n const isChild = layer.depth > 0;\n const indentPx = isChild ? layer.depth * 24 : 0;\n\n const selectionRingStyle = layer.isSelected\n ? { outline: '3px solid var(--primary, var(--accent-primary, #007AFF))', outlineOffset: '2px' }\n : {};\n\n const rowStyle: React.CSSProperties = {\n paddingLeft: indentPx + 8,\n paddingRight: 8,\n paddingTop: layer.isGroup ? 6 : 8,\n paddingBottom: layer.isGroup ? 6 : 8,\n minHeight: layer.isGroup ? 32 : 36,\n display: 'flex',\n alignItems: 'center',\n gap: 8,\n cursor: 'pointer',\n };\n\n if (isChild || layer.isGroup) {\n rowStyle.backgroundColor = 'var(--surface-secondary, rgba(0,0,0,0.04))';\n }\n\n if (layer.isGroup) {\n return (\n <div key={layer.id} style={rowStyle}>\n <Icon icon=\"lucide:folder-open\" style={{ fontSize: 18, color: 'var(--text-secondary, #888)' }} />\n <span onClick={() => onSelect(layer.id)} style={{ fontSize: 13, fontWeight: 600, flex: 1 }}>\n {layer.name}\n </span>\n </div>\n );\n }\n\n return (\n <div key={layer.id} style={rowStyle}>\n {showPreviewImages && layer.previewUrl ? (\n <img\n src={layer.previewUrl}\n alt={layer.name}\n onClick={() => onSelect(layer.id)}\n style={{\n width: previewDisplaySize,\n height: previewDisplaySize,\n objectFit: 'contain',\n borderRadius: 4,\n border: '1px solid var(--border-primary, #e5e5e5)',\n cursor: 'pointer',\n ...selectionRingStyle,\n }}\n />\n ) : (\n <div\n style={{\n width: previewDisplaySize,\n height: previewDisplaySize,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n fontSize: 24,\n opacity: 0.6,\n border: '1px solid var(--border-primary, #e5e5e5)',\n borderRadius: 4,\n cursor: 'pointer',\n ...selectionRingStyle,\n }}\n onClick={() => onSelect(layer.id)}\n >\n <Icon icon={icons.fileText} />\n </div>\n )}\n <div style={{ flex: 1 }} onClick={() => onSelect(layer.id)} />\n <div style={{ display: 'flex', gap: 4 }}>\n <LayerActionButton\n title={layer.visible ? 'Hide' : 'Show'}\n onClick={() => onToggleVisibility(layer.id)}\n style={{ opacity: layer.visible ? 1 : 0.4 }}\n >\n <Icon icon={layer.visible ? icons.eye : icons.eyeOff} className=\"sc:size-6\" />\n </LayerActionButton>\n <LayerActionButton\n title={layer.locked ? 'Unlock' : 'Lock'}\n onClick={() => onToggleLock(layer.id)}\n style={{ opacity: layer.locked ? 1 : 0.4 }}\n >\n <Icon icon={layer.locked ? icons.lock : icons.lockOpen} className=\"sc:size-6\" />\n </LayerActionButton>\n <LayerActionButton title=\"Duplicate\" onClick={() => onDuplicate(layer.id)}>\n <Icon icon={icons.copy} className=\"sc:size-6\" />\n </LayerActionButton>\n {!deleteSuppressed && (\n <LayerActionButton\n title=\"Delete\"\n onClick={() => onDelete(layer.id)}\n style={{ color: 'var(--error, #ef4444)' }}\n >\n <Icon icon={icons.trash} className=\"sc:size-6\" />\n </LayerActionButton>\n )}\n </div>\n </div>\n );\n};\n","'use client';\n\n/**\n * Internal plumbing every `Editor.*` part shares: the part registry, the\n * invariant/error reporting channel into Root's error state, and the\n * outside-Root guard.\n *\n * Registry mechanics (ADR-0085 §4): parts register in layout effects; React\n * runs parent effects after children, so `Editor.Root`'s own layout effect\n * sees the complete registry once per commit and is the single validation\n * point — no per-part polling, no false throws while the Canvas chunk\n * lazy-loads (registration is by the `Editor.Canvas` COMPONENT mount, not the\n * chunk's arrival). The registry exists for exactly four jobs: the\n * duplicate-Canvas throw, the TextField required-layer list for Buy,\n * requires-canvas validation, and the part census the composition audit\n * reads (`Editor.audit()`, #10).\n */\n\nimport { createContext, useContext, useId, useLayoutEffect, useMemo } from 'react';\nimport { EditorError, isDevOrTest } from '../../errors/editorError.js';\nimport { recordContainedEditorError } from '../../testing/editorErrors.js';\nimport type { DesignStateStore } from './designStateStore.js';\nimport type { CommerceStateStore } from './commerceStore.js';\n\n/** Imperative ops a mounted `Editor.Canvas` offers sibling parts. Routes\n * TextField writes through the editor command path (undo/redo, repaint) so\n * the editor document stays the single write authority while a canvas is\n * mounted (ADR-0085 §3). */\nexport interface CanvasBridge {\n /** Set a named text layer's content via editor commands. Returns false when\n * no live element carries the name. */\n setTextByName(name: string, text: string): boolean;\n}\n\nexport interface TextFieldRegistration {\n name: string;\n optional: boolean;\n}\n\n/** Audit-relevant facts a part declares alongside its census registration\n * (`Editor.audit()`, #10). Every key is optional — most parts have none. */\nexport interface EditorPartMeta {\n /** `Editor.Preview`: the pinned mockup scene, when the prop was given. */\n mockupId?: string;\n /** `Editor.Canvas`: the `floatingToolbar` prop value (default `true`). */\n floatingToolbar?: boolean;\n}\n\nexport interface EditorPartRegistration {\n name: string;\n meta: EditorPartMeta;\n}\n\nexport class EditorPartsRegistry {\n private canvasIds = new Set<string>();\n private requirements = new Map<string, string>(); // instanceId → part name\n private textFields = new Map<string, TextFieldRegistration>(); // instanceId → reg\n private controls = new Map<string, 'docked' | 'floating'>(); // instanceId → placement\n private parts = new Map<string, EditorPartRegistration>(); // instanceId → census entry\n private bridge: CanvasBridge | null = null;\n private listeners = new Set<() => void>();\n private version = 0;\n\n /** Monotonic snapshot for `useSyncExternalStore`. */\n getVersion = (): number => this.version;\n\n subscribe = (listener: () => void): (() => void) => {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n };\n\n registerCanvas(instanceId: string): () => void {\n // Registration only RECORDS — violations throw from `validate()`, which\n // Root runs render-side (a layout-effect throw is not reliably contained\n // by a boundary across React 18 + DOM test environments).\n this.canvasIds.add(instanceId);\n this.bump();\n return () => {\n this.canvasIds.delete(instanceId);\n this.bump();\n };\n }\n\n hasCanvas(): boolean {\n return this.canvasIds.size > 0;\n }\n\n /** Declare that a part is meaningless without a mounted Canvas (ADR-0085 §4\n * table). Validated by Root once per commit. */\n requireCanvas(instanceId: string, partName: string): () => void {\n this.requirements.set(instanceId, partName);\n this.bump();\n return () => {\n this.requirements.delete(instanceId);\n this.bump();\n };\n }\n\n /** Run by Root during RENDER, re-triggered by every registry change — by\n * then the whole commit's registrations are in, so there is no race\n * against the lazy chunk (ADR-0085 §4). Throws land in Root's boundary. */\n validate(): void {\n if (this.canvasIds.size > 1) {\n throw new EditorError(\n 'E_DUPLICATE_CANVAS',\n 'two <Editor.Canvas> parts are mounted under one <Editor.Root>. A Root owns ' +\n 'exactly one editable artboard — remove one Canvas, or mount a second ' +\n '<Editor.Root> for a second editor. (Multiple <Editor.Preview> parts ARE valid.)',\n { docSlug: 'embed-mode' },\n );\n }\n if (this.requirements.size > 0 && !this.hasCanvas()) {\n const parts = [...new Set(this.requirements.values())];\n throw new EditorError(\n 'E_REQUIRES_CANVAS',\n `${parts.join(', ')} require${parts.length === 1 ? 's' : ''} an <Editor.Canvas> under the same ` +\n '<Editor.Root> — they operate on the editable artboard (selection, editor ' +\n 'commands). Mount <Editor.Canvas/>, or remove the part. Canvas-free parts: ' +\n 'Editor.Preview, Editor.Buy, Editor.TextField, Editor.Layers.',\n { parts, docSlug: 'embed-mode' },\n );\n }\n }\n\n registerTextField(instanceId: string, reg: TextFieldRegistration): () => void {\n this.textFields.set(instanceId, reg);\n this.bump();\n return () => {\n this.textFields.delete(instanceId);\n this.bump();\n };\n }\n\n /** Mounted TextField registrations — Buy's required-layer list (C2/C3).\n * Unmounted (incl. conditionally hidden) fields are absent by construction. */\n getTextFields(): TextFieldRegistration[] {\n return [...this.textFields.values()];\n }\n\n /** Bound-layer lookup for the mutation guard (ADR-0085 §3 /\n * `E_BOUND_LAYER_MUTATION`): a layer is bound while ANY mounted\n * `Editor.TextField` carries its name. Satisfies `BoundLayerGuard`\n * structurally (subscribe/getVersion above). */\n getBoundLayer(name: string): { part: string } | null {\n for (const reg of this.textFields.values()) {\n if (reg.name === name) return { part: 'Editor.TextField' };\n }\n return null;\n }\n\n /** `Editor.Controls` registration (ADR-0085 §5): a mounted DOCKED Controls\n * suppresses the canvas's built-in floating contextual toolbar — one\n * contextual zone at a time. `placement=\"floating\"` registers without\n * suppressing (it declares today's default explicitly). */\n registerControls(instanceId: string, placement: 'docked' | 'floating'): () => void {\n this.controls.set(instanceId, placement);\n this.bump();\n return () => {\n this.controls.delete(instanceId);\n this.bump();\n };\n }\n\n hasDockedControls(): boolean {\n for (const placement of this.controls.values()) {\n if (placement === 'docked') return true;\n }\n return false;\n }\n\n /** Census registration (`Editor.audit()`, #10): every mounted part records\n * its public name + audit-relevant meta. Purely observational — nothing\n * validates through this map. */\n registerPart(instanceId: string, name: string, meta: EditorPartMeta = {}): () => void {\n this.parts.set(instanceId, { name, meta });\n this.bump();\n return () => {\n this.parts.delete(instanceId);\n this.bump();\n };\n }\n\n /** Every mounted part's census entry (audit input). */\n getParts(): EditorPartRegistration[] {\n return [...this.parts.values()];\n }\n\n /** Unique public names of mounted parts that declared a canvas requirement\n * (audit input — same data `validate()` throws `E_REQUIRES_CANVAS` from). */\n requiresCanvasPartNames(): string[] {\n return [...new Set(this.requirements.values())];\n }\n\n registerCanvasBridge(bridge: CanvasBridge): () => void {\n this.bridge = bridge;\n this.bump();\n return () => {\n if (this.bridge === bridge) this.bridge = null;\n this.bump();\n };\n }\n\n getCanvasBridge(): CanvasBridge | null {\n return this.bridge;\n }\n\n private bump(): void {\n this.version++;\n for (const l of [...this.listeners]) l();\n }\n}\n\nexport interface EditorRootInternals {\n /** The one live design state under this Root (ADR-0085 §3 / T2). */\n store: DesignStateStore;\n /** The one commerce-selection state under this Root (ADR-0085 §2 / P2):\n * variant selection + quantity. `Editor.Buy` owns the contract; the host\n * reads/writes it through `useProductSelection()`. */\n commerce: CommerceStateStore;\n registry: EditorPartsRegistry;\n /**\n * Handler/async-time invariant channel (ADR-0085, D11 containment): React\n * error boundaries only catch render/lifecycle throws, so handlers report\n * here — throws in dev AND test (an agent's test must fail loud), routes to\n * Root's error state (same visible card) in prod.\n */\n reportInvariant(error: EditorError): void;\n /**\n * Runtime-failure channel (NOT a composition mistake — e.g. the lazy\n * renderer chunk failing to load): routes to Root's error card in every\n * env, with a retry affordance. Never throws.\n */\n reportRuntimeError(error: EditorError): void;\n}\n\nexport const EditorRootInternalsContext = createContext<EditorRootInternals | null>(null);\n\n/**\n * Read the Root internals. Throws `E_OUTSIDE_ROOT` (dev AND prod) when the\n * part is mounted outside `<Editor.Root>` — the most common wiring mistake.\n */\nexport function useEditorRootInternals(partName: string): EditorRootInternals {\n const ctx = useContext(EditorRootInternalsContext);\n if (!ctx) {\n throw new EditorError(\n 'E_OUTSIDE_ROOT',\n `<${partName}> must be rendered inside <Editor.Root>. Wrap it: ` +\n `<Editor.Root shop={…} product={…} design={…} grantUrl={…}><${partName}/></Editor.Root>`,\n { part: partName, docSlug: 'embed-mode' },\n );\n }\n return ctx;\n}\n\n/**\n * Declare that the calling part requires a mounted `Editor.Canvas` under the\n * same Root (ADR-0085 §4 — Controls/Add/History/Menu in P3; the throw is\n * `E_REQUIRES_CANVAS`, validated race-free by Root once per commit).\n */\nexport function useRequiresCanvas(partName: string): void {\n const internals = useEditorRootInternals(partName);\n const instanceId = useId();\n useLayoutEffect(\n () => internals.registry.requireCanvas(instanceId, partName),\n [internals.registry, instanceId, partName],\n );\n}\n\n/**\n * Census registration for the composition audit (`Editor.audit()`, #10):\n * every `Editor.*` part calls this with its public name (+ audit-relevant\n * meta) so the audit report can list what is mounted. Deliberately TOLERANT\n * of a missing Root (no `E_OUTSIDE_ROOT` here): the parts that require a Root\n * already enforce it through their own hooks, and `Editor.Preview` stays\n * mountable under the legacy wrappers without a new throw path.\n */\nexport function useRegisterEditorPart(partName: string, meta?: EditorPartMeta): void {\n const internals = useContext(EditorRootInternalsContext);\n const registry = internals?.registry ?? null;\n const instanceId = useId();\n // Depend on the meta VALUES (an inline `meta` object is new every render).\n const mockupId = meta?.mockupId;\n const floatingToolbar = meta?.floatingToolbar;\n const stableMeta = useMemo<EditorPartMeta>(\n () => ({\n ...(mockupId !== undefined ? { mockupId } : {}),\n ...(floatingToolbar !== undefined ? { floatingToolbar } : {}),\n }),\n [mockupId, floatingToolbar],\n );\n useLayoutEffect(() => {\n if (!registry) return;\n return registry.registerPart(instanceId, partName, stableMeta);\n }, [registry, instanceId, partName, stableMeta]);\n}\n\n/** Shared impl of the invariant channel. @internal */\nexport function makeInvariantReporter(routeToErrorState: (error: EditorError) => void): {\n reportInvariant: (error: EditorError) => void;\n reportRuntimeError: (error: EditorError) => void;\n} {\n return {\n reportInvariant(error: EditorError): void {\n if (isDevOrTest()) throw error;\n routeToErrorState(error);\n },\n reportRuntimeError(error: EditorError): void {\n // Containment is silent by design (the card is the signal) — except in\n // tests, where a contained error must be detectable: see\n // `expectNoEditorErrors()` in `@snowcone-app/canvas/testing`.\n recordContainedEditorError(error);\n routeToErrorState(error);\n },\n };\n}\n","'use client';\n\n/**\n * `<Editor.Layers>` — layer list/thumbnails (ADR-0085, P3). The ONE editor\n * part that works CANVAS-FREE (§4: \"shows design layers from always-mounted\n * state\" — D9, explicit; it does NOT register requires-canvas).\n *\n * Two render modes behind one part:\n *\n * - **Canvas mounted** — wraps the existing `embed/LayersPanel` chrome\n * against the live editor document: full behavior (selection, visibility,\n * lock, duplicate, delete with bound-layer suppression, previews via the\n * preview registry).\n * - **Canvas-free** — a read-only layer list derived from the Root's design\n * state store (the always-mounted state). No editor document content\n * exists without the canvas kernel, and no rendering engine is loaded, so\n * rows show a kind icon + name instead of painted thumbnails.\n *\n * Re-render containment (D3): the canvas-free list subscribes to a CACHED\n * TOPOLOGY snapshot of the store — layer identity/order/kind/visibility —\n * so typing in an `Editor.TextField` (which changes layer CONTENT, not\n * topology) never re-renders this part. This mirrors what the wrapped panel\n * shows anyway: names, kind icons and id-keyed thumbnails, none of which\n * change per keystroke.\n */\n\nimport React, { useRef, useSyncExternalStore, type CSSProperties } from 'react';\nimport { Icon } from '@iconify/react';\nimport { icons } from '../ui';\nimport { LayersPanel } from '../embed/LayersPanel.js';\nimport { useEditorRootInternals, useRegisterEditorPart } from './RootInternals.js';\nimport type { DesignStateStore } from './designStateStore.js';\n\nexport interface EditorLayersProps {\n /** Flow direction of the canvas-free list (the wrapped document panel is a\n * vertical column). Default `'vertical'`. */\n direction?: 'vertical' | 'horizontal';\n className?: string;\n style?: CSSProperties;\n}\n\ninterface TopologyRow {\n key: string;\n name: string;\n kind: string;\n visible: boolean;\n}\n\nfunction rowsOf(store: DesignStateStore): TopologyRow[] {\n const { elements } = store.getState();\n return elements.map((el, index) => {\n const config = el as { name?: string; transformType?: string; visible?: boolean };\n const kind = config.transformType ?? 'custom';\n // Fallback label is the KIND, never the text content — content must not\n // be part of the topology snapshot (D3: a keystroke is not a re-render).\n const label = config.name ?? kind.charAt(0).toUpperCase() + kind.slice(1);\n return {\n key: `${index}:${config.name ?? ''}`,\n name: label,\n kind,\n visible: config.visible !== false,\n };\n });\n}\n\n/** Subscribe to the store's layer TOPOLOGY: a cached snapshot that keeps its\n * identity (React bails out of the re-render) while only layer content\n * changes. */\nfunction useStoreTopology(store: DesignStateStore): TopologyRow[] {\n const cache = useRef<{ key: string; rows: TopologyRow[] } | null>(null);\n const snapshot = (): TopologyRow[] => {\n const rows = rowsOf(store);\n const key = rows.map((r) => `${r.key}|${r.kind}|${r.visible}`).join('\\n');\n if (cache.current?.key !== key) cache.current = { key, rows };\n return cache.current.rows;\n };\n return useSyncExternalStore(store.subscribe, snapshot, snapshot);\n}\n\nfunction kindIcon(kind: string): string {\n if (kind === 'image') return icons.image;\n if (kind === 'shape') return icons.shapes;\n if (kind === 'group') return 'lucide:folder-open';\n return icons.text;\n}\n\nfunction StoreLayerList({\n store,\n direction,\n}: {\n store: DesignStateStore;\n direction: 'vertical' | 'horizontal';\n}): React.ReactElement {\n const rows = useStoreTopology(store);\n // Top layer first, matching the document panel's display order.\n const display = [...rows].reverse();\n return (\n <div\n style={{\n display: 'flex',\n flexDirection: direction === 'horizontal' ? 'row' : 'column',\n gap: 4,\n }}\n >\n {display.length === 0 ? (\n <div style={{ padding: 12, fontSize: 12, color: 'var(--text-secondary, #999)' }}>No layers</div>\n ) : (\n display.map((row) => (\n <div\n key={row.key}\n data-sc-part=\"layers-item\"\n data-sc-layer-kind={row.kind}\n data-sc-hidden={row.visible ? undefined : 'true'}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 8,\n padding: '6px 8px',\n minHeight: 36,\n opacity: row.visible ? 1 : 0.4,\n }}\n >\n <Icon icon={kindIcon(row.kind)} style={{ fontSize: 18, color: 'var(--text-secondary, #888)', flexShrink: 0 }} />\n <span\n style={{\n fontSize: 13,\n color: 'var(--foreground, #333)',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n }}\n >\n {row.name}\n </span>\n </div>\n ))\n )}\n </div>\n );\n}\n\n/**\n * Layer list. Canvas-free (the no-canvas composition shows the design's\n * layers read-only); with a mounted `Editor.Canvas` it is the live document\n * panel.\n *\n * Stable since ADR-0085 P4 (the default editor is rebuilt from this public\n * surface, CI-gated); additive-only from here.\n */\nexport function EditorLayers({\n direction = 'vertical',\n className,\n style,\n}: EditorLayersProps): React.ReactElement {\n const internals = useEditorRootInternals('Editor.Layers');\n useRegisterEditorPart('Editor.Layers'); // census (`Editor.audit()`, #10)\n const { registry } = internals;\n const hasCanvas = useSyncExternalStore(\n registry.subscribe,\n () => registry.hasCanvas(),\n () => registry.hasCanvas(),\n );\n\n return (\n <div data-sc-part=\"layers\" data-sc-direction={direction} className={className} style={style}>\n {hasCanvas ? (\n <LayersPanel style={{ width: '100%' }} />\n ) : (\n <StoreLayerList store={internals.store} direction={direction} />\n )}\n </div>\n );\n}\n","/**\n * Dropdown - Reusable dropdown container with click-outside handling\n *\n * Features:\n * - Built-in click-outside detection\n * - Flexible positioning (top/bottom/left/right)\n * - Flexible alignment (start/center/end)\n * - Auto click protection for canvas\n * - Slide-down animation\n * - Z-index management\n *\n * Usage:\n * ```tsx\n * <Dropdown\n * trigger={<Button>Open</Button>}\n * isOpen={isOpen}\n * onToggle={setIsOpen}\n * position=\"bottom\"\n * align=\"center\"\n * >\n * <DropdownMenu>\n * <MenuItem>Item 1</MenuItem>\n * <MenuItem>Item 2</MenuItem>\n * </DropdownMenu>\n * </Dropdown>\n * ```\n */\n\nimport React, { ReactNode, useEffect, useRef, useState } from 'react';\nimport { createPortal } from 'react-dom';\nimport { clickProtection } from '../../utils/clickProtection';\n\ntype DropdownPosition = 'top' | 'bottom' | 'left' | 'right';\ntype DropdownAlign = 'start' | 'center' | 'end';\n\nexport interface DropdownProps {\n /** Trigger element that opens the dropdown when clicked */\n trigger: ReactNode;\n /** Dropdown content */\n children: ReactNode;\n /** Whether the dropdown is currently open */\n isOpen: boolean;\n /** Callback when dropdown open state changes */\n onToggle: (open: boolean) => void;\n /** Position relative to trigger (default: bottom) */\n position?: DropdownPosition;\n /** Alignment along the position axis (default: start) */\n align?: DropdownAlign;\n /** Distance from trigger in pixels (default: 8) */\n offset?: number;\n /** Protect canvas from clicks when opening (default: true) */\n protectClick?: boolean;\n /** Additional CSS classes for container */\n className?: string;\n /** Additional CSS classes for content */\n contentClassName?: string;\n}\n\nconst Dropdown: React.FC<DropdownProps> = ({\n trigger,\n children,\n isOpen,\n onToggle,\n position = 'bottom',\n align = 'start',\n offset = 8,\n protectClick = true,\n className = '',\n contentClassName = '',\n}) => {\n const containerRef = useRef<HTMLDivElement>(null);\n const triggerRef = useRef<HTMLDivElement>(null);\n const contentRef = useRef<HTMLDivElement>(null);\n const [dropdownStyle, setDropdownStyle] = useState<React.CSSProperties>({});\n const [useFixed, setUseFixed] = useState(false);\n\n const handleTriggerClick = (e: React.MouseEvent) => {\n e.stopPropagation();\n if (!isOpen && protectClick) {\n clickProtection.protectNextClick();\n }\n onToggle(!isOpen);\n };\n\n // Click-outside detection: check both container and portal content\n useEffect(() => {\n if (!isOpen) return;\n\n let cleanup = () => {};\n const timer = setTimeout(() => {\n const handleMouseDown = (event: MouseEvent) => {\n const target = event.target as Node;\n const isInsideContainer = containerRef.current?.contains(target);\n const isInsideContent = contentRef.current?.contains(target);\n if (!isInsideContainer && !isInsideContent) {\n onToggle(false);\n }\n };\n document.addEventListener('mousedown', handleMouseDown);\n cleanup = () => document.removeEventListener('mousedown', handleMouseDown);\n }, 0);\n\n return () => {\n clearTimeout(timer);\n cleanup();\n };\n }, [isOpen, onToggle]);\n\n // Escape key handler: close dropdown and return focus to trigger\n useEffect(() => {\n if (!isOpen) return;\n\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n e.stopPropagation();\n e.preventDefault();\n onToggle(false);\n const focusable = triggerRef.current?.querySelector<HTMLElement>(\n 'button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])'\n );\n focusable?.focus();\n }\n };\n\n document.addEventListener('keydown', handleKeyDown);\n return () => document.removeEventListener('keydown', handleKeyDown);\n }, [isOpen, onToggle]);\n\n // Reset useFixed when dropdown closes so next open starts fresh\n useEffect(() => {\n if (!isOpen) {\n setUseFixed(false);\n }\n }, [isOpen]);\n\n // Calculate position to keep dropdown on screen\n useEffect(() => {\n if (!isOpen || !triggerRef.current || !contentRef.current) return;\n\n const calculatePosition = () => {\n const trigger = triggerRef.current;\n const content = contentRef.current;\n if (!trigger || !content) return;\n\n const triggerRect = trigger.getBoundingClientRect();\n const contentRect = content.getBoundingClientRect();\n const viewportWidth = window.innerWidth;\n const viewportHeight = window.innerHeight;\n const padding = 16;\n\n // Calculate ideal position\n let top = 0;\n let left = 0;\n\n // Position and alignment logic based on position direction\n if (position === 'bottom' || position === 'top') {\n // Vertical positioning\n if (position === 'bottom') {\n top = triggerRect.bottom + offset;\n } else {\n top = triggerRect.top - contentRect.height - offset;\n }\n\n // Horizontal alignment\n if (align === 'start') {\n left = triggerRect.left;\n } else if (align === 'end') {\n // Align right edges: menu's right edge = button's right edge\n left = triggerRect.right - contentRect.width;\n } else if (align === 'center') {\n left = triggerRect.left + (triggerRect.width - contentRect.width) / 2;\n }\n } else if (position === 'left' || position === 'right') {\n // Horizontal positioning\n if (position === 'left') {\n left = triggerRect.left - contentRect.width - offset;\n } else {\n left = triggerRect.right + offset;\n }\n\n // Vertical alignment\n if (align === 'start') {\n top = triggerRect.top;\n } else if (align === 'end') {\n top = triggerRect.bottom - contentRect.height;\n } else if (align === 'center') {\n top = triggerRect.top + (triggerRect.height - contentRect.height) / 2;\n }\n }\n\n // Only adjust for viewport boundaries if NOT using 'end' alignment\n // For 'end' alignment, we want to maintain the right edge alignment\n if (align !== 'end') {\n // Check if dropdown would go off right edge\n if (left + contentRect.width > viewportWidth - padding) {\n left = viewportWidth - contentRect.width - padding;\n }\n\n // Check if dropdown would go off left edge\n if (left < padding) {\n left = padding;\n }\n } else {\n // For 'end' alignment, only prevent going off left edge\n if (left < padding) {\n left = padding;\n }\n }\n\n // Check if dropdown would go off bottom edge\n if (top + contentRect.height > viewportHeight - padding) {\n // Try to flip to top if there's more space\n const spaceAbove = triggerRect.top;\n const spaceBelow = viewportHeight - triggerRect.bottom;\n if (spaceAbove > spaceBelow) {\n top = triggerRect.top - contentRect.height - offset;\n }\n }\n\n // Check if dropdown would go off top edge\n if (top < padding) {\n top = padding;\n }\n\n // Calculate max width to ensure it fits in viewport\n const maxWidth = viewportWidth - (padding * 2);\n\n setUseFixed(true);\n setDropdownStyle({\n position: 'fixed',\n top: `${top}px`,\n left: `${left}px`,\n maxWidth: `${maxWidth}px`,\n visibility: 'visible',\n });\n };\n\n requestAnimationFrame(calculatePosition);\n }, [isOpen, position, align, offset]);\n\n // Dropdown content - rendered in a portal to escape parent overflow:hidden\n // Start with visibility:hidden until position is calculated to prevent flash at wrong location\n // IMPORTANT: data-preserve-selection prevents clicks from deselecting canvas elements\n const dropdownContent = isOpen && (\n <div\n ref={contentRef}\n className={`sc:z-dropdown ${contentClassName}`.trim()}\n data-preserve-selection\n style={\n useFixed\n ? dropdownStyle\n : {\n // Initially hidden and positioned off-screen until useEffect calculates position\n position: 'fixed',\n visibility: 'hidden',\n top: 0,\n left: 0,\n }\n }\n >\n {children}\n </div>\n );\n\n return (\n <div className={`sc:relative sc:inline-flex ${className}`.trim()} ref={containerRef}>\n <div ref={triggerRef} onClick={handleTriggerClick}>{trigger}</div>\n\n {/* Render dropdown in portal to escape overflow:hidden clipping.\n The .sc-root wrapper is load-bearing: a body portal escapes the\n editor's .sc-root scope, and every scoped theme token\n (--sc-spacing-*, --sc-color-*) resolves to nothing without it —\n the menu renders with zero padding and default colors (the\n \"unstyled menus\" bug). display:contents keeps it box-less. */}\n {dropdownContent &&\n createPortal(\n <div className=\"sc-root\" style={{ display: 'contents' }}>\n {dropdownContent}\n </div>,\n document.body,\n )}\n </div>\n );\n};\n\nexport default Dropdown;\n","/**\n * DropdownMenu - Styled container for dropdown menu content\n *\n * Usage:\n * ```tsx\n * <Dropdown ...>\n * <DropdownMenu>\n * <MenuItem>Item 1</MenuItem>\n * <MenuItem>Item 2</MenuItem>\n * </DropdownMenu>\n * </Dropdown>\n * ```\n */\n\nimport React, { ReactNode } from 'react';\n\nexport interface DropdownMenuProps {\n children: ReactNode;\n className?: string;\n minWidth?: string;\n maxHeight?: string;\n}\n\nconst DropdownMenu: React.FC<DropdownMenuProps> = ({ children, className = '', minWidth = '160px', maxHeight }) => {\n const maxHeightClass = maxHeight ? `max-h-[${maxHeight}]` : '';\n const minWidthStyle = { minWidth };\n\n // bg-surface (not bg-bg-primary) so the dropdown picks up the design\n // system's elevated surface token. `--bg-primary` resolves to the page\n // background in dark mode and gave dropdowns zero elevation against\n // the page — the wrong default for a raised menu.\n return (\n <div\n role=\"menu\"\n className={`sc:flex sc:flex-col sc:gap-px sc:rounded-xl sc:border sc:border-border-primary sc:bg-surface sc:p-xs sc:shadow-md ${maxHeightClass} ${className}`.trim()}\n style={minWidthStyle}\n >\n {children}\n </div>\n );\n};\n\nexport default DropdownMenu;\n","/**\n * MenuItem - Reusable menu item component\n *\n * Features:\n * - Icon support\n * - Active state with checkmark\n * - Keyboard shortcut display\n * - Disabled state\n * - Click handling\n *\n * Usage:\n * ```tsx\n * <MenuItem\n * icon={<Icon />}\n * label=\"Save\"\n * shortcut=\"⌘S\"\n * active={false}\n * onClick={handleSave}\n * />\n * ```\n */\n\nimport React from 'react';\n\nexport interface MenuItemProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n icon?: React.ReactNode;\n label: string;\n shortcut?: string;\n active?: boolean;\n disabled?: boolean;\n onClick?: () => void;\n className?: string;\n children?: React.ReactNode;\n}\n\nconst MenuItem: React.FC<MenuItemProps> = ({\n icon,\n label,\n shortcut,\n active = false,\n disabled = false,\n onClick,\n className = '',\n children,\n ...props\n}) => {\n const baseClasses = [\n 'sc:flex sc:items-center sc:gap-md',\n 'sc:px-lg sc:py-md',\n 'sc:bg-transparent sc:border-none',\n 'sc:rounded-lg',\n 'sc:text-text-primary sc:text-base sc:font-normal',\n 'sc:cursor-pointer',\n 'sc:transition-all sc:duration-fast',\n 'sc:text-left sc:w-full',\n ];\n\n const stateClasses = [\n active ? 'sc:bg-accent-light sc:font-medium' : '',\n disabled ? 'sc:opacity-disabled sc:cursor-not-allowed' : 'sc:hover:bg-bg-hover',\n ];\n\n const combinedClassName = [...baseClasses, ...stateClasses, className].filter(Boolean).join(' ');\n\n const handleClick = () => {\n if (!disabled && onClick) {\n onClick();\n }\n };\n\n return (\n <button role=\"menuitem\" className={combinedClassName} onClick={handleClick} disabled={disabled} type=\"button\" {...props}>\n {icon && <span className=\"sc:flex sc:shrink-0 sc:items-center\">{icon}</span>}\n\n <span className=\"sc:flex-1\">{children || label}</span>\n\n {shortcut && <span className=\"sc:ml-auto sc:text-sm sc:text-text-muted\">{shortcut}</span>}\n\n {active && !shortcut && (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" className=\"sc:ml-auto sc:shrink-0\">\n <path d=\"M13 4L6 11L3 8\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n )}\n </button>\n );\n};\n\nexport default MenuItem;\n","/**\n * The add-element catalog shared by `MenuButton`'s \"Add Element\" submenu and\n * the `Editor.Add` part (ADR-0085) — one list, two access styles, so the\n * menus can't drift.\n */\n\nimport React from 'react';\nimport { Icon } from '@iconify/react';\nimport { icons } from '../ui';\n\nexport interface AddElementType {\n /** The element type passed to `handleAddElement` ('shape' opens the\n * shape-type drawer first instead of defaulting to a rectangle). */\n type: string;\n label: string;\n icon: React.ReactNode;\n}\n\nexport const ADD_ELEMENT_TYPES: AddElementType[] = [\n { type: 'custom', label: 'Text', icon: <Icon icon={icons.text} className=\"sc:size-[18px]\" /> },\n { type: 'image', label: 'Image', icon: <Icon icon={icons.image} className=\"sc:size-[18px]\" /> },\n { type: 'shape', label: 'Shape', icon: <Icon icon={icons.shapes} className=\"sc:size-[18px]\" /> },\n { type: 'circle', label: 'Circle Text', icon: <Icon icon=\"lucide:circle\" className=\"sc:size-[18px]\" /> },\n { type: 'wave', label: 'Wave Text', icon: <Icon icon=\"lucide:waves\" className=\"sc:size-[18px]\" /> },\n { type: 'arch', label: 'Arch Text', icon: <Icon icon=\"lucide:arrow-up-from-dot\" className=\"sc:size-[18px]\" /> },\n];\n","/**\n * Drawer - Shared drawer component for canvas editor\n * Built on top of @snowcone-app/ui Drawer (iOS-safe, no Vaul dependency)\n *\n * Z-INDEX IMPORTANT:\n * - Overlay: var(--sc-z-overlay) = 10001 (above modals at 10000)\n * - Content: var(--sc-z-drawer) = 10002 (highest z-index in app)\n * - See docs/Z_INDEX_HIERARCHY.md for complete reference\n */\n\nimport React from 'react';\nimport {\n Drawer as BaseDrawer,\n DrawerContent,\n DrawerTitle,\n DrawerDescription,\n} from '../vendor/ui';\nimport { Button, icons } from './ui';\nimport { Icon } from '@iconify/react';\n\nexport interface DrawerProps {\n /** Whether the drawer is open */\n isOpen: boolean;\n /** Callback when drawer should close */\n onClose: () => void;\n /** Drawer title (for accessibility and header) */\n title: string;\n /** Optional description (for accessibility) */\n description?: string;\n /** Drawer content */\n children: React.ReactNode;\n /** Placement of drawer */\n placement?: 'bottom' | 'right' | 'left';\n /** Fixed height (for bottom drawer) */\n height?: string;\n /** Maximum height (for bottom drawer) */\n maxHeight?: string;\n /** Fixed width (for side drawers) */\n width?: string;\n /** Maximum width (for side drawers) */\n maxWidth?: string;\n /** Show close button in header */\n showCloseButton?: boolean;\n /** Additional header content (placed next to title) */\n headerActions?: React.ReactNode;\n /** Hide the visible title (keeps sr-only title for accessibility) */\n hideVisibleTitle?: boolean;\n /** Hide the drag handle (bottom drawer only) */\n hideHandle?: boolean;\n /** Disable built-in overflow-y-auto wrapper (for custom scroll containers) */\n disableScrollWrapper?: boolean;\n /** Disable overflow-hidden on drawer content (needed for backdrop-filter to work properly) */\n disableOverflowHidden?: boolean;\n /** Test ID for the drawer content element */\n 'data-testid'?: string;\n}\n\n/**\n * Drawer component for canvas editor\n *\n * @example\n * ```tsx\n * <Drawer\n * isOpen={isOpen}\n * onClose={() => setIsOpen(false)}\n * title=\"Export Settings\"\n * description=\"Configure export options\"\n * >\n * <div className=\"p-6\">Content here</div>\n * </Drawer>\n * ```\n */\n/**\n * Tracks whether the document is in dark mode (driven by `.dark` on the\n * <html> element, the project-wide convention). Re-runs when the class\n * toggles via theme switch.\n *\n * Used to bump the drawer scrim opacity in dark mode — the default 0.4\n * black overlay barely darkens the page when the page background is\n * already near-black, so the drawer card's medium-gray border doesn't\n * read against the page behind it. A heavier scrim restores separation.\n */\nfunction useIsDocumentDark(): boolean {\n const [isDark, setIsDark] = React.useState(false);\n React.useEffect(() => {\n if (typeof document === 'undefined') return;\n const update = () =>\n setIsDark(document.documentElement.classList.contains('dark'));\n update();\n const obs = new MutationObserver(update);\n obs.observe(document.documentElement, {\n attributes: true,\n attributeFilter: ['class'],\n });\n return () => obs.disconnect();\n }, []);\n return isDark;\n}\n\nexport const Drawer: React.FC<DrawerProps> = ({\n isOpen,\n onClose,\n title,\n description,\n children,\n placement = 'bottom',\n height,\n maxHeight = '70vh',\n width,\n maxWidth = '400px',\n showCloseButton = true,\n headerActions,\n hideVisibleTitle = false,\n hideHandle = false,\n disableScrollWrapper = false,\n disableOverflowHidden = false,\n 'data-testid': dataTestId,\n}) => {\n // Calculate heightRatio for bottom drawer\n // The new Drawer uses heightRatio (0-1) but canvas uses CSS height values\n // We'll use className to set custom height instead\n const heightStyle = placement === 'bottom' ? (height || maxHeight) : undefined;\n\n // Dark mode gets a heavier scrim so the drawer's medium-gray border has\n // somewhere to push against and the blurred page reads as muted, not\n // bright-leaking. Surface lift is handled by the design-system token\n // bump on `--surface` in dark mode (see globals.css) — no per-component\n // background override needed.\n const isDark = useIsDocumentDark();\n const scrimOpacity = isDark ? 0.65 : 0.4;\n\n return (\n <BaseDrawer\n open={isOpen}\n onOpenChange={(open) => !open && onClose()}\n >\n <DrawerContent\n placement={placement}\n width={width}\n maxWidth={maxWidth}\n hideHandle={hideHandle || placement !== 'bottom'}\n showOverlay={true}\n overlayOpacity={scrimOpacity}\n className={disableOverflowHidden ? '' : 'sc:overflow-hidden'}\n style={{\n // Override height for canvas-specific needs\n ...(heightStyle && placement === 'bottom' ? { height: heightStyle } : {}),\n // Canvas uses custom z-index variables\n zIndex: 'var(--sc-z-drawer, 10002)',\n }}\n data-testid={dataTestId}\n data-preserve-selection\n >\n {/* Accessibility - Hidden title and description */}\n <DrawerTitle className=\"sc:sr-only\">{title}</DrawerTitle>\n {description && <DrawerDescription className=\"sc:sr-only\">{description}</DrawerDescription>}\n\n {/* Content wrapper - conditionally scrollable */}\n {/* Note: @snowcone-app/ui DrawerContent already provides Surface context, so we don't need a wrapper here */}\n {disableScrollWrapper ? (\n // Custom scroll control - children manage their own scrolling\n <div className=\"sc:flex sc:flex-col sc:flex-1 sc:min-h-0\">\n {/* Drag handle is rendered by DrawerContent (the underlying\n primitive). Don't render it here too — that creates a stale\n second handle and wastes ~28px of vertical space above the\n drawer header. */}\n\n {/* Header */}\n {(!hideVisibleTitle || headerActions || showCloseButton) && (\n <div className=\"sc:border-border-primary sc:flex sc:shrink-0 sc:items-center sc:justify-between sc:gap-4 sc:border-b sc:px-6 sc:py-4\">\n {!hideVisibleTitle && <h2 className=\"sc:text-foreground sc:text-lg sc:font-semibold\">{title}</h2>}\n <div className=\"sc:flex sc:items-center sc:gap-2\">\n {headerActions}\n {showCloseButton && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={onClose}\n className=\"sc:min-w-8 sc:px-2\"\n aria-label=\"Close drawer\"\n >\n <Icon icon={icons.close} className=\"sc:size-6\" />\n </Button>\n )}\n </div>\n </div>\n )}\n\n {children}\n </div>\n ) : (\n // Default: built-in overflow-y-auto wrapper\n <div className=\"sc:flex-1 sc:overflow-y-auto sc:min-h-0\">\n {/* Drag handle rendered by DrawerContent — see note above. */}\n\n {/* Header */}\n {(!hideVisibleTitle || headerActions || showCloseButton) && (\n <div className=\"sc:border-border-primary sc:flex sc:shrink-0 sc:items-center sc:justify-between sc:gap-4 sc:border-b sc:px-6 sc:py-4\">\n {!hideVisibleTitle && <h2 className=\"sc:text-foreground sc:text-lg sc:font-semibold\">{title}</h2>}\n <div className=\"sc:flex sc:items-center sc:gap-2\">\n {headerActions}\n {showCloseButton && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={onClose}\n className=\"sc:min-w-8 sc:px-2\"\n aria-label=\"Close drawer\"\n >\n <Icon icon={icons.close} className=\"sc:size-6\" />\n </Button>\n )}\n </div>\n </div>\n )}\n\n {children}\n </div>\n )}\n </DrawerContent>\n </BaseDrawer>\n );\n};\n\nexport default Drawer;\n","/**\n * ShapeTypeDrawer — Tile picker for selecting / changing shape type.\n *\n * Implements the canonical tile-picker pattern from the design system:\n * `/design-system/page/drawers` (section 05).\n *\n * - Bottom drawer, height: auto (hugs the 7-tile grid)\n * - Custom header (no divider) with sr-only title for accessibility\n * - 3-col grid of square tiles, icon centered + label below\n * - Selected tile fills with primary tint and ink shifts to primary\n */\n\nimport React from 'react';\nimport { Drawer } from './Drawer';\nimport { icons } from './ui';\nimport { Icon } from '@iconify/react';\n\ninterface ShapeTypeDrawerProps {\n isOpen: boolean;\n onClose: () => void;\n onSelectType: (type: string) => void;\n /** The currently selected shape type (optional, for highlighting) */\n currentType?: string;\n}\n\ninterface ShapeType {\n id: string;\n label: string;\n /** Iconify icon name. Either this or `reactIcon` must be provided. */\n icon?: string;\n /** Custom React node — used for shapes that aren't in our icon set. */\n reactIcon?: React.ReactNode;\n}\n\n// Custom polygon (pentagon) — lucide doesn't ship one in our iconify set\nconst PolygonIcon = ({ className }: { className?: string }) => (\n <svg\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden\n >\n <path d=\"M12 2L21 8L18 19L6 19L3 8L12 2Z\" />\n </svg>\n);\n\n// Custom ellipse — also missing\nconst EllipseIcon = ({ className }: { className?: string }) => (\n <svg\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n aria-hidden\n >\n <ellipse cx=\"12\" cy=\"12\" rx=\"9\" ry=\"6\" />\n </svg>\n);\n\nconst TILE_ICON_CLASS = 'sc:size-10';\n\nconst shapeTypes: ShapeType[] = [\n { id: 'rectangle', label: 'Rectangle', icon: 'lucide:square' },\n { id: 'circle', label: 'Circle', icon: 'lucide:circle' },\n { id: 'ellipse', label: 'Ellipse', reactIcon: <EllipseIcon className={TILE_ICON_CLASS} /> },\n { id: 'triangle', label: 'Triangle', icon: 'lucide:triangle' },\n { id: 'polygon', label: 'Polygon', reactIcon: <PolygonIcon className={TILE_ICON_CLASS} /> },\n { id: 'star', label: 'Star', icon: 'lucide:star' },\n { id: 'line', label: 'Line', icon: 'lucide:minus' },\n];\n\nexport const ShapeTypeDrawer: React.FC<ShapeTypeDrawerProps> = ({\n isOpen,\n onClose,\n onSelectType,\n currentType,\n}) => {\n const headingText = currentType ? 'Change Shape' : 'Select Shape';\n const descriptionText = currentType ? 'Select a new shape type' : 'Choose a shape to add';\n\n const handleSelect = (type: string) => {\n onSelectType(type);\n onClose();\n };\n\n return (\n <Drawer\n isOpen={isOpen}\n onClose={onClose}\n title={headingText}\n description={descriptionText}\n placement=\"bottom\"\n height=\"auto\"\n hideVisibleTitle\n showCloseButton={false}\n data-testid=\"shape-type-drawer\"\n >\n {/* Custom header — no divider, sits right under the drag handle */}\n <div className=\"sc:px-6 sc:pt-1 sc:pb-2 sc:flex sc:items-center sc:justify-between\">\n <h3 className=\"sc:text-lg sc:font-semibold sc:tracking-tight sc:text-foreground\">\n {headingText}\n </h3>\n <button\n onClick={onClose}\n className=\"sc:size-11 sc:rounded-full sc:hover:bg-foreground/[0.06] sc:flex sc:items-center sc:justify-center sc:text-foreground/70 sc:-mr-2\"\n aria-label=\"Close\"\n >\n <Icon icon={icons.close} className=\"sc:size-5\" />\n </button>\n </div>\n\n {/* Tile grid */}\n <div\n className=\"sc:grid sc:grid-cols-3 sc:gap-2 sc:p-4\"\n data-testid=\"shape-type-list\"\n >\n {shapeTypes.map((type) => {\n const isSelected = type.id === currentType;\n return (\n <button\n key={type.id}\n type=\"button\"\n onClick={() => handleSelect(type.id)}\n aria-pressed={isSelected}\n data-testid={`shape-type-${type.id}`}\n className={`sc:aspect-square sc:flex sc:flex-col sc:items-center sc:justify-center sc:gap-2.5 sc:rounded-xl sc:border sc:transition-colors ${\n isSelected\n ? 'sc:bg-primary/10 sc:border-primary/40'\n : 'sc:bg-transparent sc:border-transparent sc:hover:bg-foreground/[0.04] sc:active:bg-foreground/[0.06]'\n }`}\n >\n <span\n className={isSelected ? 'sc:text-primary' : 'sc:text-foreground/85'}\n >\n {type.reactIcon ? (\n type.reactIcon\n ) : (\n <Icon icon={type.icon!} className={TILE_ICON_CLASS} />\n )}\n </span>\n <span\n className={`sc:text-xs ${\n isSelected\n ? 'sc:text-primary sc:font-medium'\n : 'sc:text-foreground/70'\n }`}\n >\n {type.label}\n </span>\n </button>\n );\n })}\n </div>\n </Drawer>\n );\n};\n\nexport default ShapeTypeDrawer;\n","/**\n * MenuButton - Unified menu button for embedding\n * Combines save, open, export, and layers functionality\n */\n\nimport React, { useState, useRef } from 'react';\nimport { useEditorHandles } from '../../contexts/EditorContext.js';\nimport { Icon } from '@iconify/react';\nimport { Button, Tooltip, TooltipTrigger, TooltipContent, icons } from '../ui';\nimport { Dropdown, DropdownMenu, MenuItem } from '../primitives';\nimport { ImportManager } from '../../utils/ImportManager.js';\nimport { ADD_ELEMENT_TYPES } from './addElementTypes.js';\nimport { createLogger } from '../../utils/logger.js';\nimport ShapeTypeDrawer from '../ShapeTypeDrawer.js';\nimport type { ShapeType } from '../../types/index.js';\n\nconst logger = createLogger('MenuButton');\n\nexport interface MenuButtonProps {\n /**\n * Whether the layers panel is open\n */\n isLayersPanelOpen?: boolean;\n\n /**\n * Callback when layers panel toggle is requested\n */\n onToggleLayersPanel?: () => void;\n\n /**\n * Callback when image browser should be opened\n * If provided, this will be called when user selects \"Add Image\" instead of using the default handler\n */\n onOpenImageBrowser?: () => void;\n\n /**\n * Additional menu items to append\n */\n additionalItems?: React.ReactNode;\n\n /**\n * Custom button icon\n */\n icon?: React.ReactNode;\n\n /**\n * Button tooltip\n */\n tooltip?: string;\n\n /**\n * Additional CSS class name\n */\n className?: string;\n}\n\n/**\n * MenuButton - Unified menu for save/open/export/layers\n * Must be used within EditorProvider\n *\n * @example\n * ```tsx\n * <EditorProvider>\n * <MenuButton\n * isLayersPanelOpen={layersOpen}\n * onToggleLayersPanel={() => setLayersOpen(!layersOpen)}\n * />\n * </EditorProvider>\n * ```\n */\nexport const MenuButton: React.FC<MenuButtonProps> = ({\n isLayersPanelOpen = false,\n onToggleLayersPanel,\n onOpenImageBrowser,\n additionalItems,\n icon = <Icon icon={icons.menu} className=\"sc:size-6\" />,\n tooltip = 'Menu',\n className,\n}) => {\n // Stable lazy handles, NOT the fat context (re-render containment, D3):\n // everything this menu needs from the editor is read inside event handlers,\n // so it must not re-render on every editor change. The one render-time read\n // (`canvasRef.current` for the export item) re-evaluates whenever the menu\n // opens, which is the only moment it is visible.\n const { get } = useEditorHandles();\n\n const [isOpen, setIsOpen] = useState(false);\n const [addMenuOpen, setAddMenuOpen] = useState(false);\n const [isShapeTypeDrawerOpen, setIsShapeTypeDrawerOpen] = useState(false);\n const fileInputRef = useRef<HTMLInputElement>(null);\n\n // Save workspace\n const handleSave = async () => {\n try {\n // Dynamic on purpose: ExportManager statically imports the paint\n // pipeline, and this menu mounts in Editor.* graphs that must stay\n // renderer-free (import-graph gate). Save/export are async user\n // actions, so the load cost lands exactly where the renderer already is.\n const { ExportManager } = await import('../../utils/ExportManager.js');\n const { artboardManager, elements } = get();\n const freshArtboards = artboardManager.getAllArtboards();\n ExportManager.exportToJSON(freshArtboards, elements, artboardManager);\n setIsOpen(false);\n } catch (error) {\n logger.error('Failed to save workspace:', error);\n alert('Failed to save workspace. Please try again.');\n }\n };\n\n // Open file picker\n const handleLoadClick = () => {\n fileInputRef.current?.click();\n setIsOpen(false);\n };\n\n // Handle file selection\n const handleFileChange = async (e: React.ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0];\n if (!file) return;\n\n try {\n const result = await ImportManager.importFromJSON(file);\n\n if (result.success && result.artboards && result.elements) {\n const validation = ImportManager.validateImportedData(result.artboards, result.elements);\n\n if (!validation.valid) {\n const proceed = confirm(\n `Found ${validation.errors.length} issue(s) in the file:\\n\\n` +\n validation.errors.slice(0, 3).join('\\n') +\n (validation.errors.length > 3 ? `\\n...and ${validation.errors.length - 3} more` : '') +\n '\\n\\nDo you want to load anyway?'\n );\n\n if (!proceed) {\n return;\n }\n }\n\n const summary = ImportManager.getImportSummary(result.artboards, result.elements);\n const proceed = confirm(\n `Load workspace with:\\n\\n` +\n `• ${summary.artboardCount} artboard(s): ${summary.artboardNames.join(', ')}\\n` +\n `• ${summary.elementCount} element(s)\\n\\n` +\n `This will replace your current workspace. Continue?`\n );\n\n if (proceed) {\n get().handleLoadWorkspace(result.artboards, result.elements, result.activeArtboardId || null);\n }\n } else {\n alert(`Failed to load: ${result.error || 'Unknown error'}`);\n }\n } catch (error) {\n logger.error('Failed to load workspace:', error);\n alert('Failed to load workspace. Please check the file and try again.');\n }\n\n if (fileInputRef.current) {\n fileInputRef.current.value = '';\n }\n };\n\n // Export image\n const handleExportImage = async () => {\n const { artboardManager, elements, canvasRef } = get();\n if (!canvasRef?.current) {\n alert('Canvas not available for export');\n return;\n }\n\n const activeArtboard = artboardManager.getActiveArtboard();\n if (!activeArtboard) {\n alert('No active artboard to export');\n return;\n }\n\n try {\n // Dynamic for the same renderer-free reason as handleSave above.\n const { ExportManager } = await import('../../utils/ExportManager.js');\n await ExportManager.exportArtboardToImage(activeArtboard, elements, canvasRef.current, {\n format: 'png',\n scale: 2,\n transparentBackground: false,\n });\n setIsOpen(false);\n } catch (error) {\n logger.error('Failed to export artboard:', error);\n alert('Failed to export artboard. Please try again.');\n }\n };\n\n // Add element\n const handleAddElementClick = async (elementType: string) => {\n // If adding an image and we have a custom handler, use it\n if (elementType === 'image' && onOpenImageBrowser) {\n onOpenImageBrowser();\n setIsOpen(false);\n setAddMenuOpen(false);\n return;\n }\n\n // For shapes, ask which shape first instead of defaulting\n // to a rectangle — users were confused that \"Add Shape\"\n // produced a fixed shape type with no obvious way to change it.\n if (elementType === 'shape') {\n setIsOpen(false);\n setAddMenuOpen(false);\n setIsShapeTypeDrawerOpen(true);\n return;\n }\n\n // Otherwise use default handler\n await get().handleAddElement(elementType);\n setIsOpen(false);\n setAddMenuOpen(false);\n };\n\n const handleSelectShapeType = async (shapeType: string) => {\n setIsShapeTypeDrawerOpen(false);\n await get().handleAddElement('shape', { shapeType: shapeType as ShapeType });\n };\n\n const elementTypes = ADD_ELEMENT_TYPES;\n\n const MenuDivider = () => <div className=\"sc:my-xs sc:h-px sc:bg-border-primary\" />;\n\n return (\n <>\n <Dropdown\n trigger={\n <Tooltip delayDuration={0}>\n <TooltipTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n aria-label={tooltip}\n className={className}\n >\n {icon}\n </Button>\n </TooltipTrigger>\n <TooltipContent>\n <p>{tooltip}</p>\n </TooltipContent>\n </Tooltip>\n }\n isOpen={isOpen}\n onToggle={setIsOpen}\n position=\"bottom\"\n align=\"end\"\n >\n <DropdownMenu minWidth=\"200px\">\n {/* Add Element submenu */}\n <div\n style={{ position: 'relative' }}\n onMouseEnter={() => setAddMenuOpen(true)}\n onMouseLeave={() => setAddMenuOpen(false)}\n >\n <MenuItem icon={<Icon icon={icons.plus} className=\"sc:size-[18px]\" />} label=\"Add Element\" />\n {addMenuOpen && (\n <div\n style={{\n position: 'absolute',\n left: '100%',\n top: 0,\n zIndex: 'var(--sc-z-sticky)',\n }}\n >\n <DropdownMenu minWidth=\"180px\">\n {elementTypes.map((et) => (\n <MenuItem\n key={et.type}\n icon={et.icon}\n label={et.label}\n onClick={() => handleAddElementClick(et.type)}\n />\n ))}\n </DropdownMenu>\n </div>\n )}\n </div>\n\n <MenuDivider />\n\n <MenuItem icon={<Icon icon={icons.save} className=\"sc:size-[18px]\" />} label=\"Save\" onClick={handleSave} />\n <MenuItem icon={<Icon icon={icons.folderOpen} className=\"sc:size-[18px]\" />} label=\"Open\" onClick={handleLoadClick} />\n <MenuItem\n icon={<Icon icon={icons.download} className=\"sc:size-[18px]\" />}\n label=\"Export Image\"\n onClick={handleExportImage}\n disabled={!get().canvasRef?.current}\n />\n\n {onToggleLayersPanel && (\n <>\n <MenuDivider />\n <MenuItem\n icon={<Icon icon={icons.layers} className=\"sc:size-[18px]\" />}\n label={`${isLayersPanelOpen ? 'Hide' : 'Show'} Layers`}\n onClick={() => {\n onToggleLayersPanel();\n setIsOpen(false);\n }}\n />\n </>\n )}\n\n {additionalItems && (\n <>\n <MenuDivider />\n {additionalItems}\n </>\n )}\n </DropdownMenu>\n </Dropdown>\n\n {/* Hidden file input for loading */}\n <input\n ref={fileInputRef}\n type=\"file\"\n accept=\".json\"\n style={{ display: 'none' }}\n onChange={handleFileChange}\n />\n\n {/* Shape type picker — asks which shape to add */}\n <ShapeTypeDrawer\n isOpen={isShapeTypeDrawerOpen}\n onClose={() => setIsShapeTypeDrawerOpen(false)}\n onSelectType={handleSelectShapeType}\n />\n </>\n );\n};\n","'use client';\n\n/**\n * Lazy-loaded image browser shared by `Editor.Add` and `Editor.Menu`\n * (ADR-0085). In the parts composition there is no kit chrome to host the\n * image picker, so the parts own it: choosing \"Image\" opens this browser (a\n * body-portaled drawer); picking an image creates/updates the element\n * through the editor's command path (`ImagePanel`). Before this, the parts'\n * image flow added a transparent placeholder element and stranded the user —\n * no picker ever appeared, and the image toolbar has no replace affordance.\n *\n * Loaded through a dynamic import like `Editor.Controls`' chrome chunk: the\n * browser statically imports editor chrome, and in any valid composition it\n * loads alongside (never before) `Editor.Canvas`'s renderer chunk, keeping\n * this module's static graph renderer-free (import-graph gate). A failed\n * chunk load routes to Root's error card with retry (`E_CHUNK_LOAD_FAILED`).\n */\n\nimport React, { useEffect, useState } from 'react';\nimport { EditorError } from '../../errors/editorError.js';\nimport { useEditorRootInternals } from './RootInternals.js';\n\ntype ImagePanelImpl = (typeof import('../embed/ImagePanel.js'))['ImagePanel'];\n\nexport function LazyImageBrowser({\n part,\n isOpen,\n onOpenChange,\n}: {\n /** The part that owns this browser instance — names the error source. */\n part: 'Editor.Add' | 'Editor.Menu';\n isOpen: boolean;\n onOpenChange: (open: boolean) => void;\n}): React.ReactElement | null {\n const internals = useEditorRootInternals(part);\n const [Impl, setImpl] = useState<ImagePanelImpl | null>(null);\n\n useEffect(() => {\n if (!isOpen || Impl) return;\n let cancelled = false;\n import('../embed/ImagePanel.js').then(\n (m) => {\n if (!cancelled) setImpl(() => m.ImagePanel);\n },\n (err) => {\n if (cancelled) return;\n internals.reportRuntimeError(\n new EditorError(\n 'E_CHUNK_LOAD_FAILED',\n `the editor's image-browser chunk failed to load (${err instanceof Error ? err.message : String(err)}). ` +\n 'This is a network/CDN failure, not a composition mistake — retry, or check the deployment ' +\n 'serves the @snowcone-app/canvas lazy chunks.',\n { cause: err instanceof Error ? err.message : String(err), docSlug: 'embed-mode' },\n ),\n );\n },\n );\n return () => {\n cancelled = true;\n };\n }, [isOpen, Impl, internals]);\n\n // Stay mounted once loaded so the drawer's close animation can play.\n if (!Impl) return null;\n return <Impl isOpen={isOpen} onOpenChange={onOpenChange} />;\n}\n","'use client';\n\n/**\n * `<Editor.Menu>` — the one ⋯ overflow menu (ADR-0085, P3). Wraps the\n * existing `embed/MenuButton` chrome (add element / save / open / export)\n * with the parts contract (`data-sc-part`, `className`/`style`).\n *\n * Requires a mounted `Editor.Canvas` (`E_REQUIRES_CANVAS`, ADR-0085 §4): its\n * actions (export, workspace load, add-element) are editor actions.\n *\n * Re-render containment (D3): MenuButton reads editor state through the\n * stable lazy handles (`useEditorHandles`) inside its event handlers only, so\n * typing in an `Editor.TextField` never re-renders this part.\n */\n\nimport React, { useState, type CSSProperties } from 'react';\nimport { MenuButton } from '../embed/MenuButton.js';\nimport { useRequiresCanvas, useRegisterEditorPart } from './RootInternals.js';\nimport { LazyImageBrowser } from './LazyImageBrowser.js';\n\nexport interface EditorMenuProps {\n className?: string;\n style?: CSSProperties;\n}\n\n/**\n * The editor's overflow menu.\n *\n * Stable since ADR-0085 P4 (the default editor is rebuilt from this public\n * surface, CI-gated); additive-only from here.\n */\nexport function EditorMenu({ className, style }: EditorMenuProps): React.ReactElement {\n useRequiresCanvas('Editor.Menu');\n useRegisterEditorPart('Editor.Menu'); // census (`Editor.audit()`, #10)\n // Add Element → Image opens the image browser (picking an image creates\n // the element) — same flow as Editor.Add. Without this wiring, MenuButton's\n // default path adds a transparent placeholder and strands the user with no\n // picker (and the image toolbar has no replace affordance to recover with).\n const [isImageBrowserOpen, setIsImageBrowserOpen] = useState(false);\n return (\n <div data-sc-part=\"menu\" className={className} style={style}>\n <MenuButton onOpenImageBrowser={() => setIsImageBrowserOpen(true)} />\n <LazyImageBrowser\n part=\"Editor.Menu\"\n isOpen={isImageBrowserOpen}\n onOpenChange={setIsImageBrowserOpen}\n />\n </div>\n );\n}\n","/**\n * UndoRedoControls — a tiny topbar control pair for undo/redo.\n *\n * Registered as the `undo-redo-controls` kit section (referenced by the\n * `pro-studio` preset) and wrapped by `Editor.History` (ADR-0085). Reads\n * command state from the NARROW history sub-context — not the fat\n * `useEditor()` — so it only re-renders when undo/redo availability actually\n * changes (re-render containment, D3).\n */\n\nimport React from 'react';\nimport { ToolbarButton } from '../ui/toolbar-button.js';\nimport { icons } from '../ui/icons.js';\nimport { useHistoryContext } from '../../contexts/HistoryContext.js';\n\nexport const UndoRedoControls: React.FC = () => {\n const { undo, redo, canUndo, canRedo } = useHistoryContext();\n return (\n <div className=\"sc-undo-redo\" style={{ display: 'inline-flex', gap: 4 }}>\n <ToolbarButton\n icon={icons.undo}\n onClick={undo}\n disabled={!canUndo}\n tooltip=\"Undo\"\n aria-label=\"Undo\"\n />\n <ToolbarButton\n icon={icons.redo}\n onClick={redo}\n disabled={!canRedo}\n tooltip=\"Redo\"\n aria-label=\"Redo\"\n />\n </div>\n );\n};\n\nexport default UndoRedoControls;\n","'use client';\n\n/**\n * `<Editor.History>` — undo/redo controls (ADR-0085, P3). Wraps the existing\n * `embed/UndoRedoControls` chrome with the parts contract (`data-sc-part`,\n * `className`/`style`; the host owns placement).\n *\n * Requires a mounted `Editor.Canvas` (`E_REQUIRES_CANVAS`, ADR-0085 §4):\n * commands live in the editor document, and the no-canvas TextField write\n * path bypasses CommandHistory in v1.\n *\n * Re-render containment (D3): the wrapped controls subscribe to the NARROW\n * history sub-context only — they re-render when undo/redo availability\n * changes, not on every editor change.\n */\n\nimport React, { type CSSProperties } from 'react';\nimport { UndoRedoControls } from '../embed/UndoRedoControls.js';\nimport { useRequiresCanvas, useRegisterEditorPart } from './RootInternals.js';\n\nexport interface EditorHistoryProps {\n className?: string;\n style?: CSSProperties;\n}\n\n/**\n * Undo/redo for the editor document.\n *\n * Stable since ADR-0085 P4 (the default editor is rebuilt from this public\n * surface, CI-gated); additive-only from here.\n */\nexport function EditorHistory({ className, style }: EditorHistoryProps): React.ReactElement {\n useRequiresCanvas('Editor.History');\n useRegisterEditorPart('Editor.History'); // census (`Editor.audit()`, #10)\n return (\n <div data-sc-part=\"history\" className={className} style={style}>\n <UndoRedoControls />\n </div>\n );\n}\n","'use client';\n\n/**\n * `<Editor.Add>` — the ⊕ add-element control (ADR-0085, P3). The\n * add-element-menu section extracted as its own part: one button opening the\n * shared element catalog ({@link ADD_ELEMENT_TYPES} — the same list\n * `MenuButton`'s submenu renders, so the two can't drift). Editor chrome,\n * NOT commerce.\n *\n * Requires a mounted `Editor.Canvas` (`E_REQUIRES_CANVAS`, ADR-0085 §4): it\n * opens the editor's add-element flow.\n *\n * Re-render containment (D3): editor state is read through the stable lazy\n * handles inside the click handlers only — this part re-renders on its own\n * open/close state, never on editor changes.\n */\n\nimport React, { useState, type CSSProperties } from 'react';\nimport { Icon } from '@iconify/react';\nimport { Button, Tooltip, TooltipTrigger, TooltipContent, icons } from '../ui';\nimport { Dropdown, DropdownMenu, MenuItem } from '../primitives';\nimport ShapeTypeDrawer from '../ShapeTypeDrawer.js';\nimport { ADD_ELEMENT_TYPES } from '../embed/addElementTypes.js';\nimport { useEditorHandles } from '../../contexts/EditorContext.js';\nimport { useRequiresCanvas, useRegisterEditorPart } from './RootInternals.js';\nimport { LazyImageBrowser } from './LazyImageBrowser.js';\nimport type { ShapeType } from '../../types/index.js';\n\nexport interface EditorAddProps {\n className?: string;\n style?: CSSProperties;\n}\n\n/**\n * The ⊕ add-element menu.\n *\n * Stable since ADR-0085 P4 (the default editor is rebuilt from this public\n * surface, CI-gated); additive-only from here.\n */\nexport function EditorAdd({ className, style }: EditorAddProps): React.ReactElement {\n useRequiresCanvas('Editor.Add');\n useRegisterEditorPart('Editor.Add'); // census (`Editor.audit()`, #10)\n const { get } = useEditorHandles();\n\n const [isOpen, setIsOpen] = useState(false);\n const [isShapeTypeDrawerOpen, setIsShapeTypeDrawerOpen] = useState(false);\n const [isImageBrowserOpen, setIsImageBrowserOpen] = useState(false);\n\n const handleAddElementClick = async (elementType: string) => {\n setIsOpen(false);\n // For shapes, ask which shape first instead of defaulting to a rectangle\n // (same flow as MenuButton's submenu).\n if (elementType === 'shape') {\n setIsShapeTypeDrawerOpen(true);\n return;\n }\n // For images, open the image browser — picking one creates the element\n // (ImagePanel's flow). A bare handleAddElement('image') would add a\n // transparent placeholder and strand the user with no picker.\n if (elementType === 'image') {\n setIsImageBrowserOpen(true);\n return;\n }\n await get().handleAddElement(elementType);\n };\n\n const handleSelectShapeType = async (shapeType: string) => {\n setIsShapeTypeDrawerOpen(false);\n await get().handleAddElement('shape', { shapeType: shapeType as ShapeType });\n };\n\n return (\n <div data-sc-part=\"add\" className={className} style={style}>\n <Dropdown\n trigger={\n <Tooltip delayDuration={0}>\n <TooltipTrigger asChild>\n <Button variant=\"ghost\" size=\"icon\" aria-label=\"Add element\">\n <Icon icon={icons.plus} className=\"sc:size-6\" />\n </Button>\n </TooltipTrigger>\n <TooltipContent>\n <p>Add element</p>\n </TooltipContent>\n </Tooltip>\n }\n isOpen={isOpen}\n onToggle={setIsOpen}\n position=\"bottom\"\n align=\"start\"\n >\n <DropdownMenu minWidth=\"180px\">\n {ADD_ELEMENT_TYPES.map((et) => (\n <MenuItem\n key={et.type}\n icon={et.icon}\n label={et.label}\n onClick={() => handleAddElementClick(et.type)}\n />\n ))}\n </DropdownMenu>\n </Dropdown>\n\n <ShapeTypeDrawer\n isOpen={isShapeTypeDrawerOpen}\n onClose={() => setIsShapeTypeDrawerOpen(false)}\n onSelectType={handleSelectShapeType}\n />\n\n <LazyImageBrowser\n part=\"Editor.Add\"\n isOpen={isImageBrowserOpen}\n onOpenChange={setIsImageBrowserOpen}\n />\n </div>\n );\n}\n","/**\n * useExport - Hook for exporting artboards to images\n * Supports single export and continuous export (Sprint 2) for live mockup updates\n */\n\nimport { useState, useCallback, useRef, useEffect } from 'react';\nimport { useEditor } from '../contexts/EditorContext.js';\nimport { ExportManager } from '../utils/ExportManager.js';\nimport { createLogger } from '../utils/logger.js';\nimport type { ExportImageOptions } from '../utils/ExportManager.js';\n\nconst logger = createLogger('useExport');\n\nexport interface ExportProgress {\n artboardId: string;\n artboardName: string;\n status: 'pending' | 'rendering' | 'complete' | 'error';\n progress: number; // 0-100\n dataUrl?: string;\n error?: Error;\n timestamp: number;\n}\n\nexport interface ContinuousExportOptions {\n artboardIds?: string[]; // Default: all artboards\n interval?: number; // Milliseconds (default: 500)\n scale?: number; // Resolution multiplier (default: 3)\n format?: 'png' | 'jpg';\n onChange?: (results: Record<string, string>) => void; // Callback with new exports\n}\n\nexport interface UseExportReturn {\n // Single export\n exportArtboard: (\n artboardId: string,\n options?: ExportImageOptions\n ) => Promise<string>; // Returns data URL\n\n exportArtboardAsBlob: (\n artboardId: string,\n options?: ExportImageOptions\n ) => Promise<Blob>; // Returns Blob (more efficient for uploads)\n\n exportAllArtboards: (\n options?: ExportImageOptions\n ) => Promise<Record<string, string>>; // artboardId -> data URL\n\n exportAllArtboardsAsBlobs: (\n options?: ExportImageOptions\n ) => Promise<Record<string, Blob>>; // artboardId -> Blob\n\n // Continuous export (Sprint 2)\n startContinuousExport: (options: ContinuousExportOptions) => void;\n stopContinuousExport: () => void;\n\n // State\n isExporting: boolean;\n isContinuousExporting: boolean;\n progress: ExportProgress[];\n latestExports: Record<string, string>; // artboardId -> data URL\n\n // Worker stats\n supportsWorkerExport: boolean;\n workerStats: {\n totalExports: number;\n avgExportTime: number;\n isWorkerActive: boolean;\n };\n}\n\n/**\n * Hook for exporting artboards to images\n * Must be used within EditorProvider\n *\n * @example Single Export\n * ```tsx\n * function ExportButton() {\n * const { exportArtboard, isExporting } = useExport();\n * const { activeArtboardId } = useArtboards();\n *\n * const handleExport = async () => {\n * if (!activeArtboardId) return;\n * const dataUrl = await exportArtboard(activeArtboardId, {\n * scale: 3,\n * format: 'png'\n * });\n * // Download or display dataUrl\n * };\n *\n * return (\n * <button onClick={handleExport} disabled={isExporting}>\n * {isExporting ? 'Exporting...' : 'Export'}\n * </button>\n * );\n * }\n * ```\n *\n * @example Continuous Export (Sprint 2)\n * ```tsx\n * function LiveMockupPreview() {\n * const { startContinuousExport, stopContinuousExport, latestExports } = useExport();\n * const { artboardsInfo } = useArtboards();\n *\n * useEffect(() => {\n * startContinuousExport({\n * interval: 500,\n * scale: 3,\n * onChange: (exports) => {\n * // Send to mockup API\n * Object.entries(exports).forEach(([artboardId, dataUrl]) => {\n * const artboard = artboardsInfo.find(a => a.id === artboardId);\n * sendToMockupAPI(artboard.name, dataUrl);\n * });\n * }\n * });\n *\n * return () => stopContinuousExport();\n * }, []);\n *\n * return <div>Mockup preview...</div>;\n * }\n * ```\n */\nexport function useExport(): UseExportReturn {\n const {\n artboards,\n artboardManager,\n elements,\n canvasRef,\n } = useEditor();\n\n const [isExporting, setIsExporting] = useState(false);\n const [isContinuousExporting, setIsContinuousExporting] = useState(false);\n const [progress, setProgress] = useState<ExportProgress[]>([]);\n const [latestExports, setLatestExports] = useState<Record<string, string>>({});\n const [workerStats, setWorkerStats] = useState({\n totalExports: 0,\n avgExportTime: 0,\n isWorkerActive: false,\n });\n\n // Continuous export loop control\n // Each startContinuousExport call bumps the generation; any running loop\n // from a previous call sees the mismatch and exits without exporting again.\n const continuousExportGeneration = useRef(0);\n const continuousExportOptions = useRef<ContinuousExportOptions | null>(null);\n\n // Check if worker export is supported\n const supportsWorkerExport = ExportManager.supportsWorkerExport();\n\n /**\n * Export a single artboard\n */\n const exportArtboard = useCallback(async (\n artboardId: string,\n options: ExportImageOptions = {}\n ): Promise<string> => {\n const artboard = artboards.find(ab => ab.id === artboardId);\n if (!artboard) {\n throw new Error(`[useExport] Artboard ${artboardId} not found`);\n }\n\n if (!canvasRef.current) {\n throw new Error('[useExport] Canvas ref not available');\n }\n\n setIsExporting(true);\n\n // Add progress tracking\n const progressEntry: ExportProgress = {\n artboardId,\n artboardName: artboard.name,\n status: 'rendering',\n progress: 0,\n timestamp: Date.now(),\n };\n setProgress(prev => [...prev, progressEntry]);\n\n try {\n const startTime = Date.now();\n\n // Read elements fresh via ref — not from closure (which can be stale)\n const currentElements = elementsRef.current;\n const elementIds = artboardManager.getElementsOnArtboard(artboardId);\n const artboardElements = currentElements.filter(el => elementIds.includes(el.id));\n\n // Export using ExportManager (use exportArtboardToDataURL which returns string)\n const dataUrl = await ExportManager.exportArtboardToDataURL(\n artboard,\n artboardElements,\n canvasRef.current!,\n {\n format: options.format || 'png',\n scale: options.scale || 3,\n transparentBackground: options.transparentBackground ?? true,\n ...options,\n }\n );\n\n const exportTime = Date.now() - startTime;\n\n // Update progress\n setProgress(prev => prev.map(p =>\n p.artboardId === artboardId\n ? { ...p, status: 'complete', progress: 100, dataUrl, timestamp: Date.now() }\n : p\n ) as ExportProgress[]);\n\n // Update latest exports\n setLatestExports(prev => ({ ...prev, [artboardId]: dataUrl }));\n\n // Update worker stats\n setWorkerStats(prev => ({\n totalExports: prev.totalExports + 1,\n avgExportTime: (prev.avgExportTime * prev.totalExports + exportTime) / (prev.totalExports + 1),\n isWorkerActive: supportsWorkerExport,\n }));\n\n return dataUrl;\n } catch (error) {\n // Update progress with error\n setProgress(prev => prev.map(p =>\n p.artboardId === artboardId\n ? { ...p, status: 'error', error: error as Error, timestamp: Date.now() }\n : p\n ));\n throw error;\n } finally {\n setIsExporting(false);\n }\n }, [artboards, artboardManager, elements, canvasRef, supportsWorkerExport]);\n\n /**\n * Export all artboards in PARALLEL for maximum performance\n */\n const exportAllArtboards = useCallback(async (\n options: ExportImageOptions = {}\n ): Promise<Record<string, string>> => {\n setIsExporting(true);\n\n try {\n // Export ALL artboards in parallel using Promise.all\n const exportPromises = artboards.map(async (artboard) => {\n const dataUrl = await exportArtboard(artboard.id, options);\n return { id: artboard.id, dataUrl };\n });\n\n const exportResults = await Promise.all(exportPromises);\n\n // Convert array to record\n const results: Record<string, string> = {};\n for (const { id, dataUrl } of exportResults) {\n results[id] = dataUrl;\n }\n\n return results;\n } finally {\n setIsExporting(false);\n }\n }, [artboards, exportArtboard]);\n\n /**\n * Export a single artboard as Blob (more efficient for uploads)\n */\n // Ref to always read the latest elements — avoids stale closure in export callbacks.\n // Without this, the export callback captures `elements` from the render when the\n // callback was created, which can be 1-2 renders behind the actual current state.\n const elementsRef = useRef(elements);\n elementsRef.current = elements;\n\n const exportArtboardAsBlob = useCallback(async (\n artboardId: string,\n options: ExportImageOptions = {}\n ): Promise<Blob> => {\n const artboard = artboards.find(ab => ab.id === artboardId);\n if (!artboard) {\n throw new Error(`[useExport] Artboard ${artboardId} not found`);\n }\n\n if (!canvasRef.current) {\n throw new Error('[useExport] Canvas ref not available');\n }\n\n setIsExporting(true);\n\n try {\n // Read elements fresh via ref — not from closure (which can be stale)\n const currentElements = elementsRef.current;\n const elementIds = artboardManager.getElementsOnArtboard(artboardId);\n const artboardElements = currentElements.filter(el => elementIds.includes(el.id));\n\n // Export using ExportManager blob method\n const blob = await ExportManager.exportArtboardToBlob(\n artboard,\n artboardElements,\n canvasRef.current!,\n {\n format: options.format || 'png',\n scale: options.scale || 3,\n transparentBackground: options.transparentBackground ?? true,\n ...options,\n }\n );\n\n return blob;\n } finally {\n setIsExporting(false);\n }\n }, [artboards, artboardManager, elements, canvasRef]);\n\n /**\n * Export all artboards as Blobs in PARALLEL for maximum performance\n */\n const exportAllArtboardsAsBlobs = useCallback(async (\n options: ExportImageOptions = {}\n ): Promise<Record<string, Blob>> => {\n setIsExporting(true);\n\n try {\n // Export ALL artboards in parallel using Promise.all\n const exportPromises = artboards.map(async (artboard) => {\n const blob = await exportArtboardAsBlob(artboard.id, options);\n return { id: artboard.id, blob };\n });\n\n const exportResults = await Promise.all(exportPromises);\n\n // Convert array to record\n const results: Record<string, Blob> = {};\n for (const { id, blob } of exportResults) {\n results[id] = blob;\n }\n\n return results;\n } finally {\n setIsExporting(false);\n }\n }, [artboards, exportArtboardAsBlob]);\n\n /**\n * Stop continuous export (Sprint 2)\n */\n const stopContinuousExport = useCallback(() => {\n // Bump generation so any in-flight loop exits after its current export\n continuousExportGeneration.current++;\n setIsContinuousExporting(false);\n continuousExportOptions.current = null;\n }, []);\n\n /**\n * Start continuous export\n * Exports artboards at a specified interval for live mockup updates.\n * Uses a promise-based loop so a new export only starts after the previous\n * one completes, preventing unbounded queue buildup when exports are slow.\n */\n const startContinuousExport = useCallback((options: ContinuousExportOptions) => {\n // Invalidate any existing loop by bumping the generation counter\n continuousExportGeneration.current++;\n const myGeneration = continuousExportGeneration.current;\n\n // Store options\n continuousExportOptions.current = options;\n setIsContinuousExporting(true);\n\n const {\n artboardIds,\n interval = 500,\n scale = 3,\n format = 'png',\n onChange,\n } = options;\n\n // Determine which artboards to export\n const targetArtboards = artboardIds\n ? artboards.filter(ab => artboardIds.includes(ab.id))\n : artboards;\n\n // Returns true only while this particular loop instance is still active\n const isCurrentGeneration = () =>\n continuousExportGeneration.current === myGeneration;\n\n // Export function - exports ALL artboards in PARALLEL\n const performExport = async () => {\n try {\n const exportPromises = targetArtboards.map(async (artboard) => {\n const dataUrl = await exportArtboard(artboard.id, {\n scale,\n format,\n transparentBackground: true,\n });\n return { id: artboard.id, dataUrl };\n });\n\n const exportResults = await Promise.all(exportPromises);\n\n const results: Record<string, string> = {};\n for (const { id, dataUrl } of exportResults) {\n results[id] = dataUrl;\n }\n\n setLatestExports(prev => ({ ...prev, ...results }));\n\n if (onChange) {\n onChange(results);\n }\n } catch (error) {\n logger.error('[useExport] Continuous export error:', error);\n }\n };\n\n // Promise-based scheduling: perform export, wait for interval, repeat.\n // This guarantees no new export starts until the previous one finishes,\n // eliminating queue buildup when exports take longer than the interval.\n const runLoop = async () => {\n await performExport();\n while (isCurrentGeneration()) {\n await new Promise<void>(resolve => setTimeout(resolve, interval));\n if (!isCurrentGeneration()) break;\n await performExport();\n }\n };\n\n runLoop();\n }, [artboards, exportArtboard]);\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n stopContinuousExport();\n };\n }, [stopContinuousExport]);\n\n return {\n exportArtboard,\n exportArtboardAsBlob,\n exportAllArtboards,\n exportAllArtboardsAsBlobs,\n startContinuousExport,\n stopContinuousExport,\n isExporting,\n isContinuousExporting,\n progress,\n latestExports,\n supportsWorkerExport,\n workerStats,\n };\n}\n","/**\n * imageSearch — wire-contract types + proxy clients for the Image Browser's\n * privileged services (stock-image search, AI image generation).\n *\n * The canvas package NEVER talks to image/AI vendors directly and NEVER sees a\n * vendor API key. Instead, the embedder hosts same-origin proxy routes (the\n * `grantUrl` pattern) and hands their URLs to the canvas via the `services`\n * prop on `SnowconeCanvas` / `RealtimeEmbed`. Vendor keys live on the\n * embedder's server, behind those routes.\n *\n * Wire contract for `{imageSearchUrl}` (a www/Next route and an SDK server\n * handler are built against this exact shape — do not deviate):\n *\n * ```\n * GET {imageSearchUrl}?query=<string, may be empty>&page=<1-based int>&perPage=<int, default 30>\n * → 200 ImageSearchResponse\n * Empty query = featured/popular feed.\n * Errors: non-2xx with JSON { error: string }.\n *\n * POST {imageSearchUrl} body: { action: 'track-select', id, source, downloadLocation? }\n * → 200 { ok: true }\n * ```\n *\n * Wire contract for `{generateUrl}` (matches the existing www\n * `/api/generate-image` route):\n *\n * ```\n * POST {generateUrl} body: { prompt, width?, height?, numberResults? }\n * → 200 { images: Array<{ imageUrl: string }> }\n * Errors: non-2xx with JSON { error: string } (or { message }).\n * ```\n *\n * Wire contract for `{bgRemoveUrl}` (matches the existing www `/api/bg-remove`\n * route):\n *\n * ```\n * POST {bgRemoveUrl} body: { imageUrl: string (http(s) only) }\n * → 200 { imageUrl: string } (the background-removed image URL)\n * Errors: non-2xx with JSON { error: string } (or { message }).\n * ```\n */\n\n/** A single stock-image result, source-agnostic. */\nexport interface ImageSearchResult {\n /** Globally unique id, e.g. \"unsplash-abc123\". */\n id: string;\n /** Which upstream source produced this result. */\n source: 'unsplash' | 'pixabay';\n /** Intrinsic pixel width of the full image. */\n width: number;\n /** Intrinsic pixel height of the full image. */\n height: number;\n /** Alt text / description, when the source provides one. */\n alt: string | null;\n /** Renditions, smallest → largest. */\n urls: {\n thumb: string;\n small: string;\n regular: string;\n full: string;\n };\n /** Credit for the photographer/creator (display per source guidelines). */\n attribution: {\n name: string;\n username?: string;\n profileUrl?: string;\n sourceUrl?: string;\n };\n /**\n * Unsplash `download_location` — echoed back on track-select so the server\n * can trigger the download event (Unsplash API guideline when a photo is\n * actually used).\n */\n downloadLocation?: string;\n}\n\n/** Response shape for an image search page. */\nexport interface ImageSearchResponse {\n results: ImageSearchResult[];\n /** The 1-based page these results belong to. */\n page: number;\n /** Whether another page is available. */\n hasMore: boolean;\n}\n\n/** Parameters for one search page. Empty query = featured/popular feed. */\nexport interface ImageSearchParams {\n query: string;\n /** 1-based page number. */\n page: number;\n /** Results per page (default 30). */\n perPage?: number;\n}\n\n/**\n * Provider interface the Image Browser's search tab consumes. Usually created\n * from a URL via {@link createProxyImageSearch}; pass a custom implementation\n * through `services.imageSearch` for full control.\n */\nexport interface ImageSearchProvider {\n search(params: ImageSearchParams): Promise<ImageSearchResponse>;\n /**\n * Called (fire-and-forget) when a user selects a result. Implementations\n * should report usage upstream where required (e.g. Unsplash\n * `download_location`). Errors are ignored by the caller.\n */\n trackSelect?(result: ImageSearchResult): void | Promise<void>;\n}\n\n/** Parameters for an AI image generation request. */\nexport interface GenerateParams {\n prompt: string;\n width?: number;\n height?: number;\n numberResults?: number;\n}\n\n/** Response shape for an AI image generation request. */\nexport interface GenerateResponse {\n images: Array<{ imageUrl: string }>;\n}\n\n/**\n * Provider interface the Image Browser's \"remove background\" button consumes.\n * Given an image URL (the placed element's `imageUrl`), resolve to the\n * background-removed image URL. Usually created from a URL via\n * {@link createProxyBgRemove}; the server behind that URL holds the vendor key\n * and spends the per-op budget.\n */\nexport type BgRemoveProvider = (imageUrl: string) => Promise<string>;\n\n/**\n * Provider interface the Image Browser's AI tab consumes. Usually created from\n * a URL via {@link createProxyGenerate}; the server behind that URL picks the\n * model and holds the vendor key.\n */\nexport interface GenerateProvider {\n generate(params: GenerateParams): Promise<GenerateResponse>;\n}\n\n/** Extract a human-readable error from a proxy response, without ever leaking\n * internals. Prefers JSON `{ error }` then `{ message }`. */\nasync function readProxyError(response: Response, fallback: string): Promise<string> {\n try {\n const data: unknown = await response.json();\n if (data && typeof data === 'object') {\n const obj = data as { error?: unknown; message?: unknown };\n if (typeof obj.error === 'string' && obj.error) return obj.error;\n if (typeof obj.message === 'string' && obj.message) return obj.message;\n }\n } catch {\n // non-JSON body — fall through\n }\n return fallback;\n}\n\n/**\n * Create an {@link ImageSearchProvider} backed by a same-origin proxy route.\n *\n * @param url The embedder-hosted route implementing the image-search wire\n * contract. Host this URL on your server; your vendor keys live there.\n */\nexport function createProxyImageSearch(url: string): ImageSearchProvider {\n return {\n async search({ query, page, perPage = 30 }: ImageSearchParams): Promise<ImageSearchResponse> {\n const params = new URLSearchParams({\n query,\n page: String(page),\n perPage: String(perPage),\n });\n const sep = url.includes('?') ? '&' : '?';\n const response = await fetch(`${url}${sep}${params.toString()}`, {\n method: 'GET',\n credentials: 'same-origin',\n });\n if (!response.ok) {\n throw new Error(await readProxyError(response, `Image search failed (${response.status})`));\n }\n return (await response.json()) as ImageSearchResponse;\n },\n\n trackSelect(result: ImageSearchResult): void {\n // Fire-and-forget — selection must never block or surface errors.\n void fetch(url, {\n method: 'POST',\n credentials: 'same-origin',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n action: 'track-select',\n id: result.id,\n source: result.source,\n ...(result.downloadLocation ? { downloadLocation: result.downloadLocation } : {}),\n }),\n }).catch(() => undefined);\n },\n };\n}\n\n/**\n * Create a {@link GenerateProvider} backed by a same-origin proxy route\n * (e.g. the www `/api/generate-image` route).\n *\n * @param url The embedder-hosted route. Host this URL on your server; your\n * vendor keys live there and the server picks the model.\n */\nexport function createProxyGenerate(url: string): GenerateProvider {\n return {\n async generate({ prompt, width, height, numberResults }: GenerateParams): Promise<GenerateResponse> {\n const response = await fetch(url, {\n method: 'POST',\n credentials: 'same-origin',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ prompt, width, height, numberResults }),\n });\n if (!response.ok) {\n throw new Error(await readProxyError(response, `Image generation failed (${response.status})`));\n }\n const data = (await response.json()) as { images?: Array<{ imageUrl: string }>; imageUrl?: string };\n const images = data.images ?? (data.imageUrl ? [{ imageUrl: data.imageUrl }] : []);\n return { images };\n },\n };\n}\n\n/**\n * Unwrap a CORS-proxy form (`/api/image-proxy?url=<encoded>`) back to the\n * original URL. Placed canvas elements usually carry the proxy form so the\n * browser can read their pixels for export; the embedder's server can't fetch a\n * relative URL, so the bg-remove proxy needs the original. Same logic as www's\n * `deproxyImageUrl`, inlined so the canvas package has no app dependency.\n */\nfunction deproxyImageUrl(url: string): string {\n const marker = '/api/image-proxy?url=';\n if (!url || !url.startsWith(marker)) return url;\n try {\n return decodeURIComponent(url.slice(marker.length));\n } catch {\n return url;\n }\n}\n\n/**\n * Create a {@link BgRemoveProvider} backed by a same-origin proxy route\n * (e.g. the www `/api/bg-remove` route).\n *\n * The provider deproxies a `/api/image-proxy?url=…` source back to its original\n * URL, then rejects anything that isn't an `http(s)` URL — `data:` / `blob:`\n * sources (in-progress uploads) have no server-fetchable URL — before POSTing\n * `{ imageUrl }` and returning the `{ imageUrl }` it gets back.\n *\n * @param url The embedder-hosted route. Host this URL on your server; your\n * vendor key lives there and the server spends the per-op budget.\n */\nexport function createProxyBgRemove(url: string): BgRemoveProvider {\n return async function removeBackground(imageUrl: string): Promise<string> {\n // Placed elements usually carry the CORS proxy form\n // (/api/image-proxy?url=…) — the server can't fetch a relative URL, so send\n // the original. data:/blob: sources (in-progress uploads) have no\n // server-fetchable URL at all.\n const sourceUrl = deproxyImageUrl(imageUrl);\n if (!/^https?:\\/\\//.test(sourceUrl)) {\n throw new Error(\"Background removal isn't available for this image yet\");\n }\n const response = await fetch(url, {\n method: 'POST',\n credentials: 'same-origin',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ imageUrl: sourceUrl }),\n });\n const data = (await response.json().catch(() => null)) as\n | { imageUrl?: string; error?: string; message?: string }\n | null;\n if (!response.ok || !data?.imageUrl) {\n throw new Error(data?.error || data?.message || `Background removal failed (${response.status})`);\n }\n return data.imageUrl;\n };\n}\n","'use client';\n\n/**\n * CanvasServicesContext — privileged-service wiring for the editor chrome.\n *\n * The Image Browser's search / AI / vector tabs need server-held vendor keys.\n * The canvas package never reads those keys; the embedder hosts same-origin\n * proxy routes (the `grantUrl` pattern) and passes their URLs — or full\n * provider implementations — through the `services` prop on `SnowconeCanvas`\n * or `RealtimeEmbed`. Tabs whose service isn't configured simply don't render.\n */\n\nimport React, { createContext, useContext, useMemo, type ReactNode } from 'react';\nimport {\n createProxyBgRemove,\n createProxyGenerate,\n createProxyImageSearch,\n type GenerateProvider,\n type ImageSearchProvider,\n} from '../services/imageSearch.js';\n\n/**\n * A vector/icon search result (dev-playground surface; no public wire\n * contract yet — typed loosely on purpose).\n */\nexport interface VectorSearchResult {\n id: string;\n /** The search term / icon name. */\n term: string;\n urls: {\n preview: string;\n svg?: string;\n png?: string;\n };\n uploader: { name: string };\n /** Final URL to insert when selected (already proxied if needed). Falls back\n * to `urls.svg` then `urls.png`. */\n selectUrl?: string;\n}\n\n/** Vector/icon search provider (dev-playground only for now). */\nexport interface VectorSearchProvider {\n /** Empty query = featured icons. `nextPage` is an opaque pagination token. */\n search(params: { query: string; nextPage?: string | null }): Promise<{\n results: VectorSearchResult[];\n nextPage: string | null;\n }>;\n}\n\n/**\n * Privileged services available to the editor chrome. All optional — an\n * unconfigured service hides its UI entirely.\n *\n * Shorthand URL props create proxy providers; explicit provider objects win\n * over their URL shorthand.\n */\nexport interface CanvasServices {\n /**\n * URL of your image-search proxy route (see `createProxyImageSearch` for the\n * wire contract). Host this URL on your server; your stock-image vendor keys\n * (Unsplash, Pixabay, …) live there.\n */\n imageSearchUrl?: string;\n /**\n * URL of your AI-generation proxy route (`POST { prompt, width?, height?,\n * numberResults? }` → `{ images: [{ imageUrl }] }`). Host this URL on your\n * server; your AI vendor keys live there and the server picks the model.\n */\n generateUrl?: string;\n /** Advanced override: full image-search provider. Wins over `imageSearchUrl`. */\n imageSearch?: ImageSearchProvider;\n /** Advanced override: full generation provider. Wins over `generateUrl`. */\n generate?: GenerateProvider;\n /** Vector/icon search provider (dev playground only — no wire contract yet). */\n vectors?: VectorSearchProvider;\n /**\n * URL of your background-removal proxy route (`POST { imageUrl }` →\n * `{ imageUrl }`; see `createProxyBgRemove` for the wire contract). Host this\n * URL on your server; your bg-remove vendor key lives there.\n */\n bgRemoveUrl?: string;\n /**\n * Advanced override: full background-removal provider. Given an image URL\n * (or data URL), resolve to the processed image URL/data URL. Wins over\n * `bgRemoveUrl`.\n */\n removeBackground?: (imageUrl: string) => Promise<string>;\n}\n\n/** The resolved providers consumers actually use. */\nexport interface ResolvedCanvasServices {\n imageSearch?: ImageSearchProvider;\n generate?: GenerateProvider;\n vectors?: VectorSearchProvider;\n removeBackground?: (imageUrl: string) => Promise<string>;\n}\n\nconst EMPTY_SERVICES: ResolvedCanvasServices = {};\n\nconst CanvasServicesContext = createContext<ResolvedCanvasServices>(EMPTY_SERVICES);\n\nexport interface CanvasServicesProviderProps {\n services?: CanvasServices;\n children?: ReactNode;\n}\n\n/**\n * Provides resolved service providers to the editor chrome. `SnowconeCanvas`\n * and `RealtimeEmbed` mount this automatically when given a `services` prop;\n * use it directly only when composing the lower-level pieces yourself.\n */\nexport function CanvasServicesProvider({ services, children }: CanvasServicesProviderProps): React.ReactElement {\n const value = useMemo<ResolvedCanvasServices>(() => {\n if (!services) return EMPTY_SERVICES;\n return {\n imageSearch:\n services.imageSearch ??\n (services.imageSearchUrl ? createProxyImageSearch(services.imageSearchUrl) : undefined),\n generate:\n services.generate ?? (services.generateUrl ? createProxyGenerate(services.generateUrl) : undefined),\n vectors: services.vectors,\n removeBackground:\n services.removeBackground ??\n (services.bgRemoveUrl ? createProxyBgRemove(services.bgRemoveUrl) : undefined),\n };\n // Keyed on the FIELD values (not the object identity) so an embedder\n // passing an inline `services={{ imageSearchUrl: '/api/…' }}` — the natural\n // way to write it — doesn't mint new providers on every render. Same\n // reasoning as RealtimeEmbed's productKey.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [\n services?.imageSearch,\n services?.imageSearchUrl,\n services?.generate,\n services?.generateUrl,\n services?.vectors,\n services?.bgRemoveUrl,\n services?.removeBackground,\n ]);\n\n return <CanvasServicesContext.Provider value={value}>{children}</CanvasServicesContext.Provider>;\n}\n\n/**\n * Read the resolved canvas services. Safe to call anywhere — outside a\n * provider it returns an empty object (every service-gated UI hides).\n */\nexport function useCanvasServices(): ResolvedCanvasServices {\n return useContext(CanvasServicesContext);\n}\n","/**\n * Service for fetching and managing all Google Fonts\n */\n\nimport { createLogger } from './logger';\n\nconst logger = createLogger('GoogleFontsService');\n\nexport interface GoogleFontMetadata {\n family: string;\n category: string;\n subsets?: string[];\n variants?: string[];\n version?: string;\n lastModified?: string;\n popularity?: number;\n}\n\nlet allGoogleFonts: GoogleFontMetadata[] = [];\nlet fetchPromise: Promise<GoogleFontMetadata[]> | null = null;\n\n/**\n * Fetch all Google Fonts from metadata endpoint\n * Results are cached after first fetch\n */\nexport async function fetchAllGoogleFonts(): Promise<GoogleFontMetadata[]> {\n // Return cached if available\n if (allGoogleFonts.length > 0) {\n return allGoogleFonts;\n }\n\n // Return existing promise if fetch in progress\n if (fetchPromise) {\n return fetchPromise;\n }\n\n // Start new fetch - Use local static file\n fetchPromise = fetch('/google-fonts.json')\n .then((response) => {\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n return response.json();\n })\n .then((data) => {\n\n // Handle font array format\n if (Array.isArray(data)) {\n allGoogleFonts = data.map((font: Record<string, unknown>) => ({\n family: font.family as string,\n category: (font.category as string) || 'sans-serif',\n subsets: (font.subsets as string[]) || [],\n variants: (font.variants as string[]) || [],\n popularity: font.popularity as number | undefined,\n }));\n } else {\n logger.error('Unexpected API response structure:', data);\n }\n return allGoogleFonts;\n })\n .catch((error) => {\n logger.error('Error fetching Google Fonts:', error);\n fetchPromise = null; // Reset promise on error so it can be retried\n return [];\n });\n\n return fetchPromise;\n}\n\n/**\n * Get all Google Fonts (uses cache if available)\n */\nexport function getAllGoogleFonts(): GoogleFontMetadata[] {\n return allGoogleFonts;\n}\n\n/**\n * Check if fonts have been loaded\n */\nexport function isFontsLoaded(): boolean {\n return allGoogleFonts.length > 0;\n}\n\n/**\n * Search Google Fonts by name\n */\nexport function searchGoogleFonts(query: string): GoogleFontMetadata[] {\n if (!query) return allGoogleFonts;\n\n const searchTerm = query.toLowerCase();\n return allGoogleFonts.filter((font) => font.family.toLowerCase().includes(searchTerm));\n}\n\n/**\n * Filter Google Fonts by category\n */\nexport function filterGoogleFontsByCategory(category: string): GoogleFontMetadata[] {\n if (!category || category === 'all') return allGoogleFonts;\n\n return allGoogleFonts.filter((font) => font.category.toLowerCase() === category.toLowerCase());\n}\n\n/**\n * Map Google Fonts category to our internal categories\n */\nexport function mapGoogleCategory(googleCategory: string): string {\n const mapping: Record<string, string> = {\n 'sans serif': 'sans-serif',\n serif: 'serif',\n display: 'display',\n handwriting: 'script',\n monospace: 'monospace',\n };\n\n return mapping[googleCategory.toLowerCase()] || 'display';\n}\n","/**\n * UnifiedFontService - System fonts + Google Fonts\n *\n * Features:\n * - Dual search strategy: text search + category filtering\n * - Font deduplication (by family name)\n * - Unified font loading (Google CSS link injection)\n *\n * Fonts the picker exposes must be on Google Fonts so they render\n * identically across iOS, macOS, Windows, Android, and ChromeOS.\n */\n\nimport { FontCategory, FontDefinition, TSHIRT_FONTS } from '../fonts/google-fonts.js';\nimport {\n fetchAllGoogleFonts,\n getAllGoogleFonts,\n isFontsLoaded as isGoogleFontsLoaded,\n GoogleFontMetadata,\n mapGoogleCategory,\n} from './GoogleFontsService.js';\nimport { createLogger } from './logger.js';\n\nconst logger = createLogger('UnifiedFontService');\n\n// ============================================================================\n// UnifiedFontService Class\n// ============================================================================\n\nclass UnifiedFontServiceClass {\n // Search result cache\n private searchCache: Map<string, FontDefinition[]> = new Map();\n\n // Track preview font links for cleanup (prevents iOS Safari memory crashes)\n // With text= parameter, each preview font is ~0.1KB (not 50KB), so we can keep many loaded\n // Cleanup happens when drawer closes via clearPreviewFonts()\n private previewFontLinks: Set<string> = new Set();\n\n // ========================================\n // Initialization\n // ========================================\n\n /**\n * Initialize Google Fonts\n */\n async initialize(): Promise<void> {\n try {\n await fetchAllGoogleFonts();\n } catch (error) {\n logger.error('Failed to initialize UnifiedFontService:', error);\n // Graceful degradation: Continue even if Google Fonts fail\n }\n }\n\n /**\n * Check if fonts are loaded\n */\n isFontsLoaded(): boolean {\n return isGoogleFontsLoaded();\n }\n\n // ========================================\n // Font Retrieval\n // ========================================\n\n /**\n * Get all fonts.\n * Returns system fonts + Google Fonts (deduplicated)\n */\n getAllFonts(): FontDefinition[] {\n const systemFonts = TSHIRT_FONTS.filter(f => !f.googleFont);\n const googleFonts = this.mapGoogleFonts(getAllGoogleFonts());\n\n return this.mergeFonts([...systemFonts, ...googleFonts]);\n }\n\n /**\n * Get recommended fonts (TSHIRT_FONTS curated list)\n */\n getRecommendedFonts(): FontDefinition[] {\n return TSHIRT_FONTS;\n }\n\n // ========================================\n // Dual Search Strategy\n // ========================================\n\n /**\n * Search fonts by name (text search)\n */\n async searchFontsByName(query: string): Promise<FontDefinition[]> {\n if (!query.trim()) {\n return this.getAllFonts();\n }\n\n // Check cache\n const cacheKey = `search:${query.toLowerCase()}`;\n if (this.searchCache.has(cacheKey)) {\n return this.searchCache.get(cacheKey)!;\n }\n\n const normalizedQuery = query.toLowerCase().trim();\n\n // Search Google Fonts (client-side filter)\n const googleResults = getAllGoogleFonts()\n .filter((f) => f.family.toLowerCase().includes(normalizedQuery))\n .map((f) => this.mapGoogleFont(f));\n\n // Merge and deduplicate\n const results = this.mergeFonts(googleResults);\n\n // Cache results\n this.searchCache.set(cacheKey, results);\n\n return results;\n }\n\n /**\n * Filter fonts by category\n */\n async filterFontsByCategory(category: FontCategory): Promise<FontDefinition[]> {\n if (category === 'system') {\n // System fonts only\n return TSHIRT_FONTS.filter((f) => !f.googleFont);\n }\n\n // Check cache\n const cacheKey = `category:${category}`;\n if (this.searchCache.has(cacheKey)) {\n return this.searchCache.get(cacheKey)!;\n }\n\n // Filter Google Fonts (client-side)\n const googleResults = getAllGoogleFonts()\n .filter((f) => {\n const mappedCategory = mapGoogleCategory(f.category);\n return mappedCategory === category;\n })\n .map((f) => this.mapGoogleFont(f));\n\n // Merge and deduplicate\n const results = this.mergeFonts(googleResults);\n\n // Cache results\n this.searchCache.set(cacheKey, results);\n\n return results;\n }\n\n /**\n * Combined search: text search + category filter\n * Option A: Search overrides category (simpler UX)\n */\n async searchAndFilterFonts(\n query: string,\n category: FontCategory | 'all'\n ): Promise<FontDefinition[]> {\n if (query.trim()) {\n // Search overrides category\n return this.searchFontsByName(query);\n } else if (category !== 'all') {\n // Category filter\n return this.filterFontsByCategory(category);\n } else {\n // Show all\n return this.getAllFonts();\n }\n }\n\n // ========================================\n // Font Loading\n // ========================================\n\n /**\n * Load a font. All exposed fonts are Google fonts; the picker no\n * longer offers true \"system\" fonts that aren't on Google Fonts\n * because Android lacks them and we'd render inconsistently across\n * platforms.\n */\n async loadFont(font: FontDefinition): Promise<void> {\n try {\n if (font.googleFont) {\n this.loadGoogleFont(font.name);\n }\n } catch (error) {\n logger.error(`Failed to load font ${font.name}:`, error);\n }\n }\n\n /**\n * Load a Google Font by family name alone (full font, link injection).\n * For callers that only have a family string — e.g. `useFontBinding`\n * applying a template's designer-curated font option — not a full\n * {@link FontDefinition}. Idempotent per family.\n */\n loadGoogleFontByName(fontName: string): void {\n this.loadGoogleFont(fontName);\n }\n\n /**\n * Load Google Font via CSS link injection (full font)\n */\n private loadGoogleFont(fontName: string): void {\n // Check if font is already loaded\n const linkId = `font-${fontName.replace(/\\s+/g, '-').toLowerCase()}`;\n if (document.getElementById(linkId)) return;\n\n // Create link element\n const link = document.createElement('link');\n link.id = linkId;\n link.rel = 'stylesheet';\n link.href = `https://fonts.googleapis.com/css2?family=${fontName.replace(/\\s+/g, '+')}:wght@400;700&display=swap`;\n document.head.appendChild(link);\n }\n\n /**\n * Load Google Font with only specific characters (for previews)\n * Uses the text= parameter to load minimal glyphs (~99.9% smaller than full font)\n * See: https://developers.google.com/fonts/docs/getting_started#optimizing_your_font_requests\n *\n * @param fontName - Font family name\n * @param text - Text to render (only these characters will be loaded)\n */\n loadGoogleFontForPreview(fontName: string, text: string): void {\n // Encode text for URL (handles spaces, international characters, etc.)\n const encodedText = encodeURIComponent(text);\n // Use simple link ID based on font name only - we just need the font loaded\n // for preview, the exact characters don't matter for the ID\n const linkId = `font-preview-${fontName.replace(/\\s+/g, '-').toLowerCase()}`;\n\n // Check if already loaded\n if (document.getElementById(linkId)) return;\n\n // No eviction during browsing - with text= parameter each font is ~0.1KB\n // Cleanup happens when drawer closes via clearPreviewFonts()\n\n // Create link element with text= parameter for minimal glyph loading\n const link = document.createElement('link');\n link.id = linkId;\n link.rel = 'stylesheet';\n // Use text= parameter - only loads glyphs needed for the preview text\n link.href = `https://fonts.googleapis.com/css2?family=${fontName.replace(/\\s+/g, '+')}&display=swap&text=${encodedText}`;\n document.head.appendChild(link);\n this.previewFontLinks.add(linkId);\n }\n\n /**\n * Clear all preview font links from DOM\n * Call this when closing the font browser to free memory\n */\n clearPreviewFonts(): void {\n this.previewFontLinks.forEach((linkId) => {\n const link = document.getElementById(linkId);\n if (link) {\n link.remove();\n }\n });\n this.previewFontLinks.clear();\n }\n\n /**\n * Get count of loaded preview fonts\n */\n getPreviewFontCount(): number {\n return this.previewFontLinks.size;\n }\n\n // ========================================\n // Font Mapping & Merging\n // ========================================\n\n /**\n * Map Google Font metadata to FontDefinition\n */\n private mapGoogleFont(googleFont: GoogleFontMetadata): FontDefinition {\n return {\n name: googleFont.family,\n category: mapGoogleCategory(googleFont.category) as FontCategory,\n googleFont: true,\n source: 'google',\n weights: googleFont.variants\n ?.map((v) => {\n // Map variant strings like \"regular\", \"700\", \"700italic\" to numbers\n const match = v.match(/\\d+/);\n if (match) return parseInt(match[0], 10);\n if (v === 'regular') return 400;\n return null;\n })\n .filter((w): w is number => w !== null) || [400],\n };\n }\n\n /**\n * Map Google Fonts array to FontDefinitions\n */\n private mapGoogleFonts(googleFonts: GoogleFontMetadata[]): FontDefinition[] {\n return googleFonts.map((f) => this.mapGoogleFont(f));\n }\n\n /**\n * Merge fonts from multiple sources and deduplicate by family name\n */\n private mergeFonts(fonts: FontDefinition[]): FontDefinition[] {\n const fontMap = new Map<string, FontDefinition>();\n\n fonts.forEach((font) => {\n const key = font.name.toLowerCase().trim();\n\n // First occurrence wins\n if (!fontMap.has(key)) {\n fontMap.set(key, font);\n }\n });\n\n // Sort alphabetically\n return Array.from(fontMap.values()).sort((a, b) => a.name.localeCompare(b.name));\n }\n\n // ========================================\n // Cache Management\n // ========================================\n\n /**\n * Clear search cache\n */\n clearSearchCache(): void {\n this.searchCache.clear();\n }\n\n /**\n * Clear all caches\n */\n clearAllCaches(): void {\n this.clearSearchCache();\n }\n\n // ========================================\n // Stats & Debugging\n // ========================================\n\n /**\n * Get service stats for debugging\n */\n getStats() {\n const allFonts = this.getAllFonts();\n const googleFonts = allFonts.filter((f) => f.googleFont);\n const systemFonts = allFonts.filter((f) => !f.googleFont);\n\n return {\n initialized: this.isFontsLoaded(),\n totalFonts: allFonts.length,\n googleFontsCount: googleFonts.length,\n systemFontsCount: systemFonts.length,\n searchCacheSize: this.searchCache.size,\n };\n }\n}\n\n// Export singleton instance\nexport const UnifiedFontService = new UnifiedFontServiceClass();\n"],"names":["canvasIcons","isBrowser","registerCanvasIcons","addIcon","iconify","name","data","registrationStarted","ensureIconsRegistered","log","createLogger","AUTO_REFRESH_PREVIEWS_DEBOUNCE_MS","generateElementPreviewAsync","element","size","backgroundColor","paint","getElementPreviewPainter","error","buildLayerTree","elements","selectedId","multiSelection","previewCache","generatePreview","depth","parentId","el","elParentId","GroupElement","isGroup","isSelected","layerInfo","flattenLayerTree","layers","result","layer","useLayers","options","filterArtboardId","includeHidden","previewSize","previewBackgroundColor","autoRefreshPreviews","artboardManager","handleSelectionChange","handleElementUpdate","setMultiSelection","executeAddElement","executeRemoveElement","executeReorderElement","useEditor","useRef","previewVersion","setPreviewVersion","useState","activeArtboardId","effectiveArtboardId","effectiveArtboard","_a","resolvedPreviewBackgroundColor","useCallback","elementId","preview","v","filteredElements","useMemo","filtered","elementIds","flatLayers","selectedLayers","selectLayer","id","addToSelection","sid","selectMultipleLayers","ids","clearSelection","toggleVisibility","updated","toggleLock","renameLayer","deleteLayer","duplicateLayer","json","Constructor","clonedWithNewId","artboardId","reorderLayers","fromIndex","toIndex","draggedElement","targetElement","position","moveLayerForward","index","l","moveLayerBackward","groupLayers","elementsToGroup","artboardIds","uniqueArtboardIds","bboxes","minX","b","minY","group","clone","ungroupLayer","extractedChildren","child","generateAllPreviews","generateForElements","useEffect","timer","clearPreviewCache","reorderById","draggedId","targetId","reorderWithinGroup","groupId","newGroup","draggedIndex","c","targetIndex","dragged","newTargetIndex","insertIndex","findElementById","findParentGroup","addToGroup","childClone","removeFromGroup","parentGroup","promoted","createEmptyGroup","getIconsTree","names","icons","aliases","resolved","resolve","parent","value","defaultIconDimensions","defaultIconTransformations","defaultIconProps","defaultExtendedIconProps","mergeIconTransformations","obj1","obj2","rotate","mergeIconData","key","internalGetIconData","tree","currentProps","parse","name$1","parseIconSet","callback","item","optionalPropertyDefaults","checkOptionalProps","defaults","prop","quicklyValidateIconSet","obj","icon","dataStorage","newStorage","provider","prefix","getStorage","providerStorage","addIconSet","storage","addIconToStorage","matchIconName","stringToIcon","validate","allowSimpleName","colonSeparated","validateIconName","dashSeparated","simpleNames","allowSimpleNames","allow","getIconData","iconName","addCollection","added","defaultIconSizeCustomisations","defaultIconCustomisations","unitsSplit","unitsTest","calculateSize","ratio","precision","oldParts","newParts","code","isNumber","num","splitSVGDefs","content","tag","defs","start","end","endEnd","mergeDefsAndContent","wrapSVGContent","body","split","isUnsetKeyword","iconToSVG","customisations","fullIcon","fullCustomisations","box","props","transformations","hFlip","vFlip","rotation","tempValue","customisationsWidth","customisationsHeight","boxWidth","boxHeight","width","height","attributes","setAttr","viewBox","regex","randomPrefix","counter","replaceIDs","match","suffix","newID","escapedID","setAPIModule","getAPIModule","createAPIConfig","source","resources","configStorage","fallBackAPISources","fallBackAPI","addAPIProvider","customConfig","config","getAPIConfig","detectFetch","fetchModule","calculateMaxLength","maxHostLength","url","shouldAbort","status","prepare","results","maxLength","type","length","getPath","send","host","params","path","iconsList","urlParams","uri","defaultError","response","fetchAPIModule","removeCallback","storages","items","row","updateCallbacks","hasPending","oldLength","idCounter","storeCallback","pendingSources","abort","sortIcons","a","lastIcon","localStorage","list","listToIcons","defaultConfig","sendQuery","payload","query","done","resourcesCount","startIndex","nextIndex","startTime","queriesSent","lastError","queue","doneCallbacks","resetTimer","subscribe","overwrite","getQueryStatus","failQuery","clearQueue","moduleResponse","isError","queued","execNext","resource","status$1","initRedundancy","cfg","queries","cleanup","queryCallback","doneCallback","query$1","find","emptyCallback$1","redundancyCache","getRedundancyCache","redundancy","cachedReundancy","sendAPIQuery","target","api","cached","moduleKey","emptyCallback","loadedNewIcons","checkIconNamesForAPI","valid","invalid","parseLoaderResponse","checkMissing","pending","err","parsePossiblyAsyncResponse","loadNewIcons","icons$1","customIconLoader","iconSet","loadIcons","cleanedIcons","sortedIcons","callCallback","newIcons","sources","lastProvider","lastPrefix","providerNewIcons","pendingQueue","mergeCustomisations","valueType","separator","flipFromString","custom","flip","str","rotateFromString","defaultValue","units","value$1","iconToHTML","renderAttribsHTML","attr","encodeSVGforURL","svg","svgToData","svgToURL","policy","createPolicy","s","cleanUpInnerHTML","html","defaultExtendedIconCustomisations","svgDefaults","commonProps","monotoneProps","coloredProps","propsToAdd","propsToAddTo","inlineDefaults","fixSize","render","defaultProps","mode","style","customStyle","componentProps","classNames","renderAttribs","localCounter","createElement","useMask","_window","preload","providers","IconComponent","mounted","setMounted","setAbort","getInitialState","state","setState","changeState","newState","updateState","Icon","forwardRef","ref","ClickProtectionManager","wasProtected","clickProtection","twMerge","extendTailwindMerge","cn","inputs","clsx","SurfaceContext","React","useSurface","surfaceVariants","cva","Surface","className","variant","asChild","children","Comp","Slot","jsx","buttonVariants","Button","onPress","isPending","onClick","disabled","selected","surfaceVariant","isOnDefaultSurface","isOnSecondarySurface","handleClick","e","surfaceOverrides","DrawerContext","useDrawerContext","context","Drawer","controlledOpen","defaultOpen","onOpenChange","uncontrolledOpen","setUncontrolledOpen","isControlled","open","handleOpenChange","newOpen","headerShiftDelay","wasOpen","DrawerTrigger","DrawerClose","DrawerContent","placement","maxHeight","maxWidth","showOverlay","hideHandle","overlayOpacity","lockBodyScroll","useDialogRole","disableSwipeGestures","animationDuration","showScrollFade","scrollFadeColor","heightRatio","safeAreaPadding","bodyHeight","setBodyHeight","isClosing","setIsClosing","isBlurFading","setIsBlurFading","isAtBottom","setIsAtBottom","delayedOpen","setDelayedOpen","drawerRef","contentRef","startY","currentY","isNestedDrawerOpen","setIsNestedDrawerOpen","showGreenBar","setShowGreenBar","drawerMountedRef","ignoreNextDrawerOpenRef","greenBarTimeoutRef","openDelay","handleScroll","atBottom","updateHeight","mountTimer","handleNestedDrawerOpen","handleNestedDrawerClose","stickyTopOffset","scrollNudgeAmount","scrollNudgeDuration","savedScrollY","smoothScrollTo","duration","distance","animate","currentTime","elapsed","progress","eased","scrollNudgeDelay","targetScroll","drawerExitDuration","blurFadeDelay","blurFadeDuration","totalCloseDuration","closeStartDelay","handleClose","handleEscape","handleTouchStart","handleTouchMove","delta","handleTouchEnd","showDrawerPanel","animationStyle","createPortal","jsxs","DrawerTitle","DrawerDescription","TooltipProvider","TooltipPrimitive","TooltipRoot","TooltipTrigger","TooltipContent","sideOffset","TooltipBase","delayDuration","delay","Tooltip","SET_SCALE_FACTORS","DEFAULT_SCALE_FACTOR","ICON_OFFSETS","SIZE_PRESETS","getIconSet","colonIndex","getScaleFactor","getIconOffset","getNormalizedSize","baseSize","scaleFactor","NormalizedIcon","sizePreset","offset","mobileSize","desktopSize","scaledOffset","normalizedSize","ToolbarButton","active","tooltip","tooltipDelay","tooltipDisabled","ariaLabel","onMouseLeave","buttonElement","logger","useArtboards","artboards","refreshArtboards","setSelectedId","activeArtboard","artboardsInfo","artboard","elementCount","activeArtboardInfo","createArtboard","artboardConfig","deleteArtboard","duplicateArtboard","ab","renameArtboard","newName","updateArtboard","updates","selectArtboard","reorderArtboards","canUseDOM","isWindow","elementString","isNode","node","getWindow","_target$ownerDocument","_target$ownerDocument2","isDocument","Document","isHTMLElement","isSVGElement","getOwnerDocument","useIsomorphicLayoutEffect","useLayoutEffect","useEvent","handler","handlerRef","_len","args","_key","useInterval","intervalRef","set","listener","clear","useLatestValue","dependencies","valueRef","useLazyMemo","newValue","useNodeRef","onChange","onChangeHandler","setNodeRef","usePrevious","useUniqueId","createAdjustmentFn","modifier","object","adjustments","accumulator","adjustment","entries","valueAdjustment","add","subtract","hasViewportRelativeCoordinates","event","isKeyboardEvent","KeyboardEvent","isTouchEvent","TouchEvent","getEventCoordinates","x","y","CSS","transform","scaleX","scaleY","_ref","property","easing","SELECTOR","findFirstFocusableNode","hiddenStyles","HiddenText","LiveRegion","announcement","ariaLiveType","visuallyHidden","useAnnouncement","setAnnouncement","DndMonitorContext","createContext","useDndMonitor","registerListener","useContext","useDndMonitorProvider","listeners","_listener$type","defaultScreenReaderInstructions","defaultAnnouncements","_ref2","over","_ref3","_ref4","Accessibility","announcements","container","hiddenTextDescribedById","screenReaderInstructions","announce","liveRegionId","_ref5","_ref6","markup","Action","noop","useSensor","sensor","useSensors","sensors","defaultCoordinates","distanceBetween","p1","p2","getRelativeTransformOrigin","rect","eventCoordinates","transformOrigin","sortCollisionsAsc","sortCollisionsDesc","cornersOfRectangle","left","top","getFirstCollision","collisions","firstCollision","centerOfRectangle","closestCenter","collisionRect","droppableRects","droppableContainers","centerRect","droppableContainer","distBetween","closestCorners","corners","rectCorners","distances","corner","effectiveDistance","getIntersectionRatio","entry","right","bottom","targetArea","entryArea","intersectionArea","intersectionRatio","rectIntersection","isPointWithinRect","point","pointerWithin","pointerCoordinates","adjustScale","rect1","rect2","getRectDelta","createRectAdjustmentFn","acc","getAdjustedRect","parseTransform","transformArray","inverseTransform","parsedTransform","translateX","translateY","w","h","defaultOptions","getClientRect","getTransformAgnosticClientRect","getWindowClientRect","isFixed","computedStyle","isScrollable","overflowRegex","getScrollableAncestors","limit","scrollParents","findScrollableAncestors","getFirstScrollableAncestor","firstScrollableAncestor","getScrollableElement","getScrollXCoordinate","getScrollYCoordinate","getScrollCoordinates","Direction","isDocumentScrollingElement","getScrollPosition","scrollingContainer","minScroll","dimensions","maxScroll","isTop","isLeft","isBottom","isRight","defaultThreshold","getScrollDirectionAndSpeed","scrollContainer","scrollContainerRect","acceleration","thresholdPercentage","direction","speed","threshold","getScrollElementRect","innerWidth","innerHeight","getScrollOffsets","scrollableAncestors","getScrollXOffset","getScrollYOffset","scrollIntoViewIfNeeded","measure","properties","Rect","scrollOffsets","axis","keys","getScrollOffset","currentOffsets","scrollOffsetsDeltla","Listeners","_this$target","eventName","_this$target2","getEventListenerTarget","EventTarget","hasExceededDistance","measurement","dx","dy","EventName","preventDefault","stopPropagation","KeyboardCode","defaultKeyboardCodes","defaultKeyboardCoordinateGetter","currentCoordinates","KeyboardSensor","activeNode","onStart","keyboardCodes","coordinateGetter","scrollBehavior","newCoordinates","coordinatesDelta","scrollDelta","scrollElementRect","clampedCoordinates","canScrollX","canScrollY","newScrollCoordinates","canScrollToNewCoordinates","coordinates","onMove","onEnd","onCancel","onActivation","activator","isDistanceConstraint","constraint","isDelayConstraint","AbstractPointerSensor","events","listenerTarget","_getEventCoordinates","activationConstraint","bypassActivationConstraint","onPending","initialCoordinates","_getEventCoordinates2","activated","onAbort","_this$document$getSel","PointerSensor","events$1","MouseButton","MouseSensor","events$2","TouchSensor","touches","AutoScrollActivator","TraversalOrder","useAutoScroller","canScroll","draggingRect","enabled","interval","order","scrollableAncestorRects","scrollIntent","useScrollIntent","setAutoScrollInterval","clearAutoScrollInterval","scrollSpeed","scrollDirection","scrollContainerRef","autoScroll","scrollLeft","scrollTop","sortedScrollableAncestors","defaultScrollIntent","previousDelta","previousIntent","useCachedNode","draggableNodes","draggableNode","cachedNode","useCombineActivators","getSyntheticHandler","Sensor","sensorActivators","MeasuringStrategy","MeasuringFrequency","useDroppableMeasuring","containers","dragging","setQueue","frequency","strategy","containersRef","isDisabled","disabledRef","measureDroppableContainers","timeoutId","previousValue","map","useInitialValue","computeFn","useInitialRect","useMutationObserver","handleMutations","mutationObserver","MutationObserver","useResizeObserver","handleResize","resizeObserver","ResizeObserver","defaultMeasure","useRect","fallbackRect","setRect","measureRect","currentRect","newRect","records","record","useRectDelta","initialRect","defaultValue$1","useScrollableAncestors","previousNode","ancestors","useScrollOffsets","scrollCoordinates","setScrollCoordinates","prevElements","scrollingElement","previousElements","scrollableElement","useScrollOffsetsDelta","initialScrollOffsets","hasScrollOffsets","useSensorSetup","teardownFns","teardown","useSyntheticListeners","useWindowRect","defaultValue$2","useRects","firstElement","windowRect","rects","setRects","measureRects","getMeasurableNode","firstChild","useDragOverlayMeasuring","handleNodeChange","nodeRef","setRef","defaultSensors","defaultData","defaultMeasuringConfiguration","DroppableContainersMap","_super$get","_this$get$node$curren","_this$get","defaultPublicContext","defaultInternalContext","InternalContext","PublicContext","reducer","action","RestoreFocus","activatorEvent","previousActivatorEvent","previousActiveId","activatorNode","focusableNode","applyModifiers","modifiers","useMeasuringConfiguration","useLayoutShiftScrollCompensation","initialized","rectDelta","ActiveDraggableContext","Status","DndContext","memo","_sensorContext$curren","_dragOverlay$nodeRef$","_dragOverlay$rect","_over$rect","accessibility","collisionDetection","measuring","store","useReducer","dispatch","dispatchMonitorEvent","registerMonitorListener","setStatus","isInitialized","activeId","translate","activeRects","_node$data","activeRef","activeSensor","setActiveSensor","setActivatorEvent","latestProps","draggableDescribedById","enabledDroppableContainers","measuringConfiguration","measuringScheduled","activationCoordinates","autoScrollOptions","getAutoScrollerOptions","initialActiveNodeRect","activeNodeRect","containerNodeRect","sensorContext","overNode","dragOverlay","draggingNode","draggingNodeRect","usesDragOverlay","nodeRectDelta","modifiedTranslate","scrollAdjustment","activeNodeScrollDelta","scrollAdjustedTranslate","overId","setOver","appliedTranslate","activeSensorRef","instantiateSensor","sensorInstance","onDragAbort","onDragPending","onDragStart","unstable_batchedUpdates","createHandler","cancelDrop","bindActivatorToSensorInstantiator","nativeEvent","activeDraggableNode","activationContext","activators","onDragMove","onDragOver","overContainer","publicContext","internalContext","activeSensorDisablesAutoscroll","autoScrollGloballyDisabled","NullContext","defaultRole","ID_PREFIX","useDraggable","ariaDescribedById","role","roleDescription","tabIndex","isDragging","setActivatorNodeRef","dataRef","memoizedAttributes","useDndContext","ID_PREFIX$1","defaultResizeObserverConfig","useDroppable","resizeObserverConfig","previous","resizeObserverConnected","callbackId","resizeObserverDisabled","updateMeasurementsFor","resizeObserverTimeout","newElement","previousElement","AnimationManager","animation","clonedChildren","setClonedChildren","setElement","previousChildren","cloneElement","defaultTransform","NullifiedContextProvider","baseStyles","defaultTransition","PositionedOverlay","as","transition","scaleAdjustedTransform","styles","defaultDropAnimationSideEffects","originalStyles","defaultKeyframeResolver","initial","final","defaultDropAnimationConfiguration","useDropAnimation","activeDraggable","measurableNode","createDefaultDropAnimation","sideEffects","keyframes","rest","scale","finalTransform","animationKeyframes","firstKeyframe","lastKeyframe","useKey","DragOverlay","dropAnimationConfig","wrapperElement","zIndex","modifiedTransform","dropAnimation","hasSortableData","directions","sortableKeyboardCoordinates","filteredContainers","closestId","activeDroppable","newDroppable","newNode","hasDifferentScrollAncestors","hasSameContainer","isSameContainer","isAfterActive","isAfter","rectCoordinates","getZoneFromCollisions","zone","useLayerDndKit","onReorder","onGroupReorder","onDropIntoGroup","onDropIntoGroupAtPosition","onRemoveFromGroup","setActiveId","setOverId","dropPosition","setDropPosition","dropPositionRef","handleDragStart","handleDragOver","handleDragMove","resetState","handleDragEnd","currentDropPosition","draggedParent","arrayPosition","targetParent","handleDragCancel","layerCollisionDetection","winner","relativeY","_b","SortableLayerItem","isOver","isDragActive","showPreviewImages","previewDisplaySize","onSelect","onToggleVisibility","onToggleLock","onDuplicate","onDelete","deleteSuppressed","setDragRef","setDropRef","isGroupRow","isChild","indentPx","selectionRingStyle","dragHandle","LayerActionButton","title","extraStyle","GroupFooterDropZone","DragOverlayContent","LayersPanel","enableDragReorder","enableGrouping","showHeader","layerOptions","previewBgColor","previewResolution","isLayerBound","useIsLayerBound","isDeleteSuppressed","layerMap","collect","layerList","handleReorder","activeDnd","renderDraggableLayerTree","renderStaticLayerTree","StaticLayerItem","activeLayer","styleWidth","styleHeight","flex","restStyle","finalWidth","finalHeight","flexValue","rowStyle","EditorPartsRegistry","instanceId","partName","EditorError","parts","reg","meta","bridge","EditorRootInternalsContext","useEditorRootInternals","ctx","useRequiresCanvas","internals","useId","useRegisterEditorPart","registry","mockupId","floatingToolbar","stableMeta","makeInvariantReporter","routeToErrorState","isDevOrTest","recordContainedEditorError","rowsOf","kind","label","useStoreTopology","cache","snapshot","rows","r","useSyncExternalStore","kindIcon","StoreLayerList","display","EditorLayers","hasCanvas","Dropdown","trigger","isOpen","onToggle","align","protectClick","contentClassName","containerRef","triggerRef","dropdownStyle","setDropdownStyle","useFixed","setUseFixed","handleTriggerClick","handleMouseDown","isInsideContainer","isInsideContent","handleKeyDown","focusable","triggerRect","contentRect","viewportWidth","viewportHeight","padding","spaceAbove","spaceBelow","dropdownContent","DropdownMenu","minWidth","maxHeightClass","minWidthStyle","MenuItem","shortcut","baseClasses","stateClasses","combinedClassName","ADD_ELEMENT_TYPES","useIsDocumentDark","isDark","setIsDark","update","obs","onClose","description","showCloseButton","headerActions","hideVisibleTitle","disableScrollWrapper","disableOverflowHidden","dataTestId","heightStyle","scrimOpacity","BaseDrawer","PolygonIcon","EllipseIcon","TILE_ICON_CLASS","shapeTypes","ShapeTypeDrawer","onSelectType","currentType","headingText","descriptionText","handleSelect","MenuButton","isLayersPanelOpen","onToggleLayersPanel","onOpenImageBrowser","additionalItems","get","useEditorHandles","setIsOpen","addMenuOpen","setAddMenuOpen","isShapeTypeDrawerOpen","setIsShapeTypeDrawerOpen","fileInputRef","handleSave","ExportManager","n","freshArtboards","handleLoadClick","handleFileChange","file","ImportManager","validation","summary","handleExportImage","canvasRef","handleAddElementClick","elementType","handleSelectShapeType","shapeType","elementTypes","MenuDivider","Fragment","et","LazyImageBrowser","part","Impl","setImpl","cancelled","m","EditorMenu","isImageBrowserOpen","setIsImageBrowserOpen","UndoRedoControls","undo","redo","canUndo","canRedo","useHistoryContext","EditorHistory","EditorAdd","useExport","isExporting","setIsExporting","isContinuousExporting","setIsContinuousExporting","setProgress","latestExports","setLatestExports","workerStats","setWorkerStats","continuousExportGeneration","continuousExportOptions","supportsWorkerExport","exportArtboard","progressEntry","prev","currentElements","elementsRef","artboardElements","dataUrl","exportTime","p","exportAllArtboards","exportPromises","exportResults","exportArtboardAsBlob","exportAllArtboardsAsBlobs","blob","stopContinuousExport","startContinuousExport","myGeneration","format","targetArtboards","isCurrentGeneration","performExport","readProxyError","fallback","createProxyImageSearch","page","perPage","sep","createProxyGenerate","prompt","numberResults","deproxyImageUrl","marker","createProxyBgRemove","imageUrl","sourceUrl","EMPTY_SERVICES","CanvasServicesContext","CanvasServicesProvider","services","useCanvasServices","allGoogleFonts","fetchPromise","fetchAllGoogleFonts","font","getAllGoogleFonts","isFontsLoaded","mapGoogleCategory","googleCategory","UnifiedFontServiceClass","isGoogleFontsLoaded","systemFonts","TSHIRT_FONTS","f","googleFonts","cacheKey","normalizedQuery","googleResults","category","fontName","linkId","link","text","encodedText","googleFont","fonts","fontMap","allFonts","UnifiedFontService"],"mappings":"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","x_google_ignoreList":[3,15,16,17,18]}