@elixpo/lixsketch 5.4.7 → 5.5.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 (218) hide show
  1. package/dist/react/AIRenderer-M4LMJ66J.js +1105 -0
  2. package/dist/react/AIRenderer-M4LMJ66J.js.map +7 -0
  3. package/dist/react/Arrow-BJDAXPMH.js +8 -0
  4. package/dist/react/Arrow-BJDAXPMH.js.map +7 -0
  5. package/dist/react/Circle-KPG7TKIX.js +8 -0
  6. package/dist/react/Circle-KPG7TKIX.js.map +7 -0
  7. package/dist/react/CodeShape-K4DIZAIV.js +8 -0
  8. package/dist/react/CodeShape-K4DIZAIV.js.map +7 -0
  9. package/dist/react/CopyPaste-4CKJRHJ3.js +569 -0
  10. package/dist/react/CopyPaste-4CKJRHJ3.js.map +7 -0
  11. package/dist/react/EraserTrail-PA6IQLQN.js +20 -0
  12. package/dist/react/EraserTrail-PA6IQLQN.js.map +7 -0
  13. package/dist/react/EventDispatcher-SRFH6LQZ.js +463 -0
  14. package/dist/react/EventDispatcher-SRFH6LQZ.js.map +7 -0
  15. package/dist/react/Frame-6UR5XPAX.js +10 -0
  16. package/dist/react/Frame-6UR5XPAX.js.map +7 -0
  17. package/dist/react/FreehandStroke-CK24NUT3.js +8 -0
  18. package/dist/react/FreehandStroke-CK24NUT3.js.map +7 -0
  19. package/dist/react/GraphEngine-QE5B2PMR.js +340 -0
  20. package/dist/react/GraphEngine-QE5B2PMR.js.map +7 -0
  21. package/dist/react/GraphMathParser-2WMTY4IE.js +10 -0
  22. package/dist/react/GraphMathParser-2WMTY4IE.js.map +7 -0
  23. package/dist/react/IconShape-KMIA6T2H.js +10 -0
  24. package/dist/react/IconShape-KMIA6T2H.js.map +7 -0
  25. package/dist/react/ImageShape-CHHGBXUQ.js +10 -0
  26. package/dist/react/ImageShape-CHHGBXUQ.js.map +7 -0
  27. package/dist/react/LayerOrder-XCHF4MSS.js +66 -0
  28. package/dist/react/LayerOrder-XCHF4MSS.js.map +7 -0
  29. package/dist/react/Line-2KOQEEGA.js +10 -0
  30. package/dist/react/Line-2KOQEEGA.js.map +7 -0
  31. package/dist/react/LixScriptParser-JYWJX375.js +1033 -0
  32. package/dist/react/LixScriptParser-JYWJX375.js.map +7 -0
  33. package/dist/react/MermaidFlowchartRenderer-4QBAZ5MB.js +412 -0
  34. package/dist/react/MermaidFlowchartRenderer-4QBAZ5MB.js.map +7 -0
  35. package/dist/react/MermaidSequenceParser-UKG2NSZY.js +8 -0
  36. package/dist/react/MermaidSequenceParser-UKG2NSZY.js.map +7 -0
  37. package/dist/react/MermaidSequenceRenderer-HPLHY5II.js +387 -0
  38. package/dist/react/MermaidSequenceRenderer-HPLHY5II.js.map +7 -0
  39. package/dist/react/Rectangle-6FE7RN6W.js +8 -0
  40. package/dist/react/Rectangle-6FE7RN6W.js.map +7 -0
  41. package/dist/react/ResizeCode-WAMDTKSW.js +2 -0
  42. package/dist/react/ResizeCode-WAMDTKSW.js.map +7 -0
  43. package/dist/react/ResizeShapes-LKEQTITP.js +250 -0
  44. package/dist/react/ResizeShapes-LKEQTITP.js.map +7 -0
  45. package/dist/react/SceneSerializer-4U4B24JM.js +739 -0
  46. package/dist/react/SceneSerializer-4U4B24JM.js.map +7 -0
  47. package/dist/react/Selection-VVUHY5YJ.js +34 -0
  48. package/dist/react/Selection-VVUHY5YJ.js.map +7 -0
  49. package/dist/react/SketchEngine-YA4RG3KX.js +413 -0
  50. package/dist/react/SketchEngine-YA4RG3KX.js.map +7 -0
  51. package/dist/react/TextShape-54ZJ66E3.js +8 -0
  52. package/dist/react/TextShape-54ZJ66E3.js.map +7 -0
  53. package/dist/react/UndoRedo-M2JZUBKN.js +30 -0
  54. package/dist/react/UndoRedo-M2JZUBKN.js.map +7 -0
  55. package/dist/react/ZoomPan-U3TXC5AJ.js +186 -0
  56. package/dist/react/ZoomPan-U3TXC5AJ.js.map +7 -0
  57. package/dist/react/arrowTool-CWEMIRXK.js +17 -0
  58. package/dist/react/arrowTool-CWEMIRXK.js.map +7 -0
  59. package/dist/react/boxicons-5JNJQPUP.woff +0 -0
  60. package/dist/react/boxicons-6NVWQSCQ.eot +0 -0
  61. package/dist/react/boxicons-AQ5N6WP7.woff2 +0 -0
  62. package/dist/react/boxicons-GDR4JU3X.ttf +0 -0
  63. package/dist/react/boxicons-NNFHLMOR.svg +1660 -0
  64. package/dist/react/chunk-2OQXI7QB.js +564 -0
  65. package/dist/react/chunk-2OQXI7QB.js.map +7 -0
  66. package/dist/react/chunk-5OUBTHHO.js +187 -0
  67. package/dist/react/chunk-5OUBTHHO.js.map +7 -0
  68. package/dist/react/chunk-6PFXZKL2.js +628 -0
  69. package/dist/react/chunk-6PFXZKL2.js.map +7 -0
  70. package/dist/react/chunk-6SFNWGGZ.js +453 -0
  71. package/dist/react/chunk-6SFNWGGZ.js.map +7 -0
  72. package/dist/react/chunk-7TZSIR6V.js +210 -0
  73. package/dist/react/chunk-7TZSIR6V.js.map +7 -0
  74. package/dist/react/chunk-AJAZC37E.js +662 -0
  75. package/dist/react/chunk-AJAZC37E.js.map +7 -0
  76. package/dist/react/chunk-BU4D2WYQ.js +1213 -0
  77. package/dist/react/chunk-BU4D2WYQ.js.map +7 -0
  78. package/dist/react/chunk-BZE4CEBG.js +747 -0
  79. package/dist/react/chunk-BZE4CEBG.js.map +7 -0
  80. package/dist/react/chunk-CB2RANCB.js +212 -0
  81. package/dist/react/chunk-CB2RANCB.js.map +7 -0
  82. package/dist/react/chunk-DNAG7ML6.js +128 -0
  83. package/dist/react/chunk-DNAG7ML6.js.map +7 -0
  84. package/dist/react/chunk-HZWLPXFN.js +198 -0
  85. package/dist/react/chunk-HZWLPXFN.js.map +7 -0
  86. package/dist/react/chunk-I6HCCIXB.js +572 -0
  87. package/dist/react/chunk-I6HCCIXB.js.map +7 -0
  88. package/dist/react/chunk-IZ5OGWGW.js +235 -0
  89. package/dist/react/chunk-IZ5OGWGW.js.map +7 -0
  90. package/dist/react/chunk-JJCJNLNN.js +1490 -0
  91. package/dist/react/chunk-JJCJNLNN.js.map +7 -0
  92. package/dist/react/chunk-JQ3IRFDP.js +222 -0
  93. package/dist/react/chunk-JQ3IRFDP.js.map +7 -0
  94. package/dist/react/chunk-L5OARZJ7.js +1134 -0
  95. package/dist/react/chunk-L5OARZJ7.js.map +7 -0
  96. package/dist/react/chunk-LHRTXNVE.js +1600 -0
  97. package/dist/react/chunk-LHRTXNVE.js.map +7 -0
  98. package/dist/react/chunk-Q2GA4MBZ.js +1653 -0
  99. package/dist/react/chunk-Q2GA4MBZ.js.map +7 -0
  100. package/dist/react/chunk-QNSE5BAY.js +519 -0
  101. package/dist/react/chunk-QNSE5BAY.js.map +7 -0
  102. package/dist/react/chunk-QXFBG7OM.js +191 -0
  103. package/dist/react/chunk-QXFBG7OM.js.map +7 -0
  104. package/dist/react/chunk-T6ZVV5ZO.js +714 -0
  105. package/dist/react/chunk-T6ZVV5ZO.js.map +7 -0
  106. package/dist/react/chunk-URB6MY46.js +974 -0
  107. package/dist/react/chunk-URB6MY46.js.map +7 -0
  108. package/dist/react/chunk-VN62KLOC.js +931 -0
  109. package/dist/react/chunk-VN62KLOC.js.map +7 -0
  110. package/dist/react/chunk-VQVEPJSA.js +158 -0
  111. package/dist/react/chunk-VQVEPJSA.js.map +7 -0
  112. package/dist/react/chunk-XISEAGBV.js +1632 -0
  113. package/dist/react/chunk-XISEAGBV.js.map +7 -0
  114. package/dist/react/chunk-YKJUBFHE.js +575 -0
  115. package/dist/react/chunk-YKJUBFHE.js.map +7 -0
  116. package/dist/react/circleTool-NUATSEI2.js +14 -0
  117. package/dist/react/circleTool-NUATSEI2.js.map +7 -0
  118. package/dist/react/codeTool-MHCB2FNB.js +38 -0
  119. package/dist/react/codeTool-MHCB2FNB.js.map +7 -0
  120. package/dist/react/eraserTool-2GS2LQCS.js +103 -0
  121. package/dist/react/eraserTool-2GS2LQCS.js.map +7 -0
  122. package/dist/react/frameTool-PWVKKXSP.js +14 -0
  123. package/dist/react/frameTool-PWVKKXSP.js.map +7 -0
  124. package/dist/react/freehandTool-SLYGASVP.js +14 -0
  125. package/dist/react/freehandTool-SLYGASVP.js.map +7 -0
  126. package/dist/react/iconTool-GPZ7O7NH.js +18 -0
  127. package/dist/react/iconTool-GPZ7O7NH.js.map +7 -0
  128. package/dist/react/imageTool-D5R4XGEU.js +15 -0
  129. package/dist/react/imageTool-D5R4XGEU.js.map +7 -0
  130. package/dist/react/index.js +5342 -0
  131. package/dist/react/index.js.map +7 -0
  132. package/dist/react/laserTool-XVMV63AV.js +239 -0
  133. package/dist/react/laserTool-XVMV63AV.js.map +7 -0
  134. package/dist/react/lineTool-WNI5EMZ5.js +14 -0
  135. package/dist/react/lineTool-WNI5EMZ5.js.map +7 -0
  136. package/dist/react/lixCode-OJMVUXXI.ttf +0 -0
  137. package/dist/react/lixDefault-JEAPAUJL.ttf +0 -0
  138. package/dist/react/lixFancy-BPXYM5CQ.ttf +0 -0
  139. package/dist/react/lixFont-CPKEUDVM.woff2 +0 -0
  140. package/dist/react/rectangleTool-U7DZ6ZTA.js +14 -0
  141. package/dist/react/rectangleTool-U7DZ6ZTA.js.map +7 -0
  142. package/dist/react/styles.css +6627 -0
  143. package/dist/react/textTool-M7S6F3VC.js +21 -0
  144. package/dist/react/textTool-M7S6F3VC.js.map +7 -0
  145. package/package.json +39 -5
  146. package/src/EngineShortcuts.js +83 -27
  147. package/src/core/AIRenderer.js +30 -18
  148. package/src/core/GraphEngine.js +64 -41
  149. package/src/core/MermaidFlowchartRenderer.js +153 -88
  150. package/src/core/MermaidSequenceRenderer.js +168 -93
  151. package/src/core/SceneSerializer.js +86 -2
  152. package/src/core/Selection.js +119 -19
  153. package/src/core/UndoRedo.js +82 -15
  154. package/src/core/ZoomPan.js +15 -5
  155. package/src/index.js +14 -1
  156. package/src/react/LixSketchCanvas.jsx +347 -0
  157. package/src/react/components/AppMenu.jsx +475 -0
  158. package/src/react/components/Footer.jsx +85 -0
  159. package/src/react/components/Toolbar.jsx +140 -0
  160. package/src/react/components/canvas/CanvasLoadingOverlay.jsx +76 -0
  161. package/src/react/components/canvas/ContextMenu.jsx +466 -0
  162. package/src/react/components/canvas/FindBar.jsx +177 -0
  163. package/src/react/components/canvas/ImageSourcePicker.jsx +133 -0
  164. package/src/react/components/canvas/MultiSelectActions.jsx +120 -0
  165. package/src/react/components/canvas/SVGCanvas.jsx +145 -0
  166. package/src/react/components/canvas/SaveStatusIndicator.jsx +29 -0
  167. package/src/react/components/modals/CanvasPropertiesModal.jsx +358 -0
  168. package/src/react/components/modals/CommandPalette.jsx +307 -0
  169. package/src/react/components/modals/ExportImageModal.jsx +287 -0
  170. package/src/react/components/modals/GraphModal.jsx +174 -0
  171. package/src/react/components/modals/HelpModal.jsx +208 -0
  172. package/src/react/components/modals/LixScriptModal.jsx +130 -0
  173. package/src/react/components/modals/ShortcutsModal.jsx +125 -0
  174. package/src/react/components/sidebars/ArrowSidebar.jsx +173 -0
  175. package/src/react/components/sidebars/CircleSidebar.jsx +134 -0
  176. package/src/react/components/sidebars/FrameSidebar.jsx +263 -0
  177. package/src/react/components/sidebars/IconSidebar.jsx +279 -0
  178. package/src/react/components/sidebars/ImageSidebar.jsx +69 -0
  179. package/src/react/components/sidebars/LineSidebar.jsx +109 -0
  180. package/src/react/components/sidebars/PaintbrushSidebar.jsx +119 -0
  181. package/src/react/components/sidebars/RectangleSidebar.jsx +165 -0
  182. package/src/react/components/sidebars/ShapeSidebar.jsx +130 -0
  183. package/src/react/components/sidebars/TextSidebar.jsx +174 -0
  184. package/src/react/hooks/inertStores.js +58 -0
  185. package/src/react/hooks/useSketchEngine.js +76 -0
  186. package/src/react/hooks/useTranslation.js +92 -0
  187. package/src/react/index.js +41 -0
  188. package/src/react/store/useSketchStore.js +234 -0
  189. package/src/react/store/useUIStore.js +196 -0
  190. package/src/react/styles/arrowSidebar.css +263 -0
  191. package/src/react/styles/canvasStroke.css +47 -0
  192. package/src/react/styles/canvasTools.css +769 -0
  193. package/src/react/styles/circleSidebar.css +206 -0
  194. package/src/react/styles/fonts/fonts.css +29 -0
  195. package/src/react/styles/fonts/lixCode.ttf +0 -0
  196. package/src/react/styles/fonts/lixDefault.ttf +0 -0
  197. package/src/react/styles/fonts/lixDocs.ttf +0 -0
  198. package/src/react/styles/fonts/lixFancy.ttf +0 -0
  199. package/src/react/styles/fonts/lixFont.woff2 +0 -0
  200. package/src/react/styles/lineSidebar.css +207 -0
  201. package/src/react/styles/paintbrushSidebar.css +247 -0
  202. package/src/react/styles/squareSidebar.css +206 -0
  203. package/src/react/styles/writeText.css +149 -0
  204. package/src/react/styles.css +175 -0
  205. package/src/react/toolsEnum.js +20 -0
  206. package/src/react/utils/toast.js +18 -0
  207. package/src/shapes/Frame.js +7 -1
  208. package/src/shapes/Line.js +11 -5
  209. package/src/tools/arrowTool.js +30 -4
  210. package/src/tools/circleTool.js +33 -9
  211. package/src/tools/codeTool.js +5 -3
  212. package/src/tools/frameTool.js +47 -7
  213. package/src/tools/freehandTool.js +12 -4
  214. package/src/tools/iconTool.js +7 -1
  215. package/src/tools/imageTool.js +7 -1
  216. package/src/tools/lineTool.js +27 -3
  217. package/src/tools/rectangleTool.js +45 -8
  218. package/src/tools/textTool.js +23 -6
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/shapes/FreehandStroke.js"],
4
+ "sourcesContent": ["/* eslint-disable */\nimport { getStroke } from \"perfect-freehand\";\n// FreehandStroke shape class - extracted from canvasStroke.js\n// Depends on globals: svg, shapes, currentShape, currentZoom, currentViewBox\n\nfunction getSvgCoordinates(event) {\n const rect = svg.getBoundingClientRect();\n const scaleX = currentViewBox.width / rect.width;\n const scaleY = currentViewBox.height / rect.height;\n\n const svgX = currentViewBox.x + (event.clientX - rect.left) * scaleX;\n const svgY = currentViewBox.y + (event.clientY - rect.top) * scaleY;\n\n return { x: svgX, y: svgY };\n}\n\nfunction getSvgPathFromStroke(stroke) {\n if (!stroke.length) return '';\n \n // Use more sophisticated curve fitting\n const pathData = [];\n pathData.push('M', stroke[0][0], stroke[0][1]);\n \n for (let i = 1; i < stroke.length - 1; i++) {\n const curr = stroke[i];\n const next = stroke[i + 1];\n \n // Calculate control points for smoother curves\n const cpX = curr[0] + (next[0] - curr[0]) * 0.5;\n const cpY = curr[1] + (next[1] - curr[1]) * 0.5;\n \n pathData.push('Q', curr[0], curr[1], cpX, cpY);\n }\n \n // Add final point\n if (stroke.length > 1) {\n const lastPoint = stroke[stroke.length - 1];\n pathData.push('L', lastPoint[0], lastPoint[1]);\n }\n \n return pathData.join(' ');\n}\n\nclass FreehandStroke {\n constructor(points = [], options = {}) {\n this.points = points;\n this.rawPoints = []; \n this.options = {\n stroke: \"#fff\",\n strokeWidth: 3,\n fill: \"none\",\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n strokeOpacity: 1,\n thinning: 0.5,\n roughness: 0,\n strokeStyle: \"solid\",\n ...options\n };\n this.element = null;\n this.isSelected = false;\n this.rotation = 0;\n this.group = document.createElementNS('http://www.w3.org/2000/svg', 'g');\n this.anchors = [];\n this.rotationAnchor = null;\n this.rotationLine = null;\n this.selectionPadding = 8;\n this.selectionOutline = null;\n this.boundingBox = { x: 0, y: 0, width: 0, height: 0 };\n this.shapeName = \"freehandStroke\";\n this._moveOffsetX = 0;\n this._moveOffsetY = 0;\n\n // Frame attachment properties\n this.parentFrame = null;\n \n svg.appendChild(this.group);\n this.draw();\n }\n\n // Add position and dimension properties for frame compatibility\n // Getters include pending move offset so callers see the visual position\n get x() {\n return this.boundingBox.x + (this._moveOffsetX || 0);\n }\n\n set x(value) {\n const dx = value - this.boundingBox.x - (this._moveOffsetX || 0);\n this.points = this.points.map(point => [point[0] + dx, point[1], point[2] || 0.5]);\n this.boundingBox.x = value - (this._moveOffsetX || 0);\n }\n\n get y() {\n return this.boundingBox.y + (this._moveOffsetY || 0);\n }\n\n set y(value) {\n const dy = value - this.boundingBox.y - (this._moveOffsetY || 0);\n this.points = this.points.map(point => [point[0], point[1] + dy, point[2] || 0.5]);\n this.boundingBox.y = value - (this._moveOffsetY || 0);\n }\n \n get width() {\n return this.boundingBox.width;\n }\n \n set width(value) {\n if (this.boundingBox.width === 0) return;\n const scaleX = value / this.boundingBox.width;\n const centerX = this.boundingBox.x + this.boundingBox.width / 2;\n this.points = this.points.map(point => [\n centerX + (point[0] - centerX) * scaleX,\n point[1],\n point[2] || 0.5\n ]);\n this.boundingBox.width = value;\n }\n \n get height() {\n return this.boundingBox.height;\n }\n \n set height(value) {\n if (this.boundingBox.height === 0) return;\n const scaleY = value / this.boundingBox.height;\n const centerY = this.boundingBox.y + this.boundingBox.height / 2;\n this.points = this.points.map(point => [\n point[0],\n centerY + (point[1] - centerY) * scaleY,\n point[2] || 0.5\n ]);\n this.boundingBox.height = value;\n }\n\n // Enhanced smoothing algorithm\n smoothPoints(points, factor = 0.8) {\n if (points.length < 3) return points;\n \n const smoothed = [points[0]]; // Keep first point\n \n for (let i = 1; i < points.length - 1; i++) {\n const prev = points[i - 1];\n const curr = points[i];\n const next = points[i + 1];\n \n // Apply weighted average smoothing\n const smoothedX = curr[0] * (1 - factor) + (prev[0] + next[0]) * factor * 0.5;\n const smoothedY = curr[1] * (1 - factor) + (prev[1] + next[1]) * factor * 0.5;\n const pressure = curr[2] || 0.5;\n \n smoothed.push([smoothedX, smoothedY, pressure]);\n }\n \n smoothed.push(points[points.length - 1]); // Keep last point\n return smoothed;\n }\n\n // Interpolate points for smoother curves\n interpolatePoints(points, steps = 2) {\n if (points.length < 2) return points;\n \n const interpolated = [points[0]];\n \n for (let i = 0; i < points.length - 1; i++) {\n const curr = points[i];\n const next = points[i + 1];\n \n for (let j = 1; j <= steps; j++) {\n const t = j / (steps + 1);\n const x = curr[0] + (next[0] - curr[0]) * t;\n const y = curr[1] + (next[1] - curr[1]) * t;\n const pressure = curr[2] + (next[2] - curr[2]) * t;\n interpolated.push([x, y, pressure]);\n }\n \n if (i < points.length - 2) {\n interpolated.push(next);\n }\n }\n \n interpolated.push(points[points.length - 1]);\n return interpolated;\n }\n\n // Enhanced path generation with better curve fitting\n getPathData() {\n if (this.points.length < 2) return '';\n\n const isRough = this.options.roughness === \"rough\";\n const isMedium = this.options.roughness === \"medium\";\n\n // Roughness: jitter points before smoothing\n let pts = this.points;\n if (isRough || isMedium) {\n const jitter = isRough ? 3.5 : 1.5;\n pts = pts.map((p, i) => {\n if (i === 0 || i === pts.length - 1) return p;\n return [\n p[0] + (Math.random() - 0.5) * jitter,\n p[1] + (Math.random() - 0.5) * jitter,\n p[2] || 0.5\n ];\n });\n }\n\n let smoothedPoints = this.interpolatePoints(pts, 1);\n if (!isRough) {\n smoothedPoints = this.smoothPoints(smoothedPoints, 0.6);\n smoothedPoints = this.smoothPoints(smoothedPoints, 0.4);\n }\n\n const thinning = this.options.thinning !== undefined ? this.options.thinning : 0;\n const smoothing = isRough ? 0.3 : isMedium ? 0.6 : 0.9;\n const streamline = isRough ? 0.1 : isMedium ? 0.25 : 0.4;\n\n const stroke = getStroke(smoothedPoints, {\n size: this.options.strokeWidth,\n thinning: thinning,\n smoothing: smoothing,\n streamline: streamline,\n easing: (t) => Math.sin(t * Math.PI * 0.5),\n start: {\n taper: thinning > 0 ? this.options.strokeWidth * 2 : 0,\n easing: (t) => t * t,\n cap: thinning === 0\n },\n end: {\n taper: thinning > 0 ? this.options.strokeWidth * 2 : 0,\n easing: (t) => --t * t * t + 1,\n cap: thinning === 0\n },\n simulatePressure: thinning > 0\n });\n\n return getSvgPathFromStroke(stroke);\n }\n\n // Simple centerline path used for dashed/dotted overlays\n getCenterlinePathData() {\n if (this.points.length < 2) return '';\n const d = [`M ${this.points[0][0]} ${this.points[0][1]}`];\n for (let i = 1; i < this.points.length - 1; i++) {\n const curr = this.points[i];\n const next = this.points[i + 1];\n const cpX = curr[0] + (next[0] - curr[0]) * 0.5;\n const cpY = curr[1] + (next[1] - curr[1]) * 0.5;\n d.push(`Q ${curr[0]} ${curr[1]} ${cpX} ${cpY}`);\n }\n const last = this.points[this.points.length - 1];\n d.push(`L ${last[0]} ${last[1]}`);\n return d.join(' ');\n }\n\n // Calculate the bounding box of the stroke\n calculateBoundingBox() {\n if (this.points.length === 0) {\n return { x: 0, y: 0, width: 0, height: 0 };\n }\n \n let minX = Infinity, minY = Infinity;\n let maxX = -Infinity, maxY = -Infinity;\n \n this.points.forEach(point => {\n minX = Math.min(minX, point[0]);\n minY = Math.min(minY, point[1]);\n maxX = Math.max(maxX, point[0]);\n maxY = Math.max(maxY, point[1]);\n });\n \n // Ensure we have valid dimensions\n if (minX === Infinity || minY === Infinity) {\n return { x: 0, y: 0, width: 0, height: 0 };\n }\n \n // Add padding for stroke width\n const padding = this.options.strokeWidth / 2;\n return {\n x: minX - padding,\n y: minY - padding,\n width: Math.max(0, (maxX - minX) + padding * 2),\n height: Math.max(0, (maxY - minY) + padding * 2)\n };\n }\n\n draw() {\n while (this.group.firstChild) {\n this.group.removeChild(this.group.firstChild);\n }\n\n if (this.selectionOutline && this.selectionOutline.parentNode === this.group) {\n this.group.removeChild(this.selectionOutline);\n this.selectionOutline = null;\n }\n\n // Create the path element\n // perfect-freehand returns a filled outline \u2014 use fill, not stroke\n const path = document.createElementNS('http://www.w3.org/2000/svg', 'path');\n const pathData = this.getPathData();\n path.setAttribute('d', pathData);\n path.setAttribute('fill', this.options.stroke);\n path.setAttribute('fill-opacity', this.options.strokeOpacity);\n path.setAttribute('stroke', 'none');\n\n // Overlay a dashed/dotted centerline if needed\n if (this.options.strokeStyle === \"dashed\" || this.options.strokeStyle === \"dotted\") {\n const dashArray = this.options.strokeStyle === \"dashed\"\n ? `${this.options.strokeWidth * 3} ${this.options.strokeWidth * 2}`\n : `${this.options.strokeWidth * 0.5} ${this.options.strokeWidth * 2}`;\n const overlay = document.createElementNS('http://www.w3.org/2000/svg', 'path');\n overlay.setAttribute('d', this.getCenterlinePathData());\n overlay.setAttribute('fill', 'none');\n overlay.setAttribute('stroke', this.options.stroke);\n overlay.setAttribute('stroke-width', this.options.strokeWidth);\n overlay.setAttribute('stroke-linecap', 'round');\n overlay.setAttribute('stroke-linejoin', 'round');\n overlay.setAttribute('stroke-dasharray', dashArray);\n overlay.setAttribute('stroke-opacity', this.options.strokeOpacity);\n this.group.appendChild(overlay);\n }\n\n this.element = path;\n this.group.appendChild(path);\n\n // Calculate and store bounding box\n this.boundingBox = this.calculateBoundingBox();\n\n // Apply rotation\n const centerX = this.boundingBox.x + this.boundingBox.width / 2;\n const centerY = this.boundingBox.y + this.boundingBox.height / 2;\n\n // Ensure centerX and centerY are valid numbers\n if (!isNaN(centerX) && !isNaN(centerY)) {\n this.group.setAttribute('transform', `rotate(${this.rotation} ${centerX} ${centerY})`);\n }\n\n if (this.isSelected) {\n this.addAnchors();\n }\n }\n\n move(dx, dy) {\n // Accumulate offset for transform-based movement (avoids full path rebuild)\n this._moveOffsetX = (this._moveOffsetX || 0) + dx;\n this._moveOffsetY = (this._moveOffsetY || 0) + dy;\n const centerX = this.boundingBox.x + this.boundingBox.width / 2;\n const centerY = this.boundingBox.y + this.boundingBox.height / 2;\n const rot = this.rotation ? `rotate(${this.rotation} ${centerX} ${centerY})` : '';\n this.group.setAttribute('transform', `translate(${this._moveOffsetX}, ${this._moveOffsetY}) ${rot}`);\n }\n\n // Call after drag ends to bake the offset into actual point coordinates\n finalizeMove() {\n if (this._moveOffsetX || this._moveOffsetY) {\n const ox = this._moveOffsetX || 0;\n const oy = this._moveOffsetY || 0;\n this.points = this.points.map(point => [point[0] + ox, point[1] + oy, point[2] || 0.5]);\n this._moveOffsetX = 0;\n this._moveOffsetY = 0;\n this.draw();\n }\n }\n\n updateAttachedArrows() {\n if (typeof window.__updateArrowsForShape === 'function') {\n window.__updateArrowsForShape(this);\n }\n }\n\n selectStroke() {\n this.isSelected = true;\n this.draw();\n // Show sidebar and update it with current stroke properties\n disableAllSideBars();\n paintBrushSideBar.classList.remove(\"hidden\");\n if (window.__showSidebarForShape) window.__showSidebarForShape('freehandStroke');\n this.updateSidebar();\n }\n\n deselectStroke() {\n this.isSelected = false;\n this.anchors = [];\n this.rotationAnchor = null;\n this.draw();\n }\n\n removeSelection() {\n this.anchors.forEach(anchor => {\n if (anchor.parentNode === this.group) {\n this.group.removeChild(anchor);\n }\n });\n if (this.rotationAnchor && this.rotationAnchor.parentNode === this.group) {\n this.group.removeChild(this.rotationAnchor);\n }\n if (this.rotationLine && this.rotationLine.parentNode === this.group) {\n this.group.removeChild(this.rotationLine);\n }\n if (this.selectionOutline && this.selectionOutline.parentNode === this.group) {\n this.group.removeChild(this.selectionOutline);\n }\n this.anchors = [];\n this.rotationAnchor = null;\n this.rotationLine = null;\n this.selectionOutline = null;\n this.isSelected = false;\n }\n\n // No-op: React sidebar handles UI updates via Zustand store\n updateSidebar() {}\n\n contains(x, y) {\n // Account for pending move offset (during drag, points aren't updated yet)\n const ox = this._moveOffsetX || 0;\n const oy = this._moveOffsetY || 0;\n const bbX = this.boundingBox.x + ox;\n const bbY = this.boundingBox.y + oy;\n const centerX = bbX + this.boundingBox.width / 2;\n const centerY = bbY + this.boundingBox.height / 2;\n\n // Adjust for rotation\n const dx = x - centerX;\n const dy = y - centerY;\n\n const angleRad = -this.rotation * Math.PI / 180;\n const rotatedX = dx * Math.cos(angleRad) - dy * Math.sin(angleRad) + centerX;\n const rotatedY = dx * Math.sin(angleRad) + dy * Math.cos(angleRad) + centerY;\n\n return rotatedX >= bbX &&\n rotatedX <= bbX + this.boundingBox.width &&\n rotatedY >= bbY &&\n rotatedY <= bbY + this.boundingBox.height;\n }\n\n isNearAnchor(x, y) {\n if (!this.isSelected) return null;\n const buffer = 10;\n const anchorSize = 10 / currentZoom;\n\n // Account for pending move offset\n const ox = this._moveOffsetX || 0;\n const oy = this._moveOffsetY || 0;\n\n // Transform the input coordinates to account for rotation\n const centerX = this.boundingBox.x + ox + this.boundingBox.width / 2;\n const centerY = this.boundingBox.y + oy + this.boundingBox.height / 2;\n\n // Rotate the mouse coordinates to the shape's local coordinate system\n const angleRad = -this.rotation * Math.PI / 180;\n const dx = x - centerX;\n const dy = y - centerY;\n const localX = dx * Math.cos(angleRad) - dy * Math.sin(angleRad) + centerX;\n const localY = dx * Math.sin(angleRad) + dy * Math.cos(angleRad) + centerY;\n\n // Check resize anchors in local space\n const expandedX = this.boundingBox.x + ox - this.selectionPadding;\n const expandedY = this.boundingBox.y + oy - this.selectionPadding;\n const expandedWidth = this.boundingBox.width + 2 * this.selectionPadding;\n const expandedHeight = this.boundingBox.height + 2 * this.selectionPadding;\n \n const anchorPositions = [\n { x: expandedX, y: expandedY }, // top-left\n { x: expandedX + expandedWidth, y: expandedY }, // top-right\n { x: expandedX, y: expandedY + expandedHeight }, // bottom-left\n { x: expandedX + expandedWidth, y: expandedY + expandedHeight }, // bottom-right\n { x: expandedX + expandedWidth / 2, y: expandedY }, // top-center\n { x: expandedX + expandedWidth / 2, y: expandedY + expandedHeight }, // bottom-center\n { x: expandedX, y: expandedY + expandedHeight / 2 }, // left-center\n { x: expandedX + expandedWidth, y: expandedY + expandedHeight / 2 } // right-center\n ];\n\n for (let i = 0; i < anchorPositions.length; i++) {\n const anchor = anchorPositions[i];\n const distance = Math.sqrt(Math.pow(localX - anchor.x, 2) + Math.pow(localY - anchor.y, 2));\n if (distance <= anchorSize / 2 + buffer) {\n return { type: 'resize', index: i };\n }\n }\n \n // Check rotation anchor (this one stays in world coordinates)\n if (this.rotationAnchor) {\n const rotationX = parseFloat(this.rotationAnchor.getAttribute('cx'));\n const rotationY = parseFloat(this.rotationAnchor.getAttribute('cy'));\n const distance = Math.sqrt(Math.pow(x - rotationX, 2) + Math.pow(y - rotationY, 2));\n if (distance <= anchorSize / 2 + buffer) {\n return { type: 'rotate' };\n }\n }\n \n return null;\n}\n\n rotate(angle) {\n this.rotation = angle;\n // If anchors exist, update their cursors for the new rotation\n if (this.isSelected && this.anchors.length > 0) {\n const cursors = ['nw-resize', 'ne-resize', 'sw-resize', 'se-resize', 'n-resize', 's-resize', 'w-resize', 'e-resize'];\n this.anchors.forEach((anchor, i) => {\n if (anchor) {\n const originalCursor = cursors[i];\n const rotatedCursor = this.getRotatedCursor(originalCursor, this.rotation);\n anchor.style.cursor = rotatedCursor;\n }\n });\n }\n}\n\n addAnchors() {\n const anchorSize = 10 / currentZoom;\n const anchorStrokeWidth = 2 / currentZoom;\n \n const expandedX = this.boundingBox.x - this.selectionPadding;\n const expandedY = this.boundingBox.y - this.selectionPadding;\n const expandedWidth = this.boundingBox.width + 2 * this.selectionPadding;\n const expandedHeight = this.boundingBox.height + 2 * this.selectionPadding;\n \n const positions = [\n { x: expandedX, y: expandedY, cursor: 'nw-resize' }, // top-left\n { x: expandedX + expandedWidth, y: expandedY, cursor: 'ne-resize' }, // top-right\n { x: expandedX, y: expandedY + expandedHeight, cursor: 'sw-resize' }, // bottom-left\n { x: expandedX + expandedWidth, y: expandedY + expandedHeight, cursor: 'se-resize' }, // bottom-right\n { x: expandedX + expandedWidth / 2, y: expandedY, cursor: 'n-resize' }, // top-center\n { x: expandedX + expandedWidth / 2, y: expandedY + expandedHeight, cursor: 's-resize' }, // bottom-center\n { x: expandedX, y: expandedY + expandedHeight / 2, cursor: 'w-resize' }, // left-center\n { x: expandedX + expandedWidth, y: expandedY + expandedHeight / 2, cursor: 'e-resize' } // right-center\n ];\n \n // Create resize anchors\n positions.forEach((pos, i) => {\n const anchor = document.createElementNS('http://www.w3.org/2000/svg', 'rect');\n anchor.setAttribute('x', pos.x - anchorSize / 2);\n anchor.setAttribute('y', pos.y - anchorSize / 2);\n anchor.setAttribute('width', anchorSize);\n anchor.setAttribute('height', anchorSize);\n anchor.setAttribute('class', 'anchor');\n anchor.setAttribute('data-index', i);\n anchor.setAttribute('fill', '#121212');\n anchor.setAttribute('stroke', '#5B57D1');\n anchor.setAttribute('stroke-width', anchorStrokeWidth);\n anchor.setAttribute('vector-effect', 'non-scaling-stroke');\n\n // Set proper cursor for each anchor direction, accounting for rotation\n const rotatedCursor = this.getRotatedCursor(pos.cursor, this.rotation);\n anchor.style.cursor = rotatedCursor;\n anchor.style.pointerEvents = 'all';\n \n this.group.appendChild(anchor);\n this.anchors[i] = anchor;\n });\n\n // Create rotation anchor\n const rotationAnchorDistance = 30 / currentZoom;\n const rotationX = expandedX + expandedWidth / 2;\n const rotationY = expandedY - rotationAnchorDistance;\n \n const rotationAnchor = document.createElementNS('http://www.w3.org/2000/svg', 'circle');\n rotationAnchor.setAttribute('cx', rotationX);\n rotationAnchor.setAttribute('cy', rotationY);\n rotationAnchor.setAttribute('r', anchorSize / 2);\n rotationAnchor.setAttribute('fill', '#121212');\n rotationAnchor.setAttribute('stroke', '#5B57D1');\n rotationAnchor.setAttribute('stroke-width', anchorStrokeWidth);\n rotationAnchor.setAttribute('vector-effect', 'non-scaling-stroke');\n rotationAnchor.setAttribute('class', 'rotation-anchor');\n rotationAnchor.style.cursor = 'grab';\n rotationAnchor.style.pointerEvents = 'all';\n \n this.group.appendChild(rotationAnchor);\n this.rotationAnchor = rotationAnchor;\n\n // Create selection outline\n const outlinePoints = [\n [expandedX, expandedY],\n [expandedX + expandedWidth, expandedY],\n [expandedX + expandedWidth, expandedY + expandedHeight],\n [expandedX, expandedY + expandedHeight],\n [expandedX, expandedY]\n ];\n \n const outline = document.createElementNS('http://www.w3.org/2000/svg', 'polyline');\n outline.setAttribute('points', outlinePoints.map(p => p.join(',')).join(' '));\n outline.setAttribute('fill', 'none');\n outline.setAttribute('stroke', '#5B57D1');\n outline.setAttribute('stroke-width', 1.5);\n outline.setAttribute('vector-effect', 'non-scaling-stroke');\n outline.setAttribute('stroke-dasharray', '4 2');\n outline.setAttribute('style', 'pointer-events: none;');\n this.group.appendChild(outline);\n this.selectionOutline = outline;\n\n // Add line from rotation anchor to shape\n const rotationLine = document.createElementNS('http://www.w3.org/2000/svg', 'line');\n rotationLine.setAttribute('x1', rotationX);\n rotationLine.setAttribute('y1', rotationY);\n rotationLine.setAttribute('x2', expandedX + expandedWidth / 2);\n rotationLine.setAttribute('y2', expandedY);\n rotationLine.setAttribute('stroke', '#5B57D1');\n rotationLine.setAttribute('stroke-width', 1);\n rotationLine.setAttribute('vector-effect', 'non-scaling-stroke');\n rotationLine.setAttribute('stroke-dasharray', '2 2');\n rotationLine.setAttribute('style', 'pointer-events: none;');\n this.group.appendChild(rotationLine);\n this.rotationLine = rotationLine;\n\n // Show sidebar when anchors are added (when shape is selected)\n disableAllSideBars();\n paintBrushSideBar.classList.remove(\"hidden\");\n if (window.__showSidebarForShape) window.__showSidebarForShape('freehandStroke');\n this.updateSidebar();\n}\n\ngetRotatedCursor(direction, angle) {\n // Normalize angle to 0-360\n const normalizedAngle = ((angle % 360) + 360) % 360;\n \n // Map of cursor directions\n const cursors = ['n-resize', 'ne-resize', 'e-resize', 'se-resize', 's-resize', 'sw-resize', 'w-resize', 'nw-resize'];\n const directionMap = {\n 'n-resize': 0,\n 'ne-resize': 1,\n 'e-resize': 2,\n 'se-resize': 3,\n 's-resize': 4,\n 'sw-resize': 5,\n 'w-resize': 6,\n 'nw-resize': 7\n };\n \n if (!(direction in directionMap)) return direction;\n \n // Calculate how many 45-degree increments to rotate\n const rotationSteps = Math.round(normalizedAngle / 45);\n const currentIndex = directionMap[direction];\n const newIndex = (currentIndex + rotationSteps) % 8;\n \n return cursors[newIndex];\n}\n\n updatePosition(anchorIndex, newX, newY) {\n const centerX = this.boundingBox.x + this.boundingBox.width / 2;\n const centerY = this.boundingBox.y + this.boundingBox.height / 2;\n \n // Transform new coordinates to local space (accounting for rotation)\n const angleRad = -this.rotation * Math.PI / 180;\n const dx = newX - centerX;\n const dy = newY - centerY;\n const localX = dx * Math.cos(angleRad) - dy * Math.sin(angleRad) + centerX;\n const localY = dx * Math.sin(angleRad) + dy * Math.cos(angleRad) + centerY;\n \n // Calculate scale factors based on anchor movement in local space\n const expandedX = this.boundingBox.x - this.selectionPadding;\n const expandedY = this.boundingBox.y - this.selectionPadding;\n const expandedWidth = this.boundingBox.width + 2 * this.selectionPadding;\n const expandedHeight = this.boundingBox.height + 2 * this.selectionPadding;\n \n let scaleX = 1, scaleY = 1;\n switch(anchorIndex) {\n case 0: // top-left\n scaleX = (centerX - localX) / (centerX - expandedX);\n scaleY = (centerY - localY) / (centerY - expandedY);\n break;\n case 1: // top-right\n scaleX = (localX - centerX) / (expandedX + expandedWidth - centerX);\n scaleY = (centerY - localY) / (centerY - expandedY);\n break;\n case 2: // bottom-left\n scaleX = (centerX - localX) / (centerX - expandedX);\n scaleY = (localY - centerY) / (expandedY + expandedHeight - centerY);\n break;\n case 3: // bottom-right\n scaleX = (localX - centerX) / (expandedX + expandedWidth - centerX);\n scaleY = (localY - centerY) / (expandedY + expandedHeight - centerY);\n break;\n case 4: // top-center\n scaleY = (centerY - localY) / (centerY - expandedY);\n break;\n case 5: // bottom-center\n scaleY = (localY - centerY) / (expandedY + expandedHeight - centerY);\n break;\n case 6: // left-center\n scaleX = (centerX - localX) / (centerX - expandedX);\n break;\n case 7: // right-center\n scaleX = (localX - centerX) / (expandedX + expandedWidth - centerX);\n break;\n }\n \n // Prevent negative scaling\n scaleX = Math.max(0.1, Math.abs(scaleX));\n scaleY = Math.max(0.1, Math.abs(scaleY));\n \n // Apply scaling to all points relative to center\n this.points = this.points.map(point => {\n const relX = point[0] - centerX;\n const relY = point[1] - centerY;\n return [\n centerX + relX * scaleX,\n centerY + relY * scaleY,\n point[2] || 0.5\n ];\n });\n \n this.draw();\n}\n}\n\nexport { FreehandStroke };\n"],
5
+ "mappings": ";;;AACA,SAAS,iBAAiB;AAe1B,SAAS,qBAAqB,QAAQ;AAClC,MAAI,CAAC,OAAO,OAAQ,QAAO;AAG3B,QAAM,WAAW,CAAC;AAClB,WAAS,KAAK,KAAK,OAAO,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,EAAE,CAAC,CAAC;AAE7C,WAAS,IAAI,GAAG,IAAI,OAAO,SAAS,GAAG,KAAK;AACxC,UAAM,OAAO,OAAO,CAAC;AACrB,UAAM,OAAO,OAAO,IAAI,CAAC;AAGzB,UAAM,MAAM,KAAK,CAAC,KAAK,KAAK,CAAC,IAAI,KAAK,CAAC,KAAK;AAC5C,UAAM,MAAM,KAAK,CAAC,KAAK,KAAK,CAAC,IAAI,KAAK,CAAC,KAAK;AAE5C,aAAS,KAAK,KAAK,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,KAAK,GAAG;AAAA,EACjD;AAGA,MAAI,OAAO,SAAS,GAAG;AACnB,UAAM,YAAY,OAAO,OAAO,SAAS,CAAC;AAC1C,aAAS,KAAK,KAAK,UAAU,CAAC,GAAG,UAAU,CAAC,CAAC;AAAA,EACjD;AAEA,SAAO,SAAS,KAAK,GAAG;AAC5B;AAEA,IAAM,iBAAN,MAAqB;AAAA,EACjB,YAAY,SAAS,CAAC,GAAG,UAAU,CAAC,GAAG;AACnC,SAAK,SAAS;AACd,SAAK,YAAY,CAAC;AAClB,SAAK,UAAU;AAAA,MACX,QAAQ;AAAA,MACR,aAAa;AAAA,MACb,MAAM;AAAA,MACN,eAAe;AAAA,MACf,gBAAgB;AAAA,MAChB,eAAe;AAAA,MACf,UAAU;AAAA,MACV,WAAW;AAAA,MACX,aAAa;AAAA,MACb,GAAG;AAAA,IACP;AACA,SAAK,UAAU;AACf,SAAK,aAAa;AAClB,SAAK,WAAW;AAChB,SAAK,QAAQ,SAAS,gBAAgB,8BAA8B,GAAG;AACvE,SAAK,UAAU,CAAC;AAChB,SAAK,iBAAiB;AACtB,SAAK,eAAe;AACpB,SAAK,mBAAmB;AACxB,SAAK,mBAAmB;AACxB,SAAK,cAAc,EAAE,GAAG,GAAG,GAAG,GAAG,OAAO,GAAG,QAAQ,EAAE;AACrD,SAAK,YAAY;AACjB,SAAK,eAAe;AACpB,SAAK,eAAe;AAGpB,SAAK,cAAc;AAEnB,QAAI,YAAY,KAAK,KAAK;AAC1B,SAAK,KAAK;AAAA,EACd;AAAA;AAAA;AAAA,EAIA,IAAI,IAAI;AACJ,WAAO,KAAK,YAAY,KAAK,KAAK,gBAAgB;AAAA,EACtD;AAAA,EAEA,IAAI,EAAE,OAAO;AACT,UAAM,KAAK,QAAQ,KAAK,YAAY,KAAK,KAAK,gBAAgB;AAC9D,SAAK,SAAS,KAAK,OAAO,IAAI,WAAS,CAAC,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,GAAG,CAAC;AACjF,SAAK,YAAY,IAAI,SAAS,KAAK,gBAAgB;AAAA,EACvD;AAAA,EAEA,IAAI,IAAI;AACJ,WAAO,KAAK,YAAY,KAAK,KAAK,gBAAgB;AAAA,EACtD;AAAA,EAEA,IAAI,EAAE,OAAO;AACT,UAAM,KAAK,QAAQ,KAAK,YAAY,KAAK,KAAK,gBAAgB;AAC9D,SAAK,SAAS,KAAK,OAAO,IAAI,WAAS,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,KAAK,GAAG,CAAC;AACjF,SAAK,YAAY,IAAI,SAAS,KAAK,gBAAgB;AAAA,EACvD;AAAA,EAEA,IAAI,QAAQ;AACR,WAAO,KAAK,YAAY;AAAA,EAC5B;AAAA,EAEA,IAAI,MAAM,OAAO;AACb,QAAI,KAAK,YAAY,UAAU,EAAG;AAClC,UAAM,SAAS,QAAQ,KAAK,YAAY;AACxC,UAAM,UAAU,KAAK,YAAY,IAAI,KAAK,YAAY,QAAQ;AAC9D,SAAK,SAAS,KAAK,OAAO,IAAI,WAAS;AAAA,MACnC,WAAW,MAAM,CAAC,IAAI,WAAW;AAAA,MACjC,MAAM,CAAC;AAAA,MACP,MAAM,CAAC,KAAK;AAAA,IAChB,CAAC;AACD,SAAK,YAAY,QAAQ;AAAA,EAC7B;AAAA,EAEA,IAAI,SAAS;AACT,WAAO,KAAK,YAAY;AAAA,EAC5B;AAAA,EAEA,IAAI,OAAO,OAAO;AACd,QAAI,KAAK,YAAY,WAAW,EAAG;AACnC,UAAM,SAAS,QAAQ,KAAK,YAAY;AACxC,UAAM,UAAU,KAAK,YAAY,IAAI,KAAK,YAAY,SAAS;AAC/D,SAAK,SAAS,KAAK,OAAO,IAAI,WAAS;AAAA,MACnC,MAAM,CAAC;AAAA,MACP,WAAW,MAAM,CAAC,IAAI,WAAW;AAAA,MACjC,MAAM,CAAC,KAAK;AAAA,IAChB,CAAC;AACD,SAAK,YAAY,SAAS;AAAA,EAC9B;AAAA;AAAA,EAGA,aAAa,QAAQ,SAAS,KAAK;AAC/B,QAAI,OAAO,SAAS,EAAG,QAAO;AAE9B,UAAM,WAAW,CAAC,OAAO,CAAC,CAAC;AAE3B,aAAS,IAAI,GAAG,IAAI,OAAO,SAAS,GAAG,KAAK;AACxC,YAAM,OAAO,OAAO,IAAI,CAAC;AACzB,YAAM,OAAO,OAAO,CAAC;AACrB,YAAM,OAAO,OAAO,IAAI,CAAC;AAGzB,YAAM,YAAY,KAAK,CAAC,KAAK,IAAI,WAAW,KAAK,CAAC,IAAI,KAAK,CAAC,KAAK,SAAS;AAC1E,YAAM,YAAY,KAAK,CAAC,KAAK,IAAI,WAAW,KAAK,CAAC,IAAI,KAAK,CAAC,KAAK,SAAS;AAC1E,YAAM,WAAW,KAAK,CAAC,KAAK;AAE5B,eAAS,KAAK,CAAC,WAAW,WAAW,QAAQ,CAAC;AAAA,IAClD;AAEA,aAAS,KAAK,OAAO,OAAO,SAAS,CAAC,CAAC;AACvC,WAAO;AAAA,EACX;AAAA;AAAA,EAGA,kBAAkB,QAAQ,QAAQ,GAAG;AACjC,QAAI,OAAO,SAAS,EAAG,QAAO;AAE9B,UAAM,eAAe,CAAC,OAAO,CAAC,CAAC;AAE/B,aAAS,IAAI,GAAG,IAAI,OAAO,SAAS,GAAG,KAAK;AACxC,YAAM,OAAO,OAAO,CAAC;AACrB,YAAM,OAAO,OAAO,IAAI,CAAC;AAEzB,eAAS,IAAI,GAAG,KAAK,OAAO,KAAK;AAC7B,cAAM,IAAI,KAAK,QAAQ;AACvB,cAAM,IAAI,KAAK,CAAC,KAAK,KAAK,CAAC,IAAI,KAAK,CAAC,KAAK;AAC1C,cAAM,IAAI,KAAK,CAAC,KAAK,KAAK,CAAC,IAAI,KAAK,CAAC,KAAK;AAC1C,cAAM,WAAW,KAAK,CAAC,KAAK,KAAK,CAAC,IAAI,KAAK,CAAC,KAAK;AACjD,qBAAa,KAAK,CAAC,GAAG,GAAG,QAAQ,CAAC;AAAA,MACtC;AAEA,UAAI,IAAI,OAAO,SAAS,GAAG;AACvB,qBAAa,KAAK,IAAI;AAAA,MAC1B;AAAA,IACJ;AAEA,iBAAa,KAAK,OAAO,OAAO,SAAS,CAAC,CAAC;AAC3C,WAAO;AAAA,EACX;AAAA;AAAA,EAGA,cAAc;AACV,QAAI,KAAK,OAAO,SAAS,EAAG,QAAO;AAEnC,UAAM,UAAU,KAAK,QAAQ,cAAc;AAC3C,UAAM,WAAW,KAAK,QAAQ,cAAc;AAG5C,QAAI,MAAM,KAAK;AACf,QAAI,WAAW,UAAU;AACrB,YAAM,SAAS,UAAU,MAAM;AAC/B,YAAM,IAAI,IAAI,CAAC,GAAG,MAAM;AACpB,YAAI,MAAM,KAAK,MAAM,IAAI,SAAS,EAAG,QAAO;AAC5C,eAAO;AAAA,UACH,EAAE,CAAC,KAAK,KAAK,OAAO,IAAI,OAAO;AAAA,UAC/B,EAAE,CAAC,KAAK,KAAK,OAAO,IAAI,OAAO;AAAA,UAC/B,EAAE,CAAC,KAAK;AAAA,QACZ;AAAA,MACJ,CAAC;AAAA,IACL;AAEA,QAAI,iBAAiB,KAAK,kBAAkB,KAAK,CAAC;AAClD,QAAI,CAAC,SAAS;AACV,uBAAiB,KAAK,aAAa,gBAAgB,GAAG;AACtD,uBAAiB,KAAK,aAAa,gBAAgB,GAAG;AAAA,IAC1D;AAEA,UAAM,WAAW,KAAK,QAAQ,aAAa,SAAY,KAAK,QAAQ,WAAW;AAC/E,UAAM,YAAY,UAAU,MAAM,WAAW,MAAM;AACnD,UAAM,aAAa,UAAU,MAAM,WAAW,OAAO;AAErD,UAAM,SAAS,UAAU,gBAAgB;AAAA,MACrC,MAAM,KAAK,QAAQ;AAAA,MACnB;AAAA,MACA;AAAA,MACA;AAAA,MACA,QAAQ,CAAC,MAAM,KAAK,IAAI,IAAI,KAAK,KAAK,GAAG;AAAA,MACzC,OAAO;AAAA,QACH,OAAO,WAAW,IAAI,KAAK,QAAQ,cAAc,IAAI;AAAA,QACrD,QAAQ,CAAC,MAAM,IAAI;AAAA,QACnB,KAAK,aAAa;AAAA,MACtB;AAAA,MACA,KAAK;AAAA,QACD,OAAO,WAAW,IAAI,KAAK,QAAQ,cAAc,IAAI;AAAA,QACrD,QAAQ,CAAC,MAAM,EAAE,IAAI,IAAI,IAAI;AAAA,QAC7B,KAAK,aAAa;AAAA,MACtB;AAAA,MACA,kBAAkB,WAAW;AAAA,IACjC,CAAC;AAED,WAAO,qBAAqB,MAAM;AAAA,EACtC;AAAA;AAAA,EAGA,wBAAwB;AACpB,QAAI,KAAK,OAAO,SAAS,EAAG,QAAO;AACnC,UAAM,IAAI,CAAC,KAAK,KAAK,OAAO,CAAC,EAAE,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,EAAE,CAAC,CAAC,EAAE;AACxD,aAAS,IAAI,GAAG,IAAI,KAAK,OAAO,SAAS,GAAG,KAAK;AAC7C,YAAM,OAAO,KAAK,OAAO,CAAC;AAC1B,YAAM,OAAO,KAAK,OAAO,IAAI,CAAC;AAC9B,YAAM,MAAM,KAAK,CAAC,KAAK,KAAK,CAAC,IAAI,KAAK,CAAC,KAAK;AAC5C,YAAM,MAAM,KAAK,CAAC,KAAK,KAAK,CAAC,IAAI,KAAK,CAAC,KAAK;AAC5C,QAAE,KAAK,KAAK,KAAK,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI,GAAG,IAAI,GAAG,EAAE;AAAA,IAClD;AACA,UAAM,OAAO,KAAK,OAAO,KAAK,OAAO,SAAS,CAAC;AAC/C,MAAE,KAAK,KAAK,KAAK,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,EAAE;AAChC,WAAO,EAAE,KAAK,GAAG;AAAA,EACrB;AAAA;AAAA,EAGA,uBAAuB;AACnB,QAAI,KAAK,OAAO,WAAW,GAAG;AAC1B,aAAO,EAAE,GAAG,GAAG,GAAG,GAAG,OAAO,GAAG,QAAQ,EAAE;AAAA,IAC7C;AAEA,QAAI,OAAO,UAAU,OAAO;AAC5B,QAAI,OAAO,WAAW,OAAO;AAE7B,SAAK,OAAO,QAAQ,WAAS;AACzB,aAAO,KAAK,IAAI,MAAM,MAAM,CAAC,CAAC;AAC9B,aAAO,KAAK,IAAI,MAAM,MAAM,CAAC,CAAC;AAC9B,aAAO,KAAK,IAAI,MAAM,MAAM,CAAC,CAAC;AAC9B,aAAO,KAAK,IAAI,MAAM,MAAM,CAAC,CAAC;AAAA,IAClC,CAAC;AAGD,QAAI,SAAS,YAAY,SAAS,UAAU;AACxC,aAAO,EAAE,GAAG,GAAG,GAAG,GAAG,OAAO,GAAG,QAAQ,EAAE;AAAA,IAC7C;AAGA,UAAM,UAAU,KAAK,QAAQ,cAAc;AAC3C,WAAO;AAAA,MACH,GAAG,OAAO;AAAA,MACV,GAAG,OAAO;AAAA,MACV,OAAO,KAAK,IAAI,GAAI,OAAO,OAAQ,UAAU,CAAC;AAAA,MAC9C,QAAQ,KAAK,IAAI,GAAI,OAAO,OAAQ,UAAU,CAAC;AAAA,IACnD;AAAA,EACJ;AAAA,EAEA,OAAO;AACH,WAAO,KAAK,MAAM,YAAY;AAC1B,WAAK,MAAM,YAAY,KAAK,MAAM,UAAU;AAAA,IAChD;AAEA,QAAI,KAAK,oBAAoB,KAAK,iBAAiB,eAAe,KAAK,OAAO;AAC1E,WAAK,MAAM,YAAY,KAAK,gBAAgB;AAC5C,WAAK,mBAAmB;AAAA,IAC5B;AAIA,UAAM,OAAO,SAAS,gBAAgB,8BAA8B,MAAM;AAC1E,UAAM,WAAW,KAAK,YAAY;AAClC,SAAK,aAAa,KAAK,QAAQ;AAC/B,SAAK,aAAa,QAAQ,KAAK,QAAQ,MAAM;AAC7C,SAAK,aAAa,gBAAgB,KAAK,QAAQ,aAAa;AAC5D,SAAK,aAAa,UAAU,MAAM;AAGlC,QAAI,KAAK,QAAQ,gBAAgB,YAAY,KAAK,QAAQ,gBAAgB,UAAU;AAChF,YAAM,YAAY,KAAK,QAAQ,gBAAgB,WACzC,GAAG,KAAK,QAAQ,cAAc,CAAC,IAAI,KAAK,QAAQ,cAAc,CAAC,KAC/D,GAAG,KAAK,QAAQ,cAAc,GAAG,IAAI,KAAK,QAAQ,cAAc,CAAC;AACvE,YAAM,UAAU,SAAS,gBAAgB,8BAA8B,MAAM;AAC7E,cAAQ,aAAa,KAAK,KAAK,sBAAsB,CAAC;AACtD,cAAQ,aAAa,QAAQ,MAAM;AACnC,cAAQ,aAAa,UAAU,KAAK,QAAQ,MAAM;AAClD,cAAQ,aAAa,gBAAgB,KAAK,QAAQ,WAAW;AAC7D,cAAQ,aAAa,kBAAkB,OAAO;AAC9C,cAAQ,aAAa,mBAAmB,OAAO;AAC/C,cAAQ,aAAa,oBAAoB,SAAS;AAClD,cAAQ,aAAa,kBAAkB,KAAK,QAAQ,aAAa;AACjE,WAAK,MAAM,YAAY,OAAO;AAAA,IAClC;AAEA,SAAK,UAAU;AACf,SAAK,MAAM,YAAY,IAAI;AAG3B,SAAK,cAAc,KAAK,qBAAqB;AAG7C,UAAM,UAAU,KAAK,YAAY,IAAI,KAAK,YAAY,QAAQ;AAC9D,UAAM,UAAU,KAAK,YAAY,IAAI,KAAK,YAAY,SAAS;AAG/D,QAAI,CAAC,MAAM,OAAO,KAAK,CAAC,MAAM,OAAO,GAAG;AACpC,WAAK,MAAM,aAAa,aAAa,UAAU,KAAK,QAAQ,IAAI,OAAO,IAAI,OAAO,GAAG;AAAA,IACzF;AAEA,QAAI,KAAK,YAAY;AACjB,WAAK,WAAW;AAAA,IACpB;AAAA,EACJ;AAAA,EAEA,KAAK,IAAI,IAAI;AAET,SAAK,gBAAgB,KAAK,gBAAgB,KAAK;AAC/C,SAAK,gBAAgB,KAAK,gBAAgB,KAAK;AAC/C,UAAM,UAAU,KAAK,YAAY,IAAI,KAAK,YAAY,QAAQ;AAC9D,UAAM,UAAU,KAAK,YAAY,IAAI,KAAK,YAAY,SAAS;AAC/D,UAAM,MAAM,KAAK,WAAW,UAAU,KAAK,QAAQ,IAAI,OAAO,IAAI,OAAO,MAAM;AAC/E,SAAK,MAAM,aAAa,aAAa,aAAa,KAAK,YAAY,KAAK,KAAK,YAAY,KAAK,GAAG,EAAE;AAAA,EACvG;AAAA;AAAA,EAGA,eAAe;AACX,QAAI,KAAK,gBAAgB,KAAK,cAAc;AACxC,YAAM,KAAK,KAAK,gBAAgB;AAChC,YAAM,KAAK,KAAK,gBAAgB;AAChC,WAAK,SAAS,KAAK,OAAO,IAAI,WAAS,CAAC,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,KAAK,GAAG,CAAC;AACtF,WAAK,eAAe;AACpB,WAAK,eAAe;AACpB,WAAK,KAAK;AAAA,IACd;AAAA,EACJ;AAAA,EAEA,uBAAuB;AACnB,QAAI,OAAO,OAAO,2BAA2B,YAAY;AACrD,aAAO,uBAAuB,IAAI;AAAA,IACtC;AAAA,EACJ;AAAA,EAEA,eAAe;AACX,SAAK,aAAa;AAClB,SAAK,KAAK;AAEV,uBAAmB;AACnB,sBAAkB,UAAU,OAAO,QAAQ;AAC3C,QAAI,OAAO,sBAAuB,QAAO,sBAAsB,gBAAgB;AAC/E,SAAK,cAAc;AAAA,EACvB;AAAA,EAEA,iBAAiB;AACb,SAAK,aAAa;AAClB,SAAK,UAAU,CAAC;AAChB,SAAK,iBAAiB;AACtB,SAAK,KAAK;AAAA,EACd;AAAA,EAEA,kBAAkB;AACd,SAAK,QAAQ,QAAQ,YAAU;AAC3B,UAAI,OAAO,eAAe,KAAK,OAAO;AAClC,aAAK,MAAM,YAAY,MAAM;AAAA,MACjC;AAAA,IACJ,CAAC;AACD,QAAI,KAAK,kBAAkB,KAAK,eAAe,eAAe,KAAK,OAAO;AACtE,WAAK,MAAM,YAAY,KAAK,cAAc;AAAA,IAC9C;AACA,QAAI,KAAK,gBAAgB,KAAK,aAAa,eAAe,KAAK,OAAO;AAClE,WAAK,MAAM,YAAY,KAAK,YAAY;AAAA,IAC5C;AACA,QAAI,KAAK,oBAAoB,KAAK,iBAAiB,eAAe,KAAK,OAAO;AAC1E,WAAK,MAAM,YAAY,KAAK,gBAAgB;AAAA,IAChD;AACA,SAAK,UAAU,CAAC;AAChB,SAAK,iBAAiB;AACtB,SAAK,eAAe;AACpB,SAAK,mBAAmB;AACxB,SAAK,aAAa;AAAA,EACtB;AAAA;AAAA,EAGA,gBAAgB;AAAA,EAAC;AAAA,EAEjB,SAAS,GAAG,GAAG;AAEX,UAAM,KAAK,KAAK,gBAAgB;AAChC,UAAM,KAAK,KAAK,gBAAgB;AAChC,UAAM,MAAM,KAAK,YAAY,IAAI;AACjC,UAAM,MAAM,KAAK,YAAY,IAAI;AACjC,UAAM,UAAU,MAAM,KAAK,YAAY,QAAQ;AAC/C,UAAM,UAAU,MAAM,KAAK,YAAY,SAAS;AAGhD,UAAM,KAAK,IAAI;AACf,UAAM,KAAK,IAAI;AAEf,UAAM,WAAW,CAAC,KAAK,WAAW,KAAK,KAAK;AAC5C,UAAM,WAAW,KAAK,KAAK,IAAI,QAAQ,IAAI,KAAK,KAAK,IAAI,QAAQ,IAAI;AACrE,UAAM,WAAW,KAAK,KAAK,IAAI,QAAQ,IAAI,KAAK,KAAK,IAAI,QAAQ,IAAI;AAErE,WAAO,YAAY,OACZ,YAAY,MAAM,KAAK,YAAY,SACnC,YAAY,OACZ,YAAY,MAAM,KAAK,YAAY;AAAA,EAC9C;AAAA,EAEF,aAAa,GAAG,GAAG;AACjB,QAAI,CAAC,KAAK,WAAY,QAAO;AAC7B,UAAM,SAAS;AACf,UAAM,aAAa,KAAK;AAGxB,UAAM,KAAK,KAAK,gBAAgB;AAChC,UAAM,KAAK,KAAK,gBAAgB;AAGhC,UAAM,UAAU,KAAK,YAAY,IAAI,KAAK,KAAK,YAAY,QAAQ;AACnE,UAAM,UAAU,KAAK,YAAY,IAAI,KAAK,KAAK,YAAY,SAAS;AAGpE,UAAM,WAAW,CAAC,KAAK,WAAW,KAAK,KAAK;AAC5C,UAAM,KAAK,IAAI;AACf,UAAM,KAAK,IAAI;AACf,UAAM,SAAS,KAAK,KAAK,IAAI,QAAQ,IAAI,KAAK,KAAK,IAAI,QAAQ,IAAI;AACnE,UAAM,SAAS,KAAK,KAAK,IAAI,QAAQ,IAAI,KAAK,KAAK,IAAI,QAAQ,IAAI;AAGnE,UAAM,YAAY,KAAK,YAAY,IAAI,KAAK,KAAK;AACjD,UAAM,YAAY,KAAK,YAAY,IAAI,KAAK,KAAK;AACjD,UAAM,gBAAgB,KAAK,YAAY,QAAQ,IAAI,KAAK;AACxD,UAAM,iBAAiB,KAAK,YAAY,SAAS,IAAI,KAAK;AAE1D,UAAM,kBAAkB;AAAA,MACpB,EAAE,GAAG,WAAW,GAAG,UAAU;AAAA;AAAA,MAC7B,EAAE,GAAG,YAAY,eAAe,GAAG,UAAU;AAAA;AAAA,MAC7C,EAAE,GAAG,WAAW,GAAG,YAAY,eAAe;AAAA;AAAA,MAC9C,EAAE,GAAG,YAAY,eAAe,GAAG,YAAY,eAAe;AAAA;AAAA,MAC9D,EAAE,GAAG,YAAY,gBAAgB,GAAG,GAAG,UAAU;AAAA;AAAA,MACjD,EAAE,GAAG,YAAY,gBAAgB,GAAG,GAAG,YAAY,eAAe;AAAA;AAAA,MAClE,EAAE,GAAG,WAAW,GAAG,YAAY,iBAAiB,EAAE;AAAA;AAAA,MAClD,EAAE,GAAG,YAAY,eAAe,GAAG,YAAY,iBAAiB,EAAE;AAAA;AAAA,IACtE;AAEA,aAAS,IAAI,GAAG,IAAI,gBAAgB,QAAQ,KAAK;AAC7C,YAAM,SAAS,gBAAgB,CAAC;AAChC,YAAM,WAAW,KAAK,KAAK,KAAK,IAAI,SAAS,OAAO,GAAG,CAAC,IAAI,KAAK,IAAI,SAAS,OAAO,GAAG,CAAC,CAAC;AAC1F,UAAI,YAAY,aAAa,IAAI,QAAQ;AACrC,eAAO,EAAE,MAAM,UAAU,OAAO,EAAE;AAAA,MACtC;AAAA,IACJ;AAGA,QAAI,KAAK,gBAAgB;AACrB,YAAM,YAAY,WAAW,KAAK,eAAe,aAAa,IAAI,CAAC;AACnE,YAAM,YAAY,WAAW,KAAK,eAAe,aAAa,IAAI,CAAC;AACnE,YAAM,WAAW,KAAK,KAAK,KAAK,IAAI,IAAI,WAAW,CAAC,IAAI,KAAK,IAAI,IAAI,WAAW,CAAC,CAAC;AAClF,UAAI,YAAY,aAAa,IAAI,QAAQ;AACrC,eAAO,EAAE,MAAM,SAAS;AAAA,MAC5B;AAAA,IACJ;AAEA,WAAO;AAAA,EACX;AAAA,EAEG,OAAO,OAAO;AACb,SAAK,WAAW;AAEhB,QAAI,KAAK,cAAc,KAAK,QAAQ,SAAS,GAAG;AAC5C,YAAM,UAAU,CAAC,aAAa,aAAa,aAAa,aAAa,YAAY,YAAY,YAAY,UAAU;AACnH,WAAK,QAAQ,QAAQ,CAAC,QAAQ,MAAM;AAChC,YAAI,QAAQ;AACR,gBAAM,iBAAiB,QAAQ,CAAC;AAChC,gBAAM,gBAAgB,KAAK,iBAAiB,gBAAgB,KAAK,QAAQ;AACzE,iBAAO,MAAM,SAAS;AAAA,QAC1B;AAAA,MACJ,CAAC;AAAA,IACL;AAAA,EACJ;AAAA,EAEI,aAAa;AACb,UAAM,aAAa,KAAK;AACxB,UAAM,oBAAoB,IAAI;AAE9B,UAAM,YAAY,KAAK,YAAY,IAAI,KAAK;AAC5C,UAAM,YAAY,KAAK,YAAY,IAAI,KAAK;AAC5C,UAAM,gBAAgB,KAAK,YAAY,QAAQ,IAAI,KAAK;AACxD,UAAM,iBAAiB,KAAK,YAAY,SAAS,IAAI,KAAK;AAE1D,UAAM,YAAY;AAAA,MACd,EAAE,GAAG,WAAW,GAAG,WAAW,QAAQ,YAAY;AAAA;AAAA,MAClD,EAAE,GAAG,YAAY,eAAe,GAAG,WAAW,QAAQ,YAAY;AAAA;AAAA,MAClE,EAAE,GAAG,WAAW,GAAG,YAAY,gBAAgB,QAAQ,YAAY;AAAA;AAAA,MACnE,EAAE,GAAG,YAAY,eAAe,GAAG,YAAY,gBAAgB,QAAQ,YAAY;AAAA;AAAA,MACnF,EAAE,GAAG,YAAY,gBAAgB,GAAG,GAAG,WAAW,QAAQ,WAAW;AAAA;AAAA,MACrE,EAAE,GAAG,YAAY,gBAAgB,GAAG,GAAG,YAAY,gBAAgB,QAAQ,WAAW;AAAA;AAAA,MACtF,EAAE,GAAG,WAAW,GAAG,YAAY,iBAAiB,GAAG,QAAQ,WAAW;AAAA;AAAA,MACtE,EAAE,GAAG,YAAY,eAAe,GAAG,YAAY,iBAAiB,GAAG,QAAQ,WAAW;AAAA;AAAA,IAC1F;AAGA,cAAU,QAAQ,CAAC,KAAK,MAAM;AAC1B,YAAM,SAAS,SAAS,gBAAgB,8BAA8B,MAAM;AAC5E,aAAO,aAAa,KAAK,IAAI,IAAI,aAAa,CAAC;AAC/C,aAAO,aAAa,KAAK,IAAI,IAAI,aAAa,CAAC;AAC/C,aAAO,aAAa,SAAS,UAAU;AACvC,aAAO,aAAa,UAAU,UAAU;AACxC,aAAO,aAAa,SAAS,QAAQ;AACrC,aAAO,aAAa,cAAc,CAAC;AACnC,aAAO,aAAa,QAAQ,SAAS;AACrC,aAAO,aAAa,UAAU,SAAS;AACvC,aAAO,aAAa,gBAAgB,iBAAiB;AACrD,aAAO,aAAa,iBAAiB,oBAAoB;AAGzD,YAAM,gBAAgB,KAAK,iBAAiB,IAAI,QAAQ,KAAK,QAAQ;AACrE,aAAO,MAAM,SAAS;AACtB,aAAO,MAAM,gBAAgB;AAE7B,WAAK,MAAM,YAAY,MAAM;AAC7B,WAAK,QAAQ,CAAC,IAAI;AAAA,IACtB,CAAC;AAGD,UAAM,yBAAyB,KAAK;AACpC,UAAM,YAAY,YAAY,gBAAgB;AAC9C,UAAM,YAAY,YAAY;AAE9B,UAAM,iBAAiB,SAAS,gBAAgB,8BAA8B,QAAQ;AACtF,mBAAe,aAAa,MAAM,SAAS;AAC3C,mBAAe,aAAa,MAAM,SAAS;AAC3C,mBAAe,aAAa,KAAK,aAAa,CAAC;AAC/C,mBAAe,aAAa,QAAQ,SAAS;AAC7C,mBAAe,aAAa,UAAU,SAAS;AAC/C,mBAAe,aAAa,gBAAgB,iBAAiB;AAC7D,mBAAe,aAAa,iBAAiB,oBAAoB;AACjE,mBAAe,aAAa,SAAS,iBAAiB;AACtD,mBAAe,MAAM,SAAS;AAC9B,mBAAe,MAAM,gBAAgB;AAErC,SAAK,MAAM,YAAY,cAAc;AACrC,SAAK,iBAAiB;AAGtB,UAAM,gBAAgB;AAAA,MAClB,CAAC,WAAW,SAAS;AAAA,MACrB,CAAC,YAAY,eAAe,SAAS;AAAA,MACrC,CAAC,YAAY,eAAe,YAAY,cAAc;AAAA,MACtD,CAAC,WAAW,YAAY,cAAc;AAAA,MACtC,CAAC,WAAW,SAAS;AAAA,IACzB;AAEA,UAAM,UAAU,SAAS,gBAAgB,8BAA8B,UAAU;AACjF,YAAQ,aAAa,UAAU,cAAc,IAAI,OAAK,EAAE,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC;AAC5E,YAAQ,aAAa,QAAQ,MAAM;AACnC,YAAQ,aAAa,UAAU,SAAS;AACxC,YAAQ,aAAa,gBAAgB,GAAG;AACxC,YAAQ,aAAa,iBAAiB,oBAAoB;AAC1D,YAAQ,aAAa,oBAAoB,KAAK;AAC9C,YAAQ,aAAa,SAAS,uBAAuB;AACrD,SAAK,MAAM,YAAY,OAAO;AAC9B,SAAK,mBAAmB;AAGxB,UAAM,eAAe,SAAS,gBAAgB,8BAA8B,MAAM;AAClF,iBAAa,aAAa,MAAM,SAAS;AACzC,iBAAa,aAAa,MAAM,SAAS;AACzC,iBAAa,aAAa,MAAM,YAAY,gBAAgB,CAAC;AAC7D,iBAAa,aAAa,MAAM,SAAS;AACzC,iBAAa,aAAa,UAAU,SAAS;AAC7C,iBAAa,aAAa,gBAAgB,CAAC;AAC3C,iBAAa,aAAa,iBAAiB,oBAAoB;AAC/D,iBAAa,aAAa,oBAAoB,KAAK;AACnD,iBAAa,aAAa,SAAS,uBAAuB;AAC1D,SAAK,MAAM,YAAY,YAAY;AACnC,SAAK,eAAe;AAGpB,uBAAmB;AACnB,sBAAkB,UAAU,OAAO,QAAQ;AAC3C,QAAI,OAAO,sBAAuB,QAAO,sBAAsB,gBAAgB;AAC/E,SAAK,cAAc;AAAA,EACvB;AAAA,EAEA,iBAAiB,WAAW,OAAO;AAE/B,UAAM,mBAAoB,QAAQ,MAAO,OAAO;AAGhD,UAAM,UAAU,CAAC,YAAY,aAAa,YAAY,aAAa,YAAY,aAAa,YAAY,WAAW;AACnH,UAAM,eAAe;AAAA,MACjB,YAAY;AAAA,MACZ,aAAa;AAAA,MACb,YAAY;AAAA,MACZ,aAAa;AAAA,MACb,YAAY;AAAA,MACZ,aAAa;AAAA,MACb,YAAY;AAAA,MACZ,aAAa;AAAA,IACjB;AAEA,QAAI,EAAE,aAAa,cAAe,QAAO;AAGzC,UAAM,gBAAgB,KAAK,MAAM,kBAAkB,EAAE;AACrD,UAAM,eAAe,aAAa,SAAS;AAC3C,UAAM,YAAY,eAAe,iBAAiB;AAElD,WAAO,QAAQ,QAAQ;AAAA,EAC3B;AAAA,EAEI,eAAe,aAAa,MAAM,MAAM;AACxC,UAAM,UAAU,KAAK,YAAY,IAAI,KAAK,YAAY,QAAQ;AAC9D,UAAM,UAAU,KAAK,YAAY,IAAI,KAAK,YAAY,SAAS;AAG/D,UAAM,WAAW,CAAC,KAAK,WAAW,KAAK,KAAK;AAC5C,UAAM,KAAK,OAAO;AAClB,UAAM,KAAK,OAAO;AAClB,UAAM,SAAS,KAAK,KAAK,IAAI,QAAQ,IAAI,KAAK,KAAK,IAAI,QAAQ,IAAI;AACnE,UAAM,SAAS,KAAK,KAAK,IAAI,QAAQ,IAAI,KAAK,KAAK,IAAI,QAAQ,IAAI;AAGnE,UAAM,YAAY,KAAK,YAAY,IAAI,KAAK;AAC5C,UAAM,YAAY,KAAK,YAAY,IAAI,KAAK;AAC5C,UAAM,gBAAgB,KAAK,YAAY,QAAQ,IAAI,KAAK;AACxD,UAAM,iBAAiB,KAAK,YAAY,SAAS,IAAI,KAAK;AAE1D,QAAI,SAAS,GAAG,SAAS;AACzB,YAAO,aAAa;AAAA,MAChB,KAAK;AACD,kBAAU,UAAU,WAAW,UAAU;AACzC,kBAAU,UAAU,WAAW,UAAU;AACzC;AAAA,MACJ,KAAK;AACD,kBAAU,SAAS,YAAY,YAAY,gBAAgB;AAC3D,kBAAU,UAAU,WAAW,UAAU;AACzC;AAAA,MACJ,KAAK;AACD,kBAAU,UAAU,WAAW,UAAU;AACzC,kBAAU,SAAS,YAAY,YAAY,iBAAiB;AAC5D;AAAA,MACJ,KAAK;AACD,kBAAU,SAAS,YAAY,YAAY,gBAAgB;AAC3D,kBAAU,SAAS,YAAY,YAAY,iBAAiB;AAC5D;AAAA,MACJ,KAAK;AACD,kBAAU,UAAU,WAAW,UAAU;AACzC;AAAA,MACJ,KAAK;AACD,kBAAU,SAAS,YAAY,YAAY,iBAAiB;AAC5D;AAAA,MACJ,KAAK;AACD,kBAAU,UAAU,WAAW,UAAU;AACzC;AAAA,MACJ,KAAK;AACD,kBAAU,SAAS,YAAY,YAAY,gBAAgB;AAC3D;AAAA,IACR;AAGA,aAAS,KAAK,IAAI,KAAK,KAAK,IAAI,MAAM,CAAC;AACvC,aAAS,KAAK,IAAI,KAAK,KAAK,IAAI,MAAM,CAAC;AAGvC,SAAK,SAAS,KAAK,OAAO,IAAI,WAAS;AACnC,YAAM,OAAO,MAAM,CAAC,IAAI;AACxB,YAAM,OAAO,MAAM,CAAC,IAAI;AACxB,aAAO;AAAA,QACH,UAAU,OAAO;AAAA,QACjB,UAAU,OAAO;AAAA,QACjB,MAAM,CAAC,KAAK;AAAA,MAChB;AAAA,IACJ,CAAC;AAED,SAAK,KAAK;AAAA,EACd;AACA;",
6
+ "names": []
7
+ }
@@ -0,0 +1,14 @@
1
+ "use client";
2
+ import {
3
+ handleMouseDown,
4
+ handleMouseMove,
5
+ handleMouseUp
6
+ } from "./chunk-I6HCCIXB.js";
7
+ import "./chunk-BZE4CEBG.js";
8
+ import "./chunk-L5OARZJ7.js";
9
+ export {
10
+ handleMouseDown as handleMouseDownCircle,
11
+ handleMouseMove as handleMouseMoveCircle,
12
+ handleMouseUp as handleMouseUpCircle
13
+ };
14
+ //# sourceMappingURL=circleTool-NUATSEI2.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": [],
4
+ "sourcesContent": [],
5
+ "mappings": "",
6
+ "names": []
7
+ }
@@ -0,0 +1,38 @@
1
+ "use client";
2
+ import {
3
+ addCodeBlock,
4
+ applySyntaxHighlightingToSVG,
5
+ createHighlightedSVGText,
6
+ deselectCodeBlock,
7
+ extractTextFromCodeElement,
8
+ getCodeLanguage,
9
+ getSelectedCodeBlock,
10
+ handleCodeMouseDown,
11
+ handleCodeMouseMove,
12
+ handleCodeMouseUp,
13
+ makeCodeEditable,
14
+ selectCodeBlock,
15
+ setCodeLanguage,
16
+ updateCodeBackground,
17
+ wrapCodeElement
18
+ } from "./chunk-LHRTXNVE.js";
19
+ import "./chunk-BZE4CEBG.js";
20
+ import "./chunk-L5OARZJ7.js";
21
+ export {
22
+ addCodeBlock,
23
+ applySyntaxHighlightingToSVG,
24
+ createHighlightedSVGText,
25
+ deselectCodeBlock,
26
+ extractTextFromCodeElement,
27
+ getCodeLanguage,
28
+ getSelectedCodeBlock,
29
+ handleCodeMouseDown,
30
+ handleCodeMouseMove,
31
+ handleCodeMouseUp,
32
+ makeCodeEditable,
33
+ selectCodeBlock,
34
+ setCodeLanguage,
35
+ updateCodeBackground,
36
+ wrapCodeElement
37
+ };
38
+ //# sourceMappingURL=codeTool-MHCB2FNB.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": [],
4
+ "sourcesContent": [],
5
+ "mappings": "",
6
+ "names": []
7
+ }
@@ -0,0 +1,103 @@
1
+ "use client";
2
+ import {
3
+ createEraserTrail,
4
+ fadeOutEraserTrail,
5
+ forceCleanupEraserTrail,
6
+ getIsErasing,
7
+ getTargetedElements,
8
+ setIsErasing,
9
+ updateEraserTrail
10
+ } from "./chunk-5OUBTHHO.js";
11
+
12
+ // src/tools/eraserTool.js
13
+ var eraserCursorSVG = `data:image/svg+xml;base64,${btoa('<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20"><circle cx="10" cy="10" r="7" fill="#222" stroke="white" stroke-width="2"/></svg>')}`;
14
+ window.forceCleanupEraserTrail = forceCleanupEraserTrail;
15
+ function findTopLevelGroup(element) {
16
+ if (!element || element === svg) return null;
17
+ let current = element;
18
+ while (current && current.parentNode !== svg) {
19
+ current = current.parentNode;
20
+ if (!current || current === document.body) return null;
21
+ }
22
+ return current;
23
+ }
24
+ function handleElementHighlight(clientX, clientY) {
25
+ if (!getIsErasing()) return;
26
+ const targetedElements = getTargetedElements();
27
+ const element = document.elementFromPoint(clientX, clientY);
28
+ if (!element || element === svg) return;
29
+ let elementToHighlight = findTopLevelGroup(element);
30
+ if (!elementToHighlight) return;
31
+ if (elementToHighlight.style.pointerEvents === "none") return;
32
+ if (!targetedElements.has(elementToHighlight)) {
33
+ targetedElements.add(elementToHighlight);
34
+ elementToHighlight.setAttribute("data-original-opacity", elementToHighlight.style.opacity || "1");
35
+ elementToHighlight.dataset.storedOpacity = elementToHighlight.getAttribute("data-original-opacity");
36
+ elementToHighlight.style.opacity = "0.3";
37
+ }
38
+ }
39
+ function removeTargetedElements() {
40
+ const targetedElements = getTargetedElements();
41
+ const elementsToRemove = Array.from(targetedElements);
42
+ if (elementsToRemove.length > 0) {
43
+ const deletionActions = [];
44
+ elementsToRemove.forEach((element) => {
45
+ const originalOpacity = element.dataset.storedOpacity || "1";
46
+ deletionActions.push({
47
+ type: ACTION_DELETE,
48
+ element,
49
+ parent: element.parentNode,
50
+ nextSibling: element.nextSibling,
51
+ originalOpacity
52
+ });
53
+ if (element.parentNode) {
54
+ element.parentNode.removeChild(element);
55
+ }
56
+ if (window.shapes) {
57
+ const idx = window.shapes.findIndex(
58
+ (s) => s.element === element || s.group === element || s.wrapper === element
59
+ );
60
+ if (idx !== -1) {
61
+ window.shapes.splice(idx, 1);
62
+ }
63
+ }
64
+ });
65
+ if (deletionActions.length > 0 && window.historyStack) {
66
+ window.historyStack.push(...deletionActions);
67
+ }
68
+ window.redoStack = [];
69
+ if (typeof clearAllSelections === "function") clearAllSelections();
70
+ if (typeof updateUndoRedoButtons === "function") updateUndoRedoButtons();
71
+ targetedElements.clear();
72
+ }
73
+ }
74
+ svg.addEventListener("pointerdown", (e) => {
75
+ if (isEraserToolActive) {
76
+ setIsErasing(true);
77
+ createEraserTrail(e.clientX, e.clientY);
78
+ handleElementHighlight(e.clientX, e.clientY);
79
+ }
80
+ });
81
+ svg.addEventListener("pointermove", (e) => {
82
+ if (isEraserToolActive) {
83
+ svg.style.cursor = `url(${eraserCursorSVG}) 10 10, auto`;
84
+ }
85
+ if (!getIsErasing()) return;
86
+ updateEraserTrail(e.clientX, e.clientY);
87
+ handleElementHighlight(e.clientX, e.clientY);
88
+ });
89
+ svg.addEventListener("pointerup", () => {
90
+ if (!getIsErasing()) return;
91
+ setIsErasing(false);
92
+ removeTargetedElements();
93
+ fadeOutEraserTrail();
94
+ svg.style.cursor = "default";
95
+ });
96
+ svg.addEventListener("pointerleave", (e) => {
97
+ if (!getIsErasing()) return;
98
+ setIsErasing(false);
99
+ removeTargetedElements();
100
+ fadeOutEraserTrail();
101
+ svg.style.cursor = "default";
102
+ });
103
+ //# sourceMappingURL=eraserTool-2GS2LQCS.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/tools/eraserTool.js"],
4
+ "sourcesContent": ["/* eslint-disable */\n// Eraser tool - extracted from eraserTool.js\n// Depends on globals: svg, isEraserToolActive, ACTION_DELETE, historyStack, redoStack, clearAllSelections\nimport { createEraserTrail, updateEraserTrail, fadeOutEraserTrail, forceCleanupEraserTrail, getIsErasing, setIsErasing, getTargetedElements } from '../core/EraserTrail.js';\n\nconst eraserCursorSVG = `data:image/svg+xml;base64,${btoa('<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\"><circle cx=\"10\" cy=\"10\" r=\"7\" fill=\"#222\" stroke=\"white\" stroke-width=\"2\"/></svg>')}`;\n\n// Expose force cleanup on window so SketchEngine can call it on tool switch\nwindow.forceCleanupEraserTrail = forceCleanupEraserTrail;\n\n// Walk up from any element to find its top-level SVG child (direct child of svg)\nfunction findTopLevelGroup(element) {\n if (!element || element === svg) return null;\n let current = element;\n while (current && current.parentNode !== svg) {\n current = current.parentNode;\n if (!current || current === document.body) return null;\n }\n return current;\n}\n\n// --- Function to highlight elements under the eraser ---\nfunction handleElementHighlight(clientX, clientY) {\n if (!getIsErasing()) return;\n const targetedElements = getTargetedElements();\n\n const element = document.elementFromPoint(clientX, clientY);\n if (!element || element === svg) return;\n\n // Find the top-level SVG child group for this element\n let elementToHighlight = findTopLevelGroup(element);\n\n // Skip the eraser trail paths and any pointer-events:none elements\n if (!elementToHighlight) return;\n if (elementToHighlight.style.pointerEvents === 'none') return;\n\n if (!targetedElements.has(elementToHighlight)) {\n targetedElements.add(elementToHighlight);\n elementToHighlight.setAttribute(\"data-original-opacity\", elementToHighlight.style.opacity || \"1\");\n elementToHighlight.dataset.storedOpacity = elementToHighlight.getAttribute(\"data-original-opacity\");\n elementToHighlight.style.opacity = \"0.3\";\n }\n}\n\nfunction removeHighlight() {\n const targetedElements = getTargetedElements();\n targetedElements.forEach(element => {\n element.style.opacity = element.getAttribute(\"data-original-opacity\") || \"1\";\n });\n targetedElements.clear();\n}\n\nfunction removeTargetedElements() {\n const targetedElements = getTargetedElements();\n const elementsToRemove = Array.from(targetedElements);\n\n if (elementsToRemove.length > 0) {\n const deletionActions = [];\n\n elementsToRemove.forEach(element => {\n const originalOpacity = element.dataset.storedOpacity || \"1\";\n deletionActions.push({\n type: ACTION_DELETE,\n element: element,\n parent: element.parentNode,\n nextSibling: element.nextSibling,\n originalOpacity: originalOpacity,\n });\n\n // Remove from DOM\n if (element.parentNode) {\n element.parentNode.removeChild(element);\n }\n\n // Also remove from the global shapes array\n if (window.shapes) {\n const idx = window.shapes.findIndex(s =>\n s.element === element ||\n s.group === element ||\n s.wrapper === element\n );\n if (idx !== -1) {\n window.shapes.splice(idx, 1);\n }\n }\n });\n\n if (deletionActions.length > 0 && window.historyStack) {\n window.historyStack.push(...deletionActions);\n }\n\n window.redoStack = [];\n if (typeof clearAllSelections === 'function') clearAllSelections();\n if (typeof updateUndoRedoButtons === 'function') updateUndoRedoButtons();\n targetedElements.clear();\n }\n}\n\n// --- Event Listeners ---\nsvg.addEventListener(\"pointerdown\", (e) => {\n if (isEraserToolActive) {\n setIsErasing(true);\n createEraserTrail(e.clientX, e.clientY);\n handleElementHighlight(e.clientX, e.clientY);\n }\n});\n\nsvg.addEventListener(\"pointermove\", (e) => {\n if (isEraserToolActive) {\n svg.style.cursor = `url(${eraserCursorSVG}) 10 10, auto`;\n }\n if (!getIsErasing()) return;\n updateEraserTrail(e.clientX, e.clientY);\n handleElementHighlight(e.clientX, e.clientY);\n});\n\nsvg.addEventListener(\"pointerup\", () => {\n if (!getIsErasing()) return;\n setIsErasing(false);\n removeTargetedElements();\n fadeOutEraserTrail();\n svg.style.cursor = \"default\";\n});\n\nsvg.addEventListener(\"pointerleave\", (e) => {\n if (!getIsErasing()) return;\n setIsErasing(false);\n removeTargetedElements();\n fadeOutEraserTrail();\n svg.style.cursor = \"default\";\n});\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,14 @@
1
+ "use client";
2
+ import {
3
+ handleMouseDown,
4
+ handleMouseMove,
5
+ handleMouseUp
6
+ } from "./chunk-IZ5OGWGW.js";
7
+ import "./chunk-BZE4CEBG.js";
8
+ import "./chunk-L5OARZJ7.js";
9
+ export {
10
+ handleMouseDown as handleMouseDownFrame,
11
+ handleMouseMove as handleMouseMoveFrame,
12
+ handleMouseUp as handleMouseUpFrame
13
+ };
14
+ //# sourceMappingURL=frameTool-PWVKKXSP.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": [],
4
+ "sourcesContent": [],
5
+ "mappings": "",
6
+ "names": []
7
+ }
@@ -0,0 +1,14 @@
1
+ "use client";
2
+ import {
3
+ handleMouseDown,
4
+ handleMouseMove,
5
+ handleMouseUp
6
+ } from "./chunk-2OQXI7QB.js";
7
+ import "./chunk-BZE4CEBG.js";
8
+ import "./chunk-L5OARZJ7.js";
9
+ export {
10
+ handleMouseDown as handleFreehandMouseDown,
11
+ handleMouseMove as handleFreehandMouseMove,
12
+ handleMouseUp as handleFreehandMouseUp
13
+ };
14
+ //# sourceMappingURL=freehandTool-SLYGASVP.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": [],
4
+ "sourcesContent": [],
5
+ "mappings": "",
6
+ "names": []
7
+ }
@@ -0,0 +1,18 @@
1
+ "use client";
2
+ import {
3
+ handleMouseDownIcon,
4
+ handleMouseMoveIcon,
5
+ handleMouseUpIcon,
6
+ startDrag,
7
+ stopDrag
8
+ } from "./chunk-VN62KLOC.js";
9
+ import "./chunk-BZE4CEBG.js";
10
+ import "./chunk-L5OARZJ7.js";
11
+ export {
12
+ handleMouseDownIcon,
13
+ handleMouseMoveIcon,
14
+ handleMouseUpIcon,
15
+ startDrag,
16
+ stopDrag
17
+ };
18
+ //# sourceMappingURL=iconTool-GPZ7O7NH.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": [],
4
+ "sourcesContent": [],
5
+ "mappings": "",
6
+ "names": []
7
+ }
@@ -0,0 +1,15 @@
1
+ "use client";
2
+ import {
3
+ handleMouseDownImage,
4
+ handleMouseMoveImage,
5
+ handleMouseUpImage
6
+ } from "./chunk-URB6MY46.js";
7
+ import "./chunk-DNAG7ML6.js";
8
+ import "./chunk-BZE4CEBG.js";
9
+ import "./chunk-L5OARZJ7.js";
10
+ export {
11
+ handleMouseDownImage,
12
+ handleMouseMoveImage,
13
+ handleMouseUpImage
14
+ };
15
+ //# sourceMappingURL=imageTool-D5R4XGEU.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": [],
4
+ "sourcesContent": [],
5
+ "mappings": "",
6
+ "names": []
7
+ }