@flowgram.ai/group-plugin 1.0.2 → 1.0.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
@@ -166,7 +166,7 @@ var GroupBox = (props) => {
166
166
  const defaultBackgroundStyle = {
167
167
  borderRadius: 10,
168
168
  zIndex: -1,
169
- outline: `${hover ? 3 : 1}px solid rgb(97, 69, 211)`,
169
+ outline: `${hover ? 2 : 1}px solid rgb(97, 69, 211)`,
170
170
  backgroundColor: "rgb(236 233 247)"
171
171
  };
172
172
  const backgroundStyle = props.backgroundStyle ? props.backgroundStyle(groupController) : defaultBackgroundStyle;
@@ -276,6 +276,7 @@ var registerLayer = (ctx, opts) => {
276
276
  import { FlowDocument as FlowDocument3 } from "@flowgram.ai/document";
277
277
 
278
278
  // src/group-node-register.tsx
279
+ import React5 from "react";
279
280
  import { Point } from "@flowgram.ai/utils";
280
281
  import {
281
282
  FlowGroupController as FlowGroupController4,
@@ -315,6 +316,9 @@ var GroupRegister = {
315
316
  };
316
317
  }
317
318
  },
319
+ formMeta: {
320
+ render: () => React5.createElement("div")
321
+ },
318
322
  getLines(transition) {
319
323
  const { transform } = transition;
320
324
  const lines = [];
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/index.ts","../../src/groups-layer.tsx","../../src/constant.ts","../../src/components/group-render.tsx","../../src/components/group-box.tsx","../../src/components/hooks.ts","../../src/create-group-plugin.tsx","../../src/registers/register-render.tsx","../../src/registers/register-layer.ts","../../src/registers/register-group-node.ts","../../src/group-node-register.tsx","../../src/registers/register-clean-groups.ts","../../src/registers/index.ts"],"sourcesContent":["/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nexport { FlowGroupController } from '@flowgram.ai/document';\nexport * from './groups-layer';\nexport * from './create-group-plugin';\nexport * from './type';\nexport * from './constant';\nexport * from './group-node-register';\nexport * from './components';\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport React from 'react';\n\nimport { inject, injectable } from 'inversify';\nimport { FlowRendererRegistry } from '@flowgram.ai/renderer';\nimport {\n FlowDocument,\n FlowDocumentTransformerEntity,\n FlowGroupController,\n FlowGroupService,\n FlowNodeEntity,\n FlowNodeRenderData,\n FlowNodeTransformData,\n} from '@flowgram.ai/document';\nimport { Layer, observeEntity, observeEntityDatas } from '@flowgram.ai/core';\nimport { domUtils } from '@flowgram.ai/utils';\n\nimport { GroupsLayerOptions, IGroupBox } from './type';\nimport { GroupRenderer } from './constant';\nimport { GroupBox } from './components';\n\n@injectable()\nexport class GroupsLayer extends Layer<GroupsLayerOptions> {\n public readonly node: HTMLElement;\n\n @inject(FlowDocument) protected document: FlowDocument;\n\n @inject(FlowRendererRegistry)\n protected readonly rendererRegistry: FlowRendererRegistry;\n\n @inject(FlowGroupService)\n protected readonly groupService: FlowGroupService;\n\n @observeEntity(FlowDocumentTransformerEntity)\n readonly documentTransformer: FlowDocumentTransformerEntity;\n\n @observeEntityDatas(FlowNodeEntity, FlowNodeRenderData)\n renderStates: FlowNodeRenderData[];\n\n @observeEntityDatas(FlowNodeEntity, FlowNodeTransformData)\n transforms: FlowNodeTransformData[];\n\n private readonly className = 'gedit-groups-layer';\n\n constructor() {\n super();\n this.node = domUtils.createDivWithClass(this.className);\n this.node.style.zIndex = '0';\n }\n\n /** 缩放 */\n public onZoom(scale: number): void {\n this.node!.style.transform = `scale(${scale})`;\n }\n\n public render(): JSX.Element {\n if (this.documentTransformer.loading) return <></>;\n this.documentTransformer.refresh();\n\n return <>{this.renderGroups()}</>;\n }\n\n /** 渲染分组 */\n protected renderGroups(): JSX.Element {\n const Box = this.renderer || GroupBox;\n return (\n <>\n {this.groups.map(group => (\n <Box\n key={group.groupNode.id}\n groupNode={group.groupNode}\n backgroundStyle={this.options.groupBoxStyle}\n />\n ))}\n </>\n );\n }\n\n /** 所有分组 */\n protected get groups(): FlowGroupController[] {\n return this.groupService.getAllGroups();\n }\n\n protected get renderer(): IGroupBox {\n return this.rendererRegistry.tryToGetRendererComponent(GroupRenderer.GroupBox)\n ?.renderer as IGroupBox;\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nexport enum GroupRenderer {\n GroupRender = 'group_render',\n GroupBox = 'group_box',\n}\n\nexport const PositionConfig = {\n paddingWithNote: 50, // note 留白大小\n padding: 10, // 无 label 的 padding\n paddingWithAddLabel: 20, // 有 label 的padding,如要放添加按钮\n headerHeight: 20, // 基础头部高度\n};\n\nexport enum GroupPluginRegister {\n GroupNode = 'registerGroupNode',\n Render = 'registerRender',\n Layer = 'registerLayer',\n CleanGroups = 'registerCleanGroups',\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\n/* eslint-disable react/prop-types */\nimport React, { useCallback, useEffect, useState } from 'react';\n\nimport { FlowGroupController, FlowNodeEntity, FlowNodeRenderData } from '@flowgram.ai/document';\nimport { FlowDocument } from '@flowgram.ai/document';\nimport { useEntityFromContext, useService } from '@flowgram.ai/core';\nimport { delay, Rectangle } from '@flowgram.ai/utils';\n\nimport { IGroupRender } from '../type';\n\nfunction useCurrentDomNode(): HTMLDivElement {\n const entity = useEntityFromContext<FlowNodeEntity>();\n const renderData = entity.getData<FlowNodeRenderData>(FlowNodeRenderData);\n return renderData.node;\n}\n\nexport const GroupRender: IGroupRender = props => {\n const { groupNode, GroupNode, GroupBoxHeader } = props;\n const container = useCurrentDomNode();\n const document = useService<FlowDocument>(FlowDocument);\n const groupController = FlowGroupController.create(groupNode);\n\n const [key, setKey] = useState(0);\n const [rendering, setRendering] = useState(true);\n const [collapsedCache, setCollapsedCache] = useState(groupController?.collapsed ?? false);\n\n const rerender = useCallback(async () => {\n setRendering(true);\n setKey(key + 1);\n // 边框bounds计算会有延迟\n await delay(50);\n setKey(key + 1);\n setRendering(false);\n }, [key]);\n\n // 监听 collapsed 变化触发重渲染\n useEffect(() => {\n const disposer = document.renderTree.onTreeChange(() => {\n if (groupController?.collapsed !== collapsedCache) {\n setCollapsedCache(groupController?.collapsed ?? false);\n rerender();\n }\n });\n return () => {\n disposer.dispose();\n };\n }, [key]);\n\n // 首次渲染时如果分组是展开状态,此时边框bounds计算会有延迟,需要强制重新渲染\n useEffect(() => {\n if (!groupController || groupController.collapsed) {\n return;\n }\n rerender();\n }, []);\n\n if (!groupController) {\n return <></>;\n }\n\n const groupNodeRender = (\n <GroupNode key={key} groupNode={groupNode} groupController={groupController} />\n );\n const groupBoxHeader = (\n <GroupBoxHeader key={key} groupController={groupController} groupNode={groupNode} />\n );\n\n if (groupController.collapsed) {\n const positionStyle: Partial<CSSStyleDeclaration> = {\n display: 'block',\n zIndex: '0',\n width: 'auto',\n height: 'auto',\n };\n Object.assign(container.style, positionStyle);\n return groupNodeRender;\n } else if (!rendering) {\n const bounds: Rectangle = groupController.bounds;\n const positionStyle: Partial<CSSStyleDeclaration> = {\n width: `${bounds.width}px`,\n };\n Object.assign(container.style, positionStyle);\n return groupBoxHeader;\n } else {\n return <></>;\n }\n};\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\n/* eslint-disable react/prop-types */\nimport { useEffect, type CSSProperties } from 'react';\nimport React from 'react';\n\nimport { FlowGroupController } from '@flowgram.ai/document';\nimport type { Rectangle } from '@flowgram.ai/utils';\n\nimport { IGroupBox } from '../type';\nimport { useHover } from './hooks';\n\nexport const GroupBox: IGroupBox = props => {\n const { groupNode } = props;\n const groupController = FlowGroupController.create(groupNode)!;\n const bounds: Rectangle = groupController.bounds;\n const { hover, ref } = useHover();\n\n const positionStyle: CSSProperties = {\n position: 'absolute',\n left: bounds.left,\n top: bounds.top,\n width: bounds.width,\n height: bounds.height,\n };\n\n const defaultBackgroundStyle: CSSProperties = {\n borderRadius: 10,\n zIndex: -1,\n outline: `${hover ? 3 : 1}px solid rgb(97, 69, 211)`,\n backgroundColor: 'rgb(236 233 247)',\n };\n\n const backgroundStyle = props.backgroundStyle\n ? props.backgroundStyle(groupController)\n : defaultBackgroundStyle;\n\n useEffect(() => {\n groupController.hovered = hover;\n }, [hover]);\n\n if (!groupController || groupController.collapsed) {\n return <></>;\n }\n\n return (\n <div className=\"gedit-group-box\" data-group-id={groupNode.id}>\n <div\n className=\"gedit-group-background\"\n ref={ref}\n style={{\n ...positionStyle,\n ...backgroundStyle,\n }}\n />\n </div>\n );\n};\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { useEffect, useRef, useState } from 'react';\n\nexport const useHover = () => {\n const ref = useRef<HTMLDivElement>(null);\n const [hover, setHover] = useState(false);\n\n const checkMouseOver = (event: MouseEvent) => {\n if (!ref.current) {\n return;\n }\n const { left, top, right, bottom } = ref.current.getBoundingClientRect();\n const isOver =\n event.clientX >= left &&\n event.clientX <= right &&\n event.clientY >= top &&\n event.clientY <= bottom;\n\n setHover(isOver);\n };\n\n useEffect(() => {\n window.addEventListener('mousemove', checkMouseOver);\n\n return () => {\n window.removeEventListener('mousemove', checkMouseOver);\n };\n }, []);\n\n return {\n hover,\n ref,\n };\n};\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { definePluginCreator, PluginContext } from '@flowgram.ai/core';\n\nimport { CreateGroupPluginOptions } from './type';\nimport { groupRegisters } from './registers';\nimport { GroupPluginRegister } from './constant';\n\n/**\n * 分组插件\n */\nexport const createGroupPlugin = definePluginCreator<CreateGroupPluginOptions>({\n onInit: (ctx: PluginContext, opts: CreateGroupPluginOptions) => {\n const { registers: registerConfs = {} } = opts;\n Object.entries(groupRegisters).forEach(([key, register]) => {\n const registerName = key as GroupPluginRegister;\n const registerConf = registerConfs[registerName];\n if (registerConf === false) {\n return;\n }\n if (typeof registerConf === 'function') {\n registerConf(ctx, opts);\n return;\n }\n register(ctx, opts);\n });\n },\n});\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport React, { FC } from 'react';\n\nimport { FlowRendererRegistry } from '@flowgram.ai/renderer';\nimport { FlowNodeEntity } from '@flowgram.ai/document';\n\nimport { IGroupPluginRegister } from '../type';\nimport { GroupRenderer } from '../constant';\nimport { GroupRender } from '../components';\n\n/** 注册渲染组件 */\nexport const registerRender: IGroupPluginRegister = (ctx, opts) => {\n const rendererRegistry = ctx.get<FlowRendererRegistry>(FlowRendererRegistry);\n const renderer: FC<{ node: FlowNodeEntity }> = props => (\n <GroupRender\n groupNode={props.node}\n GroupNode={opts.components!.GroupNode}\n GroupBoxHeader={opts.components!.GroupBoxHeader}\n />\n );\n rendererRegistry.registerReactComponent(GroupRenderer.GroupRender, renderer);\n};\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { IGroupPluginRegister } from '../type';\nimport { GroupsLayer } from '../groups-layer';\n\n/** 注册背景层 */\nexport const registerLayer: IGroupPluginRegister = (ctx, opts) => {\n ctx.playground.registerLayer(GroupsLayer, opts);\n};\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { FlowDocument } from '@flowgram.ai/document';\n\nimport { IGroupPluginRegister } from '../type';\nimport { GroupRegister } from '../group-node-register';\n\n/** 注册分组节点 */\nexport const registerGroupNode: IGroupPluginRegister = ctx => {\n const document = ctx.get<FlowDocument>(FlowDocument);\n document.registerFlowNodes(GroupRegister);\n};\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { IPoint, PaddingSchema, Point } from '@flowgram.ai/utils';\nimport {\n FlowGroupController,\n FlowNodeBaseType,\n FlowNodeRegistry,\n FlowNodeTransformData,\n FlowTransitionLabelEnum,\n type FlowTransitionLine,\n FlowTransitionLineEnum,\n} from '@flowgram.ai/document';\n\nimport { GroupRenderer, PositionConfig } from './constant';\n\nexport const GroupRegister: FlowNodeRegistry = {\n type: FlowNodeBaseType.GROUP,\n meta: {\n exportJSON: true,\n renderKey: GroupRenderer.GroupRender,\n positionConfig: PositionConfig,\n padding: (transform: FlowNodeTransformData): PaddingSchema => {\n const groupController = FlowGroupController.create(transform.entity);\n if (!groupController || groupController.collapsed || groupController.nodes.length === 0) {\n return {\n top: 0,\n bottom: 0,\n left: 0,\n right: 0,\n };\n }\n if (transform.entity.isVertical) {\n return {\n top: PositionConfig.paddingWithNote,\n bottom: PositionConfig.paddingWithAddLabel,\n left: PositionConfig.padding,\n right: PositionConfig.padding,\n };\n }\n return {\n top: PositionConfig.paddingWithNote,\n bottom: PositionConfig.padding,\n left: PositionConfig.padding,\n right: PositionConfig.paddingWithAddLabel,\n };\n },\n },\n getLines(transition) {\n const { transform } = transition;\n const lines: FlowTransitionLine[] = [];\n if (transform.firstChild) {\n lines.push({\n type: FlowTransitionLineEnum.STRAIGHT_LINE,\n from: transform.inputPoint,\n to: transform.firstChild.inputPoint,\n });\n }\n if (transform.next) {\n lines.push({\n type: FlowTransitionLineEnum.STRAIGHT_LINE,\n from: transform.outputPoint,\n to: transform.next.inputPoint,\n });\n } else {\n lines.push({\n type: FlowTransitionLineEnum.STRAIGHT_LINE,\n from: transform.outputPoint,\n to: transform.parent!.outputPoint,\n });\n }\n return lines;\n },\n getDelta(transform: FlowNodeTransformData): IPoint | undefined {\n const groupController = FlowGroupController.create(transform.entity);\n if (!groupController || groupController.collapsed) {\n return;\n }\n if (transform.entity.isVertical) {\n return {\n x: 0,\n y: PositionConfig.paddingWithNote,\n };\n }\n return {\n x: PositionConfig.padding,\n y: 0,\n };\n },\n getInputPoint(transform: FlowNodeTransformData): IPoint {\n const child = transform.firstChild;\n if (!child) return transform.defaultInputPoint;\n if (transform.entity.isVertical) {\n return {\n x: child.inputPoint.x,\n y: transform.bounds.topCenter.y,\n };\n }\n return {\n x: transform.bounds.leftCenter.x,\n y: child.inputPoint.y,\n };\n },\n getOutputPoint(transform: FlowNodeTransformData): IPoint {\n const child = transform.lastChild;\n if (!child) return transform.defaultOutputPoint;\n if (transform.entity.isVertical) {\n return {\n x: child.outputPoint.x,\n y: child.outputPoint.y + PositionConfig.paddingWithAddLabel / 2,\n };\n }\n return {\n x: child.outputPoint.x + PositionConfig.paddingWithAddLabel / 2,\n y: child.outputPoint.y,\n };\n },\n getLabels(transition) {\n const { transform } = transition;\n if (transform.next) {\n if (transform.entity.isVertical) {\n return [\n {\n offset: Point.getMiddlePoint(\n Point.move(transform.outputPoint, {\n x: 0,\n y: PositionConfig.paddingWithAddLabel / 2,\n }),\n transform.next.inputPoint\n ),\n type: FlowTransitionLabelEnum.ADDER_LABEL,\n },\n ];\n }\n return [\n {\n offset: Point.getMiddlePoint(\n Point.move(transform.outputPoint, { x: PositionConfig.paddingWithAddLabel / 2, y: 0 }),\n transform.next.inputPoint\n ),\n type: FlowTransitionLabelEnum.ADDER_LABEL,\n },\n ];\n }\n return [\n {\n offset: transform.parent!.outputPoint,\n type: FlowTransitionLabelEnum.ADDER_LABEL,\n },\n ];\n },\n getOriginDeltaY(transform): number {\n const { children } = transform;\n if (children.length === 0) {\n return -transform.size.height * transform.origin.y;\n }\n // 这里要加上 y 轴的偏移\n return -transform.size.height * transform.origin.y - PositionConfig.paddingWithNote;\n },\n};\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { FlowDocument } from '@flowgram.ai/document';\nimport { FlowGroupService } from '@flowgram.ai/document';\n\nimport { IGroupPluginRegister } from '../type';\n\n/** 注册清理分组逻辑 */\nexport const registerCleanGroups: IGroupPluginRegister = (ctx, opts) => {\n const groupService = ctx.get<FlowGroupService>(FlowGroupService);\n const document = ctx.get<FlowDocument>(FlowDocument);\n\n const clearInvalidGroups = () => {\n groupService.getAllGroups().forEach(group => {\n if (group?.nodes.length !== 0) {\n return;\n }\n if (!group.groupNode.pre) {\n return;\n }\n groupService.deleteGroup(group.groupNode);\n });\n };\n\n document.originTree.onTreeChange(() => {\n setTimeout(() => {\n clearInvalidGroups();\n }, 0);\n });\n};\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { IGroupPluginRegister } from '../type';\nimport { GroupPluginRegister } from '../constant';\nimport { registerRender } from './register-render';\nimport { registerLayer } from './register-layer';\nimport { registerGroupNode } from './register-group-node';\nimport { registerCleanGroups } from './register-clean-groups';\n\nexport const groupRegisters: Record<GroupPluginRegister, IGroupPluginRegister> = {\n [GroupPluginRegister.GroupNode]: registerGroupNode,\n [GroupPluginRegister.Render]: registerRender,\n [GroupPluginRegister.Layer]: registerLayer,\n [GroupPluginRegister.CleanGroups]: registerCleanGroups,\n};\n"],"mappings":"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","names":["FlowGroupController","React","FlowDocument","FlowNodeEntity","FlowNodeRenderData","GroupRenderer","GroupPluginRegister","useEffect","React","FlowGroupController","useEffect","useState","FlowGroupController","useEffect","React","React","FlowDocument","FlowNodeEntity","FlowNodeRenderData","React","FlowRendererRegistry","FlowRendererRegistry","React","FlowDocument","FlowGroupController","FlowGroupController","FlowDocument","FlowDocument","FlowGroupService"]}
1
+ {"version":3,"sources":["../../src/index.ts","../../src/groups-layer.tsx","../../src/constant.ts","../../src/components/group-render.tsx","../../src/components/group-box.tsx","../../src/components/hooks.ts","../../src/create-group-plugin.tsx","../../src/registers/register-render.tsx","../../src/registers/register-layer.ts","../../src/registers/register-group-node.ts","../../src/group-node-register.tsx","../../src/registers/register-clean-groups.ts","../../src/registers/index.ts"],"sourcesContent":["/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nexport { FlowGroupController } from '@flowgram.ai/document';\nexport * from './groups-layer';\nexport * from './create-group-plugin';\nexport * from './type';\nexport * from './constant';\nexport * from './group-node-register';\nexport * from './components';\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport React from 'react';\n\nimport { inject, injectable } from 'inversify';\nimport { FlowRendererRegistry } from '@flowgram.ai/renderer';\nimport {\n FlowDocument,\n FlowDocumentTransformerEntity,\n FlowGroupController,\n FlowGroupService,\n FlowNodeEntity,\n FlowNodeRenderData,\n FlowNodeTransformData,\n} from '@flowgram.ai/document';\nimport { Layer, observeEntity, observeEntityDatas } from '@flowgram.ai/core';\nimport { domUtils } from '@flowgram.ai/utils';\n\nimport { GroupsLayerOptions, IGroupBox } from './type';\nimport { GroupRenderer } from './constant';\nimport { GroupBox } from './components';\n\n@injectable()\nexport class GroupsLayer extends Layer<GroupsLayerOptions> {\n public readonly node: HTMLElement;\n\n @inject(FlowDocument) protected document: FlowDocument;\n\n @inject(FlowRendererRegistry)\n protected readonly rendererRegistry: FlowRendererRegistry;\n\n @inject(FlowGroupService)\n protected readonly groupService: FlowGroupService;\n\n @observeEntity(FlowDocumentTransformerEntity)\n readonly documentTransformer: FlowDocumentTransformerEntity;\n\n @observeEntityDatas(FlowNodeEntity, FlowNodeRenderData)\n renderStates: FlowNodeRenderData[];\n\n @observeEntityDatas(FlowNodeEntity, FlowNodeTransformData)\n transforms: FlowNodeTransformData[];\n\n private readonly className = 'gedit-groups-layer';\n\n constructor() {\n super();\n this.node = domUtils.createDivWithClass(this.className);\n this.node.style.zIndex = '0';\n }\n\n /** 缩放 */\n public onZoom(scale: number): void {\n this.node!.style.transform = `scale(${scale})`;\n }\n\n public render(): JSX.Element {\n if (this.documentTransformer.loading) return <></>;\n this.documentTransformer.refresh();\n\n return <>{this.renderGroups()}</>;\n }\n\n /** 渲染分组 */\n protected renderGroups(): JSX.Element {\n const Box = this.renderer || GroupBox;\n return (\n <>\n {this.groups.map(group => (\n <Box\n key={group.groupNode.id}\n groupNode={group.groupNode}\n backgroundStyle={this.options.groupBoxStyle}\n />\n ))}\n </>\n );\n }\n\n /** 所有分组 */\n protected get groups(): FlowGroupController[] {\n return this.groupService.getAllGroups();\n }\n\n protected get renderer(): IGroupBox {\n return this.rendererRegistry.tryToGetRendererComponent(GroupRenderer.GroupBox)\n ?.renderer as IGroupBox;\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nexport enum GroupRenderer {\n GroupRender = 'group_render',\n GroupBox = 'group_box',\n}\n\nexport const PositionConfig = {\n paddingWithNote: 50, // note 留白大小\n padding: 10, // 无 label 的 padding\n paddingWithAddLabel: 20, // 有 label 的padding,如要放添加按钮\n headerHeight: 20, // 基础头部高度\n};\n\nexport enum GroupPluginRegister {\n GroupNode = 'registerGroupNode',\n Render = 'registerRender',\n Layer = 'registerLayer',\n CleanGroups = 'registerCleanGroups',\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\n/* eslint-disable react/prop-types */\nimport React, { useCallback, useEffect, useState } from 'react';\n\nimport { FlowGroupController, FlowNodeEntity, FlowNodeRenderData } from '@flowgram.ai/document';\nimport { FlowDocument } from '@flowgram.ai/document';\nimport { useEntityFromContext, useService } from '@flowgram.ai/core';\nimport { delay, Rectangle } from '@flowgram.ai/utils';\n\nimport { IGroupRender } from '../type';\n\nfunction useCurrentDomNode(): HTMLDivElement {\n const entity = useEntityFromContext<FlowNodeEntity>();\n const renderData = entity.getData<FlowNodeRenderData>(FlowNodeRenderData);\n return renderData.node;\n}\n\nexport const GroupRender: IGroupRender = props => {\n const { groupNode, GroupNode, GroupBoxHeader } = props;\n const container = useCurrentDomNode();\n const document = useService<FlowDocument>(FlowDocument);\n const groupController = FlowGroupController.create(groupNode);\n\n const [key, setKey] = useState(0);\n const [rendering, setRendering] = useState(true);\n const [collapsedCache, setCollapsedCache] = useState(groupController?.collapsed ?? false);\n\n const rerender = useCallback(async () => {\n setRendering(true);\n setKey(key + 1);\n // 边框bounds计算会有延迟\n await delay(50);\n setKey(key + 1);\n setRendering(false);\n }, [key]);\n\n // 监听 collapsed 变化触发重渲染\n useEffect(() => {\n const disposer = document.renderTree.onTreeChange(() => {\n if (groupController?.collapsed !== collapsedCache) {\n setCollapsedCache(groupController?.collapsed ?? false);\n rerender();\n }\n });\n return () => {\n disposer.dispose();\n };\n }, [key]);\n\n // 首次渲染时如果分组是展开状态,此时边框bounds计算会有延迟,需要强制重新渲染\n useEffect(() => {\n if (!groupController || groupController.collapsed) {\n return;\n }\n rerender();\n }, []);\n\n if (!groupController) {\n return <></>;\n }\n\n const groupNodeRender = (\n <GroupNode key={key} groupNode={groupNode} groupController={groupController} />\n );\n const groupBoxHeader = (\n <GroupBoxHeader key={key} groupController={groupController} groupNode={groupNode} />\n );\n\n if (groupController.collapsed) {\n const positionStyle: Partial<CSSStyleDeclaration> = {\n display: 'block',\n zIndex: '0',\n width: 'auto',\n height: 'auto',\n };\n Object.assign(container.style, positionStyle);\n return groupNodeRender;\n } else if (!rendering) {\n const bounds: Rectangle = groupController.bounds;\n const positionStyle: Partial<CSSStyleDeclaration> = {\n width: `${bounds.width}px`,\n };\n Object.assign(container.style, positionStyle);\n return groupBoxHeader;\n } else {\n return <></>;\n }\n};\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\n/* eslint-disable react/prop-types */\nimport { useEffect, type CSSProperties } from 'react';\nimport React from 'react';\n\nimport type { Rectangle } from '@flowgram.ai/utils';\nimport { FlowGroupController } from '@flowgram.ai/document';\n\nimport { IGroupBox } from '../type';\nimport { useHover } from './hooks';\n\nexport const GroupBox: IGroupBox = (props) => {\n const { groupNode } = props;\n const groupController = FlowGroupController.create(groupNode)!;\n const bounds: Rectangle = groupController.bounds;\n const { hover, ref } = useHover();\n\n const positionStyle: CSSProperties = {\n position: 'absolute',\n left: bounds.left,\n top: bounds.top,\n width: bounds.width,\n height: bounds.height,\n };\n\n const defaultBackgroundStyle: CSSProperties = {\n borderRadius: 10,\n zIndex: -1,\n outline: `${hover ? 2 : 1}px solid rgb(97, 69, 211)`,\n backgroundColor: 'rgb(236 233 247)',\n };\n\n const backgroundStyle = props.backgroundStyle\n ? props.backgroundStyle(groupController)\n : defaultBackgroundStyle;\n\n useEffect(() => {\n groupController.hovered = hover;\n }, [hover]);\n\n if (!groupController || groupController.collapsed) {\n return <></>;\n }\n\n return (\n <div className=\"gedit-group-box\" data-group-id={groupNode.id}>\n <div\n className=\"gedit-group-background\"\n ref={ref}\n style={{\n ...positionStyle,\n ...backgroundStyle,\n }}\n />\n </div>\n );\n};\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { useEffect, useRef, useState } from 'react';\n\nexport const useHover = () => {\n const ref = useRef<HTMLDivElement>(null);\n const [hover, setHover] = useState(false);\n\n const checkMouseOver = (event: MouseEvent) => {\n if (!ref.current) {\n return;\n }\n const { left, top, right, bottom } = ref.current.getBoundingClientRect();\n const isOver =\n event.clientX >= left &&\n event.clientX <= right &&\n event.clientY >= top &&\n event.clientY <= bottom;\n\n setHover(isOver);\n };\n\n useEffect(() => {\n window.addEventListener('mousemove', checkMouseOver);\n\n return () => {\n window.removeEventListener('mousemove', checkMouseOver);\n };\n }, []);\n\n return {\n hover,\n ref,\n };\n};\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { definePluginCreator, PluginContext } from '@flowgram.ai/core';\n\nimport { CreateGroupPluginOptions } from './type';\nimport { groupRegisters } from './registers';\nimport { GroupPluginRegister } from './constant';\n\n/**\n * 分组插件\n */\nexport const createGroupPlugin = definePluginCreator<CreateGroupPluginOptions>({\n onInit: (ctx: PluginContext, opts: CreateGroupPluginOptions) => {\n const { registers: registerConfs = {} } = opts;\n Object.entries(groupRegisters).forEach(([key, register]) => {\n const registerName = key as GroupPluginRegister;\n const registerConf = registerConfs[registerName];\n if (registerConf === false) {\n return;\n }\n if (typeof registerConf === 'function') {\n registerConf(ctx, opts);\n return;\n }\n register(ctx, opts);\n });\n },\n});\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport React, { FC } from 'react';\n\nimport { FlowRendererRegistry } from '@flowgram.ai/renderer';\nimport { FlowNodeEntity } from '@flowgram.ai/document';\n\nimport { IGroupPluginRegister } from '../type';\nimport { GroupRenderer } from '../constant';\nimport { GroupRender } from '../components';\n\n/** 注册渲染组件 */\nexport const registerRender: IGroupPluginRegister = (ctx, opts) => {\n const rendererRegistry = ctx.get<FlowRendererRegistry>(FlowRendererRegistry);\n const renderer: FC<{ node: FlowNodeEntity }> = props => (\n <GroupRender\n groupNode={props.node}\n GroupNode={opts.components!.GroupNode}\n GroupBoxHeader={opts.components!.GroupBoxHeader}\n />\n );\n rendererRegistry.registerReactComponent(GroupRenderer.GroupRender, renderer);\n};\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { IGroupPluginRegister } from '../type';\nimport { GroupsLayer } from '../groups-layer';\n\n/** 注册背景层 */\nexport const registerLayer: IGroupPluginRegister = (ctx, opts) => {\n ctx.playground.registerLayer(GroupsLayer, opts);\n};\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { FlowDocument } from '@flowgram.ai/document';\n\nimport { IGroupPluginRegister } from '../type';\nimport { GroupRegister } from '../group-node-register';\n\n/** 注册分组节点 */\nexport const registerGroupNode: IGroupPluginRegister = ctx => {\n const document = ctx.get<FlowDocument>(FlowDocument);\n document.registerFlowNodes(GroupRegister);\n};\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport React from 'react';\n\nimport { IPoint, PaddingSchema, Point } from '@flowgram.ai/utils';\nimport {\n FlowGroupController,\n FlowNodeBaseType,\n FlowNodeRegistry,\n FlowNodeTransformData,\n FlowTransitionLabelEnum,\n type FlowTransitionLine,\n FlowTransitionLineEnum,\n} from '@flowgram.ai/document';\n\nimport { GroupRenderer, PositionConfig } from './constant';\n\nexport const GroupRegister: FlowNodeRegistry = {\n type: FlowNodeBaseType.GROUP,\n meta: {\n exportJSON: true,\n renderKey: GroupRenderer.GroupRender,\n positionConfig: PositionConfig,\n padding: (transform: FlowNodeTransformData): PaddingSchema => {\n const groupController = FlowGroupController.create(transform.entity);\n if (!groupController || groupController.collapsed || groupController.nodes.length === 0) {\n return {\n top: 0,\n bottom: 0,\n left: 0,\n right: 0,\n };\n }\n if (transform.entity.isVertical) {\n return {\n top: PositionConfig.paddingWithNote,\n bottom: PositionConfig.paddingWithAddLabel,\n left: PositionConfig.padding,\n right: PositionConfig.padding,\n };\n }\n return {\n top: PositionConfig.paddingWithNote,\n bottom: PositionConfig.padding,\n left: PositionConfig.padding,\n right: PositionConfig.paddingWithAddLabel,\n };\n },\n },\n formMeta: {\n render: () => React.createElement('div'),\n },\n getLines(transition) {\n const { transform } = transition;\n const lines: FlowTransitionLine[] = [];\n if (transform.firstChild) {\n lines.push({\n type: FlowTransitionLineEnum.STRAIGHT_LINE,\n from: transform.inputPoint,\n to: transform.firstChild.inputPoint,\n });\n }\n if (transform.next) {\n lines.push({\n type: FlowTransitionLineEnum.STRAIGHT_LINE,\n from: transform.outputPoint,\n to: transform.next.inputPoint,\n });\n } else {\n lines.push({\n type: FlowTransitionLineEnum.STRAIGHT_LINE,\n from: transform.outputPoint,\n to: transform.parent!.outputPoint,\n });\n }\n return lines;\n },\n getDelta(transform: FlowNodeTransformData): IPoint | undefined {\n const groupController = FlowGroupController.create(transform.entity);\n if (!groupController || groupController.collapsed) {\n return;\n }\n if (transform.entity.isVertical) {\n return {\n x: 0,\n y: PositionConfig.paddingWithNote,\n };\n }\n return {\n x: PositionConfig.padding,\n y: 0,\n };\n },\n getInputPoint(transform: FlowNodeTransformData): IPoint {\n const child = transform.firstChild;\n if (!child) return transform.defaultInputPoint;\n if (transform.entity.isVertical) {\n return {\n x: child.inputPoint.x,\n y: transform.bounds.topCenter.y,\n };\n }\n return {\n x: transform.bounds.leftCenter.x,\n y: child.inputPoint.y,\n };\n },\n getOutputPoint(transform: FlowNodeTransformData): IPoint {\n const child = transform.lastChild;\n if (!child) return transform.defaultOutputPoint;\n if (transform.entity.isVertical) {\n return {\n x: child.outputPoint.x,\n y: child.outputPoint.y + PositionConfig.paddingWithAddLabel / 2,\n };\n }\n return {\n x: child.outputPoint.x + PositionConfig.paddingWithAddLabel / 2,\n y: child.outputPoint.y,\n };\n },\n getLabels(transition) {\n const { transform } = transition;\n if (transform.next) {\n if (transform.entity.isVertical) {\n return [\n {\n offset: Point.getMiddlePoint(\n Point.move(transform.outputPoint, {\n x: 0,\n y: PositionConfig.paddingWithAddLabel / 2,\n }),\n transform.next.inputPoint\n ),\n type: FlowTransitionLabelEnum.ADDER_LABEL,\n },\n ];\n }\n return [\n {\n offset: Point.getMiddlePoint(\n Point.move(transform.outputPoint, { x: PositionConfig.paddingWithAddLabel / 2, y: 0 }),\n transform.next.inputPoint\n ),\n type: FlowTransitionLabelEnum.ADDER_LABEL,\n },\n ];\n }\n return [\n {\n offset: transform.parent!.outputPoint,\n type: FlowTransitionLabelEnum.ADDER_LABEL,\n },\n ];\n },\n getOriginDeltaY(transform): number {\n const { children } = transform;\n if (children.length === 0) {\n return -transform.size.height * transform.origin.y;\n }\n // 这里要加上 y 轴的偏移\n return -transform.size.height * transform.origin.y - PositionConfig.paddingWithNote;\n },\n};\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { FlowDocument } from '@flowgram.ai/document';\nimport { FlowGroupService } from '@flowgram.ai/document';\n\nimport { IGroupPluginRegister } from '../type';\n\n/** 注册清理分组逻辑 */\nexport const registerCleanGroups: IGroupPluginRegister = (ctx, opts) => {\n const groupService = ctx.get<FlowGroupService>(FlowGroupService);\n const document = ctx.get<FlowDocument>(FlowDocument);\n\n const clearInvalidGroups = () => {\n groupService.getAllGroups().forEach(group => {\n if (group?.nodes.length !== 0) {\n return;\n }\n if (!group.groupNode.pre) {\n return;\n }\n groupService.deleteGroup(group.groupNode);\n });\n };\n\n document.originTree.onTreeChange(() => {\n setTimeout(() => {\n clearInvalidGroups();\n }, 0);\n });\n};\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { IGroupPluginRegister } from '../type';\nimport { GroupPluginRegister } from '../constant';\nimport { registerRender } from './register-render';\nimport { registerLayer } from './register-layer';\nimport { registerGroupNode } from './register-group-node';\nimport { registerCleanGroups } from './register-clean-groups';\n\nexport const groupRegisters: Record<GroupPluginRegister, IGroupPluginRegister> = {\n [GroupPluginRegister.GroupNode]: registerGroupNode,\n [GroupPluginRegister.Render]: registerRender,\n [GroupPluginRegister.Layer]: registerLayer,\n [GroupPluginRegister.CleanGroups]: registerCleanGroups,\n};\n"],"mappings":"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","names":["FlowGroupController","React","FlowDocument","FlowNodeEntity","FlowNodeRenderData","GroupRenderer","GroupPluginRegister","useEffect","React","FlowGroupController","useEffect","useState","FlowGroupController","useEffect","React","React","FlowDocument","FlowNodeEntity","FlowNodeRenderData","React","FlowRendererRegistry","FlowRendererRegistry","React","FlowDocument","React","FlowGroupController","FlowGroupController","React","FlowDocument","FlowDocument","FlowGroupService"]}
package/dist/index.js CHANGED
@@ -198,7 +198,7 @@ var GroupBox = (props) => {
198
198
  const defaultBackgroundStyle = {
199
199
  borderRadius: 10,
200
200
  zIndex: -1,
201
- outline: `${hover ? 3 : 1}px solid rgb(97, 69, 211)`,
201
+ outline: `${hover ? 2 : 1}px solid rgb(97, 69, 211)`,
202
202
  backgroundColor: "rgb(236 233 247)"
203
203
  };
204
204
  const backgroundStyle = props.backgroundStyle ? props.backgroundStyle(groupController) : defaultBackgroundStyle;
@@ -308,6 +308,7 @@ var registerLayer = (ctx, opts) => {
308
308
  var import_document6 = require("@flowgram.ai/document");
309
309
 
310
310
  // src/group-node-register.tsx
311
+ var import_react7 = __toESM(require("react"));
311
312
  var import_utils3 = require("@flowgram.ai/utils");
312
313
  var import_document5 = require("@flowgram.ai/document");
313
314
  var GroupRegister = {
@@ -342,6 +343,9 @@ var GroupRegister = {
342
343
  };
343
344
  }
344
345
  },
346
+ formMeta: {
347
+ render: () => import_react7.default.createElement("div")
348
+ },
345
349
  getLines(transition) {
346
350
  const { transform } = transition;
347
351
  const lines = [];
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/groups-layer.tsx","../src/constant.ts","../src/components/group-render.tsx","../src/components/group-box.tsx","../src/components/hooks.ts","../src/create-group-plugin.tsx","../src/registers/register-render.tsx","../src/registers/register-layer.ts","../src/registers/register-group-node.ts","../src/group-node-register.tsx","../src/registers/register-clean-groups.ts","../src/registers/index.ts"],"sourcesContent":["/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nexport { FlowGroupController } from '@flowgram.ai/document';\nexport * from './groups-layer';\nexport * from './create-group-plugin';\nexport * from './type';\nexport * from './constant';\nexport * from './group-node-register';\nexport * from './components';\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport React from 'react';\n\nimport { inject, injectable } from 'inversify';\nimport { FlowRendererRegistry } from '@flowgram.ai/renderer';\nimport {\n FlowDocument,\n FlowDocumentTransformerEntity,\n FlowGroupController,\n FlowGroupService,\n FlowNodeEntity,\n FlowNodeRenderData,\n FlowNodeTransformData,\n} from '@flowgram.ai/document';\nimport { Layer, observeEntity, observeEntityDatas } from '@flowgram.ai/core';\nimport { domUtils } from '@flowgram.ai/utils';\n\nimport { GroupsLayerOptions, IGroupBox } from './type';\nimport { GroupRenderer } from './constant';\nimport { GroupBox } from './components';\n\n@injectable()\nexport class GroupsLayer extends Layer<GroupsLayerOptions> {\n public readonly node: HTMLElement;\n\n @inject(FlowDocument) protected document: FlowDocument;\n\n @inject(FlowRendererRegistry)\n protected readonly rendererRegistry: FlowRendererRegistry;\n\n @inject(FlowGroupService)\n protected readonly groupService: FlowGroupService;\n\n @observeEntity(FlowDocumentTransformerEntity)\n readonly documentTransformer: FlowDocumentTransformerEntity;\n\n @observeEntityDatas(FlowNodeEntity, FlowNodeRenderData)\n renderStates: FlowNodeRenderData[];\n\n @observeEntityDatas(FlowNodeEntity, FlowNodeTransformData)\n transforms: FlowNodeTransformData[];\n\n private readonly className = 'gedit-groups-layer';\n\n constructor() {\n super();\n this.node = domUtils.createDivWithClass(this.className);\n this.node.style.zIndex = '0';\n }\n\n /** 缩放 */\n public onZoom(scale: number): void {\n this.node!.style.transform = `scale(${scale})`;\n }\n\n public render(): JSX.Element {\n if (this.documentTransformer.loading) return <></>;\n this.documentTransformer.refresh();\n\n return <>{this.renderGroups()}</>;\n }\n\n /** 渲染分组 */\n protected renderGroups(): JSX.Element {\n const Box = this.renderer || GroupBox;\n return (\n <>\n {this.groups.map(group => (\n <Box\n key={group.groupNode.id}\n groupNode={group.groupNode}\n backgroundStyle={this.options.groupBoxStyle}\n />\n ))}\n </>\n );\n }\n\n /** 所有分组 */\n protected get groups(): FlowGroupController[] {\n return this.groupService.getAllGroups();\n }\n\n protected get renderer(): IGroupBox {\n return this.rendererRegistry.tryToGetRendererComponent(GroupRenderer.GroupBox)\n ?.renderer as IGroupBox;\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nexport enum GroupRenderer {\n GroupRender = 'group_render',\n GroupBox = 'group_box',\n}\n\nexport const PositionConfig = {\n paddingWithNote: 50, // note 留白大小\n padding: 10, // 无 label 的 padding\n paddingWithAddLabel: 20, // 有 label 的padding,如要放添加按钮\n headerHeight: 20, // 基础头部高度\n};\n\nexport enum GroupPluginRegister {\n GroupNode = 'registerGroupNode',\n Render = 'registerRender',\n Layer = 'registerLayer',\n CleanGroups = 'registerCleanGroups',\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\n/* eslint-disable react/prop-types */\nimport React, { useCallback, useEffect, useState } from 'react';\n\nimport { FlowGroupController, FlowNodeEntity, FlowNodeRenderData } from '@flowgram.ai/document';\nimport { FlowDocument } from '@flowgram.ai/document';\nimport { useEntityFromContext, useService } from '@flowgram.ai/core';\nimport { delay, Rectangle } from '@flowgram.ai/utils';\n\nimport { IGroupRender } from '../type';\n\nfunction useCurrentDomNode(): HTMLDivElement {\n const entity = useEntityFromContext<FlowNodeEntity>();\n const renderData = entity.getData<FlowNodeRenderData>(FlowNodeRenderData);\n return renderData.node;\n}\n\nexport const GroupRender: IGroupRender = props => {\n const { groupNode, GroupNode, GroupBoxHeader } = props;\n const container = useCurrentDomNode();\n const document = useService<FlowDocument>(FlowDocument);\n const groupController = FlowGroupController.create(groupNode);\n\n const [key, setKey] = useState(0);\n const [rendering, setRendering] = useState(true);\n const [collapsedCache, setCollapsedCache] = useState(groupController?.collapsed ?? false);\n\n const rerender = useCallback(async () => {\n setRendering(true);\n setKey(key + 1);\n // 边框bounds计算会有延迟\n await delay(50);\n setKey(key + 1);\n setRendering(false);\n }, [key]);\n\n // 监听 collapsed 变化触发重渲染\n useEffect(() => {\n const disposer = document.renderTree.onTreeChange(() => {\n if (groupController?.collapsed !== collapsedCache) {\n setCollapsedCache(groupController?.collapsed ?? false);\n rerender();\n }\n });\n return () => {\n disposer.dispose();\n };\n }, [key]);\n\n // 首次渲染时如果分组是展开状态,此时边框bounds计算会有延迟,需要强制重新渲染\n useEffect(() => {\n if (!groupController || groupController.collapsed) {\n return;\n }\n rerender();\n }, []);\n\n if (!groupController) {\n return <></>;\n }\n\n const groupNodeRender = (\n <GroupNode key={key} groupNode={groupNode} groupController={groupController} />\n );\n const groupBoxHeader = (\n <GroupBoxHeader key={key} groupController={groupController} groupNode={groupNode} />\n );\n\n if (groupController.collapsed) {\n const positionStyle: Partial<CSSStyleDeclaration> = {\n display: 'block',\n zIndex: '0',\n width: 'auto',\n height: 'auto',\n };\n Object.assign(container.style, positionStyle);\n return groupNodeRender;\n } else if (!rendering) {\n const bounds: Rectangle = groupController.bounds;\n const positionStyle: Partial<CSSStyleDeclaration> = {\n width: `${bounds.width}px`,\n };\n Object.assign(container.style, positionStyle);\n return groupBoxHeader;\n } else {\n return <></>;\n }\n};\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\n/* eslint-disable react/prop-types */\nimport { useEffect, type CSSProperties } from 'react';\nimport React from 'react';\n\nimport { FlowGroupController } from '@flowgram.ai/document';\nimport type { Rectangle } from '@flowgram.ai/utils';\n\nimport { IGroupBox } from '../type';\nimport { useHover } from './hooks';\n\nexport const GroupBox: IGroupBox = props => {\n const { groupNode } = props;\n const groupController = FlowGroupController.create(groupNode)!;\n const bounds: Rectangle = groupController.bounds;\n const { hover, ref } = useHover();\n\n const positionStyle: CSSProperties = {\n position: 'absolute',\n left: bounds.left,\n top: bounds.top,\n width: bounds.width,\n height: bounds.height,\n };\n\n const defaultBackgroundStyle: CSSProperties = {\n borderRadius: 10,\n zIndex: -1,\n outline: `${hover ? 3 : 1}px solid rgb(97, 69, 211)`,\n backgroundColor: 'rgb(236 233 247)',\n };\n\n const backgroundStyle = props.backgroundStyle\n ? props.backgroundStyle(groupController)\n : defaultBackgroundStyle;\n\n useEffect(() => {\n groupController.hovered = hover;\n }, [hover]);\n\n if (!groupController || groupController.collapsed) {\n return <></>;\n }\n\n return (\n <div className=\"gedit-group-box\" data-group-id={groupNode.id}>\n <div\n className=\"gedit-group-background\"\n ref={ref}\n style={{\n ...positionStyle,\n ...backgroundStyle,\n }}\n />\n </div>\n );\n};\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { useEffect, useRef, useState } from 'react';\n\nexport const useHover = () => {\n const ref = useRef<HTMLDivElement>(null);\n const [hover, setHover] = useState(false);\n\n const checkMouseOver = (event: MouseEvent) => {\n if (!ref.current) {\n return;\n }\n const { left, top, right, bottom } = ref.current.getBoundingClientRect();\n const isOver =\n event.clientX >= left &&\n event.clientX <= right &&\n event.clientY >= top &&\n event.clientY <= bottom;\n\n setHover(isOver);\n };\n\n useEffect(() => {\n window.addEventListener('mousemove', checkMouseOver);\n\n return () => {\n window.removeEventListener('mousemove', checkMouseOver);\n };\n }, []);\n\n return {\n hover,\n ref,\n };\n};\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { definePluginCreator, PluginContext } from '@flowgram.ai/core';\n\nimport { CreateGroupPluginOptions } from './type';\nimport { groupRegisters } from './registers';\nimport { GroupPluginRegister } from './constant';\n\n/**\n * 分组插件\n */\nexport const createGroupPlugin = definePluginCreator<CreateGroupPluginOptions>({\n onInit: (ctx: PluginContext, opts: CreateGroupPluginOptions) => {\n const { registers: registerConfs = {} } = opts;\n Object.entries(groupRegisters).forEach(([key, register]) => {\n const registerName = key as GroupPluginRegister;\n const registerConf = registerConfs[registerName];\n if (registerConf === false) {\n return;\n }\n if (typeof registerConf === 'function') {\n registerConf(ctx, opts);\n return;\n }\n register(ctx, opts);\n });\n },\n});\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport React, { FC } from 'react';\n\nimport { FlowRendererRegistry } from '@flowgram.ai/renderer';\nimport { FlowNodeEntity } from '@flowgram.ai/document';\n\nimport { IGroupPluginRegister } from '../type';\nimport { GroupRenderer } from '../constant';\nimport { GroupRender } from '../components';\n\n/** 注册渲染组件 */\nexport const registerRender: IGroupPluginRegister = (ctx, opts) => {\n const rendererRegistry = ctx.get<FlowRendererRegistry>(FlowRendererRegistry);\n const renderer: FC<{ node: FlowNodeEntity }> = props => (\n <GroupRender\n groupNode={props.node}\n GroupNode={opts.components!.GroupNode}\n GroupBoxHeader={opts.components!.GroupBoxHeader}\n />\n );\n rendererRegistry.registerReactComponent(GroupRenderer.GroupRender, renderer);\n};\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { IGroupPluginRegister } from '../type';\nimport { GroupsLayer } from '../groups-layer';\n\n/** 注册背景层 */\nexport const registerLayer: IGroupPluginRegister = (ctx, opts) => {\n ctx.playground.registerLayer(GroupsLayer, opts);\n};\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { FlowDocument } from '@flowgram.ai/document';\n\nimport { IGroupPluginRegister } from '../type';\nimport { GroupRegister } from '../group-node-register';\n\n/** 注册分组节点 */\nexport const registerGroupNode: IGroupPluginRegister = ctx => {\n const document = ctx.get<FlowDocument>(FlowDocument);\n document.registerFlowNodes(GroupRegister);\n};\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { IPoint, PaddingSchema, Point } from '@flowgram.ai/utils';\nimport {\n FlowGroupController,\n FlowNodeBaseType,\n FlowNodeRegistry,\n FlowNodeTransformData,\n FlowTransitionLabelEnum,\n type FlowTransitionLine,\n FlowTransitionLineEnum,\n} from '@flowgram.ai/document';\n\nimport { GroupRenderer, PositionConfig } from './constant';\n\nexport const GroupRegister: FlowNodeRegistry = {\n type: FlowNodeBaseType.GROUP,\n meta: {\n exportJSON: true,\n renderKey: GroupRenderer.GroupRender,\n positionConfig: PositionConfig,\n padding: (transform: FlowNodeTransformData): PaddingSchema => {\n const groupController = FlowGroupController.create(transform.entity);\n if (!groupController || groupController.collapsed || groupController.nodes.length === 0) {\n return {\n top: 0,\n bottom: 0,\n left: 0,\n right: 0,\n };\n }\n if (transform.entity.isVertical) {\n return {\n top: PositionConfig.paddingWithNote,\n bottom: PositionConfig.paddingWithAddLabel,\n left: PositionConfig.padding,\n right: PositionConfig.padding,\n };\n }\n return {\n top: PositionConfig.paddingWithNote,\n bottom: PositionConfig.padding,\n left: PositionConfig.padding,\n right: PositionConfig.paddingWithAddLabel,\n };\n },\n },\n getLines(transition) {\n const { transform } = transition;\n const lines: FlowTransitionLine[] = [];\n if (transform.firstChild) {\n lines.push({\n type: FlowTransitionLineEnum.STRAIGHT_LINE,\n from: transform.inputPoint,\n to: transform.firstChild.inputPoint,\n });\n }\n if (transform.next) {\n lines.push({\n type: FlowTransitionLineEnum.STRAIGHT_LINE,\n from: transform.outputPoint,\n to: transform.next.inputPoint,\n });\n } else {\n lines.push({\n type: FlowTransitionLineEnum.STRAIGHT_LINE,\n from: transform.outputPoint,\n to: transform.parent!.outputPoint,\n });\n }\n return lines;\n },\n getDelta(transform: FlowNodeTransformData): IPoint | undefined {\n const groupController = FlowGroupController.create(transform.entity);\n if (!groupController || groupController.collapsed) {\n return;\n }\n if (transform.entity.isVertical) {\n return {\n x: 0,\n y: PositionConfig.paddingWithNote,\n };\n }\n return {\n x: PositionConfig.padding,\n y: 0,\n };\n },\n getInputPoint(transform: FlowNodeTransformData): IPoint {\n const child = transform.firstChild;\n if (!child) return transform.defaultInputPoint;\n if (transform.entity.isVertical) {\n return {\n x: child.inputPoint.x,\n y: transform.bounds.topCenter.y,\n };\n }\n return {\n x: transform.bounds.leftCenter.x,\n y: child.inputPoint.y,\n };\n },\n getOutputPoint(transform: FlowNodeTransformData): IPoint {\n const child = transform.lastChild;\n if (!child) return transform.defaultOutputPoint;\n if (transform.entity.isVertical) {\n return {\n x: child.outputPoint.x,\n y: child.outputPoint.y + PositionConfig.paddingWithAddLabel / 2,\n };\n }\n return {\n x: child.outputPoint.x + PositionConfig.paddingWithAddLabel / 2,\n y: child.outputPoint.y,\n };\n },\n getLabels(transition) {\n const { transform } = transition;\n if (transform.next) {\n if (transform.entity.isVertical) {\n return [\n {\n offset: Point.getMiddlePoint(\n Point.move(transform.outputPoint, {\n x: 0,\n y: PositionConfig.paddingWithAddLabel / 2,\n }),\n transform.next.inputPoint\n ),\n type: FlowTransitionLabelEnum.ADDER_LABEL,\n },\n ];\n }\n return [\n {\n offset: Point.getMiddlePoint(\n Point.move(transform.outputPoint, { x: PositionConfig.paddingWithAddLabel / 2, y: 0 }),\n transform.next.inputPoint\n ),\n type: FlowTransitionLabelEnum.ADDER_LABEL,\n },\n ];\n }\n return [\n {\n offset: transform.parent!.outputPoint,\n type: FlowTransitionLabelEnum.ADDER_LABEL,\n },\n ];\n },\n getOriginDeltaY(transform): number {\n const { children } = transform;\n if (children.length === 0) {\n return -transform.size.height * transform.origin.y;\n }\n // 这里要加上 y 轴的偏移\n return -transform.size.height * transform.origin.y - PositionConfig.paddingWithNote;\n },\n};\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { FlowDocument } from '@flowgram.ai/document';\nimport { FlowGroupService } from '@flowgram.ai/document';\n\nimport { IGroupPluginRegister } from '../type';\n\n/** 注册清理分组逻辑 */\nexport const registerCleanGroups: IGroupPluginRegister = (ctx, opts) => {\n const groupService = ctx.get<FlowGroupService>(FlowGroupService);\n const document = ctx.get<FlowDocument>(FlowDocument);\n\n const clearInvalidGroups = () => {\n groupService.getAllGroups().forEach(group => {\n if (group?.nodes.length !== 0) {\n return;\n }\n if (!group.groupNode.pre) {\n return;\n }\n groupService.deleteGroup(group.groupNode);\n });\n };\n\n document.originTree.onTreeChange(() => {\n setTimeout(() => {\n clearInvalidGroups();\n }, 0);\n });\n};\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { IGroupPluginRegister } from '../type';\nimport { GroupPluginRegister } from '../constant';\nimport { registerRender } from './register-render';\nimport { registerLayer } from './register-layer';\nimport { registerGroupNode } from './register-group-node';\nimport { registerCleanGroups } from './register-clean-groups';\n\nexport const groupRegisters: Record<GroupPluginRegister, IGroupPluginRegister> = {\n [GroupPluginRegister.GroupNode]: registerGroupNode,\n [GroupPluginRegister.Render]: registerRender,\n [GroupPluginRegister.Layer]: registerLayer,\n [GroupPluginRegister.CleanGroups]: registerCleanGroups,\n};\n"],"mappings":"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","names":["import_document","import_react","import_document","import_core","import_utils","GroupRenderer","GroupPluginRegister","import_document","React","import_react","import_document","import_react","React","React","import_core","import_react","import_renderer","React","import_document","import_utils","import_document","import_document"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/groups-layer.tsx","../src/constant.ts","../src/components/group-render.tsx","../src/components/group-box.tsx","../src/components/hooks.ts","../src/create-group-plugin.tsx","../src/registers/register-render.tsx","../src/registers/register-layer.ts","../src/registers/register-group-node.ts","../src/group-node-register.tsx","../src/registers/register-clean-groups.ts","../src/registers/index.ts"],"sourcesContent":["/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nexport { FlowGroupController } from '@flowgram.ai/document';\nexport * from './groups-layer';\nexport * from './create-group-plugin';\nexport * from './type';\nexport * from './constant';\nexport * from './group-node-register';\nexport * from './components';\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport React from 'react';\n\nimport { inject, injectable } from 'inversify';\nimport { FlowRendererRegistry } from '@flowgram.ai/renderer';\nimport {\n FlowDocument,\n FlowDocumentTransformerEntity,\n FlowGroupController,\n FlowGroupService,\n FlowNodeEntity,\n FlowNodeRenderData,\n FlowNodeTransformData,\n} from '@flowgram.ai/document';\nimport { Layer, observeEntity, observeEntityDatas } from '@flowgram.ai/core';\nimport { domUtils } from '@flowgram.ai/utils';\n\nimport { GroupsLayerOptions, IGroupBox } from './type';\nimport { GroupRenderer } from './constant';\nimport { GroupBox } from './components';\n\n@injectable()\nexport class GroupsLayer extends Layer<GroupsLayerOptions> {\n public readonly node: HTMLElement;\n\n @inject(FlowDocument) protected document: FlowDocument;\n\n @inject(FlowRendererRegistry)\n protected readonly rendererRegistry: FlowRendererRegistry;\n\n @inject(FlowGroupService)\n protected readonly groupService: FlowGroupService;\n\n @observeEntity(FlowDocumentTransformerEntity)\n readonly documentTransformer: FlowDocumentTransformerEntity;\n\n @observeEntityDatas(FlowNodeEntity, FlowNodeRenderData)\n renderStates: FlowNodeRenderData[];\n\n @observeEntityDatas(FlowNodeEntity, FlowNodeTransformData)\n transforms: FlowNodeTransformData[];\n\n private readonly className = 'gedit-groups-layer';\n\n constructor() {\n super();\n this.node = domUtils.createDivWithClass(this.className);\n this.node.style.zIndex = '0';\n }\n\n /** 缩放 */\n public onZoom(scale: number): void {\n this.node!.style.transform = `scale(${scale})`;\n }\n\n public render(): JSX.Element {\n if (this.documentTransformer.loading) return <></>;\n this.documentTransformer.refresh();\n\n return <>{this.renderGroups()}</>;\n }\n\n /** 渲染分组 */\n protected renderGroups(): JSX.Element {\n const Box = this.renderer || GroupBox;\n return (\n <>\n {this.groups.map(group => (\n <Box\n key={group.groupNode.id}\n groupNode={group.groupNode}\n backgroundStyle={this.options.groupBoxStyle}\n />\n ))}\n </>\n );\n }\n\n /** 所有分组 */\n protected get groups(): FlowGroupController[] {\n return this.groupService.getAllGroups();\n }\n\n protected get renderer(): IGroupBox {\n return this.rendererRegistry.tryToGetRendererComponent(GroupRenderer.GroupBox)\n ?.renderer as IGroupBox;\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nexport enum GroupRenderer {\n GroupRender = 'group_render',\n GroupBox = 'group_box',\n}\n\nexport const PositionConfig = {\n paddingWithNote: 50, // note 留白大小\n padding: 10, // 无 label 的 padding\n paddingWithAddLabel: 20, // 有 label 的padding,如要放添加按钮\n headerHeight: 20, // 基础头部高度\n};\n\nexport enum GroupPluginRegister {\n GroupNode = 'registerGroupNode',\n Render = 'registerRender',\n Layer = 'registerLayer',\n CleanGroups = 'registerCleanGroups',\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\n/* eslint-disable react/prop-types */\nimport React, { useCallback, useEffect, useState } from 'react';\n\nimport { FlowGroupController, FlowNodeEntity, FlowNodeRenderData } from '@flowgram.ai/document';\nimport { FlowDocument } from '@flowgram.ai/document';\nimport { useEntityFromContext, useService } from '@flowgram.ai/core';\nimport { delay, Rectangle } from '@flowgram.ai/utils';\n\nimport { IGroupRender } from '../type';\n\nfunction useCurrentDomNode(): HTMLDivElement {\n const entity = useEntityFromContext<FlowNodeEntity>();\n const renderData = entity.getData<FlowNodeRenderData>(FlowNodeRenderData);\n return renderData.node;\n}\n\nexport const GroupRender: IGroupRender = props => {\n const { groupNode, GroupNode, GroupBoxHeader } = props;\n const container = useCurrentDomNode();\n const document = useService<FlowDocument>(FlowDocument);\n const groupController = FlowGroupController.create(groupNode);\n\n const [key, setKey] = useState(0);\n const [rendering, setRendering] = useState(true);\n const [collapsedCache, setCollapsedCache] = useState(groupController?.collapsed ?? false);\n\n const rerender = useCallback(async () => {\n setRendering(true);\n setKey(key + 1);\n // 边框bounds计算会有延迟\n await delay(50);\n setKey(key + 1);\n setRendering(false);\n }, [key]);\n\n // 监听 collapsed 变化触发重渲染\n useEffect(() => {\n const disposer = document.renderTree.onTreeChange(() => {\n if (groupController?.collapsed !== collapsedCache) {\n setCollapsedCache(groupController?.collapsed ?? false);\n rerender();\n }\n });\n return () => {\n disposer.dispose();\n };\n }, [key]);\n\n // 首次渲染时如果分组是展开状态,此时边框bounds计算会有延迟,需要强制重新渲染\n useEffect(() => {\n if (!groupController || groupController.collapsed) {\n return;\n }\n rerender();\n }, []);\n\n if (!groupController) {\n return <></>;\n }\n\n const groupNodeRender = (\n <GroupNode key={key} groupNode={groupNode} groupController={groupController} />\n );\n const groupBoxHeader = (\n <GroupBoxHeader key={key} groupController={groupController} groupNode={groupNode} />\n );\n\n if (groupController.collapsed) {\n const positionStyle: Partial<CSSStyleDeclaration> = {\n display: 'block',\n zIndex: '0',\n width: 'auto',\n height: 'auto',\n };\n Object.assign(container.style, positionStyle);\n return groupNodeRender;\n } else if (!rendering) {\n const bounds: Rectangle = groupController.bounds;\n const positionStyle: Partial<CSSStyleDeclaration> = {\n width: `${bounds.width}px`,\n };\n Object.assign(container.style, positionStyle);\n return groupBoxHeader;\n } else {\n return <></>;\n }\n};\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\n/* eslint-disable react/prop-types */\nimport { useEffect, type CSSProperties } from 'react';\nimport React from 'react';\n\nimport type { Rectangle } from '@flowgram.ai/utils';\nimport { FlowGroupController } from '@flowgram.ai/document';\n\nimport { IGroupBox } from '../type';\nimport { useHover } from './hooks';\n\nexport const GroupBox: IGroupBox = (props) => {\n const { groupNode } = props;\n const groupController = FlowGroupController.create(groupNode)!;\n const bounds: Rectangle = groupController.bounds;\n const { hover, ref } = useHover();\n\n const positionStyle: CSSProperties = {\n position: 'absolute',\n left: bounds.left,\n top: bounds.top,\n width: bounds.width,\n height: bounds.height,\n };\n\n const defaultBackgroundStyle: CSSProperties = {\n borderRadius: 10,\n zIndex: -1,\n outline: `${hover ? 2 : 1}px solid rgb(97, 69, 211)`,\n backgroundColor: 'rgb(236 233 247)',\n };\n\n const backgroundStyle = props.backgroundStyle\n ? props.backgroundStyle(groupController)\n : defaultBackgroundStyle;\n\n useEffect(() => {\n groupController.hovered = hover;\n }, [hover]);\n\n if (!groupController || groupController.collapsed) {\n return <></>;\n }\n\n return (\n <div className=\"gedit-group-box\" data-group-id={groupNode.id}>\n <div\n className=\"gedit-group-background\"\n ref={ref}\n style={{\n ...positionStyle,\n ...backgroundStyle,\n }}\n />\n </div>\n );\n};\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { useEffect, useRef, useState } from 'react';\n\nexport const useHover = () => {\n const ref = useRef<HTMLDivElement>(null);\n const [hover, setHover] = useState(false);\n\n const checkMouseOver = (event: MouseEvent) => {\n if (!ref.current) {\n return;\n }\n const { left, top, right, bottom } = ref.current.getBoundingClientRect();\n const isOver =\n event.clientX >= left &&\n event.clientX <= right &&\n event.clientY >= top &&\n event.clientY <= bottom;\n\n setHover(isOver);\n };\n\n useEffect(() => {\n window.addEventListener('mousemove', checkMouseOver);\n\n return () => {\n window.removeEventListener('mousemove', checkMouseOver);\n };\n }, []);\n\n return {\n hover,\n ref,\n };\n};\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { definePluginCreator, PluginContext } from '@flowgram.ai/core';\n\nimport { CreateGroupPluginOptions } from './type';\nimport { groupRegisters } from './registers';\nimport { GroupPluginRegister } from './constant';\n\n/**\n * 分组插件\n */\nexport const createGroupPlugin = definePluginCreator<CreateGroupPluginOptions>({\n onInit: (ctx: PluginContext, opts: CreateGroupPluginOptions) => {\n const { registers: registerConfs = {} } = opts;\n Object.entries(groupRegisters).forEach(([key, register]) => {\n const registerName = key as GroupPluginRegister;\n const registerConf = registerConfs[registerName];\n if (registerConf === false) {\n return;\n }\n if (typeof registerConf === 'function') {\n registerConf(ctx, opts);\n return;\n }\n register(ctx, opts);\n });\n },\n});\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport React, { FC } from 'react';\n\nimport { FlowRendererRegistry } from '@flowgram.ai/renderer';\nimport { FlowNodeEntity } from '@flowgram.ai/document';\n\nimport { IGroupPluginRegister } from '../type';\nimport { GroupRenderer } from '../constant';\nimport { GroupRender } from '../components';\n\n/** 注册渲染组件 */\nexport const registerRender: IGroupPluginRegister = (ctx, opts) => {\n const rendererRegistry = ctx.get<FlowRendererRegistry>(FlowRendererRegistry);\n const renderer: FC<{ node: FlowNodeEntity }> = props => (\n <GroupRender\n groupNode={props.node}\n GroupNode={opts.components!.GroupNode}\n GroupBoxHeader={opts.components!.GroupBoxHeader}\n />\n );\n rendererRegistry.registerReactComponent(GroupRenderer.GroupRender, renderer);\n};\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { IGroupPluginRegister } from '../type';\nimport { GroupsLayer } from '../groups-layer';\n\n/** 注册背景层 */\nexport const registerLayer: IGroupPluginRegister = (ctx, opts) => {\n ctx.playground.registerLayer(GroupsLayer, opts);\n};\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { FlowDocument } from '@flowgram.ai/document';\n\nimport { IGroupPluginRegister } from '../type';\nimport { GroupRegister } from '../group-node-register';\n\n/** 注册分组节点 */\nexport const registerGroupNode: IGroupPluginRegister = ctx => {\n const document = ctx.get<FlowDocument>(FlowDocument);\n document.registerFlowNodes(GroupRegister);\n};\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport React from 'react';\n\nimport { IPoint, PaddingSchema, Point } from '@flowgram.ai/utils';\nimport {\n FlowGroupController,\n FlowNodeBaseType,\n FlowNodeRegistry,\n FlowNodeTransformData,\n FlowTransitionLabelEnum,\n type FlowTransitionLine,\n FlowTransitionLineEnum,\n} from '@flowgram.ai/document';\n\nimport { GroupRenderer, PositionConfig } from './constant';\n\nexport const GroupRegister: FlowNodeRegistry = {\n type: FlowNodeBaseType.GROUP,\n meta: {\n exportJSON: true,\n renderKey: GroupRenderer.GroupRender,\n positionConfig: PositionConfig,\n padding: (transform: FlowNodeTransformData): PaddingSchema => {\n const groupController = FlowGroupController.create(transform.entity);\n if (!groupController || groupController.collapsed || groupController.nodes.length === 0) {\n return {\n top: 0,\n bottom: 0,\n left: 0,\n right: 0,\n };\n }\n if (transform.entity.isVertical) {\n return {\n top: PositionConfig.paddingWithNote,\n bottom: PositionConfig.paddingWithAddLabel,\n left: PositionConfig.padding,\n right: PositionConfig.padding,\n };\n }\n return {\n top: PositionConfig.paddingWithNote,\n bottom: PositionConfig.padding,\n left: PositionConfig.padding,\n right: PositionConfig.paddingWithAddLabel,\n };\n },\n },\n formMeta: {\n render: () => React.createElement('div'),\n },\n getLines(transition) {\n const { transform } = transition;\n const lines: FlowTransitionLine[] = [];\n if (transform.firstChild) {\n lines.push({\n type: FlowTransitionLineEnum.STRAIGHT_LINE,\n from: transform.inputPoint,\n to: transform.firstChild.inputPoint,\n });\n }\n if (transform.next) {\n lines.push({\n type: FlowTransitionLineEnum.STRAIGHT_LINE,\n from: transform.outputPoint,\n to: transform.next.inputPoint,\n });\n } else {\n lines.push({\n type: FlowTransitionLineEnum.STRAIGHT_LINE,\n from: transform.outputPoint,\n to: transform.parent!.outputPoint,\n });\n }\n return lines;\n },\n getDelta(transform: FlowNodeTransformData): IPoint | undefined {\n const groupController = FlowGroupController.create(transform.entity);\n if (!groupController || groupController.collapsed) {\n return;\n }\n if (transform.entity.isVertical) {\n return {\n x: 0,\n y: PositionConfig.paddingWithNote,\n };\n }\n return {\n x: PositionConfig.padding,\n y: 0,\n };\n },\n getInputPoint(transform: FlowNodeTransformData): IPoint {\n const child = transform.firstChild;\n if (!child) return transform.defaultInputPoint;\n if (transform.entity.isVertical) {\n return {\n x: child.inputPoint.x,\n y: transform.bounds.topCenter.y,\n };\n }\n return {\n x: transform.bounds.leftCenter.x,\n y: child.inputPoint.y,\n };\n },\n getOutputPoint(transform: FlowNodeTransformData): IPoint {\n const child = transform.lastChild;\n if (!child) return transform.defaultOutputPoint;\n if (transform.entity.isVertical) {\n return {\n x: child.outputPoint.x,\n y: child.outputPoint.y + PositionConfig.paddingWithAddLabel / 2,\n };\n }\n return {\n x: child.outputPoint.x + PositionConfig.paddingWithAddLabel / 2,\n y: child.outputPoint.y,\n };\n },\n getLabels(transition) {\n const { transform } = transition;\n if (transform.next) {\n if (transform.entity.isVertical) {\n return [\n {\n offset: Point.getMiddlePoint(\n Point.move(transform.outputPoint, {\n x: 0,\n y: PositionConfig.paddingWithAddLabel / 2,\n }),\n transform.next.inputPoint\n ),\n type: FlowTransitionLabelEnum.ADDER_LABEL,\n },\n ];\n }\n return [\n {\n offset: Point.getMiddlePoint(\n Point.move(transform.outputPoint, { x: PositionConfig.paddingWithAddLabel / 2, y: 0 }),\n transform.next.inputPoint\n ),\n type: FlowTransitionLabelEnum.ADDER_LABEL,\n },\n ];\n }\n return [\n {\n offset: transform.parent!.outputPoint,\n type: FlowTransitionLabelEnum.ADDER_LABEL,\n },\n ];\n },\n getOriginDeltaY(transform): number {\n const { children } = transform;\n if (children.length === 0) {\n return -transform.size.height * transform.origin.y;\n }\n // 这里要加上 y 轴的偏移\n return -transform.size.height * transform.origin.y - PositionConfig.paddingWithNote;\n },\n};\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { FlowDocument } from '@flowgram.ai/document';\nimport { FlowGroupService } from '@flowgram.ai/document';\n\nimport { IGroupPluginRegister } from '../type';\n\n/** 注册清理分组逻辑 */\nexport const registerCleanGroups: IGroupPluginRegister = (ctx, opts) => {\n const groupService = ctx.get<FlowGroupService>(FlowGroupService);\n const document = ctx.get<FlowDocument>(FlowDocument);\n\n const clearInvalidGroups = () => {\n groupService.getAllGroups().forEach(group => {\n if (group?.nodes.length !== 0) {\n return;\n }\n if (!group.groupNode.pre) {\n return;\n }\n groupService.deleteGroup(group.groupNode);\n });\n };\n\n document.originTree.onTreeChange(() => {\n setTimeout(() => {\n clearInvalidGroups();\n }, 0);\n });\n};\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { IGroupPluginRegister } from '../type';\nimport { GroupPluginRegister } from '../constant';\nimport { registerRender } from './register-render';\nimport { registerLayer } from './register-layer';\nimport { registerGroupNode } from './register-group-node';\nimport { registerCleanGroups } from './register-clean-groups';\n\nexport const groupRegisters: Record<GroupPluginRegister, IGroupPluginRegister> = {\n [GroupPluginRegister.GroupNode]: registerGroupNode,\n [GroupPluginRegister.Render]: registerRender,\n [GroupPluginRegister.Layer]: registerLayer,\n [GroupPluginRegister.CleanGroups]: registerCleanGroups,\n};\n"],"mappings":"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","names":["import_document","import_react","import_document","import_core","import_utils","GroupRenderer","GroupPluginRegister","import_document","React","import_react","import_document","import_react","React","React","import_core","import_react","import_renderer","React","import_document","import_react","import_utils","import_document","React","import_document"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@flowgram.ai/group-plugin",
3
- "version": "1.0.2",
3
+ "version": "1.0.6",
4
4
  "homepage": "https://flowgram.ai/",
5
5
  "repository": "https://github.com/bytedance/flowgram.ai",
6
6
  "license": "MIT",
@@ -18,10 +18,10 @@
18
18
  "dependencies": {
19
19
  "inversify": "^6.0.1",
20
20
  "reflect-metadata": "~0.2.2",
21
- "@flowgram.ai/core": "1.0.2",
22
- "@flowgram.ai/document": "1.0.2",
23
- "@flowgram.ai/renderer": "1.0.2",
24
- "@flowgram.ai/utils": "1.0.2"
21
+ "@flowgram.ai/core": "1.0.6",
22
+ "@flowgram.ai/document": "1.0.6",
23
+ "@flowgram.ai/renderer": "1.0.6",
24
+ "@flowgram.ai/utils": "1.0.6"
25
25
  },
26
26
  "devDependencies": {
27
27
  "@types/react": "^18",
@@ -31,8 +31,8 @@
31
31
  "tsup": "^8.0.1",
32
32
  "typescript": "^5.8.3",
33
33
  "vitest": "^3.2.4",
34
- "@flowgram.ai/eslint-config": "1.0.2",
35
- "@flowgram.ai/ts-config": "1.0.2"
34
+ "@flowgram.ai/eslint-config": "1.0.6",
35
+ "@flowgram.ai/ts-config": "1.0.6"
36
36
  },
37
37
  "peerDependencies": {
38
38
  "react": ">=16.8",