:root { --primary-color: #0d6efd; --secondary-color: #6c757d; --info-color: #0dcaf0; --success-color: #198754; /* New: for consistent status */ --danger-color: #dc3545; /* New: for conflict status */ --warning-color: #ffc107; /* New: for error status */ --border-color: #e9ecef; /* MODIFIED: Lighter border for a softer look */ --bg-color-light: #f8f9fa; --text-color: #212529; --text-color-light: #495057; /* NEW: for secondary text/headers */ /* Light Theme Code Colors */ --code-bg: #f8f8f8; /* Very light gray, like a parchment or fresh terminal */ --code-text: #333333; /* Darker text for readability */ --code-border: #e0e0e0; } /* Layout */ body { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif; margin: 0; padding: 20px; background-color: var(--bg-color-light); color: var(--text-color); } .container { max-width: 1200px; margin: 0 auto; background: #fff; border: 1px solid var(--border-color); padding: 30px; border-radius: 12px; /* MODIFIED: Larger radius for a modern feel */ box-shadow: 0 6px 15px rgba(0, 0, 0, 0.05); /* MODIFIED: Softer, deeper shadow */ position: relative; } /* NEW: Consistent Heading Styles */ h1 { font-size: 2rem; font-weight: 700; margin-top: 0; margin-bottom: 5px; } h2 { font-size: 1.5rem; font-weight: 600; margin-top: 30px; margin-bottom: 10px; color: var(--text-color-light); /* Subdued color for section headers */ } /* ------------------------------------------------------------- */ /* Action Buttons (General Styles) */ /* ------------------------------------------------------------- */ .action-button { font-size: 0.8rem; /* MODIFIED: Slightly smaller in the table for a cleaner fit */ padding: 4px 8px; /* MODIFIED: Tighter padding */ border-radius: 4px; cursor: pointer; border: 1px solid transparent; transition: all 0.2s ease; margin: 0; margin-right: 5px; min-width: 65px; /* NEW: Ensure uniform width in table */ text-align: center; } .action-button.disable { background-color: #fff; /* MODIFIED: Ghost/Outlined style for better contrast */ color: var(--secondary-color); border-color: #dcdcdc; /* MODIFIED: Light gray border */ font-weight: 500; } .action-button.disable:hover { background-color: var(--secondary-color); /* Solid on hover */ color: white; } .action-button.enable { background-color: var(--success-color); color: white; font-weight: 500; } .action-button.enable:hover { background-color: #157347; } .action-button.remove { background-color: var(--danger-color); color: white; } .action-button.remove:hover { background-color: #bb2d3b; } /* Add Chain Button */ .action-button.add { background-color: var(--success-color); /* MODIFIED: Using variable for consistency */ color: white; } .action-button.add:hover { background-color: #157347; } /* Cancel button for forms (like in the Add Chain modal) */ .action-button.cancel { background-color: var(--secondary-color); color: white; } .action-button.cancel:hover { background-color: #5c636a; } /* ------------------------------------------------------------- */ /* Consistency Status Indicator (Modernized) */ /* ------------------------------------------------------------- */ #consistency-status-container { position: absolute; top: 30px; right: 30px; z-index: 5; } #consistency-button { font-size: 0.85rem; /* MODIFIED: Smaller font */ padding: 5px 12px; /* MODIFIED: Tighter padding */ border-radius: 20px; /* MODIFIED: Pill-shaped */ font-weight: 700; cursor: default; pointer-events: none; transition: background-color 0.2s ease, transform 0.1s ease; border: none; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); /* NEW: Subtle shadow */ } #consistency-button.consistent { background-color: var(--success-color); color: white; } #consistency-button.inconsistent { background-color: var(--danger-color); color: white; cursor: pointer; pointer-events: auto; } #consistency-button.inconsistent:hover { background-color: #bb2d3b; transform: scale(1.02); } #consistency-button.error { background-color: var(--warning-color); color: var(--text-color); } #consistency-button:disabled { opacity: 0.8; } /* ------------------------------------------------------------- */ /* Toolbar (Modernized) - FIX APPLIED HERE */ /* ------------------------------------------------------------- */ .toolbar { display: flex; /* This pushes the .toolbar-left-group and .toolbar-right-group to opposite sides */ justify-content: space-between; gap: 10px; margin-bottom: 25px; margin-top: 25px; padding: 10px 0; border-top: 1px solid var(--border-color); border-bottom: 1px solid var(--border-color); } /* Grouping for Reload/Refresh buttons on the left */ .toolbar-left-group { display: flex; gap: 10px; } /* Grouping for Add New buttons on the right */ .toolbar-right-group { display: flex; gap: 10px; } .toolbar button { background-color: #fff; /* Ghost/Outlined button style for secondary actions */ color: var(--primary-color); border: 1px solid var(--primary-color); border-radius: 5px; padding: 8px 14px; font-size: 0.9rem; font-weight: 500; cursor: pointer; transition: all 0.2s ease; } .toolbar button:hover { background-color: var(--primary-color); color: white; /* Text inverts to white on hover */ } /* Primary Action Button Styles (Targeting the 'Add New' buttons via onclick attribute) */ .toolbar button[onclick*="showAddClusterModal"], .toolbar button[onclick*="showAddListenerModal"], .toolbar button[onclick*="showAddSecretModal"] { background-color: var(--primary-color); /* Solid background for primary actions */ color: white; border-color: var(--primary-color); box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1); /* Ensure no unwanted margin pushing */ margin-left: 0 !important; } .toolbar button[onclick*="showAddClusterModal"]:hover, .toolbar button[onclick*="showAddListenerModal"]:hover , .toolbar button[onclick*="showAddSecretModal"]:hover { background-color: #0b5ed7; border-color: #0b5ed7; } /* ------------------------------------------------------------- */ /* Table (Modernized - Striped and Cleaner) */ /* ------------------------------------------------------------- */ .config-table { width: 100%; border-collapse: separate; /* MODIFIED: Allows border-radius on cells */ border-spacing: 0; /* NEW: Removes spacing between borders */ margin-top: 15px; border: 1px solid var(--border-color); /* NEW: Single border around the table */ border-radius: 6px; /* NEW: Rounded corners on table */ overflow: hidden; } .config-table th, .config-table td { padding: 12px 15px; /* MODIFIED: Increased vertical padding */ text-align: left; border-bottom: none; /* MODIFIED: Removed internal horizontal lines */ vertical-align: middle; /* MODIFIED: Center align content vertically */ } .config-table th { background-color: var(--bg-color-light); /* MODIFIED: Lighter header background */ font-weight: 600; color: var(--text-color-light); /* MODIFIED: Subdued header text */ position: sticky; top: 0; z-index: 2; border-bottom: 1px solid var(--border-color); /* Re-add separator */ } /* NEW: Zebra Striping */ .config-table tbody tr:nth-child(even) { background-color: #fcfcfd; } .config-table tbody tr:nth-child(odd) { background-color: #fff; } /* Prevent whole row hover highlight (still needed) */ .config-table tr:hover { background-color: transparent; } /* Row-specific hover highlight (Softer blue on hover) */ .config-table tr:hover:not(.disabled-row) { background-color: #eef5ff; /* MODIFIED: Softer hover color */ } /* Status Column Text Styling for readability */ .config-table td:nth-child(2) { font-family: monospace; font-size: 0.875rem; color: var(--text-color-light); } .listener-name, .domain-name-link { font-weight: 600; color: var(--primary-color); cursor: pointer; text-decoration: none; /* MODIFIED: Remove default underline */ transition: color 0.15s ease; } /* Highlight only when hovering over the link itself */ .listener-name:hover, .domain-name-link:hover { text-decoration: underline; /* MODIFIED: Add underline only on hover */ color: #0b5ed7; } /* Keep non-clickable text normal */ .config-table td { cursor: default; } .disabled-row { opacity: 0.5; /* MODIFIED: Slightly more muted */ background-color: #fbfbfb !important; } .disabled-row .listener-name { text-decoration: line-through; } /* Badges */ .tls-badge { display: inline-block; background-color: var(--info-color); color: white; padding: 4px 8px; border-radius: 12px; font-size: 0.75rem; margin-left: 6px; } .filter-badge { display: inline-block; padding: 3px 6px; border-radius: 4px; font-size: 0.7rem; margin-left: 6px; } /* Domain Config */ .domain-config-list { display: flex; flex-direction: column; gap: 8px; margin-top: 6px; } .domain-config-item { background-color: #fcfcfc; border: 1px solid var(--border-color); border-radius: 6px; padding: 6px 10px; transition: background-color 0.2s ease; } .domain-config-item:hover { background-color: #eef5ff; } .domain-header { display: flex; justify-content: space-between; align-items: center; } .domain-name-link { color: var(--primary-color); font-weight: 500; cursor: pointer; } .domain-name-link:hover { text-decoration: underline; } /* IMPROVED: Layout for Route Type and Remove Button */ .route-type-display { font-size: 0.75rem; color: var(--secondary-color); margin-top: 3px; /* NEW: Use flex to align type and button on the same line */ display: flex; justify-content: space-between; /* Push button to the right */ align-items: center; } /* NEW: Style for the "Remove Chain" button inside the domain item */ .action-button.remove-chain-button { /* Override standard action button size */ font-size: 0.7rem; padding: 2px 6px; border-radius: 3px; margin: 0; /* Make it less aggressive than the full listener remove button */ background-color: #ff4d4d; /* A lighter, softer red */ color: white; border: 1px solid #ff4d4d; transition: all 0.2s ease; } .action-button.remove-chain-button:hover { background-color: var(--danger-color); /* Full red on hover */ border-color: var(--danger-color); } /* IMPROVED: Action column styling to stack buttons neatly (for the last column) */ .config-table td:last-child { display: flex; flex-direction: column; /* Stack buttons vertically */ gap: 4px; /* Small space between stacked buttons */ /* Ensure padding is kept */ padding: 10px 12px; } /* Target buttons in the main Action column to ensure consistent width */ .config-table td:last-child .action-button { margin-right: 0; /* Remove horizontal margin */ width: 100%; /* Make them full width for that column */ box-sizing: border-box; text-align: center; } /* ============================================================= */ /* MODAL FIXES AND TAB STYLING (Consistent) */ /* ============================================================= */ .modal { display: none; position: fixed; z-index: 1000; left: 0; top: 0; width: 100%; height: 100%; padding-top: 50px; background-color: rgba(0, 0, 0, 0.5); overflow: auto; } .modal-content { background-color: #fff; margin: 0 auto; padding: 25px; border-radius: 8px; max-width: 900px; width: 80%; box-shadow: 0 5px 20px rgba(0, 0, 0, 0.3); position: relative; max-height: 90vh; overflow-y: auto; } /* NEW: Consistent Modal Header */ .modal-header { display: flex; justify-content: space-between; align-items: center; padding-bottom: 10px; } /* Close Button Styling and Positioning Fix */ .close-btn, /* The one used in the secondary modals */ .modal-content > .close { /* The one used in the main configModal (Unified) */ color: #aaa; font-size: 28px; font-weight: bold; line-height: 1; cursor: pointer; position: absolute; top: 10px; right: 20px; z-index: 10; } .close-btn:hover, .close-btn:focus, .modal-content > .close:hover, .modal-content > .close:focus { color: #000; text-decoration: none; } .modal-content h2, .modal-content h3 { /* Apply to H2 and H3 for consistency */ padding-right: 40px; margin-top: 0; /* Ensures consistent top margin on modal headers */ } /* Tab Controls Styling */ .tab-controls { display: flex; align-items: flex-end; margin: 15px 0 0; border-bottom: 2px solid var(--border-color); } .tab-button { background: transparent; border: none; border-bottom: 2px solid transparent; padding: 10px 15px; font-size: 1rem; font-weight: 600; cursor: pointer; color: var(--secondary-color); transition: all 0.2s ease; margin-bottom: -2px; } .tab-button.active { color: var(--primary-color); border-bottom-color: var(--primary-color); } /* Download Button Styling */ .download-button { margin-left: auto; background-color: var(--primary-color); color: white; border-radius: 4px; border-bottom: none !important; padding: 8px 15px; font-size: 0.9rem; font-weight: 500; } .download-button:hover { background-color: #0b5ed7; } /* Light Theme Code Block Styling (applies to both JSON and YAML) */ .code-block { background: var(--code-bg); color: var(--code-text); font-family: monospace; font-size: 0.9rem; padding: 15px; border-radius: 4px; border: 1px solid var(--code-border); max-height: 500px; overflow: auto; white-space: pre; word-wrap: normal; } /* ------------------------------------------------------------- */ /* Add Filter Chain & Add Listener Modal Styles (Unified) */ /* ------------------------------------------------------------- */ /* Styles for the larger content area within the modal */ .modal-content.large-modal { max-width: 900px; width: 90%; } /* Styles for the YAML textarea input (Unified for all YAML inputs) */ #add-fc-yaml-input, #add-listener-yaml-input, #add-cluster-yaml-input , #add-secret-yaml-input { /* Unified ID for consistency */ width: 100%; font-family: monospace; font-size: 0.9rem; padding: 10px; border: 1px solid var(--border-color); border-radius: 4px; background-color: var(--code-bg); color: var(--code-text); resize: vertical; box-sizing: border-box; min-height: 250px; /* Ensures Add Listener textarea has a good starting height */ } /* Styles for the label above the textarea (Unified for all form labels) */ label[for="add-fc-yaml-input"], label[for="add-listener-yaml-input"], label[for="add-cluster-yaml-input"], label[for="add-secret-yaml-input"]{ /* Unified ID for consistency */ display: block; font-weight: 600; margin-bottom: 5px; margin-top: 15px; } .modal-note { font-size: 0.85rem; color: var(--secondary-color); margin-top: 20px; padding-top: 10px; border-top: 1px solid var(--border-color); } /* ------------------------------------------------------------- */ /* Consistency Modal Specific Styles (Enhanced) */ /* ------------------------------------------------------------- */ /* Modal Action buttons container (Unified Footer) */ .modal-actions { display: flex; justify-content: flex-end; gap: 15px; padding-top: 15px; border-top: 1px solid var(--border-color); margin-top: 20px; } .modal-actions button { font-size: 1rem; padding: 10px 20px; line-height: 1.2; text-align: center; min-width: 150px; /* Consistent minimum width for action buttons */ } .modal-actions small { font-weight: 400; display: block; font-size: 0.75rem; opacity: 0.9; } #inconsistency-details-content pre { /* Ensure consistency modal PRE elements also use the light code-block styles for scrolling */ background: var(--code-bg); color: var(--code-text); padding: 10px; border-radius: 4px; border: 1px solid var(--code-border); font-size: 0.9rem; max-height: 300px; overflow: auto; white-space: pre; word-wrap: normal; } /* Consistency Conflict List styling (Enhanced) */ .conflict-list { list-style: none; padding: 0; margin: 10px 0 20px 0; border: 1px solid var(--code-border); border-radius: 4px; background-color: var(--code-bg); max-height: 200px; overflow-y: auto; } .conflict-list li { padding: 8px 10px; border-bottom: 1px solid var(--code-border); font-size: 0.95rem; display: flex; gap: 10px; align-items: center; } .conflict-list li:last-child { border-bottom: none; } .conflict-list li:nth-child(even) { background-color: transparent; } .conflict-list .no-conflicts { color: var(--success-color); font-weight: 500; background-color: #e6f7ef; border-radius: 4px; padding: 10px; margin: 5px; border: 1px solid rgba(25, 135, 84, 0.2); text-align: center; } .conflict-type { font-weight: 600; color: var(--primary-color); background-color: #e9f2ff; padding: 2px 6px; border-radius: 4px; } .conflict-name { font-family: monospace; font-weight: 500; color: var(--text-color); flex-grow: 1; } /* ------------------------------------------------------------- */ /* Responsive */ @media (max-width: 768px) { .config-table th, .config-table td { font-size: 0.85rem; padding: 8px; } .container { padding: 15px; } .modal-content { width: 95%; margin: 10px auto; } .modal { padding-top: 20px; } #consistency-status-container { top: 15px; right: 15px; } } /* Style for the validity status labels */ .status-label { padding: 2px 8px; border-radius: 4px; font-size: 0.85em; font-weight: bold; color: white; /* Default text color */ margin-left: 5px; text-transform: uppercase; } .status-label.invalid { background-color: var(--error-color, #ff4d4f); /* Red color for Invalid */ } .status-label.valid { background-color: var(--success-color, #52c41a); /* Green color for Valid */ } /* Custom styles for the Certificate Issuer link/button (Issue New Certificate) */ /* Container to ensure the heading and the button are on the same line and spaced correctly */ .secrets-header-container { display: flex; align-items: center; justify-content: space-between; margin-top: 30px; /* Use the same top margin as H2 for proper spacing */ margin-bottom: 10px; /* Use the same bottom margin as H2 for proper spacing */ } .cert-issuer-button { /* Style to match existing header buttons (e.g., Add/Update Cluster) */ display: inline-flex; align-items: center; /* Using toolbar button styling for consistency */ background-color: var(--primary-color); color: white; border: 1px solid var(--primary-color); border-radius: 5px; padding: 8px 14px; font-size: 0.9rem; font-weight: 500; cursor: pointer; text-decoration: none; /* Remove underline from the anchor tag */ transition: all 0.2s ease; /* Ensure height is consistent with existing toolbar buttons */ height: 42; /* Based on 8px padding + 0.9rem font size in .toolbar button */ /* Add a subtle shadow consistent with primary toolbar buttons */ box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1); } .cert-issuer-button:hover { background-color: #0b5ed7; /* Darker primary color on hover (same as toolbar) */ border-color: #0b5ed7; color: white; } /* Style for the text label within the button */ .cert-issuer-button-text { margin-right: 8px; /* Space between text and icon */ font-size: 0.9rem; /* Match button text size */ } /* Style for the plus icon within the button */ .cert-issuer-button-icon { font-size: 1.1rem; /* Slightly larger plus sign for emphasis */ line-height: 1; }