@kiberon-labs/behave-graph-flow 1.0.0 → 2.0.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 (314) hide show
  1. package/.fallowrc.json +16 -0
  2. package/.storybook/main.ts +32 -0
  3. package/.storybook/preview.ts +16 -0
  4. package/.storybook/styles.css +10 -0
  5. package/.storybook/vscode.css +814 -0
  6. package/.turbo/turbo-build.log +7 -0
  7. package/LICENSE +6 -0
  8. package/README.md +2 -2
  9. package/data/Polynomial.json +510 -0
  10. package/data/sequence.json +337 -0
  11. package/data/trigger-event.json +241 -0
  12. package/data/variable-change.json +210 -0
  13. package/dist/entry.css +4 -0
  14. package/dist/index.css +39 -0
  15. package/dist/index.css.map +1 -0
  16. package/dist/index.d.ts +2282 -0
  17. package/dist/index.d.ts.map +1 -0
  18. package/dist/index.js +14873 -0
  19. package/dist/index.js.map +1 -0
  20. package/docs/notifications.md +246 -0
  21. package/docs/protocol.md +679 -0
  22. package/docs/specifics.md +191 -0
  23. package/package.json +85 -21
  24. package/postcss.config.ts +3 -4
  25. package/src/annotations/index.ts +32 -0
  26. package/src/components/FloatingToolbar/index.module.css +45 -0
  27. package/src/components/FloatingToolbar/index.tsx +256 -0
  28. package/src/components/Flow.tsx +276 -75
  29. package/src/components/contextMenus/NodePicker.module.css +274 -0
  30. package/src/components/contextMenus/NodePicker.tsx +481 -0
  31. package/src/components/contextMenus/edge.tsx +108 -0
  32. package/src/components/contextMenus/node.tsx +155 -0
  33. package/src/components/contextMenus/selection.tsx +77 -0
  34. package/src/components/controls/any/index.tsx +8 -0
  35. package/src/components/controls/boolean/index.tsx +13 -0
  36. package/src/components/controls/colorPicker/InputPopover.module.css +100 -0
  37. package/src/components/controls/colorPicker/InputPopover.tsx +31 -0
  38. package/src/components/controls/colorPicker/index.module.css +18 -0
  39. package/src/components/controls/colorPicker/index.tsx +61 -0
  40. package/src/components/controls/number/index.tsx +35 -0
  41. package/src/components/controls/string/index.tsx +16 -0
  42. package/src/components/edges/index.tsx +469 -0
  43. package/src/components/edges/offsetBezier.ts +134 -0
  44. package/src/components/hotKeys.tsx +20 -0
  45. package/src/components/layoutController/index.module.css +10 -0
  46. package/src/components/layoutController/index.tsx +117 -0
  47. package/src/components/layoutController/utils.ts +205 -0
  48. package/src/components/menubar/defaults.tsx +480 -0
  49. package/src/components/menubar/index.tsx +49 -0
  50. package/src/components/menubar/menuItem.module.css +16 -0
  51. package/src/components/menubar/menuItem.tsx +32 -0
  52. package/src/components/nodes/behave/Node.module.css +23 -0
  53. package/src/components/nodes/behave/Node.tsx +176 -0
  54. package/src/components/nodes/behave/NodeContainer.module.css +87 -0
  55. package/src/components/nodes/behave/NodeContainer.tsx +46 -0
  56. package/src/components/nodes/behave/index.tsx +14 -0
  57. package/src/components/nodes/comment/FormatToolbar.tsx +118 -0
  58. package/src/components/nodes/comment/comment.tsx +103 -0
  59. package/src/components/nodes/comment/styles.module.css +150 -0
  60. package/src/components/nodes/group/index.tsx +109 -0
  61. package/src/components/nodes/wrapper/index.tsx +73 -0
  62. package/src/components/nodes/wrapper/styles.module.css +113 -0
  63. package/src/components/notifications/NotificationProvider.tsx +81 -0
  64. package/src/components/notifications/index.ts +2 -0
  65. package/src/components/notifications/utils.ts +71 -0
  66. package/src/components/panels/alignment/index.module.css +20 -0
  67. package/src/components/panels/alignment/index.tsx +244 -0
  68. package/src/components/panels/base/index.tsx +5 -0
  69. package/src/components/panels/base/styles.module.css +12 -0
  70. package/src/components/panels/conversation/index.module.css +151 -0
  71. package/src/components/panels/conversation/index.tsx +162 -0
  72. package/src/components/panels/events/CustomEventsEditor.tsx +384 -0
  73. package/src/components/panels/events/EditEventPanel.tsx +315 -0
  74. package/src/components/panels/events/ManageEventsPanel.tsx +98 -0
  75. package/src/components/panels/events/index.tsx +23 -0
  76. package/src/components/panels/events/styles.module.css +236 -0
  77. package/src/components/panels/history/index.tsx +92 -0
  78. package/src/components/panels/history/styles.module.css +106 -0
  79. package/src/components/panels/keymaps/index.module.css +78 -0
  80. package/src/components/panels/keymaps/index.tsx +167 -0
  81. package/src/components/panels/layers/index.tsx +240 -0
  82. package/src/components/panels/layers/styles.module.css +110 -0
  83. package/src/components/panels/legend/index.module.css +6 -0
  84. package/src/components/panels/legend/index.tsx +76 -0
  85. package/src/components/panels/logs/index.module.css +212 -0
  86. package/src/components/panels/logs/index.tsx +288 -0
  87. package/src/components/panels/nodeInputs/InputControl.tsx +63 -0
  88. package/src/components/panels/nodeInputs/InputsGroup.tsx +64 -0
  89. package/src/components/panels/nodeInputs/MultipleNodesView.tsx +37 -0
  90. package/src/components/panels/nodeInputs/NodeSettings.tsx +92 -0
  91. package/src/components/panels/nodeInputs/NodeTitleEditor.tsx +125 -0
  92. package/src/components/panels/nodeInputs/OutputsGroup.tsx +65 -0
  93. package/src/components/panels/nodeInputs/SocketGenerators.tsx +32 -0
  94. package/src/components/panels/nodeInputs/index.module.css +284 -0
  95. package/src/components/panels/nodeInputs/index.tsx +339 -0
  96. package/src/components/panels/nodeInputs/useNodeHandlers.ts +76 -0
  97. package/src/components/panels/nodeInputs/useNodeInputsData.ts +173 -0
  98. package/src/components/panels/nodePicker/index.tsx +115 -0
  99. package/src/components/panels/panel/index.module.css +66 -0
  100. package/src/components/panels/panel/index.tsx +88 -0
  101. package/src/components/panels/search/index.module.css +66 -0
  102. package/src/components/panels/search/index.tsx +215 -0
  103. package/src/components/panels/systemSettings/index.tsx +206 -0
  104. package/src/components/panels/systemSettings/styles.module.css +11 -0
  105. package/src/components/panels/traces/GridLines.tsx +38 -0
  106. package/src/components/panels/traces/TimeGrid.tsx +48 -0
  107. package/src/components/panels/traces/TraceLane.tsx +62 -0
  108. package/src/components/panels/traces/TraceTooltip.tsx +22 -0
  109. package/src/components/panels/traces/TracesHeader.tsx +56 -0
  110. package/src/components/panels/traces/index.module.css +166 -0
  111. package/src/components/panels/traces/index.tsx +294 -0
  112. package/src/components/panels/traces/types.ts +48 -0
  113. package/src/components/panels/traces/useDerivedSpans.ts +212 -0
  114. package/src/components/panels/traces/utils.ts +25 -0
  115. package/src/components/panels/variables/CreateVariableScreen.tsx +162 -0
  116. package/src/components/panels/variables/ManageVariablesScreen.tsx +144 -0
  117. package/src/components/panels/variables/index.tsx +125 -0
  118. package/src/components/panels/variables/styles.module.css +236 -0
  119. package/src/components/primitives/icon.module.css +45 -0
  120. package/src/components/primitives/icon.tsx +38 -0
  121. package/src/components/sockets/input/index.tsx +76 -0
  122. package/src/components/sockets/input/styles.module.css +27 -0
  123. package/src/components/sockets/output/index.tsx +61 -0
  124. package/src/components/sockets/output/styles.module.css +27 -0
  125. package/src/css/prosemirror.css +57 -0
  126. package/src/css/rc-dock.css +112 -0
  127. package/src/css/rc-menu.css +100 -0
  128. package/src/css/vars.css +14 -0
  129. package/src/css/vscode.css +13 -0
  130. package/src/entry.css +4 -0
  131. package/src/generators/CustomEventOnTriggeredGenerator.tsx +85 -0
  132. package/src/generators/SequenceGenerator.tsx +104 -0
  133. package/src/generators/SwitchOnIntegerGenerator.tsx +256 -0
  134. package/src/generators/SwitchOnStringGenerator.tsx +263 -0
  135. package/src/generators/registerDefaultGenerators.ts +34 -0
  136. package/src/hooks/useBehaveGraphFlow.ts +17 -16
  137. package/src/hooks/useDetachNodes.ts +39 -0
  138. package/src/hooks/useFlowHandlers.ts +115 -29
  139. package/src/hooks/useWasdPan.ts +188 -0
  140. package/src/index.css +146 -0
  141. package/src/index.ts +36 -18
  142. package/src/layout/dagre.tsx +119 -0
  143. package/src/layout/elk.ts +200 -0
  144. package/src/plugin/alignment/index.ts +81 -0
  145. package/src/plugin/docs/index.tsx +299 -0
  146. package/src/plugin/docs/panel/index.tsx +200 -0
  147. package/src/plugin/docs/panel/styles.module.css +174 -0
  148. package/src/plugin/graphrunner/actions.ts +253 -0
  149. package/src/plugin/graphrunner/buttons.tsx +87 -0
  150. package/src/plugin/graphrunner/client.ts +704 -0
  151. package/src/plugin/graphrunner/index.tsx +255 -0
  152. package/src/plugin/graphrunner/panel.tsx +386 -0
  153. package/src/plugin/graphrunner/runner.ts +358 -0
  154. package/src/plugin/graphrunner/session.ts +243 -0
  155. package/src/plugin/graphrunner/store.ts +206 -0
  156. package/src/plugin/graphrunner/styles.module.css +211 -0
  157. package/src/plugin/graphrunner/transport.ts +224 -0
  158. package/src/plugin/graphrunner/types.ts +672 -0
  159. package/src/plugin/graphrunner-local/execution-utils.ts +457 -0
  160. package/src/plugin/graphrunner-local/index.tsx +166 -0
  161. package/src/plugin/graphrunner-local/panel.tsx +231 -0
  162. package/src/plugin/graphrunner-local/store.ts +41 -0
  163. package/src/plugin/graphrunner-local/styles.module.css +101 -0
  164. package/src/plugin/graphrunner-local/transport.ts +1372 -0
  165. package/src/plugin/graphrunner-local/types.ts +10 -0
  166. package/src/plugin/graphrunner-webworker/graph-executor.worker.ts +633 -0
  167. package/src/plugin/graphrunner-webworker/index.tsx +146 -0
  168. package/src/plugin/graphrunner-webworker/panel.tsx +173 -0
  169. package/src/plugin/graphrunner-webworker/store.ts +89 -0
  170. package/src/plugin/graphrunner-webworker/types.ts +17 -0
  171. package/src/plugin/graphrunner-webworker/worker-transport.ts +123 -0
  172. package/src/plugin/realtime/realtimeRunner.ts +570 -0
  173. package/src/specifics/CustomEventOnTriggeredSpecific.tsx +92 -0
  174. package/src/specifics/CustomEventTriggerSpecific.tsx +141 -0
  175. package/src/specifics/VariableGetSpecific.tsx +110 -0
  176. package/src/specifics/VariableSetSpecific.tsx +110 -0
  177. package/src/specifics/registerDefaultSpecifics.ts +5 -0
  178. package/src/store/actions.tsx +698 -0
  179. package/src/store/chat.ts +73 -0
  180. package/src/store/controls.tsx +62 -0
  181. package/src/store/documentation.tsx +69 -0
  182. package/src/store/events.tsx +116 -0
  183. package/src/store/flow.tsx +245 -0
  184. package/src/store/graphRunnerClient.ts +110 -0
  185. package/src/store/hotKeys.tsx +323 -0
  186. package/src/store/layers.ts +259 -0
  187. package/src/store/legend.tsx +76 -0
  188. package/src/store/logs.ts +28 -0
  189. package/src/store/menubar.ts +41 -0
  190. package/src/store/refs.ts +84 -0
  191. package/src/store/registry.ts +43 -0
  192. package/src/store/selection.ts +22 -0
  193. package/src/store/settings.ts +99 -0
  194. package/src/store/socketGenerator.tsx +54 -0
  195. package/src/store/specific.tsx +75 -0
  196. package/src/store/specs.tsx +35 -0
  197. package/src/store/tabs.ts +278 -0
  198. package/src/store/toolbar.tsx +45 -0
  199. package/src/store/traces.ts +240 -0
  200. package/src/store/variables.ts +37 -0
  201. package/src/system/graph.ts +134 -0
  202. package/src/system/index.ts +3 -0
  203. package/src/system/notifications.ts +98 -0
  204. package/src/system/plugin.ts +27 -0
  205. package/src/system/provider.tsx +22 -0
  206. package/src/system/pubsub.ts +323 -0
  207. package/src/system/system.ts +223 -0
  208. package/src/system/tabLoader.tsx +265 -0
  209. package/src/system/undoRedo.ts +103 -0
  210. package/src/transformers/Uigraph.ts +60 -0
  211. package/src/transformers/behaveToFlow.ts +16 -4
  212. package/src/transformers/flowToBehave.ts +32 -12
  213. package/src/types/NodeMetadata.ts +27 -0
  214. package/src/types/graph.ts +49 -0
  215. package/src/types/nodes.ts +45 -0
  216. package/src/types.ts +16 -0
  217. package/src/util/colors.ts +1 -29
  218. package/src/util/downloadJson.ts +18 -0
  219. package/src/util/extractNodeMetadata.ts +16 -0
  220. package/src/util/getPickerFilters.ts +1 -1
  221. package/src/util/isBehaveNode.ts +6 -0
  222. package/src/util/isValidConnection.ts +28 -15
  223. package/src/util/mergeSockets.ts +29 -0
  224. package/src/util/serializeVariables.ts +66 -0
  225. package/src/util/sockets.ts +43 -0
  226. package/stories/apex/layoutController/example-graph.worker.ts +39 -0
  227. package/stories/apex/layoutController/index.stories.tsx +48 -0
  228. package/stories/apex/layoutController/webworker.stories.tsx +103 -0
  229. package/stories/apex/menubar/menubar.stories.tsx +19 -0
  230. package/stories/components/colorpicker/index.stories.tsx +20 -0
  231. package/stories/components/contextMenus/edge.stories.tsx +32 -0
  232. package/stories/components/contextMenus/node.stories.tsx +26 -0
  233. package/stories/components/contextMenus/nodePicker.stories.tsx +115 -0
  234. package/stories/components/controls/any/index.stories.tsx +19 -0
  235. package/stories/components/controls/boolean/index.stories.tsx +19 -0
  236. package/stories/components/controls/colorPicker/index.stories.tsx +49 -0
  237. package/stories/components/controls/number/index.stories.tsx +19 -0
  238. package/stories/components/controls/string/index.stories.tsx +19 -0
  239. package/stories/components/nodes/behaveNode.stories.tsx +108 -0
  240. package/stories/components/nodes/comment.stories.tsx +106 -0
  241. package/stories/components/panels/alignment.stories.tsx +24 -0
  242. package/stories/components/panels/events.stories.tsx +38 -0
  243. package/stories/components/panels/graphRunner.stories.tsx +317 -0
  244. package/stories/components/panels/history.stories.tsx +37 -0
  245. package/stories/components/panels/keymaps.stories.tsx +21 -0
  246. package/stories/components/panels/legend.stories.tsx +37 -0
  247. package/stories/components/panels/logs.stories.tsx +24 -0
  248. package/stories/components/panels/nodeInputs.stories.tsx +21 -0
  249. package/stories/components/panels/nodePicker.stories.tsx +37 -0
  250. package/stories/components/panels/panel.stories.tsx +39 -0
  251. package/stories/components/panels/search.stories.tsx +24 -0
  252. package/stories/components/panels/systemSettings.stories.tsx +26 -0
  253. package/stories/components/panels/traces.stories.tsx +225 -0
  254. package/stories/components/panels/variables.stories.tsx +24 -0
  255. package/stories/defaults/defaultStoryProvider.tsx +167 -0
  256. package/stories/defaults/systemGenerator.ts +38 -0
  257. package/tests/components/edges/offsetBezier.test.ts +51 -0
  258. package/tests/components/layoutController/utils.test.ts +68 -0
  259. package/tests/components/panels/traces/utils.test.ts +52 -0
  260. package/tests/flowToBehave.test.ts +26 -4
  261. package/tests/notifications.test.ts +87 -0
  262. package/tests/saveLoad.test.ts +372 -0
  263. package/tests/util/calculateNewEdge.test.ts +98 -0
  264. package/tests/util/getSocketsByNodeTypeAndHandleType.test.ts +31 -0
  265. package/tests/util/hasPositionMetaData.test.ts +33 -0
  266. package/tests/util/isBehaveNode.test.ts +22 -0
  267. package/tests/util/isHandleConnected.test.ts +37 -0
  268. package/tests/util/mergeSockets.test.ts +43 -0
  269. package/tests/visual/README.md +64 -0
  270. package/tests/visual/__screenshots__/panels.visual.test.tsx/panel-alignment-chromium-win32.png +0 -0
  271. package/tests/visual/__screenshots__/panels.visual.test.tsx/panel-conversation-chromium-win32.png +0 -0
  272. package/tests/visual/__screenshots__/panels.visual.test.tsx/panel-events-chromium-win32.png +0 -0
  273. package/tests/visual/__screenshots__/panels.visual.test.tsx/panel-history-chromium-win32.png +0 -0
  274. package/tests/visual/__screenshots__/panels.visual.test.tsx/panel-keymaps-chromium-win32.png +0 -0
  275. package/tests/visual/__screenshots__/panels.visual.test.tsx/panel-layers-chromium-win32.png +0 -0
  276. package/tests/visual/__screenshots__/panels.visual.test.tsx/panel-legend-chromium-win32.png +0 -0
  277. package/tests/visual/__screenshots__/panels.visual.test.tsx/panel-logs-chromium-win32.png +0 -0
  278. package/tests/visual/__screenshots__/panels.visual.test.tsx/panel-nodeInputs-chromium-win32.png +0 -0
  279. package/tests/visual/__screenshots__/panels.visual.test.tsx/panel-nodePicker-chromium-win32.png +0 -0
  280. package/tests/visual/__screenshots__/panels.visual.test.tsx/panel-panel-chromium-win32.png +0 -0
  281. package/tests/visual/__screenshots__/panels.visual.test.tsx/panel-search-chromium-win32.png +0 -0
  282. package/tests/visual/__screenshots__/panels.visual.test.tsx/panel-systemSettings-chromium-win32.png +0 -0
  283. package/tests/visual/__screenshots__/panels.visual.test.tsx/panel-traces-chromium-win32.png +0 -0
  284. package/tests/visual/__screenshots__/panels.visual.test.tsx/panel-variables-chromium-win32.png +0 -0
  285. package/tests/visual/panels.visual.test.tsx +76 -0
  286. package/tsconfig.base.json +39 -0
  287. package/tsconfig.json +18 -59
  288. package/tsconfig.prod.json +23 -0
  289. package/tsdown.config.ts +15 -3
  290. package/typedoc.json +7 -7
  291. package/vite.config.js +7 -0
  292. package/vitest.config.ts +5 -2
  293. package/vitest.visual.config.ts +48 -0
  294. package/src/components/AutoSizeInput.tsx +0 -65
  295. package/src/components/Controls.tsx +0 -87
  296. package/src/components/InputSocket.tsx +0 -142
  297. package/src/components/Node.tsx +0 -68
  298. package/src/components/NodeContainer.tsx +0 -46
  299. package/src/components/NodePicker.tsx +0 -77
  300. package/src/components/OutputSocket.tsx +0 -58
  301. package/src/components/modals/ClearModal.tsx +0 -40
  302. package/src/components/modals/HelpModal.tsx +0 -36
  303. package/src/components/modals/LoadModal.tsx +0 -96
  304. package/src/components/modals/Modal.tsx +0 -64
  305. package/src/components/modals/SaveModal.tsx +0 -60
  306. package/src/hooks/useCustomNodeTypes.tsx +0 -31
  307. package/src/hooks/useGraphRunner.ts +0 -104
  308. package/src/hooks/useMergeMap.ts +0 -14
  309. package/src/hooks/useNodeSpecJson.ts +0 -20
  310. package/src/hooks/useQueriableDefinitions.ts +0 -22
  311. package/src/styles.css +0 -8
  312. package/tailwind.config.ts +0 -19
  313. package/tests/tsconfig.json +0 -10
  314. /package/src/{types.d.ts → types-declarations.d.ts} +0 -0
