@cratis/components 0.1.17 → 0.1.19
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 +83 -0
- package/dist/cjs/Common/ErrorBoundary.js +26 -0
- package/dist/cjs/Common/ErrorBoundary.js.map +1 -0
- package/dist/cjs/Common/FormElement.js +10 -0
- package/dist/cjs/Common/FormElement.js.map +1 -0
- package/dist/cjs/Common/index.js +12 -0
- package/dist/cjs/Common/index.js.map +1 -0
- package/dist/cjs/EventModeling/EventModeling.css +146 -0
- package/dist/cjs/EventModeling/EventModeling.js +209 -0
- package/dist/cjs/EventModeling/EventModeling.js.map +1 -0
- package/dist/cjs/EventModeling/components/Canvas.js +403 -0
- package/dist/cjs/EventModeling/components/Canvas.js.map +1 -0
- package/dist/cjs/EventModeling/components/CanvasControls.js +10 -0
- package/dist/cjs/EventModeling/components/CanvasControls.js.map +1 -0
- package/dist/cjs/EventModeling/components/Toolbox.js +18 -0
- package/dist/cjs/EventModeling/components/Toolbox.js.map +1 -0
- package/dist/cjs/EventModeling/engine/connectorGraphics.js +173 -0
- package/dist/cjs/EventModeling/engine/connectorGraphics.js.map +1 -0
- package/dist/cjs/EventModeling/engine/elementSprites.js +301 -0
- package/dist/cjs/EventModeling/engine/elementSprites.js.map +1 -0
- package/dist/cjs/EventModeling/index.js +12 -0
- package/dist/cjs/EventModeling/index.js.map +1 -0
- package/dist/cjs/EventModeling/types.js +60 -0
- package/dist/cjs/EventModeling/types.js.map +1 -0
- package/dist/cjs/PivotViewer/PivotViewer.css +54 -5
- package/dist/cjs/PivotViewer/PivotViewer.js +5 -2
- package/dist/cjs/PivotViewer/PivotViewer.js.map +1 -1
- package/dist/cjs/PivotViewer/components/AxisLabels.js +5 -8
- package/dist/cjs/PivotViewer/components/AxisLabels.js.map +1 -1
- package/dist/cjs/PivotViewer/components/DetailPanel.js +9 -2
- package/dist/cjs/PivotViewer/components/DetailPanel.js.map +1 -1
- package/dist/cjs/PivotViewer/components/PivotCanvas.js +30 -6
- package/dist/cjs/PivotViewer/components/PivotCanvas.js.map +1 -1
- package/dist/cjs/PivotViewer/components/PivotViewerMain.js +16 -5
- package/dist/cjs/PivotViewer/components/PivotViewerMain.js.map +1 -1
- package/dist/cjs/PivotViewer/components/Toolbar.js +34 -2
- package/dist/cjs/PivotViewer/components/Toolbar.js.map +1 -1
- package/dist/cjs/PivotViewer/components/pivot/constants.js +5 -5
- package/dist/cjs/PivotViewer/components/pivot/constants.js.map +1 -1
- package/dist/cjs/PivotViewer/components/pivot/groups.js +15 -15
- package/dist/cjs/PivotViewer/components/pivot/groups.js.map +1 -1
- package/dist/cjs/PivotViewer/components/pivot/sprites.js +10 -27
- package/dist/cjs/PivotViewer/components/pivot/sprites.js.map +1 -1
- package/dist/cjs/PivotViewer/components/pivot/visibility.js +8 -20
- package/dist/cjs/PivotViewer/components/pivot/visibility.js.map +1 -1
- package/dist/cjs/PivotViewer/constants.js +0 -2
- package/dist/cjs/PivotViewer/constants.js.map +1 -1
- package/dist/cjs/PivotViewer/engine/layout.js +1 -1
- package/dist/cjs/PivotViewer/engine/layout.js.map +1 -1
- package/dist/cjs/PivotViewer/hooks/useCardSelection.js +2 -1
- package/dist/cjs/PivotViewer/hooks/useCardSelection.js.map +1 -1
- package/dist/cjs/PivotViewer/hooks/useZoomState.js +4 -0
- package/dist/cjs/PivotViewer/hooks/useZoomState.js.map +1 -1
- package/dist/cjs/PivotViewer/types.js.map +1 -1
- package/dist/cjs/PivotViewer/utils/animations.js +1 -1
- package/dist/cjs/PivotViewer/utils/animations.js.map +1 -1
- package/dist/cjs/PivotViewer/utils/constants.js +1 -1
- package/dist/cjs/PivotViewer/utils/constants.js.map +1 -1
- package/dist/cjs/PivotViewer/utils/selection.js +8 -1
- package/dist/cjs/PivotViewer/utils/selection.js.map +1 -1
- package/dist/cjs/TimeMachine/TimeMachine.js +0 -3
- package/dist/cjs/TimeMachine/TimeMachine.js.map +1 -1
- package/dist/cjs/index.js +16 -12
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/package.json +3 -0
- package/dist/esm/Common/ErrorBoundary.js +7 -4
- package/dist/esm/Common/ErrorBoundary.js.map +1 -1
- package/dist/esm/Common/FormElement.js +7 -4
- package/dist/esm/Common/FormElement.js.map +1 -1
- package/dist/esm/Common/index.js +4 -4
- package/dist/esm/Common/index.js.map +1 -1
- package/dist/esm/EventModeling/EventModeling.css +146 -0
- package/dist/esm/EventModeling/EventModeling.d.ts +11 -0
- package/dist/esm/EventModeling/EventModeling.d.ts.map +1 -0
- package/dist/esm/EventModeling/EventModeling.js +207 -0
- package/dist/esm/EventModeling/EventModeling.js.map +1 -0
- package/dist/esm/EventModeling/EventModeling.stories.d.ts +10 -0
- package/dist/esm/EventModeling/EventModeling.stories.d.ts.map +1 -0
- package/dist/esm/EventModeling/EventModeling.stories.js +252 -0
- package/dist/esm/EventModeling/EventModeling.stories.js.map +1 -0
- package/dist/esm/EventModeling/components/Canvas.d.ts +23 -0
- package/dist/esm/EventModeling/components/Canvas.d.ts.map +1 -0
- package/dist/esm/EventModeling/components/Canvas.js +382 -0
- package/dist/esm/EventModeling/components/Canvas.js.map +1 -0
- package/dist/esm/EventModeling/components/CanvasControls.d.ts +10 -0
- package/dist/esm/EventModeling/components/CanvasControls.d.ts.map +1 -0
- package/dist/esm/EventModeling/components/CanvasControls.js +8 -0
- package/dist/esm/EventModeling/components/CanvasControls.js.map +1 -0
- package/dist/esm/EventModeling/components/Toolbox.d.ts +9 -0
- package/dist/esm/EventModeling/components/Toolbox.d.ts.map +1 -0
- package/dist/esm/EventModeling/components/Toolbox.js +16 -0
- package/dist/esm/EventModeling/components/Toolbox.js.map +1 -0
- package/dist/esm/EventModeling/engine/connectorGraphics.d.ts +12 -0
- package/dist/esm/EventModeling/engine/connectorGraphics.d.ts.map +1 -0
- package/dist/esm/EventModeling/engine/connectorGraphics.js +151 -0
- package/dist/esm/EventModeling/engine/connectorGraphics.js.map +1 -0
- package/dist/esm/EventModeling/engine/elementSprites.d.ts +23 -0
- package/dist/esm/EventModeling/engine/elementSprites.d.ts.map +1 -0
- package/dist/esm/EventModeling/engine/elementSprites.js +276 -0
- package/dist/esm/EventModeling/engine/elementSprites.js.map +1 -0
- package/dist/esm/EventModeling/index.d.ts +3 -0
- package/dist/esm/EventModeling/index.d.ts.map +1 -0
- package/dist/esm/EventModeling/index.js +3 -0
- package/dist/esm/EventModeling/index.js.map +1 -0
- package/dist/esm/EventModeling/types.d.ts +79 -0
- package/dist/esm/EventModeling/types.d.ts.map +1 -0
- package/dist/esm/EventModeling/types.js +56 -0
- package/dist/esm/EventModeling/types.js.map +1 -0
- package/dist/esm/PivotViewer/PivotViewer.css +54 -5
- package/dist/esm/PivotViewer/PivotViewer.d.ts.map +1 -1
- package/dist/esm/PivotViewer/PivotViewer.js +5 -2
- package/dist/esm/PivotViewer/PivotViewer.js.map +1 -1
- package/dist/esm/PivotViewer/PivotViewer.stories.d.ts +0 -1
- package/dist/esm/PivotViewer/PivotViewer.stories.d.ts.map +1 -1
- package/dist/esm/PivotViewer/PivotViewer.stories.js +10 -9
- package/dist/esm/PivotViewer/PivotViewer.stories.js.map +1 -1
- package/dist/esm/PivotViewer/components/AxisLabels.d.ts +2 -1
- package/dist/esm/PivotViewer/components/AxisLabels.d.ts.map +1 -1
- package/dist/esm/PivotViewer/components/AxisLabels.js +6 -9
- package/dist/esm/PivotViewer/components/AxisLabels.js.map +1 -1
- package/dist/esm/PivotViewer/components/DetailPanel.d.ts +3 -1
- package/dist/esm/PivotViewer/components/DetailPanel.d.ts.map +1 -1
- package/dist/esm/PivotViewer/components/DetailPanel.js +10 -3
- package/dist/esm/PivotViewer/components/DetailPanel.js.map +1 -1
- package/dist/esm/PivotViewer/components/PivotCanvas.d.ts +5 -2
- package/dist/esm/PivotViewer/components/PivotCanvas.d.ts.map +1 -1
- package/dist/esm/PivotViewer/components/PivotCanvas.js +30 -6
- package/dist/esm/PivotViewer/components/PivotCanvas.js.map +1 -1
- package/dist/esm/PivotViewer/components/PivotViewerMain.d.ts +5 -1
- package/dist/esm/PivotViewer/components/PivotViewerMain.d.ts.map +1 -1
- package/dist/esm/PivotViewer/components/PivotViewerMain.js +16 -5
- package/dist/esm/PivotViewer/components/PivotViewerMain.js.map +1 -1
- package/dist/esm/PivotViewer/components/Toolbar.d.ts +3 -1
- package/dist/esm/PivotViewer/components/Toolbar.d.ts.map +1 -1
- package/dist/esm/PivotViewer/components/Toolbar.js +34 -2
- package/dist/esm/PivotViewer/components/Toolbar.js.map +1 -1
- package/dist/esm/PivotViewer/components/pivot/constants.d.ts.map +1 -1
- package/dist/esm/PivotViewer/components/pivot/constants.js +5 -5
- package/dist/esm/PivotViewer/components/pivot/constants.js.map +1 -1
- package/dist/esm/PivotViewer/components/pivot/groups.d.ts.map +1 -1
- package/dist/esm/PivotViewer/components/pivot/groups.js +2 -2
- package/dist/esm/PivotViewer/components/pivot/groups.js.map +1 -1
- package/dist/esm/PivotViewer/components/pivot/sprites.d.ts +10 -2
- package/dist/esm/PivotViewer/components/pivot/sprites.d.ts.map +1 -1
- package/dist/esm/PivotViewer/components/pivot/sprites.js +10 -27
- package/dist/esm/PivotViewer/components/pivot/sprites.js.map +1 -1
- package/dist/esm/PivotViewer/components/pivot/visibility.d.ts.map +1 -1
- package/dist/esm/PivotViewer/components/pivot/visibility.js +8 -20
- package/dist/esm/PivotViewer/components/pivot/visibility.js.map +1 -1
- package/dist/esm/PivotViewer/constants.js +1 -2
- package/dist/esm/PivotViewer/constants.js.map +1 -1
- package/dist/esm/PivotViewer/engine/layout.js +1 -1
- package/dist/esm/PivotViewer/engine/layout.js.map +1 -1
- package/dist/esm/PivotViewer/hooks/useCardSelection.d.ts.map +1 -1
- package/dist/esm/PivotViewer/hooks/useCardSelection.js +2 -1
- package/dist/esm/PivotViewer/hooks/useCardSelection.js.map +1 -1
- package/dist/esm/PivotViewer/hooks/useZoomState.d.ts +1 -0
- package/dist/esm/PivotViewer/hooks/useZoomState.d.ts.map +1 -1
- package/dist/esm/PivotViewer/hooks/useZoomState.js +4 -0
- package/dist/esm/PivotViewer/hooks/useZoomState.js.map +1 -1
- package/dist/esm/PivotViewer/types.d.ts +5 -1
- package/dist/esm/PivotViewer/types.d.ts.map +1 -1
- package/dist/esm/PivotViewer/types.js.map +1 -1
- package/dist/esm/PivotViewer/utils/animations.js +1 -1
- package/dist/esm/PivotViewer/utils/animations.js.map +1 -1
- package/dist/esm/PivotViewer/utils/constants.d.ts +1 -1
- package/dist/esm/PivotViewer/utils/constants.d.ts.map +1 -1
- package/dist/esm/PivotViewer/utils/constants.js +1 -1
- package/dist/esm/PivotViewer/utils/constants.js.map +1 -1
- package/dist/esm/PivotViewer/utils/selection.d.ts.map +1 -1
- package/dist/esm/PivotViewer/utils/selection.js +8 -1
- package/dist/esm/PivotViewer/utils/selection.js.map +1 -1
- package/dist/esm/TimeMachine/TimeMachine.js +1 -1
- package/dist/esm/index.d.ts +5 -3
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +16 -12
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/package.json +3 -0
- package/dist/esm/tsconfig.tsbuildinfo +1 -1
- package/package.json +36 -78
package/README.md
CHANGED
|
@@ -1 +1,84 @@
|
|
|
1
1
|
# Cratis Components
|
|
2
|
+
|
|
3
|
+
A collection of React components for building modern applications with Cratis.
|
|
4
|
+
|
|
5
|
+
## Requirements
|
|
6
|
+
|
|
7
|
+
### Minimum Versions
|
|
8
|
+
|
|
9
|
+
- TypeScript: 4.7+
|
|
10
|
+
- React: 18.0+ or 19.0+
|
|
11
|
+
- Node.js: 16+ (for development)
|
|
12
|
+
|
|
13
|
+
### TypeScript Configuration
|
|
14
|
+
|
|
15
|
+
This package is compatible with all modern TypeScript `moduleResolution` strategies:
|
|
16
|
+
|
|
17
|
+
- ✅ `"bundler"` (recommended for Vite, esbuild, webpack 5+)
|
|
18
|
+
- ✅ `"node16"` / `"nodenext"` (for Node.js projects)
|
|
19
|
+
- ✅ `"node"` (legacy, but supported)
|
|
20
|
+
|
|
21
|
+
The package provides dual CommonJS and ES Module builds with proper conditional exports for optimal module resolution and tree-shaking.
|
|
22
|
+
|
|
23
|
+
## Installation
|
|
24
|
+
|
|
25
|
+
```bash
|
|
26
|
+
npm install @cratis/components
|
|
27
|
+
# or
|
|
28
|
+
yarn add @cratis/components
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
## Usage
|
|
32
|
+
|
|
33
|
+
### Importing Components
|
|
34
|
+
|
|
35
|
+
You can import components using subpath imports for better tree-shaking:
|
|
36
|
+
|
|
37
|
+
```typescript
|
|
38
|
+
// Import specific component modules
|
|
39
|
+
import { TimeMachine } from '@cratis/components/TimeMachine';
|
|
40
|
+
import { DataPage } from '@cratis/components/DataPage';
|
|
41
|
+
import { CommandForm } from '@cratis/components/CommandForm';
|
|
42
|
+
|
|
43
|
+
// Or import from the main entry point
|
|
44
|
+
import { TimeMachine, DataPage } from '@cratis/components';
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
### Available Subpath Exports
|
|
48
|
+
|
|
49
|
+
- `@cratis/components/CommandDialog`
|
|
50
|
+
- `@cratis/components/CommandForm`
|
|
51
|
+
- `@cratis/components/Common`
|
|
52
|
+
- `@cratis/components/DataPage`
|
|
53
|
+
- `@cratis/components/DataTables`
|
|
54
|
+
- `@cratis/components/Dialogs`
|
|
55
|
+
- `@cratis/components/Dropdown`
|
|
56
|
+
- `@cratis/components/EventModeling`
|
|
57
|
+
- `@cratis/components/PivotViewer`
|
|
58
|
+
- `@cratis/components/TimeMachine`
|
|
59
|
+
|
|
60
|
+
## Troubleshooting
|
|
61
|
+
|
|
62
|
+
### Module Resolution Errors
|
|
63
|
+
|
|
64
|
+
If you encounter errors like:
|
|
65
|
+
|
|
66
|
+
```
|
|
67
|
+
Cannot find module '@cratis/components/TimeMachine' or its corresponding type declarations.
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
**Solution:** Ensure you're using the correct case-sensitive import paths (e.g., `TimeMachine`, not `timeMachine`).
|
|
71
|
+
|
|
72
|
+
If using TypeScript 4.7+, try updating your `tsconfig.json`:
|
|
73
|
+
|
|
74
|
+
```json
|
|
75
|
+
{
|
|
76
|
+
"compilerOptions": {
|
|
77
|
+
"moduleResolution": "bundler" // or "node16" / "nodenext"
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
### Import Errors
|
|
83
|
+
|
|
84
|
+
Ensure you're using the correct import paths. The package uses case-sensitive paths that match the actual component names.
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
4
|
+
var React = require('react');
|
|
5
|
+
|
|
6
|
+
class ErrorBoundary extends React.Component {
|
|
7
|
+
state = {
|
|
8
|
+
hasError: false,
|
|
9
|
+
error: new Error(),
|
|
10
|
+
};
|
|
11
|
+
static getDerivedStateFromError(error) {
|
|
12
|
+
return { hasError: true, error: error };
|
|
13
|
+
}
|
|
14
|
+
componentDidCatch(error, errorInfo) {
|
|
15
|
+
console.error('Uncaught error:', error, errorInfo);
|
|
16
|
+
}
|
|
17
|
+
render() {
|
|
18
|
+
if (this.state.hasError) {
|
|
19
|
+
return (jsxRuntime.jsxs("div", { className: 'p-4', children: [jsxRuntime.jsx("h1", { className: 'text-3xl m-3', children: "Error" }), jsxRuntime.jsx("p", { children: this.state.error.message }), jsxRuntime.jsx("p", { children: this.state.error.stack })] }));
|
|
20
|
+
}
|
|
21
|
+
return this.props.children;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
exports.ErrorBoundary = ErrorBoundary;
|
|
26
|
+
//# sourceMappingURL=ErrorBoundary.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ErrorBoundary.js","sources":["../../../Common/ErrorBoundary.tsx"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport { Component, ErrorInfo, ReactNode } from 'react';\n\ninterface Props {\n children: ReactNode;\n}\ninterface State {\n hasError: boolean;\n error: Error;\n}\n\nexport class ErrorBoundary extends Component<Props, State> {\n public state: State = {\n hasError: false,\n error: new Error(),\n };\n\n public static getDerivedStateFromError(error: Error): State {\n return { hasError: true, error: error };\n }\n\n public componentDidCatch(error: Error, errorInfo: ErrorInfo) {\n console.error('Uncaught error:', error, errorInfo);\n }\n\n public render() {\n if (this.state.hasError) {\n return (\n <div className='p-4'>\n <h1 className='text-3xl m-3'>Error</h1>\n <p>{this.state.error.message}</p>\n <p>{this.state.error.stack}</p>\n </div>\n );\n }\n\n return this.props.children;\n }\n}\n"],"names":["Component","_jsxs","_jsx"],"mappings":";;;;;AAaM,MAAO,aAAc,SAAQA,eAAuB,CAAA;AAC/C,IAAA,KAAK,GAAU;AAClB,QAAA,QAAQ,EAAE,KAAK;QACf,KAAK,EAAE,IAAI,KAAK,EAAE;KACrB;IAEM,OAAO,wBAAwB,CAAC,KAAY,EAAA;QAC/C,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE;IAC3C;IAEO,iBAAiB,CAAC,KAAY,EAAE,SAAoB,EAAA;QACvD,OAAO,CAAC,KAAK,CAAC,iBAAiB,EAAE,KAAK,EAAE,SAAS,CAAC;IACtD;IAEO,MAAM,GAAA;AACT,QAAA,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE;AACrB,YAAA,QACIC,eAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,KAAK,EAAA,QAAA,EAAA,CAChBC,cAAA,CAAA,IAAA,EAAA,EAAI,SAAS,EAAC,cAAc,EAAA,QAAA,EAAA,OAAA,EAAA,CAAW,EACvCA,cAAA,CAAA,GAAA,EAAA,EAAA,QAAA,EAAI,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,EAAA,CAAK,EACjCA,gCAAI,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,EAAA,CAAK,CAAA,EAAA,CAC7B;QAEd;AAEA,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ;IAC9B;AACH;;;;"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
4
|
+
|
|
5
|
+
const FormElement = (props) => {
|
|
6
|
+
return (jsxRuntime.jsx("div", { className: "card flex flex-column md:flex-row gap-3", children: jsxRuntime.jsxs("div", { className: "p-inputgroup flex-1", children: [jsxRuntime.jsx("span", { className: "p-inputgroup-addon", children: props.icon }), props.children] }) }));
|
|
7
|
+
};
|
|
8
|
+
|
|
9
|
+
exports.FormElement = FormElement;
|
|
10
|
+
//# sourceMappingURL=FormElement.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FormElement.js","sources":["../../../Common/FormElement.tsx"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nexport interface FormElementProps {\n children: React.ReactNode;\n icon: React.ReactNode;\n}\n\nexport const FormElement = (props: FormElementProps) => {\n return (\n <div className=\"card flex flex-column md:flex-row gap-3\">\n <div className=\"p-inputgroup flex-1\">\n <span className=\"p-inputgroup-addon\">\n {props.icon}\n </span>\n {props.children}\n </div>\n </div>\n );\n};\n"],"names":["_jsx","_jsxs"],"mappings":";;;;AAQO,MAAM,WAAW,GAAG,CAAC,KAAuB,KAAI;IACnD,QACIA,cAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,yCAAyC,EAAA,QAAA,EACpDC,eAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,qBAAqB,EAAA,QAAA,EAAA,CAChCD,cAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAC,oBAAoB,EAAA,QAAA,EAC/B,KAAK,CAAC,IAAI,EAAA,CACR,EACN,KAAK,CAAC,QAAQ,CAAA,EAAA,CACb,EAAA,CACJ;AAEd;;;;"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var ErrorBoundary = require('./ErrorBoundary.js');
|
|
4
|
+
var Page = require('./Page.js');
|
|
5
|
+
var FormElement = require('./FormElement.js');
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
exports.ErrorBoundary = ErrorBoundary.ErrorBoundary;
|
|
10
|
+
exports.Page = Page.Page;
|
|
11
|
+
exports.FormElement = FormElement.FormElement;
|
|
12
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;"}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
/* Copyright (c) Cratis. All rights reserved.
|
|
2
|
+
Licensed under the MIT license. See LICENSE file in the project root for full license information. */
|
|
3
|
+
|
|
4
|
+
.event-modeling {
|
|
5
|
+
position: relative;
|
|
6
|
+
overflow: hidden;
|
|
7
|
+
background: var(--surface-ground, #f8f9fa);
|
|
8
|
+
display: flex;
|
|
9
|
+
flex-direction: column;
|
|
10
|
+
width: 100%;
|
|
11
|
+
height: 100%;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
.event-modeling-canvas-container {
|
|
15
|
+
flex: 1;
|
|
16
|
+
position: relative;
|
|
17
|
+
overflow: hidden;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
.event-modeling-canvas {
|
|
21
|
+
position: absolute;
|
|
22
|
+
top: 0;
|
|
23
|
+
left: 0;
|
|
24
|
+
z-index: 0;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
.event-modeling-toolbox {
|
|
28
|
+
position: absolute;
|
|
29
|
+
top: 20px;
|
|
30
|
+
left: 20px;
|
|
31
|
+
background: var(--surface-card, #ffffff);
|
|
32
|
+
border-radius: 12px;
|
|
33
|
+
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.08), 0 4px 12px rgba(0, 0, 0, 0.08);
|
|
34
|
+
border: 1px solid var(--surface-border, #dee2e6);
|
|
35
|
+
padding: 8px;
|
|
36
|
+
z-index: 1000;
|
|
37
|
+
display: flex;
|
|
38
|
+
gap: 6px;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
.event-modeling-tool-button {
|
|
42
|
+
width: 64px;
|
|
43
|
+
height: 64px;
|
|
44
|
+
border: 2px solid transparent;
|
|
45
|
+
border-radius: 8px;
|
|
46
|
+
background: var(--surface-0, #ffffff);
|
|
47
|
+
cursor: pointer;
|
|
48
|
+
display: flex;
|
|
49
|
+
flex-direction: column;
|
|
50
|
+
align-items: center;
|
|
51
|
+
justify-content: center;
|
|
52
|
+
gap: 4px;
|
|
53
|
+
transition: all 0.15s ease;
|
|
54
|
+
font-size: 11px;
|
|
55
|
+
font-weight: 600;
|
|
56
|
+
color: var(--text-color, #495057);
|
|
57
|
+
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.06);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
.event-modeling-tool-button:hover {
|
|
61
|
+
background: var(--surface-100, #f8f9fa);
|
|
62
|
+
transform: translateY(-1px);
|
|
63
|
+
box-shadow: 0 2px 6px rgba(0, 0, 0, 0.1);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
.event-modeling-tool-button.selected {
|
|
67
|
+
border-color: var(--primary-color, #3B82F6);
|
|
68
|
+
background: var(--primary-50, #EFF6FF);
|
|
69
|
+
box-shadow: 0 0 0 1px var(--primary-color, #3B82F6);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
.event-modeling-tool-icon {
|
|
73
|
+
font-size: 24px;
|
|
74
|
+
display: flex;
|
|
75
|
+
align-items: center;
|
|
76
|
+
justify-content: center;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
.event-modeling-tool-button.command .event-modeling-tool-icon {
|
|
80
|
+
width: 40px;
|
|
81
|
+
height: 24px;
|
|
82
|
+
background: var(--blue-500, #3b82f6);
|
|
83
|
+
border-radius: 4px;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
.event-modeling-tool-button.event .event-modeling-tool-icon {
|
|
87
|
+
width: 40px;
|
|
88
|
+
height: 24px;
|
|
89
|
+
background: var(--orange-500, #f59e0b);
|
|
90
|
+
border-radius: 4px;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
.event-modeling-tool-button.readmodel .event-modeling-tool-icon {
|
|
94
|
+
width: 40px;
|
|
95
|
+
height: 24px;
|
|
96
|
+
background: var(--green-500, #10b981);
|
|
97
|
+
border-radius: 4px;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
.event-modeling-tool-button.process .event-modeling-tool-icon {
|
|
101
|
+
width: 28px;
|
|
102
|
+
height: 28px;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
.event-modeling-controls {
|
|
106
|
+
position: absolute;
|
|
107
|
+
bottom: 20px;
|
|
108
|
+
right: 20px;
|
|
109
|
+
background: var(--surface-card, #ffffff);
|
|
110
|
+
border-radius: 12px;
|
|
111
|
+
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.08), 0 4px 12px rgba(0, 0, 0, 0.08);
|
|
112
|
+
border: 1px solid var(--surface-border, #dee2e6);
|
|
113
|
+
padding: 6px;
|
|
114
|
+
z-index: 1000;
|
|
115
|
+
display: flex;
|
|
116
|
+
flex-direction: column;
|
|
117
|
+
gap: 4px;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
.event-modeling-control-button {
|
|
121
|
+
width: 40px;
|
|
122
|
+
height: 40px;
|
|
123
|
+
border: none;
|
|
124
|
+
border-radius: 8px;
|
|
125
|
+
background: var(--surface-0, #ffffff);
|
|
126
|
+
cursor: pointer;
|
|
127
|
+
display: flex;
|
|
128
|
+
align-items: center;
|
|
129
|
+
justify-content: center;
|
|
130
|
+
transition: all 0.15s ease;
|
|
131
|
+
font-size: 16px;
|
|
132
|
+
font-weight: 600;
|
|
133
|
+
color: var(--text-color, #495057);
|
|
134
|
+
box-shadow: 0 1px 2px rgba(0, 0, 0, 0.04);
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
.event-modeling-control-button:hover {
|
|
138
|
+
background: var(--surface-100, #f8f9fa);
|
|
139
|
+
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.08);
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
.event-modeling-control-button:disabled {
|
|
143
|
+
opacity: 0.4;
|
|
144
|
+
cursor: not-allowed;
|
|
145
|
+
background: var(--surface-100, #f8f9fa);
|
|
146
|
+
}
|
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
4
|
+
var React = require('react');
|
|
5
|
+
var types = require('./types.js');
|
|
6
|
+
var Toolbox = require('./components/Toolbox.js');
|
|
7
|
+
var Canvas = require('./components/Canvas.js');
|
|
8
|
+
var CanvasControls = require('./components/CanvasControls.js');
|
|
9
|
+
require('./EventModeling.css');
|
|
10
|
+
|
|
11
|
+
const EventModeling = ({ initialState, onStateChange, width = '100%', height = '100vh', }) => {
|
|
12
|
+
const [state, setState] = React.useState(initialState || {
|
|
13
|
+
elements: [],
|
|
14
|
+
connectors: [],
|
|
15
|
+
});
|
|
16
|
+
const [selectedTool, setSelectedTool] = React.useState('select');
|
|
17
|
+
const [zoom, setZoom] = React.useState(1);
|
|
18
|
+
const [pan, setPan] = React.useState({ x: 0, y: 0 });
|
|
19
|
+
const updateState = React.useCallback((newState) => {
|
|
20
|
+
setState(newState);
|
|
21
|
+
onStateChange?.(newState);
|
|
22
|
+
}, [onStateChange]);
|
|
23
|
+
const handleZoomChange = React.useCallback((newZoom) => {
|
|
24
|
+
setZoom(newZoom);
|
|
25
|
+
}, []);
|
|
26
|
+
const handlePanChange = React.useCallback((newPan) => {
|
|
27
|
+
setPan(newPan);
|
|
28
|
+
}, []);
|
|
29
|
+
const handleAddElement = React.useCallback((type, x, y) => {
|
|
30
|
+
console.log('Adding element:', type, 'at', x, y);
|
|
31
|
+
const size = types.DEFAULT_ELEMENT_SIZE[type];
|
|
32
|
+
const newElement = {
|
|
33
|
+
id: `${type}-${Date.now()}`,
|
|
34
|
+
type,
|
|
35
|
+
position: { x, y },
|
|
36
|
+
size,
|
|
37
|
+
label: `New ${type.charAt(0).toUpperCase() + type.slice(1)}`,
|
|
38
|
+
};
|
|
39
|
+
updateState({
|
|
40
|
+
...state,
|
|
41
|
+
elements: [...state.elements, newElement],
|
|
42
|
+
});
|
|
43
|
+
setSelectedTool('select');
|
|
44
|
+
}, [state, updateState]);
|
|
45
|
+
const handleUpdateElement = React.useCallback((id, updates) => {
|
|
46
|
+
const updatedElements = state.elements.map(el => el.id === id ? { ...el, ...updates } : el);
|
|
47
|
+
let updatedConnectors = state.connectors;
|
|
48
|
+
if (updates.position) {
|
|
49
|
+
updatedConnectors = state.connectors.map(connector => {
|
|
50
|
+
if (connector.from.elementId === id || connector.to.elementId === id) {
|
|
51
|
+
const fromElement = updatedElements.find(el => el.id === connector.from.elementId);
|
|
52
|
+
const toElement = updatedElements.find(el => el.id === connector.to.elementId);
|
|
53
|
+
if (fromElement && toElement) {
|
|
54
|
+
const optimalEdges = types.calculateOptimalEdges(fromElement, toElement);
|
|
55
|
+
return {
|
|
56
|
+
...connector,
|
|
57
|
+
from: { elementId: connector.from.elementId, side: optimalEdges.fromSide },
|
|
58
|
+
to: { elementId: connector.to.elementId, side: optimalEdges.toSide },
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
return connector;
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
updateState({
|
|
66
|
+
...state,
|
|
67
|
+
elements: updatedElements,
|
|
68
|
+
connectors: updatedConnectors,
|
|
69
|
+
});
|
|
70
|
+
}, [state, updateState]);
|
|
71
|
+
const handleDeleteElement = React.useCallback((id) => {
|
|
72
|
+
updateState({
|
|
73
|
+
...state,
|
|
74
|
+
elements: state.elements.filter(el => el.id !== id),
|
|
75
|
+
connectors: state.connectors.filter(conn => conn.from.elementId !== id && conn.to.elementId !== id),
|
|
76
|
+
selectedElementId: state.selectedElementId === id ? undefined : state.selectedElementId,
|
|
77
|
+
});
|
|
78
|
+
}, [state, updateState]);
|
|
79
|
+
const handleAddConnector = React.useCallback((connector) => {
|
|
80
|
+
if (connector.from.elementId === connector.to.elementId) {
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
const fromElement = state.elements.find(el => el.id === connector.from.elementId);
|
|
84
|
+
const toElement = state.elements.find(el => el.id === connector.to.elementId);
|
|
85
|
+
if (!fromElement || !toElement) {
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
const optimalEdges = types.calculateOptimalEdges(fromElement, toElement);
|
|
89
|
+
const optimizedConnector = {
|
|
90
|
+
...connector,
|
|
91
|
+
from: { elementId: connector.from.elementId, side: optimalEdges.fromSide },
|
|
92
|
+
to: { elementId: connector.to.elementId, side: optimalEdges.toSide },
|
|
93
|
+
};
|
|
94
|
+
const isDuplicate = state.connectors.some(c => c.from.elementId === optimizedConnector.from.elementId &&
|
|
95
|
+
c.to.elementId === optimizedConnector.to.elementId);
|
|
96
|
+
if (isDuplicate) {
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
updateState({
|
|
100
|
+
...state,
|
|
101
|
+
connectors: [...state.connectors, optimizedConnector],
|
|
102
|
+
});
|
|
103
|
+
}, [state, updateState]);
|
|
104
|
+
const handleDeleteConnector = React.useCallback((id) => {
|
|
105
|
+
updateState({
|
|
106
|
+
...state,
|
|
107
|
+
connectors: state.connectors.filter(conn => conn.id !== id),
|
|
108
|
+
selectedConnectorId: state.selectedConnectorId === id ? undefined : state.selectedConnectorId,
|
|
109
|
+
});
|
|
110
|
+
}, [state, updateState]);
|
|
111
|
+
const handleSelectElement = React.useCallback((id) => {
|
|
112
|
+
updateState({
|
|
113
|
+
...state,
|
|
114
|
+
selectedElementId: id,
|
|
115
|
+
selectedConnectorId: undefined,
|
|
116
|
+
});
|
|
117
|
+
}, [state, updateState]);
|
|
118
|
+
const handleSelectConnector = React.useCallback((id) => {
|
|
119
|
+
updateState({
|
|
120
|
+
...state,
|
|
121
|
+
selectedConnectorId: id,
|
|
122
|
+
selectedElementId: undefined,
|
|
123
|
+
});
|
|
124
|
+
}, [state, updateState]);
|
|
125
|
+
const handleZoomIn = React.useCallback(() => {
|
|
126
|
+
setZoom(prev => Math.min(5, prev * 1.2));
|
|
127
|
+
}, []);
|
|
128
|
+
const handleZoomOut = React.useCallback(() => {
|
|
129
|
+
setZoom(prev => Math.max(0.1, prev / 1.2));
|
|
130
|
+
}, []);
|
|
131
|
+
const handleZoomReset = React.useCallback(() => {
|
|
132
|
+
setZoom(1);
|
|
133
|
+
}, []);
|
|
134
|
+
const handleFitToView = React.useCallback(() => {
|
|
135
|
+
if (state.elements.length === 0) {
|
|
136
|
+
setZoom(1);
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;
|
|
140
|
+
state.elements.forEach(el => {
|
|
141
|
+
minX = Math.min(minX, el.position.x);
|
|
142
|
+
minY = Math.min(minY, el.position.y);
|
|
143
|
+
maxX = Math.max(maxX, el.position.x + el.size.width);
|
|
144
|
+
maxY = Math.max(maxY, el.position.y + el.size.height);
|
|
145
|
+
});
|
|
146
|
+
const padding = 50;
|
|
147
|
+
const contentWidth = maxX - minX + padding * 2;
|
|
148
|
+
const contentHeight = maxY - minY + padding * 2;
|
|
149
|
+
const canvasWidth = window.innerWidth * 0.8;
|
|
150
|
+
const canvasHeight = window.innerHeight * 0.8;
|
|
151
|
+
const scaleX = canvasWidth / contentWidth;
|
|
152
|
+
const scaleY = canvasHeight / contentHeight;
|
|
153
|
+
const newZoom = Math.min(scaleX, scaleY, 1);
|
|
154
|
+
setZoom(newZoom);
|
|
155
|
+
}, [state.elements]);
|
|
156
|
+
React.useEffect(() => {
|
|
157
|
+
const handleKeyDown = (e) => {
|
|
158
|
+
if (e.target instanceof HTMLInputElement || e.target instanceof HTMLTextAreaElement) {
|
|
159
|
+
return;
|
|
160
|
+
}
|
|
161
|
+
switch (e.key.toLowerCase()) {
|
|
162
|
+
case 'v':
|
|
163
|
+
setSelectedTool('select');
|
|
164
|
+
break;
|
|
165
|
+
case 'c':
|
|
166
|
+
setSelectedTool('command');
|
|
167
|
+
break;
|
|
168
|
+
case 'e':
|
|
169
|
+
setSelectedTool('event');
|
|
170
|
+
break;
|
|
171
|
+
case 'r':
|
|
172
|
+
setSelectedTool('readmodel');
|
|
173
|
+
break;
|
|
174
|
+
case 'p':
|
|
175
|
+
setSelectedTool('process');
|
|
176
|
+
break;
|
|
177
|
+
case 'delete':
|
|
178
|
+
case 'backspace':
|
|
179
|
+
if (state.selectedElementId) {
|
|
180
|
+
handleDeleteElement(state.selectedElementId);
|
|
181
|
+
}
|
|
182
|
+
else if (state.selectedConnectorId) {
|
|
183
|
+
handleDeleteConnector(state.selectedConnectorId);
|
|
184
|
+
}
|
|
185
|
+
break;
|
|
186
|
+
case '+':
|
|
187
|
+
case '=':
|
|
188
|
+
handleZoomIn();
|
|
189
|
+
break;
|
|
190
|
+
case '-':
|
|
191
|
+
case '_':
|
|
192
|
+
handleZoomOut();
|
|
193
|
+
break;
|
|
194
|
+
case '0':
|
|
195
|
+
handleZoomReset();
|
|
196
|
+
break;
|
|
197
|
+
case 'f':
|
|
198
|
+
handleFitToView();
|
|
199
|
+
break;
|
|
200
|
+
}
|
|
201
|
+
};
|
|
202
|
+
window.addEventListener('keydown', handleKeyDown);
|
|
203
|
+
return () => window.removeEventListener('keydown', handleKeyDown);
|
|
204
|
+
}, [state, selectedTool, handleDeleteElement, handleDeleteConnector, handleZoomIn, handleZoomOut, handleZoomReset, handleFitToView]);
|
|
205
|
+
return (jsxRuntime.jsxs("div", { className: "event-modeling", style: { width, height }, children: [jsxRuntime.jsx(Toolbox.Toolbox, { selectedTool: selectedTool, onToolSelect: setSelectedTool }), jsxRuntime.jsx(Canvas.Canvas, { state: state, selectedTool: selectedTool, zoom: zoom, pan: pan, onZoomChange: handleZoomChange, onPanChange: handlePanChange, onAddElement: handleAddElement, onUpdateElement: handleUpdateElement, onAddConnector: handleAddConnector, onSelectElement: handleSelectElement, onSelectConnector: handleSelectConnector }), jsxRuntime.jsx(CanvasControls.CanvasControls, { zoom: zoom, onZoomIn: handleZoomIn, onZoomOut: handleZoomOut, onZoomReset: handleZoomReset, onFitToView: handleFitToView })] }));
|
|
206
|
+
};
|
|
207
|
+
|
|
208
|
+
exports.EventModeling = EventModeling;
|
|
209
|
+
//# sourceMappingURL=EventModeling.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EventModeling.js","sources":["../../../EventModeling/EventModeling.tsx"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport React, { useState, useCallback } from 'react';\nimport { EventModelingState, ElementData, Connector, ElementType, DEFAULT_ELEMENT_SIZE, calculateOptimalEdges } from './types';\nimport { Toolbox } from './components/Toolbox';\nimport { Canvas } from './components/Canvas';\nimport { CanvasControls } from './components/CanvasControls';\nimport './EventModeling.css';\n\nexport interface EventModelingProps {\n initialState?: EventModelingState;\n onStateChange?: (state: EventModelingState) => void;\n width?: string;\n height?: string;\n}\n\nexport const EventModeling: React.FC<EventModelingProps> = ({\n initialState,\n onStateChange,\n width = '100%',\n height = '100vh',\n}) => {\n const [state, setState] = useState<EventModelingState>(\n initialState || {\n elements: [],\n connectors: [],\n }\n );\n\n const [selectedTool, setSelectedTool] = useState<ElementType | 'select'>('select');\n const [zoom, setZoom] = useState(1);\n const [pan, setPan] = useState({ x: 0, y: 0 });\n\n const updateState = useCallback((newState: EventModelingState) => {\n setState(newState);\n onStateChange?.(newState);\n }, [onStateChange]);\n\n const handleZoomChange = useCallback((newZoom: number) => {\n setZoom(newZoom);\n }, []);\n\n const handlePanChange = useCallback((newPan: { x: number; y: number }) => {\n setPan(newPan);\n }, []);\n\n const handleAddElement = useCallback((type: ElementType, x: number, y: number) => {\n console.log('Adding element:', type, 'at', x, y); // Debug log\n const size = DEFAULT_ELEMENT_SIZE[type];\n const newElement: ElementData = {\n id: `${type}-${Date.now()}`,\n type,\n position: { x, y },\n size,\n label: `New ${type.charAt(0).toUpperCase() + type.slice(1)}`,\n };\n\n updateState({\n ...state,\n elements: [...state.elements, newElement],\n });\n\n // Auto-switch back to select tool after adding\n setSelectedTool('select');\n }, [state, updateState]);\n\n const handleUpdateElement = useCallback((id: string, updates: Partial<ElementData>) => {\n const updatedElements = state.elements.map(el =>\n el.id === id ? { ...el, ...updates } : el\n );\n\n // If position changed, update affected connectors to use optimal edges\n let updatedConnectors = state.connectors;\n if (updates.position) {\n updatedConnectors = state.connectors.map(connector => {\n // Check if this connector involves the moved element\n if (connector.from.elementId === id || connector.to.elementId === id) {\n const fromElement = updatedElements.find(el => el.id === connector.from.elementId);\n const toElement = updatedElements.find(el => el.id === connector.to.elementId);\n\n if (fromElement && toElement) {\n const optimalEdges = calculateOptimalEdges(fromElement, toElement);\n return {\n ...connector,\n from: { elementId: connector.from.elementId, side: optimalEdges.fromSide },\n to: { elementId: connector.to.elementId, side: optimalEdges.toSide },\n };\n }\n }\n return connector;\n });\n }\n\n updateState({\n ...state,\n elements: updatedElements,\n connectors: updatedConnectors,\n });\n }, [state, updateState]);\n\n const handleDeleteElement = useCallback((id: string) => {\n updateState({\n ...state,\n elements: state.elements.filter(el => el.id !== id),\n connectors: state.connectors.filter(\n conn => conn.from.elementId !== id && conn.to.elementId !== id\n ),\n selectedElementId: state.selectedElementId === id ? undefined : state.selectedElementId,\n });\n }, [state, updateState]);\n\n const handleAddConnector = useCallback((connector: Connector) => {\n // Prevent connecting element to itself\n if (connector.from.elementId === connector.to.elementId) {\n return;\n }\n\n // Find the elements to calculate optimal edges\n const fromElement = state.elements.find(el => el.id === connector.from.elementId);\n const toElement = state.elements.find(el => el.id === connector.to.elementId);\n\n if (!fromElement || !toElement) {\n return;\n }\n\n // Calculate optimal edges based on positions\n const optimalEdges = calculateOptimalEdges(fromElement, toElement);\n\n // Create connector with optimal edges\n const optimizedConnector: Connector = {\n ...connector,\n from: { elementId: connector.from.elementId, side: optimalEdges.fromSide },\n to: { elementId: connector.to.elementId, side: optimalEdges.toSide },\n };\n\n // Prevent duplicate connectors (checking element IDs only, not sides since we auto-adjust)\n const isDuplicate = state.connectors.some(\n c => c.from.elementId === optimizedConnector.from.elementId &&\n c.to.elementId === optimizedConnector.to.elementId\n );\n\n if (isDuplicate) {\n return;\n }\n\n updateState({\n ...state,\n connectors: [...state.connectors, optimizedConnector],\n });\n }, [state, updateState]);\n\n const handleDeleteConnector = useCallback((id: string) => {\n updateState({\n ...state,\n connectors: state.connectors.filter(conn => conn.id !== id),\n selectedConnectorId: state.selectedConnectorId === id ? undefined : state.selectedConnectorId,\n });\n }, [state, updateState]);\n\n const handleSelectElement = useCallback((id: string | undefined) => {\n updateState({\n ...state,\n selectedElementId: id,\n selectedConnectorId: undefined,\n });\n }, [state, updateState]);\n\n const handleSelectConnector = useCallback((id: string | undefined) => {\n updateState({\n ...state,\n selectedConnectorId: id,\n selectedElementId: undefined,\n });\n }, [state, updateState]);\n\n const handleZoomIn = useCallback(() => {\n setZoom(prev => Math.min(5, prev * 1.2));\n }, []);\n\n const handleZoomOut = useCallback(() => {\n setZoom(prev => Math.max(0.1, prev / 1.2));\n }, []);\n\n const handleZoomReset = useCallback(() => {\n setZoom(1);\n }, []);\n\n const handleFitToView = useCallback(() => {\n if (state.elements.length === 0) {\n setZoom(1);\n return;\n }\n\n // Calculate bounding box of all elements\n let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;\n state.elements.forEach(el => {\n minX = Math.min(minX, el.position.x);\n minY = Math.min(minY, el.position.y);\n maxX = Math.max(maxX, el.position.x + el.size.width);\n maxY = Math.max(maxY, el.position.y + el.size.height);\n });\n\n const padding = 50;\n const contentWidth = maxX - minX + padding * 2;\n const contentHeight = maxY - minY + padding * 2;\n\n // Get canvas size (approximate)\n const canvasWidth = window.innerWidth * 0.8;\n const canvasHeight = window.innerHeight * 0.8;\n\n const scaleX = canvasWidth / contentWidth;\n const scaleY = canvasHeight / contentHeight;\n const newZoom = Math.min(scaleX, scaleY, 1);\n\n setZoom(newZoom);\n }, [state.elements]);\n\n // Keyboard shortcuts\n React.useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.target instanceof HTMLInputElement || e.target instanceof HTMLTextAreaElement) {\n return;\n }\n\n switch (e.key.toLowerCase()) {\n case 'v':\n setSelectedTool('select');\n break;\n case 'c':\n setSelectedTool('command');\n break;\n case 'e':\n setSelectedTool('event');\n break;\n case 'r':\n setSelectedTool('readmodel');\n break;\n case 'p':\n setSelectedTool('process');\n break;\n case 'delete':\n case 'backspace':\n if (state.selectedElementId) {\n handleDeleteElement(state.selectedElementId);\n } else if (state.selectedConnectorId) {\n handleDeleteConnector(state.selectedConnectorId);\n }\n break;\n case '+':\n case '=':\n handleZoomIn();\n break;\n case '-':\n case '_':\n handleZoomOut();\n break;\n case '0':\n handleZoomReset();\n break;\n case 'f':\n handleFitToView();\n break;\n }\n };\n\n window.addEventListener('keydown', handleKeyDown);\n return () => window.removeEventListener('keydown', handleKeyDown);\n }, [state, selectedTool, handleDeleteElement, handleDeleteConnector, handleZoomIn, handleZoomOut, handleZoomReset, handleFitToView]);\n\n return (\n <div className=\"event-modeling\" style={{ width, height }}>\n <Toolbox\n selectedTool={selectedTool}\n onToolSelect={setSelectedTool}\n />\n <Canvas\n state={state}\n selectedTool={selectedTool}\n zoom={zoom}\n pan={pan}\n onZoomChange={handleZoomChange}\n onPanChange={handlePanChange}\n onAddElement={handleAddElement}\n onUpdateElement={handleUpdateElement}\n onAddConnector={handleAddConnector}\n onSelectElement={handleSelectElement}\n onSelectConnector={handleSelectConnector}\n />\n <CanvasControls\n zoom={zoom}\n onZoomIn={handleZoomIn}\n onZoomOut={handleZoomOut}\n onZoomReset={handleZoomReset}\n onFitToView={handleFitToView}\n />\n </div>\n );\n};\n"],"names":["useState","useCallback","DEFAULT_ELEMENT_SIZE","calculateOptimalEdges","_jsxs","_jsx","Toolbox","Canvas","CanvasControls"],"mappings":"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"}
|