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 }) => {
@@ -629,10 +272,13 @@ const ERDatabaseWrapperNode = ({ data, id }) => { const autoHeight = Math.max(1000, data.contentHeight + 200); // Base height + content + padding return ( -
+
{data.name} @@ -656,10 +302,13 @@ const ERSchemaGroupNode = ({ data, id }) => { const autoHeight = Math.max(600, rows * 280 + 200); // Base height + table height + padding return ( -
+
{data.name} @@ -668,16 +317,7 @@ const ERSchemaGroupNode = ({ data, id }) => {
{tableCount === 0 && ( -
+

No tables in this schema @@ -1913,11 +1553,9 @@ const ERDiagramCanvasContent = () => { } return ( -
-