@@ -0,0 +1,103 @@
1
+ import type { Meta, StoryObj } from '@storybook/react-vite';
2
+ import { LayoutController } from '@/components/layoutController';
3
+ import { SystemProvider } from '@/system';
4
+ import { webWorkerGraphRunnerPlugin } from '@/plugin/graphrunner-webworker';
5
+ import { systemGenerator } from '~/defaults/systemGenerator';
6
+ import { useMemo } from 'react';
7
+
8
+ const meta: Meta<typeof LayoutController> = {
9
+ component: LayoutController,
10
+ title: 'Apex/Layout Controller (Web worker)',
11
+ decorators: [(Story) => <Story />],
12
+ parameters: {
13
+ layout: 'fullscreen'
14
+ }
15
+ };
16
+
17
+ export default meta;
18
+
19
+ type Story = StoryObj<typeof meta>;
20
+
21
+ export const Webworker: Story = {
22
+ render: () => {
23
+ const webworkerSystem = useMemo(() => {
24
+ const webworkerSystem = systemGenerator();
25
+
26
+ // Create worker instance from the example worker file
27
+ // The example-graph.worker.ts file shows how to:
28
+ // 1. Import and set up your registry with custom nodes
29
+ // 2. Import the message handling scaffold from graph-executor.worker.ts
30
+ // 3. Handle graph execution in the worker thread
31
+ const graphWorker = new Worker(
32
+ new URL('./example-graph.worker.ts', import.meta.url),
33
+ { type: 'module' }
34
+ );
35
+
36
+ // Register the webworker plugin
37
+ // No registry needed - it's defined inside the worker
38
+ webworkerSystem.registerPlugin(webWorkerGraphRunnerPlugin, {
39
+ worker: graphWorker,
40
+ events: [
41
+ {
42
+ id: '0',
43
+ name: 'Example Event',
44
+ parameters: [
45
+ {
46
+ name: 'exampleParam',
47
+ valueTypeName: 'string',
48
+ defaultValue: 'Foo'
49
+ }
50
+ ],
51
+ description: 'An example event for demonstration purposes.',
52
+ readonly: true
53
+ }
54
+ ],
55
+ variables: [
56
+ {
57
+ id: '0',
58
+ name: 'Example Variable',
59
+ valueTypeName: 'string',
60
+ initialValue: 'Hello, World!',
61
+ description: 'An example variable for demonstration purposes.',
62
+ readonly: true
63
+ }
64
+ ]
65
+ });
66
+
67
+ // Set up a sample graph
68
+ webworkerSystem.flowStore.getState().setGraph({
69
+ nodes: [
70
+ {
71
+ type: 'lifecycle/onStart',
72
+ id: '0',
73
+ flows: {
74
+ flow: {
75
+ nodeId: '1',
76
+ socket: 'flow'
77
+ }
78
+ }
79
+ },
80
+ {
81
+ type: 'debug/log',
82
+ id: '1',
83
+ parameters: {
84
+ text: {
85
+ value: 'Hello from Web Worker!'
86
+ }
87
+ }
88
+ }
89
+ ]
90
+ });
91
+ return webworkerSystem;
92
+ }, []);
93
+
94
+ return (
95
+ <div className="h-dvh">
96
+ <SystemProvider value={webworkerSystem}>
97
+ <LayoutController />
98
+ </SystemProvider>
99
+ </div>
100
+ );
101
+ },
102
+ args: {}
103
+ };
@@ -0,0 +1,19 @@
1
+ import { MenuBar } from '../../../src/components/menubar/index.js';
2
+ import type { Meta, StoryObj } from '@storybook/react-vite';
3
+ import { DefaultSystemProvider } from '~/defaults/defaultStoryProvider.js';
4
+
5
+ const meta: Meta<typeof MenuBar> = {
6
+ title: 'Apex/MenuBar',
7
+ component: MenuBar
8
+ };
9
+
10
+ export default meta;
11
+ type Story = StoryObj<typeof MenuBar>;
12
+ export const Default: Story = {
13
+ render: () => (
14
+ <DefaultSystemProvider>
15
+ <MenuBar />
16
+ </DefaultSystemProvider>
17
+ ),
18
+ args: {}
19
+ };
@@ -0,0 +1,20 @@
1
+ import { ColorPickerPopover } from '@/components/controls/colorPicker/index';
2
+ import React, { useState } from 'react';
3
+ import type { Meta, StoryObj } from '@storybook/react-vite';
4
+
5
+ const meta: Meta<typeof ColorPickerPopover> = {
6
+ title: 'Components/Controls/Color Picker Popover',
7
+ component: ColorPickerPopover
8
+ };
9
+
10
+ export default meta;
11
+ type Story = StoryObj<typeof ColorPickerPopover>;
12
+ export const Default: Story = {
13
+ render: () => {
14
+ // eslint-disable-next-line react-hooks/rules-of-hooks
15
+ const [value, setValue] = useState('#232312');
16
+
17
+ return <ColorPickerPopover value={value} onChange={setValue} />;
18
+ },
19
+ args: {}
20
+ };
@@ -0,0 +1,32 @@
1
+ import type { Meta, StoryObj } from '@storybook/react-vite';
2
+ import { ReactFlowProvider } from 'reactflow';
3
+ import { EdgeContextMenu } from '@/components/contextMenus/edge';
4
+ import { DefaultSystemProvider } from '~/defaults/defaultStoryProvider';
5
+
6
+ const meta: Meta<typeof EdgeContextMenu> = {
7
+ title: 'Components/ContextMenus/Edge',
8
+ component: EdgeContextMenu
9
+ };
10
+
11
+ export default meta;
12
+ type Story = StoryObj<typeof EdgeContextMenu>;
13
+
14
+ export const Default: Story = {
15
+ render: () => {
16
+ return (
17
+ <DefaultSystemProvider>
18
+ <ReactFlowProvider>
19
+ <div style={{ position: 'relative', width: 320, height: 180 }}>
20
+ <EdgeContextMenu
21
+ edgeID="edge-0"
22
+ sourceID="0"
23
+ targetID="1"
24
+ top={16}
25
+ left={16}
26
+ />
27
+ </div>
28
+ </ReactFlowProvider>
29
+ </DefaultSystemProvider>
30
+ );
31
+ }
32
+ };
@@ -0,0 +1,26 @@
1
+ import type { Meta, StoryObj } from '@storybook/react-vite';
2
+ import { ReactFlowProvider } from 'reactflow';
3
+ import { NodeContextMenu } from '@/components/contextMenus/node';
4
+ import { DefaultSystemProvider } from '~/defaults/defaultStoryProvider';
5
+
6
+ const meta: Meta<typeof NodeContextMenu> = {
7
+ title: 'Components/ContextMenus/Node',
8
+ component: NodeContextMenu
9
+ };
10
+
11
+ export default meta;
12
+ type Story = StoryObj<typeof NodeContextMenu>;
13
+
14
+ export const Default: Story = {
15
+ render: () => {
16
+ return (
17
+ <DefaultSystemProvider>
18
+ <ReactFlowProvider>
19
+ <div style={{ position: 'relative', width: 320, height: 180 }}>
20
+ <NodeContextMenu nodeID="1" top={16} left={16} />
21
+ </div>
22
+ </ReactFlowProvider>
23
+ </DefaultSystemProvider>
24
+ );
25
+ }
26
+ };
@@ -0,0 +1,115 @@
1
+ import type { Meta, StoryObj } from '@storybook/react-vite';
2
+ import type { NodeSpecJSON } from '@kiberon-labs/behave-graph';
3
+ import React from 'react';
4
+ import { ReactFlow } from 'reactflow';
5
+
6
+ import { NodePicker } from '@/components/contextMenus/NodePicker';
7
+ import { DefaultSystemProvider } from '~/defaults/defaultStoryProvider';
8
+
9
+ const demoSpecs: NodeSpecJSON[] = [
10
+ {
11
+ type: 'lifecycle/onStart',
12
+ label: 'On Start',
13
+ category: 'Event',
14
+ inputs: [],
15
+ outputs: [{ name: 'flow', valueType: 'flow' }],
16
+ configuration: []
17
+ },
18
+ {
19
+ type: 'flow/branch',
20
+ label: 'Branch',
21
+ category: 'Flow',
22
+ inputs: [
23
+ { name: 'flow', valueType: 'flow' },
24
+ {
25
+ name: 'condition',
26
+ valueType: 'boolean',
27
+ defaultValue: false
28
+ }
29
+ ],
30
+ outputs: [
31
+ { name: 'true', valueType: 'flow' },
32
+ { name: 'false', valueType: 'flow' }
33
+ ],
34
+ configuration: []
35
+ },
36
+ {
37
+ type: 'time/delay',
38
+ label: 'Delay',
39
+ category: 'Time',
40
+ inputs: [
41
+ { name: 'flow', valueType: 'flow' },
42
+ { name: 'seconds', valueType: 'number', defaultValue: 1 }
43
+ ],
44
+ outputs: [{ name: 'flow', valueType: 'flow' }],
45
+ configuration: []
46
+ },
47
+ {
48
+ type: 'debug/log',
49
+ label: 'Log',
50
+ category: 'Action',
51
+ inputs: [
52
+ { name: 'flow', valueType: 'flow' },
53
+ { name: 'text', valueType: 'string', defaultValue: 'Hello' }
54
+ ],
55
+ outputs: [{ name: 'flow', valueType: 'flow' }],
56
+ configuration: []
57
+ }
58
+ ];
59
+
60
+ const getDemoImage = (spec: NodeSpecJSON) => {
61
+ // small inline SVG thumbnail per category
62
+ const cat = String(spec.category ?? 'Other');
63
+ const label = String(spec.label ?? spec.type);
64
+ const svg = `<svg xmlns="http://www.w3.org/2000/svg" width="96" height="96">
65
+ <rect width="96" height="96" rx="10" ry="10" fill="var(--vscode-editorWidget-background, #2b2b2b)" />
66
+ <text x="12" y="38" font-family="sans-serif" font-size="12" fill="var(--vscode-foreground, #ddd)">${cat}</text>
67
+ <text x="12" y="62" font-family="sans-serif" font-size="18" fill="var(--vscode-foreground, #ddd)">${label.slice(
68
+ 0,
69
+ 10
70
+ )}</text>
71
+ </svg>`;
72
+
73
+ return `data:image/svg+xml;utf8,${encodeURIComponent(svg)}`;
74
+ };
75
+
76
+ function Demo({ filters }: { filters?: any }) {
77
+ return (
78
+ <div style={{ width: 980, height: 680 }}>
79
+ <ReactFlow nodes={[]} edges={[]} fitView>
80
+ <NodePicker
81
+ position={{ x: 24, y: 24 }}
82
+ specJSON={demoSpecs}
83
+ filters={filters}
84
+ getNodeImage={getDemoImage}
85
+ onClose={() => undefined}
86
+ onPickNode={() => undefined}
87
+ />
88
+ </ReactFlow>
89
+ </div>
90
+ );
91
+ }
92
+
93
+ const meta: Meta<typeof Demo> = {
94
+ title: 'Components/ContextMenus/NodePicker',
95
+ component: Demo
96
+ };
97
+
98
+ export default meta;
99
+ type Story = StoryObj<typeof Demo>;
100
+
101
+ export const Default: Story = {
102
+ render: () => (
103
+ <DefaultSystemProvider>
104
+ <Demo />
105
+ </DefaultSystemProvider>
106
+ )
107
+ };
108
+
109
+ export const FilteredToBooleanInputs: Story = {
110
+ render: () => (
111
+ <DefaultSystemProvider>
112
+ <Demo filters={{ handleType: 'target', valueType: 'boolean' }} />
113
+ </DefaultSystemProvider>
114
+ )
115
+ };
@@ -0,0 +1,19 @@
1
+ import { AnyControl } from '@/components/controls/any';
2
+ import React, { useState } from 'react';
3
+ import type { Meta, StoryObj } from '@storybook/react-vite';
4
+
5
+ const meta: Meta<typeof AnyControl> = {
6
+ title: 'Components/Controls/AnyControl',
7
+ component: AnyControl
8
+ };
9
+
10
+ export default meta;
11
+ type Story = StoryObj<typeof AnyControl>;
12
+
13
+ export const Default: Story = {
14
+ render: () => {
15
+ const [value, setValue] = useState({ key: 'value' });
16
+ return <AnyControl value={value} onChange={setValue} />;
17
+ },
18
+ args: {}
19
+ };
@@ -0,0 +1,19 @@
1
+ import { BooleanControl } from '@/components/controls/boolean';
2
+ import React, { useState } from 'react';
3
+ import type { Meta, StoryObj } from '@storybook/react-vite';
4
+
5
+ const meta: Meta<typeof BooleanControl> = {
6
+ title: 'Components/Controls/BooleanControl',
7
+ component: BooleanControl
8
+ };
9
+
10
+ export default meta;
11
+ type Story = StoryObj<typeof BooleanControl>;
12
+
13
+ export const Default: Story = {
14
+ render: () => {
15
+ const [value, setValue] = useState(false);
16
+ return <BooleanControl value={value} onChange={setValue} />;
17
+ },
18
+ args: {}
19
+ };
@@ -0,0 +1,49 @@
1
+ import React, { useState } from 'react';
2
+ import type { Meta, StoryObj } from '@storybook/react-vite';
3
+ import { ColorControl } from '@/components/controls/colorPicker';
4
+
5
+ const meta: Meta<typeof ColorControl> = {
6
+ title: 'Components/Controls/ColorControl',
7
+ component: ColorControl,
8
+ parameters: {
9
+ docs: {
10
+ description: {
11
+ component:
12
+ 'ColorPicker control for selecting colors. Supports different color values and states.'
13
+ }
14
+ }
15
+ }
16
+ };
17
+ export default meta;
18
+
19
+ type Story = StoryObj<typeof ColorControl>;
20
+
21
+ export const Default: Story = {
22
+ render: () => {
23
+ const [value, setValue] = useState('#ff0000');
24
+ return <ColorControl value={value} onChange={setValue} />;
25
+ },
26
+ args: {},
27
+ parameters: {
28
+ docs: {
29
+ description: {
30
+ story: 'Default ColorControl with a red color.'
31
+ }
32
+ }
33
+ }
34
+ };
35
+
36
+ export const Green: Story = {
37
+ render: () => {
38
+ const [value, setValue] = useState('#00ff00');
39
+ return <ColorControl value={value} onChange={setValue} />;
40
+ },
41
+ args: {},
42
+ parameters: {
43
+ docs: {
44
+ description: {
45
+ story: 'ColorControl with a green color.'
46
+ }
47
+ }
48
+ }
49
+ };
@@ -0,0 +1,19 @@
1
+ import { NumberControl } from '@/components/controls/number';
2
+ import React, { useState } from 'react';
3
+ import type { Meta, StoryObj } from '@storybook/react-vite';
4
+
5
+ const meta: Meta<typeof NumberControl> = {
6
+ title: 'Components/Controls/NumberControl',
7
+ component: NumberControl
8
+ };
9
+
10
+ export default meta;
11
+ type Story = StoryObj<typeof NumberControl>;
12
+
13
+ export const Default: Story = {
14
+ render: () => {
15
+ const [value, setValue] = useState(0);
16
+ return <NumberControl value={value} onChange={setValue} />;
17
+ },
18
+ args: {}
19
+ };
@@ -0,0 +1,19 @@
1
+ import { StringControl } from '@/components/controls/string';
2
+ import React, { useState } from 'react';
3
+ import type { Meta, StoryObj } from '@storybook/react-vite';
4
+
5
+ const meta: Meta<typeof StringControl> = {
6
+ title: 'Components/Controls/StringControl',
7
+ component: StringControl
8
+ };
9
+
10
+ export default meta;
11
+ type Story = StoryObj<typeof StringControl>;
12
+
13
+ export const Default: Story = {
14
+ render: () => {
15
+ const [value, setValue] = useState('Hello');
16
+ return <StringControl value={value} onChange={setValue} />;
17
+ },
18
+ args: {}
19
+ };
@@ -0,0 +1,108 @@
1
+ import type { Meta, StoryObj } from '@storybook/react-vite';
2
+ import {
3
+ Background,
4
+ BackgroundVariant,
5
+ ReactFlow,
6
+ ReactFlowProvider,
7
+ useEdgesState,
8
+ useNodesState
9
+ } from 'reactflow';
10
+ import React, { useMemo } from 'react';
11
+ import { useStore } from 'zustand';
12
+
13
+ import { DefaultSystemProvider } from '~/defaults/defaultStoryProvider';
14
+ import { useSystem } from '@/system/provider';
15
+ import { Node as BehaveNode } from '@/components/nodes/behave/Node';
16
+ import { Flow } from '@/components/Flow';
17
+
18
+ function Canvas({ selectedId }: { selectedId?: string }) {
19
+ const sys = useSystem();
20
+ const allSpecs = useStore(sys.specStore, (s) => s.specs);
21
+
22
+ const specDict = useMemo(() => {
23
+ const dict: Record<string, (typeof allSpecs)[number]> = {};
24
+ for (const spec of allSpecs) {
25
+ dict[spec.type] = spec;
26
+ }
27
+ return dict;
28
+ }, [allSpecs]);
29
+
30
+ const nodeTypes = useMemo(() => {
31
+ return {
32
+ behaveNode: (props: any) => {
33
+ const spec = specDict[props.data?.type];
34
+ if (!spec) {
35
+ return (
36
+ <div style={{ padding: 8 }}>
37
+ Missing spec for type: {String(props.data?.type)}
38
+ </div>
39
+ );
40
+ }
41
+
42
+ return <BehaveNode {...props} spec={spec} allSpecs={allSpecs} />;
43
+ }
44
+ };
45
+ }, [allSpecs, specDict]);
46
+
47
+ const [nodes, , onNodesChange] = useNodesState([
48
+ {
49
+ id: '0',
50
+ type: 'behaveNode',
51
+ position: { x: 0, y: 0 },
52
+ selected: selectedId === '0',
53
+ data: {
54
+ annotations: {},
55
+ configuration: {},
56
+ type: 'lifecycle/onStart',
57
+ ports: {}
58
+ }
59
+ }
60
+ ]);
61
+
62
+ const [edges, , onEdgesChange] = useEdgesState([
63
+ {
64
+ id: 'e0-1',
65
+ source: '0',
66
+ sourceHandle: 'flow',
67
+ target: '1',
68
+ targetHandle: 'flow'
69
+ }
70
+ ]);
71
+
72
+ return (
73
+ <div style={{ width: 900, height: 520 }}>
74
+ <ReactFlow
75
+ nodeTypes={nodeTypes}
76
+ nodes={nodes}
77
+ edges={edges}
78
+ onNodesChange={onNodesChange}
79
+ onEdgesChange={onEdgesChange}
80
+ fitView
81
+ >
82
+ <Background
83
+ variant={BackgroundVariant.Lines}
84
+ color="#373737"
85
+ style={{ backgroundColor: 'var(--colors-bgCanvas)' }}
86
+ />
87
+ </ReactFlow>
88
+ </div>
89
+ );
90
+ }
91
+
92
+ const meta: Meta<typeof Canvas> = {
93
+ title: 'Components/Nodes/BehaveNode',
94
+ component: Canvas
95
+ };
96
+
97
+ export default meta;
98
+ type Story = StoryObj<typeof Canvas>;
99
+
100
+ export const Default: Story = {
101
+ render: () => (
102
+ <DefaultSystemProvider>
103
+ <ReactFlowProvider>
104
+ <Canvas />
105
+ </ReactFlowProvider>
106
+ </DefaultSystemProvider>
107
+ )
108
+ };
@@ -0,0 +1,106 @@
1
+ import type { Meta, StoryObj } from '@storybook/react-vite';
2
+ import {
3
+ Background,
4
+ BackgroundVariant,
5
+ ReactFlow,
6
+ ReactFlowProvider,
7
+ useEdgesState,
8
+ useNodesState
9
+ } from 'reactflow';
10
+ import { useMemo } from 'react';
11
+ import { useStore } from 'zustand';
12
+
13
+ import { DefaultSystemProvider } from '~/defaults/defaultStoryProvider';
14
+ import { useSystem } from '@/system/provider';
15
+ import { CommentNode } from '@/components/nodes/comment/comment';
16
+
17
+ function Canvas({ selectedId }: { selectedId?: string }) {
18
+ const sys = useSystem();
19
+ const allSpecs = useStore(sys.specStore, (s) => s.specs);
20
+
21
+ const specDict = useMemo(() => {
22
+ const dict: Record<string, (typeof allSpecs)[number]> = {};
23
+ for (const spec of allSpecs) {
24
+ dict[spec.type] = spec;
25
+ }
26
+ return dict;
27
+ }, [allSpecs]);
28
+
29
+ const nodeTypes = useMemo(() => {
30
+ return {
31
+ comment: CommentNode
32
+ };
33
+ }, [allSpecs, specDict]);
34
+
35
+ const [nodes, , onNodesChange] = useNodesState([
36
+ {
37
+ id: '0',
38
+ type: 'comment',
39
+ position: { x: 0, y: 0 },
40
+ selected: selectedId === '0',
41
+ data: {
42
+ annotations: {},
43
+ configuration: {},
44
+ type: 'lifecycle/onStart',
45
+ ports: {}
46
+ }
47
+ }
48
+ ]);
49
+
50
+ const [edges, , onEdgesChange] = useEdgesState([
51
+ {
52
+ id: 'e0-1',
53
+ source: '0',
54
+ sourceHandle: 'flow',
55
+ target: '1',
56
+ targetHandle: 'flow'
57
+ }
58
+ ]);
59
+
60
+ return (
61
+ <div style={{ width: 900, height: 520 }}>
62
+ <ReactFlow
63
+ nodeTypes={nodeTypes}
64
+ nodes={nodes}
65
+ edges={edges}
66
+ onNodesChange={onNodesChange}
67
+ onEdgesChange={onEdgesChange}
68
+ fitView
69
+ >
70
+ <Background
71
+ variant={BackgroundVariant.Lines}
72
+ color="#373737"
73
+ style={{ backgroundColor: 'var(--colors-bgCanvas)' }}
74
+ />
75
+ </ReactFlow>
76
+ </div>
77
+ );
78
+ }
79
+
80
+ const meta: Meta<typeof Canvas> = {
81
+ title: 'Components/Nodes/Comment',
82
+ component: Canvas
83
+ };
84
+
85
+ export default meta;
86
+ type Story = StoryObj<typeof Canvas>;
87
+
88
+ export const Default: Story = {
89
+ render: () => (
90
+ <DefaultSystemProvider>
91
+ <ReactFlowProvider>
92
+ <Canvas />
93
+ </ReactFlowProvider>
94
+ </DefaultSystemProvider>
95
+ )
96
+ };
97
+
98
+ export const Selected: Story = {
99
+ render: () => (
100
+ <DefaultSystemProvider>
101
+ <ReactFlowProvider>
102
+ <Canvas selectedId="1" />
103
+ </ReactFlowProvider>
104
+ </DefaultSystemProvider>
105
+ )
106
+ };
@@ -0,0 +1,24 @@
1
+ import { AlignmentPanel } from '@/components/panels/alignment';
2
+ import type { Meta, StoryObj } from '@storybook/react-vite';
3
+ import { DefaultSystemProvider } from '~/defaults/defaultStoryProvider';
4
+
5
+ const meta: Meta<typeof AlignmentPanel> = {
6
+ title: 'Components/Panels/Alignment',
7
+ component: AlignmentPanel,
8
+ parameters: {
9
+ layout: 'fullscreen'
10
+ }
11
+ };
12
+
13
+ export default meta;
14
+ type Story = StoryObj<typeof AlignmentPanel>;
15
+ export const Default: Story = {
16
+ render: () => {
17
+ return (
18
+ <DefaultSystemProvider>
19
+ <AlignmentPanel />
20
+ </DefaultSystemProvider>
21
+ );
22
+ },
23
+ args: {}
24
+ };