* { 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); } } /* Header specific styles */ .header-logo-container { display: flex; align-items: center; } .header-logo { width: 40px; height: 40px; background: linear-gradient(45deg, #00a99d, #52c41a); border-radius: 8px; display: flex; align-items: center; justify-content: center; margin-right: 15px; box-shadow: 0 0 10px rgba(82, 196, 26, 0.5); animation: pulse 2s infinite; } .header-logo-icon { font-size: 20px; color: white; } .header-title { margin: 0; font-size: 1.5rem; background: linear-gradient(90deg, #00a99d, #52c41a, #fa8c16); /* -webkit-background-clip: text; */ -webkit-text-fill-color: transparent; text-shadow: 0 0 20px rgba(82, 196, 26, 0.3); } .header-controls { display: flex; align-items: center; } .user-profile-icon { margin-right: 8px; } /* Main layout styles */ .main-layout { flex: 1; display: flex; flex-direction: row; overflow: hidden; } .sidebar-nav { width: 220px; background: #1a1a1a; border-right: 1px solid #333; padding: 20px 0; display: flex; flex-direction: column; } .sidebar-nav-content { display: flex; flex-direction: column; gap: 5px; padding-left: 15px; } .nav-button.main-item { display: flex; align-items: center; padding: 12px 15px; border-radius: 6px; cursor: pointer; background: rgba(0, 169, 157, 0.15); transition: all 0.2s ease; margin-bottom: 5px; } .main-item-icon { font-size: 20px; color: #00a99d; margin-right: 12px; } .main-item-text { color: #fff; font-weight: 600; flex: 1; } .dropdown-chevron { color: #aaa; font-size: 14px; } .dropdown-container { flex-direction: column; gap: 4px; padding-left: 15px; margin-left: 10px; border-left: 1px solid rgba(170, 170, 170, 0.2); transition: all 0.3s ease; } .dropdown-container.open { display: flex; } .dropdown-container.closed { display: none; } .nav-button.dropdown-item { display: flex; align-items: center; padding: 8px 15px; border-radius: 6px; cursor: pointer; transition: all 0.2s ease; } .nav-button.dropdown-item:not(.active) { background: transparent; } .nav-button.dropdown-item.active { background: rgba(0, 169, 157, 0.1); } .dropdown-item-icon { font-size: 16px; margin-right: 12px; } .dropdown-item-icon.active { color: #00a99d; } .dropdown-item-icon.inactive { color: #aaa; } .dropdown-item-text { font-weight: normal; } .dropdown-item-text.active { color: #fff; font-weight: 500; } .dropdown-item-text.inactive { color: #aaa; } /* Main content area */ .main-content { flex: 1; overflow: hidden; position: relative; padding: 20px; } .page-header { margin-bottom: 20px; } .page-title { font-size: 28px; font-weight: 600; margin: 0 0 8px 0; color: #ffffff; } .charts-container { padding: 20px; height: 100%; overflow: auto; } /* Info panels */ .info-panel { position: absolute; bottom: 20px; left: 20px; background: rgba(26, 26, 26, 0.8); padding: 12px 16px; border-radius: 8px; box-shadow: 0 4px 12px rgba(0,0,0,0.3); font-size: 12px; pointer-events: none; backdrop-filter: blur(5px); color: #ffffff; max-width: 300px; animation: fadeIn 0.5s ease; } .info-panel.canvas { border: 1px solid rgba(82, 196, 26, 0.3); } .info-panel.dataflow { border: 1px solid rgba(250, 140, 22, 0.3); } .info-panel-main { margin: 0; display: flex; align-items: center; font-size: 13px; } .info-panel-indicator { display: inline-block; width: 8px; height: 8px; border-radius: 50%; margin-right: 8px; } .info-panel-indicator.canvas { background: #52c41a; box-shadow: 0 0 8px #52c41a; } .info-panel-indicator.dataflow { background: #fa8c16; box-shadow: 0 0 8px #fa8c16; } .info-panel-sub { margin: 5px 0 0 16px; font-size: 11px; opacity: 0.7; }