@bpmn-nova/studio 0.3.0-preview → 0.3.2-preview

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.
Files changed (63) hide show
  1. package/README.md +245 -20
  2. package/dist/canvas.js +7 -4
  3. package/dist/context-menu.js +2 -2
  4. package/dist/controller.js +84 -6
  5. package/dist/index.d.ts +138 -38
  6. package/dist/index.js +12 -11
  7. package/dist/interactions.js +1 -1
  8. package/dist/modules/bpmn-model/index.d.ts +11 -0
  9. package/dist/modules/bpmn-model/index.js +703 -0
  10. package/dist/modules/core/containment.js +590 -0
  11. package/dist/modules/core/gateway.js +72 -0
  12. package/dist/modules/core/history.js +32 -0
  13. package/dist/modules/core/index.d.ts +268 -0
  14. package/dist/modules/core/index.js +7 -0
  15. package/dist/modules/core/layout.js +644 -0
  16. package/dist/modules/core/model.js +287 -0
  17. package/dist/modules/core/runtime-transition-route.js +360 -0
  18. package/dist/modules/core/scope.js +99 -0
  19. package/dist/modules/designer/index.d.ts +79 -0
  20. package/dist/modules/designer/index.js +607 -0
  21. package/dist/modules/engine-activiti/index.d.ts +19 -0
  22. package/dist/modules/engine-activiti/index.js +160 -0
  23. package/dist/modules/engine-flowable/index.d.ts +19 -0
  24. package/dist/modules/engine-flowable/index.js +160 -0
  25. package/dist/modules/export-svg/index.d.ts +112 -0
  26. package/dist/modules/export-svg/index.js +2 -0
  27. package/dist/modules/export-svg/preview.js +327 -0
  28. package/dist/modules/export-svg/render.js +718 -0
  29. package/dist/modules/icons/index.d.ts +24 -0
  30. package/dist/modules/icons/index.js +264 -0
  31. package/dist/modules/palette/index.d.ts +74 -0
  32. package/dist/modules/palette/index.js +99 -0
  33. package/dist/modules/palette/panel.js +99 -0
  34. package/dist/modules/properties/index.d.ts +20 -0
  35. package/dist/modules/properties/index.js +19 -0
  36. package/dist/modules/properties-activiti/index.d.ts +3 -0
  37. package/dist/modules/properties-activiti/index.js +97 -0
  38. package/dist/modules/properties-bpmn/index.d.ts +3 -0
  39. package/dist/modules/properties-bpmn/index.js +518 -0
  40. package/dist/modules/properties-core/index.d.ts +124 -0
  41. package/dist/modules/properties-core/index.js +312 -0
  42. package/dist/modules/properties-flowable/index.d.ts +3 -0
  43. package/dist/modules/properties-flowable/index.js +114 -0
  44. package/dist/modules/properties-renderer/index.d.ts +25 -0
  45. package/dist/modules/properties-renderer/index.js +491 -0
  46. package/dist/modules/renderer-svg/index.d.ts +118 -0
  47. package/dist/modules/renderer-svg/index.js +1460 -0
  48. package/dist/modules/runtime/index.d.ts +169 -0
  49. package/dist/modules/runtime/index.js +535 -0
  50. package/dist/modules/theme/index.d.ts +95 -0
  51. package/dist/modules/theme/index.js +368 -0
  52. package/dist/modules/viewer/index.d.ts +265 -0
  53. package/dist/modules/viewer/index.js +1011 -0
  54. package/dist/modules/viewer/runtime-content.js +123 -0
  55. package/dist/modules/viewer/runtime-details-motion.js +228 -0
  56. package/dist/modules/viewer/runtime-trace.js +574 -0
  57. package/dist/modules/viewer/timeline.js +276 -0
  58. package/dist/selection-layout.js +1 -1
  59. package/dist/shell.js +210 -26
  60. package/dist/styles.css +116 -7
  61. package/llms-full.txt +3082 -0
  62. package/llms.txt +225 -0
  63. package/package.json +39 -16
