@zukhruf/diagram 0.3.28 → 0.3.29
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/README.md +2 -3
- package/dist/lib/compiler/diagram-compile.d.ts.map +1 -1
- package/dist/lib/compiler/diagram-compile.js +9 -9
- package/dist/lib/compiler/diagram-compile.js.map +1 -1
- package/dist/lib/layouts/graph/graph-layout.d.ts.map +1 -1
- package/dist/lib/layouts/graph/graph-layout.js +10 -17
- package/dist/lib/layouts/graph/graph-layout.js.map +1 -1
- package/dist/lib/model/endpoint-ref.d.ts +10 -0
- package/dist/lib/model/endpoint-ref.d.ts.map +1 -0
- package/dist/lib/model/endpoint-ref.js +17 -0
- package/dist/lib/model/endpoint-ref.js.map +1 -0
- package/dist/lib/renderers/webgpu/graph-flow-effects.js +7 -5
- package/dist/lib/renderers/webgpu/graph-flow-effects.js.map +1 -1
- package/package.json +3 -2
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Reads the `from` or `to` of a `DiagramEdge`: `nodeId`, or `nodeId:portId`
|
|
3
|
+
* for a node port. Only the first `:` splits the ref. Thus `'a:'` gives the
|
|
4
|
+
* port id `''`, and a ref with no `:` gives no port id.
|
|
5
|
+
*/
|
|
6
|
+
export declare function parseEndpointRef(ref: string): {
|
|
7
|
+
nodeId: string;
|
|
8
|
+
portId: string | undefined;
|
|
9
|
+
};
|
|
10
|
+
//# sourceMappingURL=endpoint-ref.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"endpoint-ref.d.ts","sourceRoot":"","sources":["../../../src/lib/model/endpoint-ref.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG;IAC7C,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;CAC5B,CAOA"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Reads the `from` or `to` of a `DiagramEdge`: `nodeId`, or `nodeId:portId`
|
|
3
|
+
* for a node port. Only the first `:` splits the ref. Thus `'a:'` gives the
|
|
4
|
+
* port id `''`, and a ref with no `:` gives no port id.
|
|
5
|
+
*/
|
|
6
|
+
export function parseEndpointRef(ref) {
|
|
7
|
+
const separator = ref.indexOf(':');
|
|
8
|
+
if (separator === -1) return {
|
|
9
|
+
nodeId: ref,
|
|
10
|
+
portId: undefined
|
|
11
|
+
};
|
|
12
|
+
return {
|
|
13
|
+
nodeId: ref.slice(0, separator),
|
|
14
|
+
portId: ref.slice(separator + 1)
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=endpoint-ref.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"endpoint-ref.js","names":["parseEndpointRef","ref","separator","indexOf","nodeId","portId","undefined","slice"],"sources":["../../../src/lib/model/endpoint-ref.ts"],"sourcesContent":["/**\n * Reads the `from` or `to` of a `DiagramEdge`: `nodeId`, or `nodeId:portId`\n * for a node port. Only the first `:` splits the ref. Thus `'a:'` gives the\n * port id `''`, and a ref with no `:` gives no port id.\n */\nexport function parseEndpointRef(ref: string): {\n nodeId: string;\n portId: string | undefined;\n} {\n const separator = ref.indexOf(':');\n if (separator === -1) return { nodeId: ref, portId: undefined };\n return {\n nodeId: ref.slice(0, separator),\n portId: ref.slice(separator + 1),\n };\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASA,gBAAgBA,CAACC,GAAW,EAG1C;EACA,MAAMC,SAAS,GAAGD,GAAG,CAACE,OAAO,CAAC,GAAG,CAAC;EAClC,IAAID,SAAS,KAAK,CAAC,CAAC,EAAE,OAAO;IAAEE,MAAM,EAAEH,GAAG;IAAEI,MAAM,EAAEC;EAAU,CAAC;EAC/D,OAAO;IACLF,MAAM,EAAEH,GAAG,CAACM,KAAK,CAAC,CAAC,EAAEL,SAAS,CAAC;IAC/BG,MAAM,EAAEJ,GAAG,CAACM,KAAK,CAACL,SAAS,GAAG,CAAC;EACjC,CAAC;AACH","ignoreList":[]}
|
|
@@ -146,13 +146,15 @@ function GraphFlowEffectsCanvas({
|
|
|
146
146
|
return;
|
|
147
147
|
}
|
|
148
148
|
// Import only for opted-in diagrams; the browser entry never loads Dawn.
|
|
149
|
-
const {
|
|
149
|
+
const [{
|
|
150
150
|
init,
|
|
151
151
|
surface,
|
|
152
152
|
storage,
|
|
153
153
|
draw,
|
|
154
154
|
frame
|
|
155
|
-
}
|
|
155
|
+
}, {
|
|
156
|
+
prepareShader
|
|
157
|
+
}] = await Promise.all([import('vgpu'), import('@vgpu/wgsl/prepare')]);
|
|
156
158
|
if (cancelled) return;
|
|
157
159
|
gpu = await init({
|
|
158
160
|
powerPreference: 'low-power',
|
|
@@ -164,8 +166,8 @@ function GraphFlowEffectsCanvas({
|
|
|
164
166
|
}
|
|
165
167
|
const context = gpu;
|
|
166
168
|
context.onError(fail);
|
|
167
|
-
void context.
|
|
168
|
-
if (!cancelled
|
|
169
|
+
void context.lost.then(info => {
|
|
170
|
+
if (!cancelled) fail(new Error(info.message));
|
|
169
171
|
});
|
|
170
172
|
const target = surface(context, canvas, {
|
|
171
173
|
autoResize: false,
|
|
@@ -198,7 +200,7 @@ function GraphFlowEffectsCanvas({
|
|
|
198
200
|
return Array.from(colorContext.getImageData(0, 0, 1, 1).data, value => value / 255);
|
|
199
201
|
};
|
|
200
202
|
const flow = draw(context, {
|
|
201
|
-
shader: flowShader,
|
|
203
|
+
shader: prepareShader(flowShader, 'flow.wgsl'),
|
|
202
204
|
vertices: 6,
|
|
203
205
|
instances: data.length / 12,
|
|
204
206
|
blend: 'premultiplied',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"graph-flow-effects.js","names":["cancelFrame","frame","motionFrame","memo","useEffect","useRef","useState","useDiagramTheme","flowShader","jsx","_jsx","jsxs","_jsxs","GraphFlowEffects","GraphFlowEffectsCanvas","a","b","progress","playhead","mode","viewBox","x","y","w","h","edges","length","every","edge","i","other","undefined","d","index","segment","start","end","direction","headless","dim","segmentData","values","forEach","path","document","createElementNS","setAttribute","pathLength","getTotalLength","steps","Math","max","ceil","first","rest","Array","from","_","getPointAtLength","pieces","to","push","hypot","total","reduce","sum","distance","reverse","Float32Array","canvasRef","accent","failure","setFailure","canvas","current","data","reducedMotion","matchMedia","cancelled","visible","gpu","render","resize","elapsed","previousTime","readPlayhead","get","stop","tick","fail","error","dispose","dataset","diagramEffectsStatus","Error","message","String","paint","hidden","matches","timestamp","min","resolveStatus","active","synchronize","update","observer","IntersectionObserver","entry","isIntersecting","observe","sizeObserver","ResizeObserver","svg","closest","addEventListener","unsubscribe","on","unsubscribePlayhead","init","surface","storage","draw","powerPreference","label","context","onError","lost","then","info","reason","target","autoResize","size","clearColor","alphaMode","rect","getBoundingClientRect","dpr","devicePixelRatio","limit","limits","maxTextureDimension2D","round","width","height","segments","byteLength","write","colorCanvas","createElement","colorContext","getContext","previousColor","readTint","color","getComputedStyle","clearRect","fillStyle","fillRect","getImageData","value","flow","shader","vertices","instances","blend","set","bounds","tint","time","compile","colors","format","sampleCount","disposed","pass","catch","disconnect","removeEventListener","className","children","ref","style","visibility","role"],"sources":["../../../../src/lib/renderers/webgpu/graph-flow-effects.tsx"],"sourcesContent":["import {\n type MotionValue,\n cancelFrame,\n frame as motionFrame,\n} from 'motion/react';\nimport { memo, useEffect, useRef, useState } from 'react';\nimport type { Gpu } from 'vgpu';\n\nimport type { RoutedEdge } from '../../layouts/graph/graph-layout.ts';\nimport type { Box } from '../../model/diagram-ir.ts';\nimport { type DiagramMode, useDiagramTheme } from '../../react/chrome/theme.ts';\nimport { flowShader } from './flow-shader.ts';\n\ntype FlowEdge = RoutedEdge & {\n index: number;\n segment: { start: number; end: number };\n};\n\ntype FlowEffectsProps = {\n edges: FlowEdge[];\n viewBox: Box;\n progress: MotionValue<number>;\n mode: DiagramMode;\n playhead?: MotionValue<number> | undefined;\n};\n\n// Activation changes SVG node styling, but must not recreate the GPU device.\nexport const GraphFlowEffects = memo(\n GraphFlowEffectsCanvas,\n (a, b) =>\n a.progress === b.progress &&\n a.playhead === b.playhead &&\n a.mode === b.mode &&\n a.viewBox.x === b.viewBox.x &&\n a.viewBox.y === b.viewBox.y &&\n a.viewBox.w === b.viewBox.w &&\n a.viewBox.h === b.viewBox.h &&\n a.edges.length === b.edges.length &&\n a.edges.every((edge, i) => {\n const other = b.edges[i];\n return (\n other !== undefined &&\n edge.d === other.d &&\n edge.index === other.index &&\n edge.segment.start === other.segment.start &&\n edge.segment.end === other.segment.end &&\n edge.edge.direction === other.edge.direction &&\n edge.edge.headless === other.edge.headless &&\n edge.edge.dim === other.edge.dim\n );\n }),\n);\n\nfunction segmentData(edges: FlowEdge[]) {\n const values: number[] = [];\n edges.forEach(({ edge, d, segment, index }) => {\n if (edge.headless || edge.direction === 'none') return;\n // Sample the SVG's actual rounded path once when uploading the GPU mesh.\n const path = document.createElementNS('http://www.w3.org/2000/svg', 'path');\n path.setAttribute('d', d);\n const pathLength = path.getTotalLength();\n const steps = Math.max(1, Math.ceil(pathLength / 4));\n const [first, ...rest] = Array.from({ length: steps + 1 }, (_, i) =>\n path.getPointAtLength((i / steps) * pathLength),\n );\n if (!first) return;\n const pieces: { from: DOMPoint; to: DOMPoint; length: number }[] = [];\n let from = first;\n for (const to of rest) {\n pieces.push({\n from,\n to,\n length: Math.hypot(to.x - from.x, to.y - from.y),\n });\n from = to;\n }\n const total = pieces.reduce((sum, { length }) => sum + length, 0);\n let distance = 0;\n pieces.forEach(({ from, to, length }) => {\n if (length === 0) return;\n for (\n let reverse = 0;\n reverse < (edge.direction === 'both' ? 2 : 1);\n reverse++\n ) {\n values.push(\n from.x,\n from.y,\n to.x,\n to.y,\n distance,\n length,\n total,\n reverse,\n segment.start,\n segment.start + (segment.end - segment.start) * 0.85,\n index,\n edge.dim ? 0.45 : 1,\n );\n }\n distance += length;\n });\n });\n return new Float32Array(values);\n}\n\nfunction GraphFlowEffectsCanvas({\n edges,\n viewBox,\n progress,\n mode,\n playhead,\n}: FlowEffectsProps) {\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const { accent } = useDiagramTheme();\n const [failure, setFailure] = useState<string>();\n\n useEffect(() => {\n const canvas = canvasRef.current;\n if (!canvas) return;\n const data = segmentData(edges);\n const reducedMotion = matchMedia('(prefers-reduced-motion: reduce)');\n let cancelled = false;\n let visible = false;\n let gpu: Gpu | undefined;\n let render: (() => void) | undefined;\n let resize: (() => void) | undefined;\n let elapsed = 0;\n let previousTime = 0;\n\n const readPlayhead = () => (playhead ? Math.max(0, playhead.get()) : -1);\n const stop = () => {\n cancelFrame(tick);\n previousTime = 0;\n };\n const fail = (error: unknown) => {\n if (cancelled) return;\n stop();\n render = undefined;\n resize = undefined;\n gpu?.dispose();\n canvas.dataset.diagramEffectsStatus = 'unavailable';\n setFailure(error instanceof Error ? error.message : String(error));\n };\n const paint = () => {\n if (!render || !visible || document.hidden || reducedMotion.matches)\n return;\n try {\n render();\n } catch (error) {\n fail(error);\n }\n };\n function tick({ timestamp }: { timestamp: number }) {\n if (previousTime)\n elapsed += Math.min(timestamp - previousTime, 64) / 1000;\n previousTime = timestamp;\n paint();\n }\n const resolveStatus = (active: boolean) => {\n if (reducedMotion.matches) return 'reduced-motion';\n if (!active) return 'paused';\n if (playhead) return 'controlled';\n return mode;\n };\n const synchronize = () => {\n stop();\n const active = visible && !document.hidden && !reducedMotion.matches;\n if (!render) return;\n canvas.dataset.diagramEffectsStatus = resolveStatus(active);\n if (active && mode === 'reveal' && !playhead)\n motionFrame.update(tick, true);\n else if (active) paint();\n };\n const observer = new IntersectionObserver(([entry]) => {\n if (!entry) return;\n visible = entry.isIntersecting;\n synchronize();\n });\n observer.observe(canvas);\n const sizeObserver = new ResizeObserver(() => {\n try {\n resize?.();\n paint();\n } catch (error) {\n fail(error);\n }\n });\n const svg = canvas.closest('svg');\n if (svg) sizeObserver.observe(svg);\n document.addEventListener('visibilitychange', synchronize);\n reducedMotion.addEventListener('change', synchronize);\n const unsubscribe = progress.on('change', paint);\n const unsubscribePlayhead = playhead?.on('change', paint);\n\n const start = async () => {\n if (!data.length) {\n canvas.dataset.diagramEffectsStatus = 'empty';\n return;\n }\n // Import only for opted-in diagrams; the browser entry never loads Dawn.\n const { init, surface, storage, draw, frame } = await import('vgpu');\n if (cancelled) return;\n gpu = await init({ powerPreference: 'low-power', label: 'diagram-flow' });\n if (cancelled) {\n gpu.dispose();\n return;\n }\n const context = gpu;\n context.onError(fail);\n void context.gpu.lost.then((info) => {\n if (!cancelled && info.reason !== 'destroyed')\n fail(new Error(info.message));\n });\n const target = surface(context, canvas, {\n autoResize: false,\n size: [1, 1],\n clearColor: [0, 0, 0, 0],\n alphaMode: 'premultiplied',\n });\n resize = () => {\n const rect = canvas.getBoundingClientRect();\n const dpr = Math.min(devicePixelRatio, 2);\n const limit = context.gpu.limits.maxTextureDimension2D;\n target.resize([\n Math.max(1, Math.min(limit, Math.round(rect.width * dpr))),\n Math.max(1, Math.min(limit, Math.round(rect.height * dpr))),\n ]);\n };\n resize();\n const segments = storage(context, data.byteLength, 'read');\n segments.write(data);\n // Let the browser resolve CSS variables and all supported CSS color forms.\n const colorCanvas = document.createElement('canvas');\n colorCanvas.width = colorCanvas.height = 1;\n const colorContext = colorCanvas.getContext('2d');\n if (!colorContext)\n throw new Error('Unable to resolve the diagram accent.');\n let previousColor = '';\n const readTint = () => {\n const color = getComputedStyle(canvas).color;\n if (color === previousColor) return;\n previousColor = color;\n colorContext.clearRect(0, 0, 1, 1);\n colorContext.fillStyle = color;\n colorContext.fillRect(0, 0, 1, 1);\n return Array.from(\n colorContext.getImageData(0, 0, 1, 1).data,\n (value) => value / 255,\n );\n };\n const flow = draw(context, {\n shader: flowShader,\n vertices: 6,\n instances: data.length / 12,\n blend: 'premultiplied',\n set: {\n segments,\n bounds: [viewBox.x, viewBox.y, viewBox.w, viewBox.h],\n tint: readTint(),\n time: 0,\n progress: progress.get(),\n playhead: readPlayhead(),\n },\n });\n await flow.compile({\n colors: [target.format],\n sampleCount: target.sampleCount,\n });\n if (cancelled || context.disposed) return;\n setFailure(undefined);\n render = () => {\n const tint = readTint();\n if (tint) flow.set({ tint });\n flow.set({\n progress: progress.get(),\n playhead: readPlayhead(),\n time: mode === 'scrub' ? progress.get() * 6 : elapsed,\n });\n frame(context, (frame) => frame.pass(target, flow));\n };\n synchronize();\n };\n void start().catch(fail);\n return () => {\n cancelled = true;\n stop();\n unsubscribe();\n unsubscribePlayhead?.();\n observer.disconnect();\n sizeObserver.disconnect();\n document.removeEventListener('visibilitychange', synchronize);\n reducedMotion.removeEventListener('change', synchronize);\n gpu?.dispose();\n };\n }, [edges, viewBox, progress, mode, accent, playhead]);\n\n return (\n <foreignObject\n x={viewBox.x}\n y={viewBox.y}\n width={viewBox.w}\n height={viewBox.h}\n className=\"pointer-events-none\"\n data-diagram-effects=\"flow\"\n >\n <div className=\"relative size-full\">\n <canvas\n ref={canvasRef}\n aria-hidden=\"true\"\n className=\"block size-full motion-reduce:hidden\"\n data-diagram-effects-status=\"initializing\"\n data-diagram-effects-error={failure}\n style={{ color: accent, visibility: failure ? 'hidden' : undefined }}\n />\n {failure && (\n <p\n role=\"status\"\n className=\"absolute bottom-0 left-0 text-xs text-pretty text-[var(--dgm-dim)]\"\n >\n Flow animation is unavailable in this browser.\n </p>\n )}\n </div>\n </foreignObject>\n );\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"graph-flow-effects.js","names":["cancelFrame","frame","motionFrame","memo","useEffect","useRef","useState","useDiagramTheme","flowShader","jsx","_jsx","jsxs","_jsxs","GraphFlowEffects","GraphFlowEffectsCanvas","a","b","progress","playhead","mode","viewBox","x","y","w","h","edges","length","every","edge","i","other","undefined","d","index","segment","start","end","direction","headless","dim","segmentData","values","forEach","path","document","createElementNS","setAttribute","pathLength","getTotalLength","steps","Math","max","ceil","first","rest","Array","from","_","getPointAtLength","pieces","to","push","hypot","total","reduce","sum","distance","reverse","Float32Array","canvasRef","accent","failure","setFailure","canvas","current","data","reducedMotion","matchMedia","cancelled","visible","gpu","render","resize","elapsed","previousTime","readPlayhead","get","stop","tick","fail","error","dispose","dataset","diagramEffectsStatus","Error","message","String","paint","hidden","matches","timestamp","min","resolveStatus","active","synchronize","update","observer","IntersectionObserver","entry","isIntersecting","observe","sizeObserver","ResizeObserver","svg","closest","addEventListener","unsubscribe","on","unsubscribePlayhead","init","surface","storage","draw","prepareShader","Promise","all","powerPreference","label","context","onError","lost","then","info","target","autoResize","size","clearColor","alphaMode","rect","getBoundingClientRect","dpr","devicePixelRatio","limit","limits","maxTextureDimension2D","round","width","height","segments","byteLength","write","colorCanvas","createElement","colorContext","getContext","previousColor","readTint","color","getComputedStyle","clearRect","fillStyle","fillRect","getImageData","value","flow","shader","vertices","instances","blend","set","bounds","tint","time","compile","colors","format","sampleCount","disposed","pass","catch","disconnect","removeEventListener","className","children","ref","style","visibility","role"],"sources":["../../../../src/lib/renderers/webgpu/graph-flow-effects.tsx"],"sourcesContent":["import {\n type MotionValue,\n cancelFrame,\n frame as motionFrame,\n} from 'motion/react';\nimport { memo, useEffect, useRef, useState } from 'react';\nimport type { Gpu } from 'vgpu';\n\nimport type { RoutedEdge } from '../../layouts/graph/graph-layout.ts';\nimport type { Box } from '../../model/diagram-ir.ts';\nimport { type DiagramMode, useDiagramTheme } from '../../react/chrome/theme.ts';\nimport { flowShader } from './flow-shader.ts';\n\ntype FlowEdge = RoutedEdge & {\n index: number;\n segment: { start: number; end: number };\n};\n\ntype FlowEffectsProps = {\n edges: FlowEdge[];\n viewBox: Box;\n progress: MotionValue<number>;\n mode: DiagramMode;\n playhead?: MotionValue<number> | undefined;\n};\n\n// Activation changes SVG node styling, but must not recreate the GPU device.\nexport const GraphFlowEffects = memo(\n GraphFlowEffectsCanvas,\n (a, b) =>\n a.progress === b.progress &&\n a.playhead === b.playhead &&\n a.mode === b.mode &&\n a.viewBox.x === b.viewBox.x &&\n a.viewBox.y === b.viewBox.y &&\n a.viewBox.w === b.viewBox.w &&\n a.viewBox.h === b.viewBox.h &&\n a.edges.length === b.edges.length &&\n a.edges.every((edge, i) => {\n const other = b.edges[i];\n return (\n other !== undefined &&\n edge.d === other.d &&\n edge.index === other.index &&\n edge.segment.start === other.segment.start &&\n edge.segment.end === other.segment.end &&\n edge.edge.direction === other.edge.direction &&\n edge.edge.headless === other.edge.headless &&\n edge.edge.dim === other.edge.dim\n );\n }),\n);\n\nfunction segmentData(edges: FlowEdge[]) {\n const values: number[] = [];\n edges.forEach(({ edge, d, segment, index }) => {\n if (edge.headless || edge.direction === 'none') return;\n // Sample the SVG's actual rounded path once when uploading the GPU mesh.\n const path = document.createElementNS('http://www.w3.org/2000/svg', 'path');\n path.setAttribute('d', d);\n const pathLength = path.getTotalLength();\n const steps = Math.max(1, Math.ceil(pathLength / 4));\n const [first, ...rest] = Array.from({ length: steps + 1 }, (_, i) =>\n path.getPointAtLength((i / steps) * pathLength),\n );\n if (!first) return;\n const pieces: { from: DOMPoint; to: DOMPoint; length: number }[] = [];\n let from = first;\n for (const to of rest) {\n pieces.push({\n from,\n to,\n length: Math.hypot(to.x - from.x, to.y - from.y),\n });\n from = to;\n }\n const total = pieces.reduce((sum, { length }) => sum + length, 0);\n let distance = 0;\n pieces.forEach(({ from, to, length }) => {\n if (length === 0) return;\n for (\n let reverse = 0;\n reverse < (edge.direction === 'both' ? 2 : 1);\n reverse++\n ) {\n values.push(\n from.x,\n from.y,\n to.x,\n to.y,\n distance,\n length,\n total,\n reverse,\n segment.start,\n segment.start + (segment.end - segment.start) * 0.85,\n index,\n edge.dim ? 0.45 : 1,\n );\n }\n distance += length;\n });\n });\n return new Float32Array(values);\n}\n\nfunction GraphFlowEffectsCanvas({\n edges,\n viewBox,\n progress,\n mode,\n playhead,\n}: FlowEffectsProps) {\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const { accent } = useDiagramTheme();\n const [failure, setFailure] = useState<string>();\n\n useEffect(() => {\n const canvas = canvasRef.current;\n if (!canvas) return;\n const data = segmentData(edges);\n const reducedMotion = matchMedia('(prefers-reduced-motion: reduce)');\n let cancelled = false;\n let visible = false;\n let gpu: Gpu | undefined;\n let render: (() => void) | undefined;\n let resize: (() => void) | undefined;\n let elapsed = 0;\n let previousTime = 0;\n\n const readPlayhead = () => (playhead ? Math.max(0, playhead.get()) : -1);\n const stop = () => {\n cancelFrame(tick);\n previousTime = 0;\n };\n const fail = (error: unknown) => {\n if (cancelled) return;\n stop();\n render = undefined;\n resize = undefined;\n gpu?.dispose();\n canvas.dataset.diagramEffectsStatus = 'unavailable';\n setFailure(error instanceof Error ? error.message : String(error));\n };\n const paint = () => {\n if (!render || !visible || document.hidden || reducedMotion.matches)\n return;\n try {\n render();\n } catch (error) {\n fail(error);\n }\n };\n function tick({ timestamp }: { timestamp: number }) {\n if (previousTime)\n elapsed += Math.min(timestamp - previousTime, 64) / 1000;\n previousTime = timestamp;\n paint();\n }\n const resolveStatus = (active: boolean) => {\n if (reducedMotion.matches) return 'reduced-motion';\n if (!active) return 'paused';\n if (playhead) return 'controlled';\n return mode;\n };\n const synchronize = () => {\n stop();\n const active = visible && !document.hidden && !reducedMotion.matches;\n if (!render) return;\n canvas.dataset.diagramEffectsStatus = resolveStatus(active);\n if (active && mode === 'reveal' && !playhead)\n motionFrame.update(tick, true);\n else if (active) paint();\n };\n const observer = new IntersectionObserver(([entry]) => {\n if (!entry) return;\n visible = entry.isIntersecting;\n synchronize();\n });\n observer.observe(canvas);\n const sizeObserver = new ResizeObserver(() => {\n try {\n resize?.();\n paint();\n } catch (error) {\n fail(error);\n }\n });\n const svg = canvas.closest('svg');\n if (svg) sizeObserver.observe(svg);\n document.addEventListener('visibilitychange', synchronize);\n reducedMotion.addEventListener('change', synchronize);\n const unsubscribe = progress.on('change', paint);\n const unsubscribePlayhead = playhead?.on('change', paint);\n\n const start = async () => {\n if (!data.length) {\n canvas.dataset.diagramEffectsStatus = 'empty';\n return;\n }\n // Import only for opted-in diagrams; the browser entry never loads Dawn.\n const [{ init, surface, storage, draw, frame }, { prepareShader }] =\n await Promise.all([import('vgpu'), import('@vgpu/wgsl/prepare')]);\n if (cancelled) return;\n gpu = await init({ powerPreference: 'low-power', label: 'diagram-flow' });\n if (cancelled) {\n gpu.dispose();\n return;\n }\n const context = gpu;\n context.onError(fail);\n void context.lost.then((info) => {\n if (!cancelled) fail(new Error(info.message));\n });\n const target = surface(context, canvas, {\n autoResize: false,\n size: [1, 1],\n clearColor: [0, 0, 0, 0],\n alphaMode: 'premultiplied',\n });\n resize = () => {\n const rect = canvas.getBoundingClientRect();\n const dpr = Math.min(devicePixelRatio, 2);\n const limit = context.gpu.limits.maxTextureDimension2D;\n target.resize([\n Math.max(1, Math.min(limit, Math.round(rect.width * dpr))),\n Math.max(1, Math.min(limit, Math.round(rect.height * dpr))),\n ]);\n };\n resize();\n const segments = storage(context, data.byteLength, 'read');\n segments.write(data);\n // Let the browser resolve CSS variables and all supported CSS color forms.\n const colorCanvas = document.createElement('canvas');\n colorCanvas.width = colorCanvas.height = 1;\n const colorContext = colorCanvas.getContext('2d');\n if (!colorContext)\n throw new Error('Unable to resolve the diagram accent.');\n let previousColor = '';\n const readTint = () => {\n const color = getComputedStyle(canvas).color;\n if (color === previousColor) return;\n previousColor = color;\n colorContext.clearRect(0, 0, 1, 1);\n colorContext.fillStyle = color;\n colorContext.fillRect(0, 0, 1, 1);\n return Array.from(\n colorContext.getImageData(0, 0, 1, 1).data,\n (value) => value / 255,\n );\n };\n const flow = draw(context, {\n shader: prepareShader(flowShader, 'flow.wgsl'),\n vertices: 6,\n instances: data.length / 12,\n blend: 'premultiplied',\n set: {\n segments,\n bounds: [viewBox.x, viewBox.y, viewBox.w, viewBox.h],\n tint: readTint(),\n time: 0,\n progress: progress.get(),\n playhead: readPlayhead(),\n },\n });\n await flow.compile({\n colors: [target.format],\n sampleCount: target.sampleCount,\n });\n if (cancelled || context.disposed) return;\n setFailure(undefined);\n render = () => {\n const tint = readTint();\n if (tint) flow.set({ tint });\n flow.set({\n progress: progress.get(),\n playhead: readPlayhead(),\n time: mode === 'scrub' ? progress.get() * 6 : elapsed,\n });\n frame(context, (frame) => frame.pass(target, flow));\n };\n synchronize();\n };\n void start().catch(fail);\n return () => {\n cancelled = true;\n stop();\n unsubscribe();\n unsubscribePlayhead?.();\n observer.disconnect();\n sizeObserver.disconnect();\n document.removeEventListener('visibilitychange', synchronize);\n reducedMotion.removeEventListener('change', synchronize);\n gpu?.dispose();\n };\n }, [edges, viewBox, progress, mode, accent, playhead]);\n\n return (\n <foreignObject\n x={viewBox.x}\n y={viewBox.y}\n width={viewBox.w}\n height={viewBox.h}\n className=\"pointer-events-none\"\n data-diagram-effects=\"flow\"\n >\n <div className=\"relative size-full\">\n <canvas\n ref={canvasRef}\n aria-hidden=\"true\"\n className=\"block size-full motion-reduce:hidden\"\n data-diagram-effects-status=\"initializing\"\n data-diagram-effects-error={failure}\n style={{ color: accent, visibility: failure ? 'hidden' : undefined }}\n />\n {failure && (\n <p\n role=\"status\"\n className=\"absolute bottom-0 left-0 text-xs text-pretty text-[var(--dgm-dim)]\"\n >\n Flow animation is unavailable in this browser.\n </p>\n )}\n </div>\n </foreignObject>\n );\n}\n"],"mappings":"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","ignoreList":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@zukhruf/diagram",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.29",
|
|
4
4
|
"description": "Architecture and sequence diagrams as React components: declare nodes, edges, lanes and signals, and render them as SVG, HTML or canvas.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -44,8 +44,9 @@
|
|
|
44
44
|
"access": "public"
|
|
45
45
|
},
|
|
46
46
|
"dependencies": {
|
|
47
|
+
"@vgpu/wgsl": "^0.6.0",
|
|
47
48
|
"cn": "^0.4.0",
|
|
48
|
-
"vgpu": "^0.
|
|
49
|
+
"vgpu": "^0.6.0"
|
|
49
50
|
},
|
|
50
51
|
"peerDependencies": {
|
|
51
52
|
"motion": "^12.38.0",
|