@bpmnkit/plugins 0.0.16 → 0.0.18
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 -0
- package/dist/ai-bridge/panel.js +29 -3
- package/dist/live-mode/css.d.ts +4 -0
- package/dist/live-mode/css.js +170 -0
- package/dist/live-mode/index.d.ts +42 -0
- package/dist/live-mode/index.js +479 -0
- package/dist/pattern-advisor/css.d.ts +4 -0
- package/dist/pattern-advisor/css.js +198 -0
- package/dist/pattern-advisor/index.d.ts +20 -0
- package/dist/pattern-advisor/index.js +233 -0
- package/dist/process-runner/css.js +128 -0
- package/dist/process-runner/index.d.ts +52 -0
- package/dist/process-runner/index.js +508 -19
- package/dist/storage/storage-api.d.ts +6 -0
- package/dist/storage/storage-api.js +12 -0
- package/dist/story-view/css.d.ts +4 -0
- package/dist/story-view/css.js +259 -0
- package/dist/story-view/index.d.ts +33 -0
- package/dist/story-view/index.js +294 -0
- package/dist/variable-flow/css.d.ts +2 -0
- package/dist/variable-flow/css.js +98 -0
- package/dist/variable-flow/index.d.ts +12 -0
- package/dist/variable-flow/index.js +226 -0
- package/package.json +21 -5
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
const CSS = `
|
|
2
|
+
.bpmnkit-vf-producer [data-bpmnkit-shape-bg],
|
|
3
|
+
.bpmnkit-vf-producer rect.djs-outline {
|
|
4
|
+
outline: 2px solid var(--bpmnkit-success, #16a34a);
|
|
5
|
+
outline-offset: 2px;
|
|
6
|
+
}
|
|
7
|
+
.bpmnkit-vf-consumer [data-bpmnkit-shape-bg],
|
|
8
|
+
.bpmnkit-vf-consumer rect.djs-outline {
|
|
9
|
+
outline: 2px solid var(--bpmnkit-accent, #1a56db);
|
|
10
|
+
outline-offset: 2px;
|
|
11
|
+
}
|
|
12
|
+
.bpmnkit-vf-both [data-bpmnkit-shape-bg],
|
|
13
|
+
.bpmnkit-vf-both rect.djs-outline {
|
|
14
|
+
outline: 2px solid var(--bpmnkit-teal, #0d9488);
|
|
15
|
+
outline-offset: 2px;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/* Tooltip */
|
|
19
|
+
.bpmnkit-vf-tooltip {
|
|
20
|
+
position: fixed;
|
|
21
|
+
z-index: 10000;
|
|
22
|
+
pointer-events: none;
|
|
23
|
+
background: var(--bpmnkit-surface, #fff);
|
|
24
|
+
border: 1px solid var(--bpmnkit-border, #d0d0e8);
|
|
25
|
+
border-radius: 6px;
|
|
26
|
+
padding: 8px 10px;
|
|
27
|
+
font-family: var(--bpmnkit-font, system-ui, sans-serif);
|
|
28
|
+
font-size: 12px;
|
|
29
|
+
color: var(--bpmnkit-fg, #1a1a2e);
|
|
30
|
+
box-shadow: 0 4px 12px rgba(0,0,0,0.12);
|
|
31
|
+
max-width: 280px;
|
|
32
|
+
white-space: nowrap;
|
|
33
|
+
}
|
|
34
|
+
.bpmnkit-vf-tooltip-title {
|
|
35
|
+
font-weight: 600;
|
|
36
|
+
margin-bottom: 6px;
|
|
37
|
+
color: var(--bpmnkit-fg-muted, #6666a0);
|
|
38
|
+
font-size: 11px;
|
|
39
|
+
text-transform: uppercase;
|
|
40
|
+
letter-spacing: 0.04em;
|
|
41
|
+
}
|
|
42
|
+
.bpmnkit-vf-tooltip-row {
|
|
43
|
+
display: flex;
|
|
44
|
+
align-items: center;
|
|
45
|
+
gap: 6px;
|
|
46
|
+
padding: 2px 0;
|
|
47
|
+
}
|
|
48
|
+
.bpmnkit-vf-tooltip-role {
|
|
49
|
+
display: inline-block;
|
|
50
|
+
width: 8px;
|
|
51
|
+
height: 8px;
|
|
52
|
+
border-radius: 50%;
|
|
53
|
+
flex-shrink: 0;
|
|
54
|
+
}
|
|
55
|
+
.bpmnkit-vf-tooltip-role-writes {
|
|
56
|
+
background: var(--bpmnkit-success, #16a34a);
|
|
57
|
+
}
|
|
58
|
+
.bpmnkit-vf-tooltip-role-reads {
|
|
59
|
+
background: var(--bpmnkit-accent, #1a56db);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/* Legend panel */
|
|
63
|
+
.bpmnkit-vf-legend {
|
|
64
|
+
display: flex;
|
|
65
|
+
gap: 12px;
|
|
66
|
+
align-items: center;
|
|
67
|
+
flex-wrap: wrap;
|
|
68
|
+
padding: 6px 8px;
|
|
69
|
+
font-family: var(--bpmnkit-font, system-ui, sans-serif);
|
|
70
|
+
font-size: 12px;
|
|
71
|
+
color: var(--bpmnkit-fg-muted, #6666a0);
|
|
72
|
+
background: var(--bpmnkit-surface, #fff);
|
|
73
|
+
border-top: 1px solid var(--bpmnkit-border, #d0d0e8);
|
|
74
|
+
}
|
|
75
|
+
.bpmnkit-vf-legend-item {
|
|
76
|
+
display: flex;
|
|
77
|
+
align-items: center;
|
|
78
|
+
gap: 5px;
|
|
79
|
+
}
|
|
80
|
+
.bpmnkit-vf-legend-dot {
|
|
81
|
+
width: 10px;
|
|
82
|
+
height: 10px;
|
|
83
|
+
border-radius: 50%;
|
|
84
|
+
}
|
|
85
|
+
.bpmnkit-vf-legend-dot-writes { background: var(--bpmnkit-success, #16a34a); }
|
|
86
|
+
.bpmnkit-vf-legend-dot-reads { background: var(--bpmnkit-accent, #1a56db); }
|
|
87
|
+
.bpmnkit-vf-legend-dot-both { background: var(--bpmnkit-teal, #0d9488); }
|
|
88
|
+
`;
|
|
89
|
+
let injected = false;
|
|
90
|
+
export function injectVariableFlowStyles() {
|
|
91
|
+
if (injected)
|
|
92
|
+
return;
|
|
93
|
+
injected = true;
|
|
94
|
+
const style = document.createElement("style");
|
|
95
|
+
style.textContent = CSS;
|
|
96
|
+
document.head.appendChild(style);
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=css.js.map
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { CanvasPlugin } from "@bpmnkit/canvas";
|
|
2
|
+
export interface VariableFlowOptions {
|
|
3
|
+
/** Container element to mount the legend into. */
|
|
4
|
+
container?: HTMLElement;
|
|
5
|
+
}
|
|
6
|
+
export interface VariableFlowPlugin extends CanvasPlugin {
|
|
7
|
+
readonly name: "variable-flow";
|
|
8
|
+
/** Legend element showing the color key. */
|
|
9
|
+
readonly legend: HTMLElement;
|
|
10
|
+
}
|
|
11
|
+
export declare function createVariableFlowPlugin(options?: VariableFlowOptions): VariableFlowPlugin;
|
|
12
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
import { optimize } from "@bpmnkit/core";
|
|
2
|
+
import { injectVariableFlowStyles } from "./css.js";
|
|
3
|
+
// ── Plugin factory ────────────────────────────────────────────────────────────
|
|
4
|
+
export function createVariableFlowPlugin(options) {
|
|
5
|
+
let canvasApi = null;
|
|
6
|
+
const unsubs = [];
|
|
7
|
+
// Per-element role maps derived from data-flow/role findings
|
|
8
|
+
const elementProduces = new Map();
|
|
9
|
+
const elementConsumes = new Map();
|
|
10
|
+
// Per-edge scope map derived from data-flow/edge-scope findings
|
|
11
|
+
const edgeScope = new Map();
|
|
12
|
+
// ── Tooltip ──────────────────────────────────────────────────────────────
|
|
13
|
+
const tooltipEl = document.createElement("div");
|
|
14
|
+
tooltipEl.className = "bpmnkit-vf-tooltip";
|
|
15
|
+
tooltipEl.style.display = "none";
|
|
16
|
+
document.body.appendChild(tooltipEl);
|
|
17
|
+
function showTooltip(elementId, x, y) {
|
|
18
|
+
const produces = elementProduces.get(elementId);
|
|
19
|
+
const consumes = elementConsumes.get(elementId);
|
|
20
|
+
const scope = edgeScope.get(elementId);
|
|
21
|
+
const hasRoleData = (produces !== undefined && produces.length > 0) ||
|
|
22
|
+
(consumes !== undefined && consumes.length > 0);
|
|
23
|
+
const hasScopeData = scope !== undefined && scope.length > 0;
|
|
24
|
+
if (!hasRoleData && !hasScopeData) {
|
|
25
|
+
hideTooltip();
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
while (tooltipEl.firstChild !== null)
|
|
29
|
+
tooltipEl.removeChild(tooltipEl.firstChild);
|
|
30
|
+
const title = document.createElement("div");
|
|
31
|
+
title.className = "bpmnkit-vf-tooltip-title";
|
|
32
|
+
tooltipEl.appendChild(title);
|
|
33
|
+
if (hasScopeData && scope !== undefined) {
|
|
34
|
+
title.textContent = "Variables in scope";
|
|
35
|
+
for (const v of scope) {
|
|
36
|
+
const row = document.createElement("div");
|
|
37
|
+
row.className = "bpmnkit-vf-tooltip-row";
|
|
38
|
+
const dot = document.createElement("span");
|
|
39
|
+
dot.className = "bpmnkit-vf-tooltip-role bpmnkit-vf-tooltip-role-reads";
|
|
40
|
+
const label = document.createElement("span");
|
|
41
|
+
label.textContent = v;
|
|
42
|
+
row.appendChild(dot);
|
|
43
|
+
row.appendChild(label);
|
|
44
|
+
tooltipEl.appendChild(row);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
title.textContent = "Variable Flow";
|
|
49
|
+
if (produces !== undefined) {
|
|
50
|
+
for (const v of produces) {
|
|
51
|
+
const row = document.createElement("div");
|
|
52
|
+
row.className = "bpmnkit-vf-tooltip-row";
|
|
53
|
+
const dot = document.createElement("span");
|
|
54
|
+
dot.className = "bpmnkit-vf-tooltip-role bpmnkit-vf-tooltip-role-writes";
|
|
55
|
+
const label = document.createElement("span");
|
|
56
|
+
label.textContent = `writes ${v}`;
|
|
57
|
+
row.appendChild(dot);
|
|
58
|
+
row.appendChild(label);
|
|
59
|
+
tooltipEl.appendChild(row);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
if (consumes !== undefined) {
|
|
63
|
+
for (const v of consumes) {
|
|
64
|
+
const row = document.createElement("div");
|
|
65
|
+
row.className = "bpmnkit-vf-tooltip-row";
|
|
66
|
+
const dot = document.createElement("span");
|
|
67
|
+
dot.className = "bpmnkit-vf-tooltip-role bpmnkit-vf-tooltip-role-reads";
|
|
68
|
+
const label = document.createElement("span");
|
|
69
|
+
label.textContent = `reads ${v}`;
|
|
70
|
+
row.appendChild(dot);
|
|
71
|
+
row.appendChild(label);
|
|
72
|
+
tooltipEl.appendChild(row);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
tooltipEl.style.display = "block";
|
|
77
|
+
const rect = tooltipEl.getBoundingClientRect();
|
|
78
|
+
const left = Math.min(x + 12, window.innerWidth - rect.width - 8);
|
|
79
|
+
const top = Math.min(y + 12, window.innerHeight - rect.height - 8);
|
|
80
|
+
tooltipEl.style.left = `${left}px`;
|
|
81
|
+
tooltipEl.style.top = `${top}px`;
|
|
82
|
+
}
|
|
83
|
+
function hideTooltip() {
|
|
84
|
+
tooltipEl.style.display = "none";
|
|
85
|
+
}
|
|
86
|
+
// ── Legend ────────────────────────────────────────────────────────────────
|
|
87
|
+
const legendEl = document.createElement("div");
|
|
88
|
+
legendEl.className = "bpmnkit-vf-legend";
|
|
89
|
+
function makeLegendItem(dotClass, label) {
|
|
90
|
+
const item = document.createElement("div");
|
|
91
|
+
item.className = "bpmnkit-vf-legend-item";
|
|
92
|
+
const dot = document.createElement("span");
|
|
93
|
+
dot.className = `bpmnkit-vf-legend-dot ${dotClass}`;
|
|
94
|
+
const text = document.createElement("span");
|
|
95
|
+
text.textContent = label;
|
|
96
|
+
item.appendChild(dot);
|
|
97
|
+
item.appendChild(text);
|
|
98
|
+
return item;
|
|
99
|
+
}
|
|
100
|
+
legendEl.appendChild(makeLegendItem("bpmnkit-vf-legend-dot-writes", "Writes"));
|
|
101
|
+
legendEl.appendChild(makeLegendItem("bpmnkit-vf-legend-dot-reads", "Reads"));
|
|
102
|
+
legendEl.appendChild(makeLegendItem("bpmnkit-vf-legend-dot-both", "Reads & writes"));
|
|
103
|
+
// ── Canvas overlay management ─────────────────────────────────────────────
|
|
104
|
+
const ROLE_CLASSES = ["bpmnkit-vf-producer", "bpmnkit-vf-consumer", "bpmnkit-vf-both"];
|
|
105
|
+
function clearOverlays() {
|
|
106
|
+
const vp = canvasApi?.viewportEl;
|
|
107
|
+
if (vp === undefined)
|
|
108
|
+
return;
|
|
109
|
+
for (const cls of ROLE_CLASSES) {
|
|
110
|
+
for (const el of vp.querySelectorAll(`.${cls}`)) {
|
|
111
|
+
el.classList.remove(cls);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
function applyOverlays() {
|
|
116
|
+
const vp = canvasApi?.viewportEl;
|
|
117
|
+
if (vp === undefined)
|
|
118
|
+
return;
|
|
119
|
+
clearOverlays();
|
|
120
|
+
const allIds = new Set([...elementProduces.keys(), ...elementConsumes.keys()]);
|
|
121
|
+
for (const elementId of allIds) {
|
|
122
|
+
const writes = (elementProduces.get(elementId)?.length ?? 0) > 0;
|
|
123
|
+
const reads = (elementConsumes.get(elementId)?.length ?? 0) > 0;
|
|
124
|
+
if (!writes && !reads)
|
|
125
|
+
continue;
|
|
126
|
+
const el = vp.querySelector(`[data-bpmnkit-id="${elementId}"]`);
|
|
127
|
+
if (el === null)
|
|
128
|
+
continue;
|
|
129
|
+
if (writes && reads) {
|
|
130
|
+
el.classList.add("bpmnkit-vf-both");
|
|
131
|
+
}
|
|
132
|
+
else if (writes) {
|
|
133
|
+
el.classList.add("bpmnkit-vf-producer");
|
|
134
|
+
}
|
|
135
|
+
else {
|
|
136
|
+
el.classList.add("bpmnkit-vf-consumer");
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
// ── Analysis ──────────────────────────────────────────────────────────────
|
|
141
|
+
function runAnalysis(defs) {
|
|
142
|
+
elementProduces.clear();
|
|
143
|
+
elementConsumes.clear();
|
|
144
|
+
edgeScope.clear();
|
|
145
|
+
const report = optimize(defs, { categories: ["data-flow"] });
|
|
146
|
+
for (const finding of report.findings) {
|
|
147
|
+
const elementId = finding.elementIds[0];
|
|
148
|
+
if (elementId === undefined)
|
|
149
|
+
continue;
|
|
150
|
+
if (finding.id.startsWith("data-flow/role:")) {
|
|
151
|
+
if (finding.produces !== undefined && finding.produces.length > 0) {
|
|
152
|
+
elementProduces.set(elementId, finding.produces);
|
|
153
|
+
}
|
|
154
|
+
if (finding.consumes !== undefined && finding.consumes.length > 0) {
|
|
155
|
+
elementConsumes.set(elementId, finding.consumes);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
else if (finding.id.startsWith("data-flow/edge-scope:")) {
|
|
159
|
+
if (finding.produces !== undefined && finding.produces.length > 0) {
|
|
160
|
+
edgeScope.set(elementId, finding.produces);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
applyOverlays();
|
|
165
|
+
}
|
|
166
|
+
function clearAnalysis() {
|
|
167
|
+
elementProduces.clear();
|
|
168
|
+
elementConsumes.clear();
|
|
169
|
+
edgeScope.clear();
|
|
170
|
+
clearOverlays();
|
|
171
|
+
}
|
|
172
|
+
// ── Hover wiring ──────────────────────────────────────────────────────────
|
|
173
|
+
function onMouseMove(e) {
|
|
174
|
+
const target = e.target.closest("[data-bpmnkit-id]");
|
|
175
|
+
if (target === null) {
|
|
176
|
+
hideTooltip();
|
|
177
|
+
return;
|
|
178
|
+
}
|
|
179
|
+
const elementId = target.getAttribute("data-bpmnkit-id");
|
|
180
|
+
if (elementId === null) {
|
|
181
|
+
hideTooltip();
|
|
182
|
+
return;
|
|
183
|
+
}
|
|
184
|
+
showTooltip(elementId, e.clientX, e.clientY);
|
|
185
|
+
}
|
|
186
|
+
function onMouseLeave() {
|
|
187
|
+
hideTooltip();
|
|
188
|
+
}
|
|
189
|
+
// ── CanvasPlugin ──────────────────────────────────────────────────────────
|
|
190
|
+
return {
|
|
191
|
+
name: "variable-flow",
|
|
192
|
+
legend: legendEl,
|
|
193
|
+
install(api) {
|
|
194
|
+
canvasApi = api;
|
|
195
|
+
injectVariableFlowStyles();
|
|
196
|
+
if (options?.container !== undefined) {
|
|
197
|
+
options.container.appendChild(legendEl);
|
|
198
|
+
}
|
|
199
|
+
const onAny = api.on;
|
|
200
|
+
unsubs.push(api.on("diagram:load", (defs) => {
|
|
201
|
+
runAnalysis(defs);
|
|
202
|
+
}), api.on("diagram:clear", () => {
|
|
203
|
+
clearAnalysis();
|
|
204
|
+
}), onAny("diagram:change", (defs) => {
|
|
205
|
+
runAnalysis(defs);
|
|
206
|
+
}));
|
|
207
|
+
const vp = api.viewportEl;
|
|
208
|
+
if (vp !== undefined) {
|
|
209
|
+
vp.addEventListener("mousemove", onMouseMove);
|
|
210
|
+
vp.addEventListener("mouseleave", onMouseLeave);
|
|
211
|
+
unsubs.push(() => {
|
|
212
|
+
vp.removeEventListener("mousemove", onMouseMove);
|
|
213
|
+
vp.removeEventListener("mouseleave", onMouseLeave);
|
|
214
|
+
});
|
|
215
|
+
}
|
|
216
|
+
},
|
|
217
|
+
uninstall() {
|
|
218
|
+
for (const off of unsubs)
|
|
219
|
+
off();
|
|
220
|
+
clearOverlays();
|
|
221
|
+
tooltipEl.remove();
|
|
222
|
+
canvasApi = null;
|
|
223
|
+
},
|
|
224
|
+
};
|
|
225
|
+
}
|
|
226
|
+
//# sourceMappingURL=index.js.map
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bpmnkit/plugins",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.18",
|
|
4
4
|
"private": false,
|
|
5
5
|
"type": "module",
|
|
6
6
|
"exports": {
|
|
@@ -76,6 +76,10 @@
|
|
|
76
76
|
"import": "./dist/optimize/index.js",
|
|
77
77
|
"types": "./dist/optimize/index.d.ts"
|
|
78
78
|
},
|
|
79
|
+
"./pattern-advisor": {
|
|
80
|
+
"import": "./dist/pattern-advisor/index.js",
|
|
81
|
+
"types": "./dist/pattern-advisor/index.d.ts"
|
|
82
|
+
},
|
|
79
83
|
"./process-runner": {
|
|
80
84
|
"import": "./dist/process-runner/index.js",
|
|
81
85
|
"types": "./dist/process-runner/index.d.ts"
|
|
@@ -96,6 +100,18 @@
|
|
|
96
100
|
"import": "./dist/token-highlight/index.js",
|
|
97
101
|
"types": "./dist/token-highlight/index.d.ts"
|
|
98
102
|
},
|
|
103
|
+
"./variable-flow": {
|
|
104
|
+
"import": "./dist/variable-flow/index.js",
|
|
105
|
+
"types": "./dist/variable-flow/index.d.ts"
|
|
106
|
+
},
|
|
107
|
+
"./live-mode": {
|
|
108
|
+
"import": "./dist/live-mode/index.js",
|
|
109
|
+
"types": "./dist/live-mode/index.d.ts"
|
|
110
|
+
},
|
|
111
|
+
"./story-view": {
|
|
112
|
+
"import": "./dist/story-view/index.js",
|
|
113
|
+
"types": "./dist/story-view/index.d.ts"
|
|
114
|
+
},
|
|
99
115
|
"./watermark": {
|
|
100
116
|
"import": "./dist/watermark/index.js",
|
|
101
117
|
"types": "./dist/watermark/index.d.ts"
|
|
@@ -112,11 +128,11 @@
|
|
|
112
128
|
"dist/**/*.d.ts"
|
|
113
129
|
],
|
|
114
130
|
"dependencies": {
|
|
115
|
-
"@bpmnkit/
|
|
116
|
-
"@bpmnkit/
|
|
131
|
+
"@bpmnkit/ascii": "0.0.15",
|
|
132
|
+
"@bpmnkit/canvas": "0.0.15",
|
|
117
133
|
"@bpmnkit/connector-gen": "0.0.8",
|
|
118
|
-
"@bpmnkit/
|
|
119
|
-
"@bpmnkit/
|
|
134
|
+
"@bpmnkit/core": "0.0.15",
|
|
135
|
+
"@bpmnkit/editor": "0.0.18",
|
|
120
136
|
"@bpmnkit/feel": "0.0.13"
|
|
121
137
|
},
|
|
122
138
|
"description": "23 composable canvas plugins for BPMN editors and viewers — minimap, AI chat, process simulation, storage, and more",
|