diff --git a/package-lock.json b/package-lock.json
index 69c46fc..5454638 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -36,6 +36,7 @@
"eslint-plugin-react-hooks": "^5.2.0",
"eslint-plugin-react-refresh": "^0.4.19",
"globals": "^16.0.0",
+ "sass-embedded": "^1.89.2",
"vite": "^6.3.5"
}
},
@@ -334,6 +335,13 @@
"node": ">=6.9.0"
}
},
+ "node_modules/@bufbuild/protobuf": {
+ "version": "2.5.2",
+ "resolved": "https://registry.npmjs.org/@bufbuild/protobuf/-/protobuf-2.5.2.tgz",
+ "integrity": "sha512-foZ7qr0IsUBjzWIq+SuBLfdQCpJ1j8cTuNNT4owngTHoN5KsJb8L9t65fzz7SCeSWzescoOil/0ldqiL041ABg==",
+ "dev": true,
+ "license": "(Apache-2.0 AND BSD-3-Clause)"
+ },
"node_modules/@emotion/babel-plugin": {
"version": "11.13.5",
"resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.13.5.tgz",
@@ -5711,6 +5719,13 @@
"node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
}
},
+ "node_modules/buffer-builder": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/buffer-builder/-/buffer-builder-0.2.0.tgz",
+ "integrity": "sha512-7VPMEPuYznPSoR21NE1zvd2Xna6c/CloiZCfcMXR1Jny6PjX0N4Nsa38zcBFo/FMK+BlA+FLKbJCQ0i2yxp+Xg==",
+ "dev": true,
+ "license": "MIT/X11"
+ },
"node_modules/bytes": {
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
@@ -5887,6 +5902,13 @@
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
"license": "MIT"
},
+ "node_modules/colorjs.io": {
+ "version": "0.5.2",
+ "resolved": "https://registry.npmjs.org/colorjs.io/-/colorjs.io-0.5.2.tgz",
+ "integrity": "sha512-twmVoizEW7ylZSN32OgKdXRmo1qg+wT5/6C3xu5b9QsWzSFAhHLn2xd8ro0diCsKfCj1RdaTP/nrcW+vAoQPIw==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/combined-stream": {
"version": "1.0.8",
"resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
@@ -7476,6 +7498,13 @@
"integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==",
"license": "MIT"
},
+ "node_modules/immutable": {
+ "version": "5.1.3",
+ "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.3.tgz",
+ "integrity": "sha512-+chQdDfvscSF1SJqv2gn4SRO2ZyS3xL3r7IW/wWEEzrzLisnOlKiQu5ytC/BVNcS15C39WT2Hg/bjKjDMcu+zg==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/import-fresh": {
"version": "3.3.1",
"resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz",
@@ -9049,6 +9078,335 @@
"integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
"license": "MIT"
},
+ "node_modules/sass-embedded": {
+ "version": "1.89.2",
+ "resolved": "https://registry.npmjs.org/sass-embedded/-/sass-embedded-1.89.2.tgz",
+ "integrity": "sha512-Ack2K8rc57kCFcYlf3HXpZEJFNUX8xd8DILldksREmYXQkRHI879yy8q4mRDJgrojkySMZqmmmW1NxrFxMsYaA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@bufbuild/protobuf": "^2.5.0",
+ "buffer-builder": "^0.2.0",
+ "colorjs.io": "^0.5.0",
+ "immutable": "^5.0.2",
+ "rxjs": "^7.4.0",
+ "supports-color": "^8.1.1",
+ "sync-child-process": "^1.0.2",
+ "varint": "^6.0.0"
+ },
+ "bin": {
+ "sass": "dist/bin/sass.js"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ },
+ "optionalDependencies": {
+ "sass-embedded-android-arm": "1.89.2",
+ "sass-embedded-android-arm64": "1.89.2",
+ "sass-embedded-android-riscv64": "1.89.2",
+ "sass-embedded-android-x64": "1.89.2",
+ "sass-embedded-darwin-arm64": "1.89.2",
+ "sass-embedded-darwin-x64": "1.89.2",
+ "sass-embedded-linux-arm": "1.89.2",
+ "sass-embedded-linux-arm64": "1.89.2",
+ "sass-embedded-linux-musl-arm": "1.89.2",
+ "sass-embedded-linux-musl-arm64": "1.89.2",
+ "sass-embedded-linux-musl-riscv64": "1.89.2",
+ "sass-embedded-linux-musl-x64": "1.89.2",
+ "sass-embedded-linux-riscv64": "1.89.2",
+ "sass-embedded-linux-x64": "1.89.2",
+ "sass-embedded-win32-arm64": "1.89.2",
+ "sass-embedded-win32-x64": "1.89.2"
+ }
+ },
+ "node_modules/sass-embedded-android-arm": {
+ "version": "1.89.2",
+ "resolved": "https://registry.npmjs.org/sass-embedded-android-arm/-/sass-embedded-android-arm-1.89.2.tgz",
+ "integrity": "sha512-oHAPTboBHRZlDBhyRB6dvDKh4KvFs+DZibDHXbkSI6dBZxMTT+Yb2ivocHnctVGucKTLQeT7+OM5DjWHyynL/A==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/sass-embedded-android-arm64": {
+ "version": "1.89.2",
+ "resolved": "https://registry.npmjs.org/sass-embedded-android-arm64/-/sass-embedded-android-arm64-1.89.2.tgz",
+ "integrity": "sha512-+pq7a7AUpItNyPu61sRlP6G2A8pSPpyazASb+8AK2pVlFayCSPAEgpwpCE9A2/Xj86xJZeMizzKUHxM2CBCUxA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/sass-embedded-android-riscv64": {
+ "version": "1.89.2",
+ "resolved": "https://registry.npmjs.org/sass-embedded-android-riscv64/-/sass-embedded-android-riscv64-1.89.2.tgz",
+ "integrity": "sha512-HfJJWp/S6XSYvlGAqNdakeEMPOdhBkj2s2lN6SHnON54rahKem+z9pUbCriUJfM65Z90lakdGuOfidY61R9TYg==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/sass-embedded-android-x64": {
+ "version": "1.89.2",
+ "resolved": "https://registry.npmjs.org/sass-embedded-android-x64/-/sass-embedded-android-x64-1.89.2.tgz",
+ "integrity": "sha512-BGPzq53VH5z5HN8de6jfMqJjnRe1E6sfnCWFd4pK+CAiuM7iw5Fx6BQZu3ikfI1l2GY0y6pRXzsVLdp/j4EKEA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/sass-embedded-darwin-arm64": {
+ "version": "1.89.2",
+ "resolved": "https://registry.npmjs.org/sass-embedded-darwin-arm64/-/sass-embedded-darwin-arm64-1.89.2.tgz",
+ "integrity": "sha512-UCm3RL/tzMpG7DsubARsvGUNXC5pgfQvP+RRFJo9XPIi6elopY5B6H4m9dRYDpHA+scjVthdiDwkPYr9+S/KGw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/sass-embedded-darwin-x64": {
+ "version": "1.89.2",
+ "resolved": "https://registry.npmjs.org/sass-embedded-darwin-x64/-/sass-embedded-darwin-x64-1.89.2.tgz",
+ "integrity": "sha512-D9WxtDY5VYtMApXRuhQK9VkPHB8R79NIIR6xxVlN2MIdEid/TZWi1MHNweieETXhWGrKhRKglwnHxxyKdJYMnA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/sass-embedded-linux-arm": {
+ "version": "1.89.2",
+ "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm/-/sass-embedded-linux-arm-1.89.2.tgz",
+ "integrity": "sha512-leP0t5U4r95dc90o8TCWfxNXwMAsQhpWxTkdtySDpngoqtTy3miMd7EYNYd1znI0FN1CBaUvbdCMbnbPwygDlA==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/sass-embedded-linux-arm64": {
+ "version": "1.89.2",
+ "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm64/-/sass-embedded-linux-arm64-1.89.2.tgz",
+ "integrity": "sha512-2N4WW5LLsbtrWUJ7iTpjvhajGIbmDR18ZzYRywHdMLpfdPApuHPMDF5CYzHbS+LLx2UAx7CFKBnj5LLjY6eFgQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/sass-embedded-linux-musl-arm": {
+ "version": "1.89.2",
+ "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm/-/sass-embedded-linux-musl-arm-1.89.2.tgz",
+ "integrity": "sha512-Z6gG2FiVEEdxYHRi2sS5VIYBmp17351bWtOCUZ/thBM66+e70yiN6Eyqjz80DjL8haRUegNQgy9ZJqsLAAmr9g==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/sass-embedded-linux-musl-arm64": {
+ "version": "1.89.2",
+ "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm64/-/sass-embedded-linux-musl-arm64-1.89.2.tgz",
+ "integrity": "sha512-nTyuaBX6U1A/cG7WJh0pKD1gY8hbg1m2SnzsyoFG+exQ0lBX/lwTLHq3nyhF+0atv7YYhYKbmfz+sjPP8CZ9lw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/sass-embedded-linux-musl-riscv64": {
+ "version": "1.89.2",
+ "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-riscv64/-/sass-embedded-linux-musl-riscv64-1.89.2.tgz",
+ "integrity": "sha512-N6oul+qALO0SwGY8JW7H/Vs0oZIMrRMBM4GqX3AjM/6y8JsJRxkAwnfd0fDyK+aICMFarDqQonQNIx99gdTZqw==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/sass-embedded-linux-musl-x64": {
+ "version": "1.89.2",
+ "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-x64/-/sass-embedded-linux-musl-x64-1.89.2.tgz",
+ "integrity": "sha512-K+FmWcdj/uyP8GiG9foxOCPfb5OAZG0uSVq80DKgVSC0U44AdGjvAvVZkrgFEcZ6cCqlNC2JfYmslB5iqdL7tg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/sass-embedded-linux-riscv64": {
+ "version": "1.89.2",
+ "resolved": "https://registry.npmjs.org/sass-embedded-linux-riscv64/-/sass-embedded-linux-riscv64-1.89.2.tgz",
+ "integrity": "sha512-g9nTbnD/3yhOaskeqeBQETbtfDQWRgsjHok6bn7DdAuwBsyrR3JlSFyqKc46pn9Xxd9SQQZU8AzM4IR+sY0A0w==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/sass-embedded-linux-x64": {
+ "version": "1.89.2",
+ "resolved": "https://registry.npmjs.org/sass-embedded-linux-x64/-/sass-embedded-linux-x64-1.89.2.tgz",
+ "integrity": "sha512-Ax7dKvzncyQzIl4r7012KCMBvJzOz4uwSNoyoM5IV6y5I1f5hEwI25+U4WfuTqdkv42taCMgpjZbh9ERr6JVMQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/sass-embedded-win32-arm64": {
+ "version": "1.89.2",
+ "resolved": "https://registry.npmjs.org/sass-embedded-win32-arm64/-/sass-embedded-win32-arm64-1.89.2.tgz",
+ "integrity": "sha512-j96iJni50ZUsfD6tRxDQE2QSYQ2WrfHxeiyAXf41Kw0V4w5KYR/Sf6rCZQLMTUOHnD16qTMVpQi20LQSqf4WGg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/sass-embedded-win32-x64": {
+ "version": "1.89.2",
+ "resolved": "https://registry.npmjs.org/sass-embedded-win32-x64/-/sass-embedded-win32-x64-1.89.2.tgz",
+ "integrity": "sha512-cS2j5ljdkQsb4PaORiClaVYynE9OAPZG/XjbOMxpQmjRIf7UroY4PEIH+Waf+y47PfXFX9SyxhYuw2NIKGbEng==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/sass-embedded/node_modules/supports-color": {
+ "version": "8.1.1",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
+ "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
+ }
+ },
"node_modules/scheduler": {
"version": "0.23.2",
"resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz",
@@ -9330,6 +9688,29 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/sync-child-process": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/sync-child-process/-/sync-child-process-1.0.2.tgz",
+ "integrity": "sha512-8lD+t2KrrScJ/7KXCSyfhT3/hRq78rC0wBFqNJXv3mZyn6hW2ypM05JmlSvtqRbeq6jqA94oHbxAr2vYsJ8vDA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "sync-message-port": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/sync-message-port": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/sync-message-port/-/sync-message-port-1.1.3.tgz",
+ "integrity": "sha512-GTt8rSKje5FilG+wEdfCkOcLL7LWqpMlr2c3LRuKt/YXxcJ52aGSbGBAdI4L3aaqfrBt6y711El53ItyH1NWzg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
"node_modules/tailwind-merge": {
"version": "3.3.0",
"resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-3.3.0.tgz",
@@ -9577,6 +9958,13 @@
"uuid": "dist/esm/bin/uuid"
}
},
+ "node_modules/varint": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/varint/-/varint-6.0.0.tgz",
+ "integrity": "sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/vary": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
diff --git a/package.json b/package.json
index 0d93485..4d1fe11 100644
--- a/package.json
+++ b/package.json
@@ -41,6 +41,7 @@
"eslint-plugin-react-hooks": "^5.2.0",
"eslint-plugin-react-refresh": "^0.4.19",
"globals": "^16.0.0",
+ "sass-embedded": "^1.89.2",
"vite": "^6.3.5"
}
}
diff --git a/src/components/ERDiagramCanvas.jsx b/src/components/ERDiagramCanvas.jsx
index 9fff256..87b6eac 100644
--- a/src/components/ERDiagramCanvas.jsx
+++ b/src/components/ERDiagramCanvas.jsx
@@ -17,13 +17,13 @@ import ReactFlow, {
MarkerType
} from 'reactflow';
import 'reactflow/dist/style.css';
+import './ERDiagramCanvas.scss';
import axios from 'axios';
// Import icons from react-icons
import {
FaDatabase,
FaTable,
- FaPlus,
FaTimes,
FaKey,
FaLink,
@@ -40,362 +40,7 @@ import { CustomDatabaseIcon, CustomDocumentIcon, CustomDimensionIcon } from './C
import { Breadcrumbs, Link, Typography, Menu, MenuItem, ListItemIcon, ListItemText } from '@mui/material';
import AddTableModal from './AddTableModal';
-// Custom styles for ER Diagram
-const generateERStyles = () => {
- return `
- .react-flow__node {
- z-index: 1;
- margin: 20px;
- }
-
- .er-database-wrapper {
- z-index: -2;
- pointer-events: all;
- border-radius: 25px;
- cursor: grab;
- user-select: none;
- transition: all 0.2s ease;
- padding: 100px;
- border: 3px solid rgba(0, 169, 157, 0.4);
- background: rgba(0, 169, 157, 0.03);
- box-shadow: 0 0 30px rgba(0, 169, 157, 0.1);
- }
-
- .er-database-wrapper:hover {
- border-color: rgba(0, 169, 157, 0.6);
- background: rgba(0, 169, 157, 0.05);
- box-shadow: 0 0 40px rgba(0, 169, 157, 0.15);
- }
-
- .er-database-wrapper:active {
- cursor: grabbing;
- }
-
- .er-database-label {
- position: absolute;
- top: 20px;
- left: 20px;
- background: rgba(0, 169, 157, 0.95);
- color: white;
- padding: 12px 16px;
- border-radius: 8px;
- font-size: 14px;
- font-weight: bold;
- box-shadow: 0 4px 12px rgba(0, 169, 157, 0.3);
- display: flex;
- align-items: center;
- gap: 10px;
- z-index: 15;
- }
-
- .er-schema-group {
- z-index: -1;
- pointer-events: all;
- border-radius: 20px;
- cursor: grab;
- user-select: none;
- transition: all 0.2s ease;
- padding: 80px;
- border: 2px dashed rgba(138, 43, 226, 0.3);
- background: rgba(138, 43, 226, 0.05);
- position: relative;
- overflow: visible;
- }
-
- .er-schema-group:hover {
- border-color: rgba(138, 43, 226, 0.5);
- background: rgba(138, 43, 226, 0.08);
- box-shadow: 0 0 20px rgba(138, 43, 226, 0.1);
- }
-
- .er-schema-group:active {
- cursor: grabbing;
- }
-
- .er-schema-label {
- position: absolute;
- top: 15px;
- left: 15px;
- background: rgba(138, 43, 226, 0.9);
- color: white;
- padding: 8px 12px;
- border-radius: 6px;
- font-size: 12px;
- font-weight: bold;
- box-shadow: 0 2px 8px rgba(138, 43, 226, 0.3);
- display: flex;
- align-items: center;
- gap: 8px;
- z-index: 10;
- }
-
- .er-table-node {
- background: white;
- border: 2px solid #e1e5e9;
- border-radius: 10px;
- box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
- width: 260px;
- min-height: 200px;
- transition: all 0.2s ease;
- }
-
- .er-table-node:hover {
- border-color: #8a2be2;
- box-shadow: 0 4px 16px rgba(138, 43, 226, 0.2);
- }
-
- .er-table-header {
- background: linear-gradient(135deg, #8a2be2, #9932cc);
- color: white;
- padding: 14px 16px;
- border-radius: 8px 8px 0 0;
- display: flex;
- align-items: center;
- gap: 10px;
- font-weight: bold;
- font-size: 15px;
- }
-
- .er-table-header.stage {
- background: linear-gradient(135deg, #00a99d, #52c41a);
- }
-
- .er-table-header.fact {
- background: linear-gradient(135deg, #fa8c16, #faad14);
- }
-
- .er-table-header.dimension {
- background: linear-gradient(135deg, #52c41a, #73d13d);
- }
-
- .er-column-list {
- padding: 0;
- margin: 0;
- list-style: none;
- max-height: 300px;
- overflow-y: auto;
- }
-
- .er-column-item {
- padding: 10px 16px;
- border-bottom: 1px solid #f0f0f0;
- display: flex;
- align-items: center;
- gap: 10px;
- font-size: 13px;
- transition: background-color 0.2s ease;
- }
-
- .er-column-item:hover {
- background-color: #f8f9fa;
- }
-
- .er-column-item:last-child {
- border-bottom: none;
- }
-
- .er-column-name {
- flex: 1;
- font-weight: 500;
- color: #333;
- }
-
- .er-column-type {
- color: #666;
- font-size: 11px;
- background: #f5f5f5;
- padding: 2px 6px;
- border-radius: 3px;
- }
-
- .er-primary-key {
- color: #faad14;
- }
-
- .er-foreign-key {
- color: #8a2be2;
- }
-
- .er-relationship-edge {
- stroke: #8a2be2;
- stroke-width: 2;
- }
-
- .er-relationship-edge .react-flow__edge-path {
- stroke: #8a2be2;
- stroke-width: 2;
- }
-
- .er-relationship-edge-animated {
- stroke: #8a2be2;
- stroke-width: 2;
- stroke-dasharray: 5;
- animation: dashdraw 0.5s linear infinite;
- }
-
- @keyframes dashdraw {
- to {
- stroke-dashoffset: -10;
- }
- }
-
- /* Enhanced arrow markers */
- .react-flow__edge.selected .react-flow__edge-path {
- stroke: #faad14 !important;
- stroke-width: 3 !important;
- }
-
- .react-flow__edge:hover .react-flow__edge-path {
- stroke: #52c41a !important;
- stroke-width: 3 !important;
- }
-
- /* Custom arrow styling */
- .er-custom-arrow {
- pointer-events: none;
- z-index: 10;
- }
-
- /* Cardinality indicators */
- .er-cardinality-indicator {
- background: rgba(255, 255, 255, 0.95) !important;
- border: 1px solid #8a2be2 !important;
- border-radius: 3px !important;
- padding: 2px 6px !important;
- font-size: 10px !important;
- font-weight: bold !important;
- color: #8a2be2 !important;
- box-shadow: 0 1px 3px rgba(0,0,0,0.2) !important;
- }
-
- /* Relationship direction indicators */
- .er-direction-arrow {
- fill: #8a2be2;
- stroke: #8a2be2;
- stroke-width: 1;
- }
-
- .er-direction-arrow.selected {
- fill: #faad14;
- stroke: #faad14;
- }
-
- .er-relationship-label {
- background: rgba(138, 43, 226, 0.9);
- color: white;
- padding: 4px 8px;
- border-radius: 4px;
- font-size: 10px;
- font-weight: bold;
- }
-
- .er-relationship-label:hover + .relationship-tooltip {
- opacity: 1 !important;
- }
-
- .er-add-button {
- position: fixed;
- bottom: 30px;
- right: 30px;
- width: 60px;
- height: 60px;
- border-radius: 50%;
- background: linear-gradient(135deg, #8a2be2, #9932cc);
- border: none;
- color: white;
- font-size: 24px;
- cursor: pointer;
- box-shadow: 0 4px 16px rgba(138, 43, 226, 0.3);
- transition: all 0.2s ease;
- z-index: 1000;
- display: flex;
- align-items: center;
- justify-content: center;
- }
-
- .er-add-button:hover {
- transform: scale(1.1);
- box-shadow: 0 6px 20px rgba(138, 43, 226, 0.4);
- }
-
- .er-add-button:active {
- transform: scale(0.95);
- }
-
- .er-breadcrumb-dropdown {
- display: inline-flex;
- align-items: center;
- cursor: pointer;
- padding: 4px 8px;
- border-radius: 4px;
- transition: background-color 0.2s ease;
- }
-
- .er-breadcrumb-dropdown:hover {
- background-color: rgba(0, 169, 157, 0.1);
- }
-
- .er-breadcrumb-dropdown .dropdown-arrow {
- margin-left: 4px;
- font-size: 12px;
- transition: transform 0.2s ease;
- }
-
- .er-breadcrumb-dropdown.open .dropdown-arrow {
- transform: rotate(180deg);
- }
-
- .er-service-menu {
- background: rgba(26, 26, 26, 0.95) !important;
- border: 1px solid rgba(0, 169, 157, 0.3) !important;
- border-radius: 8px !important;
- backdrop-filter: blur(10px) !important;
- box-shadow: 0 8px 32px rgba(0, 0, 0, 0.3) !important;
- }
-
- .er-service-menu .MuiMenuItem-root {
- color: #ffffff !important;
- padding: 12px 16px !important;
- border-radius: 4px !important;
- margin: 4px 8px !important;
- transition: all 0.2s ease !important;
- }
-
- .er-service-menu .MuiMenuItem-root:hover {
- background-color: rgba(0, 169, 157, 0.1) !important;
- }
-
- .er-service-menu .MuiListItemIcon-root {
- color: #00a99d !important;
- min-width: 32px !important;
- }
-
- /* Ensure ReactFlow markers are visible */
- .react-flow__edges {
- z-index: 1;
- }
-
- .react-flow__edge {
- pointer-events: all;
- }
-
- .react-flow__edge path {
- stroke: #8a2be2;
- stroke-width: 2;
- }
-
- .react-flow__edge.selected path {
- stroke: #faad14 !important;
- stroke-width: 3 !important;
- }
-
- /* Custom arrows are always visible */
- .er-custom-arrow {
- pointer-events: none;
- z-index: 10;
- }
- `;
-};
+
// Custom Table Node Component for ER Diagram
const ERTableNode = ({ data, id }) => {
@@ -417,12 +62,10 @@ const ERTableNode = ({ data, id }) => {