@kiberon-labs/behave-graph-flow 1.0.0 → 3.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.
- package/.fallowrc.json +16 -0
- package/.storybook/main.ts +32 -0
- package/.storybook/manager.ts +6 -0
- package/.storybook/preview.ts +64 -0
- package/.storybook/styles.css +16 -0
- package/.turbo/turbo-build.log +7 -0
- package/CHANGELOG.md +368 -0
- package/LICENSE +6 -0
- package/README.md +2 -2
- package/data/Polynomial.json +510 -0
- package/data/sequence.json +337 -0
- package/data/trigger-event.json +241 -0
- package/data/variable-change.json +210 -0
- package/dist/AnyControlImpl-Ds-CShIB.js +20 -0
- package/dist/AnyControlImpl-Ds-CShIB.js.map +1 -0
- package/dist/DocumentationBrowserPanelImpl-deZNzFX8.js +166 -0
- package/dist/DocumentationBrowserPanelImpl-deZNzFX8.js.map +1 -0
- package/dist/entry.css +4 -0
- package/dist/index.css +42 -0
- package/dist/index.css.map +1 -0
- package/dist/index.d.ts +3597 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +18009 -0
- package/dist/index.js.map +1 -0
- package/dist/noteImpl-KkrrWgJd.js +242 -0
- package/dist/noteImpl-KkrrWgJd.js.map +1 -0
- package/dist/styles.module-CvmpDkZj.css +3 -0
- package/dist/styles.module-CvmpDkZj.css.map +1 -0
- package/dist/styles.module-DZxg8aW9.js +271 -0
- package/dist/styles.module-DZxg8aW9.js.map +1 -0
- package/dist/useChangeNodeData-ChQGK7AI.js +23 -0
- package/dist/useChangeNodeData-ChQGK7AI.js.map +1 -0
- package/docs/notifications.md +246 -0
- package/docs/protocol.md +702 -0
- package/docs/specifics.md +191 -0
- package/package.json +82 -22
- package/postcss.config.ts +3 -4
- package/src/annotations/index.ts +32 -0
- package/src/components/FloatingToolbar/index.module.css +37 -0
- package/src/components/FloatingToolbar/index.tsx +256 -0
- package/src/components/Flow.tsx +287 -75
- package/src/components/contextMenus/DynamicContextMenu.tsx +85 -0
- package/src/components/contextMenus/NodePicker.module.css +274 -0
- package/src/components/contextMenus/NodePicker.tsx +481 -0
- package/src/components/contextMenus/edge.tsx +22 -0
- package/src/components/contextMenus/node.tsx +15 -0
- package/src/components/contextMenus/selection.tsx +11 -0
- package/src/components/controls/any/AnyControlImpl.tsx +14 -0
- package/src/components/controls/any/index.tsx +19 -0
- package/src/components/controls/boolean/index.tsx +13 -0
- package/src/components/controls/colorPicker/InputPopover.module.css +100 -0
- package/src/components/controls/colorPicker/InputPopover.tsx +31 -0
- package/src/components/controls/colorPicker/index.module.css +18 -0
- package/src/components/controls/colorPicker/index.tsx +61 -0
- package/src/components/controls/number/index.tsx +35 -0
- package/src/components/controls/string/index.tsx +16 -0
- package/src/components/edges/index.tsx +475 -0
- package/src/components/edges/offsetBezier.ts +134 -0
- package/src/components/hotKeys.tsx +20 -0
- package/src/components/layoutController/index.module.css +13 -0
- package/src/components/layoutController/index.tsx +140 -0
- package/src/components/layoutController/utils.ts +248 -0
- package/src/components/menubar/defaults.tsx +516 -0
- package/src/components/menubar/index.tsx +49 -0
- package/src/components/menubar/menuItem.module.css +31 -0
- package/src/components/menubar/menuItem.tsx +65 -0
- package/src/components/nodes/behave/Node.module.css +23 -0
- package/src/components/nodes/behave/Node.tsx +176 -0
- package/src/components/nodes/behave/NodeContainer.module.css +88 -0
- package/src/components/nodes/behave/NodeContainer.tsx +46 -0
- package/src/components/nodes/behave/index.tsx +14 -0
- package/src/components/nodes/group/index.tsx +109 -0
- package/src/components/nodes/wrapper/index.tsx +73 -0
- package/src/components/nodes/wrapper/styles.module.css +87 -0
- package/src/components/notifications/NotificationProvider.tsx +81 -0
- package/src/components/notifications/index.ts +2 -0
- package/src/components/notifications/utils.ts +71 -0
- package/src/components/panels/alignment/index.module.css +10 -0
- package/src/components/panels/alignment/index.tsx +244 -0
- package/src/components/panels/base/index.tsx +5 -0
- package/src/components/panels/base/styles.module.css +12 -0
- package/src/components/panels/common/PanelHeader.module.css +24 -0
- package/src/components/panels/common/PanelHeader.tsx +22 -0
- package/src/components/panels/common/SectionTitle.module.css +13 -0
- package/src/components/panels/common/SectionTitle.tsx +10 -0
- package/src/components/panels/events/EditEventPanel.tsx +324 -0
- package/src/components/panels/events/ManageEventsPanel.tsx +101 -0
- package/src/components/panels/events/index.tsx +23 -0
- package/src/components/panels/events/styles.module.css +178 -0
- package/src/components/panels/graphProperties/index.tsx +125 -0
- package/src/components/panels/history/index.tsx +92 -0
- package/src/components/panels/history/styles.module.css +97 -0
- package/src/components/panels/keymaps/index.module.css +68 -0
- package/src/components/panels/keymaps/index.tsx +166 -0
- package/src/components/panels/layers/index.tsx +245 -0
- package/src/components/panels/layers/styles.module.css +107 -0
- package/src/components/panels/legend/index.module.css +6 -0
- package/src/components/panels/legend/index.tsx +76 -0
- package/src/components/panels/logs/index.module.css +218 -0
- package/src/components/panels/logs/index.tsx +288 -0
- package/src/components/panels/nodeInputs/InputControl.tsx +63 -0
- package/src/components/panels/nodeInputs/InputsGroup.tsx +65 -0
- package/src/components/panels/nodeInputs/MultipleNodesView.tsx +37 -0
- package/src/components/panels/nodeInputs/NodeSettings.tsx +92 -0
- package/src/components/panels/nodeInputs/NodeTitleEditor.tsx +125 -0
- package/src/components/panels/nodeInputs/OutputsGroup.tsx +55 -0
- package/src/components/panels/nodeInputs/SocketGenerators.tsx +32 -0
- package/src/components/panels/nodeInputs/index.module.css +308 -0
- package/src/components/panels/nodeInputs/index.tsx +349 -0
- package/src/components/panels/nodeInputs/useNodeHandlers.ts +76 -0
- package/src/components/panels/nodeInputs/useNodeInputsData.ts +153 -0
- package/src/components/panels/nodePicker/index.tsx +115 -0
- package/src/components/panels/panel/index.module.css +66 -0
- package/src/components/panels/panel/index.tsx +88 -0
- package/src/components/panels/search/index.module.css +16 -0
- package/src/components/panels/search/index.tsx +215 -0
- package/src/components/panels/systemSettings/ConversionsSettings.tsx +203 -0
- package/src/components/panels/systemSettings/index.tsx +251 -0
- package/src/components/panels/systemSettings/styles.module.css +138 -0
- package/src/components/panels/traces/GridLines.tsx +38 -0
- package/src/components/panels/traces/TimeGrid.tsx +48 -0
- package/src/components/panels/traces/TraceLane.tsx +62 -0
- package/src/components/panels/traces/TraceTooltip.tsx +22 -0
- package/src/components/panels/traces/TracesHeader.tsx +56 -0
- package/src/components/panels/traces/index.module.css +159 -0
- package/src/components/panels/traces/index.tsx +298 -0
- package/src/components/panels/traces/types.ts +48 -0
- package/src/components/panels/traces/useDerivedSpans.ts +307 -0
- package/src/components/panels/traces/utils.ts +33 -0
- package/src/components/panels/variables/CreateVariableScreen.tsx +162 -0
- package/src/components/panels/variables/ManageVariablesScreen.tsx +147 -0
- package/src/components/panels/variables/index.tsx +125 -0
- package/src/components/panels/variables/styles.module.css +149 -0
- package/src/components/primitives/icon.module.css +45 -0
- package/src/components/primitives/icon.tsx +38 -0
- package/src/components/sockets/input/index.tsx +83 -0
- package/src/components/sockets/input/styles.module.css +26 -0
- package/src/components/sockets/output/index.tsx +68 -0
- package/src/components/sockets/output/styles.module.css +22 -0
- package/src/css/notes.css +135 -0
- package/src/css/prosemirror.css +57 -0
- package/src/css/rc-dock.css +212 -0
- package/src/css/rc-menu.css +101 -0
- package/src/css/themes/kiberon.css +127 -0
- package/src/css/vars.css +198 -0
- package/src/css/vscode-elements.css +124 -0
- package/src/entry.css +4 -0
- package/src/generators/CallSubgraphGenerator.tsx +136 -0
- package/src/generators/CustomEventOnTriggeredGenerator.tsx +85 -0
- package/src/generators/GraphBoundaryGenerator.module.css +32 -0
- package/src/generators/GraphBoundaryGenerator.tsx +193 -0
- package/src/generators/SequenceGenerator.tsx +104 -0
- package/src/generators/SwitchOnIntegerGenerator.tsx +256 -0
- package/src/generators/SwitchOnStringGenerator.tsx +263 -0
- package/src/generators/callSubgraphSync.ts +126 -0
- package/src/generators/registerDefaultGenerators.ts +55 -0
- package/src/generators/registerDefaults.ts +26 -0
- package/src/hooks/useBehaveGraphFlow.ts +17 -16
- package/src/hooks/useFlowHandlers.ts +154 -30
- package/src/hooks/useWasdPan.ts +210 -0
- package/src/index.css +134 -0
- package/src/index.ts +53 -18
- package/src/manifest/contributionRegistry.ts +93 -0
- package/src/manifest/index.ts +4 -0
- package/src/manifest/loadManifest.ts +82 -0
- package/src/manifest/manifestPlugin.ts +29 -0
- package/src/manifest/passthroughValueType.ts +40 -0
- package/src/plugin/alignment/index.ts +91 -0
- package/src/plugin/autosave/controller.ts +366 -0
- package/src/plugin/autosave/index.tsx +114 -0
- package/src/plugin/autosave/panel/BackupPanel.tsx +141 -0
- package/src/plugin/autosave/panel/index.tsx +1 -0
- package/src/plugin/autosave/panel/styles.module.css +56 -0
- package/src/plugin/autosave/settings.ts +65 -0
- package/src/plugin/autosave/storage.ts +147 -0
- package/src/plugin/docs/index.tsx +297 -0
- package/src/plugin/docs/panel/DocumentationBrowserPanelImpl.tsx +200 -0
- package/src/plugin/docs/panel/index.tsx +21 -0
- package/src/plugin/docs/panel/styles.module.css +174 -0
- package/src/plugin/graphrunner/actions.ts +326 -0
- package/src/plugin/graphrunner/buttons.tsx +95 -0
- package/src/plugin/graphrunner/client.ts +707 -0
- package/src/plugin/graphrunner/index.tsx +184 -0
- package/src/plugin/graphrunner/panel.tsx +386 -0
- package/src/plugin/graphrunner/runController.ts +283 -0
- package/src/plugin/graphrunner/runner.ts +187 -0
- package/src/plugin/graphrunner/session.ts +243 -0
- package/src/plugin/graphrunner/store.ts +196 -0
- package/src/plugin/graphrunner/styles.module.css +171 -0
- package/src/plugin/graphrunner/transport.ts +250 -0
- package/src/plugin/graphrunner/types.ts +693 -0
- package/src/plugin/graphrunner-local/execution-utils.ts +637 -0
- package/src/plugin/graphrunner-local/index.tsx +172 -0
- package/src/plugin/graphrunner-local/panel.tsx +187 -0
- package/src/plugin/graphrunner-local/store.ts +41 -0
- package/src/plugin/graphrunner-local/styles.module.css +82 -0
- package/src/plugin/graphrunner-local/transport.ts +1339 -0
- package/src/plugin/graphrunner-local/types.ts +10 -0
- package/src/plugin/graphrunner-webworker/graph-executor.worker.ts +635 -0
- package/src/plugin/graphrunner-webworker/index.tsx +140 -0
- package/src/plugin/graphrunner-webworker/panel.tsx +173 -0
- package/src/plugin/graphrunner-webworker/store.ts +98 -0
- package/src/plugin/graphrunner-webworker/worker-transport.ts +123 -0
- package/src/plugin/kitchen-sink/index.ts +38 -0
- package/src/plugin/layout/dagre.ts +131 -0
- package/src/plugin/layout/elk.ts +216 -0
- package/src/plugin/layout/index.ts +80 -0
- package/src/plugin/notes/FormatToolbar.tsx +200 -0
- package/src/plugin/notes/index.tsx +191 -0
- package/src/plugin/notes/nodeActions.ts +100 -0
- package/src/plugin/notes/note.tsx +20 -0
- package/src/plugin/notes/noteImpl.tsx +89 -0
- package/src/plugin/realtime/realtimeRunner.ts +624 -0
- package/src/specifics/CustomEventOnTriggeredSpecific.tsx +92 -0
- package/src/specifics/CustomEventTriggerSpecific.tsx +141 -0
- package/src/specifics/VariableGetSpecific.tsx +110 -0
- package/src/specifics/VariableSetSpecific.tsx +110 -0
- package/src/store/actions.tsx +698 -0
- package/src/store/commands.ts +278 -0
- package/src/store/contextMenu.ts +192 -0
- package/src/store/controls.tsx +62 -0
- package/src/store/conversions.ts +47 -0
- package/src/store/documentation.tsx +69 -0
- package/src/store/events.tsx +116 -0
- package/src/store/flow.tsx +230 -0
- package/src/store/graphMeta.ts +39 -0
- package/src/store/hotKeys.tsx +364 -0
- package/src/store/layers.ts +259 -0
- package/src/store/legend.tsx +76 -0
- package/src/store/logs.ts +28 -0
- package/src/store/menubar.ts +41 -0
- package/src/store/refs.ts +84 -0
- package/src/store/registry.ts +51 -0
- package/src/store/selection.ts +22 -0
- package/src/store/settings.ts +99 -0
- package/src/store/settingsSchema.ts +210 -0
- package/src/store/socketGenerator.tsx +54 -0
- package/src/store/specific.tsx +75 -0
- package/src/store/specs.tsx +35 -0
- package/src/store/tabs.ts +282 -0
- package/src/store/toolbar.tsx +45 -0
- package/src/store/traces.ts +240 -0
- package/src/store/variables.ts +37 -0
- package/src/system/graph.ts +131 -0
- package/src/system/graphSession.ts +172 -0
- package/src/system/index.ts +6 -0
- package/src/system/notifications.ts +111 -0
- package/src/system/persistence.ts +82 -0
- package/src/system/plugin.ts +55 -0
- package/src/system/provider.tsx +86 -0
- package/src/system/pubsub.ts +323 -0
- package/src/system/system.ts +653 -0
- package/src/system/tabLoader.tsx +303 -0
- package/src/system/undoRedo.ts +103 -0
- package/src/transformers/Uigraph.ts +61 -0
- package/src/transformers/behaveToFlow.ts +16 -4
- package/src/transformers/contract.ts +87 -0
- package/src/transformers/flowToBehave.ts +40 -12
- package/src/types/NodeMetadata.ts +27 -0
- package/src/types/graph.ts +49 -0
- package/src/types/nodes.ts +50 -0
- package/src/types.ts +18 -0
- package/src/util/autoConvert.ts +200 -0
- package/src/util/colors.ts +1 -29
- package/src/util/downloadJson.ts +18 -0
- package/src/util/extractNodeMetadata.ts +16 -0
- package/src/util/getPickerFilters.ts +1 -1
- package/src/util/isBehaveNode.ts +6 -0
- package/src/util/isValidConnection.ts +51 -17
- package/src/util/mergeSockets.ts +29 -0
- package/src/util/serializeVariables.ts +66 -0
- package/src/util/sockets.ts +43 -0
- package/stories/apex/layoutController/example-graph.worker.ts +39 -0
- package/stories/apex/layoutController/index.stories.tsx +48 -0
- package/stories/apex/layoutController/webworker.stories.tsx +103 -0
- package/stories/apex/menubar/menubar.stories.tsx +19 -0
- package/stories/components/colorpicker/index.stories.tsx +20 -0
- package/stories/components/contextMenus/edge.stories.tsx +32 -0
- package/stories/components/contextMenus/node.stories.tsx +26 -0
- package/stories/components/contextMenus/nodePicker.stories.tsx +115 -0
- package/stories/components/controls/any/index.stories.tsx +19 -0
- package/stories/components/controls/boolean/index.stories.tsx +19 -0
- package/stories/components/controls/colorPicker/index.stories.tsx +49 -0
- package/stories/components/controls/number/index.stories.tsx +19 -0
- package/stories/components/controls/string/index.stories.tsx +19 -0
- package/stories/components/nodes/behaveNode.stories.tsx +108 -0
- package/stories/components/panels/alignment.stories.tsx +24 -0
- package/stories/components/panels/events.stories.tsx +38 -0
- package/stories/components/panels/graphRunner.stories.tsx +317 -0
- package/stories/components/panels/history.stories.tsx +37 -0
- package/stories/components/panels/keymaps.stories.tsx +21 -0
- package/stories/components/panels/legend.stories.tsx +37 -0
- package/stories/components/panels/logs.stories.tsx +24 -0
- package/stories/components/panels/nodeInputs.stories.tsx +21 -0
- package/stories/components/panels/nodePicker.stories.tsx +37 -0
- package/stories/components/panels/panel.stories.tsx +39 -0
- package/stories/components/panels/search.stories.tsx +24 -0
- package/stories/components/panels/systemSettings.stories.tsx +26 -0
- package/stories/components/panels/traces.stories.tsx +225 -0
- package/stories/components/panels/variables.stories.tsx +24 -0
- package/stories/defaults/defaultStoryProvider.tsx +170 -0
- package/stories/defaults/systemGenerator.ts +43 -0
- package/stories/plugins/notes.stories.tsx +100 -0
- package/tests/autoConvert.test.ts +329 -0
- package/tests/autosavePlugin.test.ts +204 -0
- package/tests/callSubgraphSync.test.ts +148 -0
- package/tests/commandRegistry.test.ts +137 -0
- package/tests/components/edges/offsetBezier.test.ts +51 -0
- package/tests/components/layoutController/utils.test.ts +68 -0
- package/tests/components/panels/traces/utils.test.ts +52 -0
- package/tests/contract.test.ts +51 -0
- package/tests/contractSerialize.test.ts +62 -0
- package/tests/deriveSpans.test.ts +71 -0
- package/tests/flowToBehave.test.ts +27 -4
- package/tests/hotkeys.test.ts +79 -0
- package/tests/keepAliveLifecycle.test.ts +167 -0
- package/tests/loadManifest.test.ts +113 -0
- package/tests/noteMarkdown.test.ts +65 -0
- package/tests/notesPlugin.test.ts +162 -0
- package/tests/notifications.test.ts +87 -0
- package/tests/persistence.test.ts +51 -0
- package/tests/saveLoad.test.ts +373 -0
- package/tests/settings.test.ts +178 -0
- package/tests/traceStore.test.ts +46 -0
- package/tests/util/calculateNewEdge.test.ts +98 -0
- package/tests/util/getSocketsByNodeTypeAndHandleType.test.ts +31 -0
- package/tests/util/hasPositionMetaData.test.ts +33 -0
- package/tests/util/isBehaveNode.test.ts +22 -0
- package/tests/util/isHandleConnected.test.ts +37 -0
- package/tests/util/mergeSockets.test.ts +43 -0
- package/tests/visual/README.md +64 -0
- package/tests/visual/__screenshots__/panels.visual.test.tsx/panel-alignment-chromium-win32.png +0 -0
- package/tests/visual/__screenshots__/panels.visual.test.tsx/panel-conversation-chromium-win32.png +0 -0
- package/tests/visual/__screenshots__/panels.visual.test.tsx/panel-events-chromium-win32.png +0 -0
- package/tests/visual/__screenshots__/panels.visual.test.tsx/panel-history-chromium-win32.png +0 -0
- package/tests/visual/__screenshots__/panels.visual.test.tsx/panel-keymaps-chromium-win32.png +0 -0
- package/tests/visual/__screenshots__/panels.visual.test.tsx/panel-layers-chromium-win32.png +0 -0
- package/tests/visual/__screenshots__/panels.visual.test.tsx/panel-legend-chromium-win32.png +0 -0
- package/tests/visual/__screenshots__/panels.visual.test.tsx/panel-localGraphRunner-chromium-win32.png +0 -0
- package/tests/visual/__screenshots__/panels.visual.test.tsx/panel-logs-chromium-win32.png +0 -0
- package/tests/visual/__screenshots__/panels.visual.test.tsx/panel-nodeInputs-chromium-win32.png +0 -0
- package/tests/visual/__screenshots__/panels.visual.test.tsx/panel-nodePicker-chromium-win32.png +0 -0
- package/tests/visual/__screenshots__/panels.visual.test.tsx/panel-panel-chromium-win32.png +0 -0
- package/tests/visual/__screenshots__/panels.visual.test.tsx/panel-search-chromium-win32.png +0 -0
- package/tests/visual/__screenshots__/panels.visual.test.tsx/panel-systemSettings-chromium-win32.png +0 -0
- package/tests/visual/__screenshots__/panels.visual.test.tsx/panel-traces-chromium-win32.png +0 -0
- package/tests/visual/__screenshots__/panels.visual.test.tsx/panel-variables-chromium-win32.png +0 -0
- package/tests/visual/panels.visual.test.tsx +76 -0
- package/tests/wasdPan.test.ts +71 -0
- package/tsconfig.base.json +39 -0
- package/tsconfig.json +18 -59
- package/tsconfig.prod.json +23 -0
- package/tsdown.config.ts +15 -3
- package/typedoc.json +7 -7
- package/vite.config.js +7 -0
- package/vitest.config.ts +5 -2
- package/vitest.visual.config.ts +55 -0
- package/src/components/AutoSizeInput.tsx +0 -65
- package/src/components/Controls.tsx +0 -87
- package/src/components/InputSocket.tsx +0 -142
- package/src/components/Node.tsx +0 -68
- package/src/components/NodeContainer.tsx +0 -46
- package/src/components/NodePicker.tsx +0 -77
- package/src/components/OutputSocket.tsx +0 -58
- package/src/components/modals/ClearModal.tsx +0 -40
- package/src/components/modals/HelpModal.tsx +0 -36
- package/src/components/modals/LoadModal.tsx +0 -96
- package/src/components/modals/Modal.tsx +0 -64
- package/src/components/modals/SaveModal.tsx +0 -60
- package/src/hooks/useCustomNodeTypes.tsx +0 -31
- package/src/hooks/useGraphRunner.ts +0 -104
- package/src/hooks/useMergeMap.ts +0 -14
- package/src/hooks/useNodeSpecJson.ts +0 -20
- package/src/hooks/useQueriableDefinitions.ts +0 -22
- package/src/styles.css +0 -8
- package/tailwind.config.ts +0 -19
- package/tests/tsconfig.json +0 -10
- /package/src/{types.d.ts → types-declarations.d.ts} +0 -0
|
@@ -0,0 +1,242 @@
|
|
|
1
|
+
import { t as useChangeNodeData } from "./useChangeNodeData-ChQGK7AI.js";
|
|
2
|
+
import { useState } from "react";
|
|
3
|
+
import { NodeResizer } from "reactflow";
|
|
4
|
+
import { Bold, Code, Italic, List, NumberedListLeft, Quote, Strikethrough, Youtube } from "iconoir-react";
|
|
5
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
6
|
+
import { ErrorBoundary } from "react-error-boundary";
|
|
7
|
+
import { VscodeButton, VscodeTextfield } from "@vscode-elements/react-elements";
|
|
8
|
+
import { EditorContent, useEditor, useEditorState } from "@tiptap/react";
|
|
9
|
+
import StarterKit from "@tiptap/starter-kit";
|
|
10
|
+
import { Markdown } from "tiptap-markdown";
|
|
11
|
+
import Youtube$1 from "@tiptap/extension-youtube";
|
|
12
|
+
|
|
13
|
+
//#region src/plugin/notes/FormatToolbar.tsx
|
|
14
|
+
/**
|
|
15
|
+
* Formatting actions for the note editor. Buttons are the same VscodeButton
|
|
16
|
+
* component the FloatingToolbar uses, so the note toolbar stays visually
|
|
17
|
+
* consistent with the rest of the editor chrome; the active format renders as
|
|
18
|
+
* a primary (accent) button.
|
|
19
|
+
*
|
|
20
|
+
* The button row swallows mousedown so clicking a formatting button keeps the
|
|
21
|
+
* editor's text selection instead of blurring it. The video row must NOT: its
|
|
22
|
+
* text field needs focus. Video embedding uses an inline URL field rather than
|
|
23
|
+
* `window.prompt`, which is blocked in VS Code webviews.
|
|
24
|
+
*/
|
|
25
|
+
const FormatToolbar = ({ editor }) => {
|
|
26
|
+
const [videoUrl, setVideoUrl] = useState(null);
|
|
27
|
+
const active = useEditorState({
|
|
28
|
+
editor,
|
|
29
|
+
selector: ({ editor: editor$1 }) => ({
|
|
30
|
+
bold: editor$1.isActive("bold"),
|
|
31
|
+
italic: editor$1.isActive("italic"),
|
|
32
|
+
strike: editor$1.isActive("strike"),
|
|
33
|
+
code: editor$1.isActive("code"),
|
|
34
|
+
h1: editor$1.isActive("heading", { level: 1 }),
|
|
35
|
+
h2: editor$1.isActive("heading", { level: 2 }),
|
|
36
|
+
h3: editor$1.isActive("heading", { level: 3 }),
|
|
37
|
+
bulletList: editor$1.isActive("bulletList"),
|
|
38
|
+
orderedList: editor$1.isActive("orderedList"),
|
|
39
|
+
codeBlock: editor$1.isActive("codeBlock"),
|
|
40
|
+
blockquote: editor$1.isActive("blockquote")
|
|
41
|
+
})
|
|
42
|
+
});
|
|
43
|
+
const embedVideo = () => {
|
|
44
|
+
const src = videoUrl?.trim();
|
|
45
|
+
if (src) editor.chain().focus().setYoutubeVideo({ src }).run();
|
|
46
|
+
setVideoUrl(null);
|
|
47
|
+
};
|
|
48
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
49
|
+
className: "notes-toolbar nodrag nopan",
|
|
50
|
+
children: [/* @__PURE__ */ jsxs("div", {
|
|
51
|
+
className: "notes-toolbar__row",
|
|
52
|
+
onMouseDown: (e) => e.preventDefault(),
|
|
53
|
+
children: [
|
|
54
|
+
/* @__PURE__ */ jsx(VscodeButton, {
|
|
55
|
+
secondary: !active.bold,
|
|
56
|
+
iconOnly: true,
|
|
57
|
+
title: "Bold",
|
|
58
|
+
onClick: () => editor.chain().focus().toggleBold().run(),
|
|
59
|
+
children: /* @__PURE__ */ jsx(Bold, {})
|
|
60
|
+
}),
|
|
61
|
+
/* @__PURE__ */ jsx(VscodeButton, {
|
|
62
|
+
secondary: !active.italic,
|
|
63
|
+
iconOnly: true,
|
|
64
|
+
title: "Italic",
|
|
65
|
+
onClick: () => editor.chain().focus().toggleItalic().run(),
|
|
66
|
+
children: /* @__PURE__ */ jsx(Italic, {})
|
|
67
|
+
}),
|
|
68
|
+
/* @__PURE__ */ jsx(VscodeButton, {
|
|
69
|
+
secondary: !active.strike,
|
|
70
|
+
iconOnly: true,
|
|
71
|
+
title: "Strikethrough",
|
|
72
|
+
onClick: () => editor.chain().focus().toggleStrike().run(),
|
|
73
|
+
children: /* @__PURE__ */ jsx(Strikethrough, {})
|
|
74
|
+
}),
|
|
75
|
+
/* @__PURE__ */ jsx(VscodeButton, {
|
|
76
|
+
secondary: !active.code,
|
|
77
|
+
iconOnly: true,
|
|
78
|
+
title: "Code",
|
|
79
|
+
onClick: () => editor.chain().focus().toggleCode().run(),
|
|
80
|
+
children: /* @__PURE__ */ jsx(Code, {})
|
|
81
|
+
}),
|
|
82
|
+
/* @__PURE__ */ jsx("div", { className: "notes-toolbar__separator" }),
|
|
83
|
+
/* @__PURE__ */ jsx(VscodeButton, {
|
|
84
|
+
secondary: !active.h1,
|
|
85
|
+
title: "Heading 1",
|
|
86
|
+
onClick: () => editor.chain().focus().toggleHeading({ level: 1 }).run(),
|
|
87
|
+
children: "H1"
|
|
88
|
+
}),
|
|
89
|
+
/* @__PURE__ */ jsx(VscodeButton, {
|
|
90
|
+
secondary: !active.h2,
|
|
91
|
+
title: "Heading 2",
|
|
92
|
+
onClick: () => editor.chain().focus().toggleHeading({ level: 2 }).run(),
|
|
93
|
+
children: "H2"
|
|
94
|
+
}),
|
|
95
|
+
/* @__PURE__ */ jsx(VscodeButton, {
|
|
96
|
+
secondary: !active.h3,
|
|
97
|
+
title: "Heading 3",
|
|
98
|
+
onClick: () => editor.chain().focus().toggleHeading({ level: 3 }).run(),
|
|
99
|
+
children: "H3"
|
|
100
|
+
}),
|
|
101
|
+
/* @__PURE__ */ jsx("div", { className: "notes-toolbar__separator" }),
|
|
102
|
+
/* @__PURE__ */ jsx(VscodeButton, {
|
|
103
|
+
secondary: !active.bulletList,
|
|
104
|
+
iconOnly: true,
|
|
105
|
+
title: "Bullet List",
|
|
106
|
+
onClick: () => editor.chain().focus().toggleBulletList().run(),
|
|
107
|
+
children: /* @__PURE__ */ jsx(List, {})
|
|
108
|
+
}),
|
|
109
|
+
/* @__PURE__ */ jsx(VscodeButton, {
|
|
110
|
+
secondary: !active.orderedList,
|
|
111
|
+
iconOnly: true,
|
|
112
|
+
title: "Numbered List",
|
|
113
|
+
onClick: () => editor.chain().focus().toggleOrderedList().run(),
|
|
114
|
+
children: /* @__PURE__ */ jsx(NumberedListLeft, {})
|
|
115
|
+
}),
|
|
116
|
+
/* @__PURE__ */ jsx(VscodeButton, {
|
|
117
|
+
secondary: !active.codeBlock,
|
|
118
|
+
iconOnly: true,
|
|
119
|
+
title: "Code Block",
|
|
120
|
+
onClick: () => editor.chain().focus().toggleCodeBlock().run(),
|
|
121
|
+
children: /* @__PURE__ */ jsx(Code, {})
|
|
122
|
+
}),
|
|
123
|
+
/* @__PURE__ */ jsx(VscodeButton, {
|
|
124
|
+
secondary: !active.blockquote,
|
|
125
|
+
iconOnly: true,
|
|
126
|
+
title: "Quote",
|
|
127
|
+
onClick: () => editor.chain().focus().toggleBlockquote().run(),
|
|
128
|
+
children: /* @__PURE__ */ jsx(Quote, {})
|
|
129
|
+
}),
|
|
130
|
+
/* @__PURE__ */ jsx("div", { className: "notes-toolbar__separator" }),
|
|
131
|
+
/* @__PURE__ */ jsx(VscodeButton, {
|
|
132
|
+
secondary: videoUrl === null,
|
|
133
|
+
iconOnly: true,
|
|
134
|
+
title: "Embed YouTube Video",
|
|
135
|
+
onClick: () => setVideoUrl(videoUrl === null ? "" : null),
|
|
136
|
+
children: /* @__PURE__ */ jsx(Youtube, {})
|
|
137
|
+
})
|
|
138
|
+
]
|
|
139
|
+
}), videoUrl !== null && /* @__PURE__ */ jsxs("div", {
|
|
140
|
+
className: "notes-toolbar__embed",
|
|
141
|
+
onKeyDown: (e) => {
|
|
142
|
+
e.stopPropagation();
|
|
143
|
+
if (e.key === "Enter") embedVideo();
|
|
144
|
+
if (e.key === "Escape") setVideoUrl(null);
|
|
145
|
+
},
|
|
146
|
+
children: [
|
|
147
|
+
/* @__PURE__ */ jsx(VscodeTextfield, {
|
|
148
|
+
type: "text",
|
|
149
|
+
placeholder: "YouTube video URL",
|
|
150
|
+
value: videoUrl,
|
|
151
|
+
onInput: (e) => setVideoUrl(e.target.value)
|
|
152
|
+
}),
|
|
153
|
+
/* @__PURE__ */ jsx(VscodeButton, {
|
|
154
|
+
title: "Embed",
|
|
155
|
+
onClick: embedVideo,
|
|
156
|
+
children: "Embed"
|
|
157
|
+
}),
|
|
158
|
+
/* @__PURE__ */ jsx(VscodeButton, {
|
|
159
|
+
secondary: true,
|
|
160
|
+
title: "Cancel",
|
|
161
|
+
onClick: () => setVideoUrl(null),
|
|
162
|
+
children: "Cancel"
|
|
163
|
+
})
|
|
164
|
+
]
|
|
165
|
+
})]
|
|
166
|
+
});
|
|
167
|
+
};
|
|
168
|
+
|
|
169
|
+
//#endregion
|
|
170
|
+
//#region src/plugin/notes/noteImpl.tsx
|
|
171
|
+
const NOTE_MIN_WIDTH = 160;
|
|
172
|
+
const NOTE_MIN_HEIGHT = 80;
|
|
173
|
+
/**
|
|
174
|
+
* The actual note node, pulling in tiptap/prosemirror (~320 KB). It is loaded
|
|
175
|
+
* lazily by `note.tsx` so that weight only lands in the bundle when a note
|
|
176
|
+
* node is actually rendered.
|
|
177
|
+
*
|
|
178
|
+
* The note draws its own frame directly against the React Flow node bounds.
|
|
179
|
+
* It must NOT use BaseNodeWrapper: that adds behave-node chrome (a second
|
|
180
|
+
* bordered box) and breaks the height chain, so the frame sizes to content
|
|
181
|
+
* instead of the node and drifts out of the NodeResizer bounds.
|
|
182
|
+
*
|
|
183
|
+
* Layout: the root div only positions the NodeResizer and floating toolbar (it
|
|
184
|
+
* must not clip, or the toolbar disappears); the frame inside it clips. Only
|
|
185
|
+
* the header drags the node (`dragHandle` set by `addNote`) — the body is
|
|
186
|
+
* `nodrag nopan` so selecting text neither moves the node nor pans the canvas.
|
|
187
|
+
* The editor is always editable: a single click gives a caret; the format
|
|
188
|
+
* toolbar shows while the node is selected.
|
|
189
|
+
*
|
|
190
|
+
* Font size cascades from a React `style` on the root — never write to
|
|
191
|
+
* `editor.view.dom` in an effect; tiptap v3 throws if the view has not mounted.
|
|
192
|
+
*/
|
|
193
|
+
const NoteNodeImpl = ({ data, selected, id }) => {
|
|
194
|
+
const handleNodeChange = useChangeNodeData(id);
|
|
195
|
+
const editor = useEditor({
|
|
196
|
+
extensions: [
|
|
197
|
+
StarterKit,
|
|
198
|
+
Markdown,
|
|
199
|
+
Youtube$1.configure({ nocookie: true })
|
|
200
|
+
],
|
|
201
|
+
content: data.text || "New note",
|
|
202
|
+
editorProps: { attributes: { class: "nodrag nopan" } },
|
|
203
|
+
onUpdate: ({ editor: editor$1 }) => {
|
|
204
|
+
const markdown = editor$1.storage.markdown;
|
|
205
|
+
if (markdown) handleNodeChange("text", markdown.getMarkdown());
|
|
206
|
+
}
|
|
207
|
+
});
|
|
208
|
+
return /* @__PURE__ */ jsx(ErrorBoundary, {
|
|
209
|
+
fallback: /* @__PURE__ */ jsx("div", { children: "Error rendering note" }),
|
|
210
|
+
children: /* @__PURE__ */ jsxs("div", {
|
|
211
|
+
className: "notes-node-root",
|
|
212
|
+
style: { fontSize: data.fontSize || "medium" },
|
|
213
|
+
children: [
|
|
214
|
+
/* @__PURE__ */ jsx(NodeResizer, {
|
|
215
|
+
minWidth: NOTE_MIN_WIDTH,
|
|
216
|
+
minHeight: NOTE_MIN_HEIGHT,
|
|
217
|
+
color: "#ff0071",
|
|
218
|
+
isVisible: selected || false
|
|
219
|
+
}),
|
|
220
|
+
editor && selected && /* @__PURE__ */ jsx(FormatToolbar, { editor }),
|
|
221
|
+
/* @__PURE__ */ jsxs("div", {
|
|
222
|
+
className: "notes-node",
|
|
223
|
+
children: [/* @__PURE__ */ jsxs("div", {
|
|
224
|
+
className: "notes-node__header",
|
|
225
|
+
children: [/* @__PURE__ */ jsx("span", {
|
|
226
|
+
className: "notes-node__grip",
|
|
227
|
+
"aria-hidden": true,
|
|
228
|
+
children: "⠿"
|
|
229
|
+
}), /* @__PURE__ */ jsx("span", { children: "Note" })]
|
|
230
|
+
}), /* @__PURE__ */ jsx(EditorContent, {
|
|
231
|
+
editor,
|
|
232
|
+
className: "notes-node__editor nodrag nopan"
|
|
233
|
+
})]
|
|
234
|
+
})
|
|
235
|
+
]
|
|
236
|
+
})
|
|
237
|
+
});
|
|
238
|
+
};
|
|
239
|
+
|
|
240
|
+
//#endregion
|
|
241
|
+
export { NoteNodeImpl };
|
|
242
|
+
//# sourceMappingURL=noteImpl-KkrrWgJd.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"noteImpl-KkrrWgJd.js","names":["editor","Youtube","editor"],"sources":["../src/plugin/notes/FormatToolbar.tsx","../src/plugin/notes/noteImpl.tsx"],"sourcesContent":["import { useState } from 'react';\nimport { useEditorState, type Editor } from '@tiptap/react';\nimport { VscodeButton, VscodeTextfield } from '@vscode-elements/react-elements';\nimport {\n Bold,\n Code,\n Italic,\n List,\n NumberedListLeft,\n Quote,\n Strikethrough,\n Youtube\n} from 'iconoir-react';\n\ninterface FormatToolbarProps {\n editor: Editor;\n}\n\n/**\n * Formatting actions for the note editor. Buttons are the same VscodeButton\n * component the FloatingToolbar uses, so the note toolbar stays visually\n * consistent with the rest of the editor chrome; the active format renders as\n * a primary (accent) button.\n *\n * The button row swallows mousedown so clicking a formatting button keeps the\n * editor's text selection instead of blurring it. The video row must NOT: its\n * text field needs focus. Video embedding uses an inline URL field rather than\n * `window.prompt`, which is blocked in VS Code webviews.\n */\nexport const FormatToolbar = ({ editor }: FormatToolbarProps) => {\n // null = embed row closed; a string = the URL being typed.\n const [videoUrl, setVideoUrl] = useState<string | null>(null);\n\n const active = useEditorState({\n editor,\n selector: ({ editor }) => ({\n bold: editor.isActive('bold'),\n italic: editor.isActive('italic'),\n strike: editor.isActive('strike'),\n code: editor.isActive('code'),\n h1: editor.isActive('heading', { level: 1 }),\n h2: editor.isActive('heading', { level: 2 }),\n h3: editor.isActive('heading', { level: 3 }),\n bulletList: editor.isActive('bulletList'),\n orderedList: editor.isActive('orderedList'),\n codeBlock: editor.isActive('codeBlock'),\n blockquote: editor.isActive('blockquote')\n })\n });\n\n const embedVideo = () => {\n const src = videoUrl?.trim();\n if (src) {\n editor.chain().focus().setYoutubeVideo({ src }).run();\n }\n setVideoUrl(null);\n };\n\n return (\n <div className=\"notes-toolbar nodrag nopan\">\n <div\n className=\"notes-toolbar__row\"\n onMouseDown={(e) => e.preventDefault()}\n >\n <VscodeButton\n secondary={!active.bold}\n iconOnly\n title=\"Bold\"\n onClick={() => editor.chain().focus().toggleBold().run()}\n >\n <Bold />\n </VscodeButton>\n <VscodeButton\n secondary={!active.italic}\n iconOnly\n title=\"Italic\"\n onClick={() => editor.chain().focus().toggleItalic().run()}\n >\n <Italic />\n </VscodeButton>\n <VscodeButton\n secondary={!active.strike}\n iconOnly\n title=\"Strikethrough\"\n onClick={() => editor.chain().focus().toggleStrike().run()}\n >\n <Strikethrough />\n </VscodeButton>\n <VscodeButton\n secondary={!active.code}\n iconOnly\n title=\"Code\"\n onClick={() => editor.chain().focus().toggleCode().run()}\n >\n <Code />\n </VscodeButton>\n <div className=\"notes-toolbar__separator\" />\n <VscodeButton\n secondary={!active.h1}\n title=\"Heading 1\"\n onClick={() =>\n editor.chain().focus().toggleHeading({ level: 1 }).run()\n }\n >\n H1\n </VscodeButton>\n <VscodeButton\n secondary={!active.h2}\n title=\"Heading 2\"\n onClick={() =>\n editor.chain().focus().toggleHeading({ level: 2 }).run()\n }\n >\n H2\n </VscodeButton>\n <VscodeButton\n secondary={!active.h3}\n title=\"Heading 3\"\n onClick={() =>\n editor.chain().focus().toggleHeading({ level: 3 }).run()\n }\n >\n H3\n </VscodeButton>\n <div className=\"notes-toolbar__separator\" />\n <VscodeButton\n secondary={!active.bulletList}\n iconOnly\n title=\"Bullet List\"\n onClick={() => editor.chain().focus().toggleBulletList().run()}\n >\n <List />\n </VscodeButton>\n <VscodeButton\n secondary={!active.orderedList}\n iconOnly\n title=\"Numbered List\"\n onClick={() => editor.chain().focus().toggleOrderedList().run()}\n >\n <NumberedListLeft />\n </VscodeButton>\n <VscodeButton\n secondary={!active.codeBlock}\n iconOnly\n title=\"Code Block\"\n onClick={() => editor.chain().focus().toggleCodeBlock().run()}\n >\n <Code />\n </VscodeButton>\n <VscodeButton\n secondary={!active.blockquote}\n iconOnly\n title=\"Quote\"\n onClick={() => editor.chain().focus().toggleBlockquote().run()}\n >\n <Quote />\n </VscodeButton>\n <div className=\"notes-toolbar__separator\" />\n <VscodeButton\n secondary={videoUrl === null}\n iconOnly\n title=\"Embed YouTube Video\"\n onClick={() => setVideoUrl(videoUrl === null ? '' : null)}\n >\n <Youtube />\n </VscodeButton>\n </div>\n\n {videoUrl !== null && (\n <div\n className=\"notes-toolbar__embed\"\n // Keep keystrokes (e.g. Backspace) from reaching React Flow, which\n // would delete the selected note while the URL is being typed.\n onKeyDown={(e) => {\n e.stopPropagation();\n if (e.key === 'Enter') embedVideo();\n if (e.key === 'Escape') setVideoUrl(null);\n }}\n >\n <VscodeTextfield\n type=\"text\"\n placeholder=\"YouTube video URL\"\n value={videoUrl}\n onInput={(e: any) => setVideoUrl(e.target.value)}\n />\n <VscodeButton title=\"Embed\" onClick={embedVideo}>\n Embed\n </VscodeButton>\n <VscodeButton\n secondary\n title=\"Cancel\"\n onClick={() => setVideoUrl(null)}\n >\n Cancel\n </VscodeButton>\n </div>\n )}\n </div>\n );\n};\n","import { NodeResizer } from 'reactflow';\nimport { ErrorBoundary } from 'react-error-boundary';\nimport { useEditor, EditorContent } from '@tiptap/react';\nimport StarterKit from '@tiptap/starter-kit';\nimport Youtube from '@tiptap/extension-youtube';\nimport { useChangeNodeData } from '@/hooks/useChangeNodeData';\nimport { Markdown } from 'tiptap-markdown';\nimport type { INoteNode } from '@/types/nodes';\nimport { FormatToolbar } from './FormatToolbar';\nimport type { NodeProps } from 'reactflow';\n\nconst NOTE_MIN_WIDTH = 160;\nconst NOTE_MIN_HEIGHT = 80;\n\n/**\n * The actual note node, pulling in tiptap/prosemirror (~320 KB). It is loaded\n * lazily by `note.tsx` so that weight only lands in the bundle when a note\n * node is actually rendered.\n *\n * The note draws its own frame directly against the React Flow node bounds.\n * It must NOT use BaseNodeWrapper: that adds behave-node chrome (a second\n * bordered box) and breaks the height chain, so the frame sizes to content\n * instead of the node and drifts out of the NodeResizer bounds.\n *\n * Layout: the root div only positions the NodeResizer and floating toolbar (it\n * must not clip, or the toolbar disappears); the frame inside it clips. Only\n * the header drags the node (`dragHandle` set by `addNote`) — the body is\n * `nodrag nopan` so selecting text neither moves the node nor pans the canvas.\n * The editor is always editable: a single click gives a caret; the format\n * toolbar shows while the node is selected.\n *\n * Font size cascades from a React `style` on the root — never write to\n * `editor.view.dom` in an effect; tiptap v3 throws if the view has not mounted.\n */\nexport const NoteNodeImpl = ({\n data,\n selected,\n id\n}: NodeProps<INoteNode['data']>) => {\n const handleNodeChange = useChangeNodeData(id);\n\n const editor = useEditor({\n extensions: [StarterKit, Markdown, Youtube.configure({ nocookie: true })],\n content: data.text || 'New note',\n editorProps: {\n attributes: {\n class: 'nodrag nopan'\n }\n },\n onUpdate: ({ editor }) => {\n const markdown = (\n editor.storage as { markdown?: { getMarkdown(): string } }\n ).markdown;\n if (markdown) {\n handleNodeChange('text', markdown.getMarkdown());\n }\n }\n });\n\n return (\n <ErrorBoundary fallback={<div>Error rendering note</div>}>\n <div\n className=\"notes-node-root\"\n style={{ fontSize: data.fontSize || 'medium' }}\n >\n <NodeResizer\n minWidth={NOTE_MIN_WIDTH}\n minHeight={NOTE_MIN_HEIGHT}\n color=\"#ff0071\"\n isVisible={selected || false}\n />\n {editor && selected && <FormatToolbar editor={editor} />}\n\n <div className=\"notes-node\">\n <div className=\"notes-node__header\">\n <span className=\"notes-node__grip\" aria-hidden>\n ⠿\n </span>\n <span>Note</span>\n </div>\n <EditorContent\n editor={editor}\n className=\"notes-node__editor nodrag nopan\"\n />\n </div>\n </div>\n </ErrorBoundary>\n );\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AA6BA,MAAa,iBAAiB,EAAE,aAAiC;CAE/D,MAAM,CAAC,UAAU,eAAe,SAAwB,KAAK;CAE7D,MAAM,SAAS,eAAe;EAC5B;EACA,WAAW,EAAE,wBAAc;GACzB,MAAMA,SAAO,SAAS,OAAO;GAC7B,QAAQA,SAAO,SAAS,SAAS;GACjC,QAAQA,SAAO,SAAS,SAAS;GACjC,MAAMA,SAAO,SAAS,OAAO;GAC7B,IAAIA,SAAO,SAAS,WAAW,EAAE,OAAO,GAAG,CAAC;GAC5C,IAAIA,SAAO,SAAS,WAAW,EAAE,OAAO,GAAG,CAAC;GAC5C,IAAIA,SAAO,SAAS,WAAW,EAAE,OAAO,GAAG,CAAC;GAC5C,YAAYA,SAAO,SAAS,aAAa;GACzC,aAAaA,SAAO,SAAS,cAAc;GAC3C,WAAWA,SAAO,SAAS,YAAY;GACvC,YAAYA,SAAO,SAAS,aAAa;GAC1C;EACF,CAAC;CAEF,MAAM,mBAAmB;EACvB,MAAM,MAAM,UAAU,MAAM;AAC5B,MAAI,IACF,QAAO,OAAO,CAAC,OAAO,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC,KAAK;AAEvD,cAAY,KAAK;;AAGnB,QACE,qBAAC;EAAI,WAAU;aACb,qBAAC;GACC,WAAU;GACV,cAAc,MAAM,EAAE,gBAAgB;;IAEtC,oBAAC;KACC,WAAW,CAAC,OAAO;KACnB;KACA,OAAM;KACN,eAAe,OAAO,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC,KAAK;eAExD,oBAAC,SAAO;MACK;IACf,oBAAC;KACC,WAAW,CAAC,OAAO;KACnB;KACA,OAAM;KACN,eAAe,OAAO,OAAO,CAAC,OAAO,CAAC,cAAc,CAAC,KAAK;eAE1D,oBAAC,WAAS;MACG;IACf,oBAAC;KACC,WAAW,CAAC,OAAO;KACnB;KACA,OAAM;KACN,eAAe,OAAO,OAAO,CAAC,OAAO,CAAC,cAAc,CAAC,KAAK;eAE1D,oBAAC,kBAAgB;MACJ;IACf,oBAAC;KACC,WAAW,CAAC,OAAO;KACnB;KACA,OAAM;KACN,eAAe,OAAO,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC,KAAK;eAExD,oBAAC,SAAO;MACK;IACf,oBAAC,SAAI,WAAU,6BAA6B;IAC5C,oBAAC;KACC,WAAW,CAAC,OAAO;KACnB,OAAM;KACN,eACE,OAAO,OAAO,CAAC,OAAO,CAAC,cAAc,EAAE,OAAO,GAAG,CAAC,CAAC,KAAK;eAE3D;MAEc;IACf,oBAAC;KACC,WAAW,CAAC,OAAO;KACnB,OAAM;KACN,eACE,OAAO,OAAO,CAAC,OAAO,CAAC,cAAc,EAAE,OAAO,GAAG,CAAC,CAAC,KAAK;eAE3D;MAEc;IACf,oBAAC;KACC,WAAW,CAAC,OAAO;KACnB,OAAM;KACN,eACE,OAAO,OAAO,CAAC,OAAO,CAAC,cAAc,EAAE,OAAO,GAAG,CAAC,CAAC,KAAK;eAE3D;MAEc;IACf,oBAAC,SAAI,WAAU,6BAA6B;IAC5C,oBAAC;KACC,WAAW,CAAC,OAAO;KACnB;KACA,OAAM;KACN,eAAe,OAAO,OAAO,CAAC,OAAO,CAAC,kBAAkB,CAAC,KAAK;eAE9D,oBAAC,SAAO;MACK;IACf,oBAAC;KACC,WAAW,CAAC,OAAO;KACnB;KACA,OAAM;KACN,eAAe,OAAO,OAAO,CAAC,OAAO,CAAC,mBAAmB,CAAC,KAAK;eAE/D,oBAAC,qBAAmB;MACP;IACf,oBAAC;KACC,WAAW,CAAC,OAAO;KACnB;KACA,OAAM;KACN,eAAe,OAAO,OAAO,CAAC,OAAO,CAAC,iBAAiB,CAAC,KAAK;eAE7D,oBAAC,SAAO;MACK;IACf,oBAAC;KACC,WAAW,CAAC,OAAO;KACnB;KACA,OAAM;KACN,eAAe,OAAO,OAAO,CAAC,OAAO,CAAC,kBAAkB,CAAC,KAAK;eAE9D,oBAAC,UAAQ;MACI;IACf,oBAAC,SAAI,WAAU,6BAA6B;IAC5C,oBAAC;KACC,WAAW,aAAa;KACxB;KACA,OAAM;KACN,eAAe,YAAY,aAAa,OAAO,KAAK,KAAK;eAEzD,oBAAC,YAAU;MACE;;IACX,EAEL,aAAa,QACZ,qBAAC;GACC,WAAU;GAGV,YAAY,MAAM;AAChB,MAAE,iBAAiB;AACnB,QAAI,EAAE,QAAQ,QAAS,aAAY;AACnC,QAAI,EAAE,QAAQ,SAAU,aAAY,KAAK;;;IAG3C,oBAAC;KACC,MAAK;KACL,aAAY;KACZ,OAAO;KACP,UAAU,MAAW,YAAY,EAAE,OAAO,MAAM;MAChD;IACF,oBAAC;KAAa,OAAM;KAAQ,SAAS;eAAY;MAElC;IACf,oBAAC;KACC;KACA,OAAM;KACN,eAAe,YAAY,KAAK;eACjC;MAEc;;IACX;GAEJ;;;;;AC1LV,MAAM,iBAAiB;AACvB,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;AAsBxB,MAAa,gBAAgB,EAC3B,MACA,UACA,SACkC;CAClC,MAAM,mBAAmB,kBAAkB,GAAG;CAE9C,MAAM,SAAS,UAAU;EACvB,YAAY;GAAC;GAAY;GAAUC,UAAQ,UAAU,EAAE,UAAU,MAAM,CAAC;GAAC;EACzE,SAAS,KAAK,QAAQ;EACtB,aAAa,EACX,YAAY,EACV,OAAO,gBACR,EACF;EACD,WAAW,EAAE,uBAAa;GACxB,MAAM,WACJC,SAAO,QACP;AACF,OAAI,SACF,kBAAiB,QAAQ,SAAS,aAAa,CAAC;;EAGrD,CAAC;AAEF,QACE,oBAAC;EAAc,UAAU,oBAAC,mBAAI,yBAA0B;YACtD,qBAAC;GACC,WAAU;GACV,OAAO,EAAE,UAAU,KAAK,YAAY,UAAU;;IAE9C,oBAAC;KACC,UAAU;KACV,WAAW;KACX,OAAM;KACN,WAAW,YAAY;MACvB;IACD,UAAU,YAAY,oBAAC,iBAAsB,SAAU;IAExD,qBAAC;KAAI,WAAU;gBACb,qBAAC;MAAI,WAAU;iBACb,oBAAC;OAAK,WAAU;OAAmB;iBAAY;QAExC,EACP,oBAAC,oBAAK,SAAW;OACb,EACN,oBAAC;MACS;MACR,WAAU;OACV;MACE;;IACF;GACQ"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
.hf8PDW_container{background:var(--colors-bgCanvas);width:100%;height:100%;color:var(--colors-fg);flex-direction:column;display:flex;overflow:hidden}.hf8PDW_header{border-bottom:1px solid var(--ds-input-border,var(--colors-borderSubtle));background:var(--colors-bgPanel);padding:1rem}.hf8PDW_titleSection{align-items:flex-start;gap:.75rem;margin-bottom:.75rem;display:flex}.hf8PDW_iconLarge{border:1px solid var(--ds-input-border,var(--colors-borderSubtle));background:var(--colors-bgCanvas);border-radius:.5rem;flex-shrink:0;justify-content:center;align-items:center;width:48px;height:48px;display:flex}.hf8PDW_iconLarge svg{width:32px;height:32px}.hf8PDW_title{margin:0;font-size:1.25rem;font-weight:600;line-height:1.3}.hf8PDW_nodeType{opacity:.7;margin-top:.25rem;font-family:monospace;font-size:.75rem}.hf8PDW_tags{flex-wrap:wrap;gap:.5rem;display:flex}.hf8PDW_tag{background:var(--ds-badge-bg,#4d4d4d);color:var(--ds-badge-fg,#fff);border-radius:.25rem;padding:.25rem .5rem;font-size:.75rem}.hf8PDW_content{flex:1;padding:1rem;overflow-y:auto}.hf8PDW_description{background:var(--ds-blockquote-bg,#7f7f7f1a);border-left:4px solid var(--ds-blockquote-border,#007acc);border-radius:.25rem;margin-bottom:1.5rem;padding:.75rem;font-size:1rem;line-height:1.5}.hf8PDW_noContent{text-align:center;opacity:.6;padding:2rem}.hf8PDW_section{margin-top:2rem}.hf8PDW_sectionTitle{border-bottom:1px solid var(--ds-input-border,var(--colors-borderSubtle));margin-bottom:.75rem;padding-bottom:.25rem;font-size:1rem;font-weight:600}.hf8PDW_socketList{flex-direction:column;gap:.5rem;display:flex}.hf8PDW_socketItem{background:var(--colors-bgPanel);border:1px solid var(--ds-input-border,var(--colors-borderSubtle));border-radius:.25rem;align-items:center;gap:.75rem;padding:.5rem;display:flex}.hf8PDW_socketIcon{flex-shrink:0;justify-content:center;align-items:center;width:20px;height:20px;display:flex}.hf8PDW_socketIcon svg{width:16px;height:16px}.hf8PDW_socketName{flex:1;font-weight:500}.hf8PDW_socketType{background:#0003;border-radius:.25rem;padding:.125rem .5rem;font-family:monospace;font-size:.85rem;font-weight:500}.hf8PDW_empty{text-align:center;flex-direction:column;justify-content:center;align-items:center;height:100%;padding:2rem;display:flex}.hf8PDW_emptyIcon{opacity:.3;margin-bottom:1rem;font-size:4rem}.hf8PDW_emptyText{opacity:.8;margin-bottom:.5rem;font-size:1.25rem;font-weight:500}.hf8PDW_emptySub{opacity:.6;font-size:.9rem}
|
|
2
|
+
|
|
3
|
+
/*# sourceMappingURL=styles.module-CvmpDkZj.css.map*/
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"styles.module-CvmpDkZj.css","names":[],"sources":["../src/plugin/docs/panel/styles.module_built.css"],"sourcesContent":[".hf8PDW_container{background:var(--colors-bgCanvas);width:100%;height:100%;color:var(--colors-fg);flex-direction:column;display:flex;overflow:hidden}.hf8PDW_header{border-bottom:1px solid var(--ds-input-border,var(--colors-borderSubtle));background:var(--colors-bgPanel);padding:1rem}.hf8PDW_titleSection{align-items:flex-start;gap:.75rem;margin-bottom:.75rem;display:flex}.hf8PDW_iconLarge{border:1px solid var(--ds-input-border,var(--colors-borderSubtle));background:var(--colors-bgCanvas);border-radius:.5rem;flex-shrink:0;justify-content:center;align-items:center;width:48px;height:48px;display:flex}.hf8PDW_iconLarge svg{width:32px;height:32px}.hf8PDW_title{margin:0;font-size:1.25rem;font-weight:600;line-height:1.3}.hf8PDW_nodeType{opacity:.7;margin-top:.25rem;font-family:monospace;font-size:.75rem}.hf8PDW_tags{flex-wrap:wrap;gap:.5rem;display:flex}.hf8PDW_tag{background:var(--ds-badge-bg,#4d4d4d);color:var(--ds-badge-fg,#fff);border-radius:.25rem;padding:.25rem .5rem;font-size:.75rem}.hf8PDW_content{flex:1;padding:1rem;overflow-y:auto}.hf8PDW_description{background:var(--ds-blockquote-bg,#7f7f7f1a);border-left:4px solid var(--ds-blockquote-border,#007acc);border-radius:.25rem;margin-bottom:1.5rem;padding:.75rem;font-size:1rem;line-height:1.5}.hf8PDW_noContent{text-align:center;opacity:.6;padding:2rem}.hf8PDW_section{margin-top:2rem}.hf8PDW_sectionTitle{border-bottom:1px solid var(--ds-input-border,var(--colors-borderSubtle));margin-bottom:.75rem;padding-bottom:.25rem;font-size:1rem;font-weight:600}.hf8PDW_socketList{flex-direction:column;gap:.5rem;display:flex}.hf8PDW_socketItem{background:var(--colors-bgPanel);border:1px solid var(--ds-input-border,var(--colors-borderSubtle));border-radius:.25rem;align-items:center;gap:.75rem;padding:.5rem;display:flex}.hf8PDW_socketIcon{flex-shrink:0;justify-content:center;align-items:center;width:20px;height:20px;display:flex}.hf8PDW_socketIcon svg{width:16px;height:16px}.hf8PDW_socketName{flex:1;font-weight:500}.hf8PDW_socketType{background:#0003;border-radius:.25rem;padding:.125rem .5rem;font-family:monospace;font-size:.85rem;font-weight:500}.hf8PDW_empty{text-align:center;flex-direction:column;justify-content:center;align-items:center;height:100%;padding:2rem;display:flex}.hf8PDW_emptyIcon{opacity:.3;margin-bottom:1rem;font-size:4rem}.hf8PDW_emptyText{opacity:.8;margin-bottom:.5rem;font-size:1.25rem;font-weight:500}.hf8PDW_emptySub{opacity:.6;font-size:.9rem}"],"mappings":"AAAA"}
|
|
@@ -0,0 +1,271 @@
|
|
|
1
|
+
import React, { createContext, useContext, useEffect } from "react";
|
|
2
|
+
import { useStore } from "zustand";
|
|
3
|
+
import { jsx } from "react/jsx-runtime";
|
|
4
|
+
|
|
5
|
+
//#region src/system/provider.tsx
|
|
6
|
+
const SystemContext = createContext(void 0);
|
|
7
|
+
/**
|
|
8
|
+
* Provides the editor-level {@link System} to the React tree.
|
|
9
|
+
*/
|
|
10
|
+
function SystemProvider({ children, value }) {
|
|
11
|
+
return /* @__PURE__ */ jsx(SystemContext, {
|
|
12
|
+
value,
|
|
13
|
+
children
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
/** Alias for {@link SystemProvider} expressing its editor-level role. */
|
|
17
|
+
const EditorProvider = SystemProvider;
|
|
18
|
+
/**
|
|
19
|
+
* Access the editor-level {@link System}.
|
|
20
|
+
*/
|
|
21
|
+
function useSystem() {
|
|
22
|
+
const context = useContext(SystemContext);
|
|
23
|
+
if (context === void 0) throw new Error("useSystem must be used within a SystemProvider");
|
|
24
|
+
return context;
|
|
25
|
+
}
|
|
26
|
+
/** Alias for {@link useSystem}. */
|
|
27
|
+
const useEditor = useSystem;
|
|
28
|
+
const GraphContext = createContext(void 0);
|
|
29
|
+
/**
|
|
30
|
+
* Provides a single {@link GraphSession} to the subtree rendered inside a graph
|
|
31
|
+
* tab. Components within use {@link useGraph} to read per-graph state bound to
|
|
32
|
+
* their own tab, regardless of which tab is currently focused.
|
|
33
|
+
*/
|
|
34
|
+
function GraphProvider({ children, value }) {
|
|
35
|
+
return /* @__PURE__ */ jsx(GraphContext, {
|
|
36
|
+
value,
|
|
37
|
+
children
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Access the {@link GraphSession} of the surrounding graph tab.
|
|
42
|
+
*/
|
|
43
|
+
function useGraph() {
|
|
44
|
+
const context = useContext(GraphContext);
|
|
45
|
+
if (context === void 0) throw new Error("useGraph must be used within a GraphProvider");
|
|
46
|
+
return context;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Access the currently focused {@link GraphSession}, or undefined when no graph
|
|
50
|
+
* is open. Subscribes to the editor's active-graph store, so panels rendered
|
|
51
|
+
* outside of a graph tab re-render when the focused graph changes.
|
|
52
|
+
*/
|
|
53
|
+
function useActiveGraph() {
|
|
54
|
+
return useStore(useSystem().activeGraph, (s) => s.activeGraphId ? s.sessions[s.activeGraphId] : void 0);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
//#endregion
|
|
58
|
+
//#region src/components/layoutController/utils.ts
|
|
59
|
+
/**
|
|
60
|
+
* Tab-id convention for graph tabs. The default graph uses the bare id `graph`
|
|
61
|
+
* (session id `graph`); every other graph uses `graph:<sessionId>`. These three
|
|
62
|
+
* helpers are the single source of truth for the convention.
|
|
63
|
+
*/
|
|
64
|
+
const GRAPH_TAB_PREFIX = "graph:";
|
|
65
|
+
const DEFAULT_GRAPH_ID = "graph";
|
|
66
|
+
function isGraphTabId(id) {
|
|
67
|
+
return !!id && (id === DEFAULT_GRAPH_ID || id.startsWith(GRAPH_TAB_PREFIX));
|
|
68
|
+
}
|
|
69
|
+
function sessionIdFromTabId(tabId) {
|
|
70
|
+
return tabId === DEFAULT_GRAPH_ID ? DEFAULT_GRAPH_ID : tabId.slice(6);
|
|
71
|
+
}
|
|
72
|
+
function tabIdForSession(sessionId) {
|
|
73
|
+
return sessionId === DEFAULT_GRAPH_ID ? DEFAULT_GRAPH_ID : `${GRAPH_TAB_PREFIX}${sessionId}`;
|
|
74
|
+
}
|
|
75
|
+
/** Collect the session ids of every graph tab present in a layout. */
|
|
76
|
+
function collectGraphSessionIds(layout) {
|
|
77
|
+
const ids = /* @__PURE__ */ new Set();
|
|
78
|
+
const visit = (base) => {
|
|
79
|
+
if (!base) return;
|
|
80
|
+
const panel = base;
|
|
81
|
+
if (panel.tabs) {
|
|
82
|
+
for (const tab of panel.tabs) if (isGraphTabId(tab.id)) ids.add(sessionIdFromTabId(tab.id));
|
|
83
|
+
}
|
|
84
|
+
const box = base;
|
|
85
|
+
if (box.children) box.children.forEach(visit);
|
|
86
|
+
};
|
|
87
|
+
visit(layout.dockbox);
|
|
88
|
+
visit(layout.floatbox);
|
|
89
|
+
visit(layout.maxbox);
|
|
90
|
+
visit(layout.windowbox);
|
|
91
|
+
return ids;
|
|
92
|
+
}
|
|
93
|
+
function recurseFindGraphPanel(base) {
|
|
94
|
+
if (base.id === "graphs") return base;
|
|
95
|
+
if (base.children) for (const child of base.children) {
|
|
96
|
+
const found = recurseFindGraphPanel(child);
|
|
97
|
+
if (found) return found;
|
|
98
|
+
}
|
|
99
|
+
return null;
|
|
100
|
+
}
|
|
101
|
+
function findGraphPanel(layout) {
|
|
102
|
+
const dockbox = recurseFindGraphPanel(layout.dockbox);
|
|
103
|
+
if (dockbox) return dockbox;
|
|
104
|
+
if (layout.floatbox) {
|
|
105
|
+
const floatBox = recurseFindGraphPanel(layout.floatbox);
|
|
106
|
+
if (floatBox) return floatBox;
|
|
107
|
+
} else if (layout.maxbox) {
|
|
108
|
+
const tab = recurseFindGraphPanel(layout.maxbox);
|
|
109
|
+
if (tab) return tab;
|
|
110
|
+
} else if (layout.windowbox) {
|
|
111
|
+
const tab = recurseFindGraphPanel(layout.windowbox);
|
|
112
|
+
if (tab) return tab;
|
|
113
|
+
}
|
|
114
|
+
return null;
|
|
115
|
+
}
|
|
116
|
+
function recurseFindTab(base, tabId) {
|
|
117
|
+
if (base.tabs) {
|
|
118
|
+
const panel = base;
|
|
119
|
+
if (panel.tabs?.some((tab) => tab.id === tabId)) return panel;
|
|
120
|
+
}
|
|
121
|
+
if (base.children) for (const child of base.children) {
|
|
122
|
+
const found = recurseFindTab(child, tabId);
|
|
123
|
+
if (found) return found;
|
|
124
|
+
}
|
|
125
|
+
return null;
|
|
126
|
+
}
|
|
127
|
+
function findTabInLayout(layout, tabId) {
|
|
128
|
+
if (layout.dockbox) {
|
|
129
|
+
const found = recurseFindTab(layout.dockbox, tabId);
|
|
130
|
+
if (found) return found;
|
|
131
|
+
}
|
|
132
|
+
if (layout.floatbox) {
|
|
133
|
+
const found = recurseFindTab(layout.floatbox, tabId);
|
|
134
|
+
if (found) return found;
|
|
135
|
+
}
|
|
136
|
+
if (layout.maxbox) {
|
|
137
|
+
const found = recurseFindTab(layout.maxbox, tabId);
|
|
138
|
+
if (found) return found;
|
|
139
|
+
}
|
|
140
|
+
if (layout.windowbox) {
|
|
141
|
+
const found = recurseFindTab(layout.windowbox, tabId);
|
|
142
|
+
if (found) return found;
|
|
143
|
+
}
|
|
144
|
+
return null;
|
|
145
|
+
}
|
|
146
|
+
function removeTabFromPanel(panel, tabId) {
|
|
147
|
+
return {
|
|
148
|
+
...panel,
|
|
149
|
+
tabs: panel.tabs?.filter((tab) => tab.id !== tabId)
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
function recursiveRemoveTab(base, tabId) {
|
|
153
|
+
if (base.tabs) {
|
|
154
|
+
const panel = base;
|
|
155
|
+
if (panel.tabs?.some((tab) => tab.id === tabId)) {
|
|
156
|
+
const updatedPanel = removeTabFromPanel(panel, tabId);
|
|
157
|
+
if (!updatedPanel.tabs || updatedPanel.tabs.length === 0) return null;
|
|
158
|
+
return updatedPanel;
|
|
159
|
+
}
|
|
160
|
+
return panel;
|
|
161
|
+
}
|
|
162
|
+
if (base.children) {
|
|
163
|
+
const box = base;
|
|
164
|
+
const updatedChildren = box.children.map((child) => recursiveRemoveTab(child, tabId)).filter((child) => child !== null);
|
|
165
|
+
if (updatedChildren.length === 0) return null;
|
|
166
|
+
return {
|
|
167
|
+
...box,
|
|
168
|
+
children: updatedChildren
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
return base;
|
|
172
|
+
}
|
|
173
|
+
function removeTabFromLayout(layout, tabId) {
|
|
174
|
+
const newLayout = { ...layout };
|
|
175
|
+
if (newLayout.dockbox) {
|
|
176
|
+
const updated = recursiveRemoveTab(newLayout.dockbox, tabId);
|
|
177
|
+
if (updated) newLayout.dockbox = updated;
|
|
178
|
+
}
|
|
179
|
+
if (newLayout.floatbox) {
|
|
180
|
+
const updated = recursiveRemoveTab(newLayout.floatbox, tabId);
|
|
181
|
+
if (updated) newLayout.floatbox = updated;
|
|
182
|
+
else delete newLayout.floatbox;
|
|
183
|
+
}
|
|
184
|
+
return newLayout;
|
|
185
|
+
}
|
|
186
|
+
function addFloatingTab(layout, tabData, position) {
|
|
187
|
+
const newLayout = { ...layout };
|
|
188
|
+
const newPanel = {
|
|
189
|
+
x: position.left,
|
|
190
|
+
y: position.top,
|
|
191
|
+
w: position.width,
|
|
192
|
+
h: position.height,
|
|
193
|
+
tabs: [tabData],
|
|
194
|
+
group: tabData.group || "popout"
|
|
195
|
+
};
|
|
196
|
+
if (!newLayout.floatbox) newLayout.floatbox = {
|
|
197
|
+
mode: "float",
|
|
198
|
+
children: [newPanel]
|
|
199
|
+
};
|
|
200
|
+
else newLayout.floatbox = {
|
|
201
|
+
...newLayout.floatbox,
|
|
202
|
+
children: [...newLayout.floatbox.children || [], newPanel]
|
|
203
|
+
};
|
|
204
|
+
return newLayout;
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
//#endregion
|
|
208
|
+
//#region src/hooks/useOnPressKey.ts
|
|
209
|
+
const useOnPressKey = (key, callback) => {
|
|
210
|
+
useEffect(() => {
|
|
211
|
+
const handleKeyDown = (e) => {
|
|
212
|
+
if (e.code === key) callback(e);
|
|
213
|
+
};
|
|
214
|
+
document.addEventListener("keydown", handleKeyDown);
|
|
215
|
+
return () => document.removeEventListener("keydown", handleKeyDown);
|
|
216
|
+
}, [key, callback]);
|
|
217
|
+
};
|
|
218
|
+
|
|
219
|
+
//#endregion
|
|
220
|
+
//#region src/plugin/docs/panel/styles.module.css?css_module
|
|
221
|
+
const classes = {
|
|
222
|
+
"emptyText": "hf8PDW_emptyText",
|
|
223
|
+
"socketType": "hf8PDW_socketType",
|
|
224
|
+
"header": "hf8PDW_header",
|
|
225
|
+
"socketItem": "hf8PDW_socketItem",
|
|
226
|
+
"emptyIcon": "hf8PDW_emptyIcon",
|
|
227
|
+
"emptySub": "hf8PDW_emptySub",
|
|
228
|
+
"noContent": "hf8PDW_noContent",
|
|
229
|
+
"socketIcon": "hf8PDW_socketIcon",
|
|
230
|
+
"titleSection": "hf8PDW_titleSection",
|
|
231
|
+
"container": "hf8PDW_container",
|
|
232
|
+
"sectionTitle": "hf8PDW_sectionTitle",
|
|
233
|
+
"iconLarge": "hf8PDW_iconLarge",
|
|
234
|
+
"tags": "hf8PDW_tags",
|
|
235
|
+
"content": "hf8PDW_content",
|
|
236
|
+
"section": "hf8PDW_section",
|
|
237
|
+
"title": "hf8PDW_title",
|
|
238
|
+
"socketList": "hf8PDW_socketList",
|
|
239
|
+
"description": "hf8PDW_description",
|
|
240
|
+
"socketName": "hf8PDW_socketName",
|
|
241
|
+
"empty": "hf8PDW_empty",
|
|
242
|
+
"nodeType": "hf8PDW_nodeType",
|
|
243
|
+
"tag": "hf8PDW_tag"
|
|
244
|
+
};
|
|
245
|
+
var styles_module_default = classes;
|
|
246
|
+
const _emptyText0 = classes["emptyText"];
|
|
247
|
+
const _socketType0 = classes["socketType"];
|
|
248
|
+
const _header0 = classes["header"];
|
|
249
|
+
const _socketItem0 = classes["socketItem"];
|
|
250
|
+
const _emptyIcon0 = classes["emptyIcon"];
|
|
251
|
+
const _emptySub0 = classes["emptySub"];
|
|
252
|
+
const _noContent0 = classes["noContent"];
|
|
253
|
+
const _socketIcon0 = classes["socketIcon"];
|
|
254
|
+
const _titleSection0 = classes["titleSection"];
|
|
255
|
+
const _container0 = classes["container"];
|
|
256
|
+
const _sectionTitle0 = classes["sectionTitle"];
|
|
257
|
+
const _iconLarge0 = classes["iconLarge"];
|
|
258
|
+
const _tags0 = classes["tags"];
|
|
259
|
+
const _content0 = classes["content"];
|
|
260
|
+
const _section0 = classes["section"];
|
|
261
|
+
const _title0 = classes["title"];
|
|
262
|
+
const _socketList0 = classes["socketList"];
|
|
263
|
+
const _description0 = classes["description"];
|
|
264
|
+
const _socketName0 = classes["socketName"];
|
|
265
|
+
const _empty0 = classes["empty"];
|
|
266
|
+
const _nodeType0 = classes["nodeType"];
|
|
267
|
+
const _tag0 = classes["tag"];
|
|
268
|
+
|
|
269
|
+
//#endregion
|
|
270
|
+
export { useEditor as _, collectGraphSessionIds as a, isGraphTabId as c, tabIdForSession as d, EditorProvider as f, useActiveGraph as g, SystemProvider as h, addFloatingTab as i, removeTabFromLayout as l, SystemContext as m, useOnPressKey as n, findGraphPanel as o, GraphProvider as p, DEFAULT_GRAPH_ID as r, findTabInLayout as s, styles_module_default as t, sessionIdFromTabId as u, useGraph as v, useSystem as y };
|
|
271
|
+
//# sourceMappingURL=styles.module-DZxg8aW9.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"styles.module-DZxg8aW9.js","names":["newPanel: PanelBase"],"sources":["../src/system/provider.tsx","../src/components/layoutController/utils.ts","../src/hooks/useOnPressKey.ts","../src/plugin/docs/panel/styles.module.css?css_module"],"sourcesContent":["import React, { createContext, useContext, type ReactNode } from 'react';\nimport { useStore } from 'zustand';\nimport type { System } from './system';\nimport type { GraphSession } from './graphSession';\n\n// ---------------------------------------------------------------------------\n// Editor system context\n// ---------------------------------------------------------------------------\n\nexport const SystemContext = createContext<System | undefined>(undefined);\n\nexport type SystemProviderProps = {\n children: ReactNode;\n value: System;\n};\n\n/**\n * Provides the editor-level {@link System} to the React tree.\n */\nexport function SystemProvider({ children, value }: SystemProviderProps) {\n return <SystemContext value={value}>{children}</SystemContext>;\n}\n\n/** Alias for {@link SystemProvider} expressing its editor-level role. */\nexport const EditorProvider = SystemProvider;\n\n/**\n * Access the editor-level {@link System}.\n */\nexport function useSystem(): System {\n const context = useContext(SystemContext);\n\n if (context === undefined) {\n throw new Error('useSystem must be used within a SystemProvider');\n }\n\n return context;\n}\n\n/** Alias for {@link useSystem}. */\nexport const useEditor = useSystem;\n\n// ---------------------------------------------------------------------------\n// Per-graph session context\n// ---------------------------------------------------------------------------\n\nconst GraphContext = createContext<GraphSession | undefined>(undefined);\n\nexport type GraphProviderProps = {\n children: ReactNode;\n value: GraphSession;\n};\n\n/**\n * Provides a single {@link GraphSession} to the subtree rendered inside a graph\n * tab. Components within use {@link useGraph} to read per-graph state bound to\n * their own tab, regardless of which tab is currently focused.\n */\nexport function GraphProvider({ children, value }: GraphProviderProps) {\n return <GraphContext value={value}>{children}</GraphContext>;\n}\n\n/**\n * Access the {@link GraphSession} of the surrounding graph tab.\n */\nexport function useGraph(): GraphSession {\n const context = useContext(GraphContext);\n\n if (context === undefined) {\n throw new Error('useGraph must be used within a GraphProvider');\n }\n\n return context;\n}\n\n/**\n * Access the currently focused {@link GraphSession}, or undefined when no graph\n * is open. Subscribes to the editor's active-graph store, so panels rendered\n * outside of a graph tab re-render when the focused graph changes.\n */\nexport function useActiveGraph(): GraphSession | undefined {\n const editor = useSystem();\n return useStore(editor.activeGraph, (s) =>\n s.activeGraphId ? s.sessions[s.activeGraphId] : undefined\n );\n}\n","import type { BoxBase, LayoutBase, PanelBase, TabData } from 'rc-dock';\n\n/**\n * Tab-id convention for graph tabs. The default graph uses the bare id `graph`\n * (session id `graph`); every other graph uses `graph:<sessionId>`. These three\n * helpers are the single source of truth for the convention.\n */\nconst GRAPH_TAB_PREFIX = 'graph:';\nexport const DEFAULT_GRAPH_ID = 'graph';\n\nexport function isGraphTabId(id: string | undefined): id is string {\n return !!id && (id === DEFAULT_GRAPH_ID || id.startsWith(GRAPH_TAB_PREFIX));\n}\n\nexport function sessionIdFromTabId(tabId: string): string {\n return tabId === DEFAULT_GRAPH_ID\n ? DEFAULT_GRAPH_ID\n : tabId.slice(GRAPH_TAB_PREFIX.length);\n}\n\nexport function tabIdForSession(sessionId: string): string {\n return sessionId === DEFAULT_GRAPH_ID\n ? DEFAULT_GRAPH_ID\n : `${GRAPH_TAB_PREFIX}${sessionId}`;\n}\n\n/** Collect the session ids of every graph tab present in a layout. */\nexport function collectGraphSessionIds(layout: LayoutBase): Set<string> {\n const ids = new Set<string>();\n const visit = (base?: BoxBase | PanelBase) => {\n if (!base) return;\n const panel = base as PanelBase;\n if (panel.tabs) {\n for (const tab of panel.tabs) {\n if (isGraphTabId(tab.id)) ids.add(sessionIdFromTabId(tab.id!));\n }\n }\n const box = base as BoxBase;\n if (box.children) box.children.forEach(visit);\n };\n visit(layout.dockbox);\n visit(layout.floatbox);\n visit(layout.maxbox);\n visit(layout.windowbox);\n return ids;\n}\n\nfunction recurseFindGraphPanel(base: BoxBase | PanelBase): PanelBase | null {\n if (base.id === 'graphs') {\n return base as PanelBase;\n }\n //Check if it has children\n if ((base as BoxBase).children) {\n for (const child of (base as BoxBase).children) {\n const found = recurseFindGraphPanel(child);\n if (found) {\n return found;\n }\n }\n }\n return null;\n}\n\nexport function findGraphPanel(layout: LayoutBase): PanelBase | null {\n //We need to recursively search for the graph panel\n // It is most likely in the dockbox\n const dockbox = recurseFindGraphPanel(layout.dockbox);\n if (dockbox) {\n return dockbox;\n }\n if (layout.floatbox) {\n const floatBox = recurseFindGraphPanel(layout.floatbox);\n if (floatBox) {\n return floatBox;\n }\n } else if (layout.maxbox) {\n const tab = recurseFindGraphPanel(layout.maxbox);\n if (tab) {\n return tab;\n }\n } else if (layout.windowbox) {\n const tab = recurseFindGraphPanel(layout.windowbox);\n if (tab) {\n return tab;\n }\n }\n return null;\n}\n\nfunction recurseFindTab(\n base: BoxBase | PanelBase,\n tabId: string\n): PanelBase | null {\n // Check if this is a panel with tabs\n if ((base as PanelBase).tabs) {\n const panel = base as PanelBase;\n const hasTab = panel.tabs?.some((tab) => tab.id === tabId);\n if (hasTab) {\n return panel;\n }\n }\n\n // Check if it has children\n if ((base as BoxBase).children) {\n for (const child of (base as BoxBase).children) {\n const found = recurseFindTab(child, tabId);\n if (found) {\n return found;\n }\n }\n }\n return null;\n}\n\nexport function findTabInLayout(\n layout: LayoutBase,\n tabId: string\n): PanelBase | null {\n // Search in dockbox\n if (layout.dockbox) {\n const found = recurseFindTab(layout.dockbox, tabId);\n if (found) return found;\n }\n\n // Search in floatbox\n if (layout.floatbox) {\n const found = recurseFindTab(layout.floatbox, tabId);\n if (found) return found;\n }\n\n // Search in maxbox\n if (layout.maxbox) {\n const found = recurseFindTab(layout.maxbox, tabId);\n if (found) return found;\n }\n\n // Search in windowbox\n if (layout.windowbox) {\n const found = recurseFindTab(layout.windowbox, tabId);\n if (found) return found;\n }\n\n return null;\n}\n\nfunction removeTabFromPanel(panel: PanelBase, tabId: string): PanelBase {\n return {\n ...panel,\n tabs: panel.tabs?.filter((tab) => tab.id !== tabId)\n };\n}\n\nfunction recursiveRemoveTab(\n base: BoxBase | PanelBase,\n tabId: string\n): BoxBase | PanelBase | null {\n // If this is a panel with tabs, remove the tab\n if ((base as PanelBase).tabs) {\n const panel = base as PanelBase;\n const hasTab = panel.tabs?.some((tab) => tab.id === tabId);\n if (hasTab) {\n const updatedPanel = removeTabFromPanel(panel, tabId);\n // If panel has no more tabs, return null to remove it\n if (!updatedPanel.tabs || updatedPanel.tabs.length === 0) {\n return null;\n }\n return updatedPanel;\n }\n return panel;\n }\n\n // If it has children, recursively update them\n if ((base as BoxBase).children) {\n const box = base as BoxBase;\n const updatedChildren = box.children\n .map((child) => recursiveRemoveTab(child, tabId))\n .filter((child) => child !== null) as (BoxBase | PanelBase)[];\n\n // If no children left, return null\n if (updatedChildren.length === 0) {\n return null;\n }\n\n return {\n ...box,\n children: updatedChildren\n };\n }\n\n return base;\n}\n\nexport function removeTabFromLayout(\n layout: LayoutBase,\n tabId: string\n): LayoutBase {\n const newLayout = { ...layout };\n\n if (newLayout.dockbox) {\n const updated = recursiveRemoveTab(newLayout.dockbox, tabId);\n if (updated) {\n newLayout.dockbox = updated as BoxBase;\n }\n }\n\n if (newLayout.floatbox) {\n const updated = recursiveRemoveTab(newLayout.floatbox, tabId);\n if (updated) {\n newLayout.floatbox = updated as BoxBase;\n } else {\n delete newLayout.floatbox;\n }\n }\n\n return newLayout;\n}\n\nexport function addFloatingTab(\n layout: LayoutBase,\n tabData: Partial<TabData>,\n position: { left: number; top: number; width: number; height: number }\n): LayoutBase {\n const newLayout = { ...layout };\n\n // Create or update floatbox\n const newPanel: PanelBase = {\n x: position.left,\n y: position.top,\n w: position.width,\n h: position.height,\n tabs: [tabData],\n group: tabData.group || 'popout'\n };\n\n if (!newLayout.floatbox) {\n newLayout.floatbox = {\n mode: 'float',\n children: [newPanel]\n };\n } else {\n newLayout.floatbox = {\n ...newLayout.floatbox,\n children: [...(newLayout.floatbox.children || []), newPanel]\n };\n }\n\n return newLayout;\n}\n","import { useEffect } from 'react';\n\nexport const useOnPressKey = (\n key: string,\n callback: (e: KeyboardEvent) => void\n) => {\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.code === key) {\n callback(e);\n }\n };\n document.addEventListener('keydown', handleKeyDown);\n return () => document.removeEventListener('keydown', handleKeyDown);\n }, [key, callback]);\n};\n","import \"/home/runner/work/behave-graph/behave-graph/packages/flow/src/plugin/docs/panel/styles.module_built.css\";\nconst classes = {\"emptyText\":\"hf8PDW_emptyText\",\"socketType\":\"hf8PDW_socketType\",\"header\":\"hf8PDW_header\",\"socketItem\":\"hf8PDW_socketItem\",\"emptyIcon\":\"hf8PDW_emptyIcon\",\"emptySub\":\"hf8PDW_emptySub\",\"noContent\":\"hf8PDW_noContent\",\"socketIcon\":\"hf8PDW_socketIcon\",\"titleSection\":\"hf8PDW_titleSection\",\"container\":\"hf8PDW_container\",\"sectionTitle\":\"hf8PDW_sectionTitle\",\"iconLarge\":\"hf8PDW_iconLarge\",\"tags\":\"hf8PDW_tags\",\"content\":\"hf8PDW_content\",\"section\":\"hf8PDW_section\",\"title\":\"hf8PDW_title\",\"socketList\":\"hf8PDW_socketList\",\"description\":\"hf8PDW_description\",\"socketName\":\"hf8PDW_socketName\",\"empty\":\"hf8PDW_empty\",\"nodeType\":\"hf8PDW_nodeType\",\"tag\":\"hf8PDW_tag\"}\nexport default classes\n\nconst _emptyText0 = classes[\"emptyText\"]\nexport { _emptyText0 as \"emptyText\" }\n\nconst _socketType0 = classes[\"socketType\"]\nexport { _socketType0 as \"socketType\" }\n\nconst _header0 = classes[\"header\"]\nexport { _header0 as \"header\" }\n\nconst _socketItem0 = classes[\"socketItem\"]\nexport { _socketItem0 as \"socketItem\" }\n\nconst _emptyIcon0 = classes[\"emptyIcon\"]\nexport { _emptyIcon0 as \"emptyIcon\" }\n\nconst _emptySub0 = classes[\"emptySub\"]\nexport { _emptySub0 as \"emptySub\" }\n\nconst _noContent0 = classes[\"noContent\"]\nexport { _noContent0 as \"noContent\" }\n\nconst _socketIcon0 = classes[\"socketIcon\"]\nexport { _socketIcon0 as \"socketIcon\" }\n\nconst _titleSection0 = classes[\"titleSection\"]\nexport { _titleSection0 as \"titleSection\" }\n\nconst _container0 = classes[\"container\"]\nexport { _container0 as \"container\" }\n\nconst _sectionTitle0 = classes[\"sectionTitle\"]\nexport { _sectionTitle0 as \"sectionTitle\" }\n\nconst _iconLarge0 = classes[\"iconLarge\"]\nexport { _iconLarge0 as \"iconLarge\" }\n\nconst _tags0 = classes[\"tags\"]\nexport { _tags0 as \"tags\" }\n\nconst _content0 = classes[\"content\"]\nexport { _content0 as \"content\" }\n\nconst _section0 = classes[\"section\"]\nexport { _section0 as \"section\" }\n\nconst _title0 = classes[\"title\"]\nexport { _title0 as \"title\" }\n\nconst _socketList0 = classes[\"socketList\"]\nexport { _socketList0 as \"socketList\" }\n\nconst _description0 = classes[\"description\"]\nexport { _description0 as \"description\" }\n\nconst _socketName0 = classes[\"socketName\"]\nexport { _socketName0 as \"socketName\" }\n\nconst _empty0 = classes[\"empty\"]\nexport { _empty0 as \"empty\" }\n\nconst _nodeType0 = classes[\"nodeType\"]\nexport { _nodeType0 as \"nodeType\" }\n\nconst _tag0 = classes[\"tag\"]\nexport { _tag0 as \"tag\" }\n"],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { useCallback } from "react";
|
|
2
|
+
import { useReactFlow } from "reactflow";
|
|
3
|
+
|
|
4
|
+
//#region src/hooks/useChangeNodeData.ts
|
|
5
|
+
const useChangeNodeData = (id) => {
|
|
6
|
+
const instance = useReactFlow();
|
|
7
|
+
return useCallback((key, value) => {
|
|
8
|
+
instance.setNodes((nodes) => nodes.map((n) => {
|
|
9
|
+
if (n.id !== id) return n;
|
|
10
|
+
return {
|
|
11
|
+
...n,
|
|
12
|
+
data: {
|
|
13
|
+
...n.data,
|
|
14
|
+
[key]: value
|
|
15
|
+
}
|
|
16
|
+
};
|
|
17
|
+
}));
|
|
18
|
+
}, [instance, id]);
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
//#endregion
|
|
22
|
+
export { useChangeNodeData as t };
|
|
23
|
+
//# sourceMappingURL=useChangeNodeData-ChQGK7AI.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useChangeNodeData-ChQGK7AI.js","names":[],"sources":["../src/hooks/useChangeNodeData.ts"],"sourcesContent":["import { useCallback } from 'react';\nimport { useReactFlow } from 'reactflow';\n\nexport const useChangeNodeData = (id: string) => {\n const instance = useReactFlow();\n\n return useCallback(\n (key: string, value: any) => {\n instance.setNodes((nodes) =>\n nodes.map((n) => {\n if (n.id !== id) return n;\n return {\n ...n,\n data: {\n ...n.data,\n [key]: value\n }\n };\n })\n );\n },\n [instance, id]\n );\n};\n"],"mappings":";;;;AAGA,MAAa,qBAAqB,OAAe;CAC/C,MAAM,WAAW,cAAc;AAE/B,QAAO,aACJ,KAAa,UAAe;AAC3B,WAAS,UAAU,UACjB,MAAM,KAAK,MAAM;AACf,OAAI,EAAE,OAAO,GAAI,QAAO;AACxB,UAAO;IACL,GAAG;IACH,MAAM;KACJ,GAAG,EAAE;MACJ,MAAM;KACR;IACF;IACD,CACH;IAEH,CAAC,UAAU,GAAG,CACf"}
|