@r2digisolutions/components 0.1.7 → 0.2.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 (324) 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 +59 -0
  15. package/dist/components/atoms/Playhead/Playhead.svelte.d.ts +13 -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 +58 -0
  20. package/dist/components/atoms/TimeRuler/TimeRuler.svelte.d.ts +10 -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/Tooltip/Tooltip.svelte +1 -1
  24. package/dist/components/atoms/TrimHandle/TrimHandle.stories.js +8 -0
  25. package/dist/components/atoms/TrimHandle/TrimHandle.svelte +63 -0
  26. package/dist/components/atoms/TrimHandle/TrimHandle.svelte.d.ts +12 -0
  27. package/dist/components/atoms/TrimHandle/TrimHandleStory.svelte +11 -0
  28. package/dist/components/atoms/TrimHandle/TrimHandleStory.svelte.d.ts +18 -0
  29. package/dist/components/molecules/AiAssistPanel/AiAssistPanel.stories.d.ts +9 -0
  30. package/dist/components/molecules/AiAssistPanel/AiAssistPanel.stories.js +8 -0
  31. package/dist/components/molecules/AiAssistPanel/AiAssistPanel.svelte +102 -0
  32. package/dist/components/molecules/AiAssistPanel/AiAssistPanel.svelte.d.ts +20 -0
  33. package/dist/components/molecules/AiAssistPanel/AiAssistPanelStory.svelte +34 -0
  34. package/dist/components/molecules/AiAssistPanel/AiAssistPanelStory.svelte.d.ts +3 -0
  35. package/dist/components/molecules/BulkActionBar/BulkActionBar.svelte +97 -61
  36. package/dist/components/molecules/BulkActionBar/BulkActionBar.svelte.d.ts +2 -0
  37. package/dist/components/molecules/BulkEditPanel/BulkEditPanel.stories.js +8 -0
  38. package/dist/components/molecules/BulkEditPanel/BulkEditPanel.svelte +117 -0
  39. package/dist/components/molecules/BulkEditPanel/BulkEditPanel.svelte.d.ts +23 -0
  40. package/dist/components/molecules/BulkEditPanel/BulkEditPanelStory.svelte +18 -0
  41. package/dist/components/molecules/BulkEditPanel/BulkEditPanelStory.svelte.d.ts +18 -0
  42. package/dist/components/molecules/CanvasElementsPanel/CanvasElementsPanel.stories.js +8 -0
  43. package/dist/components/molecules/CanvasElementsPanel/CanvasElementsPanel.svelte +858 -0
  44. package/dist/components/molecules/CanvasElementsPanel/CanvasElementsPanel.svelte.d.ts +43 -0
  45. package/dist/components/molecules/CanvasElementsPanel/CanvasElementsPanelStory.svelte +7 -0
  46. package/dist/components/molecules/CanvasElementsPanel/CanvasElementsPanelStory.svelte.d.ts +18 -0
  47. package/dist/components/molecules/CanvasInspector/CanvasInspector.stories.d.ts +9 -0
  48. package/dist/components/molecules/CanvasInspector/CanvasInspector.stories.js +8 -0
  49. package/dist/components/molecules/CanvasInspector/CanvasInspector.svelte +1140 -0
  50. package/dist/components/molecules/CanvasInspector/CanvasInspector.svelte.d.ts +28 -0
  51. package/dist/components/molecules/CanvasInspector/CanvasInspectorStory.svelte +20 -0
  52. package/dist/components/molecules/CanvasInspector/CanvasInspectorStory.svelte.d.ts +3 -0
  53. package/dist/components/molecules/ColorPicker/ColorPicker.svelte +1 -1
  54. package/dist/components/molecules/ColumnVisibilityMenu/ColumnVisibilityMenu.stories.d.ts +9 -0
  55. package/dist/components/molecules/ColumnVisibilityMenu/ColumnVisibilityMenu.stories.js +8 -0
  56. package/dist/components/molecules/ColumnVisibilityMenu/ColumnVisibilityMenu.svelte +108 -0
  57. package/dist/components/molecules/ColumnVisibilityMenu/ColumnVisibilityMenu.svelte.d.ts +18 -0
  58. package/dist/components/molecules/ColumnVisibilityMenu/ColumnVisibilityMenuStory.svelte +15 -0
  59. package/dist/components/molecules/ColumnVisibilityMenu/ColumnVisibilityMenuStory.svelte.d.ts +3 -0
  60. package/dist/components/molecules/ConflictResolver/ConflictResolver.stories.js +8 -0
  61. package/dist/components/molecules/ConflictResolver/ConflictResolver.svelte +73 -0
  62. package/dist/components/molecules/ConflictResolver/ConflictResolver.svelte.d.ts +16 -0
  63. package/dist/components/molecules/ConflictResolver/ConflictResolverStory.svelte +11 -0
  64. package/dist/components/molecules/ConflictResolver/ConflictResolverStory.svelte.d.ts +18 -0
  65. package/dist/components/molecules/ContextMenu/ContextMenu.svelte +204 -60
  66. package/dist/components/molecules/ContextMenu/ContextMenu.svelte.d.ts +9 -0
  67. package/dist/components/molecules/ExpressionEditor/ExpressionEditor.stories.d.ts +9 -0
  68. package/dist/components/molecules/ExpressionEditor/ExpressionEditor.stories.js +8 -0
  69. package/dist/components/molecules/ExpressionEditor/ExpressionEditor.svelte +56 -0
  70. package/dist/components/molecules/ExpressionEditor/ExpressionEditor.svelte.d.ts +12 -0
  71. package/dist/components/molecules/ExpressionEditor/ExpressionEditorStory.svelte +12 -0
  72. package/dist/components/molecules/ExpressionEditor/ExpressionEditorStory.svelte.d.ts +3 -0
  73. package/dist/components/molecules/FilterList/FilterList.stories.d.ts +9 -0
  74. package/dist/components/molecules/FilterList/FilterList.stories.js +8 -0
  75. package/dist/components/molecules/FilterList/FilterList.svelte +101 -0
  76. package/dist/components/molecules/FilterList/FilterList.svelte.d.ts +18 -0
  77. package/dist/components/molecules/FilterList/FilterListStory.svelte +31 -0
  78. package/dist/components/molecules/FilterList/FilterListStory.svelte.d.ts +3 -0
  79. package/dist/components/molecules/MediaAssetBrowser/MediaAssetBrowser.stories.d.ts +9 -0
  80. package/dist/components/molecules/MediaAssetBrowser/MediaAssetBrowser.stories.js +8 -0
  81. package/dist/components/molecules/MediaAssetBrowser/MediaAssetBrowser.svelte +94 -0
  82. package/dist/components/molecules/MediaAssetBrowser/MediaAssetBrowser.svelte.d.ts +15 -0
  83. package/dist/components/molecules/MediaAssetBrowser/MediaAssetBrowserStory.svelte +18 -0
  84. package/dist/components/molecules/MediaAssetBrowser/MediaAssetBrowserStory.svelte.d.ts +3 -0
  85. package/dist/components/molecules/MediaAssetCard/MediaAssetCard.stories.js +8 -0
  86. package/dist/components/molecules/MediaAssetCard/MediaAssetCard.svelte +50 -0
  87. package/dist/components/molecules/MediaAssetCard/MediaAssetCard.svelte.d.ts +11 -0
  88. package/dist/components/molecules/MediaAssetCard/MediaAssetCardStory.svelte +13 -0
  89. package/dist/components/molecules/MediaAssetCard/MediaAssetCardStory.svelte.d.ts +18 -0
  90. package/dist/components/molecules/MediaLayerItem/MediaLayerItem.stories.js +8 -0
  91. package/dist/components/molecules/MediaLayerItem/MediaLayerItem.svelte +380 -0
  92. package/dist/components/molecules/MediaLayerItem/MediaLayerItem.svelte.d.ts +33 -0
  93. package/dist/components/molecules/MediaLayerItem/MediaLayerItemStory.svelte +14 -0
  94. package/dist/components/molecules/MediaLayerItem/MediaLayerItemStory.svelte.d.ts +18 -0
  95. package/dist/components/molecules/MediaLayerList/MediaLayerList.stories.d.ts +9 -0
  96. package/dist/components/molecules/MediaLayerList/MediaLayerList.stories.js +8 -0
  97. package/dist/components/molecules/MediaLayerList/MediaLayerList.svelte +399 -0
  98. package/dist/components/molecules/MediaLayerList/MediaLayerList.svelte.d.ts +37 -0
  99. package/dist/components/molecules/MediaLayerList/MediaLayerListStory.svelte +24 -0
  100. package/dist/components/molecules/MediaLayerList/MediaLayerListStory.svelte.d.ts +3 -0
  101. package/dist/components/molecules/MediaStage/MediaStage.stories.d.ts +9 -0
  102. package/dist/components/molecules/MediaStage/MediaStage.stories.js +8 -0
  103. package/dist/components/molecules/MediaStage/MediaStage.svelte +1498 -0
  104. package/dist/components/molecules/MediaStage/MediaStage.svelte.d.ts +45 -0
  105. package/dist/components/molecules/MediaStage/MediaStageStory.svelte +35 -0
  106. package/dist/components/molecules/MediaStage/MediaStageStory.svelte.d.ts +3 -0
  107. package/dist/components/molecules/MediaTimeline/MediaTimeline.stories.d.ts +9 -0
  108. package/dist/components/molecules/MediaTimeline/MediaTimeline.stories.js +8 -0
  109. package/dist/components/molecules/MediaTimeline/MediaTimeline.svelte +131 -0
  110. package/dist/components/molecules/MediaTimeline/MediaTimeline.svelte.d.ts +19 -0
  111. package/dist/components/molecules/MediaTimeline/MediaTimelineStory.svelte +20 -0
  112. package/dist/components/molecules/MediaTimeline/MediaTimelineStory.svelte.d.ts +3 -0
  113. package/dist/components/molecules/MixerChannel/MixerChannel.stories.d.ts +9 -0
  114. package/dist/components/molecules/MixerChannel/MixerChannel.stories.js +8 -0
  115. package/dist/components/molecules/MixerChannel/MixerChannel.svelte +92 -0
  116. package/dist/components/molecules/MixerChannel/MixerChannel.svelte.d.ts +11 -0
  117. package/dist/components/molecules/MixerChannel/MixerChannelStory.svelte +13 -0
  118. package/dist/components/molecules/MixerChannel/MixerChannelStory.svelte.d.ts +3 -0
  119. package/dist/components/molecules/NodeGraph/GraphBlueprintNode.svelte +454 -0
  120. package/dist/components/molecules/NodeGraph/GraphBlueprintNode.svelte.d.ts +8 -0
  121. package/dist/components/molecules/NodeGraph/GraphFlowBridge.svelte +26 -0
  122. package/dist/components/molecules/NodeGraph/GraphFlowBridge.svelte.d.ts +22 -0
  123. package/dist/components/molecules/NodeGraph/NodeGraph.stories.d.ts +12 -0
  124. package/dist/components/molecules/NodeGraph/NodeGraph.stories.js +9 -0
  125. package/dist/components/molecules/NodeGraph/NodeGraph.svelte +1409 -0
  126. package/dist/components/molecules/NodeGraph/NodeGraph.svelte.d.ts +33 -0
  127. package/dist/components/molecules/NodeGraph/NodeGraphStory.svelte +90 -0
  128. package/dist/components/molecules/NodeGraph/NodeGraphStory.svelte.d.ts +3 -0
  129. package/dist/components/molecules/NodePalette/NodePalette.stories.js +8 -0
  130. package/dist/components/molecules/NodePalette/NodePalette.svelte +86 -0
  131. package/dist/components/molecules/NodePalette/NodePalette.svelte.d.ts +11 -0
  132. package/dist/components/molecules/NodePalette/NodePaletteStory.svelte +11 -0
  133. package/dist/components/molecules/NodePalette/NodePaletteStory.svelte.d.ts +18 -0
  134. package/dist/components/molecules/Poll/Poll.stories.d.ts +1 -1
  135. package/dist/components/molecules/ProgramMonitor/ProgramMonitor.stories.js +8 -0
  136. package/dist/components/molecules/ProgramMonitor/ProgramMonitor.svelte +72 -0
  137. package/dist/components/molecules/ProgramMonitor/ProgramMonitor.svelte.d.ts +12 -0
  138. package/dist/components/molecules/ProgramMonitor/ProgramMonitorStory.svelte +16 -0
  139. package/dist/components/molecules/ProgramMonitor/ProgramMonitorStory.svelte.d.ts +18 -0
  140. package/dist/components/molecules/PropertyField/PropertyField.svelte +57 -3
  141. package/dist/components/molecules/PropertyField/PropertyField.svelte.d.ts +10 -0
  142. package/dist/components/molecules/PropertyField/PropertyFieldStory.svelte +21 -0
  143. package/dist/components/molecules/PropertyGroup/PropertyGroup.svelte +1 -1
  144. package/dist/components/molecules/QueryBuilder/QueryBuilder.stories.d.ts +9 -0
  145. package/dist/components/molecules/QueryBuilder/QueryBuilder.stories.js +8 -0
  146. package/dist/components/molecules/QueryBuilder/QueryBuilder.svelte +52 -0
  147. package/dist/components/molecules/QueryBuilder/QueryBuilder.svelte.d.ts +18 -0
  148. package/dist/components/molecules/QueryBuilder/QueryBuilderStory.svelte +62 -0
  149. package/dist/components/molecules/QueryBuilder/QueryBuilderStory.svelte.d.ts +3 -0
  150. package/dist/components/molecules/RelationPicker/RelationPicker.stories.d.ts +9 -0
  151. package/dist/components/molecules/RelationPicker/RelationPicker.stories.js +8 -0
  152. package/dist/components/molecules/RelationPicker/RelationPicker.svelte +180 -0
  153. package/dist/components/molecules/RelationPicker/RelationPicker.svelte.d.ts +24 -0
  154. package/dist/components/molecules/RelationPicker/RelationPickerStory.svelte +16 -0
  155. package/dist/components/molecules/RelationPicker/RelationPickerStory.svelte.d.ts +3 -0
  156. package/dist/components/molecules/SchemaFieldBuilder/SchemaFieldBuilder.stories.d.ts +9 -0
  157. package/dist/components/molecules/SchemaFieldBuilder/SchemaFieldBuilder.stories.js +8 -0
  158. package/dist/components/molecules/SchemaFieldBuilder/SchemaFieldBuilder.svelte +154 -0
  159. package/dist/components/molecules/SchemaFieldBuilder/SchemaFieldBuilder.svelte.d.ts +12 -0
  160. package/dist/components/molecules/SchemaFieldBuilder/SchemaFieldBuilderStory.svelte +16 -0
  161. package/dist/components/molecules/SchemaFieldBuilder/SchemaFieldBuilderStory.svelte.d.ts +3 -0
  162. package/dist/components/molecules/SecretField/SecretField.stories.d.ts +9 -0
  163. package/dist/components/molecules/SecretField/SecretField.stories.js +8 -0
  164. package/dist/components/molecules/SecretField/SecretField.svelte +58 -0
  165. package/dist/components/molecules/SecretField/SecretField.svelte.d.ts +15 -0
  166. package/dist/components/molecules/SecretField/SecretFieldStory.svelte +8 -0
  167. package/dist/components/molecules/SecretField/SecretFieldStory.svelte.d.ts +3 -0
  168. package/dist/components/molecules/SplitPane/SplitPane.svelte +96 -37
  169. package/dist/components/molecules/SplitPane/SplitPane.svelte.d.ts +10 -2
  170. package/dist/components/molecules/TableToolbar/TableToolbar.svelte.d.ts +1 -1
  171. package/dist/components/molecules/Terminal/Terminal.stories.js +20 -0
  172. package/dist/components/molecules/Terminal/Terminal.svelte +238 -0
  173. package/dist/components/molecules/Terminal/Terminal.svelte.d.ts +19 -0
  174. package/dist/components/molecules/Terminal/TerminalStory.svelte +47 -0
  175. package/dist/components/molecules/Terminal/TerminalStory.svelte.d.ts +6 -0
  176. package/dist/components/molecules/TimelineClip/TimelineClip.stories.js +8 -0
  177. package/dist/components/molecules/TimelineClip/TimelineClip.svelte +116 -0
  178. package/dist/components/molecules/TimelineClip/TimelineClip.svelte.d.ts +15 -0
  179. package/dist/components/molecules/TimelineClip/TimelineClipStory.svelte +18 -0
  180. package/dist/components/molecules/TimelineClip/TimelineClipStory.svelte.d.ts +18 -0
  181. package/dist/components/molecules/TimelineTrack/TimelineTrack.stories.js +8 -0
  182. package/dist/components/molecules/TimelineTrack/TimelineTrack.svelte +56 -0
  183. package/dist/components/molecules/TimelineTrack/TimelineTrack.svelte.d.ts +16 -0
  184. package/dist/components/molecules/TimelineTrack/TimelineTrackStory.svelte +35 -0
  185. package/dist/components/molecules/TimelineTrack/TimelineTrackStory.svelte.d.ts +18 -0
  186. package/dist/components/molecules/TraceWaterfall/TraceWaterfall.stories.js +8 -0
  187. package/dist/components/molecules/TraceWaterfall/TraceWaterfall.svelte +158 -0
  188. package/dist/components/molecules/TraceWaterfall/TraceWaterfall.svelte.d.ts +18 -0
  189. package/dist/components/molecules/TraceWaterfall/TraceWaterfallStory.svelte +55 -0
  190. package/dist/components/molecules/TraceWaterfall/TraceWaterfallStory.svelte.d.ts +18 -0
  191. package/dist/components/molecules/TrackHeader/TrackHeader.stories.d.ts +9 -0
  192. package/dist/components/molecules/TrackHeader/TrackHeader.stories.js +8 -0
  193. package/dist/components/molecules/TrackHeader/TrackHeader.svelte +54 -0
  194. package/dist/components/molecules/TrackHeader/TrackHeader.svelte.d.ts +9 -0
  195. package/dist/components/molecules/TrackHeader/TrackHeaderStory.svelte +10 -0
  196. package/dist/components/molecules/TrackHeader/TrackHeaderStory.svelte.d.ts +3 -0
  197. package/dist/components/molecules/TransportControls/TransportControls.stories.d.ts +9 -0
  198. package/dist/components/molecules/TransportControls/TransportControls.stories.js +8 -0
  199. package/dist/components/molecules/TransportControls/TransportControls.svelte +53 -0
  200. package/dist/components/molecules/TransportControls/TransportControls.svelte.d.ts +12 -0
  201. package/dist/components/molecules/TransportControls/TransportControlsStory.svelte +18 -0
  202. package/dist/components/molecules/TransportControls/TransportControlsStory.svelte.d.ts +3 -0
  203. package/dist/components/molecules/VersionHistoryPanel/VersionHistoryPanel.stories.js +8 -0
  204. package/dist/components/molecules/VersionHistoryPanel/VersionHistoryPanel.svelte +117 -0
  205. package/dist/components/molecules/VersionHistoryPanel/VersionHistoryPanel.svelte.d.ts +20 -0
  206. package/dist/components/molecules/VersionHistoryPanel/VersionHistoryPanelStory.svelte +36 -0
  207. package/dist/components/molecules/VersionHistoryPanel/VersionHistoryPanelStory.svelte.d.ts +18 -0
  208. package/dist/components/molecules/VideoPlayer/VideoPlayer.stories.d.ts +1 -1
  209. package/dist/components/molecules/VideoTrackHeader/VideoTrackHeader.stories.d.ts +9 -0
  210. package/dist/components/molecules/VideoTrackHeader/VideoTrackHeader.stories.js +8 -0
  211. package/dist/components/molecules/VideoTrackHeader/VideoTrackHeader.svelte +59 -0
  212. package/dist/components/molecules/VideoTrackHeader/VideoTrackHeader.svelte.d.ts +9 -0
  213. package/dist/components/molecules/VideoTrackHeader/VideoTrackHeaderStory.svelte +10 -0
  214. package/dist/components/molecules/VideoTrackHeader/VideoTrackHeaderStory.svelte.d.ts +3 -0
  215. package/dist/components/molecules/WaveformRegion/WaveformRegion.stories.js +8 -0
  216. package/dist/components/molecules/WaveformRegion/WaveformRegion.svelte +82 -0
  217. package/dist/components/molecules/WaveformRegion/WaveformRegion.svelte.d.ts +13 -0
  218. package/dist/components/molecules/WaveformRegion/WaveformRegionStory.svelte +17 -0
  219. package/dist/components/molecules/WaveformRegion/WaveformRegionStory.svelte.d.ts +18 -0
  220. package/dist/components/molecules/WidgetCanvas/WidgetCanvas.svelte +13 -4
  221. package/dist/components/molecules/WidgetCanvas/WidgetCanvas.svelte.d.ts +3 -1
  222. package/dist/components/molecules/WidgetCanvas/widgetCanvasContext.d.ts +2 -0
  223. package/dist/components/molecules/WidgetFrame/WidgetFrame.svelte +206 -37
  224. package/dist/components/molecules/WidgetFrame/WidgetFrame.svelte.d.ts +31 -0
  225. package/dist/components/organisms/AudioEditor/AudioEditor.stories.d.ts +12 -0
  226. package/dist/components/organisms/AudioEditor/AudioEditor.stories.js +9 -0
  227. package/dist/components/organisms/AudioEditor/AudioEditor.svelte +273 -0
  228. package/dist/components/organisms/AudioEditor/AudioEditor.svelte.d.ts +13 -0
  229. package/dist/components/organisms/AudioEditor/AudioEditorStory.svelte +10 -0
  230. package/dist/components/organisms/AudioEditor/AudioEditorStory.svelte.d.ts +3 -0
  231. package/dist/components/organisms/BlogEditor/BlogEditor.stories.d.ts +12 -0
  232. package/dist/components/organisms/BlogEditor/BlogEditor.stories.js +9 -0
  233. package/dist/components/organisms/BlogEditor/BlogEditor.svelte +1208 -0
  234. package/dist/components/organisms/BlogEditor/BlogEditor.svelte.d.ts +16 -0
  235. package/dist/components/organisms/BlogEditor/BlogEditorStory.svelte +144 -0
  236. package/dist/components/organisms/BlogEditor/BlogEditorStory.svelte.d.ts +3 -0
  237. package/dist/components/organisms/BlogEditor/DemoBlogCard.svelte +28 -0
  238. package/dist/components/organisms/BlogEditor/DemoBlogCard.svelte.d.ts +10 -0
  239. package/dist/components/organisms/BlogEditor/DemoBlogStats.svelte +34 -0
  240. package/dist/components/organisms/BlogEditor/DemoBlogStats.svelte.d.ts +11 -0
  241. package/dist/components/organisms/BlogEditor/DemoBlogWidget.svelte +13 -0
  242. package/dist/components/organisms/BlogEditor/DemoBlogWidget.svelte.d.ts +8 -0
  243. package/dist/components/organisms/BlogRenderer/BlogRenderer.stories.js +8 -0
  244. package/dist/components/organisms/BlogRenderer/BlogRenderer.svelte +469 -0
  245. package/dist/components/organisms/BlogRenderer/BlogRenderer.svelte.d.ts +14 -0
  246. package/dist/components/organisms/BlogRenderer/BlogRendererStory.svelte +20 -0
  247. package/dist/components/organisms/BlogRenderer/BlogRendererStory.svelte.d.ts +18 -0
  248. package/dist/components/organisms/BlueprintEditor/BlueprintEditor.stories.d.ts +12 -0
  249. package/dist/components/organisms/BlueprintEditor/BlueprintEditor.stories.js +9 -0
  250. package/dist/components/organisms/BlueprintEditor/BlueprintEditor.svelte +1012 -0
  251. package/dist/components/organisms/BlueprintEditor/BlueprintEditor.svelte.d.ts +16 -0
  252. package/dist/components/organisms/BlueprintEditor/BlueprintEditorStory.svelte +76 -0
  253. package/dist/components/organisms/BlueprintEditor/BlueprintEditorStory.svelte.d.ts +3 -0
  254. package/dist/components/organisms/CanvasEditor/CanvasEditor.stories.d.ts +12 -0
  255. package/dist/components/organisms/CanvasEditor/CanvasEditor.stories.js +9 -0
  256. package/dist/components/organisms/CanvasEditor/CanvasEditor.svelte +1680 -0
  257. package/dist/components/organisms/CanvasEditor/CanvasEditor.svelte.d.ts +18 -0
  258. package/dist/components/organisms/CanvasEditor/CanvasEditorStory.svelte +329 -0
  259. package/dist/components/organisms/CanvasEditor/CanvasEditorStory.svelte.d.ts +3 -0
  260. package/dist/components/organisms/DashboardBuilderPage/DashboardBuilderPage.svelte.d.ts +1 -1
  261. package/dist/components/organisms/DesktopShell/DesktopShell.svelte.d.ts +1 -1
  262. package/dist/components/organisms/EditorShell/EditorShell.svelte +123 -28
  263. package/dist/components/organisms/EditorShell/EditorShell.svelte.d.ts +21 -1
  264. package/dist/components/organisms/FileUploader/FileUploader.svelte +77 -15
  265. package/dist/components/organisms/FileUploader/FileUploader.svelte.d.ts +11 -0
  266. package/dist/components/organisms/ImportWizard/ImportWizard.stories.js +8 -0
  267. package/dist/components/organisms/ImportWizard/ImportWizard.svelte +209 -0
  268. package/dist/components/organisms/ImportWizard/ImportWizard.svelte.d.ts +22 -0
  269. package/dist/components/organisms/ImportWizard/ImportWizardStory.svelte +16 -0
  270. package/dist/components/organisms/ImportWizard/ImportWizardStory.svelte.d.ts +18 -0
  271. package/dist/components/organisms/VideoEditor/VideoEditor.stories.d.ts +12 -0
  272. package/dist/components/organisms/VideoEditor/VideoEditor.stories.js +9 -0
  273. package/dist/components/organisms/VideoEditor/VideoEditor.svelte +308 -0
  274. package/dist/components/organisms/VideoEditor/VideoEditor.svelte.d.ts +13 -0
  275. package/dist/components/organisms/VideoEditor/VideoEditorStory.svelte +10 -0
  276. package/dist/components/organisms/VideoEditor/VideoEditorStory.svelte.d.ts +3 -0
  277. package/dist/components/templates/AudioEditorTemplate/AudioEditorTemplate.stories.d.ts +12 -0
  278. package/dist/components/templates/AudioEditorTemplate/AudioEditorTemplate.stories.js +9 -0
  279. package/dist/components/templates/AudioEditorTemplate/AudioEditorTemplate.svelte +22 -0
  280. package/dist/components/templates/AudioEditorTemplate/AudioEditorTemplate.svelte.d.ts +13 -0
  281. package/dist/components/templates/AudioEditorTemplate/AudioEditorTemplateStory.svelte +8 -0
  282. package/dist/components/templates/AudioEditorTemplate/AudioEditorTemplateStory.svelte.d.ts +3 -0
  283. package/dist/components/templates/CanvasEditorTemplate/CanvasEditorTemplate.stories.d.ts +12 -0
  284. package/dist/components/templates/CanvasEditorTemplate/CanvasEditorTemplate.stories.js +9 -0
  285. package/dist/components/templates/CanvasEditorTemplate/CanvasEditorTemplate.svelte +32 -0
  286. package/dist/components/templates/CanvasEditorTemplate/CanvasEditorTemplate.svelte.d.ts +17 -0
  287. package/dist/components/templates/CanvasEditorTemplate/CanvasEditorTemplateStory.svelte +21 -0
  288. package/dist/components/templates/CanvasEditorTemplate/CanvasEditorTemplateStory.svelte.d.ts +3 -0
  289. package/dist/components/templates/VideoEditorTemplate/VideoEditorTemplate.stories.d.ts +12 -0
  290. package/dist/components/templates/VideoEditorTemplate/VideoEditorTemplate.stories.js +9 -0
  291. package/dist/components/templates/VideoEditorTemplate/VideoEditorTemplate.svelte +22 -0
  292. package/dist/components/templates/VideoEditorTemplate/VideoEditorTemplate.svelte.d.ts +13 -0
  293. package/dist/components/templates/VideoEditorTemplate/VideoEditorTemplateStory.svelte +8 -0
  294. package/dist/components/templates/VideoEditorTemplate/VideoEditorTemplateStory.svelte.d.ts +3 -0
  295. package/dist/index.d.ts +83 -1
  296. package/dist/index.js +60 -0
  297. package/dist/types/xyflow-svelte.d.ts +62 -0
  298. package/dist/utils/audioProject.d.ts +19 -0
  299. package/dist/utils/audioProject.js +70 -0
  300. package/dist/utils/blogDocument.d.ts +175 -0
  301. package/dist/utils/blogDocument.js +220 -0
  302. package/dist/utils/blueprintRuntime.d.ts +34 -0
  303. package/dist/utils/blueprintRuntime.js +289 -0
  304. package/dist/utils/canvasDocument.d.ts +239 -0
  305. package/dist/utils/canvasDocument.js +443 -0
  306. package/dist/utils/canvasExport.d.ts +10 -0
  307. package/dist/utils/canvasExport.js +469 -0
  308. package/dist/utils/canvasHierarchy.d.ts +189 -0
  309. package/dist/utils/canvasHierarchy.js +674 -0
  310. package/dist/utils/canvasHistory.d.ts +19 -0
  311. package/dist/utils/canvasHistory.js +48 -0
  312. package/dist/utils/canvasWidget.d.ts +81 -0
  313. package/dist/utils/canvasWidget.js +597 -0
  314. package/dist/utils/mediaTime.d.ts +16 -0
  315. package/dist/utils/mediaTime.js +57 -0
  316. package/dist/utils/mediaTracks.d.ts +61 -0
  317. package/dist/utils/mediaTracks.js +102 -0
  318. package/dist/utils/nodeGraph.d.ts +354 -0
  319. package/dist/utils/nodeGraph.js +1453 -0
  320. package/dist/utils/queryBridge.d.ts +18 -0
  321. package/dist/utils/queryBridge.js +118 -0
  322. package/dist/utils/videoSequence.d.ts +13 -0
  323. package/dist/utils/videoSequence.js +63 -0
  324. 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,29 +26,83 @@
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
 
