@r2digisolutions/components 0.1.7 → 0.3.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 (350) hide show
  1. package/dist/components/atoms/IconButton/IconButton.svelte +1 -1
  2. package/dist/components/atoms/MediaKindIcon/MediaKindIcon.stories.js +8 -0
  3. package/dist/components/atoms/MediaKindIcon/MediaKindIcon.svelte +122 -0
  4. package/dist/components/atoms/MediaKindIcon/MediaKindIcon.svelte.d.ts +11 -0
  5. package/dist/components/atoms/MediaKindIcon/MediaKindIconStory.svelte +12 -0
  6. package/dist/components/atoms/MediaKindIcon/MediaKindIconStory.svelte.d.ts +18 -0
  7. package/dist/components/atoms/PanKnob/PanKnob.stories.d.ts +9 -0
  8. package/dist/components/atoms/PanKnob/PanKnob.stories.js +8 -0
  9. package/dist/components/atoms/PanKnob/PanKnob.svelte +218 -0
  10. package/dist/components/atoms/PanKnob/PanKnob.svelte.d.ts +19 -0
  11. package/dist/components/atoms/PanKnob/PanKnobStory.svelte +15 -0
  12. package/dist/components/atoms/PanKnob/PanKnobStory.svelte.d.ts +3 -0
  13. package/dist/components/atoms/Playhead/Playhead.stories.js +8 -0
  14. package/dist/components/atoms/Playhead/Playhead.svelte +98 -0
  15. package/dist/components/atoms/Playhead/Playhead.svelte.d.ts +21 -0
  16. package/dist/components/atoms/Playhead/PlayheadStory.svelte +9 -0
  17. package/dist/components/atoms/Playhead/PlayheadStory.svelte.d.ts +18 -0
  18. package/dist/components/atoms/TimeRuler/TimeRuler.stories.js +8 -0
  19. package/dist/components/atoms/TimeRuler/TimeRuler.svelte +117 -0
  20. package/dist/components/atoms/TimeRuler/TimeRuler.svelte.d.ts +17 -0
  21. package/dist/components/atoms/TimeRuler/TimeRulerStory.svelte +7 -0
  22. package/dist/components/atoms/TimeRuler/TimeRulerStory.svelte.d.ts +18 -0
  23. package/dist/components/atoms/TimelineGrid/TimelineGrid.stories.js +8 -0
  24. package/dist/components/atoms/TimelineGrid/TimelineGrid.svelte +39 -0
  25. package/dist/components/atoms/TimelineGrid/TimelineGrid.svelte.d.ts +11 -0
  26. package/dist/components/atoms/TimelineGrid/TimelineGridStory.svelte +7 -0
  27. package/dist/components/atoms/TimelineGrid/TimelineGridStory.svelte.d.ts +18 -0
  28. package/dist/components/atoms/Tooltip/Tooltip.svelte +1 -1
  29. package/dist/components/atoms/TrimHandle/TrimHandle.stories.js +8 -0
  30. package/dist/components/atoms/TrimHandle/TrimHandle.svelte +63 -0
  31. package/dist/components/atoms/TrimHandle/TrimHandle.svelte.d.ts +12 -0
  32. package/dist/components/atoms/TrimHandle/TrimHandleStory.svelte +11 -0
  33. package/dist/components/atoms/TrimHandle/TrimHandleStory.svelte.d.ts +18 -0
  34. package/dist/components/molecules/AiAssistPanel/AiAssistPanel.stories.d.ts +9 -0
  35. package/dist/components/molecules/AiAssistPanel/AiAssistPanel.stories.js +8 -0
  36. package/dist/components/molecules/AiAssistPanel/AiAssistPanel.svelte +102 -0
  37. package/dist/components/molecules/AiAssistPanel/AiAssistPanel.svelte.d.ts +20 -0
  38. package/dist/components/molecules/AiAssistPanel/AiAssistPanelStory.svelte +34 -0
  39. package/dist/components/molecules/AiAssistPanel/AiAssistPanelStory.svelte.d.ts +3 -0
  40. package/dist/components/molecules/BulkActionBar/BulkActionBar.svelte +97 -61
  41. package/dist/components/molecules/BulkActionBar/BulkActionBar.svelte.d.ts +2 -0
  42. package/dist/components/molecules/BulkEditPanel/BulkEditPanel.stories.js +8 -0
  43. package/dist/components/molecules/BulkEditPanel/BulkEditPanel.svelte +117 -0
  44. package/dist/components/molecules/BulkEditPanel/BulkEditPanel.svelte.d.ts +23 -0
  45. package/dist/components/molecules/BulkEditPanel/BulkEditPanelStory.svelte +18 -0
  46. package/dist/components/molecules/BulkEditPanel/BulkEditPanelStory.svelte.d.ts +18 -0
  47. package/dist/components/molecules/CanvasElementsPanel/CanvasElementsPanel.stories.js +8 -0
  48. package/dist/components/molecules/CanvasElementsPanel/CanvasElementsPanel.svelte +858 -0
  49. package/dist/components/molecules/CanvasElementsPanel/CanvasElementsPanel.svelte.d.ts +43 -0
  50. package/dist/components/molecules/CanvasElementsPanel/CanvasElementsPanelStory.svelte +7 -0
  51. package/dist/components/molecules/CanvasElementsPanel/CanvasElementsPanelStory.svelte.d.ts +18 -0
  52. package/dist/components/molecules/CanvasInspector/CanvasInspector.stories.d.ts +9 -0
  53. package/dist/components/molecules/CanvasInspector/CanvasInspector.stories.js +8 -0
  54. package/dist/components/molecules/CanvasInspector/CanvasInspector.svelte +1140 -0
  55. package/dist/components/molecules/CanvasInspector/CanvasInspector.svelte.d.ts +28 -0
  56. package/dist/components/molecules/CanvasInspector/CanvasInspectorStory.svelte +20 -0
  57. package/dist/components/molecules/CanvasInspector/CanvasInspectorStory.svelte.d.ts +3 -0
  58. package/dist/components/molecules/ColorPicker/ColorPicker.svelte +46 -5
  59. package/dist/components/molecules/ColorPicker/ColorPicker.svelte.d.ts +2 -0
  60. package/dist/components/molecules/ColumnVisibilityMenu/ColumnVisibilityMenu.stories.d.ts +9 -0
  61. package/dist/components/molecules/ColumnVisibilityMenu/ColumnVisibilityMenu.stories.js +8 -0
  62. package/dist/components/molecules/ColumnVisibilityMenu/ColumnVisibilityMenu.svelte +108 -0
  63. package/dist/components/molecules/ColumnVisibilityMenu/ColumnVisibilityMenu.svelte.d.ts +18 -0
  64. package/dist/components/molecules/ColumnVisibilityMenu/ColumnVisibilityMenuStory.svelte +15 -0
  65. package/dist/components/molecules/ColumnVisibilityMenu/ColumnVisibilityMenuStory.svelte.d.ts +3 -0
  66. package/dist/components/molecules/ConflictResolver/ConflictResolver.stories.js +8 -0
  67. package/dist/components/molecules/ConflictResolver/ConflictResolver.svelte +73 -0
  68. package/dist/components/molecules/ConflictResolver/ConflictResolver.svelte.d.ts +16 -0
  69. package/dist/components/molecules/ConflictResolver/ConflictResolverStory.svelte +11 -0
  70. package/dist/components/molecules/ConflictResolver/ConflictResolverStory.svelte.d.ts +18 -0
  71. package/dist/components/molecules/ContextMenu/ContextMenu.svelte +237 -66
  72. package/dist/components/molecules/ContextMenu/ContextMenu.svelte.d.ts +9 -0
  73. package/dist/components/molecules/ExpressionEditor/ExpressionEditor.stories.d.ts +9 -0
  74. package/dist/components/molecules/ExpressionEditor/ExpressionEditor.stories.js +8 -0
  75. package/dist/components/molecules/ExpressionEditor/ExpressionEditor.svelte +56 -0
  76. package/dist/components/molecules/ExpressionEditor/ExpressionEditor.svelte.d.ts +12 -0
  77. package/dist/components/molecules/ExpressionEditor/ExpressionEditorStory.svelte +12 -0
  78. package/dist/components/molecules/ExpressionEditor/ExpressionEditorStory.svelte.d.ts +3 -0
  79. package/dist/components/molecules/FilterList/FilterList.stories.d.ts +9 -0
  80. package/dist/components/molecules/FilterList/FilterList.stories.js +8 -0
  81. package/dist/components/molecules/FilterList/FilterList.svelte +101 -0
  82. package/dist/components/molecules/FilterList/FilterList.svelte.d.ts +18 -0
  83. package/dist/components/molecules/FilterList/FilterListStory.svelte +31 -0
  84. package/dist/components/molecules/FilterList/FilterListStory.svelte.d.ts +3 -0
  85. package/dist/components/molecules/MediaAssetBrowser/MediaAssetBrowser.stories.d.ts +9 -0
  86. package/dist/components/molecules/MediaAssetBrowser/MediaAssetBrowser.stories.js +8 -0
  87. package/dist/components/molecules/MediaAssetBrowser/MediaAssetBrowser.svelte +109 -0
  88. package/dist/components/molecules/MediaAssetBrowser/MediaAssetBrowser.svelte.d.ts +20 -0
  89. package/dist/components/molecules/MediaAssetBrowser/MediaAssetBrowserStory.svelte +18 -0
  90. package/dist/components/molecules/MediaAssetBrowser/MediaAssetBrowserStory.svelte.d.ts +3 -0
  91. package/dist/components/molecules/MediaAssetCard/MediaAssetCard.stories.js +8 -0
  92. package/dist/components/molecules/MediaAssetCard/MediaAssetCard.svelte +50 -0
  93. package/dist/components/molecules/MediaAssetCard/MediaAssetCard.svelte.d.ts +11 -0
  94. package/dist/components/molecules/MediaAssetCard/MediaAssetCardStory.svelte +13 -0
  95. package/dist/components/molecules/MediaAssetCard/MediaAssetCardStory.svelte.d.ts +18 -0
  96. package/dist/components/molecules/MediaLayerItem/MediaLayerItem.stories.js +8 -0
  97. package/dist/components/molecules/MediaLayerItem/MediaLayerItem.svelte +380 -0
  98. package/dist/components/molecules/MediaLayerItem/MediaLayerItem.svelte.d.ts +33 -0
  99. package/dist/components/molecules/MediaLayerItem/MediaLayerItemStory.svelte +14 -0
  100. package/dist/components/molecules/MediaLayerItem/MediaLayerItemStory.svelte.d.ts +18 -0
  101. package/dist/components/molecules/MediaLayerList/MediaLayerList.stories.d.ts +9 -0
  102. package/dist/components/molecules/MediaLayerList/MediaLayerList.stories.js +8 -0
  103. package/dist/components/molecules/MediaLayerList/MediaLayerList.svelte +399 -0
  104. package/dist/components/molecules/MediaLayerList/MediaLayerList.svelte.d.ts +37 -0
  105. package/dist/components/molecules/MediaLayerList/MediaLayerListStory.svelte +24 -0
  106. package/dist/components/molecules/MediaLayerList/MediaLayerListStory.svelte.d.ts +3 -0
  107. package/dist/components/molecules/MediaStage/MediaStage.stories.d.ts +9 -0
  108. package/dist/components/molecules/MediaStage/MediaStage.stories.js +8 -0
  109. package/dist/components/molecules/MediaStage/MediaStage.svelte +1498 -0
  110. package/dist/components/molecules/MediaStage/MediaStage.svelte.d.ts +45 -0
  111. package/dist/components/molecules/MediaStage/MediaStageStory.svelte +35 -0
  112. package/dist/components/molecules/MediaStage/MediaStageStory.svelte.d.ts +3 -0
  113. package/dist/components/molecules/MediaTimeline/MediaTimeline.stories.d.ts +9 -0
  114. package/dist/components/molecules/MediaTimeline/MediaTimeline.stories.js +8 -0
  115. package/dist/components/molecules/MediaTimeline/MediaTimeline.svelte +441 -0
  116. package/dist/components/molecules/MediaTimeline/MediaTimeline.svelte.d.ts +39 -0
  117. package/dist/components/molecules/MediaTimeline/MediaTimelineStory.svelte +20 -0
  118. package/dist/components/molecules/MediaTimeline/MediaTimelineStory.svelte.d.ts +3 -0
  119. package/dist/components/molecules/MixerChannel/MixerChannel.stories.d.ts +9 -0
  120. package/dist/components/molecules/MixerChannel/MixerChannel.stories.js +8 -0
  121. package/dist/components/molecules/MixerChannel/MixerChannel.svelte +92 -0
  122. package/dist/components/molecules/MixerChannel/MixerChannel.svelte.d.ts +11 -0
  123. package/dist/components/molecules/MixerChannel/MixerChannelStory.svelte +13 -0
  124. package/dist/components/molecules/MixerChannel/MixerChannelStory.svelte.d.ts +3 -0
  125. package/dist/components/molecules/NodeGraph/GraphBlueprintNode.svelte +454 -0
  126. package/dist/components/molecules/NodeGraph/GraphBlueprintNode.svelte.d.ts +8 -0
  127. package/dist/components/molecules/NodeGraph/GraphFlowBridge.svelte +26 -0
  128. package/dist/components/molecules/NodeGraph/GraphFlowBridge.svelte.d.ts +22 -0
  129. package/dist/components/molecules/NodeGraph/NodeGraph.stories.d.ts +12 -0
  130. package/dist/components/molecules/NodeGraph/NodeGraph.stories.js +9 -0
  131. package/dist/components/molecules/NodeGraph/NodeGraph.svelte +1409 -0
  132. package/dist/components/molecules/NodeGraph/NodeGraph.svelte.d.ts +33 -0
  133. package/dist/components/molecules/NodeGraph/NodeGraphStory.svelte +90 -0
  134. package/dist/components/molecules/NodeGraph/NodeGraphStory.svelte.d.ts +3 -0
  135. package/dist/components/molecules/NodePalette/NodePalette.stories.js +8 -0
  136. package/dist/components/molecules/NodePalette/NodePalette.svelte +86 -0
  137. package/dist/components/molecules/NodePalette/NodePalette.svelte.d.ts +11 -0
  138. package/dist/components/molecules/NodePalette/NodePaletteStory.svelte +11 -0
  139. package/dist/components/molecules/NodePalette/NodePaletteStory.svelte.d.ts +18 -0
  140. package/dist/components/molecules/PdfViewer/PdfViewer.svelte.d.ts +1 -1
  141. package/dist/components/molecules/Poll/Poll.stories.d.ts +1 -1
  142. package/dist/components/molecules/ProgramMonitor/ProgramMonitor.stories.js +8 -0
  143. package/dist/components/molecules/ProgramMonitor/ProgramMonitor.svelte +794 -0
  144. package/dist/components/molecules/ProgramMonitor/ProgramMonitor.svelte.d.ts +25 -0
  145. package/dist/components/molecules/ProgramMonitor/ProgramMonitorStory.svelte +16 -0
  146. package/dist/components/molecules/ProgramMonitor/ProgramMonitorStory.svelte.d.ts +18 -0
  147. package/dist/components/molecules/PropertyField/PropertyField.svelte +57 -3
  148. package/dist/components/molecules/PropertyField/PropertyField.svelte.d.ts +10 -0
  149. package/dist/components/molecules/PropertyField/PropertyFieldStory.svelte +21 -0
  150. package/dist/components/molecules/PropertyGroup/PropertyGroup.svelte +1 -1
  151. package/dist/components/molecules/QueryBuilder/QueryBuilder.stories.d.ts +9 -0
  152. package/dist/components/molecules/QueryBuilder/QueryBuilder.stories.js +8 -0
  153. package/dist/components/molecules/QueryBuilder/QueryBuilder.svelte +52 -0
  154. package/dist/components/molecules/QueryBuilder/QueryBuilder.svelte.d.ts +18 -0
  155. package/dist/components/molecules/QueryBuilder/QueryBuilderStory.svelte +62 -0
  156. package/dist/components/molecules/QueryBuilder/QueryBuilderStory.svelte.d.ts +3 -0
  157. package/dist/components/molecules/RelationPicker/RelationPicker.stories.d.ts +9 -0
  158. package/dist/components/molecules/RelationPicker/RelationPicker.stories.js +8 -0
  159. package/dist/components/molecules/RelationPicker/RelationPicker.svelte +180 -0
  160. package/dist/components/molecules/RelationPicker/RelationPicker.svelte.d.ts +24 -0
  161. package/dist/components/molecules/RelationPicker/RelationPickerStory.svelte +16 -0
  162. package/dist/components/molecules/RelationPicker/RelationPickerStory.svelte.d.ts +3 -0
  163. package/dist/components/molecules/SchemaFieldBuilder/SchemaFieldBuilder.stories.d.ts +9 -0
  164. package/dist/components/molecules/SchemaFieldBuilder/SchemaFieldBuilder.stories.js +8 -0
  165. package/dist/components/molecules/SchemaFieldBuilder/SchemaFieldBuilder.svelte +154 -0
  166. package/dist/components/molecules/SchemaFieldBuilder/SchemaFieldBuilder.svelte.d.ts +12 -0
  167. package/dist/components/molecules/SchemaFieldBuilder/SchemaFieldBuilderStory.svelte +16 -0
  168. package/dist/components/molecules/SchemaFieldBuilder/SchemaFieldBuilderStory.svelte.d.ts +3 -0
  169. package/dist/components/molecules/SecretField/SecretField.stories.d.ts +9 -0
  170. package/dist/components/molecules/SecretField/SecretField.stories.js +8 -0
  171. package/dist/components/molecules/SecretField/SecretField.svelte +58 -0
  172. package/dist/components/molecules/SecretField/SecretField.svelte.d.ts +15 -0
  173. package/dist/components/molecules/SecretField/SecretFieldStory.svelte +8 -0
  174. package/dist/components/molecules/SecretField/SecretFieldStory.svelte.d.ts +3 -0
  175. package/dist/components/molecules/SplitPane/SplitPane.svelte +99 -40
  176. package/dist/components/molecules/SplitPane/SplitPane.svelte.d.ts +10 -2
  177. package/dist/components/molecules/TableToolbar/TableToolbar.svelte.d.ts +1 -1
  178. package/dist/components/molecules/Terminal/Terminal.stories.js +20 -0
  179. package/dist/components/molecules/Terminal/Terminal.svelte +238 -0
  180. package/dist/components/molecules/Terminal/Terminal.svelte.d.ts +19 -0
  181. package/dist/components/molecules/Terminal/TerminalStory.svelte +47 -0
  182. package/dist/components/molecules/Terminal/TerminalStory.svelte.d.ts +6 -0
  183. package/dist/components/molecules/TimelineClip/TimelineClip.stories.js +8 -0
  184. package/dist/components/molecules/TimelineClip/TimelineClip.svelte +193 -0
  185. package/dist/components/molecules/TimelineClip/TimelineClip.svelte.d.ts +18 -0
  186. package/dist/components/molecules/TimelineClip/TimelineClipStory.svelte +18 -0
  187. package/dist/components/molecules/TimelineClip/TimelineClipStory.svelte.d.ts +18 -0
  188. package/dist/components/molecules/TimelineTrack/TimelineTrack.stories.js +8 -0
  189. package/dist/components/molecules/TimelineTrack/TimelineTrack.svelte +126 -0
  190. package/dist/components/molecules/TimelineTrack/TimelineTrack.svelte.d.ts +27 -0
  191. package/dist/components/molecules/TimelineTrack/TimelineTrackStory.svelte +35 -0
  192. package/dist/components/molecules/TimelineTrack/TimelineTrackStory.svelte.d.ts +18 -0
  193. package/dist/components/molecules/TraceWaterfall/TraceWaterfall.stories.js +8 -0
  194. package/dist/components/molecules/TraceWaterfall/TraceWaterfall.svelte +158 -0
  195. package/dist/components/molecules/TraceWaterfall/TraceWaterfall.svelte.d.ts +18 -0
  196. package/dist/components/molecules/TraceWaterfall/TraceWaterfallStory.svelte +55 -0
  197. package/dist/components/molecules/TraceWaterfall/TraceWaterfallStory.svelte.d.ts +18 -0
  198. package/dist/components/molecules/TrackHeader/TrackHeader.stories.d.ts +9 -0
  199. package/dist/components/molecules/TrackHeader/TrackHeader.stories.js +8 -0
  200. package/dist/components/molecules/TrackHeader/TrackHeader.svelte +54 -0
  201. package/dist/components/molecules/TrackHeader/TrackHeader.svelte.d.ts +9 -0
  202. package/dist/components/molecules/TrackHeader/TrackHeaderStory.svelte +10 -0
  203. package/dist/components/molecules/TrackHeader/TrackHeaderStory.svelte.d.ts +3 -0
  204. package/dist/components/molecules/TransportControls/TransportControls.stories.d.ts +9 -0
  205. package/dist/components/molecules/TransportControls/TransportControls.stories.js +8 -0
  206. package/dist/components/molecules/TransportControls/TransportControls.svelte +135 -0
  207. package/dist/components/molecules/TransportControls/TransportControls.svelte.d.ts +24 -0
  208. package/dist/components/molecules/TransportControls/TransportControlsStory.svelte +40 -0
  209. package/dist/components/molecules/TransportControls/TransportControlsStory.svelte.d.ts +3 -0
  210. package/dist/components/molecules/VersionHistoryPanel/VersionHistoryPanel.stories.js +8 -0
  211. package/dist/components/molecules/VersionHistoryPanel/VersionHistoryPanel.svelte +117 -0
  212. package/dist/components/molecules/VersionHistoryPanel/VersionHistoryPanel.svelte.d.ts +20 -0
  213. package/dist/components/molecules/VersionHistoryPanel/VersionHistoryPanelStory.svelte +36 -0
  214. package/dist/components/molecules/VersionHistoryPanel/VersionHistoryPanelStory.svelte.d.ts +18 -0
  215. package/dist/components/molecules/VideoAnimationsPanel/VideoAnimationsPanel.stories.js +8 -0
  216. package/dist/components/molecules/VideoAnimationsPanel/VideoAnimationsPanel.svelte +213 -0
  217. package/dist/components/molecules/VideoAnimationsPanel/VideoAnimationsPanel.svelte.d.ts +22 -0
  218. package/dist/components/molecules/VideoAnimationsPanel/VideoAnimationsPanelStory.svelte +7 -0
  219. package/dist/components/molecules/VideoAnimationsPanel/VideoAnimationsPanelStory.svelte.d.ts +18 -0
  220. package/dist/components/molecules/VideoComponentsPanel/VideoComponentsPanel.stories.js +8 -0
  221. package/dist/components/molecules/VideoComponentsPanel/VideoComponentsPanel.svelte +524 -0
  222. package/dist/components/molecules/VideoComponentsPanel/VideoComponentsPanel.svelte.d.ts +32 -0
  223. package/dist/components/molecules/VideoComponentsPanel/VideoComponentsPanelStory.svelte +7 -0
  224. package/dist/components/molecules/VideoComponentsPanel/VideoComponentsPanelStory.svelte.d.ts +18 -0
  225. package/dist/components/molecules/VideoPlayer/VideoPlayer.stories.d.ts +1 -1
  226. package/dist/components/molecules/VideoTrackHeader/VideoTrackHeader.stories.d.ts +9 -0
  227. package/dist/components/molecules/VideoTrackHeader/VideoTrackHeader.stories.js +8 -0
  228. package/dist/components/molecules/VideoTrackHeader/VideoTrackHeader.svelte +112 -0
  229. package/dist/components/molecules/VideoTrackHeader/VideoTrackHeader.svelte.d.ts +15 -0
  230. package/dist/components/molecules/VideoTrackHeader/VideoTrackHeaderStory.svelte +10 -0
  231. package/dist/components/molecules/VideoTrackHeader/VideoTrackHeaderStory.svelte.d.ts +3 -0
  232. package/dist/components/molecules/VideoTransitionsPanel/VideoTransitionsPanel.stories.js +8 -0
  233. package/dist/components/molecules/VideoTransitionsPanel/VideoTransitionsPanel.svelte +113 -0
  234. package/dist/components/molecules/VideoTransitionsPanel/VideoTransitionsPanel.svelte.d.ts +18 -0
  235. package/dist/components/molecules/VideoTransitionsPanel/VideoTransitionsPanelStory.svelte +7 -0
  236. package/dist/components/molecules/VideoTransitionsPanel/VideoTransitionsPanelStory.svelte.d.ts +18 -0
  237. package/dist/components/molecules/WaveformRegion/WaveformRegion.stories.js +8 -0
  238. package/dist/components/molecules/WaveformRegion/WaveformRegion.svelte +82 -0
  239. package/dist/components/molecules/WaveformRegion/WaveformRegion.svelte.d.ts +13 -0
  240. package/dist/components/molecules/WaveformRegion/WaveformRegionStory.svelte +17 -0
  241. package/dist/components/molecules/WaveformRegion/WaveformRegionStory.svelte.d.ts +18 -0
  242. package/dist/components/molecules/WidgetCanvas/WidgetCanvas.svelte +13 -4
  243. package/dist/components/molecules/WidgetCanvas/WidgetCanvas.svelte.d.ts +3 -1
  244. package/dist/components/molecules/WidgetCanvas/widgetCanvasContext.d.ts +2 -0
  245. package/dist/components/molecules/WidgetFrame/WidgetFrame.svelte +206 -37
  246. package/dist/components/molecules/WidgetFrame/WidgetFrame.svelte.d.ts +31 -0
  247. package/dist/components/organisms/AudioEditor/AudioEditor.stories.d.ts +12 -0
  248. package/dist/components/organisms/AudioEditor/AudioEditor.stories.js +9 -0
  249. package/dist/components/organisms/AudioEditor/AudioEditor.svelte +324 -0
  250. package/dist/components/organisms/AudioEditor/AudioEditor.svelte.d.ts +13 -0
  251. package/dist/components/organisms/AudioEditor/AudioEditorStory.svelte +10 -0
  252. package/dist/components/organisms/AudioEditor/AudioEditorStory.svelte.d.ts +3 -0
  253. package/dist/components/organisms/BlogEditor/BlogEditor.stories.d.ts +12 -0
  254. package/dist/components/organisms/BlogEditor/BlogEditor.stories.js +9 -0
  255. package/dist/components/organisms/BlogEditor/BlogEditor.svelte +1208 -0
  256. package/dist/components/organisms/BlogEditor/BlogEditor.svelte.d.ts +16 -0
  257. package/dist/components/organisms/BlogEditor/BlogEditorStory.svelte +144 -0
  258. package/dist/components/organisms/BlogEditor/BlogEditorStory.svelte.d.ts +3 -0
  259. package/dist/components/organisms/BlogEditor/DemoBlogCard.svelte +28 -0
  260. package/dist/components/organisms/BlogEditor/DemoBlogCard.svelte.d.ts +10 -0
  261. package/dist/components/organisms/BlogEditor/DemoBlogStats.svelte +34 -0
  262. package/dist/components/organisms/BlogEditor/DemoBlogStats.svelte.d.ts +11 -0
  263. package/dist/components/organisms/BlogEditor/DemoBlogWidget.svelte +13 -0
  264. package/dist/components/organisms/BlogEditor/DemoBlogWidget.svelte.d.ts +8 -0
  265. package/dist/components/organisms/BlogRenderer/BlogRenderer.stories.js +8 -0
  266. package/dist/components/organisms/BlogRenderer/BlogRenderer.svelte +469 -0
  267. package/dist/components/organisms/BlogRenderer/BlogRenderer.svelte.d.ts +14 -0
  268. package/dist/components/organisms/BlogRenderer/BlogRendererStory.svelte +20 -0
  269. package/dist/components/organisms/BlogRenderer/BlogRendererStory.svelte.d.ts +18 -0
  270. package/dist/components/organisms/BlueprintEditor/BlueprintEditor.stories.d.ts +12 -0
  271. package/dist/components/organisms/BlueprintEditor/BlueprintEditor.stories.js +9 -0
  272. package/dist/components/organisms/BlueprintEditor/BlueprintEditor.svelte +1012 -0
  273. package/dist/components/organisms/BlueprintEditor/BlueprintEditor.svelte.d.ts +16 -0
  274. package/dist/components/organisms/BlueprintEditor/BlueprintEditorStory.svelte +76 -0
  275. package/dist/components/organisms/BlueprintEditor/BlueprintEditorStory.svelte.d.ts +3 -0
  276. package/dist/components/organisms/CanvasEditor/CanvasEditor.stories.d.ts +12 -0
  277. package/dist/components/organisms/CanvasEditor/CanvasEditor.stories.js +9 -0
  278. package/dist/components/organisms/CanvasEditor/CanvasEditor.svelte +1680 -0
  279. package/dist/components/organisms/CanvasEditor/CanvasEditor.svelte.d.ts +18 -0
  280. package/dist/components/organisms/CanvasEditor/CanvasEditorStory.svelte +329 -0
  281. package/dist/components/organisms/CanvasEditor/CanvasEditorStory.svelte.d.ts +3 -0
  282. package/dist/components/organisms/DashboardBuilderPage/DashboardBuilderPage.svelte.d.ts +1 -1
  283. package/dist/components/organisms/DesktopShell/DesktopShell.svelte.d.ts +1 -1
  284. package/dist/components/organisms/EditorShell/EditorShell.svelte +162 -57
  285. package/dist/components/organisms/EditorShell/EditorShell.svelte.d.ts +21 -1
  286. package/dist/components/organisms/FileUploader/FileUploader.stories.d.ts +10 -0
  287. package/dist/components/organisms/FileUploader/FileUploader.stories.js +21 -0
  288. package/dist/components/organisms/FileUploader/FileUploader.svelte +127 -25
  289. package/dist/components/organisms/FileUploader/FileUploader.svelte.d.ts +20 -0
  290. package/dist/components/organisms/FileUploader/FileUploaderStory.svelte +7 -1
  291. package/dist/components/organisms/FileUploader/FileUploaderStory.svelte.d.ts +3 -0
  292. package/dist/components/organisms/ImportWizard/ImportWizard.stories.js +8 -0
  293. package/dist/components/organisms/ImportWizard/ImportWizard.svelte +209 -0
  294. package/dist/components/organisms/ImportWizard/ImportWizard.svelte.d.ts +22 -0
  295. package/dist/components/organisms/ImportWizard/ImportWizardStory.svelte +16 -0
  296. package/dist/components/organisms/ImportWizard/ImportWizardStory.svelte.d.ts +18 -0
  297. package/dist/components/organisms/VideoEditor/VideoEditor.stories.d.ts +12 -0
  298. package/dist/components/organisms/VideoEditor/VideoEditor.stories.js +9 -0
  299. package/dist/components/organisms/VideoEditor/VideoEditor.svelte +1687 -0
  300. package/dist/components/organisms/VideoEditor/VideoEditor.svelte.d.ts +14 -0
  301. package/dist/components/organisms/VideoEditor/VideoEditorStory.svelte +11 -0
  302. package/dist/components/organisms/VideoEditor/VideoEditorStory.svelte.d.ts +3 -0
  303. package/dist/components/templates/AudioEditorTemplate/AudioEditorTemplate.stories.d.ts +12 -0
  304. package/dist/components/templates/AudioEditorTemplate/AudioEditorTemplate.stories.js +9 -0
  305. package/dist/components/templates/AudioEditorTemplate/AudioEditorTemplate.svelte +22 -0
  306. package/dist/components/templates/AudioEditorTemplate/AudioEditorTemplate.svelte.d.ts +13 -0
  307. package/dist/components/templates/AudioEditorTemplate/AudioEditorTemplateStory.svelte +8 -0
  308. package/dist/components/templates/AudioEditorTemplate/AudioEditorTemplateStory.svelte.d.ts +3 -0
  309. package/dist/components/templates/CanvasEditorTemplate/CanvasEditorTemplate.stories.d.ts +12 -0
  310. package/dist/components/templates/CanvasEditorTemplate/CanvasEditorTemplate.stories.js +9 -0
  311. package/dist/components/templates/CanvasEditorTemplate/CanvasEditorTemplate.svelte +32 -0
  312. package/dist/components/templates/CanvasEditorTemplate/CanvasEditorTemplate.svelte.d.ts +17 -0
  313. package/dist/components/templates/CanvasEditorTemplate/CanvasEditorTemplateStory.svelte +21 -0
  314. package/dist/components/templates/CanvasEditorTemplate/CanvasEditorTemplateStory.svelte.d.ts +3 -0
  315. package/dist/components/templates/VideoEditorTemplate/VideoEditorTemplate.stories.d.ts +12 -0
  316. package/dist/components/templates/VideoEditorTemplate/VideoEditorTemplate.stories.js +9 -0
  317. package/dist/components/templates/VideoEditorTemplate/VideoEditorTemplate.svelte +22 -0
  318. package/dist/components/templates/VideoEditorTemplate/VideoEditorTemplate.svelte.d.ts +13 -0
  319. package/dist/components/templates/VideoEditorTemplate/VideoEditorTemplateStory.svelte +8 -0
  320. package/dist/components/templates/VideoEditorTemplate/VideoEditorTemplateStory.svelte.d.ts +3 -0
  321. package/dist/index.d.ts +91 -1
  322. package/dist/index.js +64 -0
  323. package/dist/types/xyflow-svelte.d.ts +62 -0
  324. package/dist/utils/audioProject.d.ts +19 -0
  325. package/dist/utils/audioProject.js +70 -0
  326. package/dist/utils/blogDocument.d.ts +175 -0
  327. package/dist/utils/blogDocument.js +220 -0
  328. package/dist/utils/blueprintRuntime.d.ts +34 -0
  329. package/dist/utils/blueprintRuntime.js +289 -0
  330. package/dist/utils/canvasDocument.d.ts +239 -0
  331. package/dist/utils/canvasDocument.js +443 -0
  332. package/dist/utils/canvasExport.d.ts +10 -0
  333. package/dist/utils/canvasExport.js +469 -0
  334. package/dist/utils/canvasHierarchy.d.ts +189 -0
  335. package/dist/utils/canvasHierarchy.js +674 -0
  336. package/dist/utils/canvasHistory.d.ts +19 -0
  337. package/dist/utils/canvasHistory.js +48 -0
  338. package/dist/utils/canvasWidget.d.ts +81 -0
  339. package/dist/utils/canvasWidget.js +597 -0
  340. package/dist/utils/mediaTime.d.ts +26 -0
  341. package/dist/utils/mediaTime.js +76 -0
  342. package/dist/utils/mediaTracks.d.ts +215 -0
  343. package/dist/utils/mediaTracks.js +798 -0
  344. package/dist/utils/nodeGraph.d.ts +354 -0
  345. package/dist/utils/nodeGraph.js +1453 -0
  346. package/dist/utils/queryBridge.d.ts +18 -0
  347. package/dist/utils/queryBridge.js +118 -0
  348. package/dist/utils/videoSequence.d.ts +13 -0
  349. package/dist/utils/videoSequence.js +94 -0
  350. package/package.json +5 -2
