@editframe/elements 0.47.2 → 0.48.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 (405) hide show
  1. package/dist/DelayedLoadingState.js +1 -1
  2. package/dist/DelayedLoadingState.js.map +1 -1
  3. package/dist/EF_FRAMEGEN.js +1 -2
  4. package/dist/EF_FRAMEGEN.js.map +1 -1
  5. package/dist/EF_RENDERING.js +1 -1
  6. package/dist/EF_RENDERING.js.map +1 -1
  7. package/dist/_virtual/{_@oxc-project_runtime@0.95.0 → _@oxc-project_runtime@0.122.0}/helpers/decorate.js +2 -3
  8. package/dist/attachContextRoot.js +1 -2
  9. package/dist/attachContextRoot.js.map +1 -1
  10. package/dist/canvas/EFCanvas.d.ts +4 -7
  11. package/dist/canvas/EFCanvas.js +20 -21
  12. package/dist/canvas/EFCanvas.js.map +1 -1
  13. package/dist/canvas/EFCanvasItem.d.ts +4 -5
  14. package/dist/canvas/EFCanvasItem.js +3 -4
  15. package/dist/canvas/EFCanvasItem.js.map +1 -1
  16. package/dist/canvas/api/CanvasAPI.d.ts +0 -1
  17. package/dist/canvas/api/CanvasAPI.js +1 -1
  18. package/dist/canvas/api/CanvasAPI.js.map +1 -1
  19. package/dist/canvas/coordinateTransform.js +1 -1
  20. package/dist/canvas/coordinateTransform.js.map +1 -1
  21. package/dist/canvas/getElementBounds.js +1 -1
  22. package/dist/canvas/getElementBounds.js.map +1 -1
  23. package/dist/canvas/overlays/SelectionOverlay.d.ts +4 -4
  24. package/dist/canvas/overlays/SelectionOverlay.js +6 -7
  25. package/dist/canvas/overlays/SelectionOverlay.js.map +1 -1
  26. package/dist/canvas/overlays/overlayState.js +1 -2
  27. package/dist/canvas/overlays/overlayState.js.map +1 -1
  28. package/dist/canvas/selection/SelectionController.js +1 -2
  29. package/dist/canvas/selection/SelectionController.js.map +1 -1
  30. package/dist/canvas/selection/SelectionModel.d.ts +0 -1
  31. package/dist/canvas/selection/SelectionModel.js +1 -1
  32. package/dist/canvas/selection/SelectionModel.js.map +1 -1
  33. package/dist/canvas/selection/selectionContext.d.ts +0 -1
  34. package/dist/canvas/selection/selectionContext.js +1 -2
  35. package/dist/canvas/selection/selectionContext.js.map +1 -1
  36. package/dist/elements/ContainerInfo.js +1 -1
  37. package/dist/elements/ContainerInfo.js.map +1 -1
  38. package/dist/elements/CrossUpdateController.js +1 -1
  39. package/dist/elements/CrossUpdateController.js.map +1 -1
  40. package/dist/elements/EFAudio.d.ts +4 -4
  41. package/dist/elements/EFAudio.js +4 -6
  42. package/dist/elements/EFAudio.js.map +1 -1
  43. package/dist/elements/EFCaptions.d.ts +4 -4
  44. package/dist/elements/EFCaptions.js +8 -10
  45. package/dist/elements/EFCaptions.js.map +1 -1
  46. package/dist/elements/EFImage.d.ts +7 -7
  47. package/dist/elements/EFImage.js +4 -6
  48. package/dist/elements/EFImage.js.map +1 -1
  49. package/dist/elements/EFMedia/BufferedSeekingInput.d.ts +2 -2
  50. package/dist/elements/EFMedia/BufferedSeekingInput.js +8 -9
  51. package/dist/elements/EFMedia/BufferedSeekingInput.js.map +1 -1
  52. package/dist/elements/EFMedia/CachedFetcher.js +1 -2
  53. package/dist/elements/EFMedia/CachedFetcher.js.map +1 -1
  54. package/dist/elements/EFMedia/MediaEngine.d.ts +0 -2
  55. package/dist/elements/EFMedia/MediaEngine.js +1 -2
  56. package/dist/elements/EFMedia/MediaEngine.js.map +1 -1
  57. package/dist/elements/EFMedia/SegmentIndex.d.ts +0 -3
  58. package/dist/elements/EFMedia/SegmentIndex.js +1 -2
  59. package/dist/elements/EFMedia/SegmentIndex.js.map +1 -1
  60. package/dist/elements/EFMedia/SegmentTransport.d.ts +0 -2
  61. package/dist/elements/EFMedia/SegmentTransport.js +1 -1
  62. package/dist/elements/EFMedia/SegmentTransport.js.map +1 -1
  63. package/dist/elements/EFMedia/TimingModel.d.ts +0 -2
  64. package/dist/elements/EFMedia/TimingModel.js +1 -1
  65. package/dist/elements/EFMedia/TimingModel.js.map +1 -1
  66. package/dist/elements/EFMedia/shared/AudioSpanUtils.js +1 -1
  67. package/dist/elements/EFMedia/shared/AudioSpanUtils.js.map +1 -1
  68. package/dist/elements/EFMedia/shared/GlobalInputCache.js +1 -2
  69. package/dist/elements/EFMedia/shared/GlobalInputCache.js.map +1 -1
  70. package/dist/elements/EFMedia/shared/PrecisionUtils.js +1 -1
  71. package/dist/elements/EFMedia/shared/PrecisionUtils.js.map +1 -1
  72. package/dist/elements/EFMedia/shared/ThumbnailExtractor.js +1 -2
  73. package/dist/elements/EFMedia/shared/ThumbnailExtractor.js.map +1 -1
  74. package/dist/elements/EFMedia/shared/timeoutUtils.js +1 -2
  75. package/dist/elements/EFMedia/shared/timeoutUtils.js.map +1 -1
  76. package/dist/elements/EFMedia/videoTasks/MainVideoInputCache.js +1 -1
  77. package/dist/elements/EFMedia/videoTasks/MainVideoInputCache.js.map +1 -1
  78. package/dist/elements/EFMedia/videoTasks/ScrubInputCache.d.ts +0 -1
  79. package/dist/elements/EFMedia/videoTasks/ScrubInputCache.js +12 -12
  80. package/dist/elements/EFMedia/videoTasks/ScrubInputCache.js.map +1 -1
  81. package/dist/elements/EFMedia.d.ts +2 -2
  82. package/dist/elements/EFMedia.js +2 -3
  83. package/dist/elements/EFMedia.js.map +1 -1
  84. package/dist/elements/EFMotionBlur.d.ts +0 -1
  85. package/dist/elements/EFMotionBlur.js +8 -15
  86. package/dist/elements/EFMotionBlur.js.map +1 -1
  87. package/dist/elements/EFPanZoom.d.ts +4 -4
  88. package/dist/elements/EFPanZoom.js +3 -4
  89. package/dist/elements/EFPanZoom.js.map +1 -1
  90. package/dist/elements/EFSourceMixin.js +2 -3
  91. package/dist/elements/EFSourceMixin.js.map +1 -1
  92. package/dist/elements/EFSurface.d.ts +6 -6
  93. package/dist/elements/EFSurface.js +3 -4
  94. package/dist/elements/EFSurface.js.map +1 -1
  95. package/dist/elements/EFTemporal.d.ts +0 -1
  96. package/dist/elements/EFTemporal.js +6 -7
  97. package/dist/elements/EFTemporal.js.map +1 -1
  98. package/dist/elements/EFText.d.ts +4 -4
  99. package/dist/elements/EFText.js +6 -7
  100. package/dist/elements/EFText.js.map +1 -1
  101. package/dist/elements/EFTextSegment.d.ts +4 -4
  102. package/dist/elements/EFTextSegment.js +3 -4
  103. package/dist/elements/EFTextSegment.js.map +1 -1
  104. package/dist/elements/EFTimegroup.d.ts +4 -10
  105. package/dist/elements/EFTimegroup.js +11 -12
  106. package/dist/elements/EFTimegroup.js.map +1 -1
  107. package/dist/elements/EFVideo.d.ts +6 -7
  108. package/dist/elements/EFVideo.js +7 -9
  109. package/dist/elements/EFVideo.js.map +1 -1
  110. package/dist/elements/EFWaveform.d.ts +4 -4
  111. package/dist/elements/EFWaveform.js +4 -6
  112. package/dist/elements/EFWaveform.js.map +1 -1
  113. package/dist/elements/ElementPositionInfo.js +1 -1
  114. package/dist/elements/ElementPositionInfo.js.map +1 -1
  115. package/dist/elements/FetchMixin.js +1 -1
  116. package/dist/elements/FetchMixin.js.map +1 -1
  117. package/dist/elements/SampleBuffer.js +1 -2
  118. package/dist/elements/SampleBuffer.js.map +1 -1
  119. package/dist/elements/TargetController.d.ts +0 -1
  120. package/dist/elements/TargetController.js +1 -1
  121. package/dist/elements/TargetController.js.map +1 -1
  122. package/dist/elements/TimegroupController.js +1 -1
  123. package/dist/elements/TimegroupController.js.map +1 -1
  124. package/dist/elements/cloneFactoryRegistry.js +1 -1
  125. package/dist/elements/cloneFactoryRegistry.js.map +1 -1
  126. package/dist/elements/durationConverter.js +4 -5
  127. package/dist/elements/durationConverter.js.map +1 -1
  128. package/dist/elements/easingUtils.js +1 -1
  129. package/dist/elements/easingUtils.js.map +1 -1
  130. package/dist/elements/findRootTemporal.js +1 -2
  131. package/dist/elements/findRootTemporal.js.map +1 -1
  132. package/dist/elements/parseTimeToMs.js +1 -1
  133. package/dist/elements/parseTimeToMs.js.map +1 -1
  134. package/dist/elements/renderTemporalAudio.js +1 -2
  135. package/dist/elements/renderTemporalAudio.js.map +1 -1
  136. package/dist/elements/setupTemporalHierarchy.js +1 -1
  137. package/dist/elements/setupTemporalHierarchy.js.map +1 -1
  138. package/dist/elements/updateAnimations.js +1 -2
  139. package/dist/elements/updateAnimations.js.map +1 -1
  140. package/dist/getRenderInfo.d.ts +0 -1
  141. package/dist/getRenderInfo.js +1 -2
  142. package/dist/getRenderInfo.js.map +1 -1
  143. package/dist/gui/ContextMixin.d.ts +0 -1
  144. package/dist/gui/ContextMixin.js +2 -3
  145. package/dist/gui/ContextMixin.js.map +1 -1
  146. package/dist/gui/Controllable.d.ts +0 -2
  147. package/dist/gui/Controllable.js +1 -2
  148. package/dist/gui/Controllable.js.map +1 -1
  149. package/dist/gui/EFActiveRootTemporal.d.ts +4 -5
  150. package/dist/gui/EFActiveRootTemporal.js +3 -4
  151. package/dist/gui/EFActiveRootTemporal.js.map +1 -1
  152. package/dist/gui/EFConfiguration.d.ts +4 -4
  153. package/dist/gui/EFConfiguration.js +3 -4
  154. package/dist/gui/EFConfiguration.js.map +1 -1
  155. package/dist/gui/EFControls.d.ts +2 -3
  156. package/dist/gui/EFControls.js +4 -5
  157. package/dist/gui/EFControls.js.map +1 -1
  158. package/dist/gui/EFDial.d.ts +4 -4
  159. package/dist/gui/EFDial.js +3 -4
  160. package/dist/gui/EFDial.js.map +1 -1
  161. package/dist/gui/EFFilmstrip.d.ts +6 -7
  162. package/dist/gui/EFFilmstrip.js +3 -4
  163. package/dist/gui/EFFilmstrip.js.map +1 -1
  164. package/dist/gui/EFFitScale.d.ts +3 -3
  165. package/dist/gui/EFFitScale.js +6 -7
  166. package/dist/gui/EFFitScale.js.map +1 -1
  167. package/dist/gui/EFFocusOverlay.d.ts +6 -6
  168. package/dist/gui/EFFocusOverlay.js +3 -4
  169. package/dist/gui/EFFocusOverlay.js.map +1 -1
  170. package/dist/gui/EFOverlayItem.d.ts +4 -4
  171. package/dist/gui/EFOverlayItem.js +3 -4
  172. package/dist/gui/EFOverlayItem.js.map +1 -1
  173. package/dist/gui/EFOverlayLayer.d.ts +4 -5
  174. package/dist/gui/EFOverlayLayer.js +3 -4
  175. package/dist/gui/EFOverlayLayer.js.map +1 -1
  176. package/dist/gui/EFPause.d.ts +4 -4
  177. package/dist/gui/EFPause.js +3 -4
  178. package/dist/gui/EFPause.js.map +1 -1
  179. package/dist/gui/EFPlay.d.ts +4 -4
  180. package/dist/gui/EFPlay.js +3 -4
  181. package/dist/gui/EFPlay.js.map +1 -1
  182. package/dist/gui/EFPreview.d.ts +4 -4
  183. package/dist/gui/EFPreview.js +3 -4
  184. package/dist/gui/EFPreview.js.map +1 -1
  185. package/dist/gui/EFResizableBox.d.ts +4 -4
  186. package/dist/gui/EFResizableBox.js +3 -4
  187. package/dist/gui/EFResizableBox.js.map +1 -1
  188. package/dist/gui/EFScrubber.d.ts +4 -4
  189. package/dist/gui/EFScrubber.js +3 -4
  190. package/dist/gui/EFScrubber.js.map +1 -1
  191. package/dist/gui/EFTimeDisplay.d.ts +4 -4
  192. package/dist/gui/EFTimeDisplay.js +3 -4
  193. package/dist/gui/EFTimeDisplay.js.map +1 -1
  194. package/dist/gui/EFTimelineRuler.d.ts +4 -4
  195. package/dist/gui/EFTimelineRuler.js +5 -6
  196. package/dist/gui/EFTimelineRuler.js.map +1 -1
  197. package/dist/gui/EFToggleLoop.d.ts +4 -4
  198. package/dist/gui/EFToggleLoop.js +3 -4
  199. package/dist/gui/EFToggleLoop.js.map +1 -1
  200. package/dist/gui/EFTogglePlay.d.ts +4 -4
  201. package/dist/gui/EFTogglePlay.js +3 -4
  202. package/dist/gui/EFTogglePlay.js.map +1 -1
  203. package/dist/gui/EFTransformHandles.d.ts +4 -4
  204. package/dist/gui/EFTransformHandles.js +3 -4
  205. package/dist/gui/EFTransformHandles.js.map +1 -1
  206. package/dist/gui/EFWorkbench.d.ts +6 -7
  207. package/dist/gui/EFWorkbench.js +13 -15
  208. package/dist/gui/EFWorkbench.js.map +1 -1
  209. package/dist/gui/EFWorkbench.spacebar.js +1 -1
  210. package/dist/gui/EFWorkbench.spacebar.js.map +1 -1
  211. package/dist/gui/FitScaleHelpers.js +1 -2
  212. package/dist/gui/FitScaleHelpers.js.map +1 -1
  213. package/dist/gui/PlaybackController.js +3 -4
  214. package/dist/gui/PlaybackController.js.map +1 -1
  215. package/dist/gui/TWMixin.js +1 -1
  216. package/dist/gui/TWMixin.js.map +1 -1
  217. package/dist/gui/TWMixin2.js +1 -2
  218. package/dist/gui/TWMixin2.js.map +1 -1
  219. package/dist/gui/TargetOrContextMixin.js +2 -3
  220. package/dist/gui/TargetOrContextMixin.js.map +1 -1
  221. package/dist/gui/currentTimeContext.js +1 -2
  222. package/dist/gui/currentTimeContext.js.map +1 -1
  223. package/dist/gui/durationContext.js +1 -2
  224. package/dist/gui/durationContext.js.map +1 -1
  225. package/dist/gui/efContext.js +1 -2
  226. package/dist/gui/efContext.js.map +1 -1
  227. package/dist/gui/fetchContext.js +1 -2
  228. package/dist/gui/fetchContext.js.map +1 -1
  229. package/dist/gui/focusContext.js +1 -2
  230. package/dist/gui/focusContext.js.map +1 -1
  231. package/dist/gui/focusedElementContext.js +1 -2
  232. package/dist/gui/focusedElementContext.js.map +1 -1
  233. package/dist/gui/hierarchy/EFHierarchy.d.ts +4 -4
  234. package/dist/gui/hierarchy/EFHierarchy.js +3 -4
  235. package/dist/gui/hierarchy/EFHierarchy.js.map +1 -1
  236. package/dist/gui/hierarchy/EFHierarchyItem.d.ts +2 -2
  237. package/dist/gui/hierarchy/EFHierarchyItem.js +13 -14
  238. package/dist/gui/hierarchy/EFHierarchyItem.js.map +1 -1
  239. package/dist/gui/hierarchy/hierarchyContext.js +1 -2
  240. package/dist/gui/hierarchy/hierarchyContext.js.map +1 -1
  241. package/dist/gui/icons.js +1 -2
  242. package/dist/gui/icons.js.map +1 -1
  243. package/dist/gui/panZoomTransformContext.js +1 -2
  244. package/dist/gui/panZoomTransformContext.js.map +1 -1
  245. package/dist/gui/playingContext.js +1 -2
  246. package/dist/gui/playingContext.js.map +1 -1
  247. package/dist/gui/previewSettingsContext.d.ts +0 -1
  248. package/dist/gui/previewSettingsContext.js +1 -2
  249. package/dist/gui/previewSettingsContext.js.map +1 -1
  250. package/dist/gui/shouldSignUrl.js +1 -1
  251. package/dist/gui/shouldSignUrl.js.map +1 -1
  252. package/dist/gui/theme.js +1 -1
  253. package/dist/gui/theme.js.map +1 -1
  254. package/dist/gui/timeline/EFTimeline.d.ts +2 -5
  255. package/dist/gui/timeline/EFTimeline.js +19 -20
  256. package/dist/gui/timeline/EFTimeline.js.map +1 -1
  257. package/dist/gui/timeline/EFTimelineRow.d.ts +2 -2
  258. package/dist/gui/timeline/EFTimelineRow.js +3 -4
  259. package/dist/gui/timeline/EFTimelineRow.js.map +1 -1
  260. package/dist/gui/timeline/TrimHandles.d.ts +4 -4
  261. package/dist/gui/timeline/TrimHandles.js +3 -4
  262. package/dist/gui/timeline/TrimHandles.js.map +1 -1
  263. package/dist/gui/timeline/flattenHierarchy.js +1 -2
  264. package/dist/gui/timeline/flattenHierarchy.js.map +1 -1
  265. package/dist/gui/timeline/timelineEditingContext.js +1 -2
  266. package/dist/gui/timeline/timelineEditingContext.js.map +1 -1
  267. package/dist/gui/timeline/timelineStateContext.js +1 -14
  268. package/dist/gui/timeline/timelineStateContext.js.map +1 -1
  269. package/dist/gui/timeline/tracks/AudioTrack.d.ts +0 -1
  270. package/dist/gui/timeline/tracks/AudioTrack.js +3 -4
  271. package/dist/gui/timeline/tracks/AudioTrack.js.map +1 -1
  272. package/dist/gui/timeline/tracks/CaptionsTrack.d.ts +2 -2
  273. package/dist/gui/timeline/tracks/CaptionsTrack.js +9 -9
  274. package/dist/gui/timeline/tracks/CaptionsTrack.js.map +1 -1
  275. package/dist/gui/timeline/tracks/EFThumbnailStrip.d.ts +4 -4
  276. package/dist/gui/timeline/tracks/EFThumbnailStrip.js +3 -4
  277. package/dist/gui/timeline/tracks/EFThumbnailStrip.js.map +1 -1
  278. package/dist/gui/timeline/tracks/HTMLTrack.d.ts +2 -2
  279. package/dist/gui/timeline/tracks/HTMLTrack.js +3 -4
  280. package/dist/gui/timeline/tracks/HTMLTrack.js.map +1 -1
  281. package/dist/gui/timeline/tracks/ImageTrack.d.ts +2 -2
  282. package/dist/gui/timeline/tracks/ImageTrack.js +3 -4
  283. package/dist/gui/timeline/tracks/ImageTrack.js.map +1 -1
  284. package/dist/gui/timeline/tracks/TextTrack.d.ts +2 -2
  285. package/dist/gui/timeline/tracks/TextTrack.js +4 -5
  286. package/dist/gui/timeline/tracks/TextTrack.js.map +1 -1
  287. package/dist/gui/timeline/tracks/TimegroupTrack.d.ts +5 -6
  288. package/dist/gui/timeline/tracks/TimegroupTrack.js +3 -4
  289. package/dist/gui/timeline/tracks/TimegroupTrack.js.map +1 -1
  290. package/dist/gui/timeline/tracks/TrackItem.d.ts +2 -2
  291. package/dist/gui/timeline/tracks/TrackItem.js +3 -4
  292. package/dist/gui/timeline/tracks/TrackItem.js.map +1 -1
  293. package/dist/gui/timeline/tracks/VideoTrack.d.ts +6 -7
  294. package/dist/gui/timeline/tracks/VideoTrack.js +3 -4
  295. package/dist/gui/timeline/tracks/VideoTrack.js.map +1 -1
  296. package/dist/gui/timeline/tracks/WaveformTrack.js +3 -4
  297. package/dist/gui/timeline/tracks/WaveformTrack.js.map +1 -1
  298. package/dist/gui/timeline/tracks/ensureTrackItemInit.js +1 -1
  299. package/dist/gui/timeline/tracks/preloadTracks.d.ts +1 -9
  300. package/dist/gui/timeline/tracks/renderTrackChildren.js +1 -2
  301. package/dist/gui/timeline/tracks/renderTrackChildren.js.map +1 -1
  302. package/dist/gui/timeline/tracks/waveformUtils.js +3 -6
  303. package/dist/gui/timeline/tracks/waveformUtils.js.map +1 -1
  304. package/dist/gui/transformCalculations.js +1 -2
  305. package/dist/gui/transformCalculations.js.map +1 -1
  306. package/dist/gui/transformUtils.js +1 -1
  307. package/dist/gui/transformUtils.js.map +1 -1
  308. package/dist/gui/tree/EFTree.d.ts +4 -6
  309. package/dist/gui/tree/EFTree.js +3 -4
  310. package/dist/gui/tree/EFTree.js.map +1 -1
  311. package/dist/gui/tree/EFTreeItem.d.ts +4 -5
  312. package/dist/gui/tree/EFTreeItem.js +3 -4
  313. package/dist/gui/tree/EFTreeItem.js.map +1 -1
  314. package/dist/gui/tree/treeContext.d.ts +0 -1
  315. package/dist/gui/tree/treeContext.js +1 -2
  316. package/dist/gui/tree/treeContext.js.map +1 -1
  317. package/dist/index.d.ts +0 -2
  318. package/dist/index.js +1 -2
  319. package/dist/index.js.map +1 -1
  320. package/dist/node.js +1 -2
  321. package/dist/node_modules/lit-html/development/directives/ref.d.ts +14 -0
  322. package/dist/node_modules/lit-html/development/lit-html.d.ts +46 -0
  323. package/dist/otel/BridgeSpanExporter.js +1 -2
  324. package/dist/otel/BridgeSpanExporter.js.map +1 -1
  325. package/dist/otel/setupBrowserTracing.js +1 -2
  326. package/dist/otel/setupBrowserTracing.js.map +1 -1
  327. package/dist/otel/tracingHelpers.d.ts +0 -2
  328. package/dist/otel/tracingHelpers.js +1 -2
  329. package/dist/otel/tracingHelpers.js.map +1 -1
  330. package/dist/preview/AdaptiveResolutionTracker.js +11 -2
  331. package/dist/preview/AdaptiveResolutionTracker.js.map +1 -1
  332. package/dist/preview/FrameController.d.ts +0 -1
  333. package/dist/preview/FrameController.js +2 -32
  334. package/dist/preview/FrameController.js.map +1 -1
  335. package/dist/preview/QualityUpgradeScheduler.js +1 -1
  336. package/dist/preview/QualityUpgradeScheduler.js.map +1 -1
  337. package/dist/preview/RenderContext.d.ts +0 -1
  338. package/dist/preview/RenderContext.js +11 -2
  339. package/dist/preview/RenderContext.js.map +1 -1
  340. package/dist/preview/RenderProfiler.js +1 -1
  341. package/dist/preview/RenderProfiler.js.map +1 -1
  342. package/dist/preview/RenderStats.js +1 -1
  343. package/dist/preview/RenderStats.js.map +1 -1
  344. package/dist/preview/encoding/canvasEncoder.js +7 -2
  345. package/dist/preview/encoding/canvasEncoder.js.map +1 -1
  346. package/dist/preview/encoding/mainThreadEncoder.js +1 -1
  347. package/dist/preview/encoding/mainThreadEncoder.js.map +1 -1
  348. package/dist/preview/encoding/workerEncoder.js +1 -1
  349. package/dist/preview/encoding/workerEncoder.js.map +1 -1
  350. package/dist/preview/logger.js +1 -1
  351. package/dist/preview/logger.js.map +1 -1
  352. package/dist/preview/previewSettings.js +1 -1
  353. package/dist/preview/previewSettings.js.map +1 -1
  354. package/dist/preview/previewTypes.js +1 -1
  355. package/dist/preview/previewTypes.js.map +1 -1
  356. package/dist/preview/renderElementToCanvas.d.ts +0 -1
  357. package/dist/preview/renderElementToCanvas.js +12 -5
  358. package/dist/preview/renderElementToCanvas.js.map +1 -1
  359. package/dist/preview/renderTimegroupToCanvas.d.ts +0 -1
  360. package/dist/preview/renderTimegroupToCanvas.js +6 -7
  361. package/dist/preview/renderTimegroupToCanvas.js.map +1 -1
  362. package/dist/preview/renderTimegroupToVideo.d.ts +0 -1
  363. package/dist/preview/renderTimegroupToVideo.js +20 -8
  364. package/dist/preview/renderTimegroupToVideo.js.map +1 -1
  365. package/dist/preview/renderVideoToVideo.js +11 -2
  366. package/dist/preview/renderVideoToVideo.js.map +1 -1
  367. package/dist/preview/renderers.d.ts +0 -1
  368. package/dist/preview/renderers.js +5 -2
  369. package/dist/preview/renderers.js.map +1 -1
  370. package/dist/preview/rendering/ScaleConfig.js +2 -3
  371. package/dist/preview/rendering/ScaleConfig.js.map +1 -1
  372. package/dist/preview/rendering/inlineImages.d.ts +0 -1
  373. package/dist/preview/rendering/inlineImages.js +1 -1
  374. package/dist/preview/rendering/inlineImages.js.map +1 -1
  375. package/dist/preview/rendering/loadImage.js +1 -2
  376. package/dist/preview/rendering/loadImage.js.map +1 -1
  377. package/dist/preview/rendering/renderToImageNative.js +4 -5
  378. package/dist/preview/rendering/renderToImageNative.js.map +1 -1
  379. package/dist/preview/rendering/serializeTimelineDirect.js +16 -4
  380. package/dist/preview/rendering/serializeTimelineDirect.js.map +1 -1
  381. package/dist/preview/statsTrackingStrategy.js +1 -1
  382. package/dist/preview/statsTrackingStrategy.js.map +1 -1
  383. package/dist/preview/workers/WorkerPool.js +5 -2
  384. package/dist/preview/workers/WorkerPool.js.map +1 -1
  385. package/dist/preview/workers/encoderWorkerInline.js +1 -1
  386. package/dist/preview/workers/encoderWorkerInline.js.map +1 -1
  387. package/dist/render/EFRenderAPI.d.ts +0 -1
  388. package/dist/render/EFRenderAPI.js +1 -2
  389. package/dist/render/EFRenderAPI.js.map +1 -1
  390. package/dist/render/getRenderData.js +1 -1
  391. package/dist/render/getRenderData.js.map +1 -1
  392. package/dist/transcoding/cache/RequestDeduplicator.js +1 -1
  393. package/dist/transcoding/cache/RequestDeduplicator.js.map +1 -1
  394. package/dist/transcoding/cache/URLTokenDeduplicator.js +1 -1
  395. package/dist/transcoding/cache/URLTokenDeduplicator.js.map +1 -1
  396. package/dist/transcoding/types/index.d.ts +0 -1
  397. package/dist/transcoding/utils/UrlGenerator.js +1 -1
  398. package/dist/transcoding/utils/UrlGenerator.js.map +1 -1
  399. package/dist/utils/LRUCache.js +1 -1
  400. package/dist/utils/LRUCache.js.map +1 -1
  401. package/dist/utils/frameTime.js +2 -9
  402. package/dist/utils/frameTime.js.map +1 -1
  403. package/dist/version.js +2 -2
  404. package/dist/version.js.map +1 -1
  405. package/package.json +5 -4
