dishui 0.0.59 → 0.0.60
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/components/pro/Flow/Flow.js +517 -543
- package/dist/components/pro/Flow/Flow.js.map +1 -1
- package/dist/components/pro/Flow/FlowCanvas.js +1092 -947
- package/dist/components/pro/Flow/FlowCanvas.js.map +1 -1
- package/dist/components/pro/Flow/context/FlowUIContext.d.ts +3 -0
- package/dist/components/pro/Flow/context/FlowUIContext.js +67 -64
- package/dist/components/pro/Flow/context/FlowUIContext.js.map +1 -1
- package/dist/components/pro/Flow/edges/EdgeRenderer.js +1 -1
- package/dist/components/pro/Flow/edges/edgePaths.js +170 -159
- package/dist/components/pro/Flow/edges/edgePaths.js.map +1 -1
- package/dist/components/pro/Flow/hooks/useDeleteSelection.d.ts +8 -0
- package/dist/components/pro/Flow/hooks/useDeleteSelection.js +43 -0
- package/dist/components/pro/Flow/hooks/useDeleteSelection.js.map +1 -0
- package/dist/components/pro/Flow/hooks/useMindMap.js +19 -17
- package/dist/components/pro/Flow/hooks/useMindMap.js.map +1 -1
- package/dist/components/pro/Flow/lines/LineRenderer.js +1 -1
- package/dist/components/pro/Flow/nodes/NodeRenderer.d.ts +2 -0
- package/dist/components/pro/Flow/nodes/NodeRenderer.js +174 -145
- package/dist/components/pro/Flow/nodes/NodeRenderer.js.map +1 -1
- package/dist/components/pro/Flow/nodes/shapes.d.ts +20 -0
- package/dist/components/pro/Flow/nodes/shapes.js +438 -203
- package/dist/components/pro/Flow/nodes/shapes.js.map +1 -1
- package/dist/components/pro/Flow/nodes/svgIconTexture.d.ts +4 -0
- package/dist/components/pro/Flow/nodes/svgIconTexture.js.map +1 -1
- package/dist/components/pro/Flow/panels/FlowToolbar.d.ts +4 -1
- package/dist/components/pro/Flow/panels/FlowToolbar.js +106 -100
- package/dist/components/pro/Flow/panels/FlowToolbar.js.map +1 -1
- package/dist/components/pro/Flow/panels/InspectorPanel.js +739 -476
- package/dist/components/pro/Flow/panels/InspectorPanel.js.map +1 -1
- package/dist/components/pro/Flow/panels/toolbarIcons.d.ts +2 -0
- package/dist/components/pro/Flow/panels/toolbarIcons.js +30 -25
- package/dist/components/pro/Flow/panels/toolbarIcons.js.map +1 -1
- package/dist/components/pro/Flow/types.d.ts +32 -0
- package/dist/components/pro/Flow/types.js.map +1 -1
- package/dist/dishui.css +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shapes.js","names":[],"sources":["../../../../../src/components/pro/Flow/nodes/shapes.ts"],"sourcesContent":["import { Graphics } from 'pixi.js';\nimport type { FlowShapeType, FlowNodeData } from '../types';\n\nexport interface ShapeDrawOptions {\n width: number;\n height: number;\n fill: string;\n stroke: string;\n strokeWidth: number;\n borderStyle?: 'solid' | 'dashed' | 'dotted' | 'dynamic' | 'none';\n dashOffset?: number;\n}\n\nfunction parseDash(style: string | undefined, strokeWidth: number): number[] | undefined {\n if (!style || style === 'solid') return undefined;\n if (style === 'dynamic') return [strokeWidth * 4, strokeWidth * 3];\n if (style === 'dashed') return [strokeWidth * 4, strokeWidth * 2];\n if (style === 'dotted') return [strokeWidth, strokeWidth * 2];\n return undefined;\n}\n\n/**\n * Sample a rectangle's outline as points for dashed border.\n */\nfunction sampleRect(w: number, h: number, step = 3): Array<{ x: number; y: number }> {\n const pts: Array<{ x: number; y: number }> = [];\n for (let x = 0; x <= w; x += step) pts.push({ x, y: 0 });\n for (let y = step; y <= h; y += step) pts.push({ x: w, y });\n for (let x = w - step; x >= 0; x -= step) pts.push({ x, y: h });\n for (let y = h - step; y > 0; y -= step) pts.push({ x: 0, y });\n pts.push({ x: 0, y: 0 });\n return pts;\n}\n\n/**\n * Sample a rounded rectangle outline as points.\n */\nfunction sampleRoundRect(w: number, h: number, r: number, step = 3): Array<{ x: number; y: number }> {\n const pts: Array<{ x: number; y: number }> = [];\n const cornerSamples = Math.max(4, Math.ceil((Math.PI / 2) * r / step));\n const addCorner = (cx: number, cy: number, startAngle: number) => {\n for (let i = 0; i <= cornerSamples; i++) {\n const a = startAngle + (Math.PI / 2) * (i / cornerSamples);\n pts.push({ x: cx + r * Math.cos(a), y: cy + r * Math.sin(a) });\n }\n };\n addCorner(w - r, r, -Math.PI / 2);\n addCorner(w - r, h - r, 0);\n addCorner(r, h - r, Math.PI / 2);\n addCorner(r, r, Math.PI);\n if (pts.length > 0) pts.push(pts[0]);\n return pts;\n}\n\n/**\n * Sample an ellipse outline.\n */\nfunction sampleEllipse(cx: number, cy: number, rx: number, ry: number, samples = 60): Array<{ x: number; y: number }> {\n const pts: Array<{ x: number; y: number }> = [];\n for (let i = 0; i <= samples; i++) {\n const a = (Math.PI * 2 * i) / samples;\n pts.push({ x: cx + rx * Math.cos(a), y: cy + ry * Math.sin(a) });\n }\n return pts;\n}\n\n/**\n * Draw dashed polyline onto graphics.\n */\nfunction drawDashedPoly(g: Graphics, pts: Array<{ x: number; y: number }>, dash: number[], offset: number, color: string, width: number): void {\n if (pts.length < 2) return;\n const dists = [0];\n for (let i = 1; i < pts.length; i++) {\n dists.push(dists[i - 1] + Math.hypot(pts[i].x - pts[i - 1].x, pts[i].y - pts[i - 1].y));\n }\n const total = dists[dists.length - 1];\n if (total < 1) return;\n const patternLen = dash[0] + dash[1];\n let pos = -(((offset % patternLen) + patternLen) % patternLen);\n let drawing = true;\n\n const lerp = (d: number) => {\n if (d <= 0) return pts[0];\n if (d >= total) return pts[pts.length - 1];\n let lo = 0, hi = dists.length - 1;\n while (lo < hi - 1) { const m = (lo + hi) >> 1; if (dists[m] <= d) lo = m; else hi = m; }\n const t = dists[hi] - dists[lo] > 0 ? (d - dists[lo]) / (dists[hi] - dists[lo]) : 0;\n return { x: pts[lo].x + (pts[hi].x - pts[lo].x) * t, y: pts[lo].y + (pts[hi].y - pts[lo].y) * t };\n };\n\n while (pos < total) {\n const segLen = drawing ? dash[0] : dash[1];\n const start = Math.max(pos, 0);\n const end = Math.min(pos + segLen, total);\n if (drawing && end > start) {\n const p0 = lerp(start);\n g.moveTo(p0.x, p0.y);\n for (let d = start + 2; d < end; d += 2) {\n const p = lerp(d);\n g.lineTo(p.x, p.y);\n }\n const pe = lerp(end);\n g.lineTo(pe.x, pe.y);\n }\n pos += segLen;\n drawing = !drawing;\n }\n g.stroke({ color, width, cap: 'round' as const });\n}\n\nfunction fillShape(g: Graphics, o: ShapeDrawOptions) {\n if (o.fill && o.fill !== 'transparent') {\n g.fill({ color: o.fill });\n }\n if (o.borderStyle === 'none') return;\n if (o.stroke && o.stroke !== 'transparent' && o.strokeWidth > 0) {\n const dash = parseDash(o.borderStyle, o.strokeWidth);\n if (dash) {\n // Dashed/dotted/dynamic: don't stroke the shape path, we'll draw dashed separately\n } else {\n g.stroke({ color: o.stroke, width: o.strokeWidth });\n }\n }\n}\n\n/**\n * After fillShape, draw dashed border if needed.\n * Pass shape-specific outline points.\n */\nfunction drawDashedBorder(g: Graphics, o: ShapeDrawOptions, outlinePts: Array<{ x: number; y: number }>) {\n const dash = parseDash(o.borderStyle, o.strokeWidth);\n if (!dash || !o.stroke || o.stroke === 'transparent' || o.strokeWidth <= 0) return;\n const offset = o.borderStyle === 'dynamic' ? (o.dashOffset ?? 0) : 0;\n drawDashedPoly(g, outlinePts, dash, offset, o.stroke, o.strokeWidth);\n}\n\n/** Draw only a rounded-rectangle border, without leaving a base path that can\n * be picked up by the dashed stroke. Useful when fill and border are rendered\n * independently, as they are for SVG icon nodes. */\nexport function drawRoundRectBorder(g: Graphics, o: ShapeDrawOptions, radius?: number): void {\n if (o.borderStyle === 'none' || !o.stroke || o.stroke === 'transparent' || o.strokeWidth <= 0) return;\n const r = radius ?? Math.min(12, o.width * 0.1, o.height * 0.1);\n const dash = parseDash(o.borderStyle, o.strokeWidth);\n if (dash) {\n const offset = o.borderStyle === 'dynamic' ? (o.dashOffset ?? 0) : 0;\n drawDashedPoly(g, sampleRoundRect(o.width, o.height, r), dash, offset, o.stroke, o.strokeWidth);\n } else {\n g.roundRect(0, 0, o.width, o.height, r).stroke({ color: o.stroke, width: o.strokeWidth });\n }\n}\n\nfunction polyPoints(verts: Array<{ x: number; y: number }>): Array<{ x: number; y: number }> {\n return [...verts, verts[0]];\n}\n\nexport function drawRect(g: Graphics, o: ShapeDrawOptions): void {\n g.rect(0, 0, o.width, o.height);\n fillShape(g, o);\n drawDashedBorder(g, o, sampleRect(o.width, o.height));\n}\n\nexport function drawRoundRect(g: Graphics, o: ShapeDrawOptions): void {\n const r = Math.min(12, o.width * 0.1, o.height * 0.1);\n g.roundRect(0, 0, o.width, o.height, r);\n fillShape(g, o);\n drawDashedBorder(g, o, sampleRoundRect(o.width, o.height, r));\n}\n\nexport function drawEllipse(g: Graphics, o: ShapeDrawOptions): void {\n g.ellipse(o.width / 2, o.height / 2, o.width / 2, o.height / 2);\n fillShape(g, o);\n drawDashedBorder(g, o, sampleEllipse(o.width / 2, o.height / 2, o.width / 2, o.height / 2));\n}\n\nexport function drawDiamond(g: Graphics, o: ShapeDrawOptions): void {\n const cx = o.width / 2, cy = o.height / 2;\n const verts = [{ x: cx, y: 0 }, { x: o.width, y: cy }, { x: cx, y: o.height }, { x: 0, y: cy }];\n g.moveTo(cx, 0).lineTo(o.width, cy).lineTo(cx, o.height).lineTo(0, cy).closePath();\n fillShape(g, o);\n drawDashedBorder(g, o, polyPoints(verts));\n}\n\nexport function drawDocument(g: Graphics, o: ShapeDrawOptions): void {\n const w = o.width, h = o.height, curve = h * 0.15;\n g.moveTo(0, 0)\n .lineTo(w, 0)\n .lineTo(w, h - curve)\n .bezierCurveTo(w * 0.75, h - curve * 2, w * 0.25, h, 0, h - curve)\n .closePath();\n fillShape(g, o);\n const pts: Array<{ x: number; y: number }> = [{ x: 0, y: 0 }, { x: w, y: 0 }, { x: w, y: h - curve }];\n const samples = 20;\n for (let i = 1; i <= samples; i++) {\n const t = i / samples;\n const u = 1 - t;\n pts.push({\n x: u * u * u * w + 3 * u * u * t * (w * 0.75) + 3 * u * t * t * (w * 0.25),\n y: u * u * u * (h - curve) + 3 * u * u * t * (h - curve * 2) + 3 * u * t * t * h + t * t * t * (h - curve),\n });\n }\n pts.push({ x: 0, y: 0 });\n drawDashedBorder(g, o, pts);\n}\n\nexport function drawParallelogram(g: Graphics, o: ShapeDrawOptions): void {\n const skew = o.width * 0.2;\n const verts = [{ x: skew, y: 0 }, { x: o.width, y: 0 }, { x: o.width - skew, y: o.height }, { x: 0, y: o.height }];\n g.moveTo(skew, 0).lineTo(o.width, 0).lineTo(o.width - skew, o.height).lineTo(0, o.height).closePath();\n fillShape(g, o);\n drawDashedBorder(g, o, polyPoints(verts));\n}\n\nexport function drawTriangle(g: Graphics, o: ShapeDrawOptions): void {\n const verts = [{ x: o.width / 2, y: 0 }, { x: o.width, y: o.height }, { x: 0, y: o.height }];\n g.moveTo(o.width / 2, 0).lineTo(o.width, o.height).lineTo(0, o.height).closePath();\n fillShape(g, o);\n drawDashedBorder(g, o, polyPoints(verts));\n}\n\nexport function drawTrapezoid(g: Graphics, o: ShapeDrawOptions): void {\n const inset = o.width * 0.15;\n const verts = [{ x: inset, y: 0 }, { x: o.width - inset, y: 0 }, { x: o.width, y: o.height }, { x: 0, y: o.height }];\n g.moveTo(inset, 0).lineTo(o.width - inset, 0).lineTo(o.width, o.height).lineTo(0, o.height).closePath();\n fillShape(g, o);\n drawDashedBorder(g, o, polyPoints(verts));\n}\n\nfunction regularPoly(cx: number, cy: number, sides: number, rx: number, ry: number, startAngle: number): Array<{ x: number; y: number }> {\n const verts: Array<{ x: number; y: number }> = [];\n for (let i = 0; i < sides; i++) {\n const a = (Math.PI * 2 * i) / sides + startAngle;\n verts.push({ x: cx + rx * Math.cos(a), y: cy + ry * Math.sin(a) });\n }\n return verts;\n}\n\nexport function drawPentagon(g: Graphics, o: ShapeDrawOptions): void {\n const cx = o.width / 2, cy = o.height / 2, r = Math.min(cx, cy);\n const verts = regularPoly(cx, cy, 5, r, r, -Math.PI / 2);\n for (let i = 0; i < verts.length; i++) {\n if (i === 0) g.moveTo(verts[i].x, verts[i].y); else g.lineTo(verts[i].x, verts[i].y);\n }\n g.closePath();\n fillShape(g, o);\n drawDashedBorder(g, o, polyPoints(verts));\n}\n\nexport function drawHexagon(g: Graphics, o: ShapeDrawOptions): void {\n const cx = o.width / 2, cy = o.height / 2;\n const verts = regularPoly(cx, cy, 6, cx, cy, -Math.PI / 6);\n for (let i = 0; i < verts.length; i++) {\n if (i === 0) g.moveTo(verts[i].x, verts[i].y); else g.lineTo(verts[i].x, verts[i].y);\n }\n g.closePath();\n fillShape(g, o);\n drawDashedBorder(g, o, polyPoints(verts));\n}\n\nexport function drawStar(g: Graphics, o: ShapeDrawOptions): void {\n const cx = o.width / 2, cy = o.height / 2;\n const outer = Math.min(cx, cy), inner = outer * 0.4, points = 5;\n const verts: Array<{ x: number; y: number }> = [];\n for (let i = 0; i < points * 2; i++) {\n const angle = (Math.PI * i) / points - Math.PI / 2;\n const r = i % 2 === 0 ? outer : inner;\n verts.push({ x: cx + r * Math.cos(angle), y: cy + r * Math.sin(angle) });\n }\n for (let i = 0; i < verts.length; i++) {\n if (i === 0) g.moveTo(verts[i].x, verts[i].y); else g.lineTo(verts[i].x, verts[i].y);\n }\n g.closePath();\n fillShape(g, o);\n drawDashedBorder(g, o, polyPoints(verts));\n}\n\nexport function drawHexagram(g: Graphics, o: ShapeDrawOptions): void {\n const cx = o.width / 2, cy = o.height / 2;\n const outer = Math.min(cx, cy), inner = outer * 0.55;\n const verts: Array<{ x: number; y: number }> = [];\n for (let i = 0; i < 12; i++) {\n const angle = (Math.PI * i) / 6 - Math.PI / 2;\n const r = i % 2 === 0 ? outer : inner;\n verts.push({ x: cx + r * Math.cos(angle), y: cy + r * Math.sin(angle) });\n }\n for (let i = 0; i < verts.length; i++) {\n if (i === 0) g.moveTo(verts[i].x, verts[i].y); else g.lineTo(verts[i].x, verts[i].y);\n }\n g.closePath();\n fillShape(g, o);\n drawDashedBorder(g, o, polyPoints(verts));\n}\n\nexport function drawRightTriangle(g: Graphics, o: ShapeDrawOptions): void {\n const verts = [{ x: 0, y: 0 }, { x: o.width, y: o.height }, { x: 0, y: o.height }];\n g.moveTo(0, 0).lineTo(o.width, o.height).lineTo(0, o.height).closePath();\n fillShape(g, o);\n drawDashedBorder(g, o, polyPoints(verts));\n}\n\nexport function drawCorner(g: Graphics, o: ShapeDrawOptions): void {\n const half = Math.min(o.width, o.height) * 0.4;\n const verts = [\n { x: 0, y: 0 }, { x: o.width, y: 0 }, { x: o.width, y: half },\n { x: half, y: half }, { x: half, y: o.height }, { x: 0, y: o.height },\n ];\n g.moveTo(0, 0).lineTo(o.width, 0).lineTo(o.width, half)\n .lineTo(half, half).lineTo(half, o.height).lineTo(0, o.height).closePath();\n fillShape(g, o);\n drawDashedBorder(g, o, polyPoints(verts));\n}\n\nexport function drawFlowGroup(g: Graphics, o: ShapeDrawOptions): void {\n const r = Math.min(6, o.width * 0.04, o.height * 0.04);\n g.roundRect(0, 0, o.width, o.height, r);\n if (o.fill && o.fill !== 'transparent') {\n g.fill({ color: o.fill, alpha: 0.08 });\n }\n const border = o.borderStyle ?? 'dashed';\n if (border !== 'none' && o.stroke && o.stroke !== 'transparent' && o.strokeWidth > 0) {\n const dash = parseDash(border, o.strokeWidth);\n if (dash) {\n const offset = border === 'dynamic' ? (o.dashOffset ?? 0) : 0;\n drawDashedPoly(g, sampleRoundRect(o.width, o.height, r), dash, offset, o.stroke, o.strokeWidth);\n } else {\n g.stroke({ color: o.stroke, width: o.strokeWidth });\n }\n }\n}\n\nexport const drawGeometryGroup = drawFlowGroup;\n\n/** Lookup table mapping shape type to draw function */\nexport const shapeDrawers: Record<string, (g: Graphics, o: ShapeDrawOptions) => void> = {\n shapeRect: drawRect,\n shapeRoundRect: drawRoundRect,\n shapeEllipse: drawEllipse,\n shapeDiamond: drawDiamond,\n shapeDocument: drawDocument,\n shapeParallelogram: drawParallelogram,\n shapeTriangle: drawTriangle,\n shapeTrapezoid: drawTrapezoid,\n shapePentagon: drawPentagon,\n shapeHexagon: drawHexagon,\n shapeStar: drawStar,\n shapeHexagram: drawHexagram,\n shapeRightTriangle: drawRightTriangle,\n shapeCorner: drawCorner,\n textLabel: drawRect,\n flowGroup: drawFlowGroup,\n geometryGroup: drawGeometryGroup,\n shapeSvg: drawRoundRect,\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"shapes.js","names":[],"sources":["../../../../../src/components/pro/Flow/nodes/shapes.ts"],"sourcesContent":["import { Graphics } from 'pixi.js';\nimport type { FlowShapeType, FlowNodeData, FlowBorderSides, FlowBorderSideOverride } from '../types';\nimport { drawDashedPath, type PathSeg } from '../utils/dashedLine';\nimport { resolveThemeColor } from '../utils/themeColor';\n\nexport interface ShapeDrawOptions {\n width: number;\n height: number;\n fill: string;\n stroke: string;\n strokeWidth: number;\n borderStyle?: 'solid' | 'dashed' | 'dotted' | 'dynamic' | 'none';\n dashOffset?: number;\n}\n\nfunction parseDash(style: string | undefined, strokeWidth: number): number[] | undefined {\n if (!style || style === 'solid') return undefined;\n if (style === 'dynamic') return [strokeWidth * 4, strokeWidth * 3];\n if (style === 'dashed') return [strokeWidth * 4, strokeWidth * 2];\n if (style === 'dotted') return [strokeWidth, strokeWidth * 2];\n return undefined;\n}\n\n/**\n * Sample a rectangle's outline as points for dashed border.\n */\nfunction sampleRect(w: number, h: number, step = 3): Array<{ x: number; y: number }> {\n const pts: Array<{ x: number; y: number }> = [];\n for (let x = 0; x <= w; x += step) pts.push({ x, y: 0 });\n for (let y = step; y <= h; y += step) pts.push({ x: w, y });\n for (let x = w - step; x >= 0; x -= step) pts.push({ x, y: h });\n for (let y = h - step; y > 0; y -= step) pts.push({ x: 0, y });\n pts.push({ x: 0, y: 0 });\n return pts;\n}\n\n/**\n * Sample a rounded rectangle outline as points.\n */\nfunction sampleRoundRect(w: number, h: number, r: number, step = 3): Array<{ x: number; y: number }> {\n const pts: Array<{ x: number; y: number }> = [];\n const cornerSamples = Math.max(4, Math.ceil((Math.PI / 2) * r / step));\n const addCorner = (cx: number, cy: number, startAngle: number) => {\n for (let i = 0; i <= cornerSamples; i++) {\n const a = startAngle + (Math.PI / 2) * (i / cornerSamples);\n pts.push({ x: cx + r * Math.cos(a), y: cy + r * Math.sin(a) });\n }\n };\n addCorner(w - r, r, -Math.PI / 2);\n addCorner(w - r, h - r, 0);\n addCorner(r, h - r, Math.PI / 2);\n addCorner(r, r, Math.PI);\n if (pts.length > 0) pts.push(pts[0]);\n return pts;\n}\n\n/**\n * Sample an ellipse outline.\n */\nfunction sampleEllipse(cx: number, cy: number, rx: number, ry: number, samples = 60): Array<{ x: number; y: number }> {\n const pts: Array<{ x: number; y: number }> = [];\n for (let i = 0; i <= samples; i++) {\n const a = (Math.PI * 2 * i) / samples;\n pts.push({ x: cx + rx * Math.cos(a), y: cy + ry * Math.sin(a) });\n }\n return pts;\n}\n\n/**\n * Draw dashed polyline onto graphics.\n */\nfunction drawDashedPoly(g: Graphics, pts: Array<{ x: number; y: number }>, dash: number[], offset: number, color: string, width: number): void {\n if (pts.length < 2) return;\n const dists = [0];\n for (let i = 1; i < pts.length; i++) {\n dists.push(dists[i - 1] + Math.hypot(pts[i].x - pts[i - 1].x, pts[i].y - pts[i - 1].y));\n }\n const total = dists[dists.length - 1];\n if (total < 1) return;\n const patternLen = dash[0] + dash[1];\n let pos = -(((offset % patternLen) + patternLen) % patternLen);\n let drawing = true;\n\n const lerp = (d: number) => {\n if (d <= 0) return pts[0];\n if (d >= total) return pts[pts.length - 1];\n let lo = 0, hi = dists.length - 1;\n while (lo < hi - 1) { const m = (lo + hi) >> 1; if (dists[m] <= d) lo = m; else hi = m; }\n const t = dists[hi] - dists[lo] > 0 ? (d - dists[lo]) / (dists[hi] - dists[lo]) : 0;\n return { x: pts[lo].x + (pts[hi].x - pts[lo].x) * t, y: pts[lo].y + (pts[hi].y - pts[lo].y) * t };\n };\n\n while (pos < total) {\n const segLen = drawing ? dash[0] : dash[1];\n const start = Math.max(pos, 0);\n const end = Math.min(pos + segLen, total);\n if (drawing && end > start) {\n const p0 = lerp(start);\n g.moveTo(p0.x, p0.y);\n for (let d = start + 2; d < end; d += 2) {\n const p = lerp(d);\n g.lineTo(p.x, p.y);\n }\n const pe = lerp(end);\n g.lineTo(pe.x, pe.y);\n }\n pos += segLen;\n drawing = !drawing;\n }\n g.stroke({ color, width, cap: 'round' as const });\n}\n\nfunction fillShape(g: Graphics, o: ShapeDrawOptions) {\n if (o.fill && o.fill !== 'transparent') {\n g.fill({ color: o.fill });\n }\n if (o.borderStyle === 'none') return;\n if (o.stroke && o.stroke !== 'transparent' && o.strokeWidth > 0) {\n const dash = parseDash(o.borderStyle, o.strokeWidth);\n if (dash) {\n // Dashed/dotted/dynamic: don't stroke the shape path, we'll draw dashed separately\n } else {\n g.stroke({ color: o.stroke, width: o.strokeWidth });\n }\n }\n}\n\n/**\n * After fillShape, draw dashed border if needed.\n * Pass shape-specific outline points.\n */\nfunction drawDashedBorder(g: Graphics, o: ShapeDrawOptions, outlinePts: Array<{ x: number; y: number }>) {\n const dash = parseDash(o.borderStyle, o.strokeWidth);\n if (!dash || !o.stroke || o.stroke === 'transparent' || o.strokeWidth <= 0) return;\n const offset = o.borderStyle === 'dynamic' ? (o.dashOffset ?? 0) : 0;\n drawDashedPoly(g, outlinePts, dash, offset, o.stroke, o.strokeWidth);\n}\n\n/** Draw only a rounded-rectangle border, without leaving a base path that can\n * be picked up by the dashed stroke. Useful when fill and border are rendered\n * independently, as they are for SVG icon nodes. */\nexport function drawRoundRectBorder(g: Graphics, o: ShapeDrawOptions, radius?: number): void {\n if (o.borderStyle === 'none' || !o.stroke || o.stroke === 'transparent' || o.strokeWidth <= 0) return;\n const r = radius ?? Math.min(12, o.width * 0.1, o.height * 0.1);\n const dash = parseDash(o.borderStyle, o.strokeWidth);\n if (dash) {\n const offset = o.borderStyle === 'dynamic' ? (o.dashOffset ?? 0) : 0;\n drawDashedPoly(g, sampleRoundRect(o.width, o.height, r), dash, offset, o.stroke, o.strokeWidth);\n } else {\n g.roundRect(0, 0, o.width, o.height, r).stroke({ color: o.stroke, width: o.strokeWidth });\n }\n}\n\nfunction polyPoints(verts: Array<{ x: number; y: number }>): Array<{ x: number; y: number }> {\n return [...verts, verts[0]];\n}\n\nexport function drawRect(g: Graphics, o: ShapeDrawOptions): void {\n g.rect(0, 0, o.width, o.height);\n fillShape(g, o);\n drawDashedBorder(g, o, sampleRect(o.width, o.height));\n}\n\nexport function drawRoundRect(g: Graphics, o: ShapeDrawOptions): void {\n const r = Math.min(12, o.width * 0.1, o.height * 0.1);\n g.roundRect(0, 0, o.width, o.height, r);\n fillShape(g, o);\n drawDashedBorder(g, o, sampleRoundRect(o.width, o.height, r));\n}\n\nexport function drawEllipse(g: Graphics, o: ShapeDrawOptions): void {\n g.ellipse(o.width / 2, o.height / 2, o.width / 2, o.height / 2);\n fillShape(g, o);\n drawDashedBorder(g, o, sampleEllipse(o.width / 2, o.height / 2, o.width / 2, o.height / 2));\n}\n\nexport function drawDiamond(g: Graphics, o: ShapeDrawOptions): void {\n const cx = o.width / 2, cy = o.height / 2;\n const verts = [{ x: cx, y: 0 }, { x: o.width, y: cy }, { x: cx, y: o.height }, { x: 0, y: cy }];\n g.moveTo(cx, 0).lineTo(o.width, cy).lineTo(cx, o.height).lineTo(0, cy).closePath();\n fillShape(g, o);\n drawDashedBorder(g, o, polyPoints(verts));\n}\n\nexport function drawDocument(g: Graphics, o: ShapeDrawOptions): void {\n const w = o.width, h = o.height, curve = h * 0.15;\n g.moveTo(0, 0)\n .lineTo(w, 0)\n .lineTo(w, h - curve)\n .bezierCurveTo(w * 0.75, h - curve * 2, w * 0.25, h, 0, h - curve)\n .closePath();\n fillShape(g, o);\n const pts: Array<{ x: number; y: number }> = [{ x: 0, y: 0 }, { x: w, y: 0 }, { x: w, y: h - curve }];\n const samples = 20;\n for (let i = 1; i <= samples; i++) {\n const t = i / samples;\n const u = 1 - t;\n pts.push({\n x: u * u * u * w + 3 * u * u * t * (w * 0.75) + 3 * u * t * t * (w * 0.25),\n y: u * u * u * (h - curve) + 3 * u * u * t * (h - curve * 2) + 3 * u * t * t * h + t * t * t * (h - curve),\n });\n }\n pts.push({ x: 0, y: 0 });\n drawDashedBorder(g, o, pts);\n}\n\nexport function drawParallelogram(g: Graphics, o: ShapeDrawOptions): void {\n const skew = o.width * 0.2;\n const verts = [{ x: skew, y: 0 }, { x: o.width, y: 0 }, { x: o.width - skew, y: o.height }, { x: 0, y: o.height }];\n g.moveTo(skew, 0).lineTo(o.width, 0).lineTo(o.width - skew, o.height).lineTo(0, o.height).closePath();\n fillShape(g, o);\n drawDashedBorder(g, o, polyPoints(verts));\n}\n\nexport function drawTriangle(g: Graphics, o: ShapeDrawOptions): void {\n const verts = [{ x: o.width / 2, y: 0 }, { x: o.width, y: o.height }, { x: 0, y: o.height }];\n g.moveTo(o.width / 2, 0).lineTo(o.width, o.height).lineTo(0, o.height).closePath();\n fillShape(g, o);\n drawDashedBorder(g, o, polyPoints(verts));\n}\n\nexport function drawTrapezoid(g: Graphics, o: ShapeDrawOptions): void {\n const inset = o.width * 0.15;\n const verts = [{ x: inset, y: 0 }, { x: o.width - inset, y: 0 }, { x: o.width, y: o.height }, { x: 0, y: o.height }];\n g.moveTo(inset, 0).lineTo(o.width - inset, 0).lineTo(o.width, o.height).lineTo(0, o.height).closePath();\n fillShape(g, o);\n drawDashedBorder(g, o, polyPoints(verts));\n}\n\nfunction regularPoly(cx: number, cy: number, sides: number, rx: number, ry: number, startAngle: number): Array<{ x: number; y: number }> {\n const verts: Array<{ x: number; y: number }> = [];\n for (let i = 0; i < sides; i++) {\n const a = (Math.PI * 2 * i) / sides + startAngle;\n verts.push({ x: cx + rx * Math.cos(a), y: cy + ry * Math.sin(a) });\n }\n return verts;\n}\n\nexport function drawPentagon(g: Graphics, o: ShapeDrawOptions): void {\n const cx = o.width / 2, cy = o.height / 2, r = Math.min(cx, cy);\n const verts = regularPoly(cx, cy, 5, r, r, -Math.PI / 2);\n for (let i = 0; i < verts.length; i++) {\n if (i === 0) g.moveTo(verts[i].x, verts[i].y); else g.lineTo(verts[i].x, verts[i].y);\n }\n g.closePath();\n fillShape(g, o);\n drawDashedBorder(g, o, polyPoints(verts));\n}\n\nexport function drawHexagon(g: Graphics, o: ShapeDrawOptions): void {\n const cx = o.width / 2, cy = o.height / 2;\n const verts = regularPoly(cx, cy, 6, cx, cy, -Math.PI / 6);\n for (let i = 0; i < verts.length; i++) {\n if (i === 0) g.moveTo(verts[i].x, verts[i].y); else g.lineTo(verts[i].x, verts[i].y);\n }\n g.closePath();\n fillShape(g, o);\n drawDashedBorder(g, o, polyPoints(verts));\n}\n\nexport function drawStar(g: Graphics, o: ShapeDrawOptions): void {\n const cx = o.width / 2, cy = o.height / 2;\n const outer = Math.min(cx, cy), inner = outer * 0.4, points = 5;\n const verts: Array<{ x: number; y: number }> = [];\n for (let i = 0; i < points * 2; i++) {\n const angle = (Math.PI * i) / points - Math.PI / 2;\n const r = i % 2 === 0 ? outer : inner;\n verts.push({ x: cx + r * Math.cos(angle), y: cy + r * Math.sin(angle) });\n }\n for (let i = 0; i < verts.length; i++) {\n if (i === 0) g.moveTo(verts[i].x, verts[i].y); else g.lineTo(verts[i].x, verts[i].y);\n }\n g.closePath();\n fillShape(g, o);\n drawDashedBorder(g, o, polyPoints(verts));\n}\n\nexport function drawHexagram(g: Graphics, o: ShapeDrawOptions): void {\n const cx = o.width / 2, cy = o.height / 2;\n const outer = Math.min(cx, cy), inner = outer * 0.55;\n const verts: Array<{ x: number; y: number }> = [];\n for (let i = 0; i < 12; i++) {\n const angle = (Math.PI * i) / 6 - Math.PI / 2;\n const r = i % 2 === 0 ? outer : inner;\n verts.push({ x: cx + r * Math.cos(angle), y: cy + r * Math.sin(angle) });\n }\n for (let i = 0; i < verts.length; i++) {\n if (i === 0) g.moveTo(verts[i].x, verts[i].y); else g.lineTo(verts[i].x, verts[i].y);\n }\n g.closePath();\n fillShape(g, o);\n drawDashedBorder(g, o, polyPoints(verts));\n}\n\nexport function drawRightTriangle(g: Graphics, o: ShapeDrawOptions): void {\n const verts = [{ x: 0, y: 0 }, { x: o.width, y: o.height }, { x: 0, y: o.height }];\n g.moveTo(0, 0).lineTo(o.width, o.height).lineTo(0, o.height).closePath();\n fillShape(g, o);\n drawDashedBorder(g, o, polyPoints(verts));\n}\n\nexport function drawCorner(g: Graphics, o: ShapeDrawOptions): void {\n const half = Math.min(o.width, o.height) * 0.4;\n const verts = [\n { x: 0, y: 0 }, { x: o.width, y: 0 }, { x: o.width, y: half },\n { x: half, y: half }, { x: half, y: o.height }, { x: 0, y: o.height },\n ];\n g.moveTo(0, 0).lineTo(o.width, 0).lineTo(o.width, half)\n .lineTo(half, half).lineTo(half, o.height).lineTo(0, o.height).closePath();\n fillShape(g, o);\n drawDashedBorder(g, o, polyPoints(verts));\n}\n\nexport function drawFlowGroup(g: Graphics, o: ShapeDrawOptions): void {\n const r = Math.min(6, o.width * 0.04, o.height * 0.04);\n g.roundRect(0, 0, o.width, o.height, r);\n if (o.fill && o.fill !== 'transparent') {\n g.fill({ color: o.fill, alpha: 0.08 });\n }\n const border = o.borderStyle ?? 'dashed';\n if (border !== 'none' && o.stroke && o.stroke !== 'transparent' && o.strokeWidth > 0) {\n const dash = parseDash(border, o.strokeWidth);\n if (dash) {\n const offset = border === 'dynamic' ? (o.dashOffset ?? 0) : 0;\n drawDashedPoly(g, sampleRoundRect(o.width, o.height, r), dash, offset, o.stroke, o.strokeWidth);\n } else {\n g.stroke({ color: o.stroke, width: o.strokeWidth });\n }\n }\n}\n\nexport const drawGeometryGroup = drawFlowGroup;\n\n/* ─── Per-side borders (top / right / bottom / left) ─────────────────── */\n\nexport type BorderSideName = 'top' | 'right' | 'bottom' | 'left';\nexport const BORDER_SIDE_NAMES: BorderSideName[] = ['top', 'right', 'bottom', 'left'];\n\n/** Shape types whose geometry has four well-defined sides. Other shapes ignore\n * `borderSides` and keep a full outline. */\nexport const BORDER_SIDE_TYPES = new Set<string>([\n 'shapeRect', 'shapeRoundRect', 'shapeEllipse', 'shapeDiamond', 'shapeDocument',\n 'shapeParallelogram', 'shapeTrapezoid', 'mediaNode', 'flowGroup', 'geometryGroup',\n]);\n\n/** True when `borderSides` carries at least one effective override AND the\n * shape type supports per-side borders. */\nexport function hasBorderSideOverrides(data: FlowNodeData, type?: string): boolean {\n if (type !== undefined && !BORDER_SIDE_TYPES.has(type)) return false;\n const sides = data.borderSides;\n if (!sides) return false;\n return BORDER_SIDE_NAMES.some((name) => {\n const side = sides[name];\n return !!side\n && (side.visible === false || side.color !== undefined || side.width !== undefined);\n });\n}\n\n/** Corner radius used by each shape's own drawer, so side segments line up\n * exactly with the (possibly hidden) full outline. */\nfunction borderSideRadius(type: string, w: number, h: number): number {\n switch (type) {\n case 'shapeRoundRect': return Math.min(12, w * 0.1, h * 0.1);\n case 'mediaNode': return 6;\n case 'flowGroup':\n case 'geometryGroup': return Math.min(6, w * 0.04, h * 0.04);\n default: return 0;\n }\n}\n\nconst BEZIER_K = 0.5522847498; // kappa for a 90° arc approximation\n\n/** Build the drawable path of one side of the shape. Corners are owned by the\n * side that starts there (clockwise): top owns the top-left arc, right the\n * top-right arc, and so on — with uniform styling the four sides reconstruct\n * the full outline seamlessly. */\nexport function buildBorderSideSegments(\n type: string,\n w: number,\n h: number,\n side: BorderSideName,\n): PathSeg[] {\n const segs: PathSeg[] = [];\n const line = (x: number, y: number) => segs.push({ type: 'L', x, y });\n const cubic = (\n c1x: number, c1y: number, c2x: number, c2y: number, x: number, y: number,\n ) => segs.push({ type: 'C', cp1x: c1x, cp1y: c1y, cp2x: c2x, cp2y: c2y, x, y });\n\n const r = borderSideRadius(type, w, h);\n if (r >= 0.5) {\n // Rounded rect family (shapeRoundRect / mediaNode / group frames): each\n // side owns its starting corner arc (clockwise), so uniform styling\n // reconstructs the full rounded outline seamlessly.\n const k = BEZIER_K * r;\n switch (side) {\n case 'top':\n segs.push({ type: 'M', x: 0, y: r });\n cubic(0, r - k, r - k, 0, r, 0);\n line(w - r, 0);\n break;\n case 'right':\n segs.push({ type: 'M', x: w - r, y: 0 });\n cubic(w - r + k, 0, w, r - k, w, r);\n line(w, h - r);\n break;\n case 'bottom':\n segs.push({ type: 'M', x: w, y: h - r });\n cubic(w, h - r + k, w - r + k, h, w - r, h);\n line(r, h);\n break;\n case 'left':\n segs.push({ type: 'M', x: r, y: h });\n cubic(r - k, h, 0, h - r + k, 0, h - r);\n line(0, r);\n break;\n }\n return segs;\n }\n\n if (type === 'shapeEllipse') {\n // Split the outline at the 45° diagonals so each side is the arc centered\n // on its direction (top arc spans the top, etc.).\n const cx = w / 2, cy = h / 2, rx = w / 2, ry = h / 2;\n const angles: Record<BorderSideName, [number, number]> = {\n top: [Math.PI * 1.25, Math.PI * 1.75],\n right: [Math.PI * 1.75, Math.PI * 2.25],\n bottom: [Math.PI * 0.25, Math.PI * 0.75],\n left: [Math.PI * 0.75, Math.PI * 1.25],\n };\n const [a0, a1] = angles[side];\n const p0x = cx + rx * Math.cos(a0), p0y = cy + ry * Math.sin(a0);\n const p3x = cx + rx * Math.cos(a1), p3y = cy + ry * Math.sin(a1);\n segs.push({ type: 'M', x: p0x, y: p0y });\n cubic(\n p0x - BEZIER_K * rx * Math.sin(a0), p0y + BEZIER_K * ry * Math.cos(a0),\n p3x + BEZIER_K * rx * Math.sin(a1), p3y - BEZIER_K * ry * Math.cos(a1),\n p3x, p3y,\n );\n return segs;\n }\n\n if (type === 'shapeDocument') {\n const curve = h * 0.15;\n if (side === 'top') {\n segs.push({ type: 'M', x: 0, y: 0 });\n line(w, 0);\n } else if (side === 'right') {\n segs.push({ type: 'M', x: w, y: 0 });\n line(w, h - curve);\n } else if (side === 'bottom') {\n segs.push({ type: 'M', x: w, y: h - curve });\n cubic(w * 0.75, h - curve * 2, w * 0.25, h, 0, h - curve);\n } else {\n segs.push({ type: 'M', x: 0, y: h - curve });\n line(0, 0);\n }\n return segs;\n }\n\n // Quadrilaterals (rect / diamond / parallelogram / trapezoid).\n let v0: { x: number; y: number }, v1: { x: number; y: number }, v2: { x: number; y: number }, v3: { x: number; y: number };\n if (type === 'shapeDiamond') {\n const cx = w / 2, cy = h / 2;\n v0 = { x: cx, y: 0 }; v1 = { x: w, y: cy }; v2 = { x: cx, y: h }; v3 = { x: 0, y: cy };\n } else if (type === 'shapeParallelogram') {\n const skew = w * 0.2;\n v0 = { x: skew, y: 0 }; v1 = { x: w, y: 0 }; v2 = { x: w - skew, y: h }; v3 = { x: 0, y: h };\n } else if (type === 'shapeTrapezoid') {\n const inset = w * 0.15;\n v0 = { x: inset, y: 0 }; v1 = { x: w - inset, y: 0 }; v2 = { x: w, y: h }; v3 = { x: 0, y: h };\n } else {\n v0 = { x: 0, y: 0 }; v1 = { x: w, y: 0 }; v2 = { x: w, y: h }; v3 = { x: 0, y: h };\n }\n\n const edges: Record<BorderSideName, [{ x: number; y: number }, { x: number; y: number }]> = {\n top: [v0, v1],\n right: [v1, v2],\n bottom: [v2, v3],\n left: [v3, v0],\n };\n const [a, b] = edges[side];\n segs.push({ type: 'M', x: a.x, y: a.y });\n line(b.x, b.y);\n return segs;\n}\n\n/** Draw the four sides of a node independently, honoring per-side color /\n * width / visibility overrides (falling back to the node's defaults). The\n * node's `borderStyle` (solid / dashed / dotted / dynamic) applies to every\n * side. `defaultColor` is the node's (already theme-resolved) stroke. */\nexport function drawBorderSides(\n g: Graphics,\n type: string,\n width: number,\n height: number,\n sides: FlowBorderSides | undefined,\n defaultColor: string,\n defaultWidth: number,\n borderStyle: string | undefined,\n dashOffset: number,\n): void {\n if (borderStyle === 'none') return;\n for (const name of BORDER_SIDE_NAMES) {\n const side: FlowBorderSideOverride | undefined = sides?.[name];\n if (side?.visible === false) continue;\n const color = resolveThemeColor(side?.color, defaultColor) || defaultColor;\n const strokeWidth = side?.width ?? defaultWidth;\n if (!color || color === 'transparent' || !(strokeWidth > 0)) continue;\n const segs = buildBorderSideSegments(type, width, height, name);\n const dash = parseDash(borderStyle, strokeWidth);\n if (dash) {\n const offset = borderStyle === 'dynamic' ? dashOffset : 0;\n drawDashedPath(g, segs, dash, offset);\n g.stroke({ color, width: strokeWidth, cap: 'round' as const });\n } else {\n for (const seg of segs) {\n switch (seg.type) {\n case 'M': g.moveTo(seg.x, seg.y); break;\n case 'L': g.lineTo(seg.x, seg.y); break;\n case 'C': g.bezierCurveTo(seg.cp1x!, seg.cp1y!, seg.cp2x!, seg.cp2y!, seg.x, seg.y); break;\n case 'Q': g.quadraticCurveTo(seg.cp1x!, seg.cp1y!, seg.x, seg.y); break;\n }\n }\n g.stroke({ color, width: strokeWidth });\n }\n }\n}\n\n/** Lookup table mapping shape type to draw function */\nexport const shapeDrawers: Record<string, (g: Graphics, o: ShapeDrawOptions) => void> = {\n shapeRect: drawRect,\n shapeRoundRect: drawRoundRect,\n shapeEllipse: drawEllipse,\n shapeDiamond: drawDiamond,\n shapeDocument: drawDocument,\n shapeParallelogram: drawParallelogram,\n shapeTriangle: drawTriangle,\n shapeTrapezoid: drawTrapezoid,\n shapePentagon: drawPentagon,\n shapeHexagon: drawHexagon,\n shapeStar: drawStar,\n shapeHexagram: drawHexagram,\n shapeRightTriangle: drawRightTriangle,\n shapeCorner: drawCorner,\n textLabel: drawRect,\n flowGroup: drawFlowGroup,\n geometryGroup: drawGeometryGroup,\n shapeSvg: drawRoundRect,\n};\n"],"mappings":"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"}
|
|
@@ -1,3 +1,7 @@
|
|
|
1
1
|
import { Texture } from 'pixi.js';
|
|
2
2
|
export declare function subscribeIconTextureReady(listener: () => void): () => void;
|
|
3
|
+
/** Natural (pixel) size of rasterized icon textures; scale sprites by
|
|
4
|
+
* `targetSize / ICON_TEXTURE_SIZE` — do NOT mix `width`/`height` setters with
|
|
5
|
+
* `scale` writes on the same sprite, they overwrite each other. */
|
|
6
|
+
export declare const ICON_TEXTURE_SIZE = 96;
|
|
3
7
|
export declare function getIconTexture(id: string, color: string, onReady?: () => void): Texture | null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"svgIconTexture.js","names":[],"sources":["../../../../../src/components/pro/Flow/nodes/svgIconTexture.ts"],"sourcesContent":["import { Texture } from 'pixi.js';\nimport { buildSvgMarkup } from './svgIcons';\n\n/**\n * Rasterizes SVG icons into PixiJS textures and caches them by `id|color`.\n *\n * Rendering is asynchronous (SVG → Image → canvas → Texture). Callers request a\n * texture; if not cached yet, `null` is returned and the icon loads in the\n * background. Pass an `onReady` callback to trigger a re-render once available.\n */\nconst cache = new Map<string, Texture>();\nconst pending = new Set<string>();\nconst readyListeners = new Set<() => void>();\n\nexport function subscribeIconTextureReady(listener: () => void): () => void {\n readyListeners.add(listener);\n return () => readyListeners.delete(listener);\n}\n\nfunction notifyReady(): void {\n for (const listener of readyListeners) listener();\n}\n\nconst RASTER_SIZE = 96; // backing resolution for crisp icons when zoomed in\n\nfunction keyFor(id: string, color: string): string {\n return `${id}|${color}`;\n}\n\nexport function getIconTexture(\n id: string,\n color: string,\n onReady?: () => void,\n): Texture | null {\n const key = keyFor(id, color);\n const cached = cache.get(key);\n if (cached) return cached;\n if (pending.has(key)) return null;\n\n const markup = buildSvgMarkup(id, color);\n if (!markup) return null;\n\n pending.add(key);\n const svgBlob = new Blob([markup], { type: 'image/svg+xml' });\n const url = URL.createObjectURL(svgBlob);\n const img = new Image();\n img.onload = () => {\n try {\n const canvas = document.createElement('canvas');\n canvas.width = RASTER_SIZE;\n canvas.height = RASTER_SIZE;\n const ctx = canvas.getContext('2d');\n if (ctx) {\n ctx.clearRect(0, 0, RASTER_SIZE, RASTER_SIZE);\n ctx.drawImage(img, 0, 0, RASTER_SIZE, RASTER_SIZE);\n const tex = Texture.from(canvas);\n cache.set(key, tex);\n }\n } catch {\n /* ignore rasterization failures */\n } finally {\n URL.revokeObjectURL(url);\n pending.delete(key);\n onReady?.();\n notifyReady();\n }\n };\n img.onerror = () => {\n URL.revokeObjectURL(url);\n pending.delete(key);\n };\n img.src = url;\n return null;\n}\n"],"mappings":";;AAUA,IAAM,IAAQ,oBAAI,IAAqB,GACjC,IAAU,oBAAI,IAAY,GAC1B,IAAiB,oBAAI,IAAgB;AAE3C,SAAgB,EAA0B,GAAkC;AAC1E,SAAA,EAAe,IAAI,CAAQ,GAC3B,MAAa,EAAe,OAAO,CAAQ;AAC7C;AAEA,SAAS,IAAoB;AAC3B,aAAW,KAAY,EAAgB,CAAA,EAAS;AAClD;AAEA,IAAM,IAAc;
|
|
1
|
+
{"version":3,"file":"svgIconTexture.js","names":[],"sources":["../../../../../src/components/pro/Flow/nodes/svgIconTexture.ts"],"sourcesContent":["import { Texture } from 'pixi.js';\nimport { buildSvgMarkup } from './svgIcons';\n\n/**\n * Rasterizes SVG icons into PixiJS textures and caches them by `id|color`.\n *\n * Rendering is asynchronous (SVG → Image → canvas → Texture). Callers request a\n * texture; if not cached yet, `null` is returned and the icon loads in the\n * background. Pass an `onReady` callback to trigger a re-render once available.\n */\nconst cache = new Map<string, Texture>();\nconst pending = new Set<string>();\nconst readyListeners = new Set<() => void>();\n\nexport function subscribeIconTextureReady(listener: () => void): () => void {\n readyListeners.add(listener);\n return () => readyListeners.delete(listener);\n}\n\nfunction notifyReady(): void {\n for (const listener of readyListeners) listener();\n}\n\nconst RASTER_SIZE = 96; // backing resolution for crisp icons when zoomed in\n/** Natural (pixel) size of rasterized icon textures; scale sprites by\n * `targetSize / ICON_TEXTURE_SIZE` — do NOT mix `width`/`height` setters with\n * `scale` writes on the same sprite, they overwrite each other. */\nexport const ICON_TEXTURE_SIZE = RASTER_SIZE;\n\nfunction keyFor(id: string, color: string): string {\n return `${id}|${color}`;\n}\n\nexport function getIconTexture(\n id: string,\n color: string,\n onReady?: () => void,\n): Texture | null {\n const key = keyFor(id, color);\n const cached = cache.get(key);\n if (cached) return cached;\n if (pending.has(key)) return null;\n\n const markup = buildSvgMarkup(id, color);\n if (!markup) return null;\n\n pending.add(key);\n const svgBlob = new Blob([markup], { type: 'image/svg+xml' });\n const url = URL.createObjectURL(svgBlob);\n const img = new Image();\n img.onload = () => {\n try {\n const canvas = document.createElement('canvas');\n canvas.width = RASTER_SIZE;\n canvas.height = RASTER_SIZE;\n const ctx = canvas.getContext('2d');\n if (ctx) {\n ctx.clearRect(0, 0, RASTER_SIZE, RASTER_SIZE);\n ctx.drawImage(img, 0, 0, RASTER_SIZE, RASTER_SIZE);\n const tex = Texture.from(canvas);\n cache.set(key, tex);\n }\n } catch {\n /* ignore rasterization failures */\n } finally {\n URL.revokeObjectURL(url);\n pending.delete(key);\n onReady?.();\n notifyReady();\n }\n };\n img.onerror = () => {\n URL.revokeObjectURL(url);\n pending.delete(key);\n };\n img.src = url;\n return null;\n}\n"],"mappings":";;AAUA,IAAM,IAAQ,oBAAI,IAAqB,GACjC,IAAU,oBAAI,IAAY,GAC1B,IAAiB,oBAAI,IAAgB;AAE3C,SAAgB,EAA0B,GAAkC;AAC1E,SAAA,EAAe,IAAI,CAAQ,GAC3B,MAAa,EAAe,OAAO,CAAQ;AAC7C;AAEA,SAAS,IAAoB;AAC3B,aAAW,KAAY,EAAgB,CAAA,EAAS;AAClD;AAEA,IAAM,IAAc;AAMpB,SAAS,EAAO,GAAY,GAAuB;AACjD,SAAO,GAAG,CAAA,IAAM,CAAA;AAClB;AAEA,SAAgB,EACd,GACA,GACA,GACgB;AAChB,QAAM,IAAM,EAAO,GAAI,CAAK,GACtB,IAAS,EAAM,IAAI,CAAG;AAC5B,MAAI,EAAQ,QAAO;AACnB,MAAI,EAAQ,IAAI,CAAG,EAAG,QAAO;AAE7B,QAAM,IAAS,EAAe,GAAI,CAAK;AACvC,MAAI,CAAC,EAAQ,QAAO;AAEpB,EAAA,EAAQ,IAAI,CAAG;AACf,QAAM,IAAU,IAAI,KAAK,CAAC,CAAM,GAAG,EAAE,MAAM,gBAAgB,CAAC,GACtD,IAAM,IAAI,gBAAgB,CAAO,GACjC,IAAM,IAAI,MAAM;AACtB,SAAA,EAAI,SAAA,MAAe;AACjB,QAAI;AACF,YAAM,IAAS,SAAS,cAAc,QAAQ;AAC9C,MAAA,EAAO,QAAQ,GACf,EAAO,SAAS;AAChB,YAAM,IAAM,EAAO,WAAW,IAAI;AAClC,UAAI,GAAK;AACP,QAAA,EAAI,UAAU,GAAG,GAAG,GAAa,CAAW,GAC5C,EAAI,UAAU,GAAK,GAAG,GAAG,GAAa,CAAW;AACjD,cAAM,IAAM,EAAQ,KAAK,CAAM;AAC/B,QAAA,EAAM,IAAI,GAAK,CAAG;AAAA,MACpB;AAAA,IACF,QAAQ;AAAA,IAER,UAAA;AACE,UAAI,gBAAgB,CAAG,GACvB,EAAQ,OAAO,CAAG,GAClB,IAAU,GACV,EAAY;AAAA,IACd;AAAA,EACF,GACA,EAAI,UAAA,MAAgB;AAClB,QAAI,gBAAgB,CAAG,GACvB,EAAQ,OAAO,CAAG;AAAA,EACpB,GACA,EAAI,MAAM,GACH;AACT"}
|
|
@@ -14,5 +14,8 @@ export interface FlowToolbarProps {
|
|
|
14
14
|
/** Export anchors as a PDF slideshow from the built-in toolbar. */
|
|
15
15
|
onExportPDF?: () => void | Promise<void>;
|
|
16
16
|
onPublish?: () => void;
|
|
17
|
+
/** Small-screen (container-width) layout: the title gets its own row and
|
|
18
|
+
* button groups wrap below instead of sliding under the absolute title. */
|
|
19
|
+
compact?: boolean;
|
|
17
20
|
}
|
|
18
|
-
export default function FlowToolbar({ onBack, onUndo, onRedo, canUndo, canRedo, onGroup, onGeoGroup, onUngroup, onExportPNG, onExportPDF, onPublish }: FlowToolbarProps): React.JSX.Element;
|
|
21
|
+
export default function FlowToolbar({ onBack, onUndo, onRedo, canUndo, canRedo, onGroup, onGeoGroup, onUngroup, onExportPNG, onExportPDF, onPublish, compact }: FlowToolbarProps): React.JSX.Element;
|
|
@@ -1,16 +1,16 @@
|
|
|
1
|
-
import
|
|
2
|
-
import { useFlowContext as
|
|
3
|
-
import { useFlowUI as
|
|
4
|
-
import
|
|
5
|
-
import { variantEdgeStyle as
|
|
6
|
-
import { archifyStylePatch as
|
|
7
|
-
import { downloadDataURL as
|
|
8
|
-
import { useLayoutActions as
|
|
9
|
-
import { IconAI as
|
|
10
|
-
import { useCallback as C, useRef as
|
|
1
|
+
import fo from "../../../Button/index.js";
|
|
2
|
+
import { useFlowContext as ko } from "../context/FlowContext.js";
|
|
3
|
+
import { useFlowUI as H } from "../context/FlowUIContext.js";
|
|
4
|
+
import wo from "./ProjectTitle.js";
|
|
5
|
+
import { variantEdgeStyle as Co } from "../archify/palette.js";
|
|
6
|
+
import { archifyStylePatch as vo, inferComponentType as Io } from "../archify/presets.js";
|
|
7
|
+
import { downloadDataURL as D, safeFileBaseName as q, useFlowImportExport as bo } from "../hooks/useFlowImportExport.js";
|
|
8
|
+
import { useLayoutActions as yo } from "../hooks/useLayoutActions.js";
|
|
9
|
+
import { IconAI as No, IconAlign as d, IconAnchorVisible as go, IconArchify as Ao, IconAutoFocus as So, IconBack as Oo, IconExportJson as xo, IconExportMarkdown as Fo, IconExportPdf as zo, IconExportPng as Ro, IconFitView as Mo, IconGeoGroup as jo, IconGrid as Jo, IconGroup as Lo, IconImport as Go, IconInspector as Po, IconJson as Zo, IconLayer as y, IconMagnet as Uo, IconMiniMap as Eo, IconOutline as To, IconPresent as Bo, IconPublish as Vo, IconRedo as $o, IconShapes as Wo, IconUndo as Do, IconUngroup as qo, IconZoomIn as Ho, IconZoomOut as Yo } from "./toolbarIcons.js";
|
|
10
|
+
import { useCallback as C, useRef as _o } from "react";
|
|
11
11
|
import { Fragment as N, jsx as o, jsxs as n } from "react/jsx-runtime";
|
|
12
|
-
function
|
|
13
|
-
const { viewport: r, setViewport: s, autoFocus: a, setAutoFocus: f } =
|
|
12
|
+
function dt() {
|
|
13
|
+
const { viewport: r, setViewport: s, autoFocus: a, setAutoFocus: f } = H(), k = Math.round(r.zoom * 100);
|
|
14
14
|
return /* @__PURE__ */ n("div", {
|
|
15
15
|
className: "flow-zoom-controls",
|
|
16
16
|
children: [
|
|
@@ -22,7 +22,7 @@ function lt() {
|
|
|
22
22
|
zoom: Math.max(0.1, r.zoom / 1.2)
|
|
23
23
|
});
|
|
24
24
|
},
|
|
25
|
-
children: /* @__PURE__ */ o(
|
|
25
|
+
children: /* @__PURE__ */ o(Yo, {})
|
|
26
26
|
}),
|
|
27
27
|
/* @__PURE__ */ n("span", {
|
|
28
28
|
className: "flow-zoom-info",
|
|
@@ -36,7 +36,7 @@ function lt() {
|
|
|
36
36
|
zoom: Math.min(4, r.zoom * 1.2)
|
|
37
37
|
});
|
|
38
38
|
},
|
|
39
|
-
children: /* @__PURE__ */ o(
|
|
39
|
+
children: /* @__PURE__ */ o(Ho, {})
|
|
40
40
|
}),
|
|
41
41
|
/* @__PURE__ */ o(t, {
|
|
42
42
|
tip: "适应视图",
|
|
@@ -47,13 +47,13 @@ function lt() {
|
|
|
47
47
|
zoom: 1
|
|
48
48
|
});
|
|
49
49
|
},
|
|
50
|
-
children: /* @__PURE__ */ o(
|
|
50
|
+
children: /* @__PURE__ */ o(Mo, {})
|
|
51
51
|
}),
|
|
52
52
|
/* @__PURE__ */ o(t, {
|
|
53
53
|
tip: a ? "关闭 Auto Focus" : "开启 Auto Focus",
|
|
54
54
|
active: a,
|
|
55
55
|
onClick: () => f(!a),
|
|
56
|
-
children: /* @__PURE__ */ o(
|
|
56
|
+
children: /* @__PURE__ */ o(So, {})
|
|
57
57
|
})
|
|
58
58
|
]
|
|
59
59
|
});
|
|
@@ -62,7 +62,7 @@ function t({ tip: r, shortcut: s, onClick: a, active: f, disabled: k, children:
|
|
|
62
62
|
const h = s ? `${r} (${s})` : r;
|
|
63
63
|
return /* @__PURE__ */ n("span", {
|
|
64
64
|
className: "flow-tip",
|
|
65
|
-
children: [/* @__PURE__ */ o(
|
|
65
|
+
children: [/* @__PURE__ */ o(fo, {
|
|
66
66
|
size: "xs",
|
|
67
67
|
variant: f ? "primary" : "ghost",
|
|
68
68
|
onClick: a,
|
|
@@ -80,32 +80,32 @@ function t({ tip: r, shortcut: s, onClick: a, active: f, disabled: k, children:
|
|
|
80
80
|
})]
|
|
81
81
|
});
|
|
82
82
|
}
|
|
83
|
-
function
|
|
84
|
-
const { showGrid:
|
|
85
|
-
const e =
|
|
86
|
-
|
|
87
|
-
}, [
|
|
88
|
-
const e =
|
|
89
|
-
|
|
90
|
-
}, [
|
|
91
|
-
|
|
92
|
-
}, []),
|
|
93
|
-
|
|
83
|
+
function ht({ onBack: r, onUndo: s, onRedo: a, canUndo: f, canRedo: k, onGroup: m, onGeoGroup: h, onUngroup: v, onExportPNG: x, onExportPDF: F, onPublish: z, compact: Y }) {
|
|
84
|
+
const { showGrid: R, setShowGrid: _, showPalette: M, setShowPalette: K, showInspector: j, setShowInspector: Q, showOutline: J, setShowOutline: X, showJson: L, setShowJson: oo, showAI: G, setShowAI: to, showMiniMap: P, setShowMiniMap: eo, showAnchors: I, setShowAnchors: io, presentation: Z, setPresentation: no, placementSnap: g, setPlacementSnap: lo } = H(), { doc: w, selection: p, currentCanvas: co, setDoc: U, currentCanvasId: A } = ko(), { exportJSON: E, importJSON: T, exportMarkdown: B } = bo(), { align: u, distribute: V, changeZIndex: b } = yo(), $ = _o(null), S = p.nodeIds.size + p.lineIds.size, ro = p.nodeIds.size > 0 && co.nodes.some((e) => p.nodeIds.has(e.id) && (e.type === "flowGroup" || e.type === "geometryGroup" || e.data.isGroup)), O = Object.values(w.canvases).some((e) => e.nodes.some((l) => l.type === "animAnchor")), so = C(() => {
|
|
85
|
+
const e = E(), l = new Blob([e], { type: "application/json" }), c = URL.createObjectURL(l);
|
|
86
|
+
D(c, `${q(w.title)}.json`), URL.revokeObjectURL(c);
|
|
87
|
+
}, [E, w.title]), ao = C(() => {
|
|
88
|
+
const e = B(), l = new Blob([e], { type: "text/markdown" }), c = URL.createObjectURL(l);
|
|
89
|
+
D(c, `${q(w.title)}.md`), URL.revokeObjectURL(c);
|
|
90
|
+
}, [B, w.title]), ho = C(() => {
|
|
91
|
+
$.current?.click();
|
|
92
|
+
}, []), po = C(() => {
|
|
93
|
+
U((e) => {
|
|
94
94
|
const l = e.canvases[A];
|
|
95
95
|
if (!l) return e;
|
|
96
96
|
const c = l.nodes.map((i) => i.type === "animAnchor" || i.type === "shapeSvg" || i.data.isGroup || i.type === "flowGroup" || i.type === "geometryGroup" ? i : {
|
|
97
97
|
...i,
|
|
98
98
|
data: {
|
|
99
99
|
...i.data,
|
|
100
|
-
...
|
|
100
|
+
...vo(Io(i.data))
|
|
101
101
|
}
|
|
102
|
-
}),
|
|
103
|
-
const
|
|
102
|
+
}), uo = l.edges.map((i) => {
|
|
103
|
+
const W = Co(i.data.strokeColor && i.data.strokeColor !== "#64748b" ? "emphasis" : "default");
|
|
104
104
|
return {
|
|
105
105
|
...i,
|
|
106
106
|
data: {
|
|
107
107
|
...i.data,
|
|
108
|
-
strokeColor: i.data.strokeColor && i.data.strokeColor.startsWith("theme:") ?
|
|
108
|
+
strokeColor: i.data.strokeColor && i.data.strokeColor.startsWith("theme:") ? W.color : i.data.strokeColor ?? W.color
|
|
109
109
|
}
|
|
110
110
|
};
|
|
111
111
|
});
|
|
@@ -116,36 +116,36 @@ function ct({ onBack: r, onUndo: s, onRedo: a, canUndo: f, canRedo: k, onGroup:
|
|
|
116
116
|
[A]: {
|
|
117
117
|
...l,
|
|
118
118
|
nodes: c,
|
|
119
|
-
edges:
|
|
119
|
+
edges: uo
|
|
120
120
|
}
|
|
121
121
|
}
|
|
122
122
|
};
|
|
123
123
|
});
|
|
124
|
-
}, [
|
|
124
|
+
}, [U, A]), mo = C((e) => {
|
|
125
|
+
const l = e.target.files?.[0];
|
|
126
|
+
if (!l) return;
|
|
127
|
+
const c = new FileReader();
|
|
128
|
+
c.onload = () => {
|
|
129
|
+
typeof c.result == "string" && T(c.result);
|
|
130
|
+
}, c.readAsText(l), e.target.value = "";
|
|
131
|
+
}, [T]);
|
|
125
132
|
return /* @__PURE__ */ n("div", {
|
|
126
|
-
className: "flow-toolbar"
|
|
133
|
+
className: `flow-toolbar${Y ? " flow-toolbar--compact" : ""}`,
|
|
127
134
|
children: [
|
|
128
135
|
/* @__PURE__ */ o("input", {
|
|
129
|
-
ref:
|
|
136
|
+
ref: $,
|
|
130
137
|
type: "file",
|
|
131
138
|
accept: ".json",
|
|
132
139
|
style: { display: "none" },
|
|
133
|
-
onChange:
|
|
134
|
-
const l = e.target.files?.[0];
|
|
135
|
-
if (!l) return;
|
|
136
|
-
const c = new FileReader();
|
|
137
|
-
c.onload = () => {
|
|
138
|
-
typeof c.result == "string" && E(c.result);
|
|
139
|
-
}, c.readAsText(l), e.target.value = "";
|
|
140
|
-
}, [E])
|
|
140
|
+
onChange: mo
|
|
141
141
|
}),
|
|
142
|
-
/* @__PURE__ */ o(
|
|
142
|
+
/* @__PURE__ */ o(wo, {}),
|
|
143
143
|
r && /* @__PURE__ */ n(N, { children: [/* @__PURE__ */ o("div", {
|
|
144
144
|
className: "flow-toolbar-group",
|
|
145
145
|
children: /* @__PURE__ */ o(t, {
|
|
146
146
|
tip: "返回列表",
|
|
147
147
|
onClick: r,
|
|
148
|
-
children: /* @__PURE__ */ o(
|
|
148
|
+
children: /* @__PURE__ */ o(Oo, {})
|
|
149
149
|
})
|
|
150
150
|
}), /* @__PURE__ */ o("div", { className: "flow-toolbar-divider" })] }),
|
|
151
151
|
(s || a) && /* @__PURE__ */ n("div", {
|
|
@@ -155,13 +155,13 @@ function ct({ onBack: r, onUndo: s, onRedo: a, canUndo: f, canRedo: k, onGroup:
|
|
|
155
155
|
shortcut: "Ctrl+Z",
|
|
156
156
|
onClick: s,
|
|
157
157
|
disabled: !f,
|
|
158
|
-
children: /* @__PURE__ */ o(
|
|
158
|
+
children: /* @__PURE__ */ o(Do, {})
|
|
159
159
|
}), a && /* @__PURE__ */ o(t, {
|
|
160
160
|
tip: "重做",
|
|
161
161
|
shortcut: "Ctrl+Shift+Z",
|
|
162
162
|
onClick: a,
|
|
163
163
|
disabled: !k,
|
|
164
|
-
children: /* @__PURE__ */ o(
|
|
164
|
+
children: /* @__PURE__ */ o($o, {})
|
|
165
165
|
})]
|
|
166
166
|
}),
|
|
167
167
|
p.nodeIds.size >= 2 && /* @__PURE__ */ n(N, { children: [/* @__PURE__ */ o("div", { className: "flow-toolbar-divider" }), /* @__PURE__ */ n("div", {
|
|
@@ -199,19 +199,19 @@ function ct({ onBack: r, onUndo: s, onRedo: a, canUndo: f, canRedo: k, onGroup:
|
|
|
199
199
|
}),
|
|
200
200
|
/* @__PURE__ */ o(t, {
|
|
201
201
|
tip: "水平平分",
|
|
202
|
-
onClick: () =>
|
|
202
|
+
onClick: () => V("horizontal"),
|
|
203
203
|
disabled: p.nodeIds.size < 3,
|
|
204
204
|
children: /* @__PURE__ */ o(d, { kind: "distribute-h" })
|
|
205
205
|
}),
|
|
206
206
|
/* @__PURE__ */ o(t, {
|
|
207
207
|
tip: "垂直平分",
|
|
208
|
-
onClick: () =>
|
|
208
|
+
onClick: () => V("vertical"),
|
|
209
209
|
disabled: p.nodeIds.size < 3,
|
|
210
210
|
children: /* @__PURE__ */ o(d, { kind: "distribute-v" })
|
|
211
211
|
})
|
|
212
212
|
]
|
|
213
213
|
})] }),
|
|
214
|
-
|
|
214
|
+
S >= 1 && /* @__PURE__ */ n(N, { children: [/* @__PURE__ */ o("div", { className: "flow-toolbar-divider" }), /* @__PURE__ */ n("div", {
|
|
215
215
|
className: "flow-toolbar-group",
|
|
216
216
|
children: [
|
|
217
217
|
/* @__PURE__ */ o(t, {
|
|
@@ -243,22 +243,22 @@ function ct({ onBack: r, onUndo: s, onRedo: a, canUndo: f, canRedo: k, onGroup:
|
|
|
243
243
|
tip: "成组",
|
|
244
244
|
shortcut: "⌘G",
|
|
245
245
|
onClick: m,
|
|
246
|
-
disabled:
|
|
247
|
-
children: /* @__PURE__ */ o(
|
|
246
|
+
disabled: S < 2,
|
|
247
|
+
children: /* @__PURE__ */ o(Lo, {})
|
|
248
248
|
}),
|
|
249
249
|
h && /* @__PURE__ */ o(t, {
|
|
250
250
|
tip: "几何分组",
|
|
251
251
|
shortcut: "⌘⌥G",
|
|
252
252
|
onClick: h,
|
|
253
|
-
disabled:
|
|
254
|
-
children: /* @__PURE__ */ o(
|
|
253
|
+
disabled: S < 2,
|
|
254
|
+
children: /* @__PURE__ */ o(jo, {})
|
|
255
255
|
}),
|
|
256
256
|
v && /* @__PURE__ */ o(t, {
|
|
257
257
|
tip: "取消成组",
|
|
258
258
|
shortcut: "⌘⇧G",
|
|
259
259
|
onClick: v,
|
|
260
|
-
disabled: !
|
|
261
|
-
children: /* @__PURE__ */ o(
|
|
260
|
+
disabled: !ro,
|
|
261
|
+
children: /* @__PURE__ */ o(qo, {})
|
|
262
262
|
})
|
|
263
263
|
]
|
|
264
264
|
})] }),
|
|
@@ -268,38 +268,44 @@ function ct({ onBack: r, onUndo: s, onRedo: a, canUndo: f, canRedo: k, onGroup:
|
|
|
268
268
|
children: [
|
|
269
269
|
/* @__PURE__ */ o(t, {
|
|
270
270
|
tip: "网格",
|
|
271
|
-
active:
|
|
272
|
-
onClick: () =>
|
|
273
|
-
children: /* @__PURE__ */ o(
|
|
271
|
+
active: R,
|
|
272
|
+
onClick: () => _(!R),
|
|
273
|
+
children: /* @__PURE__ */ o(Jo, {})
|
|
274
|
+
}),
|
|
275
|
+
/* @__PURE__ */ o(t, {
|
|
276
|
+
tip: g ? "放置吸附网格:开(盖章自动贴近网格)" : "放置吸附网格:关(自由放置)",
|
|
277
|
+
active: g,
|
|
278
|
+
onClick: () => lo(!g),
|
|
279
|
+
children: /* @__PURE__ */ o(Uo, {})
|
|
274
280
|
}),
|
|
275
281
|
/* @__PURE__ */ o(t, {
|
|
276
282
|
tip: "缩略图",
|
|
277
|
-
active:
|
|
278
|
-
onClick: () =>
|
|
279
|
-
children: /* @__PURE__ */ o(
|
|
283
|
+
active: P,
|
|
284
|
+
onClick: () => eo(!P),
|
|
285
|
+
children: /* @__PURE__ */ o(Eo, {})
|
|
280
286
|
}),
|
|
281
287
|
/* @__PURE__ */ o(t, {
|
|
282
288
|
tip: I ? "隐藏所有 Anchor 对象" : "显示所有 Anchor 对象",
|
|
283
289
|
active: I,
|
|
284
|
-
disabled: !
|
|
290
|
+
disabled: !O,
|
|
285
291
|
onClick: () => {
|
|
286
|
-
|
|
292
|
+
O && io(!I);
|
|
287
293
|
},
|
|
288
|
-
children: /* @__PURE__ */ o(
|
|
294
|
+
children: /* @__PURE__ */ o(go, { visible: I })
|
|
289
295
|
}),
|
|
290
296
|
/* @__PURE__ */ o(t, {
|
|
291
297
|
tip: "动画预览",
|
|
292
298
|
active: Z !== null,
|
|
293
|
-
onClick: () =>
|
|
299
|
+
onClick: () => no(Z ? null : {
|
|
294
300
|
current: 0,
|
|
295
301
|
showAnchor: !1
|
|
296
302
|
}),
|
|
297
|
-
children: /* @__PURE__ */ o(
|
|
303
|
+
children: /* @__PURE__ */ o(Bo, {})
|
|
298
304
|
}),
|
|
299
305
|
/* @__PURE__ */ o(t, {
|
|
300
306
|
tip: "应用 Archify 风格(当前画布)",
|
|
301
|
-
onClick:
|
|
302
|
-
children: /* @__PURE__ */ o(
|
|
307
|
+
onClick: po,
|
|
308
|
+
children: /* @__PURE__ */ o(Ao, {})
|
|
303
309
|
})
|
|
304
310
|
]
|
|
305
311
|
}),
|
|
@@ -309,33 +315,33 @@ function ct({ onBack: r, onUndo: s, onRedo: a, canUndo: f, canRedo: k, onGroup:
|
|
|
309
315
|
children: [
|
|
310
316
|
/* @__PURE__ */ o(t, {
|
|
311
317
|
tip: "形状面板",
|
|
312
|
-
active:
|
|
313
|
-
onClick: () =>
|
|
314
|
-
children: /* @__PURE__ */ o(
|
|
318
|
+
active: M,
|
|
319
|
+
onClick: () => K(!M),
|
|
320
|
+
children: /* @__PURE__ */ o(Wo, {})
|
|
315
321
|
}),
|
|
316
322
|
/* @__PURE__ */ o(t, {
|
|
317
323
|
tip: "属性面板",
|
|
318
|
-
active:
|
|
319
|
-
onClick: () =>
|
|
320
|
-
children: /* @__PURE__ */ o(
|
|
324
|
+
active: j,
|
|
325
|
+
onClick: () => Q(!j),
|
|
326
|
+
children: /* @__PURE__ */ o(Po, {})
|
|
321
327
|
}),
|
|
322
328
|
/* @__PURE__ */ o(t, {
|
|
323
329
|
tip: "大纲",
|
|
324
|
-
active:
|
|
325
|
-
onClick: () =>
|
|
326
|
-
children: /* @__PURE__ */ o(
|
|
330
|
+
active: J,
|
|
331
|
+
onClick: () => X(!J),
|
|
332
|
+
children: /* @__PURE__ */ o(To, {})
|
|
327
333
|
}),
|
|
328
334
|
/* @__PURE__ */ o(t, {
|
|
329
335
|
tip: "JSON",
|
|
330
|
-
active:
|
|
331
|
-
onClick: () =>
|
|
332
|
-
children: /* @__PURE__ */ o(
|
|
336
|
+
active: L,
|
|
337
|
+
onClick: () => oo(!L),
|
|
338
|
+
children: /* @__PURE__ */ o(Zo, {})
|
|
333
339
|
}),
|
|
334
340
|
/* @__PURE__ */ o(t, {
|
|
335
341
|
tip: "AI 助手",
|
|
336
|
-
active:
|
|
337
|
-
onClick: () =>
|
|
338
|
-
children: /* @__PURE__ */ o(
|
|
342
|
+
active: G,
|
|
343
|
+
onClick: () => to(!G),
|
|
344
|
+
children: /* @__PURE__ */ o(No, {})
|
|
339
345
|
})
|
|
340
346
|
]
|
|
341
347
|
}),
|
|
@@ -345,37 +351,37 @@ function ct({ onBack: r, onUndo: s, onRedo: a, canUndo: f, canRedo: k, onGroup:
|
|
|
345
351
|
children: [
|
|
346
352
|
/* @__PURE__ */ o(t, {
|
|
347
353
|
tip: "导入 JSON",
|
|
348
|
-
onClick:
|
|
349
|
-
children: /* @__PURE__ */ o(
|
|
354
|
+
onClick: ho,
|
|
355
|
+
children: /* @__PURE__ */ o(Go, {})
|
|
350
356
|
}),
|
|
351
357
|
/* @__PURE__ */ o(t, {
|
|
352
358
|
tip: "导出 JSON",
|
|
353
|
-
onClick:
|
|
354
|
-
children: /* @__PURE__ */ o(
|
|
359
|
+
onClick: so,
|
|
360
|
+
children: /* @__PURE__ */ o(xo, {})
|
|
355
361
|
}),
|
|
356
362
|
/* @__PURE__ */ o(t, {
|
|
357
363
|
tip: "导出 Markdown",
|
|
358
|
-
onClick:
|
|
359
|
-
children: /* @__PURE__ */ o(
|
|
364
|
+
onClick: ao,
|
|
365
|
+
children: /* @__PURE__ */ o(Fo, {})
|
|
360
366
|
}),
|
|
361
|
-
|
|
367
|
+
x && /* @__PURE__ */ o(t, {
|
|
362
368
|
tip: "导出 PNG",
|
|
363
369
|
onClick: () => {
|
|
364
|
-
|
|
370
|
+
x();
|
|
365
371
|
},
|
|
366
|
-
children: /* @__PURE__ */ o(
|
|
372
|
+
children: /* @__PURE__ */ o(Ro, {})
|
|
367
373
|
}),
|
|
368
|
-
|
|
374
|
+
F && O && /* @__PURE__ */ o(t, {
|
|
369
375
|
tip: "导出 PDF(按锦点顺序)",
|
|
370
376
|
onClick: () => {
|
|
371
|
-
|
|
377
|
+
F();
|
|
372
378
|
},
|
|
373
|
-
children: /* @__PURE__ */ o(
|
|
379
|
+
children: /* @__PURE__ */ o(zo, {})
|
|
374
380
|
}),
|
|
375
381
|
z && /* @__PURE__ */ o(t, {
|
|
376
382
|
tip: "发布与共享",
|
|
377
383
|
onClick: z,
|
|
378
|
-
children: /* @__PURE__ */ o(
|
|
384
|
+
children: /* @__PURE__ */ o(Vo, {})
|
|
379
385
|
})
|
|
380
386
|
]
|
|
381
387
|
})
|
|
@@ -383,8 +389,8 @@ function ct({ onBack: r, onUndo: s, onRedo: a, canUndo: f, canRedo: k, onGroup:
|
|
|
383
389
|
});
|
|
384
390
|
}
|
|
385
391
|
export {
|
|
386
|
-
|
|
387
|
-
|
|
392
|
+
dt as FlowZoomControls,
|
|
393
|
+
ht as default
|
|
388
394
|
};
|
|
389
395
|
|
|
390
396
|
//# sourceMappingURL=FlowToolbar.js.map
|