@@ -1,5 +1,6 @@
1
1
  <script lang="ts">
2
2
  import type { Snippet } from 'svelte';
3
+ import SearchInput from '../SearchInput/SearchInput.svelte';
3
4
 
4
5
  export interface ContextMenuItem {
5
6
  id: string;
@@ -7,7 +8,12 @@
7
8
  disabled?: boolean;
8
9
  destructive?: boolean;
9
10
  separator?: boolean;
11
+ /** Non-interactive section header (category title). */
12
+ header?: boolean;
10
13
  shortcut?: string;
14
+ /** Group label — items sharing a category are shown under one header. */
15
+ category?: string;
16
+ description?: string;
11
17
  }
12
18
 
13
19
  export interface ContextMenuAnchor {
@@ -20,60 +26,157 @@
20
26
  open?: boolean;
21
27
  /** Screen coordinates for the menu (clientX / clientY). */
22
28
  anchor?: ContextMenuAnchor | null;
29
+ /** Show a search field and filter items by label / description / category. */
30
+ searchable?: boolean;
31
+ searchPlaceholder?: string;
23
32
  class?: string;
24
33
  children?: Snippet;
25
34
  onselect?: (id: string, item: ContextMenuItem) => void;
35
+ onclose?: () => void;
26
36
  }
