* { box-sizing: border-box; margin: 0; padding: 0; } html, body, #root { width: 100%; height: 100%; margin: 0; padding: 0; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif; } /* ReactFlow specific styles */ .react-flow__node { border-radius: 5px; font-size: 12px; color: #222; text-align: left; border-width: 1px; border-style: solid; transition: transform 0.2s, box-shadow 0.2s; } .react-flow__node:hover { transform: translateY(-2px); box-shadow: 0 4px 8px rgba(0,0,0,0.15); z-index: 10; } .react-flow__node-database { background: #e6f7ff; border-color: #1890ff; } .react-flow__node-schema { background: #f6ffed; border-color: #52c41a; } .react-flow__node-table.fact { background: #fff1f0; border-color: #ff4d4f; } .react-flow__node-table.dimension { background: #f9f0ff; border-color: #722ed1; } .react-flow__handle { width: 8px; height: 8px; background-color: #1890ff; } .react-flow__edge-path { stroke: #1890ff; stroke-width: 1.5; } .react-flow__edge.animated path { stroke-dasharray: 5; animation: dashdraw 0.5s linear infinite; } /* Enhanced infinite canvas styles */ .react-flow__pane { cursor: grab; } .react-flow__pane.dragging { cursor: grabbing; } .react-flow__controls { box-shadow: 0 0 10px rgba(0,0,0,0.15); border-radius: 8px; overflow: hidden; } .react-flow__controls-button { background: white; border: none; border-bottom: 1px solid #eee; padding: 8px; transition: background-color 0.2s; } .react-flow__controls-button:hover { background-color: #f0f0f0; } .react-flow__minimap { border-radius: 8px; overflow: hidden; box-shadow: 0 0 10px rgba(0,0,0,0.15); } /* Connection mode animation */ @keyframes pulse { 0% { transform: scale(0.95); box-shadow: 0 0 0 0 rgba(82, 196, 26, 0.7); } 70% { transform: scale(1); box-shadow: 0 0 0 10px rgba(82, 196, 26, 0); } 100% { transform: scale(0.95); box-shadow: 0 0 0 0 rgba(82, 196, 26, 0); } } /* Custom edge styles */ .react-flow__edge.reference path { stroke: #00a99d; stroke-width: 2; } .react-flow__edge.dependency path { stroke: #ff4d4f; stroke-width: 2; } .react-flow__edge.default path { stroke: #722ed1; stroke-width: 2; } /* Connection handle styles */ .react-flow__handle { width: 12px !important; height: 12px !important; border-radius: 50%; border: 2px solid white; transition: all 0.2s ease; } .react-flow__handle:hover { transform: scale(1.3); box-shadow: 0 0 10px rgba(0, 0, 0, 0.3); } .react-flow__handle-top { top: -6px; } .react-flow__handle-right { right: -6px; } .react-flow__handle-bottom { bottom: -6px; } .react-flow__handle-left { left: -6px; } /* Connection line styles */ .react-flow__connection-path { stroke-width: 3; } /* Make nodes stand out when in connection mode */ .react-flow.connection-mode .react-flow__node { filter: drop-shadow(0 0 8px rgba(24, 144, 255, 0.5)); } @keyframes dashdraw { from { stroke-dashoffset: 10; } } /* Custom node styles */ .database-node, .schema-node, .table-node { padding: 10px; border-radius: 5px; box-shadow: 0 2px 5px rgba(0,0,0,0.1); transition: all 0.2s ease; } .database-node:hover, .schema-node:hover, .table-node:hover { transform: translateY(-2px); box-shadow: 0 4px 8px rgba(0,0,0,0.15); } /* App layout styles */ .app-container { display: flex; flex-direction: column; height: 100vh; width: 100vw; overflow: hidden; background: #121212; color: #ffffff; } header { background: #1a1a1a; color: white; padding: 15px 20px; display: flex; justify-content: space-between; align-items: center; box-shadow: 0 2px 15px rgba(0,0,0,0.5); z-index: 10; border-bottom: 1px solid #333; position: relative; overflow: hidden; } /* Animated gradient border for header */ header::after { content: ''; position: absolute; bottom: 0; left: 0; width: 100%; height: 2px; background: linear-gradient(90deg, #00a99d, #52c41a, #fa8c16, #722ed1, #00a99d); background-size: 400% 400%; animation: gradient-shift 8s ease infinite; } @keyframes gradient-shift { 0% { background-position: 0% 50%; } 50% { background-position: 100% 50%; } 100% { background-position: 0% 50%; } } aside { width: 250px; background: #1a1a1a; padding: 20px; border-right: 1px solid #333; overflow-y: auto; box-shadow: inset -5px 0 15px rgba(0,0,0,0.2); } /* Animated hover effects for sidebar items */ aside li { transition: all 0.3s ease; border-radius: 4px; position: relative; z-index: 1; overflow: hidden; } aside li::before { content: ''; position: absolute; top: 0; left: -100%; width: 100%; height: 100%; background: linear-gradient(90deg, transparent, rgba(255,255,255,0.1), transparent); transition: all 0.5s ease; z-index: -1; } aside li:hover::before { left: 100%; } aside li:hover { background: rgba(255,255,255,0.05); transform: translateX(5px); padding-left: 5px; } main { flex: 1; overflow: hidden; position: relative; background: #121212; } /* Utility classes */ .clickable { cursor: pointer; } .panel { background: #1a1a1a; border-radius: 5px; padding: 10px; box-shadow: 0 2px 8px rgba(0,0,0,0.5); color: #ffffff; border: 1px solid #333; } /* Dark theme for ReactFlow */ .react-flow__controls { background: #1a1a1a; box-shadow: 0 0 10px rgba(0,0,0,0.5); } .react-flow__controls-button { background: #1a1a1a; border-bottom: 1px solid #333; color: #ffffff; } .react-flow__controls-button:hover { background: #333; } .react-flow__controls-button svg { fill: #ffffff; } .react-flow__minimap { background: #1a1a1a; border: 1px solid #333; } .react-flow__attribution { background: rgba(26, 26, 26, 0.8); color: #ffffff; } /* Glowing effect for nodes on hover */ .react-flow__node:hover { box-shadow: 0 0 15px rgba(82, 196, 26, 0.6); } /* Animated background for the canvas */ .react-flow__background { animation: bg-pulse 10s ease infinite; } @keyframes bg-pulse { 0% { opacity: 0.3; } 50% { opacity: 0.5; } 100% { opacity: 0.3; } } /* Animated connection lines */ .react-flow__edge path { stroke-dasharray: 5; /* animation: flow-line 30s linear infinite; */ } @keyframes flow-line { to { stroke-dashoffset: -1000; } } /* Navigation item hover effects */ .nav-item { position: relative; overflow: hidden; } .nav-item:hover { background: rgba(255, 255, 255, 0.1); } .nav-item::after { content: ''; position: absolute; bottom: 0; left: 50%; width: 0; height: 2px; background: linear-gradient(90deg, #00a99d, #52c41a); transition: all 0.3s ease; transform: translateX(-50%); } .nav-item:hover::after { width: 80%; } /* Secondary navigation bar styles */ .secondary-nav { display: flex; align-items: center; padding: 10px 20px; border-bottom: 1px solid rgba(255, 255, 255, 0.05); background: rgba(18, 18, 18, 0.8); backdrop-filter: blur(10px); box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1); position: relative; } /* Navigation button styles */ .nav-button { display: flex; align-items: center; padding: 6px 12px; border-radius: 4px; cursor: pointer; transition: all 0.2s ease; margin-right: 8px; user-select: none; } .nav-button:hover { background: rgba(0, 169, 157, 0.1); transform: translateY(-1px); } .nav-button.active { background: rgba(0, 169, 157, 0.15); border: 1px solid rgba(0, 169, 157, 0.3); } .nav-button.active span { color: #fff; font-weight: 500; } .nav-button svg { margin-right: 8px; } /* User profile button styles */ .user-profile { display: flex; align-items: center; background: rgba(255, 255, 255, 0.05); padding: 6px 12px; border-radius: 20px; cursor: pointer; border: 1px solid rgba(255, 255, 255, 0.1); transition: all 0.2s ease; } .user-profile:hover { background: rgba(255, 255, 255, 0.1); transform: translateY(-1px); } .notification-button { width: 32px; height: 32px; border-radius: 50%; background: rgba(255, 255, 255, 0.05); display: flex; align-items: center; justify-content: center; cursor: pointer; border: 1px solid rgba(255, 255, 255, 0.1); transition: all 0.2s ease; } .notification-button:hover { background: rgba(255, 255, 255, 0.1); transform: translateY(-1px); } /* Glow effect for active elements */ .glow-effect { box-shadow: 0 0 15px rgba(82, 196, 26, 0.6); transition: all 0.3s ease; } .glow-effect:hover { box-shadow: 0 0 20px rgba(82, 196, 26, 0.8); } /* Fade in animation */ @keyframes fadeIn { from { opacity: 0; transform: translateY(10px); } to { opacity: 1; transform: translateY(0); } }