@@ -1,9 +1,8 @@
1
- import * as lit30 from "lit";
1
+ import { TemplateResult as TemplateResult$1 } from "../node_modules/lit-html/development/lit-html.js";
2
+ import * as _$lit from "lit";
2
3
  import { LitElement } from "lit";
3
- import * as lit_html28 from "lit-html";
4
4
 
5
5
  //#region src/canvas/EFCanvasItem.d.ts
6
-
7
6
  /**
8
7
  * Canvas item wrapper component.
9
8
  *
@@ -28,7 +27,7 @@ import * as lit_html28 from "lit-html";
28
27
  * ```
29
28
  */
30
29
  declare class EFCanvasItem extends LitElement {
31
- static styles: lit30.CSSResult;
30
+ static styles: _$lit.CSSResult;
32
31
  id: string;
33
32
  private canvas;
34
33
  private api;
@@ -43,7 +42,7 @@ declare class EFCanvasItem extends LitElement {
43
42
  * Unregister this element from the canvas.
44
43
  */
45
44
  private unregister;
46
- render(): lit_html28.TemplateResult<1>;
45
+ render(): TemplateResult$1<1>;
47
46
  }
48
47
  declare global {
49
48
  interface HTMLElementTagNameMap {
@@ -1,10 +1,9 @@
1
- import { __decorate } from "../_virtual/_@oxc-project_runtime@0.95.0/helpers/decorate.js";
1
+ import { __decorate } from "../_virtual/_@oxc-project_runtime@0.122.0/helpers/decorate.js";
2
2
  import { CanvasAPI } from "./api/CanvasAPI.js";
3
3
  import { LitElement, css, html } from "lit";
4
4
  import { customElement, property } from "lit/decorators.js";
5
-
6
5
  //#region src/canvas/EFCanvasItem.ts
7
- let EFCanvasItem = class EFCanvasItem$1 extends LitElement {
6
+ let EFCanvasItem = class EFCanvasItem extends LitElement {
8
7
  constructor(..._args) {
9
8
  super(..._args);
10
9
  this.id = "";
@@ -66,7 +65,7 @@ __decorate([property({
66
65
  reflect: true
67
66
  })], EFCanvasItem.prototype, "id", void 0);
68
67
  EFCanvasItem = __decorate([customElement("ef-canvas-item")], EFCanvasItem);
69
-
70
68
  //#endregion
71
69
  export { EFCanvasItem };
70
+
72
71
  //# sourceMappingURL=EFCanvasItem.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"EFCanvasItem.js","names":["EFCanvasItem"],"sources":["../../src/canvas/EFCanvasItem.ts"],"sourcesContent":["import { css, html, LitElement } from \"lit\";\nimport { customElement, property } from \"lit/decorators.js\";\nimport type { EFCanvas } from \"./EFCanvas.js\";\nimport { CanvasAPI } from \"./api/CanvasAPI.js\";\n\n/**\n * Canvas item wrapper component.\n *\n * @deprecated This component is deprecated. All DOM nodes in ef-canvas are now automatically\n * treated as canvas elements. Use plain HTML elements (div, etc.) instead.\n *\n * @example\n * ```html\n * <!-- Old way (deprecated) -->\n * <ef-canvas>\n * <ef-canvas-item id=\"item-1\" style=\"left: 100px; top: 100px;\">\n * <div>My content</div>\n * </ef-canvas-item>\n * </ef-canvas>\n *\n * <!-- New way -->\n * <ef-canvas>\n * <div id=\"item-1\" style=\"left: 100px; top: 100px;\">\n * <div>My content</div>\n * </div>\n * </ef-canvas>\n * ```\n */\n@customElement(\"ef-canvas-item\")\nexport class EFCanvasItem extends LitElement {\n static styles = css`\n :host {\n display: block;\n position: absolute;\n }\n `;\n\n @property({ type: String, reflect: true })\n id = \"\";\n\n private canvas: EFCanvas | null = null;\n private api: CanvasAPI | null = null;\n private registeredId: string | null = null;\n\n connectedCallback() {\n super.connectedCallback();\n this.findAndRegister();\n }\n\n disconnectedCallback() {\n super.disconnectedCallback();\n this.unregister();\n }\n\n /**\n * Find parent ef-canvas and register this element.\n */\n private findAndRegister() {\n // Find parent ef-canvas\n this.canvas = this.closest(\"ef-canvas\") as EFCanvas | null;\n if (!this.canvas) {\n console.warn(\"[EFCanvasItem] No parent ef-canvas found. Element will not be registered.\");\n return;\n }\n\n // Wait for canvas to be ready\n this.canvas.updateComplete.then(() => {\n // Create API instance\n this.api = new CanvasAPI(this.canvas!);\n\n // Element must have an ID - check before registering\n if (!this.id) {\n console.error(\n \"[EFCanvasItem] Element must have an 'id' attribute. Set it before adding to canvas.\",\n );\n return;\n }\n\n // Register this element with the canvas\n // Pass the id explicitly - canvas will throw if it's missing or duplicate\n this.registeredId = this.api.registerElement(this, this.id);\n });\n }\n\n /**\n * Unregister this element from the canvas.\n */\n private unregister() {\n if (this.api && this.registeredId) {\n this.api.unregisterElement(this.registeredId);\n this.registeredId = null;\n }\n this.api = null;\n this.canvas = null;\n }\n\n render() {\n return html`<slot></slot>`;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"ef-canvas-item\": EFCanvasItem;\n }\n}\n"],"mappings":";;;;;;AA6BO,yBAAMA,uBAAqB,WAAW;;;YAStC;gBAE6B;aACF;sBACM;;;gBAZtB,GAAG;;;;;;;CAcnB,oBAAoB;AAClB,QAAM,mBAAmB;AACzB,OAAK,iBAAiB;;CAGxB,uBAAuB;AACrB,QAAM,sBAAsB;AAC5B,OAAK,YAAY;;;;;CAMnB,AAAQ,kBAAkB;AAExB,OAAK,SAAS,KAAK,QAAQ,YAAY;AACvC,MAAI,CAAC,KAAK,QAAQ;AAChB,WAAQ,KAAK,4EAA4E;AACzF;;AAIF,OAAK,OAAO,eAAe,WAAW;AAEpC,QAAK,MAAM,IAAI,UAAU,KAAK,OAAQ;AAGtC,OAAI,CAAC,KAAK,IAAI;AACZ,YAAQ,MACN,sFACD;AACD;;AAKF,QAAK,eAAe,KAAK,IAAI,gBAAgB,MAAM,KAAK,GAAG;IAC3D;;;;;CAMJ,AAAQ,aAAa;AACnB,MAAI,KAAK,OAAO,KAAK,cAAc;AACjC,QAAK,IAAI,kBAAkB,KAAK,aAAa;AAC7C,QAAK,eAAe;;AAEtB,OAAK,MAAM;AACX,OAAK,SAAS;;CAGhB,SAAS;AACP,SAAO,IAAI;;;YA5DZ,SAAS;CAAE,MAAM;CAAQ,SAAS;CAAM,CAAC;2BAT3C,cAAc,iBAAiB"}
1
+ {"version":3,"file":"EFCanvasItem.js","names":[],"sources":["../../src/canvas/EFCanvasItem.ts"],"mappings":";;;;;AA6BO,IAAA,eAAA,MAAM,qBAAqB,WAAW;;;YAStC;gBAE6B;aACF;sBACM;;;gBAZtB,GAAG;;;;;;;CAcnB,oBAAoB;AAClB,QAAM,mBAAmB;AACzB,OAAK,iBAAiB;;CAGxB,uBAAuB;AACrB,QAAM,sBAAsB;AAC5B,OAAK,YAAY;;;;;CAMnB,kBAA0B;AAExB,OAAK,SAAS,KAAK,QAAQ,YAAY;AACvC,MAAI,CAAC,KAAK,QAAQ;AAChB,WAAQ,KAAK,4EAA4E;AACzF;;AAIF,OAAK,OAAO,eAAe,WAAW;AAEpC,QAAK,MAAM,IAAI,UAAU,KAAK,OAAQ;AAGtC,OAAI,CAAC,KAAK,IAAI;AACZ,YAAQ,MACN,sFACD;AACD;;AAKF,QAAK,eAAe,KAAK,IAAI,gBAAgB,MAAM,KAAK,GAAG;IAC3D;;;;;CAMJ,aAAqB;AACnB,MAAI,KAAK,OAAO,KAAK,cAAc;AACjC,QAAK,IAAI,kBAAkB,KAAK,aAAa;AAC7C,QAAK,eAAe;;AAEtB,OAAK,MAAM;AACX,OAAK,SAAS;;CAGhB,SAAS;AACP,SAAO,IAAI;;;YA5DZ,SAAS;CAAE,MAAM;CAAQ,SAAS;CAAM,CAAC,CAAA,EAAA,aAAA,WAAA,MAAA,KAAA,EAAA;2BAT3C,cAAc,iBAAiB,CAAA,EAAA,aAAA"}
@@ -2,7 +2,6 @@ import { CanvasData, CanvasElementData } from "./types.js";
2
2
  import { EFCanvas } from "../EFCanvas.js";
3
3
 
4
4
  //#region src/canvas/api/CanvasAPI.d.ts
5
-
6
5
  /**
7
6
  * Programmatic API/SDK for canvas operations.
8
7
  */
@@ -176,7 +176,7 @@ var CanvasAPI = class {
176
176
  for (const group of data.groups) controller.getModel().createGroup(group.elementIds);
177
177
  }
178
178
  };
179
-
180
179
  //#endregion
181
180
  export { CanvasAPI };
181
+
182
182
  //# sourceMappingURL=CanvasAPI.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"CanvasAPI.js","names":["canvas: EFCanvas","groups: Array<{ id: string; elementIds: string[] }>"],"sources":["../../../src/canvas/api/CanvasAPI.ts"],"sourcesContent":["import type { EFCanvas } from \"../EFCanvas.js\";\nimport type { CanvasElementData, CanvasData } from \"./types.js\";\nimport { SelectionModel } from \"../selection/SelectionModel.js\";\n\n/**\n * Programmatic API/SDK for canvas operations.\n */\nexport class CanvasAPI {\n constructor(private canvas: EFCanvas) {}\n\n /**\n * Register an existing element for canvas management.\n * @param element - The HTML element to register\n * @param id - Optional custom ID, otherwise auto-generated\n * @returns The element ID\n */\n registerElement(element: HTMLElement, id?: string): string {\n return (this.canvas as any).registerElement(element, id);\n }\n\n /**\n * Unregister an element from canvas management.\n * @param id - Element ID or element itself\n */\n unregisterElement(id: string | HTMLElement): void {\n (this.canvas as any).unregisterElement(id);\n }\n\n /**\n * Update element position/transform in canvas coordinates.\n * @param id - Element ID\n * @param updates - Partial element data to update\n */\n updateElement(id: string, updates: Partial<CanvasElementData>): void {\n const current = this.getElement(id);\n if (!current) {\n throw new Error(`Element ${id} not found`);\n }\n\n if (updates.x !== undefined || updates.y !== undefined) {\n const x = updates.x !== undefined ? updates.x : current.x;\n const y = updates.y !== undefined ? updates.y : current.y;\n (this.canvas as any).updateElementPosition(id, x, y);\n }\n\n if (updates.width !== undefined || updates.height !== undefined) {\n const element = current.element;\n const width = updates.width !== undefined ? updates.width : current.width;\n const height = updates.height !== undefined ? updates.height : current.height;\n // Set size in canvas coordinates (parent transform handles scaling)\n element.style.width = `${width}px`;\n element.style.height = `${height}px`;\n }\n\n if (updates.rotation !== undefined) {\n const element = current.element;\n element.style.transform = `rotate(${updates.rotation}deg)`;\n }\n }\n\n /**\n * Get element data by ID.\n * @param id - Element ID\n * @returns Element data or null if not found\n */\n getElement(id: string): CanvasElementData | null {\n return (this.canvas as any).getElementData(id);\n }\n\n /**\n * Get all registered elements.\n * @returns Array of all element data\n */\n getAllElements(): CanvasElementData[] {\n return (this.canvas as any).getAllElementsData();\n }\n\n /**\n * Get the number of registered elements.\n * @returns The count of registered elements\n */\n get elementCount(): number {\n return this.getAllElements().length;\n }\n\n /**\n * Get all registered elements (getter alias for getAllElements).\n * @returns Array of all element data\n */\n get elements(): CanvasElementData[] {\n return this.getAllElements();\n }\n\n /**\n * Convert screen coordinates to canvas coordinates.\n * @param screenX - X coordinate in screen space\n * @param screenY - Y coordinate in screen space\n * @returns Canvas coordinates\n */\n screenToCanvas(screenX: number, screenY: number): { x: number; y: number } {\n return (this.canvas as any).screenToCanvasCoords(screenX, screenY);\n }\n\n /**\n * Convert canvas coordinates to screen coordinates.\n * @param canvasX - X coordinate in canvas space\n * @param canvasY - Y coordinate in canvas space\n * @returns Screen coordinates\n */\n canvasToScreen(canvasX: number, canvasY: number): { x: number; y: number } {\n return (this.canvas as any).canvasToScreenCoords(canvasX, canvasY);\n }\n\n /**\n * Select an element.\n * @param id - Element ID\n */\n select(id: string): void {\n const controller = (this.canvas as any).selectionController as {\n getModel(): SelectionModel;\n };\n controller.getModel().select(id);\n // Update is deferred via selectionchange event listener\n }\n\n /**\n * Select multiple elements.\n * @param ids - Array of element IDs\n */\n selectMultiple(ids: string[]): void {\n const controller = (this.canvas as any).selectionController as {\n getModel(): SelectionModel;\n };\n controller.getModel().selectMultiple(ids);\n // Update is deferred via selectionchange event listener\n }\n\n /**\n * Deselect an element.\n * @param id - Element ID\n */\n deselect(id: string): void {\n const controller = (this.canvas as any).selectionController as {\n getModel(): SelectionModel;\n };\n controller.getModel().deselect(id);\n // Update is deferred via selectionchange event listener\n }\n\n /**\n * Get currently selected element IDs.\n * @returns Set of selected IDs\n */\n getSelectedIds(): string[] {\n const controller = (this.canvas as any).selectionController as {\n getModel(): SelectionModel;\n };\n return Array.from(controller.getModel().selectedIds);\n }\n\n /**\n * Create a group from element IDs.\n * @param ids - Array of element IDs to group\n * @returns Group ID\n */\n group(ids: string[]): string {\n const controller = (this.canvas as any).selectionController as {\n getModel(): SelectionModel;\n };\n const groupId = controller.getModel().createGroup(ids);\n // Update is deferred via selectionchange event listener\n return groupId;\n }\n\n /**\n * Ungroup a group.\n * @param groupId - Group ID\n */\n ungroup(groupId: string): void {\n const controller = (this.canvas as any).selectionController as {\n getModel(): SelectionModel;\n };\n controller.getModel().ungroup(groupId);\n // Update is deferred via selectionchange event listener\n }\n\n /**\n * Export canvas data.\n * @returns Canvas data structure\n */\n export(): CanvasData {\n const controller = (this.canvas as any).selectionController as {\n getModel(): SelectionModel;\n };\n const model = controller.getModel();\n const groups: Array<{ id: string; elementIds: string[] }> = [];\n\n // Collect all groups\n const processedGroups = new Set<string>();\n for (const elementId of this.getAllElements().map((e) => e.id)) {\n const groupId = model.getGroupId(elementId);\n if (groupId && !processedGroups.has(groupId)) {\n processedGroups.add(groupId);\n groups.push({\n id: groupId,\n elementIds: model.getGroupElements(groupId),\n });\n }\n }\n\n return {\n elements: this.getAllElements(),\n groups,\n };\n }\n\n /**\n * Import canvas data.\n * @param data - Canvas data structure\n */\n import(data: CanvasData): void {\n // Clear existing\n for (const element of this.getAllElements()) {\n this.unregisterElement(element.id);\n }\n\n // Import elements\n for (const elementData of data.elements) {\n const element = elementData.element;\n this.registerElement(element, elementData.id);\n this.updateElement(elementData.id, elementData);\n }\n\n // Import groups\n const controller = (this.canvas as any).selectionController as {\n getModel(): SelectionModel;\n };\n for (const group of data.groups) {\n controller.getModel().createGroup(group.elementIds);\n }\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"CanvasAPI.js","names":[],"sources":["../../../src/canvas/api/CanvasAPI.ts"],"mappings":"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"}
@@ -84,7 +84,7 @@ function canvasToScreen(canvasX, canvasY, canvasRect, panZoomTransform) {
84
84
  y: canvasRect.top + canvasY * panZoomTransform.scale
85
85
  };
86
86
  }
87
-
88
87
  //#endregion
89
88
  export { canvasToScreen, screenToCanvas };
89
+
90
90
  //# sourceMappingURL=coordinateTransform.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"coordinateTransform.js","names":[],"sources":["../../src/canvas/coordinateTransform.ts"],"sourcesContent":["import type { PanZoomTransform } from \"../elements/EFPanZoom.js\";\n\n/**\n * =============================================================================\n * COORDINATE SPACES\n * =============================================================================\n *\n * This module provides utilities for converting between two coordinate spaces:\n *\n * 1. SCREEN SPACE (viewport coordinates)\n * - Origin: Top-left of browser viewport\n * - Units: Physical screen pixels\n * - Used by: getBoundingClientRect(), mouse events (clientX/clientY)\n * - AFFECTED by: zoom/scale transforms\n *\n * 2. CANVAS SPACE (logical coordinates)\n * - Origin: Top-left of the canvas content area\n * - Units: CSS pixels at 1:1 scale (unaffected by zoom)\n * - Used by: Element positioning (style.left/top), metadata storage\n * - NOT AFFECTED by: zoom/scale transforms\n *\n * KEY RELATIONSHIP:\n * screenPosition = canvasRect.origin + (canvasPosition * scale)\n * canvasPosition = (screenPosition - canvasRect.origin) / scale\n *\n * IMPORTANT: These functions convert POSITIONS, not DIMENSIONS.\n *\n * For positions (like element center or mouse coordinates):\n * - Use screenToCanvas() / canvasToScreen() for conversion\n *\n * For dimensions (like element width/height):\n * - Screen dimensions = canvas dimensions * scale\n * - Canvas dimensions = screen dimensions / scale\n * - OR better: use offsetWidth/offsetHeight which are already in canvas space\n *\n * =============================================================================\n */\n\n/**\n * Convert screen coordinates to canvas coordinates.\n *\n * Use this for converting POSITIONS from screen space (getBoundingClientRect,\n * mouse events) to canvas space (element positioning, metadata).\n *\n * Example: Converting a click position to canvas coordinates for hit testing.\n * Example: Converting element center from screen to canvas for metadata.\n *\n * @param screenX - X coordinate in screen space (e.g., event.clientX, rect.left)\n * @param screenY - Y coordinate in screen space (e.g., event.clientY, rect.top)\n * @param canvasRect - Canvas content element's bounding rect (.canvas-content, not <ef-canvas>)\n * @param panZoomTransform - Optional PanZoom transform from context\n * @returns Object with x, y in canvas coordinate space\n */\nexport function screenToCanvas(\n screenX: number,\n screenY: number,\n canvasRect: DOMRect,\n panZoomTransform?: PanZoomTransform,\n): { x: number; y: number } {\n if (!panZoomTransform) {\n return {\n x: screenX - canvasRect.left,\n y: screenY - canvasRect.top,\n };\n }\n // canvasRect already includes the panzoom transform (since canvas is inside .content-wrapper)\n // So we only need to:\n // 1. Get position relative to canvas in screen space: screenX - canvasRect.left\n // 2. Divide by scale to get canvas coordinates\n // We don't need to subtract panZoomTransform.x/y because it's already accounted for in canvasRect\n return {\n x: (screenX - canvasRect.left) / panZoomTransform.scale,\n y: (screenY - canvasRect.top) / panZoomTransform.scale,\n };\n}\n\n/**\n * Convert canvas coordinates to screen coordinates.\n *\n * Use this for converting POSITIONS from canvas space (element positioning,\n * metadata) to screen space (overlay positioning, visual display).\n *\n * Example: Converting element top-left from metadata to screen position for overlays.\n * Example: Converting a canvas point to screen coordinates for rendering guides.\n *\n * @param canvasX - X coordinate in canvas space (from metadata or style.left)\n * @param canvasY - Y coordinate in canvas space (from metadata or style.top)\n * @param canvasRect - Canvas content element's bounding rect (.canvas-content, not <ef-canvas>)\n * @param panZoomTransform - Optional PanZoom transform from context\n * @returns Object with x, y in screen coordinate space\n */\nexport function canvasToScreen(\n canvasX: number,\n canvasY: number,\n canvasRect: DOMRect,\n panZoomTransform?: PanZoomTransform,\n): { x: number; y: number } {\n if (!panZoomTransform) {\n return {\n x: canvasRect.left + canvasX,\n y: canvasRect.top + canvasY,\n };\n }\n // canvasRect already includes the panzoom transform (since canvas is inside .content-wrapper)\n // So we only need to:\n // 1. Multiply canvas coordinates by scale to get screen-space offset\n // 2. Add to canvasRect.left/top (which already includes pan)\n // We don't need to add panZoomTransform.x/y because it's already accounted for in canvasRect\n return {\n x: canvasRect.left + canvasX * panZoomTransform.scale,\n y: canvasRect.top + canvasY * panZoomTransform.scale,\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqDA,SAAgB,eACd,SACA,SACA,YACA,kBAC0B;AAC1B,KAAI,CAAC,iBACH,QAAO;EACL,GAAG,UAAU,WAAW;EACxB,GAAG,UAAU,WAAW;EACzB;AAOH,QAAO;EACL,IAAI,UAAU,WAAW,QAAQ,iBAAiB;EAClD,IAAI,UAAU,WAAW,OAAO,iBAAiB;EAClD;;;;;;;;;;;;;;;;;AAkBH,SAAgB,eACd,SACA,SACA,YACA,kBAC0B;AAC1B,KAAI,CAAC,iBACH,QAAO;EACL,GAAG,WAAW,OAAO;EACrB,GAAG,WAAW,MAAM;EACrB;AAOH,QAAO;EACL,GAAG,WAAW,OAAO,UAAU,iBAAiB;EAChD,GAAG,WAAW,MAAM,UAAU,iBAAiB;EAChD"}
1
+ {"version":3,"file":"coordinateTransform.js","names":[],"sources":["../../src/canvas/coordinateTransform.ts"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqDA,SAAgB,eACd,SACA,SACA,YACA,kBAC0B;AAC1B,KAAI,CAAC,iBACH,QAAO;EACL,GAAG,UAAU,WAAW;EACxB,GAAG,UAAU,WAAW;EACzB;AAOH,QAAO;EACL,IAAI,UAAU,WAAW,QAAQ,iBAAiB;EAClD,IAAI,UAAU,WAAW,OAAO,iBAAiB;EAClD;;;;;;;;;;;;;;;;;AAkBH,SAAgB,eACd,SACA,SACA,YACA,kBAC0B;AAC1B,KAAI,CAAC,iBACH,QAAO;EACL,GAAG,WAAW,OAAO;EACrB,GAAG,WAAW,MAAM;EACrB;AAOH,QAAO;EACL,GAAG,WAAW,OAAO,UAAU,iBAAiB;EAChD,GAAG,WAAW,MAAM,UAAU,iBAAiB;EAChD"}
@@ -34,7 +34,7 @@ function getElementBounds(element) {
34
34
  if ("getCanvasBounds" in element && typeof element.getCanvasBounds === "function") return element.getCanvasBounds();
35
35
  return element.getBoundingClientRect();
36
36
  }
37
-
38
37
  //#endregion
39
38
  export { getElementBounds };
39
+
40
40
  //# sourceMappingURL=getElementBounds.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"getElementBounds.js","names":[],"sources":["../../src/canvas/getElementBounds.ts"],"sourcesContent":["import type { CanvasElementBounds } from \"./api/types.js\";\n\n/**\n * Get element bounds using the CanvasElementBounds protocol if available,\n * otherwise fall back to getBoundingClientRect().\n *\n * This allows elements to provide custom hit testing areas or account for\n * visual bounds that differ from DOM bounds.\n *\n * IMPORTANT: This returns a DOMRect in SCREEN SPACE (like getBoundingClientRect).\n *\n * For ROTATED elements, the returned rect is the AXIS-ALIGNED BOUNDING BOX:\n * - rect.width/height are the bounding box dimensions, NOT the element's actual dimensions\n * - rect.left/top are the bounding box corner, NOT the element's visual top-left\n *\n * CORRECT USAGE:\n *\n * ✅ Getting element CENTER (rotation-invariant):\n * const rect = getElementBounds(element);\n * const centerX = rect.left + rect.width / 2;\n * const centerY = rect.top + rect.height / 2;\n *\n * ✅ Hit testing (checking if a point is inside the bounding box):\n * const rect = getElementBounds(element);\n * if (x >= rect.left && x <= rect.right && y >= rect.top && y <= rect.bottom) { ... }\n *\n * ❌ Getting element DIMENSIONS (wrong for rotated elements):\n * const rect = getElementBounds(element);\n * const width = rect.width; // WRONG! This is bounding box width, not element width\n *\n * For actual dimensions, use element.offsetWidth / element.offsetHeight instead.\n * These return layout dimensions unaffected by CSS transforms.\n */\nexport function getElementBounds(element: HTMLElement): DOMRect {\n if (\"getCanvasBounds\" in element && typeof (element as any).getCanvasBounds === \"function\") {\n return (element as CanvasElementBounds).getCanvasBounds();\n }\n return element.getBoundingClientRect();\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiCA,SAAgB,iBAAiB,SAA+B;AAC9D,KAAI,qBAAqB,WAAW,OAAQ,QAAgB,oBAAoB,WAC9E,QAAQ,QAAgC,iBAAiB;AAE3D,QAAO,QAAQ,uBAAuB"}
1
+ {"version":3,"file":"getElementBounds.js","names":[],"sources":["../../src/canvas/getElementBounds.ts"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiCA,SAAgB,iBAAiB,SAA+B;AAC9D,KAAI,qBAAqB,WAAW,OAAQ,QAAgB,oBAAoB,WAC9E,QAAQ,QAAgC,iBAAiB;AAE3D,QAAO,QAAQ,uBAAuB"}
@@ -1,8 +1,8 @@
1
+ import { TemplateResult as TemplateResult$1 } from "../../node_modules/lit-html/development/lit-html.js";
1
2
  import { SelectionContext } from "../selection/selectionContext.js";
2
3
  import { PanZoomTransform } from "../../elements/EFPanZoom.js";
3
- import * as lit37 from "lit";
4
+ import * as _$lit from "lit";
4
5
  import { LitElement } from "lit";
5
- import * as lit_html34 from "lit-html";
6
6
 
7
7
  //#region src/canvas/overlays/SelectionOverlay.d.ts
8
8
  /**
@@ -10,7 +10,7 @@ import * as lit_html34 from "lit-html";
10
10
  * Uses fixed positioning to ensure 1:1 pixel ratio regardless of zoom level.
11
11
  */
12
12
  declare class SelectionOverlay extends LitElement {
13
- static styles: lit37.CSSResult[];
13
+ static styles: _$lit.CSSResult[];
14
14
  createRenderRoot(): this;
15
15
  firstUpdated(changedProperties: Map<string | number | symbol, unknown>): void;
16
16
  selectionFromContext?: SelectionContext;
@@ -93,7 +93,7 @@ declare class SelectionOverlay extends LitElement {
93
93
  * This ensures we always have fresh values instead of stale property/context.
94
94
  */
95
95
  private readCurrentTransform;
96
- render(): lit_html34.TemplateResult<1>;
96
+ render(): TemplateResult$1<1>;
97
97
  }
98
98
  declare global {
99
99
  interface HTMLElementTagNameMap {
@@ -1,13 +1,12 @@
1
- import { __decorate } from "../../_virtual/_@oxc-project_runtime@0.95.0/helpers/decorate.js";
1
+ import { __decorate } from "../../_virtual/_@oxc-project_runtime@0.122.0/helpers/decorate.js";
2
2
  import { panZoomTransformContext } from "../../gui/panZoomTransformContext.js";
3
3
  import { selectionContext } from "../selection/selectionContext.js";
4
4
  import { calculateOverlayState, getOverlayTargets } from "./overlayState.js";
5
5
  import { consume } from "@lit/context";
6
6
  import { LitElement, css, html } from "lit";
7
7
  import { customElement, property, state } from "lit/decorators.js";
8
-
9
8
  //#region src/canvas/overlays/SelectionOverlay.ts
10
- let SelectionOverlay = class SelectionOverlay$1 extends LitElement {
9
+ let SelectionOverlay = class SelectionOverlay extends LitElement {
11
10
  constructor(..._args) {
12
11
  super(..._args);
13
12
  this.canvasElement = null;
@@ -104,9 +103,9 @@ let SelectionOverlay = class SelectionOverlay$1 extends LitElement {
104
103
  findCanvasElement() {
105
104
  const parent = this.parentElement;
106
105
  if (parent) {
107
- const panZoom$1 = parent.querySelector("ef-pan-zoom");
108
- if (panZoom$1) {
109
- const canvas = panZoom$1.querySelector("ef-canvas");
106
+ const panZoom = parent.querySelector("ef-pan-zoom");
107
+ if (panZoom) {
108
+ const canvas = panZoom.querySelector("ef-canvas");
110
109
  if (canvas) {
111
110
  this.canvasElement = canvas;
112
111
  return;
@@ -253,6 +252,6 @@ __decorate([state()], SelectionOverlay.prototype, "overlayState", void 0);
253
252
  __decorate([state()], SelectionOverlay.prototype, "lastSelectionMode", void 0);
254
253
  __decorate([property({ type: Boolean })], SelectionOverlay.prototype, "paused", void 0);
255
254
  SelectionOverlay = __decorate([customElement("ef-canvas-selection-overlay")], SelectionOverlay);
256
-
257
255
  //#endregion
256
+
258
257
  //# sourceMappingURL=SelectionOverlay.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"SelectionOverlay.js","names":["SelectionOverlay","panZoom","current: Node | null","canvasWithMetadata: CanvasWithMetadata"],"sources":["../../../src/canvas/overlays/SelectionOverlay.ts"],"sourcesContent":["import { consume } from \"@lit/context\";\nimport { css, html, LitElement } from \"lit\";\nimport { customElement, property, state } from \"lit/decorators.js\";\nimport { selectionContext, type SelectionContext } from \"../selection/selectionContext.js\";\nimport { panZoomTransformContext } from \"../../gui/panZoomTransformContext.js\";\nimport type { PanZoomTransform } from \"../../elements/EFPanZoom.js\";\nimport {\n type OverlayState,\n type CanvasWithMetadata,\n getOverlayTargets,\n calculateOverlayState,\n} from \"./overlayState.js\";\n\n/**\n * Selection overlay that renders unscaled selection indicators.\n * Uses fixed positioning to ensure 1:1 pixel ratio regardless of zoom level.\n */\n@customElement(\"ef-canvas-selection-overlay\")\nexport class SelectionOverlay extends LitElement {\n static styles = [\n css`\n :host {\n position: fixed;\n top: 0;\n left: 0;\n width: 100vw;\n height: 100vh;\n pointer-events: none;\n z-index: 1000;\n }\n .box-select {\n position: absolute;\n border: 2px dashed rgb(59, 130, 246);\n background: rgba(59, 130, 246, 0.05);\n pointer-events: none;\n }\n .highlight-box {\n position: absolute;\n border: 2px solid rgb(148, 163, 184);\n background: rgba(148, 163, 184, 0.1);\n pointer-events: none;\n box-shadow: 0 0 0 2px rgba(148, 163, 184, 0.3);\n }\n `,\n ];\n\n createRenderRoot() {\n // Return this to render directly to the element (no shadow DOM)\n // This allows the overlay to use fixed positioning relative to viewport\n // Lit will inject styles as a <style> element when createRenderRoot returns this\n return this;\n }\n\n firstUpdated(changedProperties: Map<string | number | symbol, unknown>): void {\n super.firstUpdated?.(changedProperties);\n }\n\n @consume({ context: selectionContext, subscribe: true })\n selectionFromContext?: SelectionContext;\n\n @consume({ context: panZoomTransformContext, subscribe: true })\n panZoomTransformFromContext?: PanZoomTransform;\n\n /**\n * Selection context as fallback for when overlay is outside context providers (e.g., sibling of pan-zoom).\n */\n @property({ type: Object })\n selection?: SelectionContext;\n\n /**\n * Pan/zoom transform as fallback for when overlay is outside context providers (e.g., sibling of pan-zoom).\n */\n @property({ type: Object })\n panZoomTransform?: PanZoomTransform;\n\n @state()\n private canvasElement: HTMLElement | null = null;\n\n /**\n * Canvas element property - can be set directly when overlay is outside context providers.\n */\n @property({ type: Object })\n canvas?: HTMLElement;\n\n /**\n * Complete overlay state - calculated from targets using the abstraction layer.\n * This is the SINGLE source of truth for overlay bounds.\n */\n @state()\n private overlayState: OverlayState = {\n selection: null,\n boxSelect: null,\n highlight: null,\n };\n\n @state()\n private lastSelectionMode: string | null = null;\n\n /**\n * When true, the RAF loop skips all work. Used during playback to avoid\n * layout-thrashing getBoundingClientRect/getComputedStyle calls that\n * compete with the canvas render pipeline.\n */\n @property({ type: Boolean }) paused = false;\n\n private animationFrame?: number;\n private rafLoopActive = false;\n\n connectedCallback(): void {\n super.connectedCallback();\n // Apply styles directly since :host doesn't work in light DOM\n // These styles are critical for proper positioning relative to viewport\n this.style.position = \"fixed\";\n this.style.top = \"0\";\n this.style.left = \"0\";\n this.style.width = \"100vw\";\n this.style.height = \"100vh\";\n this.style.pointerEvents = \"none\";\n this.style.zIndex = \"1000\";\n // Add a data attribute for easier debugging\n this.setAttribute(\"data-selection-overlay\", \"true\");\n // Use requestAnimationFrame to ensure DOM is ready\n requestAnimationFrame(() => {\n // Use canvas property if provided, otherwise try to find it\n if (this.canvas) {\n this.canvasElement = this.canvas;\n } else {\n this.findCanvasElement();\n }\n // Always start RAF loop if we have a canvas element (needed for highlight updates)\n if (this.canvasElement) {\n this.startRafLoop();\n }\n });\n }\n\n disconnectedCallback(): void {\n super.disconnectedCallback();\n this.stopRafLoop();\n }\n\n /**\n * React to selection context changes to ensure box selection visual updates.\n * This is called whenever Lit detects a property change, including context updates.\n * Note: We don't call requestUpdate() here to avoid the Lit warning about scheduling\n * updates after an update completes. The RAF loop handles all updates.\n */\n updated(changedProperties: Map<string | number | symbol, unknown>): void {\n super.updated?.(changedProperties);\n // Check if selection mode changed (context updates might not show in changedProperties)\n const selection = this.effectiveSelection;\n const currentMode = selection?.selectionMode ?? null;\n if (currentMode !== this.lastSelectionMode) {\n this.lastSelectionMode = currentMode;\n }\n // Ensure RAF loop is running when box selecting (in case it stopped)\n if (currentMode === \"box-selecting\" && !this.rafLoopActive) {\n this.startRafLoop();\n }\n // Ensure RAF loop is running when canvas property is set (for highlight updates)\n if (changedProperties.has(\"canvas\") && this.canvas) {\n this.canvasElement = this.canvas;\n if (!this.rafLoopActive) {\n this.startRafLoop();\n }\n }\n // Start RAF loop if we have a canvas but loop isn't running\n if (this.canvasElement && !this.rafLoopActive) {\n this.startRafLoop();\n }\n // On unpause, force an immediate overlay update to sync stale state\n if (changedProperties.has(\"paused\") && !this.paused) {\n this.updateOverlayData();\n }\n }\n\n /**\n * Find the EFCanvas element.\n * Handles both cases:\n * 1. Overlay is inside EFCanvas's shadow DOM (old case)\n * 2. Overlay is a sibling of ef-pan-zoom (new case - outside transform)\n */\n private findCanvasElement(): void {\n // First, try to find ef-canvas as a sibling or descendant of ef-pan-zoom\n // (when overlay is outside the transform)\n // Since overlay is a sibling of ef-pan-zoom, we need to search in the parent\n const parent = this.parentElement;\n if (parent) {\n // Look for ef-pan-zoom sibling\n const panZoom = parent.querySelector(\"ef-pan-zoom\") as HTMLElement | null;\n if (panZoom) {\n // Look for ef-canvas inside ef-pan-zoom\n const canvas = panZoom.querySelector(\"ef-canvas\") as HTMLElement | null;\n if (canvas) {\n this.canvasElement = canvas;\n return;\n }\n }\n }\n\n // Also try closest in case overlay is inside pan-zoom somehow\n const panZoom = this.closest(\"ef-pan-zoom\") as HTMLElement | null;\n if (panZoom) {\n const canvas = panZoom.querySelector(\"ef-canvas\") as HTMLElement | null;\n if (canvas) {\n this.canvasElement = canvas;\n return;\n }\n }\n\n // Fallback: traverse up the DOM tree (for when overlay is inside canvas shadow DOM)\n // oxlint-disable-next-line no-this-alias -- legitimate DOM traversal starting at this element\n let current: Node | null = this;\n while (current) {\n if (current instanceof ShadowRoot) {\n current = (current as ShadowRoot).host;\n } else if (current instanceof HTMLElement) {\n // Check if this is the EFCanvas element (case-insensitive check)\n if (current.tagName === \"EF-CANVAS\" || current.tagName.toLowerCase() === \"ef-canvas\") {\n this.canvasElement = current;\n return;\n }\n // Check parent element or shadow root host\n const rootNode = current.getRootNode();\n if (rootNode instanceof ShadowRoot) {\n current = rootNode.host;\n } else {\n current = current.parentElement;\n }\n } else {\n const rootNode = (current as Node).getRootNode();\n if (rootNode instanceof ShadowRoot) {\n current = rootNode.host;\n } else {\n current = (current as Node).parentElement;\n }\n }\n }\n }\n\n /**\n * Start continuous RAF loop for smooth overlay updates.\n */\n private startRafLoop(): void {\n if (this.rafLoopActive) {\n return;\n }\n this.rafLoopActive = true;\n this.rafLoop();\n }\n\n /**\n * Stop RAF loop.\n */\n private stopRafLoop(): void {\n this.rafLoopActive = false;\n if (this.animationFrame) {\n cancelAnimationFrame(this.animationFrame);\n this.animationFrame = undefined;\n }\n }\n\n /**\n * Continuous RAF loop to update overlays every frame using Lit render cycle.\n * When paused, the loop keeps running (for quick resume) but skips all\n * expensive layout queries.\n */\n private rafLoop = (): void => {\n if (!this.rafLoopActive) {\n return;\n }\n\n // Skip all work when paused to avoid layout-thrashing during playback\n if (!this.paused) {\n this.updateOverlayData();\n }\n\n // Schedule next frame\n this.animationFrame = requestAnimationFrame(this.rafLoop);\n };\n\n /**\n * Get the effective selection context (from context or property).\n */\n private get effectiveSelection(): SelectionContext | undefined {\n return this.selectionFromContext ?? this.selection;\n }\n\n /**\n * Get the effective pan-zoom transform (from context or property).\n */\n private get effectivePanZoomTransform(): PanZoomTransform | undefined {\n return this.panZoomTransformFromContext ?? this.panZoomTransform;\n }\n\n /**\n * Update overlay data state using the abstraction layer.\n *\n * This method now uses the clean separation of:\n * - SEMANTICS: getOverlayTargets() determines WHAT should be shown\n * - MECHANISM: calculateOverlayState() determines HOW to show it\n */\n private updateOverlayData(): void {\n // Ensure canvas element reference is up-to-date\n if (this.canvas && this.canvas !== this.canvasElement) {\n this.canvasElement = this.canvas;\n }\n\n // Get canvas element - required for all overlay calculations\n const effectiveCanvas = this.canvasElement || this.canvas;\n if (!effectiveCanvas) {\n this.overlayState = { selection: null, boxSelect: null, highlight: null };\n return;\n }\n\n // Get canvas rect (try .canvas-content first for accurate positioning)\n let canvasRect = effectiveCanvas.getBoundingClientRect();\n if (effectiveCanvas.shadowRoot) {\n const canvasContent = effectiveCanvas.shadowRoot.querySelector(\n \".canvas-content\",\n ) as HTMLElement;\n if (canvasContent) {\n canvasRect = canvasContent.getBoundingClientRect();\n }\n }\n\n // Get pan-zoom element for box-select coordinate conversion\n const panZoomElement = effectiveCanvas.closest(\"ef-pan-zoom\") as HTMLElement | null;\n\n // Get highlighted element from canvas\n const canvas = effectiveCanvas as any;\n const highlightedElement = canvas?.highlightedElement as HTMLElement | null;\n\n // SEMANTICS: What should be shown?\n const targets = getOverlayTargets(this.effectiveSelection, highlightedElement);\n\n // Adapt canvas to CanvasWithMetadata interface\n const canvasWithMetadata: CanvasWithMetadata = {\n getElementData: (id: string) => canvas?.getElementData?.(id),\n getElement: (id: string) => canvas?.elementRegistry?.get(id),\n querySelector: (selector: string) => effectiveCanvas.querySelector(selector),\n shadowRoot: effectiveCanvas.shadowRoot,\n };\n\n // Read current transform directly from panzoom element (not stale property/context)\n // This ensures we always have the current scale/pan values\n const currentTransform = this.readCurrentTransform(panZoomElement);\n\n // MECHANISM: Calculate screen bounds\n this.overlayState = calculateOverlayState(\n targets,\n canvasWithMetadata,\n canvasRect,\n panZoomElement,\n currentTransform,\n );\n }\n\n /**\n * Read current transform directly from panzoom element.\n * This ensures we always have fresh values instead of stale property/context.\n */\n private readCurrentTransform(panZoomElement: HTMLElement | null): PanZoomTransform | undefined {\n // Try reading from panzoom element directly (most accurate)\n if (panZoomElement) {\n const pz = panZoomElement as any;\n if (typeof pz.x === \"number\" && typeof pz.y === \"number\" && typeof pz.scale === \"number\") {\n return { x: pz.x, y: pz.y, scale: pz.scale };\n }\n }\n\n // Fall back to context/property\n return this.effectivePanZoomTransform;\n }\n\n render() {\n // We only need canvasElement to render overlays\n const effectiveCanvas = this.canvasElement || this.canvas;\n if (!effectiveCanvas) {\n return html``;\n }\n\n // NOTE: Selection visualization is handled by EFTransformHandles (with rotation support).\n // This overlay only renders:\n // - box-select: marquee during drag-to-select\n // - highlight-box: hover indication for non-selected elements\n const { boxSelect, highlight } = this.overlayState;\n\n return html`\n ${\n boxSelect\n ? html`\n <div\n class=\"box-select\"\n style=\"left: ${boxSelect.x}px; top: ${boxSelect.y}px; width: ${boxSelect.width}px; height: ${boxSelect.height}px; position: absolute; border: 2px dashed rgb(59, 130, 246); background: rgba(59, 130, 246, 0.05); pointer-events: none;\"\n ></div>\n `\n : html``\n }\n ${\n highlight\n ? html`\n <div\n class=\"highlight-box\"\n style=\"left: ${highlight.x}px; top: ${highlight.y}px; width: ${highlight.width}px; height: ${highlight.height}px; position: absolute; border: 2px solid rgb(148, 163, 184); background: rgba(148, 163, 184, 0.1); pointer-events: none; box-shadow: 0 0 0 2px rgba(148, 163, 184, 0.3);\"\n ></div>\n `\n : html``\n }\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"ef-canvas-selection-overlay\": SelectionOverlay;\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"SelectionOverlay.js","names":[],"sources":["../../../src/canvas/overlays/SelectionOverlay.ts"],"mappings":";;;;;;;;AAkBO,IAAA,mBAAA,MAAM,yBAAyB,WAAW;;;uBA0DH;sBAaP;GACnC,WAAW;GACX,WAAW;GACX,WAAW;GACZ;2BAG0C;gBAOL;uBAGd;uBAiKM;AAC5B,OAAI,CAAC,KAAK,cACR;AAIF,OAAI,CAAC,KAAK,OACR,MAAK,mBAAmB;AAI1B,QAAK,iBAAiB,sBAAsB,KAAK,QAAQ;;;;gBAnQ3C,CACd,GAAG;;;;;;;;;;;;;;;;;;;;;;;MAwBJ;;CAED,mBAAmB;AAIjB,SAAO;;CAGT,aAAa,mBAAiE;AAC5E,QAAM,eAAe,kBAAkB;;CAsDzC,oBAA0B;AACxB,QAAM,mBAAmB;AAGzB,OAAK,MAAM,WAAW;AACtB,OAAK,MAAM,MAAM;AACjB,OAAK,MAAM,OAAO;AAClB,OAAK,MAAM,QAAQ;AACnB,OAAK,MAAM,SAAS;AACpB,OAAK,MAAM,gBAAgB;AAC3B,OAAK,MAAM,SAAS;AAEpB,OAAK,aAAa,0BAA0B,OAAO;AAEnD,8BAA4B;AAE1B,OAAI,KAAK,OACP,MAAK,gBAAgB,KAAK;OAE1B,MAAK,mBAAmB;AAG1B,OAAI,KAAK,cACP,MAAK,cAAc;IAErB;;CAGJ,uBAA6B;AAC3B,QAAM,sBAAsB;AAC5B,OAAK,aAAa;;;;;;;;CASpB,QAAQ,mBAAiE;AACvE,QAAM,UAAU,kBAAkB;EAGlC,MAAM,cADY,KAAK,oBACQ,iBAAiB;AAChD,MAAI,gBAAgB,KAAK,kBACvB,MAAK,oBAAoB;AAG3B,MAAI,gBAAgB,mBAAmB,CAAC,KAAK,cAC3C,MAAK,cAAc;AAGrB,MAAI,kBAAkB,IAAI,SAAS,IAAI,KAAK,QAAQ;AAClD,QAAK,gBAAgB,KAAK;AAC1B,OAAI,CAAC,KAAK,cACR,MAAK,cAAc;;AAIvB,MAAI,KAAK,iBAAiB,CAAC,KAAK,cAC9B,MAAK,cAAc;AAGrB,MAAI,kBAAkB,IAAI,SAAS,IAAI,CAAC,KAAK,OAC3C,MAAK,mBAAmB;;;;;;;;CAU5B,oBAAkC;EAIhC,MAAM,SAAS,KAAK;AACpB,MAAI,QAAQ;GAEV,MAAM,UAAU,OAAO,cAAc,cAAc;AACnD,OAAI,SAAS;IAEX,MAAM,SAAS,QAAQ,cAAc,YAAY;AACjD,QAAI,QAAQ;AACV,UAAK,gBAAgB;AACrB;;;;EAMN,MAAM,UAAU,KAAK,QAAQ,cAAc;AAC3C,MAAI,SAAS;GACX,MAAM,SAAS,QAAQ,cAAc,YAAY;AACjD,OAAI,QAAQ;AACV,SAAK,gBAAgB;AACrB;;;EAMJ,IAAI,UAAuB;AAC3B,SAAO,QACL,KAAI,mBAAmB,WACrB,WAAW,QAAuB;WACzB,mBAAmB,aAAa;AAEzC,OAAI,QAAQ,YAAY,eAAe,QAAQ,QAAQ,aAAa,KAAK,aAAa;AACpF,SAAK,gBAAgB;AACrB;;GAGF,MAAM,WAAW,QAAQ,aAAa;AACtC,OAAI,oBAAoB,WACtB,WAAU,SAAS;OAEnB,WAAU,QAAQ;SAEf;GACL,MAAM,WAAY,QAAiB,aAAa;AAChD,OAAI,oBAAoB,WACtB,WAAU,SAAS;OAEnB,WAAW,QAAiB;;;;;;CASpC,eAA6B;AAC3B,MAAI,KAAK,cACP;AAEF,OAAK,gBAAgB;AACrB,OAAK,SAAS;;;;;CAMhB,cAA4B;AAC1B,OAAK,gBAAgB;AACrB,MAAI,KAAK,gBAAgB;AACvB,wBAAqB,KAAK,eAAe;AACzC,QAAK,iBAAiB,KAAA;;;;;;CA0B1B,IAAY,qBAAmD;AAC7D,SAAO,KAAK,wBAAwB,KAAK;;;;;CAM3C,IAAY,4BAA0D;AACpE,SAAO,KAAK,+BAA+B,KAAK;;;;;;;;;CAUlD,oBAAkC;AAEhC,MAAI,KAAK,UAAU,KAAK,WAAW,KAAK,cACtC,MAAK,gBAAgB,KAAK;EAI5B,MAAM,kBAAkB,KAAK,iBAAiB,KAAK;AACnD,MAAI,CAAC,iBAAiB;AACpB,QAAK,eAAe;IAAE,WAAW;IAAM,WAAW;IAAM,WAAW;IAAM;AACzE;;EAIF,IAAI,aAAa,gBAAgB,uBAAuB;AACxD,MAAI,gBAAgB,YAAY;GAC9B,MAAM,gBAAgB,gBAAgB,WAAW,cAC/C,kBACD;AACD,OAAI,cACF,cAAa,cAAc,uBAAuB;;EAKtD,MAAM,iBAAiB,gBAAgB,QAAQ,cAAc;EAG7D,MAAM,SAAS;EACf,MAAM,qBAAqB,QAAQ;EAGnC,MAAM,UAAU,kBAAkB,KAAK,oBAAoB,mBAAmB;EAG9E,MAAM,qBAAyC;GAC7C,iBAAiB,OAAe,QAAQ,iBAAiB,GAAG;GAC5D,aAAa,OAAe,QAAQ,iBAAiB,IAAI,GAAG;GAC5D,gBAAgB,aAAqB,gBAAgB,cAAc,SAAS;GAC5E,YAAY,gBAAgB;GAC7B;EAID,MAAM,mBAAmB,KAAK,qBAAqB,eAAe;AAGlE,OAAK,eAAe,sBAClB,SACA,oBACA,YACA,gBACA,iBACD;;;;;;CAOH,qBAA6B,gBAAkE;AAE7F,MAAI,gBAAgB;GAClB,MAAM,KAAK;AACX,OAAI,OAAO,GAAG,MAAM,YAAY,OAAO,GAAG,MAAM,YAAY,OAAO,GAAG,UAAU,SAC9E,QAAO;IAAE,GAAG,GAAG;IAAG,GAAG,GAAG;IAAG,OAAO,GAAG;IAAO;;AAKhD,SAAO,KAAK;;CAGd,SAAS;AAGP,MAAI,EADoB,KAAK,iBAAiB,KAAK,QAEjD,QAAO,IAAI;EAOb,MAAM,EAAE,WAAW,cAAc,KAAK;AAEtC,SAAO,IAAI;QAEP,YACI,IAAI;;;6BAGa,UAAU,EAAE,WAAW,UAAU,EAAE,aAAa,UAAU,MAAM,cAAc,UAAU,OAAO;;cAGhH,IAAI,GACT;QAEC,YACI,IAAI;;;6BAGa,UAAU,EAAE,WAAW,UAAU,EAAE,aAAa,UAAU,MAAM,cAAc,UAAU,OAAO;;cAGhH,IAAI,GACT;;;;YA/VJ,QAAQ;CAAE,SAAS;CAAkB,WAAW;CAAM,CAAC,CAAA,EAAA,iBAAA,WAAA,wBAAA,KAAA,EAAA;YAGvD,QAAQ;CAAE,SAAS;CAAyB,WAAW;CAAM,CAAC,CAAA,EAAA,iBAAA,WAAA,+BAAA,KAAA,EAAA;YAM9D,SAAS,EAAE,MAAM,QAAQ,CAAC,CAAA,EAAA,iBAAA,WAAA,aAAA,KAAA,EAAA;YAM1B,SAAS,EAAE,MAAM,QAAQ,CAAC,CAAA,EAAA,iBAAA,WAAA,oBAAA,KAAA,EAAA;YAG1B,OAAO,CAAA,EAAA,iBAAA,WAAA,iBAAA,KAAA,EAAA;YAMP,SAAS,EAAE,MAAM,QAAQ,CAAC,CAAA,EAAA,iBAAA,WAAA,UAAA,KAAA,EAAA;YAO1B,OAAO,CAAA,EAAA,iBAAA,WAAA,gBAAA,KAAA,EAAA;YAOP,OAAO,CAAA,EAAA,iBAAA,WAAA,qBAAA,KAAA,EAAA;YAQP,SAAS,EAAE,MAAM,SAAS,CAAC,CAAA,EAAA,iBAAA,WAAA,UAAA,KAAA,EAAA;+BAtF7B,cAAc,8BAA8B,CAAA,EAAA,iBAAA"}
@@ -1,5 +1,4 @@
1
1
  import { getElementBounds } from "../getElementBounds.js";
2
-
3
2
  //#region src/canvas/overlays/overlayState.ts
4
3
  /**
5
4
  * Extract overlay targets from selection context and highlighted element.
@@ -147,7 +146,7 @@ function calculateOverlayState(targets, canvas, canvasRect, panZoomElement, panZ
147
146
  highlight: calculateHighlightBounds(targets.highlightedElementId, canvas, canvasRect, scale)
148
147
  };
149
148
  }
150
-
151
149
  //#endregion
152
150
  export { calculateOverlayState, getOverlayTargets };
151
+
153
152
  //# sourceMappingURL=overlayState.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"overlayState.js","names":[],"sources":["../../../src/canvas/overlays/overlayState.ts"],"sourcesContent":["/**\n * Overlay State Management\n *\n * This module provides a clean separation between:\n * - SEMANTICS: What should be shown? (OverlayTargets)\n * - MECHANISM: How to calculate screen bounds (calculateOverlayState)\n *\n * INVARIANTS:\n * 1. Overlay is visible iff bounds are non-null with positive dimensions\n * 2. All bounds are in screen coordinates (relative to viewport origin)\n * 3. Only one element can be highlighted at a time\n *\n * COORDINATE SPACES:\n * - Canvas space: Logical coordinates, unaffected by zoom (used for element positioning)\n * - Screen space: Viewport coordinates (used for overlay positioning)\n */\n\nimport type { PanZoomTransform } from \"../../elements/EFPanZoom.js\";\nimport type { SelectionContext } from \"../selection/selectionContext.js\";\nimport { getElementBounds } from \"../getElementBounds.js\";\n\n// ============================================================================\n// TYPES: Core Concepts\n// ============================================================================\n\n/**\n * Screen-space bounding box for overlay positioning.\n * All values are in viewport coordinates (pixels from viewport origin).\n */\nexport interface ScreenBounds {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\n/**\n * Canvas-space bounding box (from selection context).\n */\nexport interface CanvasBounds {\n left: number;\n top: number;\n right: number;\n bottom: number;\n}\n\n/**\n * The complete state of all overlays.\n * Each property is either a ScreenBounds or null.\n * An overlay is visible iff its bounds are non-null.\n */\nexport interface OverlayState {\n selection: ScreenBounds | null;\n boxSelect: ScreenBounds | null;\n highlight: ScreenBounds | null;\n}\n\n/**\n * SEMANTICS: What elements should have overlays?\n * This represents the \"what\" without the \"how\".\n */\nexport interface OverlayTargets {\n selectedIds: Set<string>;\n boxSelectBounds: CanvasBounds | null;\n highlightedElementId: string | null;\n}\n\n/**\n * Interface for canvas element data (metadata).\n */\nexport interface ElementMetadata {\n id: string;\n x: number;\n y: number;\n width: number;\n height: number;\n rotation?: number;\n}\n\n/**\n * Interface for canvas that provides element data.\n */\nexport interface CanvasWithMetadata {\n getElementData(elementId: string): ElementMetadata | undefined;\n getElement?(elementId: string): HTMLElement | undefined;\n querySelector(selector: string): HTMLElement | null;\n shadowRoot: ShadowRoot | null;\n}\n\n// ============================================================================\n// SEMANTICS: Extract what should be shown\n// ============================================================================\n\n/**\n * Extract overlay targets from selection context and highlighted element.\n * This is pure SEMANTICS - it determines WHAT should be shown.\n */\nexport function getOverlayTargets(\n selection: SelectionContext | undefined,\n highlightedElement: HTMLElement | null,\n): OverlayTargets {\n return {\n selectedIds: selection?.selectedIds ? new Set(selection.selectedIds) : new Set(),\n boxSelectBounds: selection?.boxSelectBounds ?? null,\n highlightedElementId:\n highlightedElement?.getAttribute(\"data-element-id\") ?? highlightedElement?.id ?? null,\n };\n}\n\n// ============================================================================\n// MECHANISM: Calculate screen bounds\n// ============================================================================\n\n/**\n * Calculate screen bounds for a single element.\n * This is the SINGLE SOURCE OF TRUTH for element → screen bounds conversion.\n *\n * Strategy:\n * 1. Try to use metadata (already in canvas coordinates)\n * 2. Fall back to DOM measurement if metadata unavailable\n *\n * @param elementId - The element's ID (data-element-id or id attribute)\n * @param canvas - Canvas element with getElementData method\n * @param canvasRect - Canvas content element's bounding rect\n * @param scale - Current zoom scale\n * @returns Screen bounds or null if element not found\n */\nexport function calculateElementScreenBounds(\n elementId: string,\n canvas: CanvasWithMetadata,\n canvasRect: DOMRect,\n scale: number,\n): ScreenBounds | null {\n const metadata = canvas.getElementData(elementId);\n\n if (metadata && metadata.width > 0 && metadata.height > 0) {\n // Use metadata (already in canvas coordinates)\n return {\n x: canvasRect.left + metadata.x * scale,\n y: canvasRect.top + metadata.y * scale,\n width: metadata.width * scale,\n height: metadata.height * scale,\n };\n }\n\n // Fallback: find element and use DOM measurement\n const element = findElement(elementId, canvas);\n if (!element) return null;\n\n const bounds = getElementBounds(element);\n return {\n x: bounds.left,\n y: bounds.top,\n width: bounds.width,\n height: bounds.height,\n };\n}\n\n/**\n * Find an element by ID in the canvas (checks both light DOM and shadow DOM).\n */\nfunction findElement(elementId: string, canvas: CanvasWithMetadata): HTMLElement | null {\n // Try canvas's getElement method first\n if (canvas.getElement) {\n const element = canvas.getElement(elementId);\n if (element) return element;\n }\n\n // Try shadow DOM\n if (canvas.shadowRoot) {\n const element = canvas.shadowRoot.querySelector(\n `[data-element-id=\"${elementId}\"]`,\n ) as HTMLElement | null;\n if (element) return element;\n }\n\n // Try light DOM\n return canvas.querySelector(`[data-element-id=\"${elementId}\"]`) as HTMLElement | null;\n}\n\n/**\n * Calculate the union of multiple bounds (bounding box that contains all).\n */\nexport function unionBounds(bounds: ScreenBounds[]): ScreenBounds | null {\n if (bounds.length === 0) return null;\n\n let minX = Infinity;\n let minY = Infinity;\n let maxX = -Infinity;\n let maxY = -Infinity;\n\n for (const b of bounds) {\n minX = Math.min(minX, b.x);\n minY = Math.min(minY, b.y);\n maxX = Math.max(maxX, b.x + b.width);\n maxY = Math.max(maxY, b.y + b.height);\n }\n\n return {\n x: minX,\n y: minY,\n width: maxX - minX,\n height: maxY - minY,\n };\n}\n\n/**\n * Calculate selection bounds for all selected elements.\n */\nexport function calculateSelectionBounds(\n selectedIds: Set<string>,\n canvas: CanvasWithMetadata,\n canvasRect: DOMRect,\n scale: number,\n): ScreenBounds | null {\n if (selectedIds.size === 0) return null;\n\n const elementBounds = Array.from(selectedIds)\n .map((id) => calculateElementScreenBounds(id, canvas, canvasRect, scale))\n .filter((b): b is ScreenBounds => b !== null);\n\n return unionBounds(elementBounds);\n}\n\n/**\n * Calculate box-select bounds (convert canvas bounds to screen bounds).\n *\n * @param boxSelectBounds - Box selection bounds in canvas coordinates\n * @param panZoomElement - The pan-zoom element (for canvasToScreen conversion)\n * @param panZoomTransform - Current pan-zoom transform\n * @returns Screen bounds or null\n */\nexport function calculateBoxSelectBounds(\n boxSelectBounds: CanvasBounds | null,\n panZoomElement: HTMLElement | null,\n panZoomTransform: PanZoomTransform | undefined,\n): ScreenBounds | null {\n if (!boxSelectBounds || !panZoomElement || !panZoomTransform) {\n return null;\n }\n\n // Try to use EFPanZoom's canvasToScreen method if available\n const pz = panZoomElement as any;\n if (typeof pz.canvasToScreen === \"function\") {\n const topLeft = pz.canvasToScreen(boxSelectBounds.left, boxSelectBounds.top);\n const bottomRight = pz.canvasToScreen(boxSelectBounds.right, boxSelectBounds.bottom);\n\n return {\n x: topLeft.x,\n y: topLeft.y,\n width: bottomRight.x - topLeft.x,\n height: bottomRight.y - topLeft.y,\n };\n }\n\n // Fallback: manual calculation\n const panZoomRect = panZoomElement.getBoundingClientRect();\n const { scale, x, y } = panZoomTransform;\n\n const screenLeft = panZoomRect.left + boxSelectBounds.left * scale + x;\n const screenTop = panZoomRect.top + boxSelectBounds.top * scale + y;\n const screenRight = panZoomRect.left + boxSelectBounds.right * scale + x;\n const screenBottom = panZoomRect.top + boxSelectBounds.bottom * scale + y;\n\n return {\n x: screenLeft,\n y: screenTop,\n width: screenRight - screenLeft,\n height: screenBottom - screenTop,\n };\n}\n\n/**\n * Calculate highlight bounds for the highlighted element.\n */\nexport function calculateHighlightBounds(\n highlightedElementId: string | null,\n canvas: CanvasWithMetadata,\n canvasRect: DOMRect,\n scale: number,\n): ScreenBounds | null {\n if (!highlightedElementId) return null;\n\n return calculateElementScreenBounds(highlightedElementId, canvas, canvasRect, scale);\n}\n\n// ============================================================================\n// MAIN: Calculate complete overlay state\n// ============================================================================\n\n/**\n * Calculate the complete overlay state from targets.\n * This is the main entry point that combines semantics and mechanism.\n *\n * @param targets - What should be shown (from getOverlayTargets)\n * @param canvas - Canvas element with metadata\n * @param canvasRect - Canvas content bounding rect\n * @param panZoomElement - Pan-zoom element (for box-select conversion)\n * @param panZoomTransform - Current transform\n * @returns Complete overlay state\n */\nexport function calculateOverlayState(\n targets: OverlayTargets,\n canvas: CanvasWithMetadata,\n canvasRect: DOMRect,\n panZoomElement: HTMLElement | null,\n panZoomTransform: PanZoomTransform | undefined,\n): OverlayState {\n const scale = panZoomTransform?.scale ?? 1;\n\n return {\n selection: calculateSelectionBounds(targets.selectedIds, canvas, canvasRect, scale),\n boxSelect: calculateBoxSelectBounds(targets.boxSelectBounds, panZoomElement, panZoomTransform),\n highlight: calculateHighlightBounds(targets.highlightedElementId, canvas, canvasRect, scale),\n };\n}\n\n// ============================================================================\n// INVARIANTS: Helper functions to check invariants\n// ============================================================================\n\n/**\n * INVARIANT: Overlay is visible iff bounds exist with positive dimensions.\n */\nexport function isOverlayVisible(bounds: ScreenBounds | null): boolean {\n return bounds !== null && bounds.width > 0 && bounds.height > 0;\n}\n\n/**\n * Check if overlay state has any visible overlays.\n */\nexport function hasVisibleOverlays(state: OverlayState): boolean {\n return (\n isOverlayVisible(state.selection) ||\n isOverlayVisible(state.boxSelect) ||\n isOverlayVisible(state.highlight)\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"overlayState.js","names":[],"sources":["../../../src/canvas/overlays/overlayState.ts"],"mappings":"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"}
@@ -1,5 +1,4 @@
1
1
  import { SelectionModel } from "./SelectionModel.js";
2
-
3
2
  //#region src/canvas/selection/SelectionController.ts
4
3
  /**
5
4
  * Reactive controller that bridges SelectionModel and Lit element lifecycle.
@@ -97,7 +96,7 @@ var SelectionController = class {
97
96
  } });
98
97
  }
99
98
  };
100
-
101
99
  //#endregion
102
100
  export { SelectionController };
101
+
103
102
  //# sourceMappingURL=SelectionController.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"SelectionController.js","names":[],"sources":["../../../src/canvas/selection/SelectionController.ts"],"sourcesContent":["import type { ReactiveController, ReactiveControllerHost } from \"lit\";\nimport { SelectionModel } from \"./SelectionModel.js\";\nimport type { SelectionContext } from \"./selectionContext.js\";\n\n/**\n * Reactive controller that bridges SelectionModel and Lit element lifecycle.\n * Provides selection context to child elements.\n */\nexport class SelectionController implements ReactiveController {\n private host: ReactiveControllerHost;\n private selectionModel: SelectionModel;\n private hitTestFn: ((bounds: DOMRect) => string[]) | null = null;\n selectionContext: SelectionContext;\n\n constructor(host: ReactiveControllerHost) {\n this.host = host;\n this.selectionModel = new SelectionModel();\n this.selectionContext = this.createContextProxy();\n host.addController(this);\n\n // Listen to selection change events from the model\n // Use queueMicrotask to defer the update and avoid Lit warning about\n // scheduling updates after update completed (change-in-update)\n this.selectionModel.addEventListener(\"selectionchange\", () => {\n queueMicrotask(() => this.host.requestUpdate());\n });\n }\n\n hostConnected(): void {\n // Context is provided via @provide decorator\n }\n\n hostDisconnected(): void {\n // Cleanup if needed\n }\n\n /**\n * Set the hit test function for box selection.\n */\n setHitTest(fn: (bounds: DOMRect) => string[]): void {\n this.hitTestFn = fn;\n }\n\n /**\n * Get the underlying selection model.\n */\n getModel(): SelectionModel {\n return this.selectionModel;\n }\n\n /**\n * Create a proxy context that delegates to the selection model.\n */\n private createContextProxy(): SelectionContext {\n const selectionModel = this.selectionModel;\n const getHost = () => this.host;\n const getHitTestFn = () => this.hitTestFn;\n return new Proxy(\n {\n select: (id: string) => {\n selectionModel.select(id);\n // Event will trigger requestUpdate via event listener\n },\n selectMultiple: (ids: string[]) => {\n selectionModel.selectMultiple(ids);\n // Event will trigger requestUpdate via event listener\n },\n addToSelection: (id: string) => {\n selectionModel.addToSelection(id);\n // Event will trigger requestUpdate via event listener\n },\n deselect: (id: string) => {\n selectionModel.deselect(id);\n // Event will trigger requestUpdate via event listener\n },\n toggle: (id: string) => {\n selectionModel.toggle(id);\n // Event will trigger requestUpdate via event listener\n },\n clear: () => {\n selectionModel.clear();\n // Event will trigger requestUpdate via event listener\n },\n startBoxSelect: (x: number, y: number) => {\n selectionModel.startBoxSelect(x, y);\n queueMicrotask(() => getHost().requestUpdate());\n },\n updateBoxSelect: (x: number, y: number) => {\n selectionModel.updateBoxSelect(x, y);\n queueMicrotask(() => getHost().requestUpdate());\n },\n endBoxSelect: (hitTest: (bounds: DOMRect) => string[], addToSelection?: boolean) => {\n const fn = hitTest || getHitTestFn();\n if (fn) {\n selectionModel.endBoxSelect(fn, addToSelection ?? false);\n }\n // Event will trigger requestUpdate via event listener\n },\n createGroup: (ids: string[]) => {\n const groupId = selectionModel.createGroup(ids);\n return groupId;\n },\n ungroup: (groupId: string) => {\n selectionModel.ungroup(groupId);\n },\n selectGroup: (groupId: string) => {\n selectionModel.selectGroup(groupId);\n // Event will trigger requestUpdate via event listener\n },\n getGroupId: (elementId: string) => {\n return selectionModel.getGroupId(elementId);\n },\n getGroupElements: (groupId: string) => {\n return selectionModel.getGroupElements(groupId);\n },\n addEventListener: (type: \"selectionchange\", listener: (event: CustomEvent) => void) => {\n selectionModel.addEventListener(type, listener as EventListener);\n },\n removeEventListener: (type: \"selectionchange\", listener: (event: CustomEvent) => void) => {\n selectionModel.removeEventListener(type, listener as EventListener);\n },\n } as Omit<SelectionContext, \"selectedIds\" | \"selectionMode\" | \"boxSelectBounds\">,\n {\n get(target, prop) {\n if (prop === \"selectedIds\") {\n return selectionModel.selectedIds;\n }\n if (prop === \"selectionMode\") {\n return selectionModel.selectionMode;\n }\n if (prop === \"boxSelectBounds\") {\n return selectionModel.boxSelectBounds;\n }\n return (target as any)[prop];\n },\n },\n ) as SelectionContext;\n }\n}\n"],"mappings":";;;;;;;AAQA,IAAa,sBAAb,MAA+D;CAM7D,YAAY,MAA8B;mBAHkB;AAI1D,OAAK,OAAO;AACZ,OAAK,iBAAiB,IAAI,gBAAgB;AAC1C,OAAK,mBAAmB,KAAK,oBAAoB;AACjD,OAAK,cAAc,KAAK;AAKxB,OAAK,eAAe,iBAAiB,yBAAyB;AAC5D,wBAAqB,KAAK,KAAK,eAAe,CAAC;IAC/C;;CAGJ,gBAAsB;CAItB,mBAAyB;;;;CAOzB,WAAW,IAAyC;AAClD,OAAK,YAAY;;;;;CAMnB,WAA2B;AACzB,SAAO,KAAK;;;;;CAMd,AAAQ,qBAAuC;EAC7C,MAAM,iBAAiB,KAAK;EAC5B,MAAM,gBAAgB,KAAK;EAC3B,MAAM,qBAAqB,KAAK;AAChC,SAAO,IAAI,MACT;GACE,SAAS,OAAe;AACtB,mBAAe,OAAO,GAAG;;GAG3B,iBAAiB,QAAkB;AACjC,mBAAe,eAAe,IAAI;;GAGpC,iBAAiB,OAAe;AAC9B,mBAAe,eAAe,GAAG;;GAGnC,WAAW,OAAe;AACxB,mBAAe,SAAS,GAAG;;GAG7B,SAAS,OAAe;AACtB,mBAAe,OAAO,GAAG;;GAG3B,aAAa;AACX,mBAAe,OAAO;;GAGxB,iBAAiB,GAAW,MAAc;AACxC,mBAAe,eAAe,GAAG,EAAE;AACnC,yBAAqB,SAAS,CAAC,eAAe,CAAC;;GAEjD,kBAAkB,GAAW,MAAc;AACzC,mBAAe,gBAAgB,GAAG,EAAE;AACpC,yBAAqB,SAAS,CAAC,eAAe,CAAC;;GAEjD,eAAe,SAAwC,mBAA6B;IAClF,MAAM,KAAK,WAAW,cAAc;AACpC,QAAI,GACF,gBAAe,aAAa,IAAI,kBAAkB,MAAM;;GAI5D,cAAc,QAAkB;AAE9B,WADgB,eAAe,YAAY,IAAI;;GAGjD,UAAU,YAAoB;AAC5B,mBAAe,QAAQ,QAAQ;;GAEjC,cAAc,YAAoB;AAChC,mBAAe,YAAY,QAAQ;;GAGrC,aAAa,cAAsB;AACjC,WAAO,eAAe,WAAW,UAAU;;GAE7C,mBAAmB,YAAoB;AACrC,WAAO,eAAe,iBAAiB,QAAQ;;GAEjD,mBAAmB,MAAyB,aAA2C;AACrF,mBAAe,iBAAiB,MAAM,SAA0B;;GAElE,sBAAsB,MAAyB,aAA2C;AACxF,mBAAe,oBAAoB,MAAM,SAA0B;;GAEtE,EACD,EACE,IAAI,QAAQ,MAAM;AAChB,OAAI,SAAS,cACX,QAAO,eAAe;AAExB,OAAI,SAAS,gBACX,QAAO,eAAe;AAExB,OAAI,SAAS,kBACX,QAAO,eAAe;AAExB,UAAQ,OAAe;KAE1B,CACF"}
1
+ {"version":3,"file":"SelectionController.js","names":[],"sources":["../../../src/canvas/selection/SelectionController.ts"],"mappings":";;;;;;AAQA,IAAa,sBAAb,MAA+D;CAM7D,YAAY,MAA8B;mBAHkB;AAI1D,OAAK,OAAO;AACZ,OAAK,iBAAiB,IAAI,gBAAgB;AAC1C,OAAK,mBAAmB,KAAK,oBAAoB;AACjD,OAAK,cAAc,KAAK;AAKxB,OAAK,eAAe,iBAAiB,yBAAyB;AAC5D,wBAAqB,KAAK,KAAK,eAAe,CAAC;IAC/C;;CAGJ,gBAAsB;CAItB,mBAAyB;;;;CAOzB,WAAW,IAAyC;AAClD,OAAK,YAAY;;;;;CAMnB,WAA2B;AACzB,SAAO,KAAK;;;;;CAMd,qBAA+C;EAC7C,MAAM,iBAAiB,KAAK;EAC5B,MAAM,gBAAgB,KAAK;EAC3B,MAAM,qBAAqB,KAAK;AAChC,SAAO,IAAI,MACT;GACE,SAAS,OAAe;AACtB,mBAAe,OAAO,GAAG;;GAG3B,iBAAiB,QAAkB;AACjC,mBAAe,eAAe,IAAI;;GAGpC,iBAAiB,OAAe;AAC9B,mBAAe,eAAe,GAAG;;GAGnC,WAAW,OAAe;AACxB,mBAAe,SAAS,GAAG;;GAG7B,SAAS,OAAe;AACtB,mBAAe,OAAO,GAAG;;GAG3B,aAAa;AACX,mBAAe,OAAO;;GAGxB,iBAAiB,GAAW,MAAc;AACxC,mBAAe,eAAe,GAAG,EAAE;AACnC,yBAAqB,SAAS,CAAC,eAAe,CAAC;;GAEjD,kBAAkB,GAAW,MAAc;AACzC,mBAAe,gBAAgB,GAAG,EAAE;AACpC,yBAAqB,SAAS,CAAC,eAAe,CAAC;;GAEjD,eAAe,SAAwC,mBAA6B;IAClF,MAAM,KAAK,WAAW,cAAc;AACpC,QAAI,GACF,gBAAe,aAAa,IAAI,kBAAkB,MAAM;;GAI5D,cAAc,QAAkB;AAE9B,WADgB,eAAe,YAAY,IAAI;;GAGjD,UAAU,YAAoB;AAC5B,mBAAe,QAAQ,QAAQ;;GAEjC,cAAc,YAAoB;AAChC,mBAAe,YAAY,QAAQ;;GAGrC,aAAa,cAAsB;AACjC,WAAO,eAAe,WAAW,UAAU;;GAE7C,mBAAmB,YAAoB;AACrC,WAAO,eAAe,iBAAiB,QAAQ;;GAEjD,mBAAmB,MAAyB,aAA2C;AACrF,mBAAe,iBAAiB,MAAM,SAA0B;;GAElE,sBAAsB,MAAyB,aAA2C;AACxF,mBAAe,oBAAoB,MAAM,SAA0B;;GAEtE,EACD,EACE,IAAI,QAAQ,MAAM;AAChB,OAAI,SAAS,cACX,QAAO,eAAe;AAExB,OAAI,SAAS,gBACX,QAAO,eAAe;AAExB,OAAI,SAAS,kBACX,QAAO,eAAe;AAExB,UAAQ,OAAe;KAE1B,CACF"}
@@ -1,7 +1,6 @@
1
1
  import { SelectionState } from "../api/types.js";
2
2
 
3
3
  //#region src/canvas/selection/SelectionModel.d.ts
4
-
5
4
  /**
6
5
  * Pure selection logic - semantics separate from mechanism.
7
6
  * Manages selection state and operations.
@@ -223,7 +223,7 @@ var SelectionModel = class extends EventTarget {
223
223
  else this._selectionMode = "multiple";
224
224
  }
225
225
  };
226
-
227
226
  //#endregion
228
227
  export { SelectionModel };
228
+
229
229
  //# sourceMappingURL=SelectionModel.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"SelectionModel.js","names":[],"sources":["../../../src/canvas/selection/SelectionModel.ts"],"sourcesContent":["import type { SelectionState } from \"../api/types.js\";\n\n/**\n * Create a DOMRect-like object. Polyfill for Node.js environments.\n */\nfunction createRect(x: number, y: number, width: number, height: number): DOMRect {\n if (typeof DOMRect !== \"undefined\") {\n return new DOMRect(x, y, width, height);\n }\n // Polyfill for Node.js\n return {\n x,\n y,\n width,\n height,\n left: x,\n top: y,\n right: x + width,\n bottom: y + height,\n toJSON: () => ({ x, y, width, height }),\n } as DOMRect;\n}\n\n/**\n * Pure selection logic - semantics separate from mechanism.\n * Manages selection state and operations.\n */\nexport class SelectionModel extends EventTarget {\n private _selectedIds = new Set<string>();\n private _primaryId: string | null = null;\n private _selectionMode: SelectionState = \"none\";\n private _boxSelectStart: { x: number; y: number } | null = null;\n private _boxSelectCurrent: { x: number; y: number } | null = null;\n private _groups = new Map<string, Set<string>>();\n private _elementToGroup = new Map<string, string>();\n\n /**\n * Emit selectionchange event with current selection state.\n */\n private _emitSelectionChange(): void {\n // Convert Set to array with primary first\n const selectedIdsArray =\n this._primaryId && this._selectedIds.has(this._primaryId)\n ? [this._primaryId, ...Array.from(this._selectedIds).filter((id) => id !== this._primaryId)]\n : Array.from(this._selectedIds);\n\n this.dispatchEvent(\n new CustomEvent(\"selectionchange\", {\n detail: {\n selectedIds: selectedIdsArray,\n selectionMode: this._selectionMode,\n },\n bubbles: false,\n composed: false,\n }),\n );\n }\n\n /**\n * Get current selection state.\n */\n get selectedIds(): ReadonlySet<string> {\n return this._selectedIds;\n }\n\n /**\n * Get current selection mode.\n */\n get selectionMode(): SelectionState {\n return this._selectionMode;\n }\n\n /**\n * Get current box selection bounds, if active.\n */\n get boxSelectBounds(): DOMRect | null {\n if (!this._boxSelectStart || !this._boxSelectCurrent) {\n return null;\n }\n const left = Math.min(this._boxSelectStart.x, this._boxSelectCurrent.x);\n const top = Math.min(this._boxSelectStart.y, this._boxSelectCurrent.y);\n const right = Math.max(this._boxSelectStart.x, this._boxSelectCurrent.x);\n const bottom = Math.max(this._boxSelectStart.y, this._boxSelectCurrent.y);\n return createRect(left, top, right - left, bottom - top);\n }\n\n /**\n * Select a single element.\n */\n select(id: string): void {\n this._selectedIds.clear();\n this._selectedIds.add(id);\n this._primaryId = id;\n this._selectionMode = \"single\";\n this._emitSelectionChange();\n }\n\n /**\n * Select multiple elements.\n */\n selectMultiple(ids: string[]): void {\n this._selectedIds.clear();\n for (const id of ids) {\n this._selectedIds.add(id);\n }\n this._primaryId = ids.length > 0 ? (ids[0] ?? null) : null;\n this._selectionMode = ids.length === 0 ? \"none\" : ids.length === 1 ? \"single\" : \"multiple\";\n this._emitSelectionChange();\n }\n\n /**\n * Add element to selection (for multi-select).\n */\n addToSelection(id: string): void {\n this._selectedIds.add(id);\n if (!this._primaryId) {\n this._primaryId = id;\n }\n this._updateSelectionMode();\n this._emitSelectionChange();\n }\n\n /**\n * Remove element from selection.\n */\n deselect(id: string): void {\n this._selectedIds.delete(id);\n if (this._primaryId === id) {\n // Set primary to first remaining, or null if none\n const remaining = Array.from(this._selectedIds);\n this._primaryId = remaining.length > 0 ? (remaining[0] ?? null) : null;\n }\n this._updateSelectionMode();\n this._emitSelectionChange();\n }\n\n /**\n * Toggle element selection state.\n */\n toggle(id: string): void {\n if (this._selectedIds.has(id)) {\n this.deselect(id);\n } else {\n this.addToSelection(id);\n }\n }\n\n /**\n * Clear all selections.\n */\n clear(): void {\n this._selectedIds.clear();\n this._primaryId = null;\n this._selectionMode = \"none\";\n this._boxSelectStart = null;\n this._boxSelectCurrent = null;\n this._emitSelectionChange();\n }\n\n /**\n * Start box selection.\n */\n startBoxSelect(x: number, y: number): void {\n this._boxSelectStart = { x, y };\n this._boxSelectCurrent = { x, y };\n this._selectionMode = \"box-selecting\";\n }\n\n /**\n * Update box selection.\n */\n updateBoxSelect(x: number, y: number): void {\n if (this._selectionMode !== \"box-selecting\") {\n return;\n }\n this._boxSelectCurrent = { x, y };\n }\n\n /**\n * End box selection and select elements within bounds.\n * @param hitTest - Function to find elements within bounds\n * @param addToSelection - If true, add to existing selection; if false, replace selection\n */\n endBoxSelect(hitTest: (bounds: DOMRect) => string[], addToSelection = false): void {\n if (\n this._selectionMode !== \"box-selecting\" ||\n !this._boxSelectStart ||\n !this._boxSelectCurrent\n ) {\n return;\n }\n const bounds = this.boxSelectBounds;\n if (bounds) {\n const ids = hitTest(bounds);\n if (addToSelection) {\n // Add each element to selection\n for (const id of ids) {\n this.addToSelection(id);\n }\n } else {\n // Replace selection\n this.selectMultiple(ids);\n }\n }\n this._boxSelectStart = null;\n this._boxSelectCurrent = null;\n // Note: selectMultiple/addToSelection already emit events, so no need to emit again\n }\n\n /**\n * Create a group from selected elements.\n */\n createGroup(ids: string[]): string {\n if (ids.length === 0) {\n throw new Error(\"Cannot create group with no elements\");\n }\n const groupId = `group-${Date.now()}-${Math.random().toString(36).substring(2, 9)}`;\n const groupSet = new Set(ids);\n this._groups.set(groupId, groupSet);\n for (const id of ids) {\n this._elementToGroup.set(id, groupId);\n }\n return groupId;\n }\n\n /**\n * Ungroup a group.\n */\n ungroup(groupId: string): void {\n const group = this._groups.get(groupId);\n if (!group) {\n return;\n }\n for (const id of group) {\n this._elementToGroup.delete(id);\n }\n this._groups.delete(groupId);\n }\n\n /**\n * Select all elements in a group.\n */\n selectGroup(groupId: string): void {\n const group = this._groups.get(groupId);\n if (!group) {\n return;\n }\n this.selectMultiple(Array.from(group));\n // Note: selectMultiple already emits event\n }\n\n /**\n * Get group ID for an element, if any.\n */\n getGroupId(elementId: string): string | undefined {\n return this._elementToGroup.get(elementId);\n }\n\n /**\n * Get all element IDs in a group.\n */\n getGroupElements(groupId: string): string[] {\n const group = this._groups.get(groupId);\n return group ? Array.from(group) : [];\n }\n\n /**\n * Update selection mode based on current selection count.\n */\n private _updateSelectionMode(): void {\n const count = this._selectedIds.size;\n if (count === 0) {\n this._selectionMode = \"none\";\n } else if (count === 1) {\n this._selectionMode = \"single\";\n } else {\n this._selectionMode = \"multiple\";\n }\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"SelectionModel.js","names":[],"sources":["../../../src/canvas/selection/SelectionModel.ts"],"mappings":"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"}
@@ -1,7 +1,6 @@
1
1
  import { SelectionState } from "../api/types.js";
2
2
 
3
3
  //#region src/canvas/selection/selectionContext.d.ts
4
-
5
4
  /**
6
5
  * Selection context interface for Lit context.
7
6
  */
@@ -1,12 +1,11 @@
1
1
  import { createContext } from "@lit/context";
2
-
3
2
  //#region src/canvas/selection/selectionContext.ts
4
3
  /**
5
4
  * Lit context for selection state.
6
5
  * Provided by EFCanvas, consumed by child elements.
7
6
  */
8
7
  const selectionContext = createContext(Symbol("selectionContext"));
9
-
10
8
  //#endregion
11
9
  export { selectionContext };
10
+
12
11
  //# sourceMappingURL=selectionContext.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"selectionContext.js","names":[],"sources":["../../../src/canvas/selection/selectionContext.ts"],"sourcesContent":["import { createContext } from \"@lit/context\";\nimport type { SelectionState } from \"../api/types.js\";\n\n/**\n * Selection context interface for Lit context.\n */\nexport interface SelectionContext {\n selectedIds: ReadonlySet<string>;\n selectionMode: SelectionState;\n boxSelectBounds: DOMRect | null;\n select: (id: string) => void;\n selectMultiple: (ids: string[]) => void;\n addToSelection: (id: string) => void;\n deselect: (id: string) => void;\n toggle: (id: string) => void;\n clear: () => void;\n startBoxSelect: (x: number, y: number) => void;\n updateBoxSelect: (x: number, y: number) => void;\n endBoxSelect: (hitTest: (bounds: DOMRect) => string[], addToSelection?: boolean) => void;\n createGroup: (ids: string[]) => string;\n ungroup: (groupId: string) => void;\n selectGroup: (groupId: string) => void;\n getGroupId: (elementId: string) => string | undefined;\n getGroupElements: (groupId: string) => string[];\n addEventListener: (type: \"selectionchange\", listener: (event: CustomEvent) => void) => void;\n removeEventListener: (type: \"selectionchange\", listener: (event: CustomEvent) => void) => void;\n}\n\n/**\n * Lit context for selection state.\n * Provided by EFCanvas, consumed by child elements.\n */\nexport const selectionContext = createContext<SelectionContext>(Symbol(\"selectionContext\"));\n"],"mappings":";;;;;;;AAgCA,MAAa,mBAAmB,cAAgC,OAAO,mBAAmB,CAAC"}
1
+ {"version":3,"file":"selectionContext.js","names":[],"sources":["../../../src/canvas/selection/selectionContext.ts"],"mappings":";;;;;;AAgCA,MAAa,mBAAmB,cAAgC,OAAO,mBAAmB,CAAC"}
@@ -24,7 +24,7 @@ function getContainerInfoFromElement(element) {
24
24
  canContainChildren: isContainer
25
25
  };
26
26
  }
27
-
28
27
  //#endregion
29
28
  export { getContainerInfoFromElement };
29
+
30
30
  //# sourceMappingURL=ContainerInfo.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ContainerInfo.js","names":["displayMode: \"flex\" | \"grid\" | \"block\" | null"],"sources":["../../src/elements/ContainerInfo.ts"],"sourcesContent":["/**\n * Container information interface for elements that can contain children.\n * Provides information about container capabilities and display mode.\n */\n\nexport interface ContainerInfo {\n /**\n * Whether this element is a container that can contain children.\n */\n isContainer: boolean;\n\n /**\n * The display mode of the container.\n * \"flex\" | \"grid\" | \"block\" | null\n */\n displayMode: \"flex\" | \"grid\" | \"block\" | null;\n\n /**\n * Whether this container can contain children.\n * This may differ from isContainer if the container is not configured to accept children.\n */\n canContainChildren: boolean;\n}\n\n/**\n * Helper function to get container info from any HTMLElement.\n * Reads computed styles to determine display mode.\n */\nexport function getContainerInfoFromElement(element: HTMLElement | null): ContainerInfo {\n if (!element) {\n return {\n isContainer: false,\n displayMode: null,\n canContainChildren: false,\n };\n }\n\n const computedStyle = window.getComputedStyle(element);\n const display = computedStyle.display;\n\n // Determine if it's a container (grid or flex)\n const isGrid = display === \"grid\" || display === \"inline-grid\";\n const isFlex = display === \"flex\" || display === \"inline-flex\";\n const isBlock = display === \"block\" || display === \"inline-block\";\n\n const isContainer = isGrid || isFlex || isBlock;\n\n let displayMode: \"flex\" | \"grid\" | \"block\" | null = null;\n if (isFlex) {\n displayMode = \"flex\";\n } else if (isGrid) {\n displayMode = \"grid\";\n } else if (isBlock) {\n displayMode = \"block\";\n }\n\n return {\n isContainer,\n displayMode,\n canContainChildren: isContainer,\n };\n}\n"],"mappings":";;;;;AA4BA,SAAgB,4BAA4B,SAA4C;AACtF,KAAI,CAAC,QACH,QAAO;EACL,aAAa;EACb,aAAa;EACb,oBAAoB;EACrB;CAIH,MAAM,UADgB,OAAO,iBAAiB,QAAQ,CACxB;CAG9B,MAAM,SAAS,YAAY,UAAU,YAAY;CACjD,MAAM,SAAS,YAAY,UAAU,YAAY;CACjD,MAAM,UAAU,YAAY,WAAW,YAAY;CAEnD,MAAM,cAAc,UAAU,UAAU;CAExC,IAAIA,cAAgD;AACpD,KAAI,OACF,eAAc;UACL,OACT,eAAc;UACL,QACT,eAAc;AAGhB,QAAO;EACL;EACA;EACA,oBAAoB;EACrB"}
1
+ {"version":3,"file":"ContainerInfo.js","names":[],"sources":["../../src/elements/ContainerInfo.ts"],"mappings":";;;;;AA4BA,SAAgB,4BAA4B,SAA4C;AACtF,KAAI,CAAC,QACH,QAAO;EACL,aAAa;EACb,aAAa;EACb,oBAAoB;EACrB;CAIH,MAAM,UADgB,OAAO,iBAAiB,QAAQ,CACxB;CAG9B,MAAM,SAAS,YAAY,UAAU,YAAY;CACjD,MAAM,SAAS,YAAY,UAAU,YAAY;CACjD,MAAM,UAAU,YAAY,WAAW,YAAY;CAEnD,MAAM,cAAc,UAAU,UAAU;CAExC,IAAI,cAAgD;AACpD,KAAI,OACF,eAAc;UACL,OACT,eAAc;UACL,QACT,eAAc;AAGhB,QAAO;EACL;EACA;EACA,oBAAoB;EACrB"}
@@ -12,7 +12,7 @@ var CrossUpdateController = class {
12
12
  this.host.removeController(this);
13
13
  }
14
14
  };
15
-
16
15
  //#endregion
17
16
  export { CrossUpdateController };
17
+
18
18
  //# sourceMappingURL=CrossUpdateController.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"CrossUpdateController.js","names":["host: ReactiveControllerHost","target: LitElement"],"sources":["../../src/elements/CrossUpdateController.ts"],"sourcesContent":["import type { LitElement, ReactiveController, ReactiveControllerHost } from \"lit\";\n\nexport class CrossUpdateController implements ReactiveController {\n constructor(\n private host: ReactiveControllerHost,\n private target: LitElement,\n ) {\n this.host.addController(this);\n }\n\n hostUpdate(): void {\n this.target.requestUpdate();\n }\n\n remove(): void {\n this.host.removeController(this);\n }\n}\n"],"mappings":";AAEA,IAAa,wBAAb,MAAiE;CAC/D,YACE,AAAQA,MACR,AAAQC,QACR;EAFQ;EACA;AAER,OAAK,KAAK,cAAc,KAAK;;CAG/B,aAAmB;AACjB,OAAK,OAAO,eAAe;;CAG7B,SAAe;AACb,OAAK,KAAK,iBAAiB,KAAK"}
1
+ {"version":3,"file":"CrossUpdateController.js","names":[],"sources":["../../src/elements/CrossUpdateController.ts"],"mappings":";AAEA,IAAa,wBAAb,MAAiE;CAC/D,YACE,MACA,QACA;AAFQ,OAAA,OAAA;AACA,OAAA,SAAA;AAER,OAAK,KAAK,cAAc,KAAK;;CAG/B,aAAmB;AACjB,OAAK,OAAO,eAAe;;CAG7B,SAAe;AACb,OAAK,KAAK,iBAAiB,KAAK"}
@@ -1,7 +1,7 @@
1
+ import { TemplateResult } from "../node_modules/lit-html/development/lit-html.js";
1
2
  import { FrameRenderable, FrameState } from "../preview/FrameController.js";
2
3
  import { EFMedia } from "./EFMedia.js";
3
- import * as lit_html2 from "lit-html";
4
- import * as lit_html_directives_ref_js1 from "lit-html/directives/ref.js";
4
+ import { Ref } from "../node_modules/lit-html/development/directives/ref.js";
5
5
 
6
6
  //#region src/elements/EFAudio.d.ts
7
7
  declare const EFAudio_base: typeof EFMedia;
@@ -17,9 +17,9 @@ declare class EFAudio extends EFAudio_base implements FrameRenderable {
17
17
  * @domAttribute "volume"
18
18
  */
19
19
  volume: number;
20
- audioElementRef: lit_html_directives_ref_js1.Ref<HTMLAudioElement>;
20
+ audioElementRef: Ref<HTMLAudioElement>;
21
21
  protected updated(changedProperties: Map<PropertyKey, unknown>): void;
22
- render(): lit_html2.TemplateResult<1>;
22
+ render(): TemplateResult<1>;
23
23
  /**
24
24
  * Query readiness state for a given time.
25
25
  * @implements FrameRenderable
@@ -1,13 +1,11 @@
1
1
  import { TWMixin } from "../gui/TWMixin2.js";
2
- import { PRIORITY_AUDIO } from "../preview/FrameController.js";
3
- import { __decorate } from "../_virtual/_@oxc-project_runtime@0.95.0/helpers/decorate.js";
2
+ import { __decorate } from "../_virtual/_@oxc-project_runtime@0.122.0/helpers/decorate.js";
4
3
  import { EFMedia } from "./EFMedia.js";
5
4
  import { html } from "lit";
6
5
  import { customElement, property } from "lit/decorators.js";
7
6
  import { createRef, ref } from "lit/directives/ref.js";
8
-
9
7
  //#region src/elements/EFAudio.ts
10
- let EFAudio = class EFAudio$1 extends TWMixin(EFMedia) {
8
+ let EFAudio = class EFAudio extends TWMixin(EFMedia) {
11
9
  constructor(..._args) {
12
10
  super(..._args);
13
11
  this.volume = 1;
@@ -39,7 +37,7 @@ let EFAudio = class EFAudio$1 extends TWMixin(EFMedia) {
39
37
  return {
40
38
  needsPreparation: !isReady,
41
39
  isReady,
42
- priority: PRIORITY_AUDIO
40
+ priority: 3
43
41
  };
44
42
  }
45
43
  /**
@@ -62,7 +60,7 @@ __decorate([property({
62
60
  reflect: true
63
61
  })], EFAudio.prototype, "volume", void 0);
64
62
  EFAudio = __decorate([customElement("ef-audio")], EFAudio);
65
-
66
63
  //#endregion
67
64
  export { EFAudio };
65
+
68
66
  //# sourceMappingURL=EFAudio.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"EFAudio.js","names":["EFAudio","#mediaEngineLoaded"],"sources":["../../src/elements/EFAudio.ts"],"sourcesContent":["import { html } from \"lit\";\nimport { customElement, property } from \"lit/decorators.js\";\nimport { createRef, ref } from \"lit/directives/ref.js\";\nimport { TWMixin } from \"../gui/TWMixin.js\";\nimport {\n type FrameRenderable,\n type FrameState,\n PRIORITY_AUDIO,\n} from \"../preview/FrameController.js\";\nimport { EFMedia } from \"./EFMedia.js\";\n\n@customElement(\"ef-audio\")\nexport class EFAudio extends TWMixin(EFMedia) implements FrameRenderable {\n /**\n * EFAudio only requires audio tracks - skip video track validation\n * to avoid unnecessary network requests to transcoding service.\n */\n override get requiredTracks(): \"audio\" | \"video\" | \"both\" {\n return \"audio\";\n }\n\n /**\n * Audio volume level (0.0 to 1.0)\n * @domAttribute \"volume\"\n */\n @property({ type: Number, attribute: \"volume\", reflect: true })\n volume = 1.0;\n\n audioElementRef = createRef<HTMLAudioElement>();\n\n #mediaEngineLoaded = false;\n\n protected updated(changedProperties: Map<PropertyKey, unknown>): void {\n super.updated(changedProperties);\n\n // Sync volume property to HTMLAudioElement whenever it changes or element is first rendered\n if (this.audioElementRef.value) {\n if (changedProperties.has(\"volume\") || changedProperties.size === 0) {\n this.audioElementRef.value.volume = this.volume;\n }\n }\n }\n\n render() {\n return html`<audio ${ref(this.audioElementRef)}></audio>`;\n }\n\n // ============================================================================\n // FrameRenderable Implementation\n // ============================================================================\n\n /**\n * Query readiness state for a given time.\n * @implements FrameRenderable\n */\n getFrameState(_timeMs: number): FrameState {\n // Check if media engine is loaded\n const isReady = this.#mediaEngineLoaded && this.mediaEngineTask.status === 2; // COMPLETE\n\n return {\n needsPreparation: !isReady,\n isReady,\n priority: PRIORITY_AUDIO,\n };\n }\n\n /**\n * Async preparation - waits for media engine to load.\n * @implements FrameRenderable\n */\n async prepareFrame(_timeMs: number, signal: AbortSignal): Promise<void> {\n // Just ensure media engine is loaded\n const mediaEngine = await this.getMediaEngine(signal);\n this.#mediaEngineLoaded = !!mediaEngine;\n signal.throwIfAborted();\n }\n\n /**\n * Synchronous render - audio plays via HTMLAudioElement, no explicit render needed.\n * @implements FrameRenderable\n */\n renderFrame(_timeMs: number): void {\n // Audio playback is handled by the browser's HTMLAudioElement\n // No explicit rendering action needed\n }\n\n // ============================================================================\n // End FrameRenderable Implementation\n // ============================================================================\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"ef-audio\": EFAudio;\n }\n}\n"],"mappings":";;;;;;;;;AAYO,oBAAMA,kBAAgB,QAAQ,QAAQ,CAA4B;;;gBAc9D;yBAES,WAA6B;;;;;;CAX/C,IAAa,iBAA6C;AACxD,SAAO;;CAYT,qBAAqB;CAErB,AAAU,QAAQ,mBAAoD;AACpE,QAAM,QAAQ,kBAAkB;AAGhC,MAAI,KAAK,gBAAgB,OACvB;OAAI,kBAAkB,IAAI,SAAS,IAAI,kBAAkB,SAAS,EAChE,MAAK,gBAAgB,MAAM,SAAS,KAAK;;;CAK/C,SAAS;AACP,SAAO,IAAI,UAAU,IAAI,KAAK,gBAAgB,CAAC;;;;;;CAWjD,cAAc,SAA6B;EAEzC,MAAM,UAAU,MAAKC,qBAAsB,KAAK,gBAAgB,WAAW;AAE3E,SAAO;GACL,kBAAkB,CAAC;GACnB;GACA,UAAU;GACX;;;;;;CAOH,MAAM,aAAa,SAAiB,QAAoC;AAGtE,QAAKA,oBAAqB,CAAC,CADP,MAAM,KAAK,eAAe,OAAO;AAErD,SAAO,gBAAgB;;;;;;CAOzB,YAAY,SAAuB;;YAxDlC,SAAS;CAAE,MAAM;CAAQ,WAAW;CAAU,SAAS;CAAM,CAAC;sBAdhE,cAAc,WAAW"}
1
+ {"version":3,"file":"EFAudio.js","names":["#mediaEngineLoaded"],"sources":["../../src/elements/EFAudio.ts"],"mappings":";;;;;;;AAYO,IAAA,UAAA,MAAM,gBAAgB,QAAQ,QAAQ,CAA4B;;;gBAc9D;yBAES,WAA6B;;;;;;CAX/C,IAAa,iBAA6C;AACxD,SAAO;;CAYT,qBAAqB;CAErB,QAAkB,mBAAoD;AACpE,QAAM,QAAQ,kBAAkB;AAGhC,MAAI,KAAK,gBAAgB;OACnB,kBAAkB,IAAI,SAAS,IAAI,kBAAkB,SAAS,EAChE,MAAK,gBAAgB,MAAM,SAAS,KAAK;;;CAK/C,SAAS;AACP,SAAO,IAAI,UAAU,IAAI,KAAK,gBAAgB,CAAC;;;;;;CAWjD,cAAc,SAA6B;EAEzC,MAAM,UAAU,MAAA,qBAA2B,KAAK,gBAAgB,WAAW;AAE3E,SAAO;GACL,kBAAkB,CAAC;GACnB;GACA,UAAA;GACD;;;;;;CAOH,MAAM,aAAa,SAAiB,QAAoC;AAGtE,QAAA,oBAA0B,CAAC,CADP,MAAM,KAAK,eAAe,OAAO;AAErD,SAAO,gBAAgB;;;;;;CAOzB,YAAY,SAAuB;;YAxDlC,SAAS;CAAE,MAAM;CAAQ,WAAW;CAAU,SAAS;CAAM,CAAC,CAAA,EAAA,QAAA,WAAA,UAAA,KAAA,EAAA;sBAdhE,cAAc,WAAW,CAAA,EAAA,QAAA"}