27
37
 
28
38
  let {
29
39
  items = [],
30
40
  open = $bindable(false),
31
41
  anchor = $bindable<ContextMenuAnchor | null>(null),
42
+ searchable = false,
43
+ searchPlaceholder = 'Search…',
32
44
  class: className = '',
33
45
  children,
34
- onselect
46
+ onselect,
47
+ onclose
35
48
  }: ContextMenuProps = $props();
36
49
 
37
50
  let menuX = $state(0);
38
51
  let menuY = $state(0);
39
52
  let menuEl = $state<HTMLDivElement | null>(null);
40
53
  let highlighted = $state(-1);
41
- /** Ignore the click/pointer that browsers fire right after `contextmenu`. */
42
- let suppressOutsideUntil = $state(0);
54
+ let query = $state('');
55
+ const menuId = `ctx-menu-${Math.random().toString(36).slice(2, 9)}`;
56
+
57
+ const filteredItems = $derived.by(() => {
58
+ const q = query.trim().toLowerCase();
59
+ if (!q) return items;
60
+ return items.filter((item) => {
61
+ if (item.separator || item.header) return false;
62
+ return (
63
+ item.label.toLowerCase().includes(q) ||
64
+ item.description?.toLowerCase().includes(q) ||
65
+ item.category?.toLowerCase().includes(q) ||
66
+ item.id.toLowerCase().includes(q)
67
+ );
68
+ });
69
+ });
70
+
71
+ /** Flat list with auto category headers when items carry `category`. */
72
+ const displayItems = $derived.by(() => {
73
+ const src = filteredItems;
74
+ const hasCategories = src.some((i) => i.category && !i.header && !i.separator);
75
+ if (!hasCategories) return src;
76
+
77
+ const actionable = src
78
+ .filter((i) => !i.separator && !i.header)
79
+ .slice()
80
+ .sort((a, b) => {
81
+ const ca = a.category ?? 'Other';
82
+ const cb = b.category ?? 'Other';
83
+ if (ca !== cb) return ca.localeCompare(cb);
84
+ return a.label.localeCompare(b.label);
85
+ });
86
+
87
+ const out: ContextMenuItem[] = [];
88
+ let lastCat = '';
89
+ let seq = 0;
90
+ for (const item of actionable) {
91
+ const cat = item.category ?? 'Other';
92
+ if (cat !== lastCat) {
93
+ if (out.length) out.push({ id: `sep:${seq++}`, label: '', separator: true });
94
+ out.push({ id: `hdr:${seq++}`, label: cat, header: true });
95
+ lastCat = cat;
96
+ }
97
+ out.push(item);
98
+ }
99
+ return out;
100
+ });
43
101
 