@@ -0,0 +1,99 @@
1
+ export const EMBEDDED_SUBPROCESS_TYPES = new Set(['subProcess', 'eventSubProcess', 'transaction', 'adHocSubProcess']);
2
+
3
+ export function isEmbeddedSubProcess(nodeOrType) {
4
+ return EMBEDDED_SUBPROCESS_TYPES.has(typeof nodeOrType === 'string' ? nodeOrType : nodeOrType?.type);
5
+ }
6
+
7
+ export function elementScopeId(model, element) {
8
+ return element?.scopeId || model?.id || '';
9
+ }
10
+
11
+ export function scopeExists(model, scopeId) {
12
+ return scopeId === model?.id || model?.nodes?.some((node) => node.id === scopeId && isEmbeddedSubProcess(node));
13
+ }
14
+
15
+ export function getScopeOwner(model, scopeId) {
16
+ if (!model || scopeId === model.id) return model || null;
17
+ return model.nodes.find((node) => node.id === scopeId && isEmbeddedSubProcess(node)) || null;
18
+ }
19
+
20
+ export function getParentScopeId(model, scopeId) {
21
+ if (!model || scopeId === model.id) return null;
22
+ const owner = getScopeOwner(model, scopeId);
23
+ return owner ? elementScopeId(model, owner) : null;
24
+ }
25
+
26
+ export function getScopePath(model, scopeId = model?.id) {
27
+ if (!model) return [];
28
+ const chain = [];
29
+ const seen = new Set();
30
+ let current = scopeExists(model, scopeId) ? scopeId : model.id;
31
+ while (current && current !== model.id && !seen.has(current)) {
32
+ seen.add(current);
33
+ const owner = getScopeOwner(model, current);
34
+ if (!owner) break;
35
+ chain.unshift({ id: owner.id, name: owner.name || owner.id, kind: 'subProcess' });
36
+ current = elementScopeId(model, owner);
37
+ }
38
+ return [{ id: model.id, name: model.name || model.id, kind: 'process' }, ...chain];
39
+ }
40
+
41
+ export function getScopeGraph(model, scopeId = model?.id) {
42
+ if (!model) return { nodes: [], edges: [] };
43
+ const activeScopeId = scopeExists(model, scopeId) ? scopeId : model.id;
44
+ return {
45
+ ...model,
46
+ nodes: model.nodes.filter((node) => elementScopeId(model, node) === activeScopeId),
47
+ edges: model.edges.filter((edge) => elementScopeId(model, edge) === activeScopeId),
48
+ };
49
+ }
50
+
51
+ export function getDescendantScopeIds(model, ownerId) {
52
+ const scopes = new Set();
53
+ const queue = [ownerId];
54
+ while (queue.length) {
55
+ const scopeId = queue.shift();
56
+ if (scopes.has(scopeId)) continue;
57
+ scopes.add(scopeId);
58
+ for (const node of model.nodes) {
59
+ if (elementScopeId(model, node) === scopeId && isEmbeddedSubProcess(node)) queue.push(node.id);
60
+ }
61
+ }
62
+ return scopes;
63
+ }
64
+
65
+ export function hasScopeChildren(model, ownerId) {
66
+ return model.nodes.some((node) => elementScopeId(model, node) === ownerId)
67
+ || model.edges.some((edge) => elementScopeId(model, edge) === ownerId);
68
+ }
69
+
70
+ export function getScopeIntegrityIssues(model) {
71
+ if (!model) return [];
72
+ const issues = [];
73
+ for (const node of model.nodes || []) {
74
+ const scopeId = elementScopeId(model, node);
75
+ if (!scopeExists(model, scopeId)) issues.push({ kind: 'node', id: node.id, scopeId, reason: 'missing-scope' });
76
+ else {
77
+ const seen = new Set();
78
+ let current = scopeId;
79
+ while (current !== model.id && scopeExists(model, current)) {
80
+ if (seen.has(current)) {
81
+ issues.push({ kind: 'node', id: node.id, scopeId, reason: 'cyclic-scope' });
82
+ break;
83
+ }
84
+ seen.add(current);
85
+ current = getParentScopeId(model, current);
86
+ }
87
+ }
88
+ }
89
+ for (const edge of model.edges || []) {
90
+ const scopeId = elementScopeId(model, edge);
91
+ const source = model.nodes.find((node) => node.id === edge.source);
92
+ const target = model.nodes.find((node) => node.id === edge.target);
93
+ if (!scopeExists(model, scopeId)) issues.push({ kind: 'edge', id: edge.id, scopeId, reason: 'missing-scope' });
94
+ if (source && target && (elementScopeId(model, source) !== scopeId || elementScopeId(model, target) !== scopeId)) {
95
+ issues.push({ kind: 'edge', id: edge.id, scopeId, reason: 'cross-scope' });
96
+ }
97
+ }
98
+ return issues;
99
+ }
@@ -0,0 +1,79 @@
1
+ import type {
2
+ BpmnEdge,
3
+ BpmnNode,
4
+ EngineId,
5
+ ElementSelection,
6
+ LayoutOptions,
7
+ NodeType,
8
+ ProcessModel,
9
+ } from '../core/index.js'
10
+ import type { DiagramRenderer } from '../renderer-svg/index.js'
11
+ import type { NovaThemeInput, NovaThemeMode, NovaThemeState, ThemeController } from '../theme/index.js'
12
+ import type { SvgExportArtifact, SvgExportOptions, SvgExportPreviewController, SvgNodeRenderer } from '../export-svg/index.js'
13
+
14
+ export interface DesignerState {
15
+ selection: ElementSelection | null
16
+ connectingSource: string | null
17
+ canUndo: boolean
18
+ canRedo: boolean
19
+ engine: EngineId
20
+ }
21
+ export interface DesignerOptions {
22
+ container: HTMLElement
23
+ model: ProcessModel
24
+ historyLimit?: number
25
+ onChange?: (model: ProcessModel, reason: string) => void
26
+ onSelectionChange?: (selection: ElementSelection | null, element: BpmnNode | BpmnEdge | null) => void
27
+ onStateChange?: (state: DesignerState) => void
28
+ onViewportChange?: (state: { zoom: number; pan: { x: number; y: number } }) => void
29
+ themeController?: ThemeController
30
+ theme?: NovaThemeInput
31
+ onThemeChange?: (state: NovaThemeState) => void
32
+ svgExport?: SvgExportOptions & { label?: string; nodeRenderers?: Record<string, SvgNodeRenderer> }
33
+ }
34
+
35
+ export function normalizeCanvasCoordinate(value: unknown): number
36
+ export function canSequenceConnect(model: ProcessModel, sourceId: string, targetId: string): boolean
37
+ export class BpmnDesigner {
38
+ constructor(options: DesignerOptions)
39
+ model: ProcessModel
40
+ selection: ElementSelection | null
41
+ connectingSource: string | null
42
+ renderer: DiagramRenderer
43
+ properties?: unknown
44
+ getSelectedElement(): BpmnNode | BpmnEdge | null
45
+ getState(): DesignerState
46
+ setModel(model: ProcessModel, options?: { resetHistory?: boolean }): void
47
+ select(selection: ElementSelection): void
48
+ clearSelection(): void
49
+ on(event: 'change', handler: (payload: { model: ProcessModel; reason: string; state: DesignerState }) => void): () => void
50
+ on(event: 'selection', handler: (payload: { selection: ElementSelection | null; element: BpmnNode | BpmnEdge | null; state: DesignerState }) => void): () => void
51
+ off(event: 'change' | 'selection', handler: Function): void
52
+ exportXml(engine?: EngineId): string
53
+ exportSvg(options?: SvgExportOptions): Promise<SvgExportArtifact>
54
+ openSvgExportPreview(options?: SvgExportOptions & { previewTitle?: string; onDownload?: (artifact: SvgExportArtifact) => void }): SvgExportPreviewController
55
+ importXml(xml: string, engineHint?: EngineId): ProcessModel
56
+ validate(): Array<{ level: 'error' | 'warning'; elementId?: string; message: string }>
57
+ setTheme(theme: NovaThemeInput): NovaThemeState
58
+ setThemeMode(mode: NovaThemeMode): NovaThemeState
59
+ getThemeState(): NovaThemeState
60
+ addNode(type: NodeType, x: number, y: number, overrides?: Partial<BpmnNode>): BpmnNode
61
+ quickAdd(sourceId: string, type?: NodeType, preset?: Partial<BpmnNode>): BpmnNode | null
62
+ startConnect(sourceId: string): void
63
+ connect(source: string, target: string, overrides?: Partial<BpmnEdge>): BpmnEdge | null
64
+ changeNodeType(id: string, type: NodeType): void
65
+ changeElementId(kind: 'process' | 'node' | 'edge', oldId: string, nextId: string): boolean
66
+ updateProcess(patch: Partial<ProcessModel>): void
67
+ updateNode(id: string, patch: Partial<BpmnNode>): void
68
+ updateEdge(id: string, patch: Partial<BpmnEdge>): void
69
+ updateEdges(patches: Array<{ id: string; patch: Partial<BpmnEdge> }>): void
70
+ resetEdgeRoute(id: string): void
71
+ rerouteEdges(options?: LayoutOptions): void
72
+ autoLayout(direction?: 'horizontal' | 'vertical'): void
73
+ beautify(options?: LayoutOptions): void
74
+ removeSelection(): void
75
+ setEngine(engine: EngineId): void
76
+ undo(): void
77
+ redo(): void
78
+ destroy(): void
79
+ }