* { margin: 0; padding: 0; box-sizing: border-box; } body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, sans-serif; overflow: hidden; background-color: #f5f5f5; margin: 0; padding: 0; height: 100vh; display: flex; flex-direction: column; } .toolbar { background-color: #f5f5f5; border-bottom: 1px solid #e0e0e0; padding: 10px 20px; display: flex; align-items: center; gap: 15px; height: 50px; flex-shrink: 0; } .toolbar-spacer { flex: 1; } .toolbar-info { display: flex; align-items: center; gap: 12px; font-size: 13px; color: #666; } .toolbar-info .separator { color: #ccc; } .project-selector { display: flex; align-items: center; gap: 8px; margin-right: 20px; } .project-selector label { font-size: 13px; font-weight: 500; color: #666; } .view-switcher-group { display: flex; gap: 15px; align-items: center; } .view-switcher { display: flex; gap: 0; border: 1px solid #e0e0e0; border-radius: 5px; overflow: hidden; background-color: white; } .btn-view { padding: 6px 16px; font-size: 13px; font-weight: 500; background-color: white; color: #666; border: none; border-right: 1px solid #e0e0e0; cursor: pointer; transition: all 0.2s ease; } .btn-view:last-child { border-right: none; } .btn-view:hover:not(.active) { background-color: #f5f5f5; color: #333; } .btn-view.active { background-color: #4A90E2; color: white; font-weight: 600; } .form-select { padding: 6px 12px; border: 1px solid #e0e0e0; border-radius: 5px; font-size: 13px; background-color: white; cursor: pointer; min-width: 200px; } .form-select:focus { outline: none; border-color: #4A90E2; } .btn-sm { padding: 6px 12px; font-size: 13px; font-weight: 500; background-color: #fff; color: #333; border: 1px solid #e0e0e0; border-radius: 4px; cursor: pointer; transition: all 0.2s ease; } .btn-sm:hover { background-color: #f5f5f5; border-color: #4A90E2; } .zoom-input { width: 60px; padding: 6px 8px; font-size: 13px; font-weight: 500; background-color: #fff; color: #333; border: 1px solid #e0e0e0; border-radius: 4px; text-align: center; transition: all 0.2s ease; } .zoom-input:focus { outline: none; border-color: #4A90E2; background-color: #f0f7ff; } .zoom-input:hover { border-color: #4A90E2; } .zoom-unit { font-size: 13px; font-weight: 500; color: #666; margin-left: -8px; } .btn { padding: 10px 20px; border: none; border-radius: 5px; font-size: 14px; font-weight: 500; cursor: pointer; transition: all 0.2s ease; } .btn-primary { background-color: #4A90E2; color: white; } .btn-primary:hover { background-color: #357ABD; box-shadow: 0 2px 8px rgba(74, 144, 226, 0.3); } .btn-secondary { background-color: #f5f5f5; color: #333; } .btn-secondary:hover { background-color: #e0e0e0; } /* Main Content Area with Split Panes */ .main-content { flex: 1; display: flex; flex-direction: column; overflow: hidden; position: relative; } .canvas-pane { flex: 1; overflow: hidden; position: relative; min-height: 200px; } #canvasWrapper { width: 100%; height: 100%; } .resize-handle { height: 6px; background-color: #e0e0e0; cursor: ns-resize; position: relative; flex-shrink: 0; transition: background-color 0.2s ease; } .resize-handle:hover { background-color: #4A90E2; } .resize-handle.hidden { display: none; } .table-pane { display: flex; flex-direction: column; background-color: #fff; overflow: hidden; min-height: 150px; height: 300px; } .table-pane.hidden { display: none; } /* Context Menu */ .context-menu { position: fixed; background-color: white; border: 1px solid #e0e0e0; border-radius: 6px; box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15); min-width: 200px; z-index: 1000; overflow: hidden; } .context-menu.hidden { display: none; } .context-menu ul { list-style: none; margin: 0; padding: 5px 0; } .context-menu li { padding: 10px 20px; cursor: pointer; font-size: 14px; color: #333; transition: background-color 0.15s ease; } .context-menu li:hover { background-color: #f5f5f5; } .context-menu li.divider { height: 1px; background-color: #e0e0e0; margin: 5px 0; padding: 0; cursor: default; } .context-menu li.divider:hover { background-color: #e0e0e0; } .context-menu li.menu-header { padding: 8px 20px 4px 20px; font-size: 12px; font-weight: 600; color: #999; text-transform: uppercase; cursor: default; pointer-events: none; } .context-menu li.menu-header:hover { background-color: transparent; } .context-menu li.spacing-control { display: flex; justify-content: space-between; align-items: center; padding: 10px 20px; cursor: default; } .context-menu li.spacing-control:hover { background-color: #f5f5f5; } .context-menu .spacing-label { font-size: 13px; color: #333; } .context-menu .spacing-buttons { display: flex; gap: 4px; } .context-menu .spacing-btn { width: 24px; height: 24px; padding: 0; border: 1px solid #e0e0e0; border-radius: 3px; background-color: #fff; color: #333; font-size: 16px; font-weight: bold; cursor: pointer; transition: all 0.2s ease; display: flex; align-items: center; justify-content: center; } .context-menu .spacing-btn:hover { background-color: #4A90E2; color: white; border-color: #4A90E2; } .context-menu .submenu-indicator { float: right; margin-left: 10px; } /* Modal */ .modal { position: fixed; top: 0; left: 0; right: 0; bottom: 0; background-color: rgba(0, 0, 0, 0.5); display: flex; align-items: center; justify-content: center; z-index: 2000; } .modal.hidden { display: none; } .modal-content { background-color: white; border-radius: 8px; min-width: 400px; max-width: 600px; max-height: 80vh; display: flex; flex-direction: column; box-shadow: 0 8px 24px rgba(0, 0, 0, 0.2); } .modal-content.modal-large { max-width: 800px; min-width: 600px; } .modal-header { padding: 20px; border-bottom: 1px solid #e0e0e0; display: flex; align-items: center; justify-content: space-between; } .modal-header h3 { font-size: 18px; color: #333; font-weight: 600; } .modal-close { background: none; border: none; font-size: 24px; color: #999; cursor: pointer; padding: 0; width: 30px; height: 30px; display: flex; align-items: center; justify-content: center; border-radius: 4px; transition: all 0.2s ease; } .modal-close:hover { background-color: #f5f5f5; color: #333; } .modal-body { padding: 20px; overflow-y: auto; } .port-list { display: grid; grid-template-columns: repeat(auto-fill, minmax(60px, 1fr)); gap: 10px; } .port-button { padding: 12px; border: 2px solid #e0e0e0; border-radius: 6px; background-color: #fff; cursor: pointer; font-size: 13px; font-weight: 500; transition: all 0.2s ease; text-align: center; } .port-button:hover:not(.used) { border-color: #4A90E2; background-color: #f0f7ff; transform: translateY(-2px); } .port-button.used { background-color: #f5f5f5; color: #999; cursor: not-allowed; border-color: #d0d0d0; } .port-button.selected { background-color: #4A90E2; color: white; border-color: #4A90E2; } /* Scrollbar styling */ ::-webkit-scrollbar { width: 8px; height: 8px; } ::-webkit-scrollbar-track { background: #f1f1f1; } ::-webkit-scrollbar-thumb { background: #c0c0c0; border-radius: 4px; } ::-webkit-scrollbar-thumb:hover { background: #a0a0a0; } /* Form Elements */ .form-section { margin-bottom: 25px; padding: 15px; background-color: #f9f9f9; border-radius: 6px; } .form-section h4 { margin: 0 0 15px 0; font-size: 15px; font-weight: 600; color: #333; } .form-row { display: grid; grid-template-columns: 1fr 1fr; gap: 15px; margin-bottom: 15px; } .form-group { margin-bottom: 20px; } .form-group label { display: block; margin-bottom: 8px; font-size: 14px; font-weight: 500; color: #333; } .form-input { width: 100%; padding: 10px 12px; border: 1px solid #e0e0e0; border-radius: 5px; font-size: 14px; transition: border-color 0.2s ease; font-family: inherit; } .form-input:focus { outline: none; border-color: #4A90E2; } textarea.form-input { resize: vertical; min-height: 80px; } .radio-group { display: flex; flex-direction: column; gap: 8px; } .radio-group label { display: flex; align-items: center; font-weight: normal; cursor: pointer; } .radio-group input[type="radio"] { margin-right: 8px; cursor: pointer; } .modal-footer { margin-top: 20px; display: flex; gap: 10px; justify-content: flex-end; } /* Device Type Grid */ .device-type-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(140px, 1fr)); gap: 12px; margin-top: 10px; } .device-type-card { background-color: #f9f9f9; border: 2px solid #e0e0e0; border-radius: 6px; padding: 15px; cursor: pointer; transition: all 0.2s ease; text-align: center; } .device-type-card:hover { background-color: #f0f0f0; border-color: #4A90E2; transform: translateY(-2px); box-shadow: 0 2px 8px rgba(74, 144, 226, 0.2); } .device-type-card .device-type-name { font-size: 14px; font-weight: 500; color: #333; margin-bottom: 6px; } .device-type-card .device-type-ports { font-size: 12px; color: #666; } /* Preview Box */ .preview-box { margin-top: 15px; padding: 12px; background-color: #fff; border: 1px solid #e0e0e0; border-radius: 5px; } .preview-box strong { display: block; margin-bottom: 8px; font-size: 13px; color: #666; } .preview-names { font-family: 'Courier New', monospace; font-size: 14px; color: #4A90E2; font-weight: 600; } /* Projects List */ .projects-list { display: flex; flex-direction: column; gap: 12px; } .project-card { background-color: #f9f9f9; border: 2px solid #e0e0e0; border-radius: 6px; padding: 15px; display: flex; justify-content: space-between; align-items: center; transition: all 0.2s ease; } .project-card:hover { background-color: #f5f5f5; border-color: #d0d0d0; } .project-card.active { background-color: #e3f2fd; border-color: #4A90E2; } .project-info { flex: 1; } .project-name { font-size: 16px; font-weight: 600; color: #333; margin-bottom: 4px; } .project-description { font-size: 13px; color: #666; margin-bottom: 6px; } .project-meta { font-size: 12px; color: #999; } .project-actions { display: flex; gap: 8px; } .btn-icon { padding: 8px 12px; border: none; border-radius: 4px; font-size: 13px; font-weight: 500; cursor: pointer; transition: all 0.2s ease; background-color: #fff; color: #666; border: 1px solid #e0e0e0; } .btn-icon:hover { background-color: #f5f5f5; color: #333; } .btn-danger { background-color: #fff; color: #d32f2f; border-color: #d32f2f; } .btn-danger:hover { background-color: #d32f2f; color: white; } .btn-success { background-color: #4CAF50; color: white; border-color: #4CAF50; } .btn-success:hover { background-color: #45a049; } .table-toolbar { padding: 10px 15px; border-bottom: 1px solid #e0e0e0; background-color: #f9f9f9; display: flex; gap: 10px; align-items: center; flex-shrink: 0; } #tableContent { flex: 1; width: 100%; overflow: hidden; } /* ag-Grid customization */ .ag-theme-alpine { --ag-header-height: 40px; --ag-row-height: 35px; --ag-font-size: 13px; --ag-header-foreground-color: #333; --ag-header-background-color: #f5f5f5; --ag-odd-row-background-color: #fafafa; --ag-row-hover-color: #f0f7ff; --ag-selected-row-background-color: #e3f2fd; }