44
102
  const enabledIndexes = $derived(
45
- items.map((item, i) => (item.separator || item.disabled ? -1 : i)).filter((i) => i !== -1)
103
+ displayItems
104
+ .map((item, i) => (item.separator || item.header || item.disabled ? -1 : i))
105
+ .filter((i) => i !== -1)
46
106
  );
47
107
 
108
+ function clampMenuPosition(x: number, y: number) {
109
+ if (!menuEl) return;
110
+ const pad = 8;
111
+ const vw = window.innerWidth;
112
+ const vh = window.innerHeight;
113
+ const mw = menuEl.offsetWidth;
114
+ const mh = menuEl.offsetHeight;
115
+ if (mw <= 0 || mh <= 0) {
116
+ menuX = x;
117
+ menuY = y;
118
+ return;
119
+ }
120
+ let nextX = x;
121
+ let nextY = y;
122
+ // Flip if overflowing right / bottom
123
+ if (nextX + mw > vw - pad) nextX = x - mw;
124
+ if (nextY + mh > vh - pad) nextY = y - mh;
125
+ // Always keep fully inside the viewport
126
+ menuX = Math.min(Math.max(pad, nextX), Math.max(pad, vw - mw - pad));
127
+ menuY = Math.min(Math.max(pad, nextY), Math.max(pad, vh - mh - pad));
128
+ }
129
+
48
130
  function placeMenu(x: number, y: number) {
49
131
  menuX = x;
50
132
  menuY = y;
51
133
  requestAnimationFrame(() => {
52
- if (!menuEl) return;
53
- const vw = window.innerWidth;
54
- const vh = window.innerHeight;
55
- const { offsetWidth: mw, offsetHeight: mh } = menuEl;
56
- menuX = x + mw > vw - 8 ? Math.max(8, x - mw) : x;
57
- menuY = y + mh > vh - 8 ? Math.max(8, y - mh) : y;
134
+ clampMenuPosition(x, y);
58
135
  });
59
136
  }