48
108
  function placeMenu(x: number, y: number) {
@@ -58,22 +118,44 @@
58
118
  });
59
119
  }
60
120
 
121
+ function showMenu() {
122
+ if (!menuEl) return;
123
+ if (!menuEl.matches(':popover-open')) menuEl.showPopover();
124
+ }
125
+
126
+ function hideMenu() {
127
+ if (menuEl?.matches(':popover-open')) menuEl.hidePopover();
128
+ }
129
+
61
130
  function openAt(x: number, y: number) {
62
131
  anchor = { x, y };
63
132
  open = true;
64
133
  highlighted = -1;
65
- suppressOutsideUntil = performance.now() + 500;
134
+ query = '';
66
135
  placeMenu(x, y);
136
+ // Defer past the contextmenu/mouseup that would light-dismiss a popover=auto.
137
+ requestAnimationFrame(() => {
138
+ requestAnimationFrame(() => {
139
+ if (open) showMenu();
140
+ });
141
+ });
67
142
  }
68
143
 
69
144
  function close() {
145
+ if (menuEl?.matches(':popover-open')) {
146
+ menuEl.hidePopover();
147
+ return;
148
+ }
149
+ if (!open && !anchor) return;
70
150
  open = false;
71
151
  anchor = null;
72
152
  highlighted = -1;
153
+ query = '';
154
+ onclose?.();
73
155
  }
