@editframe/elements 0.23.8-beta.0 → 0.25.0-beta.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 (339) hide show
  1. package/dist/DelayedLoadingState.js +31 -0
  2. package/dist/DelayedLoadingState.js.map +1 -0
  3. package/dist/EF_FRAMEGEN.d.ts +50 -46
  4. package/dist/EF_FRAMEGEN.js +5 -1
  5. package/dist/EF_FRAMEGEN.js.map +1 -0
  6. package/dist/EF_INTERACTIVE.js +4 -0
  7. package/dist/EF_INTERACTIVE.js.map +1 -0
  8. package/dist/EF_RENDERING.js +4 -0
  9. package/dist/EF_RENDERING.js.map +1 -0
  10. package/dist/_virtual/_@oxc-project_runtime@0.94.0/helpers/decorate.js +4 -1
  11. package/dist/attachContextRoot.js +6 -1
  12. package/dist/attachContextRoot.js.map +1 -0
  13. package/dist/elements/CrossUpdateController.js +4 -0
  14. package/dist/elements/CrossUpdateController.js.map +1 -0
  15. package/dist/elements/EFAudio.d.ts +24 -16
  16. package/dist/elements/EFAudio.js +10 -1
  17. package/dist/elements/EFAudio.js.map +1 -0
  18. package/dist/elements/EFCaptions.d.ts +118 -109
  19. package/dist/elements/EFCaptions.js +11 -6
  20. package/dist/elements/EFCaptions.js.map +1 -0
  21. package/dist/elements/EFImage.d.ts +31 -20
  22. package/dist/elements/EFImage.js +6 -1
  23. package/dist/elements/EFImage.js.map +1 -0
  24. package/dist/elements/EFMedia/AssetIdMediaEngine.js +5 -0
  25. package/dist/elements/EFMedia/AssetIdMediaEngine.js.map +1 -0
  26. package/dist/elements/EFMedia/AssetMediaEngine.js +12 -0
  27. package/dist/elements/EFMedia/AssetMediaEngine.js.map +1 -0
  28. package/dist/elements/EFMedia/BaseMediaEngine.js +53 -0
  29. package/dist/elements/EFMedia/BaseMediaEngine.js.map +1 -0
  30. package/dist/elements/EFMedia/BufferedSeekingInput.d.ts +47 -46
  31. package/dist/elements/EFMedia/BufferedSeekingInput.js +6 -1
  32. package/dist/elements/EFMedia/BufferedSeekingInput.js.map +1 -0
  33. package/dist/elements/EFMedia/JitMediaEngine.js +12 -0
  34. package/dist/elements/EFMedia/JitMediaEngine.js.map +1 -0
  35. package/dist/elements/EFMedia/audioTasks/makeAudioBufferTask.d.ts +9 -13
  36. package/dist/elements/EFMedia/audioTasks/makeAudioBufferTask.js +5 -0
  37. package/dist/elements/EFMedia/audioTasks/makeAudioBufferTask.js.map +1 -0
  38. package/dist/elements/EFMedia/audioTasks/makeAudioFrequencyAnalysisTask.js +6 -1
  39. package/dist/elements/EFMedia/audioTasks/makeAudioFrequencyAnalysisTask.js.map +1 -0
  40. package/dist/elements/EFMedia/audioTasks/makeAudioInitSegmentFetchTask.js +5 -0
  41. package/dist/elements/EFMedia/audioTasks/makeAudioInitSegmentFetchTask.js.map +1 -0
  42. package/dist/elements/EFMedia/audioTasks/makeAudioInputTask.js +5 -0
  43. package/dist/elements/EFMedia/audioTasks/makeAudioInputTask.js.map +1 -0
  44. package/dist/elements/EFMedia/audioTasks/makeAudioSeekTask.js +5 -0
  45. package/dist/elements/EFMedia/audioTasks/makeAudioSeekTask.js.map +1 -0
  46. package/dist/elements/EFMedia/audioTasks/makeAudioSegmentFetchTask.js +5 -0
  47. package/dist/elements/EFMedia/audioTasks/makeAudioSegmentFetchTask.js.map +1 -0
  48. package/dist/elements/EFMedia/audioTasks/makeAudioSegmentIdTask.js +5 -0
  49. package/dist/elements/EFMedia/audioTasks/makeAudioSegmentIdTask.js.map +1 -0
  50. package/dist/elements/EFMedia/audioTasks/makeAudioTimeDomainAnalysisTask.js +6 -1
  51. package/dist/elements/EFMedia/audioTasks/makeAudioTimeDomainAnalysisTask.js.map +1 -0
  52. package/dist/elements/EFMedia/shared/AudioSpanUtils.js +18 -2
  53. package/dist/elements/EFMedia/shared/AudioSpanUtils.js.map +1 -0
  54. package/dist/elements/EFMedia/shared/BufferUtils.d.ts +9 -67
  55. package/dist/elements/EFMedia/shared/BufferUtils.js +15 -0
  56. package/dist/elements/EFMedia/shared/BufferUtils.js.map +1 -0
  57. package/dist/elements/EFMedia/shared/GlobalInputCache.js +29 -0
  58. package/dist/elements/EFMedia/shared/GlobalInputCache.js.map +1 -0
  59. package/dist/elements/EFMedia/shared/MediaTaskUtils.d.ts +11 -17
  60. package/dist/elements/EFMedia/shared/PrecisionUtils.js +25 -0
  61. package/dist/elements/EFMedia/shared/PrecisionUtils.js.map +1 -0
  62. package/dist/elements/EFMedia/shared/ThumbnailExtractor.js +22 -0
  63. package/dist/elements/EFMedia/shared/ThumbnailExtractor.js.map +1 -0
  64. package/dist/elements/EFMedia/tasks/makeMediaEngineTask.js +13 -0
  65. package/dist/elements/EFMedia/tasks/makeMediaEngineTask.js.map +1 -0
  66. package/dist/elements/EFMedia/videoTasks/MainVideoInputCache.js +21 -0
  67. package/dist/elements/EFMedia/videoTasks/MainVideoInputCache.js.map +1 -0
  68. package/dist/elements/EFMedia/videoTasks/ScrubInputCache.js +18 -0
  69. package/dist/elements/EFMedia/videoTasks/ScrubInputCache.js.map +1 -0
  70. package/dist/elements/EFMedia/videoTasks/makeScrubVideoBufferTask.js +10 -0
  71. package/dist/elements/EFMedia/videoTasks/makeScrubVideoBufferTask.js.map +1 -0
  72. package/dist/elements/EFMedia/videoTasks/makeScrubVideoInitSegmentFetchTask.js +5 -0
  73. package/dist/elements/EFMedia/videoTasks/makeScrubVideoInitSegmentFetchTask.js.map +1 -0
  74. package/dist/elements/EFMedia/videoTasks/makeScrubVideoInputTask.js +5 -0
  75. package/dist/elements/EFMedia/videoTasks/makeScrubVideoInputTask.js.map +1 -0
  76. package/dist/elements/EFMedia/videoTasks/makeScrubVideoSeekTask.js +6 -1
  77. package/dist/elements/EFMedia/videoTasks/makeScrubVideoSeekTask.js.map +1 -0
  78. package/dist/elements/EFMedia/videoTasks/makeScrubVideoSegmentFetchTask.js +5 -0
  79. package/dist/elements/EFMedia/videoTasks/makeScrubVideoSegmentFetchTask.js.map +1 -0
  80. package/dist/elements/EFMedia/videoTasks/makeScrubVideoSegmentIdTask.js +5 -0
  81. package/dist/elements/EFMedia/videoTasks/makeScrubVideoSegmentIdTask.js.map +1 -0
  82. package/dist/elements/EFMedia/videoTasks/makeUnifiedVideoSeekTask.js +16 -2
  83. package/dist/elements/EFMedia/videoTasks/makeUnifiedVideoSeekTask.js.map +1 -0
  84. package/dist/elements/EFMedia/videoTasks/makeVideoBufferTask.d.ts +9 -13
  85. package/dist/elements/EFMedia/videoTasks/makeVideoBufferTask.js +5 -0
  86. package/dist/elements/EFMedia/videoTasks/makeVideoBufferTask.js.map +1 -0
  87. package/dist/elements/EFMedia.d.ts +115 -104
  88. package/dist/elements/EFMedia.js +25 -1
  89. package/dist/elements/EFMedia.js.map +1 -0
  90. package/dist/elements/EFSourceMixin.d.ts +10 -11
  91. package/dist/elements/EFSourceMixin.js +5 -0
  92. package/dist/elements/EFSourceMixin.js.map +1 -0
  93. package/dist/elements/EFSurface.d.ts +35 -27
  94. package/dist/elements/EFSurface.js +6 -1
  95. package/dist/elements/EFSurface.js.map +1 -0
  96. package/dist/elements/EFTemporal.d.ts +200 -213
  97. package/dist/elements/EFTemporal.js +24 -4
  98. package/dist/elements/EFTemporal.js.map +1 -0
  99. package/dist/elements/EFThumbnailStrip.d.ts +91 -83
  100. package/dist/elements/EFThumbnailStrip.js +49 -4
  101. package/dist/elements/EFThumbnailStrip.js.map +1 -0
  102. package/dist/elements/EFTimegroup.d.ts +107 -88
  103. package/dist/elements/EFTimegroup.js +74 -4
  104. package/dist/elements/EFTimegroup.js.map +1 -0
  105. package/dist/elements/EFVideo.d.ts +120 -108
  106. package/dist/elements/EFVideo.js +46 -2
  107. package/dist/elements/EFVideo.js.map +1 -0
  108. package/dist/elements/EFWaveform.d.ts +48 -41
  109. package/dist/elements/EFWaveform.js +6 -1
  110. package/dist/elements/EFWaveform.js.map +1 -0
  111. package/dist/elements/FetchMixin.d.ts +8 -6
  112. package/dist/elements/FetchMixin.js +4 -0
  113. package/dist/elements/FetchMixin.js.map +1 -0
  114. package/dist/elements/SampleBuffer.d.ts +18 -13
  115. package/dist/elements/SampleBuffer.js +5 -0
  116. package/dist/elements/SampleBuffer.js.map +1 -0
  117. package/dist/elements/TargetController.d.ts +23 -24
  118. package/dist/elements/TargetController.js +8 -3
  119. package/dist/elements/TargetController.js.map +1 -0
  120. package/dist/elements/TimegroupController.d.ts +17 -12
  121. package/dist/elements/TimegroupController.js +4 -0
  122. package/dist/elements/TimegroupController.js.map +1 -0
  123. package/dist/elements/durationConverter.js +9 -4
  124. package/dist/elements/durationConverter.js.map +1 -0
  125. package/dist/elements/parseTimeToMs.js +4 -0
  126. package/dist/elements/parseTimeToMs.js.map +1 -0
  127. package/dist/elements/renderTemporalAudio.js +4 -0
  128. package/dist/elements/renderTemporalAudio.js.map +1 -0
  129. package/dist/elements/updateAnimations.js +29 -8
  130. package/dist/elements/updateAnimations.js.map +1 -0
  131. package/dist/elements-ZhsB7B5N.css +9 -0
  132. package/dist/elements-ZhsB7B5N.css.map +1 -0
  133. package/dist/getRenderInfo.d.ts +53 -47
  134. package/dist/getRenderInfo.js +5 -0
  135. package/dist/getRenderInfo.js.map +1 -0
  136. package/dist/gui/ContextMixin.d.ts +19 -20
  137. package/dist/gui/ContextMixin.js +32 -1
  138. package/dist/gui/ContextMixin.js.map +1 -0
  139. package/dist/gui/Controllable.d.ts +13 -14
  140. package/dist/gui/Controllable.js +5 -0
  141. package/dist/gui/Controllable.js.map +1 -0
  142. package/dist/gui/EFConfiguration.d.ts +18 -14
  143. package/dist/gui/EFConfiguration.js +6 -1
  144. package/dist/gui/EFConfiguration.js.map +1 -0
  145. package/dist/gui/EFControls.d.ts +35 -31
  146. package/dist/gui/EFControls.js +8 -3
  147. package/dist/gui/EFControls.js.map +1 -0
  148. package/dist/gui/EFDial.d.ts +23 -16
  149. package/dist/gui/EFDial.js +6 -1
  150. package/dist/gui/EFDial.js.map +1 -0
  151. package/dist/gui/EFFilmstrip.d.ts +183 -177
  152. package/dist/gui/EFFilmstrip.js +30 -25
  153. package/dist/gui/EFFilmstrip.js.map +1 -0
  154. package/dist/gui/EFFitScale.d.ts +30 -24
  155. package/dist/gui/EFFitScale.js +6 -1
  156. package/dist/gui/EFFitScale.js.map +1 -0
  157. package/dist/gui/EFFocusOverlay.d.ts +22 -14
  158. package/dist/gui/EFFocusOverlay.js +6 -1
  159. package/dist/gui/EFFocusOverlay.js.map +1 -0
  160. package/dist/gui/EFPause.d.ts +24 -18
  161. package/dist/gui/EFPause.js +6 -1
  162. package/dist/gui/EFPause.js.map +1 -0
  163. package/dist/gui/EFPlay.d.ts +24 -18
  164. package/dist/gui/EFPlay.js +6 -1
  165. package/dist/gui/EFPlay.js.map +1 -0
  166. package/dist/gui/EFPreview.d.ts +22 -15
  167. package/dist/gui/EFPreview.js +9 -1
  168. package/dist/gui/EFPreview.js.map +1 -0
  169. package/dist/gui/EFResizableBox.d.ts +39 -32
  170. package/dist/gui/EFResizableBox.js +8 -3
  171. package/dist/gui/EFResizableBox.js.map +1 -0
  172. package/dist/gui/EFScrubber.d.ts +31 -25
  173. package/dist/gui/EFScrubber.js +6 -1
  174. package/dist/gui/EFScrubber.js.map +1 -0
  175. package/dist/gui/EFTimeDisplay.d.ts +21 -14
  176. package/dist/gui/EFTimeDisplay.js +6 -1
  177. package/dist/gui/EFTimeDisplay.js.map +1 -0
  178. package/dist/gui/EFToggleLoop.d.ts +19 -13
  179. package/dist/gui/EFToggleLoop.js +6 -1
  180. package/dist/gui/EFToggleLoop.js.map +1 -0
  181. package/dist/gui/EFTogglePlay.d.ts +23 -17
  182. package/dist/gui/EFTogglePlay.js +6 -1
  183. package/dist/gui/EFTogglePlay.js.map +1 -0
  184. package/dist/gui/EFWorkbench.d.ts +24 -16
  185. package/dist/gui/EFWorkbench.js +6 -1
  186. package/dist/gui/EFWorkbench.js.map +1 -0
  187. package/dist/gui/PlaybackController.d.ts +54 -50
  188. package/dist/gui/PlaybackController.js +23 -1
  189. package/dist/gui/PlaybackController.js.map +1 -0
  190. package/dist/gui/TWMixin.js +5 -1
  191. package/dist/gui/TWMixin.js.map +1 -0
  192. package/dist/gui/TWMixin2.js +6 -1
  193. package/dist/gui/TWMixin2.js.map +1 -0
  194. package/dist/gui/TargetOrContextMixin.js +5 -0
  195. package/dist/gui/TargetOrContextMixin.js.map +1 -0
  196. package/dist/gui/currentTimeContext.js +5 -0
  197. package/dist/gui/currentTimeContext.js.map +1 -0
  198. package/dist/gui/durationContext.js +5 -0
  199. package/dist/gui/durationContext.js.map +1 -0
  200. package/dist/gui/efContext.js +5 -0
  201. package/dist/gui/efContext.js.map +1 -0
  202. package/dist/gui/fetchContext.js +5 -0
  203. package/dist/gui/fetchContext.js.map +1 -0
  204. package/dist/gui/focusContext.d.ts +6 -5
  205. package/dist/gui/focusContext.js +5 -0
  206. package/dist/gui/focusContext.js.map +1 -0
  207. package/dist/gui/focusedElementContext.js +5 -0
  208. package/dist/gui/focusedElementContext.js.map +1 -0
  209. package/dist/gui/playingContext.js +5 -0
  210. package/dist/gui/playingContext.js.map +1 -0
  211. package/dist/index.d.ts +27 -26
  212. package/dist/index.js +6 -1
  213. package/dist/index.js.map +1 -0
  214. package/dist/msToTimeCode.js +4 -0
  215. package/dist/msToTimeCode.js.map +1 -0
  216. package/dist/otel/BridgeSpanExporter.js +5 -0
  217. package/dist/otel/BridgeSpanExporter.js.map +1 -0
  218. package/dist/otel/setupBrowserTracing.js +7 -2
  219. package/dist/otel/setupBrowserTracing.js.map +1 -0
  220. package/dist/otel/tracingHelpers.d.ts +7 -34
  221. package/dist/otel/tracingHelpers.js +34 -2
  222. package/dist/otel/tracingHelpers.js.map +1 -0
  223. package/dist/transcoding/cache/RequestDeduplicator.js +25 -0
  224. package/dist/transcoding/cache/RequestDeduplicator.js.map +1 -0
  225. package/dist/transcoding/cache/URLTokenDeduplicator.js +23 -0
  226. package/dist/transcoding/cache/URLTokenDeduplicator.js.map +1 -0
  227. package/dist/transcoding/types/index.d.ts +96 -270
  228. package/dist/transcoding/utils/UrlGenerator.d.ts +30 -25
  229. package/dist/transcoding/utils/UrlGenerator.js +19 -0
  230. package/dist/transcoding/utils/UrlGenerator.js.map +1 -0
  231. package/dist/utils/LRUCache.js +44 -0
  232. package/dist/utils/LRUCache.js.map +1 -0
  233. package/package.json +11 -24
  234. package/src/elements/EFCaptions.browsertest.ts +7 -7
  235. package/src/elements/EFTimegroup.ts +43 -1
  236. package/src/gui/PlaybackController.ts +6 -1
  237. package/tsdown.config.ts +36 -0
  238. package/types.json +1 -1
  239. package/dist/DelayedLoadingState.d.ts +0 -48
  240. package/dist/DelayedLoadingState.integration.test.d.ts +0 -1
  241. package/dist/DelayedLoadingState.test.d.ts +0 -1
  242. package/dist/EF_INTERACTIVE.d.ts +0 -1
  243. package/dist/EF_RENDERING.d.ts +0 -1
  244. package/dist/LoadingDebounce.test.d.ts +0 -1
  245. package/dist/ManualScrubTest.test.d.ts +0 -1
  246. package/dist/ScrubResolvedFlashing.test.d.ts +0 -1
  247. package/dist/ScrubTrackManager.test.d.ts +0 -1
  248. package/dist/VideoSeekFlashing.browsertest.d.ts +0 -0
  249. package/dist/VideoStuckDiagnostic.test.d.ts +0 -1
  250. package/dist/attachContextRoot.d.ts +0 -1
  251. package/dist/elements/ContextProxiesController.d.ts +0 -39
  252. package/dist/elements/CrossUpdateController.d.ts +0 -8
  253. package/dist/elements/EFAudio.browsertest.d.ts +0 -0
  254. package/dist/elements/EFCaptions.browsertest.d.ts +0 -0
  255. package/dist/elements/EFImage.browsertest.d.ts +0 -0
  256. package/dist/elements/EFMedia/AssetIdMediaEngine.d.ts +0 -19
  257. package/dist/elements/EFMedia/AssetIdMediaEngine.test.d.ts +0 -1
  258. package/dist/elements/EFMedia/AssetMediaEngine.browsertest.d.ts +0 -0
  259. package/dist/elements/EFMedia/AssetMediaEngine.d.ts +0 -56
  260. package/dist/elements/EFMedia/BaseMediaEngine.browsertest.d.ts +0 -1
  261. package/dist/elements/EFMedia/BaseMediaEngine.d.ts +0 -103
  262. package/dist/elements/EFMedia/BufferedSeekingInput.browsertest.d.ts +0 -1
  263. package/dist/elements/EFMedia/JitMediaEngine.browsertest.d.ts +0 -0
  264. package/dist/elements/EFMedia/JitMediaEngine.d.ts +0 -46
  265. package/dist/elements/EFMedia/audioTasks/makeAudioBufferTask.browsertest.d.ts +0 -9
  266. package/dist/elements/EFMedia/audioTasks/makeAudioFrequencyAnalysisTask.d.ts +0 -3
  267. package/dist/elements/EFMedia/audioTasks/makeAudioInitSegmentFetchTask.browsertest.d.ts +0 -9
  268. package/dist/elements/EFMedia/audioTasks/makeAudioInitSegmentFetchTask.d.ts +0 -4
  269. package/dist/elements/EFMedia/audioTasks/makeAudioInputTask.browsertest.d.ts +0 -9
  270. package/dist/elements/EFMedia/audioTasks/makeAudioInputTask.d.ts +0 -3
  271. package/dist/elements/EFMedia/audioTasks/makeAudioSeekTask.chunkboundary.regression.browsertest.d.ts +0 -0
  272. package/dist/elements/EFMedia/audioTasks/makeAudioSeekTask.d.ts +0 -7
  273. package/dist/elements/EFMedia/audioTasks/makeAudioSegmentFetchTask.d.ts +0 -4
  274. package/dist/elements/EFMedia/audioTasks/makeAudioSegmentIdTask.d.ts +0 -4
  275. package/dist/elements/EFMedia/audioTasks/makeAudioTasksVideoOnly.browsertest.d.ts +0 -1
  276. package/dist/elements/EFMedia/audioTasks/makeAudioTimeDomainAnalysisTask.d.ts +0 -3
  277. package/dist/elements/EFMedia/shared/AudioSpanUtils.d.ts +0 -7
  278. package/dist/elements/EFMedia/shared/GlobalInputCache.d.ts +0 -39
  279. package/dist/elements/EFMedia/shared/PrecisionUtils.d.ts +0 -28
  280. package/dist/elements/EFMedia/shared/RenditionHelpers.browsertest.d.ts +0 -1
  281. package/dist/elements/EFMedia/shared/RenditionHelpers.d.ts +0 -11
  282. package/dist/elements/EFMedia/shared/ThumbnailExtractor.d.ts +0 -27
  283. package/dist/elements/EFMedia/tasks/makeMediaEngineTask.browsertest.d.ts +0 -9
  284. package/dist/elements/EFMedia/tasks/makeMediaEngineTask.d.ts +0 -17
  285. package/dist/elements/EFMedia/videoTasks/MainVideoInputCache.d.ts +0 -29
  286. package/dist/elements/EFMedia/videoTasks/ScrubInputCache.d.ts +0 -25
  287. package/dist/elements/EFMedia/videoTasks/makeScrubVideoBufferTask.d.ts +0 -8
  288. package/dist/elements/EFMedia/videoTasks/makeScrubVideoInitSegmentFetchTask.d.ts +0 -4
  289. package/dist/elements/EFMedia/videoTasks/makeScrubVideoInputTask.d.ts +0 -3
  290. package/dist/elements/EFMedia/videoTasks/makeScrubVideoSeekTask.d.ts +0 -6
  291. package/dist/elements/EFMedia/videoTasks/makeScrubVideoSegmentFetchTask.d.ts +0 -4
  292. package/dist/elements/EFMedia/videoTasks/makeScrubVideoSegmentIdTask.d.ts +0 -4
  293. package/dist/elements/EFMedia/videoTasks/makeUnifiedVideoSeekTask.d.ts +0 -6
  294. package/dist/elements/EFMedia.browsertest.d.ts +0 -10
  295. package/dist/elements/EFSurface.browsertest.d.ts +0 -0
  296. package/dist/elements/EFTemporal.browsertest.d.ts +0 -22
  297. package/dist/elements/EFThumbnailStrip.browsertest.d.ts +0 -0
  298. package/dist/elements/EFThumbnailStrip.media-engine.browsertest.d.ts +0 -0
  299. package/dist/elements/EFTimegroup.browsertest.d.ts +0 -41
  300. package/dist/elements/EFVideo.browsertest.d.ts +0 -0
  301. package/dist/elements/FetchContext.browsertest.d.ts +0 -0
  302. package/dist/elements/TargetController.browsertest.d.ts +0 -19
  303. package/dist/elements/durationConverter.d.ts +0 -16
  304. package/dist/elements/parseTimeToMs.d.ts +0 -1
  305. package/dist/elements/printTaskStatus.d.ts +0 -2
  306. package/dist/elements/renderTemporalAudio.d.ts +0 -10
  307. package/dist/elements/updateAnimations.browsertest.d.ts +0 -13
  308. package/dist/elements/updateAnimations.d.ts +0 -24
  309. package/dist/elements/util.d.ts +0 -3
  310. package/dist/gui/ContextMixin.browsertest.d.ts +0 -15
  311. package/dist/gui/Controllable.browsertest.d.ts +0 -0
  312. package/dist/gui/EFControls.browsertest.d.ts +0 -11
  313. package/dist/gui/EFDial.browsertest.d.ts +0 -0
  314. package/dist/gui/EFFilmstrip.browsertest.d.ts +0 -11
  315. package/dist/gui/EFPause.browsertest.d.ts +0 -0
  316. package/dist/gui/EFPlay.browsertest.d.ts +0 -0
  317. package/dist/gui/EFResizableBox.browsertest.d.ts +0 -0
  318. package/dist/gui/EFTimeDisplay.browsertest.d.ts +0 -0
  319. package/dist/gui/TWMixin.d.ts +0 -2
  320. package/dist/gui/TargetOrContextMixin.d.ts +0 -10
  321. package/dist/gui/currentTimeContext.d.ts +0 -3
  322. package/dist/gui/durationContext.d.ts +0 -3
  323. package/dist/gui/efContext.d.ts +0 -4
  324. package/dist/gui/fetchContext.d.ts +0 -3
  325. package/dist/gui/focusedElementContext.d.ts +0 -3
  326. package/dist/gui/playingContext.d.ts +0 -6
  327. package/dist/msToTimeCode.d.ts +0 -1
  328. package/dist/otel/BridgeSpanExporter.d.ts +0 -13
  329. package/dist/otel/setupBrowserTracing.d.ts +0 -12
  330. package/dist/style.css +0 -2
  331. package/dist/transcoding/cache/RequestDeduplicator.d.ts +0 -29
  332. package/dist/transcoding/cache/RequestDeduplicator.test.d.ts +0 -1
  333. package/dist/transcoding/cache/URLTokenDeduplicator.d.ts +0 -38
  334. package/dist/transcoding/cache/URLTokenDeduplicator.test.d.ts +0 -1
  335. package/dist/transcoding/utils/MediaUtils.d.ts +0 -9
  336. package/dist/transcoding/utils/constants.d.ts +0 -27
  337. package/dist/utils/LRUCache.d.ts +0 -80
  338. package/dist/utils/LRUCache.test.d.ts +0 -1
  339. /package/dist/{LoadingIndicator.browsertest.d.ts → elements.js} +0 -0