60
137
 
138
+ function showMenu() {
139
+ if (!menuEl) return;
140
+ if (!menuEl.matches(':popover-open')) menuEl.showPopover();
141
+ }
142
+
143
+ function hideMenu() {
144
+ if (menuEl?.matches(':popover-open')) menuEl.hidePopover();
145
+ }
146
+
61
147
  function openAt(x: number, y: number) {
62
148
  anchor = { x, y };
63
149
  open = true;
64
150
  highlighted = -1;
65
- suppressOutsideUntil = performance.now() + 500;
66
- placeMenu(x, y);
151
+ query = '';
152
+ menuX = x;
153
+ menuY = y;
154
+ // Defer past the contextmenu/mouseup that would light-dismiss a popover=auto.
155
+ // Measure after showPopover — closed popovers have display:none (0×0).
156
+ requestAnimationFrame(() => {
157
+ requestAnimationFrame(() => {
158
+ if (!open) return;
159
+ showMenu();
160
+ requestAnimationFrame(() => clampMenuPosition(x, y));
161
+ });
162
+ });
67
163
  }
68
164
 
69
165
  function close() {
166
+ if (menuEl?.matches(':popover-open')) {
167
+ menuEl.hidePopover();
168
+ return;
169
+ }
170
+ if (!open && !anchor) return;
70
171
  open = false;
71
172
  anchor = null;
72
173
  highlighted = -1;
174
+ query = '';
175
+ onclose?.();
73
176
  }