74
156
 
75
157
  function selectItem(item: ContextMenuItem) {
76
- if (item.disabled || item.separator) return;
158
+ if (item.disabled || item.separator || item.header) return;
77
159
  onselect?.(item.id, item);
78
160
  close();
79
161
  }
@@ -84,28 +166,42 @@
84
166
  openAt(event.clientX, event.clientY);
85
167
  }
86
168
 
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();
169
+ function onToggle(event: ToggleEvent) {
170
+ if (event.newState === 'open') {
171
+ open = true;
172
+ return;
173
+ }
174
+ open = false;
175
+ anchor = null;
176
+ highlighted = -1;
177
+ query = '';
178
+ onclose?.();
99
179
  }
100
180
 
101
- function handleOutsideClick(event: MouseEvent) {
102
- if (event.button === 2) return;
103
- if (!isOutsideEvent(event)) return;
181
+ /** Manual popover: close on outside pointer. Keep open on scroll —
182
+ * the menu is position:fixed, and closing on scroll also kills scrolling
183
+ * inside a long/searchable menu. */
184
+ function onDocPointerDown(event: PointerEvent) {
185
+ if (!open) return;
186
+ const t = event.target;
187
+ if (t instanceof Node && menuEl?.contains(t)) return;
104
188
  close();
105
189
  }
106
190
 
107
191
  function handleKeydown(event: KeyboardEvent) {
108
- if (!open) return;
192
+ if (!open && !menuEl?.matches(':popover-open')) return;
193
+ const tag = (event.target as HTMLElement)?.tagName;
194
+ if (tag === 'INPUT' || tag === 'TEXTAREA') {
195
+ if (event.key === 'Escape') {
196
+ event.preventDefault();
197
+ close();
198
+ }
199
+ if (event.key === 'ArrowDown' || event.key === 'ArrowUp' || event.key === 'Enter') {
200
+ /* allow nav from search */
201
+ } else {
202
+ return;
203
+ }
204
+ }
109
205
  switch (event.key) {
110
206
  case 'Escape':
111
207
  event.preventDefault();
@@ -121,8 +217,9 @@
121
217
  break;
122
218
  case 'Enter':
123
219
  case ' ': {
220
+ if (tag === 'INPUT' && event.key === ' ') return;
124
221
  event.preventDefault();
125
- const item = highlighted >= 0 ? items[highlighted] : undefined;
222
+ const item = highlighted >= 0 ? displayItems[highlighted] : undefined;
126
223
  if (item) selectItem(item);
127
224
  break;
128
225
  }
@@ -139,49 +236,74 @@
139
236
  }
140
237
  }
141
238
 
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
- }
239
+ $effect(() => {
240
+ if (!open || !anchor) {
241
+ if (!open) hideMenu();
242
+ return;
243
+ }
244
+ const x = anchor.x;
245
+ const y = anchor.y;
246
+ placeMenu(x, y);
247
+ requestAnimationFrame(() => {
248
+ requestAnimationFrame(() => {
249
+ if (open) showMenu();
250
+ });
251
+ });
252
+ });
151
253
 