@@ -12,8 +12,10 @@ import { focusContext } from "./focusContext.js";
12
12
  import { focusedElementContext } from "./focusedElementContext.js";
13
13
  import { ContextProvider, consume, createContext, provide } from "@lit/context";
14
14
  import { property, state } from "lit/decorators.js";
15
+
16
+ //#region src/gui/ContextMixin.ts
15
17
  const targetTemporalContext = createContext(Symbol("target-temporal"));
16
- var contextMixinSymbol = Symbol("contextMixin");
18
+ const contextMixinSymbol = Symbol("contextMixin");
17
19
  function isContextMixin(value) {
18
20
  return typeof value === "object" && value !== null && contextMixinSymbol in value.constructor;
19
21
  }
@@ -75,6 +77,11 @@ function ContextMixin(superClass) {
75
77
  return this.#targetTemporal;
76
78
  }
77
79
  #controllerSubscribed = false;
80
+ /**
81
+ * Find the first root temporal element (recursively searches through children)
82
+ * Supports ef-timegroup, ef-video, ef-audio, and any other temporal elements
83
+ * even when they're wrapped in non-temporal elements like divs
84
+ */
78
85
  findRootTemporal() {
79
86
  const findRecursive = (element) => {
80
87
  if (isEFTemporal(element)) return element;
@@ -120,6 +127,15 @@ function ContextMixin(superClass) {
120
127
  break;
121
128
  }
122
129
  };
130
+ /**
131
+ * Generate a cache key for URL token based on signing strategy
132
+ *
133
+ * Uses unified prefix + parameter matching approach:
134
+ * - For transcode URLs: signs base "/api/v1/transcode" + params like {url: "source.mp4"}
135
+ * - For regular URLs: signs full URL with empty params {}
136
+ * - All validation uses prefix matching + exhaustive parameter matching
137
+ * - Multiple transcode segments with same source share one token (reduces round-trips)
138
+ */
123
139
  #getTokenCacheKey(url) {
124
140
  try {
125
141
  const urlObj = new URL(url);
@@ -147,6 +163,11 @@ function ContextMixin(superClass) {
147
163
  };
148
164
  }
149
165
  }