74
177
 
75
178
  function selectItem(item: ContextMenuItem) {
76
- if (item.disabled || item.separator) return;
179
+ if (item.disabled || item.separator || item.header) return;
77
180
  onselect?.(item.id, item);
78
181
  close();
79
182
  }
@@ -84,28 +187,44 @@
84
187
  openAt(event.clientX, event.clientY);
85
188
  }
86
189
 
87
- function isOutsideEvent(event: Event) {
88
- if (!open) return false;
89
- if (performance.now() < suppressOutsideUntil) return false;
90
- const target = event.target as Node | null;
91
- if (menuEl && target && menuEl.contains(target)) return false;
92
- return true;
93
- }
94
-
95
- function handleOutsidePointer(event: PointerEvent) {
96
- if (event.button === 2) return;
97
- if (!isOutsideEvent(event)) return;
98
- close();
190
+ function onToggle(event: ToggleEvent) {
191
+ if (event.newState === 'open') {
192
+ open = true;
193
+ return;
194
+ }
195
+ open = false;
196
+ anchor = null;
197
+ highlighted = -1;
198
+ query = '';
199
+ onclose?.();
99
200
  }
100
201
 
101
- function handleOutsideClick(event: MouseEvent) {
202
+ /** Manual popover: close on outside pointer. Keep open on scroll —
203
+ * the menu is position:fixed, and closing on scroll also kills scrolling
204
+ * inside a long/searchable menu.
205
+ * Right-click (button 2) is ignored so retargeting another item keeps the menu open. */
206
+ function onDocPointerDown(event: PointerEvent) {
207
+ if (!open) return;
102
208
  if (event.button === 2) return;
103
- if (!isOutsideEvent(event)) return;
209
+ const t = event.target;
210
+ if (t instanceof Node && menuEl?.contains(t)) return;
104
211
  close();
105
212
  }
106
213
 
107
214
  function handleKeydown(event: KeyboardEvent) {
108
- if (!open) return;
215
+ if (!open && !menuEl?.matches(':popover-open')) return;
216
+ const tag = (event.target as HTMLElement)?.tagName;
217
+ if (tag === 'INPUT' || tag === 'TEXTAREA') {
218
+ if (event.key === 'Escape') {
219
+ event.preventDefault();
220
+ close();
221
+ }
222
+ if (event.key === 'ArrowDown' || event.key === 'ArrowUp' || event.key === 'Enter') {
223
+ /* allow nav from search */
224
+ } else {
225
+ return;
226
+ }
227
+ }
109
228
  switch (event.key) {
110
229
  case 'Escape':
111
230
  event.preventDefault();
@@ -121,8 +240,9 @@
121
240
  break;
122
241
  case 'Enter':
123
242
  case ' ': {
243
+ if (tag === 'INPUT' && event.key === ' ') return;
124
244
  event.preventDefault();
125
- const item = highlighted >= 0 ? items[highlighted] : undefined;
245
+ const item = highlighted >= 0 ? displayItems[highlighted] : undefined;
126
246
  if (item) selectItem(item);
127
247
  break;
128
248
  }
@@ -139,49 +259,78 @@
139
259
  }
140
260
  }
141
261
 
142
- /** Render menu in document.body so overflow/transform ancestors cannot clip it. */
143
- function portal(node: HTMLElement) {
144
- document.body.appendChild(node);
145
- return {
146
- destroy() {
147
- node.remove();
148
- }
149
- };
150
- }
262
+ $effect(() => {
263
+ if (!open || !anchor) {
264
+ if (!open) hideMenu();
265
+ return;
266
+ }
267
+ const x = anchor.x;
268
+ const y = anchor.y;
269
+ highlighted = -1;
270
+ menuX = x;
271
+ menuY = y;
272
+ requestAnimationFrame(() => {
273
+ requestAnimationFrame(() => {
274
+ if (!open) return;
275
+ showMenu();
276
+ requestAnimationFrame(() => clampMenuPosition(x, y));
277
+ });
278
+ });
279
+ });
151
280
 
152
281
  $effect(() => {
153
- if (!open || !anchor) return;
154
- suppressOutsideUntil = performance.now() + 500;
155
- placeMenu(anchor.x, anchor.y);
282
+ if (!open) return;
283
+ // Bind after current pointer gesture ends so the opening right-click doesn't close us.
284
+ const timer = window.setTimeout(() => {
285
+ document.addEventListener('pointerdown', onDocPointerDown, true);
286
+ }, 0);
287
+ return () => {
288
+ window.clearTimeout(timer);
289
+ document.removeEventListener('pointerdown', onDocPointerDown, true);
290
+ };
156
291
  });
157
292
  </script>
158
293
 
159
- <svelte:window
160
- onpointerdown={handleOutsidePointer}
161
- onclick={handleOutsideClick}
162
- onkeydown={handleKeydown}
163
- />
294
+ <svelte:window onkeydown={handleKeydown} />
164
295
 
165
- <!-- svelte-ignore a11y_no_static_element_interactions -->
166
- <div class={['h-full min-h-0 w-full', className]} oncontextmenu={handleContextMenu}>
167
- {#if children}
296
+ {#if children}
297
+ <!-- svelte-ignore a11y_no_static_element_interactions -->
298
+ <div class={['h-full min-h-0 w-full', className]} oncontextmenu={handleContextMenu}>
168
299
  {@render children()}
169
- {/if}
170
- </div>
300
+ </div>
301
+ {/if}
171
302
 
172
- {#if open}
173
- <div
174
- use:portal
175
- bind:this={menuEl}
176
- role="menu"
177
- tabindex={-1}
178
- aria-label="Context menu"
179
- style="position:fixed;top:{menuY}px;left:{menuX}px;z-index:9999;"
180
- class="min-w-44 rounded-xl border border-border bg-surface-elevated p-1.5 shadow-xl outline-none"
181
- >
182
- {#each items as item, index (item.id)}
303
+ <!-- Manual popover — context menus must not light-dismiss on the opening mouseup -->
304
+ <div
305
+ bind:this={menuEl}
306
+ id={menuId}
307
+ popover="manual"
308
+ role="menu"
309
+ tabindex={-1}
310
+ aria-label="Context menu"
311
+ ontoggle={onToggle}
312
+ style={`top:${menuY}px;left:${menuX}px;margin:0;`}
313
+ class={[
314
+ 'context-menu-popover flex max-h-[min(28rem,70vh)] min-w-52 max-w-72 flex-col overflow-hidden rounded-xl border border-border bg-surface-elevated shadow-xl outline-none',
315
+ !children && className
316
+ ]}
317
+ >
318
+ {#if searchable}
319
+ <div class="border-b border-border p-2">
320
+ <SearchInput bind:value={query} placeholder={searchPlaceholder} size="sm" />
321
+ </div>
322
+ {/if}
323
+ <div class="min-h-0 flex-1 overflow-auto p-1.5">
324
+ {#each displayItems as item, index (item.id)}
183
325
  {#if item.separator}
184
326
  <div class="my-1 h-px bg-border" role="separator"></div>
327
+ {:else if item.header}
328
+ <p
329
+ class="px-2.5 pb-1 pt-2 text-[10px] font-semibold uppercase tracking-wide text-muted"
330
+ role="presentation"
331
+ >
332
+ {item.label}
333
+ </p>
185
334
  {:else}
186
335
  <!-- svelte-ignore a11y_click_events_have_key_events -->
187
336
  <!-- svelte-ignore a11y_no_static_element_interactions -->
@@ -197,22 +346,44 @@
197
346
  highlighted = -1;
198
347
  }}
199
348
  class={[
200
- 'flex cursor-pointer items-center justify-between gap-4 rounded-lg px-2.5 py-2 text-sm font-medium transition-colors',
349
+ 'flex cursor-pointer items-start justify-between gap-3 rounded-lg px-2.5 py-2 text-sm font-medium transition-colors',
201
350
  item.disabled && 'cursor-not-allowed opacity-40',
202
351
  highlighted === index && !item.disabled && 'bg-surface-overlay',
203
352
  item.destructive ? 'text-red-600 dark:text-red-400' : 'text-primary'
204
353
  ]}
205
354
  >
206
- <span class="truncate">{item.label}</span>
355
+ <span class="min-w-0">
356
+ <span class="block truncate">{item.label}</span>
357
+ {#if item.description}
358
+ <span class="block truncate text-[11px] font-normal text-muted">{item.description}</span>
359
+ {/if}
360
+ </span>
207
361
  {#if item.shortcut}
208
362
  <kbd
209
- class="shrink-0 rounded border border-border bg-surface-overlay px-1.5 py-0.5 font-mono text-[10px] text-secondary"
363
+ class="mt-0.5 shrink-0 rounded border border-border bg-surface-overlay px-1.5 py-0.5 font-mono text-[10px] text-secondary"
210
364
  >
211
365
  {item.shortcut}
212
366
  </kbd>
213
367
  {/if}
214
368
  </div>
215
369
  {/if}
370
+ {:else}
371
+ <p class="px-3 py-6 text-center text-xs text-muted">No matches</p>
216
372
  {/each}
217
373
  </div>
218
- {/if}
374
+ </div>
375
+
376
+ <style>
377
+ /* UA popover defaults to inset:0 — position via top/left only.
378
+ Tailwind `flex` overrides UA display:none — hide until open. */
379
+ .context-menu-popover {
380
+ position: fixed;
381
+ }
382
+ .context-menu-popover:not(:popover-open) {
383
+ display: none !important;
384
+ }
385
+ .context-menu-popover:popover-open {
386
+ inset: unset;
387
+ display: flex;
388
+ }
389
+ </style>
@@ -5,7 +5,12 @@ export interface ContextMenuItem {
5
5
  disabled?: boolean;
6
6
  destructive?: boolean;
7
7
  separator?: boolean;
8
+ /** Non-interactive section header (category title). */
9
+ header?: boolean;
8
10
  shortcut?: string;
11
+ /** Group label — items sharing a category are shown under one header. */
12
+ category?: string;
13
+ description?: string;
9
14
  }
10
15
  export interface ContextMenuAnchor {
11
16
  x: number;
@@ -16,9 +21,13 @@ interface ContextMenuProps {
16
21
  open?: boolean;
17
22
  /** Screen coordinates for the menu (clientX / clientY). */
18
23
  anchor?: ContextMenuAnchor | null;
24
+ /** Show a search field and filter items by label / description / category. */
25
+ searchable?: boolean;
26
+ searchPlaceholder?: string;
19
27
  class?: string;
20
28
  children?: Snippet;
21
29
  onselect?: (id: string, item: ContextMenuItem) => void;
30
+ onclose?: () => void;
22
31
  }
23
32
  declare const ContextMenu: import("svelte").Component<ContextMenuProps, {}, "open" | "anchor">;
24
33
  type ContextMenu = ReturnType<typeof ContextMenu>;
@@ -0,0 +1,9 @@
1
+ import type { StoryObj } from '@storybook/svelte';
2
+ declare const meta: {
3
+ title: string;
4
+ component: import("svelte").Component<Record<string, never>, {}, "">;
5
+ tags: string[];
6
+ };
7
+ export default meta;
8
+ type Story = StoryObj<typeof meta>;
9
+ export declare const Default: Story;
@@ -0,0 +1,8 @@
1
+ import ExpressionEditorStory from './ExpressionEditorStory.svelte';
2
+ const meta = {
3
+ title: 'Molecules/ExpressionEditor',
4
+ component: ExpressionEditorStory,
5
+ tags: ['autodocs']
6
+ };
7
+ export default meta;
8
+ export const Default = {};
@@ -0,0 +1,56 @@
1
+ <script lang="ts">
2
+ import CodeEditor from '../CodeEditor/CodeEditor.svelte';
3
+ import Chip from '../../atoms/Chip/Chip.svelte';
4
+
5
+ interface ExpressionEditorProps {
6
+ value?: string;
7
+ fields?: string[];
8
+ placeholder?: string;
9
+ error?: string;
10
+ validate?: (value: string) => string | null;
11
+ class?: string;
12
+ onchange?: (value: string) => void;
13
+ }
14
+
15
+ let {
16
+ value = $bindable(''),
17
+ fields = [],
18
+ placeholder = 'e.g. price * quantity',
19
+ error = '',
20
+ validate,
21
+ class: className = '',
22
+ onchange
23
+ }: ExpressionEditorProps = $props();
24
+
25
+ const validationError = $derived(validate?.(value) ?? error ?? '');
26
+
27
+ function insertField(field: string) {
28
+ const needsSpace = value.length > 0 && !/\s$/.test(value);
29
+ value = `${value}${needsSpace ? ' ' : ''}${field}`;
30
+ onchange?.(value);
31
+ }
32
+ </script>
33
+
34
+ <div class={['flex flex-col gap-2', className]} data-expression-editor>
35
+ {#if fields.length}
36
+ <div class="flex flex-wrap gap-1">
37
+ {#each fields as field (field)}
38
+ <button type="button" onclick={() => insertField(field)}>
39
+ <Chip size="sm" variant="default">{field}</Chip>
40
+ </button>
41
+ {/each}
42
+ </div>
43
+ {/if}
44
+ <CodeEditor
45
+ bind:value
46
+ language="js"
47
+ {placeholder}
48
+ showLineNumbers={false}
49
+ minHeight={72}
50
+ onchange={onchange}
51
+ class="rounded-xl"
52
+ />
53
+ {#if validationError}
54
+ <p class="text-xs text-red-600">{validationError}</p>
55
+ {/if}
56
+ </div>
@@ -0,0 +1,12 @@
1
+ interface ExpressionEditorProps {
2
+ value?: string;
3
+ fields?: string[];
4
+ placeholder?: string;
5
+ error?: string;
6
+ validate?: (value: string) => string | null;
7
+ class?: string;
8
+ onchange?: (value: string) => void;
9
+ }
10
+ declare const ExpressionEditor: import("svelte").Component<ExpressionEditorProps, {}, "value">;
11
+ type ExpressionEditor = ReturnType<typeof ExpressionEditor>;
12
+ export default ExpressionEditor;
@@ -0,0 +1,12 @@
1
+ <script lang="ts">
2
+ import ExpressionEditor from './ExpressionEditor.svelte';
3
+ let value = $state('price * quantity');
4
+ </script>
5
+
6
+ <div class="mx-auto max-w-lg p-4">
7
+ <ExpressionEditor
8
+ bind:value
9
+ fields={['price', 'quantity', 'discount', 'tax']}
10
+ validate={(v) => (!v.trim() ? 'Expression required' : null)}
11
+ />
12
+ </div>
@@ -0,0 +1,3 @@
1
+ declare const ExpressionEditorStory: import("svelte").Component<Record<string, never>, {}, "">;
2
+ type ExpressionEditorStory = ReturnType<typeof ExpressionEditorStory>;
3
+ export default ExpressionEditorStory;
@@ -0,0 +1,9 @@
1
+ import type { StoryObj } from '@storybook/svelte';
2
+ declare const meta: {
3
+ title: string;
4
+ component: import("svelte").Component<Record<string, never>, {}, "">;
5
+ tags: string[];
6
+ };
7
+ export default meta;
8
+ type Story = StoryObj<typeof meta>;
9
+ export declare const Default: Story;
@@ -0,0 +1,8 @@
1
+ import FilterListStory from './FilterListStory.svelte';
2
+ const meta = {
3
+ title: 'Molecules/FilterList',
4
+ component: FilterListStory,
5
+ tags: ['autodocs']
6
+ };
7
+ export default meta;
8
+ export const Default = {};
@@ -0,0 +1,101 @@
1
+ <script lang="ts">
2
+ import Chip from '../../atoms/Chip/Chip.svelte';
3
+ import Button from '../../atoms/Button/Button.svelte';
4
+ import {
5
+ emptyFilterGroup,
6
+ type AdvancedFilterGroup,
7
+ type FilterFieldDef
8
+ } from '../../../utils/advancedFilters.js';
9
+ import {
10
+ groupToFilterItems,
11
+ groupToQueryString,
12
+ removeRuleFromGroup
13
+ } from '../../../utils/queryBridge.js';
14
+
15
+ interface FilterListProps {
16
+ fields?: FilterFieldDef[];
17
+ query?: AdvancedFilterGroup;
18
+ /** Optional QueryBar string mirror */
19
+ queryString?: string;
20
+ emptyLabel?: string;
21
+ clearAllLabel?: string;
22
+ showQueryString?: boolean;
23
+ class?: string;
24
+ onchange?: (query: AdvancedFilterGroup) => void;
25
+ onclear?: (ruleId: string) => void;
26
+ onclearAll?: () => void;
27
+ onquerystring?: (value: string) => void;
28
+ }
29
+
30
+ let {
31
+ fields = [],
32
+ query = $bindable(emptyFilterGroup()),
33
+ queryString = $bindable(''),
34
+ emptyLabel = 'No active filters',
35
+ clearAllLabel = 'Clear all',
36
+ showQueryString = false,
37
+ class: className = '',
38
+ onchange,
39
+ onclear,
40
+ onclearAll,
41
+ onquerystring
42
+ }: FilterListProps = $props();
43
+
44
+ const items = $derived(groupToFilterItems(query, fields));
45
+
46
+ function syncString(next: AdvancedFilterGroup) {
47
+ const s = groupToQueryString(next, fields);
48
+ queryString = s;
49
+ onquerystring?.(s);
50
+ }
51
+
52
+ function remove(id: string) {
53
+ query = removeRuleFromGroup(query, id);
54
+ syncString(query);
55
+ onchange?.(query);
56
+ onclear?.(id);
57
+ }
58
+
59
+ function clearAll() {
60
+ query = emptyFilterGroup(query.combinator);
61
+ syncString(query);
62
+ onchange?.(query);
63
+ onclearAll?.();
64
+ }
65
+
66
+ </script>
67
+
68
+ <div
69
+ class={['flex flex-col gap-2', className]}
70
+ role="group"
71
+ aria-label="Active filters"
72
+ data-filter-list
73
+ >
74
+ {#if items.length === 0}
75
+ <p class="text-xs text-muted">{emptyLabel}</p>
76
+ {:else}
77
+ <div class="flex flex-wrap items-center gap-1.5">
78
+ {#each items as item (item.id)}
79
+ <span class="inline-flex items-center gap-1">
80
+ <Chip
81
+ size="sm"
82
+ variant="primary"
83
+ dismissible
84
+ ondismiss={() => remove(item.id)}
85
+ >
86
+ {item.label}
87
+ </Chip>
88
+ </span>
89
+ {/each}
90
+ {#if items.length > 0}
91
+ <Button variant="ghost" size="sm" onclick={clearAll}>{clearAllLabel}</Button>
92
+ {/if}
93
+ </div>
94
+ {/if}
95
+
96
+ {#if showQueryString && queryString}
97
+ <code class="block truncate rounded-lg bg-surface-overlay px-2 py-1 font-mono text-[11px] text-muted">
98
+ {queryString}
99
+ </code>
100
+ {/if}
101
+ </div>