152
254
  $effect(() => {
153
- if (!open || !anchor) return;
154
- suppressOutsideUntil = performance.now() + 500;
155
- placeMenu(anchor.x, anchor.y);
255
+ if (!open) return;
256
+ // Bind after current pointer gesture ends so the opening right-click doesn't close us.
257
+ const timer = window.setTimeout(() => {
258
+ document.addEventListener('pointerdown', onDocPointerDown, true);
259
+ }, 0);
260
+ return () => {
261
+ window.clearTimeout(timer);
262
+ document.removeEventListener('pointerdown', onDocPointerDown, true);
263
+ };
156
264
  });
157
265
  </script>
158
266
 
159
- <svelte:window
160
- onpointerdown={handleOutsidePointer}
161
- onclick={handleOutsideClick}
162
- onkeydown={handleKeydown}
163
- />
267
+ <svelte:window onkeydown={handleKeydown} />
164
268
 
165
- <!-- svelte-ignore a11y_no_static_element_interactions -->
166
- <div class={['h-full min-h-0 w-full', className]} oncontextmenu={handleContextMenu}>
167
- {#if children}
269
+ {#if children}
270
+ <!-- svelte-ignore a11y_no_static_element_interactions -->
271
+ <div class={['h-full min-h-0 w-full', className]} oncontextmenu={handleContextMenu}>
168
272
  {@render children()}
169
- {/if}
170
- </div>
273
+ </div>
274
+ {/if}
171
275
 
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)}
276
+ <!-- Manual popover — context menus must not light-dismiss on the opening mouseup -->
277
+ <div
278
+ bind:this={menuEl}
279
+ id={menuId}
280
+ popover="manual"
281
+ role="menu"
282
+ tabindex={-1}
283
+ aria-label="Context menu"
284
+ ontoggle={onToggle}
285
+ style={`top:${menuY}px;left:${menuX}px;margin:0;`}
286
+ class={[
287
+ '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',
288
+ !children && className
289
+ ]}
290
+ >
291
+ {#if searchable}
292
+ <div class="border-b border-border p-2">
293
+ <SearchInput bind:value={query} placeholder={searchPlaceholder} size="sm" />
294
+ </div>
295
+ {/if}
296
+ <div class="min-h-0 flex-1 overflow-auto p-1.5">
297
+ {#each displayItems as item, index (item.id)}
183
298
  {#if item.separator}
184
299
  <div class="my-1 h-px bg-border" role="separator"></div>
300
+ {:else if item.header}
301
+ <p
302
+ class="px-2.5 pb-1 pt-2 text-[10px] font-semibold uppercase tracking-wide text-muted"
303
+ role="presentation"
304
+ >
305
+ {item.label}
306
+ </p>
185
307
  {:else}
186
308
  <!-- svelte-ignore a11y_click_events_have_key_events -->
187
309
  <!-- svelte-ignore a11y_no_static_element_interactions -->
@@ -197,22 +319,44 @@
197
319
  highlighted = -1;
198
320
  }}
199
321
  class={[
200
- 'flex cursor-pointer items-center justify-between gap-4 rounded-lg px-2.5 py-2 text-sm font-medium transition-colors',
322
+ 'flex cursor-pointer items-start justify-between gap-3 rounded-lg px-2.5 py-2 text-sm font-medium transition-colors',
201
323
  item.disabled && 'cursor-not-allowed opacity-40',
202
324
  highlighted === index && !item.disabled && 'bg-surface-overlay',
203
325
  item.destructive ? 'text-red-600 dark:text-red-400' : 'text-primary'
204
326
  ]}
205
327
  >
206
- <span class="truncate">{item.label}</span>
328
+ <span class="min-w-0">
329
+ <span class="block truncate">{item.label}</span>
330
+ {#if item.description}
331
+ <span class="block truncate text-[11px] font-normal text-muted">{item.description}</span>
332
+ {/if}
333
+ </span>
207
334
  {#if item.shortcut}
208
335
  <kbd
209
- class="shrink-0 rounded border border-border bg-surface-overlay px-1.5 py-0.5 font-mono text-[10px] text-secondary"
336
+ 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
337
  >
211
338
  {item.shortcut}
212
339
  </kbd>
213
340
  {/if}
214
341
  </div>
215
342
  {/if}
343
+ {:else}
344
+ <p class="px-3 py-6 text-center text-xs text-muted">No matches</p>
216
345
  {/each}
217
346
  </div>
218
- {/if}
347
+ </div>
348
+
349
+ <style>
350
+ /* UA popover defaults to inset:0 — position via top/left only.
351
+ Tailwind `flex` overrides UA display:none — hide until open. */
352
+ .context-menu-popover {
353
+ position: fixed;
354
+ }
355
+ .context-menu-popover:not(:popover-open) {
356
+ display: none !important;
357
+ }
358
+ .context-menu-popover:popover-open {
359
+ inset: unset;
360
+ display: flex;
361
+ }
362
+ </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>
@@ -0,0 +1,18 @@
1
+ import { type AdvancedFilterGroup, type FilterFieldDef } from '../../../utils/advancedFilters.js';
2
+ interface FilterListProps {
3
+ fields?: FilterFieldDef[];
4
+ query?: AdvancedFilterGroup;
5
+ /** Optional QueryBar string mirror */
6
+ queryString?: string;
7
+ emptyLabel?: string;
8
+ clearAllLabel?: string;
9
+ showQueryString?: boolean;
10
+ class?: string;
11
+ onchange?: (query: AdvancedFilterGroup) => void;
12
+ onclear?: (ruleId: string) => void;
13
+ onclearAll?: () => void;
14
+ onquerystring?: (value: string) => void;
15
+ }
16
+ declare const FilterList: import("svelte").Component<FilterListProps, {}, "query" | "queryString">;
17
+ type FilterList = ReturnType<typeof FilterList>;
18
+ export default FilterList;