166
+ /**
167
+ * Parse JWT token to extract safe expiration time (with buffer)
168
+ * @param token JWT token string
169
+ * @returns Safe expiration timestamp in milliseconds (actual expiry minus buffer), or 0 if parsing fails
170
+ */
150
171
  #parseTokenExpiration(token) {
151
172
  try {
152
173
  const parts = token.split(".");
@@ -166,6 +187,10 @@ function ContextMixin(superClass) {
166
187
  }
167
188
  }
168
189
  #signingURL;
190
+ /**
191
+ * A URL that will be used to generated signed tokens for accessing media files from the
192
+ * editframe API. This is used to authenticate media requests per-user.
193
+ */
169
194
  get signingURL() {
170
195
  return this.#signingURL ?? this.efConfiguration?.signingURL ?? "";
171
196
  }
@@ -217,6 +242,9 @@ function ContextMixin(superClass) {
217
242
  if (this.targetTemporal) this.targetTemporal.requestUpdate();
218
243
  });
219
244
  });
245
+ /**
246
+ * Update duration properties when temporal element changes
247
+ */
220
248
  updateDurationProperties() {
221
249
  const newDuration = this.targetTemporal?.durationMs ?? 0;
222
250
  const newEndTime = this.targetTemporal?.endTimeMs ?? 0;
@@ -327,4 +355,7 @@ function ContextMixin(superClass) {
327
355
  __decorate([property({ type: Number })], ContextElement.prototype, "currentTimeMs", null);
328
356
  return ContextElement;
329
357
  }
358
+
359
+ //#endregion
330
360
  export { ContextMixin, isContextMixin, targetTemporalContext };
361
+ //# sourceMappingURL=ContextMixin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ContextMixin.js","names":["#getTokenCacheKey","#parseTokenExpiration","#apiHost","#targetTemporal","#onControllerUpdate","#controllerSubscribed","#targetTemporalProvider","#loop","#playingProvider","#loopProvider","#currentTimeMsProvider","#signingURL","#timegroupObserver"],"sources":["../../src/gui/ContextMixin.ts"],"sourcesContent":["import { ContextProvider, consume, createContext, provide } from \"@lit/context\";\nimport type { LitElement } from \"lit\";\nimport { property, state } from \"lit/decorators.js\";\nimport { EF_RENDERING } from \"../EF_RENDERING.ts\";\nimport {\n isEFTemporal,\n type TemporalMixinInterface,\n} from \"../elements/EFTemporal.js\";\nimport { globalURLTokenDeduplicator } from \"../transcoding/cache/URLTokenDeduplicator.js\";\nimport { currentTimeContext } from \"./currentTimeContext.js\";\nimport { durationContext } from \"./durationContext.js\";\nimport {\n type EFConfiguration,\n efConfigurationContext,\n} from \"./EFConfiguration.ts\";\nimport { efContext } from \"./efContext.js\";\nimport { fetchContext } from \"./fetchContext.js\";\nimport { type FocusContext, focusContext } from \"./focusContext.js\";\nimport { focusedElementContext } from \"./focusedElementContext.js\";\nimport { loopContext, playingContext } from \"./playingContext.js\";\n\nexport const targetTemporalContext =\n createContext<TemporalMixinInterface | null>(Symbol(\"target-temporal\"));\n\nexport declare class ContextMixinInterface extends LitElement {\n signingURL?: string;\n apiHost?: string;\n rendering: boolean;\n playing: boolean;\n loop: boolean;\n currentTimeMs: number;\n focusedElement?: HTMLElement;\n targetTemporal: TemporalMixinInterface | null;\n play(): Promise<void>;\n pause(): void;\n}\n\nconst contextMixinSymbol = Symbol(\"contextMixin\");\n\nexport function isContextMixin(value: any): value is ContextMixinInterface {\n return (\n typeof value === \"object\" &&\n value !== null &&\n contextMixinSymbol in value.constructor\n );\n}\n\ntype Constructor<T = {}> = new (...args: any[]) => T;\nexport function ContextMixin<T extends Constructor<LitElement>>(superClass: T) {\n class ContextElement extends superClass {\n static [contextMixinSymbol] = true;\n\n @consume({ context: efConfigurationContext, subscribe: true })\n efConfiguration: EFConfiguration | null = null;\n\n @provide({ context: focusContext })\n focusContext = this as FocusContext;\n\n @provide({ context: focusedElementContext })\n @state()\n focusedElement?: HTMLElement;\n\n #playingProvider!: ContextProvider<typeof playingContext>;\n #loopProvider!: ContextProvider<typeof loopContext>;\n #currentTimeMsProvider!: ContextProvider<typeof currentTimeContext>;\n #targetTemporalProvider!: ContextProvider<typeof targetTemporalContext>;\n\n #loop = false;\n\n #apiHost?: string;\n @property({ type: String, attribute: \"api-host\" })\n get apiHost() {\n return this.#apiHost ?? this.efConfiguration?.apiHost ?? \"\";\n }\n\n set apiHost(value: string) {\n this.#apiHost = value;\n }\n\n @provide({ context: efContext })\n efContext = this;\n\n #targetTemporal: TemporalMixinInterface | null = null;\n\n @state()\n get targetTemporal(): TemporalMixinInterface | null {\n return this.#targetTemporal;\n }\n #controllerSubscribed = false;\n\n /**\n * Find the first root temporal element (recursively searches through children)\n * Supports ef-timegroup, ef-video, ef-audio, and any other temporal elements\n * even when they're wrapped in non-temporal elements like divs\n */\n private findRootTemporal(): TemporalMixinInterface | null {\n const findRecursive = (\n element: Element,\n ): TemporalMixinInterface | null => {\n if (isEFTemporal(element)) {\n return element as TemporalMixinInterface & HTMLElement;\n }\n\n for (const child of element.children) {\n const found = findRecursive(child);\n if (found) return found;\n }\n\n return null;\n };\n\n for (const child of this.children) {\n const found = findRecursive(child);\n if (found) return found;\n }\n\n return null;\n }\n\n set targetTemporal(value: TemporalMixinInterface | null) {\n if (this.#targetTemporal === value) return;\n\n // Unsubscribe from old controller updates\n if (this.#targetTemporal?.playbackController) {\n this.#targetTemporal.playbackController.removeListener(\n this.#onControllerUpdate,\n );\n this.#controllerSubscribed = false;\n }\n\n this.#targetTemporal = value;\n this.#targetTemporalProvider?.setValue(value);\n\n // Sync all provided contexts\n this.requestUpdate(\"targetTemporal\");\n this.requestUpdate(\"playing\");\n this.requestUpdate(\"loop\");\n this.requestUpdate(\"currentTimeMs\");\n\n // If the new targetTemporal has a playbackController, apply stored loop value immediately\n if (value?.playbackController && this.#loop) {\n value.playbackController.setLoop(this.#loop);\n }\n\n // If the new targetTemporal doesn't have a playbackController yet,\n // wait for it to complete its updates (it might be initializing)\n if (value && !value.playbackController) {\n // Wait for the temporal element to initialize\n (value as any).updateComplete?.then(() => {\n if (value === this.#targetTemporal && !this.#controllerSubscribed) {\n this.requestUpdate();\n }\n });\n }\n }\n\n #onControllerUpdate = (\n event: import(\"./PlaybackController.js\").PlaybackControllerUpdateEvent,\n ) => {\n switch (event.property) {\n case \"playing\":\n this.#playingProvider.setValue(event.value as boolean);\n break;\n case \"loop\":\n this.#loopProvider.setValue(event.value as boolean);\n break;\n case \"currentTimeMs\":\n this.#currentTimeMsProvider.setValue(event.value as number);\n break;\n }\n };\n\n // Add reactive properties that depend on the targetTemporal\n @provide({ context: durationContext })\n @property({ type: Number })\n durationMs = 0;\n\n @property({ type: Number })\n endTimeMs = 0;\n\n @provide({ context: fetchContext })\n fetch = async (url: string, init: RequestInit = {}) => {\n init.headers ||= {};\n Object.assign(init.headers, {\n \"Content-Type\": \"application/json\",\n });\n\n if (!EF_RENDERING() && this.signingURL) {\n const { cacheKey, signingPayload } = this.#getTokenCacheKey(url);\n\n // Use global token deduplicator to share tokens across all context providers\n const urlToken = await globalURLTokenDeduplicator.getToken(\n cacheKey,\n async () => {\n try {\n const response = await fetch(this.signingURL, {\n method: \"POST\",\n body: JSON.stringify(signingPayload),\n });\n\n if (response.ok) {\n const tokenData = await response.json();\n return tokenData.token;\n }\n throw new Error(\n `Failed to sign URL: ${url}. SigningURL: ${this.signingURL} ${response.status} ${response.statusText}`,\n );\n } catch (error) {\n console.error(\"ContextMixin urlToken fetch error\", url, error);\n throw error;\n }\n },\n (token: string) => this.#parseTokenExpiration(token),\n );\n\n Object.assign(init.headers, {\n authorization: `Bearer ${urlToken}`,\n });\n } else {\n init.credentials = \"include\";\n }\n\n try {\n return fetch(url, init);\n } catch (error) {\n console.error(\n \"ContextMixin fetch error\",\n url,\n error,\n window.location.href,\n );\n throw error;\n }\n };\n\n // Note: URL token caching is now handled globally via URLTokenDeduplicator\n // Keeping these for any potential backwards compatibility, but they're no longer used\n\n /**\n * Generate a cache key for URL token based on signing strategy\n *\n * Uses unified prefix + parameter matching approach:\n * - For transcode URLs: signs base \"/api/v1/transcode\" + params like {url: \"source.mp4\"}\n * - For regular URLs: signs full URL with empty params {}\n * - All validation uses prefix matching + exhaustive parameter matching\n * - Multiple transcode segments with same source share one token (reduces round-trips)\n */\n #getTokenCacheKey(url: string): {\n cacheKey: string;\n signingPayload: { url: string; params?: Record<string, string> };\n } {\n try {\n const urlObj = new URL(url);\n\n // Check if this is a transcode URL pattern\n if (urlObj.pathname.includes(\"/api/v1/transcode/\")) {\n const urlParam = urlObj.searchParams.get(\"url\");\n if (urlParam) {\n // For transcode URLs, sign the base path + url parameter\n const basePath = `${urlObj.origin}/api/v1/transcode`;\n const cacheKey = `${basePath}?url=${urlParam}`;\n return {\n cacheKey,\n signingPayload: { url: basePath, params: { url: urlParam } },\n };\n }\n }\n\n // For non-transcode URLs, use full URL (existing behavior)\n return {\n cacheKey: url,\n signingPayload: { url },\n };\n } catch {\n // If URL parsing fails, fall back to full URL\n return {\n cacheKey: url,\n signingPayload: { url },\n };\n }\n }\n\n /**\n * Parse JWT token to extract safe expiration time (with buffer)\n * @param token JWT token string\n * @returns Safe expiration timestamp in milliseconds (actual expiry minus buffer), or 0 if parsing fails\n */\n #parseTokenExpiration(token: string): number {\n try {\n // JWT has 3 parts separated by dots: header.payload.signature\n const parts = token.split(\".\");\n if (parts.length !== 3) return 0;\n\n // Decode the payload (second part)\n const payload = parts[1];\n if (!payload) return 0;\n\n const decoded = atob(payload.replace(/-/g, \"+\").replace(/_/g, \"/\"));\n const parsed = JSON.parse(decoded);\n\n // Extract timestamps (in seconds)\n const exp = parsed.exp;\n const iat = parsed.iat;\n if (!exp) return 0;\n\n // Calculate token lifetime and buffer\n const lifetimeSeconds = iat ? exp - iat : 3600; // Default to 1 hour if no iat\n const tenPercentBufferMs = lifetimeSeconds * 0.1 * 1000; // 10% of lifetime in ms\n const fiveMinutesMs = 5 * 60 * 1000; // 5 minutes in ms\n\n // Use whichever buffer is smaller (more conservative)\n const bufferMs = Math.min(fiveMinutesMs, tenPercentBufferMs);\n\n // Return expiration time minus buffer\n return exp * 1000 - bufferMs;\n } catch {\n return 0;\n }\n }\n\n #signingURL?: string;\n /**\n * A URL that will be used to generated signed tokens for accessing media files from the\n * editframe API. This is used to authenticate media requests per-user.\n */\n @property({ type: String, attribute: \"signing-url\" })\n get signingURL() {\n return this.#signingURL ?? this.efConfiguration?.signingURL ?? \"\";\n }\n set signingURL(value: string) {\n this.#signingURL = value;\n }\n\n @property({ type: Boolean, reflect: true })\n get playing(): boolean {\n return this.targetTemporal?.playbackController?.playing ?? false;\n }\n set playing(value: boolean) {\n if (this.targetTemporal?.playbackController) {\n this.targetTemporal.playbackController.setPlaying(value);\n }\n }\n\n @property({ type: Boolean, reflect: true, attribute: \"loop\" })\n get loop(): boolean {\n return this.targetTemporal?.playbackController?.loop ?? this.#loop;\n }\n set loop(value: boolean) {\n const oldValue = this.#loop;\n this.#loop = value;\n if (this.targetTemporal?.playbackController) {\n this.targetTemporal.playbackController.setLoop(value);\n }\n this.requestUpdate(\"loop\", oldValue);\n }\n\n @property({ type: Boolean })\n rendering = false;\n\n @property({ type: Number })\n get currentTimeMs(): number {\n return (\n this.targetTemporal?.playbackController?.currentTimeMs ?? Number.NaN\n );\n }\n set currentTimeMs(value: number) {\n if (this.targetTemporal?.playbackController) {\n this.targetTemporal.playbackController.setCurrentTimeMs(value);\n }\n }\n\n #timegroupObserver = new MutationObserver((mutations) => {\n let shouldUpdate = false;\n\n for (const mutation of mutations) {\n if (mutation.type === \"childList\") {\n const newTemporal = this.findRootTemporal();\n if (newTemporal !== this.targetTemporal) {\n this.targetTemporal = newTemporal;\n shouldUpdate = true;\n } else if (\n mutation.target instanceof Element &&\n isEFTemporal(mutation.target)\n ) {\n // Handle childList changes within existing temporal elements\n shouldUpdate = true;\n }\n } else if (mutation.type === \"attributes\") {\n // Watch for attribute changes that might affect duration\n const durationAffectingAttributes = [\n \"duration\",\n \"mode\",\n \"trimstart\",\n \"trimend\",\n \"sourcein\",\n \"sourceout\",\n ];\n\n if (\n durationAffectingAttributes.includes(\n mutation.attributeName || \"\",\n ) ||\n (mutation.target instanceof Element &&\n isEFTemporal(mutation.target))\n ) {\n shouldUpdate = true;\n }\n }\n }\n\n if (shouldUpdate) {\n // Trigger an update to ensure reactive properties recalculate\n // Use a microtask to ensure DOM updates are complete\n queueMicrotask(() => {\n // Recalculate duration and endTime when temporal element changes\n this.updateDurationProperties();\n this.requestUpdate();\n // Also ensure the targetTemporal updates its computed properties\n if (this.targetTemporal) {\n (this.targetTemporal as any).requestUpdate();\n }\n });\n }\n });\n\n /**\n * Update duration properties when temporal element changes\n */\n updateDurationProperties(): void {\n const newDuration = this.targetTemporal?.durationMs ?? 0;\n const newEndTime = this.targetTemporal?.endTimeMs ?? 0;\n\n if (this.durationMs !== newDuration) {\n this.durationMs = newDuration;\n }\n\n if (this.endTimeMs !== newEndTime) {\n this.endTimeMs = newEndTime;\n }\n }\n\n connectedCallback(): void {\n super.connectedCallback();\n\n // Create manual context providers for playback state\n this.#playingProvider = new ContextProvider(this, {\n context: playingContext,\n initialValue: this.playing,\n });\n this.#loopProvider = new ContextProvider(this, {\n context: loopContext,\n initialValue: this.loop,\n });\n this.#currentTimeMsProvider = new ContextProvider(this, {\n context: currentTimeContext,\n initialValue: this.currentTimeMs,\n });\n this.#targetTemporalProvider = new ContextProvider(this, {\n context: targetTemporalContext,\n initialValue: this.targetTemporal,\n });\n\n // Initialize targetTemporal to first root temporal element\n this.targetTemporal = this.findRootTemporal();\n // Initialize duration properties\n this.updateDurationProperties();\n\n this.#timegroupObserver.observe(this, {\n childList: true,\n subtree: true,\n attributes: true,\n });\n }\n\n disconnectedCallback(): void {\n super.disconnectedCallback();\n this.#timegroupObserver.disconnect();\n\n // Unsubscribe from controller\n if (this.#targetTemporal?.playbackController) {\n this.#targetTemporal.playbackController.removeListener(\n this.#onControllerUpdate,\n );\n this.#controllerSubscribed = false;\n }\n\n this.pause();\n }\n\n updated(changedProperties: Map<string | number | symbol, unknown>) {\n super.updated?.(changedProperties);\n\n // Subscribe to controller when it becomes available\n if (\n !this.#controllerSubscribed &&\n this.#targetTemporal?.playbackController\n ) {\n this.#targetTemporal.playbackController.addListener(\n this.#onControllerUpdate,\n );\n this.#controllerSubscribed = true;\n\n // Apply stored loop value when playbackController becomes available\n if (this.#loop) {\n this.#targetTemporal.playbackController.setLoop(this.#loop);\n }\n\n // Trigger initial sync of context providers\n this.#playingProvider.setValue(this.playing);\n this.#loopProvider.setValue(this.loop);\n this.#currentTimeMsProvider.setValue(this.currentTimeMs);\n }\n }\n\n async play() {\n // If targetTemporal is not set, try to find it now\n // This handles cases where the DOM may not have been fully ready during connectedCallback\n if (!this.targetTemporal) {\n // Wait for any temporal custom elements to be defined\n const potentialTemporalTags = Array.from(this.children)\n .map((el) => el.tagName.toLowerCase())\n .filter((tag) => tag.startsWith(\"ef-\"));\n\n await Promise.all(\n potentialTemporalTags.map((tag) =>\n customElements.whenDefined(tag).catch(() => {}),\n ),\n );\n\n const foundTemporal = this.findRootTemporal();\n if (foundTemporal) {\n this.targetTemporal = foundTemporal;\n // Wait for it to initialize\n await (foundTemporal as any).updateComplete;\n } else {\n console.warn(\"No temporal element found to play\");\n return;\n }\n }\n\n // If playbackController doesn't exist yet, wait for it\n if (!this.targetTemporal.playbackController) {\n await (this.targetTemporal as any).updateComplete;\n // After waiting, check again\n if (!this.targetTemporal.playbackController) {\n console.warn(\"PlaybackController not available for temporal element\");\n return;\n }\n }\n\n this.targetTemporal.playbackController.play();\n }\n\n pause() {\n if (this.targetTemporal?.playbackController) {\n this.targetTemporal.playbackController.pause();\n }\n }\n }\n\n return ContextElement as Constructor<ContextMixinInterface> & T;\n}\n"],"mappings":"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"}
@@ -1,15 +1,14 @@
1
- import { LitElement } from 'lit';
2
- import { TemporalMixinInterface } from '../elements/EFTemporal.js';
3
- import { ContextMixinInterface } from './ContextMixin.js';
4
- export declare class ControllableInterface extends LitElement {
5
- playing: boolean;
6
- loop: boolean;
7
- currentTimeMs: number;
8
- durationMs: number;
9
- play(): void | Promise<void>;
10
- pause(): void;
1
+ import { LitElement } from "lit";
2
+
3
+ //#region src/gui/Controllable.d.ts
4
+ declare class ControllableInterface extends LitElement {
5
+ playing: boolean;
6
+ loop: boolean;
7
+ currentTimeMs: number;
8
+ durationMs: number;
9
+ play(): void | Promise<void>;
10
+ pause(): void;
11
11
  }
12
- export declare function isControllable(value: any): value is ControllableInterface;
13
- export type ControllableElement = ContextMixinInterface | (TemporalMixinInterface & {
14
- playbackController: NonNullable<TemporalMixinInterface["playbackController"]>;
15
- });
12
+ //#endregion
13
+ export { ControllableInterface };
14
+ //# sourceMappingURL=Controllable.d.ts.map
@@ -1,9 +1,14 @@
1
1
  import { isEFTemporal } from "../elements/EFTemporal.js";
2
2
  import { isContextMixin } from "./ContextMixin.js";
3
+
4
+ //#region src/gui/Controllable.ts
3
5
  function isControllable(value) {
4
6
  if (!value || typeof value !== "object") return false;
5
7
  if (isContextMixin(value)) return true;
6
8
  if (isEFTemporal(value)) return value.playbackController !== void 0;
7
9
  return false;
8
10
  }
11
+
12
+ //#endregion
9
13
  export { isControllable };
14
+ //# sourceMappingURL=Controllable.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Controllable.js","names":[],"sources":["../../src/gui/Controllable.ts"],"sourcesContent":["import type { LitElement } from \"lit\";\n\nimport {\n isEFTemporal,\n type TemporalMixinInterface,\n} from \"../elements/EFTemporal.js\";\nimport { type ContextMixinInterface, isContextMixin } from \"./ContextMixin.js\";\n\nexport declare class ControllableInterface extends LitElement {\n playing: boolean;\n loop: boolean;\n currentTimeMs: number;\n durationMs: number;\n play(): void | Promise<void>;\n pause(): void;\n}\n\nexport function isControllable(value: any): value is ControllableInterface {\n if (!value || typeof value !== \"object\") {\n return false;\n }\n\n if (isContextMixin(value)) {\n return true;\n }\n\n if (isEFTemporal(value)) {\n const temporal = value as TemporalMixinInterface;\n return temporal.playbackController !== undefined;\n }\n\n return false;\n}\n\nexport type ControllableElement =\n | ContextMixinInterface\n | (TemporalMixinInterface & {\n playbackController: NonNullable<\n TemporalMixinInterface[\"playbackController\"]\n >;\n });\n"],"mappings":";;;;AAiBA,SAAgB,eAAe,OAA4C;AACzE,KAAI,CAAC,SAAS,OAAO,UAAU,SAC7B,QAAO;AAGT,KAAI,eAAe,MAAM,CACvB,QAAO;AAGT,KAAI,aAAa,MAAM,CAErB,QADiB,MACD,uBAAuB;AAGzC,QAAO"}
@@ -1,17 +1,21 @@
1
- import { LitElement } from 'lit';
2
- export declare const efConfigurationContext: {
3
- __context__: EFConfiguration | null;
4
- };
5
- export declare class EFConfiguration extends LitElement {
6
- static styles: import('lit').CSSResult[];
7
- efConfiguration: this;
8
- apiHost?: string;
9
- signingURL: string;
10
- mediaEngine?: "cloud" | "local";
11
- render(): import('lit-html').TemplateResult<1>;
1
+ import * as lit9 from "lit";
2
+ import { LitElement } from "lit";
3
+ import * as lit_html9 from "lit-html";
4
+
5
+ //#region src/gui/EFConfiguration.d.ts
6
+ declare class EFConfiguration extends LitElement {
7
+ static styles: lit9.CSSResult[];
8
+ efConfiguration: this;
9
+ apiHost?: string;
10
+ signingURL: string;
11
+ mediaEngine?: "cloud" | "local";
12
+ render(): lit_html9.TemplateResult<1>;
12
13
  }
13
14
  declare global {
14
- interface HTMLElementTagNameMap {
15
- "ef-configuration": EFConfiguration;
16
- }
15
+ interface HTMLElementTagNameMap {
16
+ "ef-configuration": EFConfiguration;
17
+ }
17
18
  }
19
+ //#endregion
20
+ export { EFConfiguration };
21
+ //# sourceMappingURL=EFConfiguration.d.ts.map
@@ -2,8 +2,10 @@ import { __decorate } from "../_virtual/_@oxc-project_runtime@0.94.0/helpers/dec
2
2
  import { createContext, provide } from "@lit/context";
3
3
  import { LitElement, css, html } from "lit";
4
4
  import { customElement, property } from "lit/decorators.js";
5
+
6
+ //#region src/gui/EFConfiguration.ts
5
7
  const efConfigurationContext = createContext(Symbol("efConfigurationContext"));
6
- var EFConfiguration = class EFConfiguration$1 extends LitElement {
8
+ let EFConfiguration = class EFConfiguration$1 extends LitElement {
7
9
  constructor(..._args) {
8
10
  super(..._args);
9
11
  this.efConfiguration = this;
@@ -35,4 +37,7 @@ __decorate([property({
35
37
  attribute: "media-engine"
36
38
  })], EFConfiguration.prototype, "mediaEngine", void 0);
37
39
  EFConfiguration = __decorate([customElement("ef-configuration")], EFConfiguration);
40
+
41
+ //#endregion
38
42
  export { EFConfiguration, efConfigurationContext };
43
+ //# sourceMappingURL=EFConfiguration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EFConfiguration.js","names":["EFConfiguration"],"sources":["../../src/gui/EFConfiguration.ts"],"sourcesContent":["import { createContext, provide } from \"@lit/context\";\nimport { css, html, LitElement } from \"lit\";\nimport { customElement, property } from \"lit/decorators.js\";\n\nexport const efConfigurationContext = createContext<EFConfiguration | null>(\n Symbol(\"efConfigurationContext\"),\n);\n\n@customElement(\"ef-configuration\")\nexport class EFConfiguration extends LitElement {\n static styles = [\n css`\n :host {\n display: contents;\n }\n `,\n ];\n\n @provide({ context: efConfigurationContext })\n efConfiguration = this;\n\n @property({ type: String, attribute: \"api-host\" })\n apiHost?: string;\n\n @property({ type: String, attribute: \"signing-url\" })\n signingURL = \"/@ef-sign-url\";\n\n @property({ type: String, attribute: \"media-engine\" })\n mediaEngine?: \"cloud\" | \"local\" = \"cloud\";\n\n render() {\n return html`<slot></slot>`;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"ef-configuration\": EFConfiguration;\n }\n}\n"],"mappings":";;;;;;AAIA,MAAa,yBAAyB,cACpC,OAAO,yBAAyB,CACjC;AAGM,4BAAMA,0BAAwB,WAAW;;;yBAU5B;oBAML;qBAGqB;;;gBAlBlB,CACd,GAAG;;;;MAKJ;;CAcD,SAAS;AACP,SAAO,IAAI;;;YAbZ,QAAQ,EAAE,SAAS,wBAAwB,CAAC;YAG5C,SAAS;CAAE,MAAM;CAAQ,WAAW;CAAY,CAAC;YAGjD,SAAS;CAAE,MAAM;CAAQ,WAAW;CAAe,CAAC;YAGpD,SAAS;CAAE,MAAM;CAAQ,WAAW;CAAgB,CAAC;8BAnBvD,cAAc,mBAAmB"}
@@ -1,10 +1,11 @@
1
- import { LitElement, PropertyValueMap } from 'lit';
2
- import { TemporalMixinInterface } from '../elements/EFTemporal.js';
3
- import { ControllableInterface } from './Controllable.js';
4
- import { FocusContext } from './focusContext.js';
5
- export declare const testContext: {
6
- __context__: string | null;
7
- };
1
+ import { TemporalMixinInterface } from "../elements/EFTemporal.js";
2
+ import { ControllableInterface } from "./Controllable.js";
3
+ import { FocusContext } from "./focusContext.js";
4
+ import * as lit21 from "lit";
5
+ import { LitElement, PropertyValueMap } from "lit";
6
+
7
+ //#region src/gui/EFControls.d.ts
8
+
8
9
  /**
9
10
  * EFControls provides a way to control an ef-preview element that is not a direct ancestor.
10
11
  * It bridges the contexts from a target preview element to its children controls.
@@ -23,30 +24,33 @@ export declare const testContext: {
23
24
  * </ef-controls>
24
25
  * ```
25
26
  */
26
- export declare class EFControls extends LitElement {
27
- #private;
28
- static styles: import('lit').CSSResult;
29
- createRenderRoot(): this;
30
- /**
31
- * The ID of the ef-preview element to control
32
- */
33
- target: string;
34
- /**
35
- * The target element (set by TargetController)
36
- */
37
- targetElement: ControllableInterface | null;
38
- playing: boolean;
39
- loop: boolean;
40
- currentTimeMs: number;
41
- durationMs: number;
42
- targetTemporal: TemporalMixinInterface | null;
43
- focusedElement?: HTMLElement;
44
- focusContext: FocusContext;
45
- updated(changedProperties: PropertyValueMap<this>): void;
46
- disconnectedCallback(): void;
27
+ declare class EFControls extends LitElement {
28
+ #private;
29
+ static styles: lit21.CSSResult;
30
+ createRenderRoot(): this;
31
+ /**
32
+ * The ID of the ef-preview element to control
33
+ */
34
+ target: string;
35
+ /**
36
+ * The target element (set by TargetController)
37
+ */
38
+ targetElement: ControllableInterface | null;
39
+ playing: boolean;
40
+ loop: boolean;
41
+ currentTimeMs: number;
42
+ durationMs: number;
43
+ targetTemporal: TemporalMixinInterface | null;
44
+ focusedElement?: HTMLElement;
45
+ focusContext: FocusContext;
46
+ updated(changedProperties: PropertyValueMap<this>): void;
47
+ disconnectedCallback(): void;
47
48
  }
48
49
  declare global {
49
- interface HTMLElementTagNameMap {
50
- "ef-controls": EFControls;
51
- }
50
+ interface HTMLElementTagNameMap {
51
+ "ef-controls": EFControls;
52
+ }
52
53
  }
54
+ //#endregion
55
+ export { EFControls };
56
+ //# sourceMappingURL=EFControls.d.ts.map
@@ -11,6 +11,8 @@ import { attachContextRoot } from "../attachContextRoot.js";
11
11
  import { createContext, provide } from "@lit/context";
12
12
  import { LitElement, css } from "lit";
13
13
  import { customElement, property, state } from "lit/decorators.js";
14
+
15
+ //#region src/gui/EFControls.ts
14
16
  attachContextRoot();
15
17
  var ContextRequestEvent = class extends Event {
16
18
  constructor(context, contextTarget, callback, subscribe) {
@@ -24,7 +26,7 @@ var ContextRequestEvent = class extends Event {
24
26
  this.subscribe = subscribe ?? false;
25
27
  }
26
28
  };
27
- var proxiedContexts = [
29
+ const proxiedContexts = [
28
30
  [(proxy, value) => proxy.playing = value, playingContext],
29
31
  [(proxy, value) => proxy.loop = value, loopContext],
30
32
  [(proxy, value) => proxy.currentTimeMs = value, currentTimeContext],
@@ -33,8 +35,8 @@ var proxiedContexts = [
33
35
  [(proxy, value) => proxy.focusedElement = value, focusedElementContext],
34
36
  [(proxy, value) => proxy.focusContext.focusedElement = value, focusContext]
35
37
  ];
36
- createContext("test");
37
- var EFControls = class EFControls$1 extends LitElement {
38
+ const testContext = createContext("test");
39
+ let EFControls = class EFControls$1 extends LitElement {
38
40
  constructor(..._args) {
39
41
  super(..._args);
40
42
  this.target = "";
@@ -90,4 +92,7 @@ __decorate([provide({ context: targetTemporalContext }), state()], EFControls.pr
90
92
  __decorate([provide({ context: focusedElementContext }), state()], EFControls.prototype, "focusedElement", void 0);
91
93
  __decorate([provide({ context: focusContext })], EFControls.prototype, "focusContext", void 0);
92
94
  EFControls = __decorate([customElement("ef-controls")], EFControls);
95
+
96
+ //#endregion
93
97
  export { EFControls };
98
+ //# sourceMappingURL=EFControls.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EFControls.js","names":["EFControls","#proxyUnsubscribeMap","#unsubscribe"],"sources":["../../src/gui/EFControls.ts"],"sourcesContent":["import { type Context, createContext, provide } from \"@lit/context\";\nimport { css, LitElement, type PropertyValueMap } from \"lit\";\nimport { customElement, property, state } from \"lit/decorators.js\";\nimport { attachContextRoot } from \"../attachContextRoot.js\";\nimport type { TemporalMixinInterface } from \"../elements/EFTemporal.js\";\nimport { TargetController } from \"../elements/TargetController.js\";\nimport { targetTemporalContext } from \"./ContextMixin.js\";\nimport type { ControllableInterface } from \"./Controllable.js\";\nimport { currentTimeContext } from \"./currentTimeContext.js\";\nimport { durationContext } from \"./durationContext.js\";\nimport { efContext } from \"./efContext.js\";\nimport { type FocusContext, focusContext } from \"./focusContext.js\";\nimport { focusedElementContext } from \"./focusedElementContext.js\";\nimport { loopContext, playingContext } from \"./playingContext.js\";\n\nattachContextRoot();\n\nclass ContextRequestEvent extends Event {\n context: Context<any, any>;\n contextTarget: Element;\n callback: (proxy: EFControls, value: any) => void;\n subscribe: boolean;\n\n constructor(\n context: Context<any, any>,\n contextTarget: Element,\n callback: (proxy: EFControls, value: any) => void,\n subscribe: boolean,\n ) {\n super(\"context-request\", { bubbles: true, composed: true });\n this.context = context;\n this.contextTarget = contextTarget;\n this.callback = callback;\n this.subscribe = subscribe ?? false;\n }\n}\n\nconst proxiedContexts = [\n [\n // biome-ignore lint/suspicious/noAssignInExpressions: Intentional assignment in callback\n (proxy: EFControls, value: boolean) => (proxy.playing = value),\n playingContext,\n ],\n [\n // biome-ignore lint/suspicious/noAssignInExpressions: Intentional assignment in callback\n (proxy: EFControls, value: boolean) => (proxy.loop = value),\n loopContext,\n ],\n [\n // biome-ignore lint/suspicious/noAssignInExpressions: Intentional assignment in callback\n (proxy: EFControls, value: number) => (proxy.currentTimeMs = value),\n currentTimeContext,\n ],\n [\n // biome-ignore lint/suspicious/noAssignInExpressions: Intentional assignment in callback\n (proxy: EFControls, value: number) => (proxy.durationMs = value),\n durationContext,\n ],\n [\n (proxy: EFControls, value: TemporalMixinInterface) =>\n // biome-ignore lint/suspicious/noAssignInExpressions: Intentional assignment in callback\n (proxy.targetTemporal = value),\n targetTemporalContext,\n ],\n [\n // biome-ignore lint/suspicious/noAssignInExpressions: Intentional assignment in callback\n (proxy: EFControls, value: HTMLElement) => (proxy.focusedElement = value),\n focusedElementContext,\n ],\n [\n (proxy: EFControls, value: HTMLElement) =>\n // biome-ignore lint/suspicious/noAssignInExpressions: Intentional assignment in callback\n (proxy.focusContext.focusedElement = value),\n focusContext,\n ],\n] as const;\n\nexport const testContext = createContext<string | null>(\"test\");\n\n/**\n * EFControls provides a way to control an ef-preview element that is not a direct ancestor.\n * It bridges the contexts from a target preview element to its children controls.\n *\n * Usage:\n * ```html\n * <ef-preview id=\"my-preview\">...</ef-preview>\n *\n * <ef-controls target=\"my-preview\">\n * <ef-toggle-play>\n * <button slot=\"play\">Play</button>\n * <button slot=\"pause\">Pause</button>\n * </ef-toggle-play>\n * <ef-scrubber></ef-scrubber>\n * <ef-time-display></ef-time-display>\n * </ef-controls>\n * ```\n */\n@customElement(\"ef-controls\")\nexport class EFControls extends LitElement {\n static styles = css`\n :host {\n display: block;\n }\n `;\n\n createRenderRoot() {\n return this;\n }\n\n /**\n * The ID of the ef-preview element to control\n */\n @property({ type: String })\n target = \"\";\n\n /**\n * The target element (set by TargetController)\n */\n @provide({ context: efContext })\n @state()\n targetElement: ControllableInterface | null = null;\n\n @provide({ context: playingContext })\n @state()\n playing = false;\n\n @provide({ context: loopContext })\n @state()\n loop = false;\n\n @provide({ context: currentTimeContext })\n @state()\n currentTimeMs = 0;\n\n @provide({ context: durationContext })\n @state()\n durationMs = 0;\n\n @provide({ context: targetTemporalContext })\n @state()\n targetTemporal: TemporalMixinInterface | null = null;\n\n @provide({ context: focusedElementContext })\n @state()\n focusedElement?: HTMLElement;\n\n @provide({ context: focusContext })\n focusContext = this as FocusContext;\n\n // @ts-expect-error controller is intentionally not referenced directly\n // biome-ignore lint/correctness/noUnusedPrivateClassMembers: Used for side effects\n #targetController = new TargetController(this);\n\n #proxyUnsubscribeMap = new Map<Context<any, any>, () => void>();\n\n #unsubscribe() {\n for (const unsubscribe of this.#proxyUnsubscribeMap.values()) {\n unsubscribe();\n }\n this.#proxyUnsubscribeMap.clear();\n }\n\n updated(changedProperties: PropertyValueMap<this>) {\n super.updated(changedProperties);\n if (changedProperties.has(\"targetElement\")) {\n this.#unsubscribe();\n\n if (this.targetElement) {\n for (const [callback, context] of proxiedContexts) {\n const event = new ContextRequestEvent(\n context,\n this,\n (value, unsubscribe) => {\n callback(this, value as never);\n this.#proxyUnsubscribeMap.set(context, unsubscribe);\n },\n true,\n );\n this.targetElement.dispatchEvent(event);\n }\n }\n }\n }\n\n disconnectedCallback() {\n super.disconnectedCallback();\n this.#unsubscribe();\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"ef-controls\": EFControls;\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;AAeA,mBAAmB;AAEnB,IAAM,sBAAN,cAAkC,MAAM;CAMtC,YACE,SACA,eACA,UACA,WACA;AACA,QAAM,mBAAmB;GAAE,SAAS;GAAM,UAAU;GAAM,CAAC;AAC3D,OAAK,UAAU;AACf,OAAK,gBAAgB;AACrB,OAAK,WAAW;AAChB,OAAK,YAAY,aAAa;;;AAIlC,MAAM,kBAAkB;CACtB,EAEG,OAAmB,UAAoB,MAAM,UAAU,OACxD,eACD;CACD,EAEG,OAAmB,UAAoB,MAAM,OAAO,OACrD,YACD;CACD,EAEG,OAAmB,UAAmB,MAAM,gBAAgB,OAC7D,mBACD;CACD,EAEG,OAAmB,UAAmB,MAAM,aAAa,OAC1D,gBACD;CACD,EACG,OAAmB,UAEjB,MAAM,iBAAiB,OAC1B,sBACD;CACD,EAEG,OAAmB,UAAwB,MAAM,iBAAiB,OACnE,sBACD;CACD,EACG,OAAmB,UAEjB,MAAM,aAAa,iBAAiB,OACvC,aACD;CACF;AAED,MAAa,cAAc,cAA6B,OAAO;AAqBxD,uBAAMA,qBAAmB,WAAW;;;gBAehC;uBAOqC;iBAIpC;cAIH;uBAIS;oBAIH;wBAImC;sBAOjC;;;gBAhDC,GAAG;;;;;;CAMnB,mBAAmB;AACjB,SAAO;;CA6CT,oBAAoB,IAAI,iBAAiB,KAAK;CAE9C,uCAAuB,IAAI,KAAoC;CAE/D,eAAe;AACb,OAAK,MAAM,eAAe,MAAKC,oBAAqB,QAAQ,CAC1D,cAAa;AAEf,QAAKA,oBAAqB,OAAO;;CAGnC,QAAQ,mBAA2C;AACjD,QAAM,QAAQ,kBAAkB;AAChC,MAAI,kBAAkB,IAAI,gBAAgB,EAAE;AAC1C,SAAKC,aAAc;AAEnB,OAAI,KAAK,cACP,MAAK,MAAM,CAAC,UAAU,YAAY,iBAAiB;IACjD,MAAM,QAAQ,IAAI,oBAChB,SACA,OACC,OAAO,gBAAgB;AACtB,cAAS,MAAM,MAAe;AAC9B,WAAKD,oBAAqB,IAAI,SAAS,YAAY;OAErD,KACD;AACD,SAAK,cAAc,cAAc,MAAM;;;;CAM/C,uBAAuB;AACrB,QAAM,sBAAsB;AAC5B,QAAKC,aAAc;;;YA1EpB,SAAS,EAAE,MAAM,QAAQ,CAAC;YAM1B,QAAQ,EAAE,SAAS,WAAW,CAAC,EAC/B,OAAO;YAGP,QAAQ,EAAE,SAAS,gBAAgB,CAAC,EACpC,OAAO;YAGP,QAAQ,EAAE,SAAS,aAAa,CAAC,EACjC,OAAO;YAGP,QAAQ,EAAE,SAAS,oBAAoB,CAAC,EACxC,OAAO;YAGP,QAAQ,EAAE,SAAS,iBAAiB,CAAC,EACrC,OAAO;YAGP,QAAQ,EAAE,SAAS,uBAAuB,CAAC,EAC3C,OAAO;YAGP,QAAQ,EAAE,SAAS,uBAAuB,CAAC,EAC3C,OAAO;YAGP,QAAQ,EAAE,SAAS,cAAc,CAAC;yBAjDpC,cAAc,cAAc"}
@@ -1,18 +1,25 @@
1
- import { LitElement } from 'lit';
2
- export interface DialChangeDetail {
3
- value: number;
1
+ import * as lit20 from "lit";
2
+ import { LitElement } from "lit";
3
+ import * as lit_html18 from "lit-html";
4
+
5
+ //#region src/gui/EFDial.d.ts
6
+ interface DialChangeDetail {
7
+ value: number;
4
8
  }
5
- export declare class EFDial extends LitElement {
6
- set value(newValue: number);
7
- get value(): number;
8
- private _value;
9
- private isDragging;
10
- private dragStartAngle;
11
- private dragStartValue;
12
- static styles: import('lit').CSSResult;
13
- private getAngleFromPoint;
14
- private handlePointerDown;
15
- private handlePointerMove;
16
- private handlePointerUp;
17
- render(): import('lit-html').TemplateResult<1>;
9
+ declare class EFDial extends LitElement {
10
+ set value(newValue: number);
11
+ get value(): number;
12
+ private _value;
13
+ private isDragging;
14
+ private dragStartAngle;
15
+ private dragStartValue;
16
+ static styles: lit20.CSSResult;
17
+ private getAngleFromPoint;
18
+ private handlePointerDown;
19
+ private handlePointerMove;
20
+ private handlePointerUp;
21
+ render(): lit_html18.TemplateResult<1>;
18
22
  }
23
+ //#endregion
24
+ export { DialChangeDetail, EFDial };
25
+ //# sourceMappingURL=EFDial.d.ts.map
@@ -2,7 +2,9 @@ import { __decorate } from "../_virtual/_@oxc-project_runtime@0.94.0/helpers/dec
2
2
  import { LitElement, css, html } from "lit";
3
3
  import { customElement, property, state } from "lit/decorators.js";
4
4
  import { styleMap } from "lit/directives/style-map.js";
5
- var EFDial = class EFDial$1 extends LitElement {
5
+
6
+ //#region src/gui/EFDial.ts
7
+ let EFDial = class EFDial$1 extends LitElement {
6
8
  constructor(..._args) {
7
9
  super(..._args);
8
10
  this._value = 0;
@@ -138,4 +140,7 @@ var EFDial = class EFDial$1 extends LitElement {
138
140
  __decorate([property({ type: Number })], EFDial.prototype, "value", null);
139
141
  __decorate([state()], EFDial.prototype, "isDragging", void 0);
140
142
  EFDial = __decorate([customElement("ef-dial")], EFDial);
143
+
144
+ //#endregion
141
145
  export { EFDial };
146
+ //# sourceMappingURL=EFDial.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EFDial.js","names":["EFDial"],"sources":["../../src/gui/EFDial.ts"],"sourcesContent":["import { css, html, LitElement } from \"lit\";\nimport { customElement, property, state } from \"lit/decorators.js\";\nimport { styleMap } from \"lit/directives/style-map.js\";\n\nexport interface DialChangeDetail {\n value: number;\n}\n\n@customElement(\"ef-dial\")\nexport class EFDial extends LitElement {\n @property({ type: Number })\n set value(newValue: number) {\n // Normalize to 0-360 range\n newValue = newValue % 360;\n if (newValue < 0) {\n newValue += 360;\n }\n // Limit to 6 significant digits\n newValue = Number.parseFloat(newValue.toPrecision(6));\n\n const oldValue = this._value;\n this._value = newValue;\n this.requestUpdate(\"value\", oldValue);\n }\n\n get value() {\n return this._value;\n }\n\n private _value = 0;\n\n @state()\n private isDragging = false;\n\n private dragStartAngle = 0;\n private dragStartValue = 0;\n\n static styles = css`\n :host {\n display: inline-block;\n width: 200px; /* Default size, can be overridden by CSS */\n height: 200px; /* Default size, can be overridden by CSS */\n }\n .dial-container {\n position: relative;\n width: 100%;\n height: 100%;\n border-radius: 50%;\n background-color: #f3f4f6;\n border: 2px solid #d1d5db;\n }\n .handle {\n position: absolute;\n width: 16px;\n height: 16px;\n border-radius: 50%;\n border: 2px solid #3b82f6;\n background-color: white;\n cursor: grab;\n }\n .handle.dragging {\n background-color: #3b82f6;\n cursor: grabbing;\n }\n .center-text {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n background-color: white;\n border: 1px solid #d1d5db;\n padding: 2px 4px;\n border-radius: 4px;\n font-family: monospace;\n font-size: 12px;\n }\n `;\n\n private getAngleFromPoint(clientX: number, clientY: number, rect: DOMRect) {\n const center = this.clientWidth / 2;\n const x = clientX - rect.left - center;\n const y = clientY - rect.top - center;\n return Math.atan2(y, x);\n }\n\n private handlePointerDown(e: PointerEvent) {\n e.preventDefault();\n this.isDragging = true;\n const rect = this.getBoundingClientRect();\n this.dragStartAngle = this.getAngleFromPoint(e.clientX, e.clientY, rect);\n this.dragStartValue = this.value;\n this.setPointerCapture(e.pointerId);\n this.addEventListener(\"pointermove\", this.handlePointerMove);\n this.addEventListener(\"pointerup\", this.handlePointerUp);\n }\n\n private handlePointerMove(e: PointerEvent) {\n if (!this.isDragging) return;\n\n const rect = this.getBoundingClientRect();\n const currentAngle = this.getAngleFromPoint(e.clientX, e.clientY, rect);\n const angleDelta = currentAngle - this.dragStartAngle;\n\n let newValue = this.dragStartValue + (angleDelta * 180) / Math.PI;\n\n if (e.shiftKey) {\n newValue = Math.round(newValue / 15) * 15;\n }\n\n // Normalize to 0-360 range\n newValue = newValue % 360;\n if (newValue < 0) {\n newValue += 360;\n }\n\n // Limit to 6 significant digits\n newValue = Number.parseFloat(newValue.toPrecision(6));\n\n this.value = newValue;\n this.dispatchEvent(\n new CustomEvent<DialChangeDetail>(\"change\", {\n detail: { value: this.value },\n }),\n );\n }\n\n private handlePointerUp(e: PointerEvent) {\n this.isDragging = false;\n this.releasePointerCapture(e.pointerId);\n this.removeEventListener(\"pointermove\", this.handlePointerMove);\n this.removeEventListener(\"pointerup\", this.handlePointerUp);\n }\n\n render() {\n const center = this.clientWidth / 2;\n const radius = center - 20;\n const handleAngle = (this.value * Math.PI) / 180;\n const handleX = center + Math.cos(handleAngle) * radius;\n const handleY = center + Math.sin(handleAngle) * radius;\n\n const handleStyles = {\n left: `${handleX - 8}px`,\n top: `${handleY - 8}px`,\n };\n\n return html`\n <div class=\"dial-container\" @pointerdown=${this.handlePointerDown}>\n <svg class=\"absolute inset-0 w-full h-full\">\n <circle\n cx=${center}\n cy=${center}\n r=${radius}\n fill=\"none\"\n stroke=\"#94a3b8\"\n stroke-width=\"2\"\n stroke-dasharray=\"4 4\"\n />\n ${[0, 90, 180, 270].map((deg) => {\n const angle = (deg * Math.PI) / 180;\n const x1 = center + Math.cos(angle) * (radius - 8);\n const y1 = center + Math.sin(angle) * (radius - 8);\n const x2 = center + Math.cos(angle) * (radius + 8);\n const y2 = center + Math.sin(angle) * (radius + 8);\n return html`<line x1=${x1} y1=${y1} x2=${x2} y2=${y2} stroke=\"#64748b\" stroke-width=\"2\" />`;\n })}\n </svg>\n <div class=\"handle ${this.isDragging ? \"dragging\" : \"\"}\" style=${styleMap(handleStyles)}></div>\n <div class=\"center-text\">${this.value.toFixed(0)}°</div>\n </div>\n `;\n }\n}\n"],"mappings":"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"}