@flowgram.ai/editor 0.1.0-alpha.4 → 0.1.0-alpha.6

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/dist/esm/index.js CHANGED
@@ -20,6 +20,16 @@ export * from "@flowgram.ai/variable-plugin";
20
20
  export * from "@flowgram.ai/shortcuts-plugin";
21
21
  export * from "@flowgram.ai/node-core-plugin";
22
22
  export * from "@flowgram.ai/i18n-plugin";
23
+ import {
24
+ injectable as injectable4,
25
+ postConstruct,
26
+ named,
27
+ Container,
28
+ ContainerModule,
29
+ AsyncContainerModule,
30
+ inject as inject4,
31
+ multiInject
32
+ } from "inversify";
23
33
  import { FlowNodeFormData as FlowNodeFormData2, NodeRender } from "@flowgram.ai/form-core";
24
34
  import {
25
35
  Form,
@@ -93,7 +103,6 @@ var EditorProps;
93
103
  // src/preset/editor-default-preset.ts
94
104
  import { FlowRendererContainerModule, FlowRendererRegistry } from "@flowgram.ai/renderer";
95
105
  import { createReduxDevToolPlugin } from "@flowgram.ai/redux-devtool-plugin";
96
- import { createPlaygroundReactPreset } from "@flowgram.ai/playground-react";
97
106
  import { createNodeVariablePlugin } from "@flowgram.ai/node-variable-plugin";
98
107
  import { createNodeCorePlugin } from "@flowgram.ai/node-core-plugin";
99
108
  import { createMaterialsPlugin } from "@flowgram.ai/materials-plugin";
@@ -372,7 +381,7 @@ function createDefaultPreset(opts, plugins = []) {
372
381
  containerModules: defaultContainerModules
373
382
  })
374
383
  );
375
- return createPlaygroundReactPreset(opts, plugins)(ctx);
384
+ return plugins;
376
385
  };
377
386
  }
378
387
 
@@ -420,7 +429,11 @@ function useFlowEditor() {
420
429
 
421
430
  // src/index.ts
422
431
  export * from "@flowgram.ai/node-variable-plugin";
432
+ import { createPlaygroundReactPreset } from "@flowgram.ai/playground-react";
423
433
  export {
434
+ AsyncContainerModule,
435
+ Container,
436
+ ContainerModule,
424
437
  Editor,
425
438
  EditorProps,
426
439
  EditorProvider,
@@ -438,7 +451,13 @@ export {
438
451
  createDefaultPreset,
439
452
  createFlowEditorClientPlugin,
440
453
  createFlowEditorClientPlugins,
454
+ createPlaygroundReactPreset,
441
455
  highlightFormItem,
456
+ inject4 as inject,
457
+ injectable4 as injectable,
458
+ multiInject,
459
+ named,
460
+ postConstruct,
442
461
  useCurrentField,
443
462
  useCurrentFieldState,
444
463
  useField,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/index.ts","../../src/preset/editor-props.ts","../../src/constants.ts","../../src/preset/editor-default-preset.ts","../../src/utils/compose.ts","../../src/clients/flow-editor-client-plugins.ts","../../src/clients/node-client/create-node-client-plugins.ts","../../src/clients/node-client/node-focus-service.ts","../../src/clients/node-client/highlight/highlight-form-item.ts","../../src/clients/node-client/highlight/highlight-style.ts","../../src/clients/node-client/highlight/constants.ts","../../src/clients/node-client/highlight/use-highlight.ts","../../src/clients/node-client/node-client.ts","../../src/clients/node-client/highlight/create-node-highlight-plugin.ts","../../src/clients/flow-editor-client.ts","../../src/components/editor-provider.tsx","../../src/components/editor-renderer.tsx","../../src/components/editor.tsx","../../src/hooks/use-flow-editor.ts"],"sourcesContent":["import 'reflect-metadata';\nimport { FormModelV2 } from '@flowgram.ai/node';\n\n/* 核心 模块导出 */\nexport * from '@flowgram.ai/utils';\nexport * from '@flowgram.ai/core';\nexport * from '@flowgram.ai/document';\nexport * from '@flowgram.ai/renderer';\nexport * from '@flowgram.ai/variable-plugin';\nexport * from '@flowgram.ai/shortcuts-plugin';\nexport * from '@flowgram.ai/node-core-plugin';\nexport * from '@flowgram.ai/i18n-plugin';\n\nexport { FlowNodeFormData, NodeRender, type NodeRenderProps } from '@flowgram.ai/form-core';\n\nexport type {\n FormState,\n FieldState,\n FieldArrayRenderProps,\n FieldRenderProps,\n FormRenderProps,\n Validate,\n FormControl,\n FieldName,\n FieldError,\n FieldWarning,\n IField,\n IFieldArray,\n IForm,\n Errors,\n Warnings\n} from '@flowgram.ai/form';\n\nexport {\n Form,\n Field,\n FieldArray,\n useForm,\n useField,\n useCurrentField,\n useCurrentFieldState,\n useFieldValidate,\n useWatch,\n ValidateTrigger,\n} from '@flowgram.ai/form';\nexport * from '@flowgram.ai/node';\nexport { FormModelV2 as FormModel };\n\n/**\n * 固定布局模块导出\n */\nexport * from './preset';\nexport * from './components';\nexport * from './hooks';\nexport * from './clients';\n\n/**\n * Plugin 导出\n */\n\nexport * from '@flowgram.ai/node-variable-plugin';\n","import { VariablePluginOptions } from '@flowgram.ai/variable-plugin';\nimport { ReduxDevToolPluginOptions } from '@flowgram.ai/redux-devtool-plugin';\nimport { PlaygroundReactProps, SelectionService } from '@flowgram.ai/playground-react';\nimport { NodeCorePluginOptions } from '@flowgram.ai/node-core-plugin';\nimport { MaterialsPluginOptions } from '@flowgram.ai/materials-plugin';\nimport { I18nPluginOptions } from '@flowgram.ai/i18n-plugin';\nimport { HistoryPluginOptions } from '@flowgram.ai/history';\nimport { FlowNodeFormData, FormMetaOrFormMetaGenerator } from '@flowgram.ai/form-core';\nimport {\n FlowDocument,\n FlowDocumentJSON,\n FlowNodeEntity,\n type FlowNodeJSON,\n FlowNodeRegistry,\n FlowNodeType,\n FlowTransitionLabel,\n FlowTransitionLine,\n} from '@flowgram.ai/document';\nimport { PluginContext } from '@flowgram.ai/core';\n\nimport { EditorOptions } from '../constants';\n\nexport interface EditorPluginContext extends PluginContext {\n document: FlowDocument;\n selection: SelectionService;\n}\n\n/**\n * 固定布局配置\n */\nexport interface EditorProps<\n CTX extends EditorPluginContext = EditorPluginContext,\n JSON = FlowDocumentJSON\n> extends PlaygroundReactProps<CTX> {\n /**\n * 初始化数据\n */\n initialData?: JSON;\n /**\n * 是否为 readonly\n */\n readonly?: boolean;\n /**\n * 节点定义\n */\n nodeRegistries?: FlowNodeRegistry[];\n /**\n * 获取默认的节点配置\n */\n getNodeDefaultRegistry?: (type: FlowNodeType) => FlowNodeRegistry;\n /**\n * 节点引擎配置\n */\n nodeEngine?: NodeCorePluginOptions & {\n /**\n * 默认FormMeta\n */\n createDefaultFormMeta?: (node: FlowNodeEntity) => FormMetaOrFormMetaGenerator;\n /**\n * 开启\n */\n enable?: boolean;\n };\n /**\n * 默认是否展开所有节点\n */\n allNodesDefaultExpanded?: boolean;\n /**\n * 画布物料\n */\n materials?: MaterialsPluginOptions;\n /**\n * 画布数据加载完成, 请使用 onAllLayersRendered 替代\n * @deprecated\n * */\n onLoad?: (ctx: CTX) => void;\n /**\n * 是否开启变量引擎\n */\n variableEngine?: VariablePluginOptions;\n /**\n * 是否开启历史\n */\n history?: HistoryPluginOptions<CTX> & { disableShortcuts?: boolean };\n\n /**\n * redux 开发者工具配置\n */\n reduxDevTool?: ReduxDevToolPluginOptions;\n\n scroll?: {\n disableScrollLimit?: boolean; // 关闭滚动限制\n disableScrollBar?: boolean; // 关闭滚动条\n };\n\n /**\n * 节点转\n * @param node\n */\n toNodeJSON?(node: FlowNodeEntity): FlowNodeJSON;\n fromNodeJSON?(node: FlowNodeEntity, json: FlowNodeJSON): void;\n\n /**\n * 画布内部常量自定义\n */\n constants?: Record<string, any>;\n /**\n * 自定义节点线条\n */\n formatNodeLines?: (node: FlowNodeEntity, lines: FlowTransitionLine[]) => FlowTransitionLine[];\n /**\n * 自定义节点 label\n */\n formatNodeLabels?: (node: FlowNodeEntity, lines: FlowTransitionLabel[]) => FlowTransitionLabel[];\n /**\n * 国际化\n */\n i18n?: I18nPluginOptions;\n}\n\nexport namespace EditorProps {\n /**\n * 默认配置\n */\n export const DEFAULT: EditorProps = {\n background: {},\n fromNodeJSON(node: FlowNodeEntity, json: FlowNodeJSON) {\n const formData = node.getData(FlowNodeFormData)!;\n // 如果没有使用表单引擎,将 data 数据填入 extInfo\n if (!formData) {\n if (json.data) {\n node.updateExtInfo(json.data);\n }\n } else {\n const defaultFormMeta = node\n .getService<EditorProps>(EditorOptions)\n .nodeEngine?.createDefaultFormMeta?.(node);\n\n const formMeta = node.getNodeRegistry()?.formMeta || defaultFormMeta;\n\n if (formMeta) {\n formData.createForm(formMeta, json.data);\n }\n }\n },\n toNodeJSON(node: FlowNodeEntity): FlowNodeJSON {\n const nodesMap: Record<string, FlowNodeJSON> = {};\n let startNodeJSON: FlowNodeJSON;\n node.document.traverse((node) => {\n const isSystemNode = node.id.startsWith('$');\n if (isSystemNode) return;\n const formData = node.getData(FlowNodeFormData);\n let formJSON =\n formData && formData.formModel && formData.formModel.initialized\n ? formData.toJSON()\n : undefined;\n const nodeJSON = {\n id: node.id,\n type: node.flowNodeType,\n data: formData ? formJSON : node.getExtInfo(),\n blocks: [],\n };\n if (!startNodeJSON) startNodeJSON = nodeJSON;\n let { parent } = node;\n if (parent && parent.id.startsWith('$')) {\n parent = parent.originParent;\n }\n const parentJSON = parent ? nodesMap[parent.id] : undefined;\n if (parentJSON) {\n parentJSON.blocks?.push(nodeJSON);\n }\n nodesMap[node.id] = nodeJSON;\n }, node);\n return startNodeJSON!;\n },\n };\n}\n","export const EditorOptions = Symbol('EditorOptions');\n","import { interfaces } from 'inversify';\nimport { FlowRendererContainerModule, FlowRendererRegistry } from '@flowgram.ai/renderer';\nimport { createReduxDevToolPlugin } from '@flowgram.ai/redux-devtool-plugin';\nimport { createPlaygroundReactPreset } from '@flowgram.ai/playground-react';\nimport { createNodeVariablePlugin } from '@flowgram.ai/node-variable-plugin';\nimport { createNodeCorePlugin } from '@flowgram.ai/node-core-plugin';\nimport { createMaterialsPlugin } from '@flowgram.ai/materials-plugin';\nimport { createI18nPlugin } from '@flowgram.ai/i18n-plugin';\nimport { createHistoryNodePlugin } from '@flowgram.ai/history-node-plugin';\nimport { FlowDocumentContainerModule } from '@flowgram.ai/document';\nimport { createPlaygroundPlugin, Plugin, PluginsProvider } from '@flowgram.ai/core';\n\nimport { compose } from '../utils/compose';\nimport { EditorOptions } from '../constants';\nimport { createFlowEditorClientPlugins } from '../clients/flow-editor-client-plugins';\nimport { EditorPluginContext, EditorProps } from './editor-props';\n\nexport function createDefaultPreset<CTX extends EditorPluginContext = EditorPluginContext>(\n opts: EditorProps<CTX>,\n plugins: Plugin[] = []\n): PluginsProvider<CTX> {\n return (ctx: CTX) => {\n opts = { ...EditorProps.DEFAULT, ...opts };\n ctx.container.bind(EditorOptions).toConstantValue(opts);\n /**\n * i18n support\n */\n if (opts.i18n) {\n plugins.push(createI18nPlugin(opts.i18n));\n }\n /**\n * 默认注册顶层 flow editor client plugin\n */\n plugins.push(...createFlowEditorClientPlugins());\n\n /**\n * 注册 Redux 开发者工具\n */\n if (opts.reduxDevTool?.enable) {\n plugins.push(createReduxDevToolPlugin(opts.reduxDevTool));\n }\n\n /**\n * 注册画布模块\n */\n const defaultContainerModules: interfaces.ContainerModule[] = [\n FlowDocumentContainerModule, // 默认文档\n FlowRendererContainerModule, // 默认渲染\n ];\n /**\n * 注册物料\n */\n plugins.push(createMaterialsPlugin(opts.materials || {}));\n\n /**\n * 注册节点引擎\n */\n if (opts.nodeEngine && opts.nodeEngine.enable !== false) {\n plugins.push(createNodeCorePlugin({ materials: opts.nodeEngine.materials }));\n\n if (opts.variableEngine?.enable) {\n plugins.push(createNodeVariablePlugin({}));\n }\n\n if (opts.history?.enable) {\n plugins.push(createHistoryNodePlugin({}));\n }\n }\n /**\n * 画布生命周期注册\n */\n plugins.push(\n createPlaygroundPlugin<CTX>({\n onInit: (ctx) => {\n if (opts.nodeRegistries) {\n ctx.document.registerFlowNodes(...opts.nodeRegistries);\n }\n // 自定义画布内部常量\n if (opts.constants) {\n ctx.document.options.constants = opts.constants;\n }\n // 劫持节点线条\n if (opts.formatNodeLines) {\n ctx.document.options.formatNodeLines = compose([\n ctx.document.options.formatNodeLines,\n opts.formatNodeLines,\n ]);\n }\n // 劫持节点 label\n if (opts.formatNodeLabels) {\n ctx.document.options.formatNodeLabels = compose([\n ctx.document.options.formatNodeLabels,\n opts.formatNodeLabels,\n ]);\n }\n if (opts.getNodeDefaultRegistry) {\n ctx.document.options.getNodeDefaultRegistry = opts.getNodeDefaultRegistry;\n }\n // TODO\n // if (opts.onContentChange) {\n // ctx.document.onContentChange(event => opts.onContentChange!(ctx, event));\n // }\n // TODO 这个会触发组件注册,后续要废弃这个,通过 materials 插件来做\n ctx.get<FlowRendererRegistry>(FlowRendererRegistry).init();\n },\n onReady(ctx) {\n if (opts.initialData) {\n ctx.document.fromJSON(opts.initialData);\n }\n if (opts.readonly) {\n ctx.playground.config.readonly = opts.readonly;\n }\n ctx.document.load().then(() => {\n if (opts.onLoad) opts.onLoad(ctx);\n });\n },\n onDispose(ctx) {\n ctx.document.dispose();\n },\n containerModules: defaultContainerModules,\n })\n );\n\n return createPlaygroundReactPreset<CTX>(opts, plugins)(ctx);\n };\n}\n","import { FlowNodeEntity } from '@flowgram.ai/document';\n\nexport type ComposeListItem<T> = (node: FlowNodeEntity, data: T[]) => T[];\n\nexport const compose =\n <T>(fnList: (ComposeListItem<T> | undefined)[]) =>\n (node: FlowNodeEntity, data: T[]): T[] => {\n const list = fnList.filter(Boolean) as ComposeListItem<T>[];\n if (!list.length) {\n return data;\n }\n return list.reduce((acc: T[], fn) => fn(node, acc), data);\n };\n","import { definePluginCreator } from '@flowgram.ai/core';\n\nimport { createNodeClientPlugins } from './node-client/create-node-client-plugins';\nimport { FlowEditorClient } from './flow-editor-client';\n\nexport const createFlowEditorClientPlugin = definePluginCreator<{}>({\n onBind({ bind }) {\n bind(FlowEditorClient).toSelf().inSingletonScope();\n },\n});\n\nexport const createFlowEditorClientPlugins = () => [\n ...createNodeClientPlugins(),\n createFlowEditorClientPlugin({}),\n];\n","import { definePluginCreator } from '@flowgram.ai/core';\n\nimport { NodeFocusService } from './node-focus-service';\nimport { NodeClient } from './node-client';\nimport { createNodeHighlightPlugin } from './highlight/create-node-highlight-plugin';\n\nexport const createNodeClientPlugin = definePluginCreator<{}>({\n onBind({ bind }) {\n bind(NodeFocusService).toSelf().inSingletonScope();\n bind(NodeClient).toSelf().inSingletonScope();\n },\n});\n\nexport const createNodeClientPlugins = () => [\n createNodeHighlightPlugin({}),\n createNodeClientPlugin({}),\n];\n","import { injectable, inject } from 'inversify';\nimport { type FormItem } from '@flowgram.ai/form-core';\nimport { Playground, PlaygroundConfigRevealOpts } from '@flowgram.ai/core';\n\nimport { highlightFormItem, HighLightOptions } from './highlight';\n\nexport type FocusNodeCanvasOptions = PlaygroundConfigRevealOpts;\n\nexport interface FocusNodeFormItemOptions {\n canvas?: FocusNodeCanvasOptions;\n highlight?: boolean | HighLightOptions;\n}\n\n@injectable()\nexport class NodeFocusService {\n @inject(Playground) readonly playground: Playground;\n\n protected previousOverlay: HTMLDivElement | undefined;\n\n protected currentPromise: Promise<void> | undefined;\n\n highlightNodeFormItem(formItem: FormItem, options?: HighLightOptions) {\n this.previousOverlay = highlightFormItem(formItem, options);\n }\n\n focusNodeFormItem(formItem: FormItem, options?: FocusNodeFormItemOptions): Promise<void> {\n const node = formItem.formModel.flowNodeEntity;\n const { canvas = {}, highlight } = options || {};\n if (this.previousOverlay) {\n this.previousOverlay.remove();\n this.previousOverlay = undefined;\n }\n const currentPromise = this.playground\n .scrollToView({ entities: [node], scrollToCenter: true, ...canvas })\n .then(() => {\n if (!formItem || !highlight || this.currentPromise !== currentPromise) {\n return;\n }\n this.highlightNodeFormItem(formItem, typeof highlight === 'boolean' ? {} : highlight);\n });\n this.currentPromise = currentPromise;\n return this.currentPromise;\n }\n}\n","import { FormItem } from '@flowgram.ai/form-core';\nimport { FlowNodeRenderData } from '@flowgram.ai/document';\n\nimport { HIGHLIGHT_CLASSNAME } from './highlight-style';\nimport { DEFAULT_HIGHLIGHT_PADDING } from './constants';\n\nexport interface HighLightOptions {\n padding?: number;\n overlayClassName?: string;\n}\n\nexport function highlightFormItem(\n formItem: FormItem,\n options?: HighLightOptions,\n): HTMLDivElement | undefined {\n const parent =\n formItem.formModel.flowNodeEntity.getData<FlowNodeRenderData>(FlowNodeRenderData).node;\n const target = formItem.domRef.current;\n\n if (!target) {\n return undefined;\n }\n\n const overlay = document.createElement('div');\n\n const { padding = DEFAULT_HIGHLIGHT_PADDING, overlayClassName } = options || {};\n\n overlay.style.position = 'absolute';\n overlay.style.top = '0';\n overlay.style.left = '0';\n overlay.style.width = '100%';\n overlay.style.height = '100%';\n overlay.style.zIndex = '9999';\n\n parent.appendChild(overlay);\n\n const parentRect = parent.getBoundingClientRect();\n const targetRect = target.getBoundingClientRect();\n\n overlay.style.top = targetRect.top - parentRect.top - padding + 'px';\n overlay.style.left = targetRect.left - parentRect.left - padding + 'px';\n overlay.style.width = targetRect.width + padding * 2 + 'px';\n overlay.style.height = targetRect.height + padding * 2 + 'px';\n\n overlay.className = overlayClassName || HIGHLIGHT_CLASSNAME;\n setTimeout(() => {\n overlay.remove();\n }, 2000);\n return overlay;\n}\n","export const HIGHLIGHT_CLASSNAME = 'flowide-highlight';\n\nconst styleText = `\n@keyframes flowide-fade {\n from {\n opacity: 1.0;\n }\n to {\n opacity: 0;\n }\n}\n@-webkit-keyframes flowide-fade {\n from {\n opacity: 1.0;\n }\n to {\n opacity: 0;\n }\n}\n.${HIGHLIGHT_CLASSNAME} {\n background-color: rgba(238, 245, 40, 0.5);\n animation: flowide-fade 2s 1 forwards;\n -webkit-animation: flowide-fade 2s 1 forwards;\n}\n`;\n\nlet styleDom: HTMLStyleElement | undefined;\n\nexport function createHighlightStyle(): void {\n if (styleDom) return;\n styleDom = document.createElement('style');\n styleDom.innerHTML = styleText;\n document.head.appendChild(styleDom);\n}\n\nexport function removeHighlightStyle(): void {\n styleDom?.remove();\n styleDom = undefined;\n}\n","export const DEFAULT_HIGHLIGHT_COLOR = 'rgba(238, 245, 40, 0.5)';\nexport const DEFAULT_HIGHLIGHT_PADDING = 0;\n","import { useRef } from 'react';\n\nimport { FormModel } from '@flowgram.ai/form-core';\n\ninterface HighlightProps {\n form: FormModel;\n path: string;\n}\n\nexport function useHighlight(props: HighlightProps) {\n const ref = useRef<any>(null);\n const { form, path } = props;\n const formItem = form.getFormItemByPath(path);\n if (!formItem) {\n return null;\n }\n formItem.domRef = ref;\n return ref;\n}\n","import { injectable, inject } from 'inversify';\n\nimport { NodeFocusService } from './node-focus-service';\n\n@injectable()\nexport class NodeClient {\n @inject(NodeFocusService) nodeFocusService: NodeFocusService;\n}\n","import { definePluginCreator } from '@flowgram.ai/core';\n\nimport { createHighlightStyle, removeHighlightStyle } from './highlight-style';\n\nexport const createNodeHighlightPlugin = definePluginCreator<{}>({\n onInit() {\n createHighlightStyle();\n },\n onDispose() {\n removeHighlightStyle();\n },\n});\n","import { injectable, inject } from 'inversify';\nimport { type FormItem } from '@flowgram.ai/form-core';\nimport { FlowNodeEntity } from '@flowgram.ai/document';\nimport { Playground, PlaygroundConfigRevealOpts } from '@flowgram.ai/core';\n\nimport { FocusNodeFormItemOptions, NodeClient } from './node-client';\n\ninterface FocusNodeOptions {\n zoom?: PlaygroundConfigRevealOpts['zoom'];\n easing?: PlaygroundConfigRevealOpts['easing']; // 是否开启缓动,默认开启\n easingDuration?: PlaygroundConfigRevealOpts['easingDuration']; // 默认 500 ms\n scrollToCenter?: PlaygroundConfigRevealOpts['scrollToCenter']; // 是否滚动到中心\n}\n\n@injectable()\nexport class FlowEditorClient {\n @inject(NodeClient) readonly nodeClient: NodeClient;\n\n @inject(Playground) readonly playground: Playground;\n\n focusNodeFormItem(formItem: FormItem, options?: FocusNodeFormItemOptions) {\n this.nodeClient.nodeFocusService.focusNodeFormItem(formItem, options);\n }\n\n focusNode(node: FlowNodeEntity, options?: FocusNodeOptions) {\n this.playground.scrollToView({ entities: [node], ...options });\n }\n}\n","import React, { useMemo, useCallback } from 'react';\n\nimport { interfaces } from 'inversify';\nimport { FlowDocument } from '@flowgram.ai/document';\nimport {\n PlaygroundReactProvider,\n createPluginContextDefault,\n SelectionService,\n} from '@flowgram.ai/core';\n\nimport { EditorPluginContext, EditorProps, createDefaultPreset } from '../preset';\n\nexport const EditorProvider: React.FC<EditorProps> = (props: EditorProps) => {\n const { children, ...others } = props;\n const preset = useMemo(() => createDefaultPreset(others), []);\n const customPluginContext = useCallback(\n (container: interfaces.Container) =>\n ({\n ...createPluginContextDefault(container),\n get document(): FlowDocument {\n return container.get<FlowDocument>(FlowDocument);\n },\n get selection(): SelectionService {\n return container.get<SelectionService>(SelectionService);\n },\n } as EditorPluginContext),\n []\n );\n return (\n <PlaygroundReactProvider plugins={preset} customPluginContext={customPluginContext}>\n {children}\n </PlaygroundReactProvider>\n );\n};\n","export { PlaygroundReactRenderer as EditorRenderer } from '@flowgram.ai/core';\n","import React from 'react';\n\nimport { EditorProps } from '../preset';\nimport { EditorRenderer } from './editor-renderer';\nimport { EditorProvider } from './editor-provider';\n\n/**\n * 画布编辑器\n * @param props\n * @constructor\n */\nexport const Editor: React.FC<EditorProps> = (props: EditorProps) => {\n const { children, ...otherProps } = props;\n return (\n <EditorProvider {...otherProps}>\n <EditorRenderer>{children}</EditorRenderer>\n </EditorProvider>\n );\n};\n","import { useService } from '@flowgram.ai/core';\n\nimport { FlowEditorClient } from '../clients';\n\nexport function useFlowEditor(): FlowEditorClient {\n return useService(FlowEditorClient);\n}\n"],"mappings":"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","names":["FlowNodeFormData","EditorProps","node","definePluginCreator","definePluginCreator","injectable","inject","inject","injectable","definePluginCreator","injectable","inject","Playground","inject","Playground","injectable","definePluginCreator","ctx","React","React"]}
1
+ {"version":3,"sources":["../../src/index.ts","../../src/preset/editor-props.ts","../../src/constants.ts","../../src/preset/editor-default-preset.ts","../../src/utils/compose.ts","../../src/clients/flow-editor-client-plugins.ts","../../src/clients/node-client/create-node-client-plugins.ts","../../src/clients/node-client/node-focus-service.ts","../../src/clients/node-client/highlight/highlight-form-item.ts","../../src/clients/node-client/highlight/highlight-style.ts","../../src/clients/node-client/highlight/constants.ts","../../src/clients/node-client/highlight/use-highlight.ts","../../src/clients/node-client/node-client.ts","../../src/clients/node-client/highlight/create-node-highlight-plugin.ts","../../src/clients/flow-editor-client.ts","../../src/components/editor-provider.tsx","../../src/components/editor-renderer.tsx","../../src/components/editor.tsx","../../src/hooks/use-flow-editor.ts"],"sourcesContent":["import 'reflect-metadata';\nimport { FormModelV2 } from '@flowgram.ai/node';\n\n/* 核心 模块导出 */\nexport * from '@flowgram.ai/utils';\nexport * from '@flowgram.ai/core';\nexport * from '@flowgram.ai/document';\nexport * from '@flowgram.ai/renderer';\nexport * from '@flowgram.ai/variable-plugin';\nexport * from '@flowgram.ai/shortcuts-plugin';\nexport * from '@flowgram.ai/node-core-plugin';\nexport * from '@flowgram.ai/i18n-plugin';\nexport {\n type interfaces,\n injectable,\n postConstruct,\n named,\n Container,\n ContainerModule,\n AsyncContainerModule,\n inject,\n multiInject,\n} from 'inversify';\n\nexport { FlowNodeFormData, NodeRender, type NodeRenderProps } from '@flowgram.ai/form-core';\n\nexport type {\n FormState,\n FieldState,\n FieldArrayRenderProps,\n FieldRenderProps,\n FormRenderProps,\n Validate,\n FormControl,\n FieldName,\n FieldError,\n FieldWarning,\n IField,\n IFieldArray,\n IForm,\n Errors,\n Warnings,\n} from '@flowgram.ai/form';\n\nexport {\n Form,\n Field,\n FieldArray,\n useForm,\n useField,\n useCurrentField,\n useCurrentFieldState,\n useFieldValidate,\n useWatch,\n ValidateTrigger,\n} from '@flowgram.ai/form';\nexport * from '@flowgram.ai/node';\nexport { FormModelV2 as FormModel };\n\n/**\n * 固定布局模块导出\n */\nexport * from './preset';\nexport * from './components';\nexport * from './hooks';\nexport * from './clients';\n\n/**\n * Plugin 导出\n */\n\nexport * from '@flowgram.ai/node-variable-plugin';\n\nexport { createPlaygroundReactPreset } from '@flowgram.ai/playground-react';\n","import { VariablePluginOptions } from '@flowgram.ai/variable-plugin';\nimport { ReduxDevToolPluginOptions } from '@flowgram.ai/redux-devtool-plugin';\nimport { PlaygroundReactProps, SelectionService } from '@flowgram.ai/playground-react';\nimport { NodeCorePluginOptions } from '@flowgram.ai/node-core-plugin';\nimport { MaterialsPluginOptions } from '@flowgram.ai/materials-plugin';\nimport { I18nPluginOptions } from '@flowgram.ai/i18n-plugin';\nimport { HistoryPluginOptions } from '@flowgram.ai/history';\nimport { FlowNodeFormData, FormMetaOrFormMetaGenerator } from '@flowgram.ai/form-core';\nimport {\n FlowDocument,\n FlowDocumentJSON,\n FlowNodeEntity,\n type FlowNodeJSON,\n FlowNodeRegistry,\n FlowNodeType,\n FlowTransitionLabel,\n FlowTransitionLine,\n} from '@flowgram.ai/document';\nimport { PluginContext } from '@flowgram.ai/core';\n\nimport { EditorOptions } from '../constants';\n\nexport interface EditorPluginContext extends PluginContext {\n document: FlowDocument;\n selection: SelectionService;\n}\n\n/**\n * 固定布局配置\n */\nexport interface EditorProps<\n CTX extends EditorPluginContext = EditorPluginContext,\n JSON = FlowDocumentJSON\n> extends PlaygroundReactProps<CTX> {\n /**\n * 初始化数据\n */\n initialData?: JSON;\n /**\n * 是否为 readonly\n */\n readonly?: boolean;\n /**\n * 节点定义\n */\n nodeRegistries?: FlowNodeRegistry[];\n /**\n * 获取默认的节点配置\n */\n getNodeDefaultRegistry?: (type: FlowNodeType) => FlowNodeRegistry;\n /**\n * 节点引擎配置\n */\n nodeEngine?: NodeCorePluginOptions & {\n /**\n * 默认FormMeta\n */\n createDefaultFormMeta?: (node: FlowNodeEntity) => FormMetaOrFormMetaGenerator;\n /**\n * 开启\n */\n enable?: boolean;\n };\n /**\n * 默认是否展开所有节点\n */\n allNodesDefaultExpanded?: boolean;\n /**\n * 画布物料\n */\n materials?: MaterialsPluginOptions;\n /**\n * 画布数据加载完成, 请使用 onAllLayersRendered 替代\n * @deprecated\n * */\n onLoad?: (ctx: CTX) => void;\n /**\n * 是否开启变量引擎\n */\n variableEngine?: VariablePluginOptions;\n /**\n * 是否开启历史\n */\n history?: HistoryPluginOptions<CTX> & { disableShortcuts?: boolean };\n\n /**\n * redux 开发者工具配置\n */\n reduxDevTool?: ReduxDevToolPluginOptions;\n\n scroll?: {\n disableScrollLimit?: boolean; // 关闭滚动限制\n disableScrollBar?: boolean; // 关闭滚动条\n };\n\n /**\n * 节点转\n * @param node\n */\n toNodeJSON?(node: FlowNodeEntity): FlowNodeJSON;\n fromNodeJSON?(node: FlowNodeEntity, json: FlowNodeJSON): void;\n\n /**\n * 画布内部常量自定义\n */\n constants?: Record<string, any>;\n /**\n * 自定义节点线条\n */\n formatNodeLines?: (node: FlowNodeEntity, lines: FlowTransitionLine[]) => FlowTransitionLine[];\n /**\n * 自定义节点 label\n */\n formatNodeLabels?: (node: FlowNodeEntity, lines: FlowTransitionLabel[]) => FlowTransitionLabel[];\n /**\n * 国际化\n */\n i18n?: I18nPluginOptions;\n}\n\nexport namespace EditorProps {\n /**\n * 默认配置\n */\n export const DEFAULT: EditorProps = {\n background: {},\n fromNodeJSON(node: FlowNodeEntity, json: FlowNodeJSON) {\n const formData = node.getData(FlowNodeFormData)!;\n // 如果没有使用表单引擎,将 data 数据填入 extInfo\n if (!formData) {\n if (json.data) {\n node.updateExtInfo(json.data);\n }\n } else {\n const defaultFormMeta = node\n .getService<EditorProps>(EditorOptions)\n .nodeEngine?.createDefaultFormMeta?.(node);\n\n const formMeta = node.getNodeRegistry()?.formMeta || defaultFormMeta;\n\n if (formMeta) {\n formData.createForm(formMeta, json.data);\n }\n }\n },\n toNodeJSON(node: FlowNodeEntity): FlowNodeJSON {\n const nodesMap: Record<string, FlowNodeJSON> = {};\n let startNodeJSON: FlowNodeJSON;\n node.document.traverse((node) => {\n const isSystemNode = node.id.startsWith('$');\n if (isSystemNode) return;\n const formData = node.getData(FlowNodeFormData);\n let formJSON =\n formData && formData.formModel && formData.formModel.initialized\n ? formData.toJSON()\n : undefined;\n const nodeJSON = {\n id: node.id,\n type: node.flowNodeType,\n data: formData ? formJSON : node.getExtInfo(),\n blocks: [],\n };\n if (!startNodeJSON) startNodeJSON = nodeJSON;\n let { parent } = node;\n if (parent && parent.id.startsWith('$')) {\n parent = parent.originParent;\n }\n const parentJSON = parent ? nodesMap[parent.id] : undefined;\n if (parentJSON) {\n parentJSON.blocks?.push(nodeJSON);\n }\n nodesMap[node.id] = nodeJSON;\n }, node);\n return startNodeJSON!;\n },\n };\n}\n","export const EditorOptions = Symbol('EditorOptions');\n","import { interfaces } from 'inversify';\nimport { FlowRendererContainerModule, FlowRendererRegistry } from '@flowgram.ai/renderer';\nimport { createReduxDevToolPlugin } from '@flowgram.ai/redux-devtool-plugin';\nimport { createNodeVariablePlugin } from '@flowgram.ai/node-variable-plugin';\nimport { createNodeCorePlugin } from '@flowgram.ai/node-core-plugin';\nimport { createMaterialsPlugin } from '@flowgram.ai/materials-plugin';\nimport { createI18nPlugin } from '@flowgram.ai/i18n-plugin';\nimport { createHistoryNodePlugin } from '@flowgram.ai/history-node-plugin';\nimport { FlowDocumentContainerModule } from '@flowgram.ai/document';\nimport { createPlaygroundPlugin, Plugin, PluginsProvider } from '@flowgram.ai/core';\n\nimport { compose } from '../utils/compose';\nimport { EditorOptions } from '../constants';\nimport { createFlowEditorClientPlugins } from '../clients/flow-editor-client-plugins';\nimport { EditorPluginContext, EditorProps } from './editor-props';\n\nexport function createDefaultPreset<CTX extends EditorPluginContext = EditorPluginContext>(\n opts: EditorProps<CTX>,\n plugins: Plugin[] = []\n): PluginsProvider<CTX> {\n return (ctx: CTX) => {\n opts = { ...EditorProps.DEFAULT, ...opts };\n ctx.container.bind(EditorOptions).toConstantValue(opts);\n /**\n * i18n support\n */\n if (opts.i18n) {\n plugins.push(createI18nPlugin(opts.i18n));\n }\n /**\n * 默认注册顶层 flow editor client plugin\n */\n plugins.push(...createFlowEditorClientPlugins());\n\n /**\n * 注册 Redux 开发者工具\n */\n if (opts.reduxDevTool?.enable) {\n plugins.push(createReduxDevToolPlugin(opts.reduxDevTool));\n }\n\n /**\n * 注册画布模块\n */\n const defaultContainerModules: interfaces.ContainerModule[] = [\n FlowDocumentContainerModule, // 默认文档\n FlowRendererContainerModule, // 默认渲染\n ];\n /**\n * 注册物料\n */\n plugins.push(createMaterialsPlugin(opts.materials || {}));\n\n /**\n * 注册节点引擎\n */\n if (opts.nodeEngine && opts.nodeEngine.enable !== false) {\n plugins.push(createNodeCorePlugin({ materials: opts.nodeEngine.materials }));\n\n if (opts.variableEngine?.enable) {\n plugins.push(createNodeVariablePlugin({}));\n }\n\n if (opts.history?.enable) {\n plugins.push(createHistoryNodePlugin({}));\n }\n }\n /**\n * 画布生命周期注册\n */\n plugins.push(\n createPlaygroundPlugin<CTX>({\n onInit: (ctx) => {\n if (opts.nodeRegistries) {\n ctx.document.registerFlowNodes(...opts.nodeRegistries);\n }\n // 自定义画布内部常量\n if (opts.constants) {\n ctx.document.options.constants = opts.constants;\n }\n // 劫持节点线条\n if (opts.formatNodeLines) {\n ctx.document.options.formatNodeLines = compose([\n ctx.document.options.formatNodeLines,\n opts.formatNodeLines,\n ]);\n }\n // 劫持节点 label\n if (opts.formatNodeLabels) {\n ctx.document.options.formatNodeLabels = compose([\n ctx.document.options.formatNodeLabels,\n opts.formatNodeLabels,\n ]);\n }\n if (opts.getNodeDefaultRegistry) {\n ctx.document.options.getNodeDefaultRegistry = opts.getNodeDefaultRegistry;\n }\n // TODO\n // if (opts.onContentChange) {\n // ctx.document.onContentChange(event => opts.onContentChange!(ctx, event));\n // }\n // TODO 这个会触发组件注册,后续要废弃这个,通过 materials 插件来做\n ctx.get<FlowRendererRegistry>(FlowRendererRegistry).init();\n },\n onReady(ctx) {\n if (opts.initialData) {\n ctx.document.fromJSON(opts.initialData);\n }\n if (opts.readonly) {\n ctx.playground.config.readonly = opts.readonly;\n }\n ctx.document.load().then(() => {\n if (opts.onLoad) opts.onLoad(ctx);\n });\n },\n onDispose(ctx) {\n ctx.document.dispose();\n },\n containerModules: defaultContainerModules,\n })\n );\n\n return plugins;\n };\n}\n","import { FlowNodeEntity } from '@flowgram.ai/document';\n\nexport type ComposeListItem<T> = (node: FlowNodeEntity, data: T[]) => T[];\n\nexport const compose =\n <T>(fnList: (ComposeListItem<T> | undefined)[]) =>\n (node: FlowNodeEntity, data: T[]): T[] => {\n const list = fnList.filter(Boolean) as ComposeListItem<T>[];\n if (!list.length) {\n return data;\n }\n return list.reduce((acc: T[], fn) => fn(node, acc), data);\n };\n","import { definePluginCreator } from '@flowgram.ai/core';\n\nimport { createNodeClientPlugins } from './node-client/create-node-client-plugins';\nimport { FlowEditorClient } from './flow-editor-client';\n\nexport const createFlowEditorClientPlugin = definePluginCreator<{}>({\n onBind({ bind }) {\n bind(FlowEditorClient).toSelf().inSingletonScope();\n },\n});\n\nexport const createFlowEditorClientPlugins = () => [\n ...createNodeClientPlugins(),\n createFlowEditorClientPlugin({}),\n];\n","import { definePluginCreator } from '@flowgram.ai/core';\n\nimport { NodeFocusService } from './node-focus-service';\nimport { NodeClient } from './node-client';\nimport { createNodeHighlightPlugin } from './highlight/create-node-highlight-plugin';\n\nexport const createNodeClientPlugin = definePluginCreator<{}>({\n onBind({ bind }) {\n bind(NodeFocusService).toSelf().inSingletonScope();\n bind(NodeClient).toSelf().inSingletonScope();\n },\n});\n\nexport const createNodeClientPlugins = () => [\n createNodeHighlightPlugin({}),\n createNodeClientPlugin({}),\n];\n","import { injectable, inject } from 'inversify';\nimport { type FormItem } from '@flowgram.ai/form-core';\nimport { Playground, PlaygroundConfigRevealOpts } from '@flowgram.ai/core';\n\nimport { highlightFormItem, HighLightOptions } from './highlight';\n\nexport type FocusNodeCanvasOptions = PlaygroundConfigRevealOpts;\n\nexport interface FocusNodeFormItemOptions {\n canvas?: FocusNodeCanvasOptions;\n highlight?: boolean | HighLightOptions;\n}\n\n@injectable()\nexport class NodeFocusService {\n @inject(Playground) readonly playground: Playground;\n\n protected previousOverlay: HTMLDivElement | undefined;\n\n protected currentPromise: Promise<void> | undefined;\n\n highlightNodeFormItem(formItem: FormItem, options?: HighLightOptions) {\n this.previousOverlay = highlightFormItem(formItem, options);\n }\n\n focusNodeFormItem(formItem: FormItem, options?: FocusNodeFormItemOptions): Promise<void> {\n const node = formItem.formModel.flowNodeEntity;\n const { canvas = {}, highlight } = options || {};\n if (this.previousOverlay) {\n this.previousOverlay.remove();\n this.previousOverlay = undefined;\n }\n const currentPromise = this.playground\n .scrollToView({ entities: [node], scrollToCenter: true, ...canvas })\n .then(() => {\n if (!formItem || !highlight || this.currentPromise !== currentPromise) {\n return;\n }\n this.highlightNodeFormItem(formItem, typeof highlight === 'boolean' ? {} : highlight);\n });\n this.currentPromise = currentPromise;\n return this.currentPromise;\n }\n}\n","import { FormItem } from '@flowgram.ai/form-core';\nimport { FlowNodeRenderData } from '@flowgram.ai/document';\n\nimport { HIGHLIGHT_CLASSNAME } from './highlight-style';\nimport { DEFAULT_HIGHLIGHT_PADDING } from './constants';\n\nexport interface HighLightOptions {\n padding?: number;\n overlayClassName?: string;\n}\n\nexport function highlightFormItem(\n formItem: FormItem,\n options?: HighLightOptions,\n): HTMLDivElement | undefined {\n const parent =\n formItem.formModel.flowNodeEntity.getData<FlowNodeRenderData>(FlowNodeRenderData).node;\n const target = formItem.domRef.current;\n\n if (!target) {\n return undefined;\n }\n\n const overlay = document.createElement('div');\n\n const { padding = DEFAULT_HIGHLIGHT_PADDING, overlayClassName } = options || {};\n\n overlay.style.position = 'absolute';\n overlay.style.top = '0';\n overlay.style.left = '0';\n overlay.style.width = '100%';\n overlay.style.height = '100%';\n overlay.style.zIndex = '9999';\n\n parent.appendChild(overlay);\n\n const parentRect = parent.getBoundingClientRect();\n const targetRect = target.getBoundingClientRect();\n\n overlay.style.top = targetRect.top - parentRect.top - padding + 'px';\n overlay.style.left = targetRect.left - parentRect.left - padding + 'px';\n overlay.style.width = targetRect.width + padding * 2 + 'px';\n overlay.style.height = targetRect.height + padding * 2 + 'px';\n\n overlay.className = overlayClassName || HIGHLIGHT_CLASSNAME;\n setTimeout(() => {\n overlay.remove();\n }, 2000);\n return overlay;\n}\n","export const HIGHLIGHT_CLASSNAME = 'flowide-highlight';\n\nconst styleText = `\n@keyframes flowide-fade {\n from {\n opacity: 1.0;\n }\n to {\n opacity: 0;\n }\n}\n@-webkit-keyframes flowide-fade {\n from {\n opacity: 1.0;\n }\n to {\n opacity: 0;\n }\n}\n.${HIGHLIGHT_CLASSNAME} {\n background-color: rgba(238, 245, 40, 0.5);\n animation: flowide-fade 2s 1 forwards;\n -webkit-animation: flowide-fade 2s 1 forwards;\n}\n`;\n\nlet styleDom: HTMLStyleElement | undefined;\n\nexport function createHighlightStyle(): void {\n if (styleDom) return;\n styleDom = document.createElement('style');\n styleDom.innerHTML = styleText;\n document.head.appendChild(styleDom);\n}\n\nexport function removeHighlightStyle(): void {\n styleDom?.remove();\n styleDom = undefined;\n}\n","export const DEFAULT_HIGHLIGHT_COLOR = 'rgba(238, 245, 40, 0.5)';\nexport const DEFAULT_HIGHLIGHT_PADDING = 0;\n","import { useRef } from 'react';\n\nimport { FormModel } from '@flowgram.ai/form-core';\n\ninterface HighlightProps {\n form: FormModel;\n path: string;\n}\n\nexport function useHighlight(props: HighlightProps) {\n const ref = useRef<any>(null);\n const { form, path } = props;\n const formItem = form.getFormItemByPath(path);\n if (!formItem) {\n return null;\n }\n formItem.domRef = ref;\n return ref;\n}\n","import { injectable, inject } from 'inversify';\n\nimport { NodeFocusService } from './node-focus-service';\n\n@injectable()\nexport class NodeClient {\n @inject(NodeFocusService) nodeFocusService: NodeFocusService;\n}\n","import { definePluginCreator } from '@flowgram.ai/core';\n\nimport { createHighlightStyle, removeHighlightStyle } from './highlight-style';\n\nexport const createNodeHighlightPlugin = definePluginCreator<{}>({\n onInit() {\n createHighlightStyle();\n },\n onDispose() {\n removeHighlightStyle();\n },\n});\n","import { injectable, inject } from 'inversify';\nimport { type FormItem } from '@flowgram.ai/form-core';\nimport { FlowNodeEntity } from '@flowgram.ai/document';\nimport { Playground, PlaygroundConfigRevealOpts } from '@flowgram.ai/core';\n\nimport { FocusNodeFormItemOptions, NodeClient } from './node-client';\n\ninterface FocusNodeOptions {\n zoom?: PlaygroundConfigRevealOpts['zoom'];\n easing?: PlaygroundConfigRevealOpts['easing']; // 是否开启缓动,默认开启\n easingDuration?: PlaygroundConfigRevealOpts['easingDuration']; // 默认 500 ms\n scrollToCenter?: PlaygroundConfigRevealOpts['scrollToCenter']; // 是否滚动到中心\n}\n\n@injectable()\nexport class FlowEditorClient {\n @inject(NodeClient) readonly nodeClient: NodeClient;\n\n @inject(Playground) readonly playground: Playground;\n\n focusNodeFormItem(formItem: FormItem, options?: FocusNodeFormItemOptions) {\n this.nodeClient.nodeFocusService.focusNodeFormItem(formItem, options);\n }\n\n focusNode(node: FlowNodeEntity, options?: FocusNodeOptions) {\n this.playground.scrollToView({ entities: [node], ...options });\n }\n}\n","import React, { useMemo, useCallback } from 'react';\n\nimport { interfaces } from 'inversify';\nimport { FlowDocument } from '@flowgram.ai/document';\nimport {\n PlaygroundReactProvider,\n createPluginContextDefault,\n SelectionService,\n} from '@flowgram.ai/core';\n\nimport { EditorPluginContext, EditorProps, createDefaultPreset } from '../preset';\n\nexport const EditorProvider: React.FC<EditorProps> = (props: EditorProps) => {\n const { children, ...others } = props;\n const preset = useMemo(() => createDefaultPreset(others), []);\n const customPluginContext = useCallback(\n (container: interfaces.Container) =>\n ({\n ...createPluginContextDefault(container),\n get document(): FlowDocument {\n return container.get<FlowDocument>(FlowDocument);\n },\n get selection(): SelectionService {\n return container.get<SelectionService>(SelectionService);\n },\n } as EditorPluginContext),\n []\n );\n return (\n <PlaygroundReactProvider plugins={preset} customPluginContext={customPluginContext}>\n {children}\n </PlaygroundReactProvider>\n );\n};\n","export { PlaygroundReactRenderer as EditorRenderer } from '@flowgram.ai/core';\n","import React from 'react';\n\nimport { EditorProps } from '../preset';\nimport { EditorRenderer } from './editor-renderer';\nimport { EditorProvider } from './editor-provider';\n\n/**\n * 画布编辑器\n * @param props\n * @constructor\n */\nexport const Editor: React.FC<EditorProps> = (props: EditorProps) => {\n const { children, ...otherProps } = props;\n return (\n <EditorProvider {...otherProps}>\n <EditorRenderer>{children}</EditorRenderer>\n </EditorProvider>\n );\n};\n","import { useService } from '@flowgram.ai/core';\n\nimport { FlowEditorClient } from '../clients';\n\nexport function useFlowEditor(): FlowEditorClient {\n return useService(FlowEditorClient);\n}\n"],"mappings":"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","names":["injectable","inject","FlowNodeFormData","EditorProps","node","definePluginCreator","definePluginCreator","injectable","inject","inject","injectable","definePluginCreator","injectable","inject","Playground","inject","Playground","injectable","definePluginCreator","ctx","React","React"]}
package/dist/index.d.mts CHANGED
@@ -15,11 +15,13 @@ import { NodeCorePluginOptions } from '@flowgram.ai/node-core-plugin';
15
15
  export * from '@flowgram.ai/node-core-plugin';
16
16
  import { I18nPluginOptions } from '@flowgram.ai/i18n-plugin';
17
17
  export * from '@flowgram.ai/i18n-plugin';
18
+ export { AsyncContainerModule, Container, ContainerModule, inject, injectable, interfaces, multiInject, named, postConstruct } from 'inversify';
18
19
  import { FormMetaOrFormMetaGenerator, FormItem, FormModel } from '@flowgram.ai/form-core';
19
20
  export { FlowNodeFormData, NodeRender, NodeRenderProps } from '@flowgram.ai/form-core';
20
21
  export { Errors, Field, FieldArray, FieldArrayRenderProps, FieldError, FieldName, FieldRenderProps, FieldState, FieldWarning, Form, FormControl, FormRenderProps, FormState, IField, IFieldArray, IForm, Validate, ValidateTrigger, Warnings, useCurrentField, useCurrentFieldState, useField, useFieldValidate, useForm, useWatch } from '@flowgram.ai/form';
21
22
  import { ReduxDevToolPluginOptions } from '@flowgram.ai/redux-devtool-plugin';
22
23
  import { SelectionService, PlaygroundReactProps } from '@flowgram.ai/playground-react';
24
+ export { createPlaygroundReactPreset } from '@flowgram.ai/playground-react';
23
25
  import { MaterialsPluginOptions } from '@flowgram.ai/materials-plugin';
24
26
  import { HistoryPluginOptions } from '@flowgram.ai/history';
25
27
  import * as React from 'react';
package/dist/index.d.ts CHANGED
@@ -15,11 +15,13 @@ import { NodeCorePluginOptions } from '@flowgram.ai/node-core-plugin';
15
15
  export * from '@flowgram.ai/node-core-plugin';
16
16
  import { I18nPluginOptions } from '@flowgram.ai/i18n-plugin';
17
17
  export * from '@flowgram.ai/i18n-plugin';
18
+ export { AsyncContainerModule, Container, ContainerModule, inject, injectable, interfaces, multiInject, named, postConstruct } from 'inversify';
18
19
  import { FormMetaOrFormMetaGenerator, FormItem, FormModel } from '@flowgram.ai/form-core';
19
20
  export { FlowNodeFormData, NodeRender, NodeRenderProps } from '@flowgram.ai/form-core';
20
21
  export { Errors, Field, FieldArray, FieldArrayRenderProps, FieldError, FieldName, FieldRenderProps, FieldState, FieldWarning, Form, FormControl, FormRenderProps, FormState, IField, IFieldArray, IForm, Validate, ValidateTrigger, Warnings, useCurrentField, useCurrentFieldState, useField, useFieldValidate, useForm, useWatch } from '@flowgram.ai/form';
21
22
  import { ReduxDevToolPluginOptions } from '@flowgram.ai/redux-devtool-plugin';
22
23
  import { SelectionService, PlaygroundReactProps } from '@flowgram.ai/playground-react';
24
+ export { createPlaygroundReactPreset } from '@flowgram.ai/playground-react';
23
25
  import { MaterialsPluginOptions } from '@flowgram.ai/materials-plugin';
24
26
  import { HistoryPluginOptions } from '@flowgram.ai/history';
25
27
  import * as React from 'react';
package/dist/index.js CHANGED
@@ -39,6 +39,9 @@ var __decorateClass = (decorators, target, key, kind) => {
39
39
  // src/index.ts
40
40
  var src_exports = {};
41
41
  __export(src_exports, {
42
+ AsyncContainerModule: () => import_inversify4.AsyncContainerModule,
43
+ Container: () => import_inversify4.Container,
44
+ ContainerModule: () => import_inversify4.ContainerModule,
42
45
  Editor: () => Editor,
43
46
  EditorProps: () => EditorProps,
44
47
  EditorProvider: () => EditorProvider,
@@ -56,7 +59,13 @@ __export(src_exports, {
56
59
  createDefaultPreset: () => createDefaultPreset,
57
60
  createFlowEditorClientPlugin: () => createFlowEditorClientPlugin,
58
61
  createFlowEditorClientPlugins: () => createFlowEditorClientPlugins,
62
+ createPlaygroundReactPreset: () => import_playground_react.createPlaygroundReactPreset,
59
63
  highlightFormItem: () => highlightFormItem,
64
+ inject: () => import_inversify4.inject,
65
+ injectable: () => import_inversify4.injectable,
66
+ multiInject: () => import_inversify4.multiInject,
67
+ named: () => import_inversify4.named,
68
+ postConstruct: () => import_inversify4.postConstruct,
60
69
  useCurrentField: () => import_form.useCurrentField,
61
70
  useCurrentFieldState: () => import_form.useCurrentFieldState,
62
71
  useField: () => import_form.useField,
@@ -77,6 +86,7 @@ __reExport(src_exports, require("@flowgram.ai/variable-plugin"), module.exports)
77
86
  __reExport(src_exports, require("@flowgram.ai/shortcuts-plugin"), module.exports);
78
87
  __reExport(src_exports, require("@flowgram.ai/node-core-plugin"), module.exports);
79
88
  __reExport(src_exports, require("@flowgram.ai/i18n-plugin"), module.exports);
89
+ var import_inversify4 = require("inversify");
80
90
  var import_form_core2 = require("@flowgram.ai/form-core");
81
91
  var import_form = require("@flowgram.ai/form");
82
92
  __reExport(src_exports, require("@flowgram.ai/node"), module.exports);
@@ -139,7 +149,6 @@ var EditorProps;
139
149
  // src/preset/editor-default-preset.ts
140
150
  var import_renderer = require("@flowgram.ai/renderer");
141
151
  var import_redux_devtool_plugin = require("@flowgram.ai/redux-devtool-plugin");
142
- var import_playground_react = require("@flowgram.ai/playground-react");
143
152
  var import_node_variable_plugin = require("@flowgram.ai/node-variable-plugin");
144
153
  var import_node_core_plugin = require("@flowgram.ai/node-core-plugin");
145
154
  var import_materials_plugin = require("@flowgram.ai/materials-plugin");
@@ -418,7 +427,7 @@ function createDefaultPreset(opts, plugins = []) {
418
427
  containerModules: defaultContainerModules
419
428
  })
420
429
  );
421
- return (0, import_playground_react.createPlaygroundReactPreset)(opts, plugins)(ctx);
430
+ return plugins;
422
431
  };
423
432
  }
424
433
 
@@ -462,8 +471,12 @@ function useFlowEditor() {
462
471
 
463
472
  // src/index.ts
464
473
  __reExport(src_exports, require("@flowgram.ai/node-variable-plugin"), module.exports);
474
+ var import_playground_react = require("@flowgram.ai/playground-react");
465
475
  // Annotate the CommonJS export names for ESM import in node:
466
476
  0 && (module.exports = {
477
+ AsyncContainerModule,
478
+ Container,
479
+ ContainerModule,
467
480
  Editor,
468
481
  EditorProps,
469
482
  EditorProvider,
@@ -481,7 +494,13 @@ __reExport(src_exports, require("@flowgram.ai/node-variable-plugin"), module.exp
481
494
  createDefaultPreset,
482
495
  createFlowEditorClientPlugin,
483
496
  createFlowEditorClientPlugins,
497
+ createPlaygroundReactPreset,
484
498
  highlightFormItem,
499
+ inject,
500
+ injectable,
501
+ multiInject,
502
+ named,
503
+ postConstruct,
485
504
  useCurrentField,
486
505
  useCurrentFieldState,
487
506
  useField,
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/preset/editor-props.ts","../src/constants.ts","../src/preset/editor-default-preset.ts","../src/utils/compose.ts","../src/clients/flow-editor-client-plugins.ts","../src/clients/node-client/create-node-client-plugins.ts","../src/clients/node-client/node-focus-service.ts","../src/clients/node-client/highlight/highlight-form-item.ts","../src/clients/node-client/highlight/highlight-style.ts","../src/clients/node-client/highlight/constants.ts","../src/clients/node-client/highlight/use-highlight.ts","../src/clients/node-client/node-client.ts","../src/clients/node-client/highlight/create-node-highlight-plugin.ts","../src/clients/flow-editor-client.ts","../src/components/editor-provider.tsx","../src/components/editor-renderer.tsx","../src/components/editor.tsx","../src/hooks/use-flow-editor.ts"],"sourcesContent":["import 'reflect-metadata';\nimport { FormModelV2 } from '@flowgram.ai/node';\n\n/* 核心 模块导出 */\nexport * from '@flowgram.ai/utils';\nexport * from '@flowgram.ai/core';\nexport * from '@flowgram.ai/document';\nexport * from '@flowgram.ai/renderer';\nexport * from '@flowgram.ai/variable-plugin';\nexport * from '@flowgram.ai/shortcuts-plugin';\nexport * from '@flowgram.ai/node-core-plugin';\nexport * from '@flowgram.ai/i18n-plugin';\n\nexport { FlowNodeFormData, NodeRender, type NodeRenderProps } from '@flowgram.ai/form-core';\n\nexport type {\n FormState,\n FieldState,\n FieldArrayRenderProps,\n FieldRenderProps,\n FormRenderProps,\n Validate,\n FormControl,\n FieldName,\n FieldError,\n FieldWarning,\n IField,\n IFieldArray,\n IForm,\n Errors,\n Warnings\n} from '@flowgram.ai/form';\n\nexport {\n Form,\n Field,\n FieldArray,\n useForm,\n useField,\n useCurrentField,\n useCurrentFieldState,\n useFieldValidate,\n useWatch,\n ValidateTrigger,\n} from '@flowgram.ai/form';\nexport * from '@flowgram.ai/node';\nexport { FormModelV2 as FormModel };\n\n/**\n * 固定布局模块导出\n */\nexport * from './preset';\nexport * from './components';\nexport * from './hooks';\nexport * from './clients';\n\n/**\n * Plugin 导出\n */\n\nexport * from '@flowgram.ai/node-variable-plugin';\n","import { VariablePluginOptions } from '@flowgram.ai/variable-plugin';\nimport { ReduxDevToolPluginOptions } from '@flowgram.ai/redux-devtool-plugin';\nimport { PlaygroundReactProps, SelectionService } from '@flowgram.ai/playground-react';\nimport { NodeCorePluginOptions } from '@flowgram.ai/node-core-plugin';\nimport { MaterialsPluginOptions } from '@flowgram.ai/materials-plugin';\nimport { I18nPluginOptions } from '@flowgram.ai/i18n-plugin';\nimport { HistoryPluginOptions } from '@flowgram.ai/history';\nimport { FlowNodeFormData, FormMetaOrFormMetaGenerator } from '@flowgram.ai/form-core';\nimport {\n FlowDocument,\n FlowDocumentJSON,\n FlowNodeEntity,\n type FlowNodeJSON,\n FlowNodeRegistry,\n FlowNodeType,\n FlowTransitionLabel,\n FlowTransitionLine,\n} from '@flowgram.ai/document';\nimport { PluginContext } from '@flowgram.ai/core';\n\nimport { EditorOptions } from '../constants';\n\nexport interface EditorPluginContext extends PluginContext {\n document: FlowDocument;\n selection: SelectionService;\n}\n\n/**\n * 固定布局配置\n */\nexport interface EditorProps<\n CTX extends EditorPluginContext = EditorPluginContext,\n JSON = FlowDocumentJSON\n> extends PlaygroundReactProps<CTX> {\n /**\n * 初始化数据\n */\n initialData?: JSON;\n /**\n * 是否为 readonly\n */\n readonly?: boolean;\n /**\n * 节点定义\n */\n nodeRegistries?: FlowNodeRegistry[];\n /**\n * 获取默认的节点配置\n */\n getNodeDefaultRegistry?: (type: FlowNodeType) => FlowNodeRegistry;\n /**\n * 节点引擎配置\n */\n nodeEngine?: NodeCorePluginOptions & {\n /**\n * 默认FormMeta\n */\n createDefaultFormMeta?: (node: FlowNodeEntity) => FormMetaOrFormMetaGenerator;\n /**\n * 开启\n */\n enable?: boolean;\n };\n /**\n * 默认是否展开所有节点\n */\n allNodesDefaultExpanded?: boolean;\n /**\n * 画布物料\n */\n materials?: MaterialsPluginOptions;\n /**\n * 画布数据加载完成, 请使用 onAllLayersRendered 替代\n * @deprecated\n * */\n onLoad?: (ctx: CTX) => void;\n /**\n * 是否开启变量引擎\n */\n variableEngine?: VariablePluginOptions;\n /**\n * 是否开启历史\n */\n history?: HistoryPluginOptions<CTX> & { disableShortcuts?: boolean };\n\n /**\n * redux 开发者工具配置\n */\n reduxDevTool?: ReduxDevToolPluginOptions;\n\n scroll?: {\n disableScrollLimit?: boolean; // 关闭滚动限制\n disableScrollBar?: boolean; // 关闭滚动条\n };\n\n /**\n * 节点转\n * @param node\n */\n toNodeJSON?(node: FlowNodeEntity): FlowNodeJSON;\n fromNodeJSON?(node: FlowNodeEntity, json: FlowNodeJSON): void;\n\n /**\n * 画布内部常量自定义\n */\n constants?: Record<string, any>;\n /**\n * 自定义节点线条\n */\n formatNodeLines?: (node: FlowNodeEntity, lines: FlowTransitionLine[]) => FlowTransitionLine[];\n /**\n * 自定义节点 label\n */\n formatNodeLabels?: (node: FlowNodeEntity, lines: FlowTransitionLabel[]) => FlowTransitionLabel[];\n /**\n * 国际化\n */\n i18n?: I18nPluginOptions;\n}\n\nexport namespace EditorProps {\n /**\n * 默认配置\n */\n export const DEFAULT: EditorProps = {\n background: {},\n fromNodeJSON(node: FlowNodeEntity, json: FlowNodeJSON) {\n const formData = node.getData(FlowNodeFormData)!;\n // 如果没有使用表单引擎,将 data 数据填入 extInfo\n if (!formData) {\n if (json.data) {\n node.updateExtInfo(json.data);\n }\n } else {\n const defaultFormMeta = node\n .getService<EditorProps>(EditorOptions)\n .nodeEngine?.createDefaultFormMeta?.(node);\n\n const formMeta = node.getNodeRegistry()?.formMeta || defaultFormMeta;\n\n if (formMeta) {\n formData.createForm(formMeta, json.data);\n }\n }\n },\n toNodeJSON(node: FlowNodeEntity): FlowNodeJSON {\n const nodesMap: Record<string, FlowNodeJSON> = {};\n let startNodeJSON: FlowNodeJSON;\n node.document.traverse((node) => {\n const isSystemNode = node.id.startsWith('$');\n if (isSystemNode) return;\n const formData = node.getData(FlowNodeFormData);\n let formJSON =\n formData && formData.formModel && formData.formModel.initialized\n ? formData.toJSON()\n : undefined;\n const nodeJSON = {\n id: node.id,\n type: node.flowNodeType,\n data: formData ? formJSON : node.getExtInfo(),\n blocks: [],\n };\n if (!startNodeJSON) startNodeJSON = nodeJSON;\n let { parent } = node;\n if (parent && parent.id.startsWith('$')) {\n parent = parent.originParent;\n }\n const parentJSON = parent ? nodesMap[parent.id] : undefined;\n if (parentJSON) {\n parentJSON.blocks?.push(nodeJSON);\n }\n nodesMap[node.id] = nodeJSON;\n }, node);\n return startNodeJSON!;\n },\n };\n}\n","export const EditorOptions = Symbol('EditorOptions');\n","import { interfaces } from 'inversify';\nimport { FlowRendererContainerModule, FlowRendererRegistry } from '@flowgram.ai/renderer';\nimport { createReduxDevToolPlugin } from '@flowgram.ai/redux-devtool-plugin';\nimport { createPlaygroundReactPreset } from '@flowgram.ai/playground-react';\nimport { createNodeVariablePlugin } from '@flowgram.ai/node-variable-plugin';\nimport { createNodeCorePlugin } from '@flowgram.ai/node-core-plugin';\nimport { createMaterialsPlugin } from '@flowgram.ai/materials-plugin';\nimport { createI18nPlugin } from '@flowgram.ai/i18n-plugin';\nimport { createHistoryNodePlugin } from '@flowgram.ai/history-node-plugin';\nimport { FlowDocumentContainerModule } from '@flowgram.ai/document';\nimport { createPlaygroundPlugin, Plugin, PluginsProvider } from '@flowgram.ai/core';\n\nimport { compose } from '../utils/compose';\nimport { EditorOptions } from '../constants';\nimport { createFlowEditorClientPlugins } from '../clients/flow-editor-client-plugins';\nimport { EditorPluginContext, EditorProps } from './editor-props';\n\nexport function createDefaultPreset<CTX extends EditorPluginContext = EditorPluginContext>(\n opts: EditorProps<CTX>,\n plugins: Plugin[] = []\n): PluginsProvider<CTX> {\n return (ctx: CTX) => {\n opts = { ...EditorProps.DEFAULT, ...opts };\n ctx.container.bind(EditorOptions).toConstantValue(opts);\n /**\n * i18n support\n */\n if (opts.i18n) {\n plugins.push(createI18nPlugin(opts.i18n));\n }\n /**\n * 默认注册顶层 flow editor client plugin\n */\n plugins.push(...createFlowEditorClientPlugins());\n\n /**\n * 注册 Redux 开发者工具\n */\n if (opts.reduxDevTool?.enable) {\n plugins.push(createReduxDevToolPlugin(opts.reduxDevTool));\n }\n\n /**\n * 注册画布模块\n */\n const defaultContainerModules: interfaces.ContainerModule[] = [\n FlowDocumentContainerModule, // 默认文档\n FlowRendererContainerModule, // 默认渲染\n ];\n /**\n * 注册物料\n */\n plugins.push(createMaterialsPlugin(opts.materials || {}));\n\n /**\n * 注册节点引擎\n */\n if (opts.nodeEngine && opts.nodeEngine.enable !== false) {\n plugins.push(createNodeCorePlugin({ materials: opts.nodeEngine.materials }));\n\n if (opts.variableEngine?.enable) {\n plugins.push(createNodeVariablePlugin({}));\n }\n\n if (opts.history?.enable) {\n plugins.push(createHistoryNodePlugin({}));\n }\n }\n /**\n * 画布生命周期注册\n */\n plugins.push(\n createPlaygroundPlugin<CTX>({\n onInit: (ctx) => {\n if (opts.nodeRegistries) {\n ctx.document.registerFlowNodes(...opts.nodeRegistries);\n }\n // 自定义画布内部常量\n if (opts.constants) {\n ctx.document.options.constants = opts.constants;\n }\n // 劫持节点线条\n if (opts.formatNodeLines) {\n ctx.document.options.formatNodeLines = compose([\n ctx.document.options.formatNodeLines,\n opts.formatNodeLines,\n ]);\n }\n // 劫持节点 label\n if (opts.formatNodeLabels) {\n ctx.document.options.formatNodeLabels = compose([\n ctx.document.options.formatNodeLabels,\n opts.formatNodeLabels,\n ]);\n }\n if (opts.getNodeDefaultRegistry) {\n ctx.document.options.getNodeDefaultRegistry = opts.getNodeDefaultRegistry;\n }\n // TODO\n // if (opts.onContentChange) {\n // ctx.document.onContentChange(event => opts.onContentChange!(ctx, event));\n // }\n // TODO 这个会触发组件注册,后续要废弃这个,通过 materials 插件来做\n ctx.get<FlowRendererRegistry>(FlowRendererRegistry).init();\n },\n onReady(ctx) {\n if (opts.initialData) {\n ctx.document.fromJSON(opts.initialData);\n }\n if (opts.readonly) {\n ctx.playground.config.readonly = opts.readonly;\n }\n ctx.document.load().then(() => {\n if (opts.onLoad) opts.onLoad(ctx);\n });\n },\n onDispose(ctx) {\n ctx.document.dispose();\n },\n containerModules: defaultContainerModules,\n })\n );\n\n return createPlaygroundReactPreset<CTX>(opts, plugins)(ctx);\n };\n}\n","import { FlowNodeEntity } from '@flowgram.ai/document';\n\nexport type ComposeListItem<T> = (node: FlowNodeEntity, data: T[]) => T[];\n\nexport const compose =\n <T>(fnList: (ComposeListItem<T> | undefined)[]) =>\n (node: FlowNodeEntity, data: T[]): T[] => {\n const list = fnList.filter(Boolean) as ComposeListItem<T>[];\n if (!list.length) {\n return data;\n }\n return list.reduce((acc: T[], fn) => fn(node, acc), data);\n };\n","import { definePluginCreator } from '@flowgram.ai/core';\n\nimport { createNodeClientPlugins } from './node-client/create-node-client-plugins';\nimport { FlowEditorClient } from './flow-editor-client';\n\nexport const createFlowEditorClientPlugin = definePluginCreator<{}>({\n onBind({ bind }) {\n bind(FlowEditorClient).toSelf().inSingletonScope();\n },\n});\n\nexport const createFlowEditorClientPlugins = () => [\n ...createNodeClientPlugins(),\n createFlowEditorClientPlugin({}),\n];\n","import { definePluginCreator } from '@flowgram.ai/core';\n\nimport { NodeFocusService } from './node-focus-service';\nimport { NodeClient } from './node-client';\nimport { createNodeHighlightPlugin } from './highlight/create-node-highlight-plugin';\n\nexport const createNodeClientPlugin = definePluginCreator<{}>({\n onBind({ bind }) {\n bind(NodeFocusService).toSelf().inSingletonScope();\n bind(NodeClient).toSelf().inSingletonScope();\n },\n});\n\nexport const createNodeClientPlugins = () => [\n createNodeHighlightPlugin({}),\n createNodeClientPlugin({}),\n];\n","import { injectable, inject } from 'inversify';\nimport { type FormItem } from '@flowgram.ai/form-core';\nimport { Playground, PlaygroundConfigRevealOpts } from '@flowgram.ai/core';\n\nimport { highlightFormItem, HighLightOptions } from './highlight';\n\nexport type FocusNodeCanvasOptions = PlaygroundConfigRevealOpts;\n\nexport interface FocusNodeFormItemOptions {\n canvas?: FocusNodeCanvasOptions;\n highlight?: boolean | HighLightOptions;\n}\n\n@injectable()\nexport class NodeFocusService {\n @inject(Playground) readonly playground: Playground;\n\n protected previousOverlay: HTMLDivElement | undefined;\n\n protected currentPromise: Promise<void> | undefined;\n\n highlightNodeFormItem(formItem: FormItem, options?: HighLightOptions) {\n this.previousOverlay = highlightFormItem(formItem, options);\n }\n\n focusNodeFormItem(formItem: FormItem, options?: FocusNodeFormItemOptions): Promise<void> {\n const node = formItem.formModel.flowNodeEntity;\n const { canvas = {}, highlight } = options || {};\n if (this.previousOverlay) {\n this.previousOverlay.remove();\n this.previousOverlay = undefined;\n }\n const currentPromise = this.playground\n .scrollToView({ entities: [node], scrollToCenter: true, ...canvas })\n .then(() => {\n if (!formItem || !highlight || this.currentPromise !== currentPromise) {\n return;\n }\n this.highlightNodeFormItem(formItem, typeof highlight === 'boolean' ? {} : highlight);\n });\n this.currentPromise = currentPromise;\n return this.currentPromise;\n }\n}\n","import { FormItem } from '@flowgram.ai/form-core';\nimport { FlowNodeRenderData } from '@flowgram.ai/document';\n\nimport { HIGHLIGHT_CLASSNAME } from './highlight-style';\nimport { DEFAULT_HIGHLIGHT_PADDING } from './constants';\n\nexport interface HighLightOptions {\n padding?: number;\n overlayClassName?: string;\n}\n\nexport function highlightFormItem(\n formItem: FormItem,\n options?: HighLightOptions,\n): HTMLDivElement | undefined {\n const parent =\n formItem.formModel.flowNodeEntity.getData<FlowNodeRenderData>(FlowNodeRenderData).node;\n const target = formItem.domRef.current;\n\n if (!target) {\n return undefined;\n }\n\n const overlay = document.createElement('div');\n\n const { padding = DEFAULT_HIGHLIGHT_PADDING, overlayClassName } = options || {};\n\n overlay.style.position = 'absolute';\n overlay.style.top = '0';\n overlay.style.left = '0';\n overlay.style.width = '100%';\n overlay.style.height = '100%';\n overlay.style.zIndex = '9999';\n\n parent.appendChild(overlay);\n\n const parentRect = parent.getBoundingClientRect();\n const targetRect = target.getBoundingClientRect();\n\n overlay.style.top = targetRect.top - parentRect.top - padding + 'px';\n overlay.style.left = targetRect.left - parentRect.left - padding + 'px';\n overlay.style.width = targetRect.width + padding * 2 + 'px';\n overlay.style.height = targetRect.height + padding * 2 + 'px';\n\n overlay.className = overlayClassName || HIGHLIGHT_CLASSNAME;\n setTimeout(() => {\n overlay.remove();\n }, 2000);\n return overlay;\n}\n","export const HIGHLIGHT_CLASSNAME = 'flowide-highlight';\n\nconst styleText = `\n@keyframes flowide-fade {\n from {\n opacity: 1.0;\n }\n to {\n opacity: 0;\n }\n}\n@-webkit-keyframes flowide-fade {\n from {\n opacity: 1.0;\n }\n to {\n opacity: 0;\n }\n}\n.${HIGHLIGHT_CLASSNAME} {\n background-color: rgba(238, 245, 40, 0.5);\n animation: flowide-fade 2s 1 forwards;\n -webkit-animation: flowide-fade 2s 1 forwards;\n}\n`;\n\nlet styleDom: HTMLStyleElement | undefined;\n\nexport function createHighlightStyle(): void {\n if (styleDom) return;\n styleDom = document.createElement('style');\n styleDom.innerHTML = styleText;\n document.head.appendChild(styleDom);\n}\n\nexport function removeHighlightStyle(): void {\n styleDom?.remove();\n styleDom = undefined;\n}\n","export const DEFAULT_HIGHLIGHT_COLOR = 'rgba(238, 245, 40, 0.5)';\nexport const DEFAULT_HIGHLIGHT_PADDING = 0;\n","import { useRef } from 'react';\n\nimport { FormModel } from '@flowgram.ai/form-core';\n\ninterface HighlightProps {\n form: FormModel;\n path: string;\n}\n\nexport function useHighlight(props: HighlightProps) {\n const ref = useRef<any>(null);\n const { form, path } = props;\n const formItem = form.getFormItemByPath(path);\n if (!formItem) {\n return null;\n }\n formItem.domRef = ref;\n return ref;\n}\n","import { injectable, inject } from 'inversify';\n\nimport { NodeFocusService } from './node-focus-service';\n\n@injectable()\nexport class NodeClient {\n @inject(NodeFocusService) nodeFocusService: NodeFocusService;\n}\n","import { definePluginCreator } from '@flowgram.ai/core';\n\nimport { createHighlightStyle, removeHighlightStyle } from './highlight-style';\n\nexport const createNodeHighlightPlugin = definePluginCreator<{}>({\n onInit() {\n createHighlightStyle();\n },\n onDispose() {\n removeHighlightStyle();\n },\n});\n","import { injectable, inject } from 'inversify';\nimport { type FormItem } from '@flowgram.ai/form-core';\nimport { FlowNodeEntity } from '@flowgram.ai/document';\nimport { Playground, PlaygroundConfigRevealOpts } from '@flowgram.ai/core';\n\nimport { FocusNodeFormItemOptions, NodeClient } from './node-client';\n\ninterface FocusNodeOptions {\n zoom?: PlaygroundConfigRevealOpts['zoom'];\n easing?: PlaygroundConfigRevealOpts['easing']; // 是否开启缓动,默认开启\n easingDuration?: PlaygroundConfigRevealOpts['easingDuration']; // 默认 500 ms\n scrollToCenter?: PlaygroundConfigRevealOpts['scrollToCenter']; // 是否滚动到中心\n}\n\n@injectable()\nexport class FlowEditorClient {\n @inject(NodeClient) readonly nodeClient: NodeClient;\n\n @inject(Playground) readonly playground: Playground;\n\n focusNodeFormItem(formItem: FormItem, options?: FocusNodeFormItemOptions) {\n this.nodeClient.nodeFocusService.focusNodeFormItem(formItem, options);\n }\n\n focusNode(node: FlowNodeEntity, options?: FocusNodeOptions) {\n this.playground.scrollToView({ entities: [node], ...options });\n }\n}\n","import React, { useMemo, useCallback } from 'react';\n\nimport { interfaces } from 'inversify';\nimport { FlowDocument } from '@flowgram.ai/document';\nimport {\n PlaygroundReactProvider,\n createPluginContextDefault,\n SelectionService,\n} from '@flowgram.ai/core';\n\nimport { EditorPluginContext, EditorProps, createDefaultPreset } from '../preset';\n\nexport const EditorProvider: React.FC<EditorProps> = (props: EditorProps) => {\n const { children, ...others } = props;\n const preset = useMemo(() => createDefaultPreset(others), []);\n const customPluginContext = useCallback(\n (container: interfaces.Container) =>\n ({\n ...createPluginContextDefault(container),\n get document(): FlowDocument {\n return container.get<FlowDocument>(FlowDocument);\n },\n get selection(): SelectionService {\n return container.get<SelectionService>(SelectionService);\n },\n } as EditorPluginContext),\n []\n );\n return (\n <PlaygroundReactProvider plugins={preset} customPluginContext={customPluginContext}>\n {children}\n </PlaygroundReactProvider>\n );\n};\n","export { PlaygroundReactRenderer as EditorRenderer } from '@flowgram.ai/core';\n","import React from 'react';\n\nimport { EditorProps } from '../preset';\nimport { EditorRenderer } from './editor-renderer';\nimport { EditorProvider } from './editor-provider';\n\n/**\n * 画布编辑器\n * @param props\n * @constructor\n */\nexport const Editor: React.FC<EditorProps> = (props: EditorProps) => {\n const { children, ...otherProps } = props;\n return (\n <EditorProvider {...otherProps}>\n <EditorRenderer>{children}</EditorRenderer>\n </EditorProvider>\n );\n};\n","import { useService } from '@flowgram.ai/core';\n\nimport { FlowEditorClient } from '../clients';\n\nexport function useFlowEditor(): FlowEditorClient {\n return useService(FlowEditorClient);\n}\n"],"mappings":"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","names":["import_form_core","EditorProps","node","import_document","import_core","import_core","import_core","import_inversify","import_core","import_inversify","import_core","ctx","import_react","import_document","import_core","React","import_core","import_react","React","import_core"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/preset/editor-props.ts","../src/constants.ts","../src/preset/editor-default-preset.ts","../src/utils/compose.ts","../src/clients/flow-editor-client-plugins.ts","../src/clients/node-client/create-node-client-plugins.ts","../src/clients/node-client/node-focus-service.ts","../src/clients/node-client/highlight/highlight-form-item.ts","../src/clients/node-client/highlight/highlight-style.ts","../src/clients/node-client/highlight/constants.ts","../src/clients/node-client/highlight/use-highlight.ts","../src/clients/node-client/node-client.ts","../src/clients/node-client/highlight/create-node-highlight-plugin.ts","../src/clients/flow-editor-client.ts","../src/components/editor-provider.tsx","../src/components/editor-renderer.tsx","../src/components/editor.tsx","../src/hooks/use-flow-editor.ts"],"sourcesContent":["import 'reflect-metadata';\nimport { FormModelV2 } from '@flowgram.ai/node';\n\n/* 核心 模块导出 */\nexport * from '@flowgram.ai/utils';\nexport * from '@flowgram.ai/core';\nexport * from '@flowgram.ai/document';\nexport * from '@flowgram.ai/renderer';\nexport * from '@flowgram.ai/variable-plugin';\nexport * from '@flowgram.ai/shortcuts-plugin';\nexport * from '@flowgram.ai/node-core-plugin';\nexport * from '@flowgram.ai/i18n-plugin';\nexport {\n type interfaces,\n injectable,\n postConstruct,\n named,\n Container,\n ContainerModule,\n AsyncContainerModule,\n inject,\n multiInject,\n} from 'inversify';\n\nexport { FlowNodeFormData, NodeRender, type NodeRenderProps } from '@flowgram.ai/form-core';\n\nexport type {\n FormState,\n FieldState,\n FieldArrayRenderProps,\n FieldRenderProps,\n FormRenderProps,\n Validate,\n FormControl,\n FieldName,\n FieldError,\n FieldWarning,\n IField,\n IFieldArray,\n IForm,\n Errors,\n Warnings,\n} from '@flowgram.ai/form';\n\nexport {\n Form,\n Field,\n FieldArray,\n useForm,\n useField,\n useCurrentField,\n useCurrentFieldState,\n useFieldValidate,\n useWatch,\n ValidateTrigger,\n} from '@flowgram.ai/form';\nexport * from '@flowgram.ai/node';\nexport { FormModelV2 as FormModel };\n\n/**\n * 固定布局模块导出\n */\nexport * from './preset';\nexport * from './components';\nexport * from './hooks';\nexport * from './clients';\n\n/**\n * Plugin 导出\n */\n\nexport * from '@flowgram.ai/node-variable-plugin';\n\nexport { createPlaygroundReactPreset } from '@flowgram.ai/playground-react';\n","import { VariablePluginOptions } from '@flowgram.ai/variable-plugin';\nimport { ReduxDevToolPluginOptions } from '@flowgram.ai/redux-devtool-plugin';\nimport { PlaygroundReactProps, SelectionService } from '@flowgram.ai/playground-react';\nimport { NodeCorePluginOptions } from '@flowgram.ai/node-core-plugin';\nimport { MaterialsPluginOptions } from '@flowgram.ai/materials-plugin';\nimport { I18nPluginOptions } from '@flowgram.ai/i18n-plugin';\nimport { HistoryPluginOptions } from '@flowgram.ai/history';\nimport { FlowNodeFormData, FormMetaOrFormMetaGenerator } from '@flowgram.ai/form-core';\nimport {\n FlowDocument,\n FlowDocumentJSON,\n FlowNodeEntity,\n type FlowNodeJSON,\n FlowNodeRegistry,\n FlowNodeType,\n FlowTransitionLabel,\n FlowTransitionLine,\n} from '@flowgram.ai/document';\nimport { PluginContext } from '@flowgram.ai/core';\n\nimport { EditorOptions } from '../constants';\n\nexport interface EditorPluginContext extends PluginContext {\n document: FlowDocument;\n selection: SelectionService;\n}\n\n/**\n * 固定布局配置\n */\nexport interface EditorProps<\n CTX extends EditorPluginContext = EditorPluginContext,\n JSON = FlowDocumentJSON\n> extends PlaygroundReactProps<CTX> {\n /**\n * 初始化数据\n */\n initialData?: JSON;\n /**\n * 是否为 readonly\n */\n readonly?: boolean;\n /**\n * 节点定义\n */\n nodeRegistries?: FlowNodeRegistry[];\n /**\n * 获取默认的节点配置\n */\n getNodeDefaultRegistry?: (type: FlowNodeType) => FlowNodeRegistry;\n /**\n * 节点引擎配置\n */\n nodeEngine?: NodeCorePluginOptions & {\n /**\n * 默认FormMeta\n */\n createDefaultFormMeta?: (node: FlowNodeEntity) => FormMetaOrFormMetaGenerator;\n /**\n * 开启\n */\n enable?: boolean;\n };\n /**\n * 默认是否展开所有节点\n */\n allNodesDefaultExpanded?: boolean;\n /**\n * 画布物料\n */\n materials?: MaterialsPluginOptions;\n /**\n * 画布数据加载完成, 请使用 onAllLayersRendered 替代\n * @deprecated\n * */\n onLoad?: (ctx: CTX) => void;\n /**\n * 是否开启变量引擎\n */\n variableEngine?: VariablePluginOptions;\n /**\n * 是否开启历史\n */\n history?: HistoryPluginOptions<CTX> & { disableShortcuts?: boolean };\n\n /**\n * redux 开发者工具配置\n */\n reduxDevTool?: ReduxDevToolPluginOptions;\n\n scroll?: {\n disableScrollLimit?: boolean; // 关闭滚动限制\n disableScrollBar?: boolean; // 关闭滚动条\n };\n\n /**\n * 节点转\n * @param node\n */\n toNodeJSON?(node: FlowNodeEntity): FlowNodeJSON;\n fromNodeJSON?(node: FlowNodeEntity, json: FlowNodeJSON): void;\n\n /**\n * 画布内部常量自定义\n */\n constants?: Record<string, any>;\n /**\n * 自定义节点线条\n */\n formatNodeLines?: (node: FlowNodeEntity, lines: FlowTransitionLine[]) => FlowTransitionLine[];\n /**\n * 自定义节点 label\n */\n formatNodeLabels?: (node: FlowNodeEntity, lines: FlowTransitionLabel[]) => FlowTransitionLabel[];\n /**\n * 国际化\n */\n i18n?: I18nPluginOptions;\n}\n\nexport namespace EditorProps {\n /**\n * 默认配置\n */\n export const DEFAULT: EditorProps = {\n background: {},\n fromNodeJSON(node: FlowNodeEntity, json: FlowNodeJSON) {\n const formData = node.getData(FlowNodeFormData)!;\n // 如果没有使用表单引擎,将 data 数据填入 extInfo\n if (!formData) {\n if (json.data) {\n node.updateExtInfo(json.data);\n }\n } else {\n const defaultFormMeta = node\n .getService<EditorProps>(EditorOptions)\n .nodeEngine?.createDefaultFormMeta?.(node);\n\n const formMeta = node.getNodeRegistry()?.formMeta || defaultFormMeta;\n\n if (formMeta) {\n formData.createForm(formMeta, json.data);\n }\n }\n },\n toNodeJSON(node: FlowNodeEntity): FlowNodeJSON {\n const nodesMap: Record<string, FlowNodeJSON> = {};\n let startNodeJSON: FlowNodeJSON;\n node.document.traverse((node) => {\n const isSystemNode = node.id.startsWith('$');\n if (isSystemNode) return;\n const formData = node.getData(FlowNodeFormData);\n let formJSON =\n formData && formData.formModel && formData.formModel.initialized\n ? formData.toJSON()\n : undefined;\n const nodeJSON = {\n id: node.id,\n type: node.flowNodeType,\n data: formData ? formJSON : node.getExtInfo(),\n blocks: [],\n };\n if (!startNodeJSON) startNodeJSON = nodeJSON;\n let { parent } = node;\n if (parent && parent.id.startsWith('$')) {\n parent = parent.originParent;\n }\n const parentJSON = parent ? nodesMap[parent.id] : undefined;\n if (parentJSON) {\n parentJSON.blocks?.push(nodeJSON);\n }\n nodesMap[node.id] = nodeJSON;\n }, node);\n return startNodeJSON!;\n },\n };\n}\n","export const EditorOptions = Symbol('EditorOptions');\n","import { interfaces } from 'inversify';\nimport { FlowRendererContainerModule, FlowRendererRegistry } from '@flowgram.ai/renderer';\nimport { createReduxDevToolPlugin } from '@flowgram.ai/redux-devtool-plugin';\nimport { createNodeVariablePlugin } from '@flowgram.ai/node-variable-plugin';\nimport { createNodeCorePlugin } from '@flowgram.ai/node-core-plugin';\nimport { createMaterialsPlugin } from '@flowgram.ai/materials-plugin';\nimport { createI18nPlugin } from '@flowgram.ai/i18n-plugin';\nimport { createHistoryNodePlugin } from '@flowgram.ai/history-node-plugin';\nimport { FlowDocumentContainerModule } from '@flowgram.ai/document';\nimport { createPlaygroundPlugin, Plugin, PluginsProvider } from '@flowgram.ai/core';\n\nimport { compose } from '../utils/compose';\nimport { EditorOptions } from '../constants';\nimport { createFlowEditorClientPlugins } from '../clients/flow-editor-client-plugins';\nimport { EditorPluginContext, EditorProps } from './editor-props';\n\nexport function createDefaultPreset<CTX extends EditorPluginContext = EditorPluginContext>(\n opts: EditorProps<CTX>,\n plugins: Plugin[] = []\n): PluginsProvider<CTX> {\n return (ctx: CTX) => {\n opts = { ...EditorProps.DEFAULT, ...opts };\n ctx.container.bind(EditorOptions).toConstantValue(opts);\n /**\n * i18n support\n */\n if (opts.i18n) {\n plugins.push(createI18nPlugin(opts.i18n));\n }\n /**\n * 默认注册顶层 flow editor client plugin\n */\n plugins.push(...createFlowEditorClientPlugins());\n\n /**\n * 注册 Redux 开发者工具\n */\n if (opts.reduxDevTool?.enable) {\n plugins.push(createReduxDevToolPlugin(opts.reduxDevTool));\n }\n\n /**\n * 注册画布模块\n */\n const defaultContainerModules: interfaces.ContainerModule[] = [\n FlowDocumentContainerModule, // 默认文档\n FlowRendererContainerModule, // 默认渲染\n ];\n /**\n * 注册物料\n */\n plugins.push(createMaterialsPlugin(opts.materials || {}));\n\n /**\n * 注册节点引擎\n */\n if (opts.nodeEngine && opts.nodeEngine.enable !== false) {\n plugins.push(createNodeCorePlugin({ materials: opts.nodeEngine.materials }));\n\n if (opts.variableEngine?.enable) {\n plugins.push(createNodeVariablePlugin({}));\n }\n\n if (opts.history?.enable) {\n plugins.push(createHistoryNodePlugin({}));\n }\n }\n /**\n * 画布生命周期注册\n */\n plugins.push(\n createPlaygroundPlugin<CTX>({\n onInit: (ctx) => {\n if (opts.nodeRegistries) {\n ctx.document.registerFlowNodes(...opts.nodeRegistries);\n }\n // 自定义画布内部常量\n if (opts.constants) {\n ctx.document.options.constants = opts.constants;\n }\n // 劫持节点线条\n if (opts.formatNodeLines) {\n ctx.document.options.formatNodeLines = compose([\n ctx.document.options.formatNodeLines,\n opts.formatNodeLines,\n ]);\n }\n // 劫持节点 label\n if (opts.formatNodeLabels) {\n ctx.document.options.formatNodeLabels = compose([\n ctx.document.options.formatNodeLabels,\n opts.formatNodeLabels,\n ]);\n }\n if (opts.getNodeDefaultRegistry) {\n ctx.document.options.getNodeDefaultRegistry = opts.getNodeDefaultRegistry;\n }\n // TODO\n // if (opts.onContentChange) {\n // ctx.document.onContentChange(event => opts.onContentChange!(ctx, event));\n // }\n // TODO 这个会触发组件注册,后续要废弃这个,通过 materials 插件来做\n ctx.get<FlowRendererRegistry>(FlowRendererRegistry).init();\n },\n onReady(ctx) {\n if (opts.initialData) {\n ctx.document.fromJSON(opts.initialData);\n }\n if (opts.readonly) {\n ctx.playground.config.readonly = opts.readonly;\n }\n ctx.document.load().then(() => {\n if (opts.onLoad) opts.onLoad(ctx);\n });\n },\n onDispose(ctx) {\n ctx.document.dispose();\n },\n containerModules: defaultContainerModules,\n })\n );\n\n return plugins;\n };\n}\n","import { FlowNodeEntity } from '@flowgram.ai/document';\n\nexport type ComposeListItem<T> = (node: FlowNodeEntity, data: T[]) => T[];\n\nexport const compose =\n <T>(fnList: (ComposeListItem<T> | undefined)[]) =>\n (node: FlowNodeEntity, data: T[]): T[] => {\n const list = fnList.filter(Boolean) as ComposeListItem<T>[];\n if (!list.length) {\n return data;\n }\n return list.reduce((acc: T[], fn) => fn(node, acc), data);\n };\n","import { definePluginCreator } from '@flowgram.ai/core';\n\nimport { createNodeClientPlugins } from './node-client/create-node-client-plugins';\nimport { FlowEditorClient } from './flow-editor-client';\n\nexport const createFlowEditorClientPlugin = definePluginCreator<{}>({\n onBind({ bind }) {\n bind(FlowEditorClient).toSelf().inSingletonScope();\n },\n});\n\nexport const createFlowEditorClientPlugins = () => [\n ...createNodeClientPlugins(),\n createFlowEditorClientPlugin({}),\n];\n","import { definePluginCreator } from '@flowgram.ai/core';\n\nimport { NodeFocusService } from './node-focus-service';\nimport { NodeClient } from './node-client';\nimport { createNodeHighlightPlugin } from './highlight/create-node-highlight-plugin';\n\nexport const createNodeClientPlugin = definePluginCreator<{}>({\n onBind({ bind }) {\n bind(NodeFocusService).toSelf().inSingletonScope();\n bind(NodeClient).toSelf().inSingletonScope();\n },\n});\n\nexport const createNodeClientPlugins = () => [\n createNodeHighlightPlugin({}),\n createNodeClientPlugin({}),\n];\n","import { injectable, inject } from 'inversify';\nimport { type FormItem } from '@flowgram.ai/form-core';\nimport { Playground, PlaygroundConfigRevealOpts } from '@flowgram.ai/core';\n\nimport { highlightFormItem, HighLightOptions } from './highlight';\n\nexport type FocusNodeCanvasOptions = PlaygroundConfigRevealOpts;\n\nexport interface FocusNodeFormItemOptions {\n canvas?: FocusNodeCanvasOptions;\n highlight?: boolean | HighLightOptions;\n}\n\n@injectable()\nexport class NodeFocusService {\n @inject(Playground) readonly playground: Playground;\n\n protected previousOverlay: HTMLDivElement | undefined;\n\n protected currentPromise: Promise<void> | undefined;\n\n highlightNodeFormItem(formItem: FormItem, options?: HighLightOptions) {\n this.previousOverlay = highlightFormItem(formItem, options);\n }\n\n focusNodeFormItem(formItem: FormItem, options?: FocusNodeFormItemOptions): Promise<void> {\n const node = formItem.formModel.flowNodeEntity;\n const { canvas = {}, highlight } = options || {};\n if (this.previousOverlay) {\n this.previousOverlay.remove();\n this.previousOverlay = undefined;\n }\n const currentPromise = this.playground\n .scrollToView({ entities: [node], scrollToCenter: true, ...canvas })\n .then(() => {\n if (!formItem || !highlight || this.currentPromise !== currentPromise) {\n return;\n }\n this.highlightNodeFormItem(formItem, typeof highlight === 'boolean' ? {} : highlight);\n });\n this.currentPromise = currentPromise;\n return this.currentPromise;\n }\n}\n","import { FormItem } from '@flowgram.ai/form-core';\nimport { FlowNodeRenderData } from '@flowgram.ai/document';\n\nimport { HIGHLIGHT_CLASSNAME } from './highlight-style';\nimport { DEFAULT_HIGHLIGHT_PADDING } from './constants';\n\nexport interface HighLightOptions {\n padding?: number;\n overlayClassName?: string;\n}\n\nexport function highlightFormItem(\n formItem: FormItem,\n options?: HighLightOptions,\n): HTMLDivElement | undefined {\n const parent =\n formItem.formModel.flowNodeEntity.getData<FlowNodeRenderData>(FlowNodeRenderData).node;\n const target = formItem.domRef.current;\n\n if (!target) {\n return undefined;\n }\n\n const overlay = document.createElement('div');\n\n const { padding = DEFAULT_HIGHLIGHT_PADDING, overlayClassName } = options || {};\n\n overlay.style.position = 'absolute';\n overlay.style.top = '0';\n overlay.style.left = '0';\n overlay.style.width = '100%';\n overlay.style.height = '100%';\n overlay.style.zIndex = '9999';\n\n parent.appendChild(overlay);\n\n const parentRect = parent.getBoundingClientRect();\n const targetRect = target.getBoundingClientRect();\n\n overlay.style.top = targetRect.top - parentRect.top - padding + 'px';\n overlay.style.left = targetRect.left - parentRect.left - padding + 'px';\n overlay.style.width = targetRect.width + padding * 2 + 'px';\n overlay.style.height = targetRect.height + padding * 2 + 'px';\n\n overlay.className = overlayClassName || HIGHLIGHT_CLASSNAME;\n setTimeout(() => {\n overlay.remove();\n }, 2000);\n return overlay;\n}\n","export const HIGHLIGHT_CLASSNAME = 'flowide-highlight';\n\nconst styleText = `\n@keyframes flowide-fade {\n from {\n opacity: 1.0;\n }\n to {\n opacity: 0;\n }\n}\n@-webkit-keyframes flowide-fade {\n from {\n opacity: 1.0;\n }\n to {\n opacity: 0;\n }\n}\n.${HIGHLIGHT_CLASSNAME} {\n background-color: rgba(238, 245, 40, 0.5);\n animation: flowide-fade 2s 1 forwards;\n -webkit-animation: flowide-fade 2s 1 forwards;\n}\n`;\n\nlet styleDom: HTMLStyleElement | undefined;\n\nexport function createHighlightStyle(): void {\n if (styleDom) return;\n styleDom = document.createElement('style');\n styleDom.innerHTML = styleText;\n document.head.appendChild(styleDom);\n}\n\nexport function removeHighlightStyle(): void {\n styleDom?.remove();\n styleDom = undefined;\n}\n","export const DEFAULT_HIGHLIGHT_COLOR = 'rgba(238, 245, 40, 0.5)';\nexport const DEFAULT_HIGHLIGHT_PADDING = 0;\n","import { useRef } from 'react';\n\nimport { FormModel } from '@flowgram.ai/form-core';\n\ninterface HighlightProps {\n form: FormModel;\n path: string;\n}\n\nexport function useHighlight(props: HighlightProps) {\n const ref = useRef<any>(null);\n const { form, path } = props;\n const formItem = form.getFormItemByPath(path);\n if (!formItem) {\n return null;\n }\n formItem.domRef = ref;\n return ref;\n}\n","import { injectable, inject } from 'inversify';\n\nimport { NodeFocusService } from './node-focus-service';\n\n@injectable()\nexport class NodeClient {\n @inject(NodeFocusService) nodeFocusService: NodeFocusService;\n}\n","import { definePluginCreator } from '@flowgram.ai/core';\n\nimport { createHighlightStyle, removeHighlightStyle } from './highlight-style';\n\nexport const createNodeHighlightPlugin = definePluginCreator<{}>({\n onInit() {\n createHighlightStyle();\n },\n onDispose() {\n removeHighlightStyle();\n },\n});\n","import { injectable, inject } from 'inversify';\nimport { type FormItem } from '@flowgram.ai/form-core';\nimport { FlowNodeEntity } from '@flowgram.ai/document';\nimport { Playground, PlaygroundConfigRevealOpts } from '@flowgram.ai/core';\n\nimport { FocusNodeFormItemOptions, NodeClient } from './node-client';\n\ninterface FocusNodeOptions {\n zoom?: PlaygroundConfigRevealOpts['zoom'];\n easing?: PlaygroundConfigRevealOpts['easing']; // 是否开启缓动,默认开启\n easingDuration?: PlaygroundConfigRevealOpts['easingDuration']; // 默认 500 ms\n scrollToCenter?: PlaygroundConfigRevealOpts['scrollToCenter']; // 是否滚动到中心\n}\n\n@injectable()\nexport class FlowEditorClient {\n @inject(NodeClient) readonly nodeClient: NodeClient;\n\n @inject(Playground) readonly playground: Playground;\n\n focusNodeFormItem(formItem: FormItem, options?: FocusNodeFormItemOptions) {\n this.nodeClient.nodeFocusService.focusNodeFormItem(formItem, options);\n }\n\n focusNode(node: FlowNodeEntity, options?: FocusNodeOptions) {\n this.playground.scrollToView({ entities: [node], ...options });\n }\n}\n","import React, { useMemo, useCallback } from 'react';\n\nimport { interfaces } from 'inversify';\nimport { FlowDocument } from '@flowgram.ai/document';\nimport {\n PlaygroundReactProvider,\n createPluginContextDefault,\n SelectionService,\n} from '@flowgram.ai/core';\n\nimport { EditorPluginContext, EditorProps, createDefaultPreset } from '../preset';\n\nexport const EditorProvider: React.FC<EditorProps> = (props: EditorProps) => {\n const { children, ...others } = props;\n const preset = useMemo(() => createDefaultPreset(others), []);\n const customPluginContext = useCallback(\n (container: interfaces.Container) =>\n ({\n ...createPluginContextDefault(container),\n get document(): FlowDocument {\n return container.get<FlowDocument>(FlowDocument);\n },\n get selection(): SelectionService {\n return container.get<SelectionService>(SelectionService);\n },\n } as EditorPluginContext),\n []\n );\n return (\n <PlaygroundReactProvider plugins={preset} customPluginContext={customPluginContext}>\n {children}\n </PlaygroundReactProvider>\n );\n};\n","export { PlaygroundReactRenderer as EditorRenderer } from '@flowgram.ai/core';\n","import React from 'react';\n\nimport { EditorProps } from '../preset';\nimport { EditorRenderer } from './editor-renderer';\nimport { EditorProvider } from './editor-provider';\n\n/**\n * 画布编辑器\n * @param props\n * @constructor\n */\nexport const Editor: React.FC<EditorProps> = (props: EditorProps) => {\n const { children, ...otherProps } = props;\n return (\n <EditorProvider {...otherProps}>\n <EditorRenderer>{children}</EditorRenderer>\n </EditorProvider>\n );\n};\n","import { useService } from '@flowgram.ai/core';\n\nimport { FlowEditorClient } from '../clients';\n\nexport function useFlowEditor(): FlowEditorClient {\n return useService(FlowEditorClient);\n}\n"],"mappings":"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","names":["import_inversify","import_form_core","EditorProps","node","import_document","import_core","import_core","import_core","import_inversify","import_core","import_inversify","import_core","ctx","import_react","import_document","import_core","React","import_core","import_react","React","import_core"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@flowgram.ai/editor",
3
- "version": "0.1.0-alpha.4",
3
+ "version": "0.1.0-alpha.6",
4
4
  "homepage": "https://flowgram.ai/",
5
5
  "repository": "https://github.com/bytedance/flowgram.ai",
6
6
  "license": "MIT",
@@ -18,25 +18,25 @@
18
18
  "dependencies": {
19
19
  "inversify": "^6.0.1",
20
20
  "reflect-metadata": "~0.2.2",
21
- "@flowgram.ai/background-plugin": "0.1.0-alpha.4",
22
- "@flowgram.ai/core": "0.1.0-alpha.4",
23
- "@flowgram.ai/form": "0.1.0-alpha.4",
24
- "@flowgram.ai/form-core": "0.1.0-alpha.4",
25
- "@flowgram.ai/document": "0.1.0-alpha.4",
26
- "@flowgram.ai/group-plugin": "0.1.0-alpha.4",
27
- "@flowgram.ai/history": "0.1.0-alpha.4",
28
- "@flowgram.ai/i18n-plugin": "0.1.0-alpha.4",
29
- "@flowgram.ai/materials-plugin": "0.1.0-alpha.4",
30
- "@flowgram.ai/history-node-plugin": "0.1.0-alpha.4",
31
- "@flowgram.ai/node": "0.1.0-alpha.4",
32
- "@flowgram.ai/node-core-plugin": "0.1.0-alpha.4",
33
- "@flowgram.ai/playground-react": "0.1.0-alpha.4",
34
- "@flowgram.ai/node-variable-plugin": "0.1.0-alpha.4",
35
- "@flowgram.ai/redux-devtool-plugin": "0.1.0-alpha.4",
36
- "@flowgram.ai/renderer": "0.1.0-alpha.4",
37
- "@flowgram.ai/shortcuts-plugin": "0.1.0-alpha.4",
38
- "@flowgram.ai/utils": "0.1.0-alpha.4",
39
- "@flowgram.ai/variable-plugin": "0.1.0-alpha.4"
21
+ "@flowgram.ai/background-plugin": "0.1.0-alpha.6",
22
+ "@flowgram.ai/core": "0.1.0-alpha.6",
23
+ "@flowgram.ai/document": "0.1.0-alpha.6",
24
+ "@flowgram.ai/form": "0.1.0-alpha.6",
25
+ "@flowgram.ai/group-plugin": "0.1.0-alpha.6",
26
+ "@flowgram.ai/form-core": "0.1.0-alpha.6",
27
+ "@flowgram.ai/history": "0.1.0-alpha.6",
28
+ "@flowgram.ai/history-node-plugin": "0.1.0-alpha.6",
29
+ "@flowgram.ai/i18n-plugin": "0.1.0-alpha.6",
30
+ "@flowgram.ai/materials-plugin": "0.1.0-alpha.6",
31
+ "@flowgram.ai/node": "0.1.0-alpha.6",
32
+ "@flowgram.ai/node-core-plugin": "0.1.0-alpha.6",
33
+ "@flowgram.ai/node-variable-plugin": "0.1.0-alpha.6",
34
+ "@flowgram.ai/playground-react": "0.1.0-alpha.6",
35
+ "@flowgram.ai/shortcuts-plugin": "0.1.0-alpha.6",
36
+ "@flowgram.ai/redux-devtool-plugin": "0.1.0-alpha.6",
37
+ "@flowgram.ai/utils": "0.1.0-alpha.6",
38
+ "@flowgram.ai/renderer": "0.1.0-alpha.6",
39
+ "@flowgram.ai/variable-plugin": "0.1.0-alpha.6"
40
40
  },
41
41
  "devDependencies": {
42
42
  "@types/bezier-js": "4.1.3",
@@ -50,8 +50,8 @@
50
50
  "tsup": "^8.0.1",
51
51
  "typescript": "^5.0.4",
52
52
  "vitest": "^0.34.6",
53
- "@flowgram.ai/eslint-config": "0.1.0-alpha.4",
54
- "@flowgram.ai/ts-config": "0.1.0-alpha.4"
53
+ "@flowgram.ai/eslint-config": "0.1.0-alpha.6",
54
+ "@flowgram.ai/ts-config": "0.1.0-alpha.6"
55
55
  },
56
56
  "peerDependencies": {
57
57
  "react": ">=17",