Spaces:
Running
Running
| /* assets/custom.css */ | |
| /* --- General & Typography (Item 7, 11) --- */ | |
| body { | |
| background-color: #F7F9FC; /* Neutral background */ | |
| color: #212B36; /* Dark text */ | |
| font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, sans-serif; | |
| font-size: 14px; | |
| } | |
| /* Use H1 from dbc.Container/app.layout directly */ | |
| .h1, h1 { | |
| font-size: 24px; /* H2 equivalent in request */ | |
| font-weight: 600; | |
| } | |
| /* Card titles */ | |
| .card-title.h5, .h5.card-title { | |
| font-size: 18px; /* H3 equivalent */ | |
| font-weight: 600; | |
| margin-bottom: 1rem; /* Add space below title */ | |
| } | |
| /* Form labels (Item 2) */ | |
| .form-label { | |
| font-size: 14px; | |
| font-weight: 500; | |
| margin-bottom: 0.3rem; /* Space between label and input */ | |
| display: block; /* Ensure it takes full width */ | |
| } | |
| /* Form inputs (Item 2) */ | |
| .form-control, | |
| .form-select { | |
| font-size: 14px; | |
| /* width: 100%; Ensure inputs take full width - Bootstrap usually handles this in columns */ | |
| padding: 0.5rem 0.75rem; | |
| border-radius: 0.375rem; /* Softer corners */ | |
| } | |
| /* Form help text */ | |
| .form-text { | |
| font-size: 12px; | |
| color: #6c757d; /* Muted color */ | |
| } | |
| /* --- Layout & Spacing (Item 1, 7) --- */ | |
| .container-fluid { | |
| padding-top: 2rem; | |
| padding-bottom: 2rem; | |
| } | |
| /* Spacing between form rows inside cards */ | |
| .card-body .mb-3 { | |
| margin-bottom: 1rem !important; /* Default is 1rem, ensure consistency */ | |
| } | |
| /* Spacing between cards */ | |
| .card { | |
| margin-bottom: 24px; | |
| border: 1px solid #dee2e6; /* Subtle border */ | |
| border-radius: 0.5rem; /* Consistent radius */ | |
| box-shadow: 0 2px 4px rgba(0,0,0,0.05); /* Subtle shadow */ | |
| /* Padding is handled by card-body */ | |
| } | |
| /* --- Button Styling (Item 4, 5, 11) --- */ | |
| /* Primary Action Button (Generate Schedule) */ | |
| #generate-button.btn-primary { | |
| background-color: #0A74DA; /* Accent color */ | |
| border-color: #0A74DA; | |
| font-weight: 500; | |
| padding: 0.6rem 1.2rem; /* Slightly larger padding */ | |
| } | |
| #generate-button.btn-primary:hover, | |
| #generate-button.btn-primary:focus { | |
| background-color: #085ead; /* Darker accent on hover/focus */ | |
| border-color: #085ead; | |
| } | |
| #generate-button.btn-primary:disabled { | |
| background-color: #a0cff7; /* Lighter, muted accent when disabled */ | |
| border-color: #a0cff7; | |
| } | |
| /* Strategy Toggle Buttons */ | |
| .btn-group .btn { | |
| margin-right: 0.5rem; /* Space between buttons */ | |
| margin-bottom: 0.5rem; /* Space for wrapping */ | |
| border-radius: 1rem; /* Pill shape */ | |
| padding: 0.4rem 0.8rem; | |
| font-size: 13px; | |
| } | |
| /* Active strategy button */ | |
| .btn-group .btn.btn-primary:not(.disabled):not(:disabled).active, | |
| .btn-group .btn.btn-primary:not(.disabled):not(:disabled):active { | |
| background-color: #0A74DA; /* Accent color */ | |
| border-color: #0A74DA; | |
| color: white; | |
| box-shadow: none; /* Remove default active shadow if needed */ | |
| } | |
| /* Inactive strategy button (using outline secondary) */ | |
| .btn-group .btn.btn-outline-secondary { | |
| border-color: #ced4da; | |
| color: #495057; | |
| } | |
| .btn-group .btn.btn-outline-secondary:hover { | |
| background-color: #e9ecef; | |
| } | |
| /* --- Validation Feedback --- */ | |
| .invalid-feedback { | |
| font-size: 12px; | |
| margin-top: 0.25rem; | |
| } | |
| /* --- Responsive Adjustments (Item 10) --- */ | |
| /* Bootstrap handles column stacking. We might need more specific rules later */ | |
| /* e.g., adjust chart container width/scrolling on smaller screens */ | |
| /* Chart Container - Add basic styles, will be refined (Item 9) */ | |
| #graph-output-container .plotly.graph-div { | |
| /* Add styles for the chart itself if needed */ | |
| } | |
| /* Custom CSS for Pipeline Parallelism Schedule Visualizer */ | |
| /* Smooth transitions for all interactive elements */ | |
| * { | |
| transition: all 0.3s ease; | |
| } | |
| /* Enhanced card hover effects */ | |
| .card { | |
| border-radius: 12px !important; | |
| overflow: hidden; | |
| } | |
| .card:hover { | |
| transform: translateY(-4px); | |
| box-shadow: 0 8px 24px rgba(0,0,0,0.12) !important; | |
| } | |
| /* Strategy card animations */ | |
| .strategy-card { | |
| border-radius: 10px; | |
| position: relative; | |
| overflow: hidden; | |
| } | |
| .strategy-card::before { | |
| content: ''; | |
| position: absolute; | |
| top: 0; | |
| left: -100%; | |
| width: 100%; | |
| height: 100%; | |
| background: linear-gradient(90deg, transparent, rgba(102, 126, 234, 0.1), transparent); | |
| transition: left 0.5s ease; | |
| } | |
| .strategy-card:hover::before { | |
| left: 100%; | |
| } | |
| .strategy-card.selected { | |
| box-shadow: 0 4px 12px rgba(102, 126, 234, 0.2); | |
| } | |
| /* Enhanced button animations */ | |
| .btn-primary { | |
| position: relative; | |
| overflow: hidden; | |
| } | |
| .btn-primary::before { | |
| content: ''; | |
| position: absolute; | |
| top: 50%; | |
| left: 50%; | |
| width: 0; | |
| height: 0; | |
| border-radius: 50%; | |
| background: rgba(255, 255, 255, 0.2); | |
| transform: translate(-50%, -50%); | |
| transition: width 0.6s, height 0.6s; | |
| } | |
| .btn-primary:active::before { | |
| width: 300px; | |
| height: 300px; | |
| } | |
| /* Loading animation enhancement */ | |
| ._dash-loading { | |
| position: relative; | |
| } | |
| ._dash-loading::after { | |
| content: ''; | |
| position: absolute; | |
| top: 50%; | |
| left: 50%; | |
| width: 40px; | |
| height: 40px; | |
| margin: -20px 0 0 -20px; | |
| border: 3px solid #f3f3f3; | |
| border-top: 3px solid #667eea; | |
| border-radius: 50%; | |
| animation: spin 1s linear infinite; | |
| } | |
| @keyframes spin { | |
| 0% { transform: rotate(0deg); } | |
| 100% { transform: rotate(360deg); } | |
| } | |
| /* Tab animations */ | |
| .nav-tabs .nav-link { | |
| position: relative; | |
| transition: all 0.3s ease; | |
| } | |
| .nav-tabs .nav-link::after { | |
| content: ''; | |
| position: absolute; | |
| bottom: 0; | |
| left: 50%; | |
| width: 0; | |
| height: 3px; | |
| background: #667eea; | |
| transform: translateX(-50%); | |
| transition: width 0.3s ease; | |
| } | |
| .nav-tabs .nav-link:hover::after { | |
| width: 100%; | |
| } | |
| .nav-tabs .nav-link.active::after { | |
| width: 100%; | |
| } | |
| /* Metric card animations */ | |
| .metric-card { | |
| transition: all 0.3s ease; | |
| } | |
| .metric-card:hover { | |
| transform: translateY(-5px); | |
| box-shadow: 0 8px 20px rgba(102, 126, 234, 0.15) !important; | |
| } | |
| /* Progress bar animations */ | |
| .progress { | |
| overflow: visible; | |
| } | |
| .progress-bar { | |
| position: relative; | |
| animation: progressAnimation 1s ease-out; | |
| } | |
| @keyframes progressAnimation { | |
| from { | |
| width: 0; | |
| } | |
| } | |
| /* Toast animations */ | |
| .toast { | |
| animation: slideIn 0.3s ease-out; | |
| } | |
| @keyframes slideIn { | |
| from { | |
| transform: translateX(100%); | |
| opacity: 0; | |
| } | |
| to { | |
| transform: translateX(0); | |
| opacity: 1; | |
| } | |
| } | |
| /* Input focus effects */ | |
| .form-control:focus { | |
| transform: translateY(-2px); | |
| box-shadow: 0 4px 12px rgba(102, 126, 234, 0.15) !important; | |
| } | |
| /* Badge pulse animation */ | |
| .badge { | |
| animation: pulse 2s infinite; | |
| } | |
| @keyframes pulse { | |
| 0% { | |
| transform: scale(1); | |
| } | |
| 50% { | |
| transform: scale(1.05); | |
| } | |
| 100% { | |
| transform: scale(1); | |
| } | |
| } | |
| /* Smooth scrolling */ | |
| html { | |
| scroll-behavior: smooth; | |
| } | |
| /* Enhanced tooltip styling */ | |
| .tooltip { | |
| font-size: 0.875rem; | |
| } | |
| .tooltip-inner { | |
| background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); | |
| padding: 8px 12px; | |
| border-radius: 6px; | |
| } | |
| /* Graph container enhancements */ | |
| .graph-container { | |
| position: relative; | |
| } | |
| .graph-container::before { | |
| content: ''; | |
| position: absolute; | |
| top: -2px; | |
| left: -2px; | |
| right: -2px; | |
| bottom: -2px; | |
| background: linear-gradient(45deg, #667eea, #764ba2, #667eea); | |
| border-radius: 10px; | |
| opacity: 0; | |
| z-index: -1; | |
| transition: opacity 0.3s ease; | |
| } | |
| .graph-container:hover::before { | |
| opacity: 0.1; | |
| } | |
| /* Responsive improvements */ | |
| @media (max-width: 768px) { | |
| .main-header { | |
| padding: 1.5rem 0; | |
| } | |
| .main-header h1 { | |
| font-size: 1.75rem; | |
| } | |
| .strategy-card { | |
| margin-bottom: 0.75rem; | |
| } | |
| .metric-card { | |
| margin-bottom: 1rem; | |
| } | |
| } | |
| /* Dark mode support */ | |
| @media (prefers-color-scheme: dark) { | |
| body { | |
| background-color: #1a1a1a; | |
| color: #e0e0e0; | |
| } | |
| .card { | |
| background-color: #2a2a2a; | |
| color: #e0e0e0; | |
| } | |
| .form-control { | |
| background-color: #3a3a3a; | |
| border-color: #4a4a4a; | |
| color: #e0e0e0; | |
| } | |
| .form-control:focus { | |
| background-color: #3a3a3a; | |
| border-color: #667eea; | |
| color: #e0e0e0; | |
| } | |
| } | |
| /* Print styles */ | |
| @media print { | |
| .main-header { | |
| background: none !important; | |
| color: #000 !important; | |
| } | |
| .card { | |
| box-shadow: none !important; | |
| border: 1px solid #ddd !important; | |
| } | |
| .btn { | |
| display: none !important; | |
| } | |
| } | |
| /* Pipeline Parallelism Schedule Visualizer - Custom CSS */ | |
| /* --- Base Typography & Colors --- */ | |
| body { | |
| font-family: 'Inter', -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif; | |
| background-color: #f8f9fa; | |
| color: #212B36; | |
| font-size: 14px; | |
| } | |
| /* --- Header Section --- */ | |
| .main-header { | |
| background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); | |
| color: white; | |
| padding: 2rem 0; | |
| margin-bottom: 2rem; | |
| box-shadow: 0 4px 6px rgba(0,0,0,0.1); | |
| } | |
| .main-header h1 { | |
| font-size: 2rem; | |
| font-weight: 600; | |
| margin-bottom: 0; | |
| } | |
| .main-header .lead { | |
| font-size: 1.1rem; | |
| opacity: 0.9; | |
| } | |
| /* --- Cards & Containers --- */ | |
| .card { | |
| border: none; | |
| box-shadow: 0 2px 4px rgba(0,0,0,0.05); | |
| transition: all 0.3s ease; | |
| border-radius: 12px; | |
| overflow: hidden; | |
| margin-bottom: 24px; | |
| } | |
| .card:hover { | |
| transform: translateY(-4px); | |
| box-shadow: 0 8px 24px rgba(0,0,0,0.12); | |
| } | |
| .card-body { | |
| padding: 1.5rem; | |
| } | |
| /* --- Strategy Cards --- */ | |
| .strategy-card { | |
| cursor: pointer; | |
| border: 2px solid #e9ecef; | |
| transition: all 0.3s ease; | |
| height: 100%; | |
| border-radius: 10px; | |
| background: white; | |
| position: relative; | |
| overflow: hidden; | |
| } | |
| .strategy-card::before { | |
| content: ''; | |
| position: absolute; | |
| top: 0; | |
| left: -100%; | |
| width: 100%; | |
| height: 100%; | |
| background: linear-gradient(90deg, transparent, rgba(102, 126, 234, 0.1), transparent); | |
| transition: left 0.5s ease; | |
| } | |
| .strategy-card:hover { | |
| border-color: #667eea; | |
| transform: translateY(-2px); | |
| box-shadow: 0 4px 12px rgba(102, 126, 234, 0.15); | |
| } | |
| .strategy-card:hover::before { | |
| left: 100%; | |
| } | |
| .strategy-card.selected { | |
| border-color: #667eea; | |
| background: linear-gradient(135deg, #f8f9ff 0%, #f0f2ff 100%); | |
| box-shadow: 0 4px 12px rgba(102, 126, 234, 0.2); | |
| } | |
| .strategy-card i { | |
| font-size: 1.5rem; | |
| color: #667eea; | |
| margin-bottom: 0.5rem; | |
| display: block; | |
| } | |
| /* --- Section Titles --- */ | |
| .section-title { | |
| font-size: 1.1rem; | |
| font-weight: 600; | |
| color: #495057; | |
| margin-bottom: 1rem; | |
| display: flex; | |
| align-items: center; | |
| gap: 0.5rem; | |
| } | |
| .section-icon { | |
| color: #667eea; | |
| } | |
| /* --- Forms & Inputs --- */ | |
| .form-label { | |
| font-weight: 500; | |
| color: #495057; | |
| margin-bottom: 0.5rem; | |
| display: block; | |
| } | |
| .form-control, .form-select { | |
| font-size: 14px; | |
| padding: 0.5rem 0.75rem; | |
| border-radius: 8px; | |
| border: 1px solid #dee2e6; | |
| transition: all 0.3s ease; | |
| } | |
| .form-control:focus { | |
| border-color: #667eea; | |
| box-shadow: 0 0 0 0.2rem rgba(102, 126, 234, 0.25); | |
| transform: translateY(-2px); | |
| } | |
| .input-group-text { | |
| background-color: #f8f9fa; | |
| border: 1px solid #dee2e6; | |
| border-radius: 8px 0 0 8px; | |
| } | |
| .form-text { | |
| font-size: 12px; | |
| color: #6c757d; | |
| margin-top: 0.25rem; | |
| } | |
| .invalid-feedback { | |
| font-size: 0.875rem; | |
| margin-top: 0.25rem; | |
| } | |
| /* --- Buttons --- */ | |
| .btn-primary { | |
| background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); | |
| border: none; | |
| font-weight: 500; | |
| padding: 0.75rem 1.5rem; | |
| transition: all 0.3s ease; | |
| position: relative; | |
| overflow: hidden; | |
| } | |
| .btn-primary::before { | |
| content: ''; | |
| position: absolute; | |
| top: 50%; | |
| left: 50%; | |
| width: 0; | |
| height: 0; | |
| border-radius: 50%; | |
| background: rgba(255, 255, 255, 0.2); | |
| transform: translate(-50%, -50%); | |
| transition: width 0.6s, height 0.6s; | |
| } | |
| .btn-primary:hover:not(:disabled) { | |
| transform: translateY(-2px); | |
| box-shadow: 0 4px 12px rgba(102, 126, 234, 0.4); | |
| } | |
| .btn-primary:active::before { | |
| width: 300px; | |
| height: 300px; | |
| } | |
| .btn-primary:disabled { | |
| opacity: 0.6; | |
| cursor: not-allowed; | |
| } | |
| .btn-light { | |
| background-color: #f8f9fa; | |
| border-color: #dee2e6; | |
| color: #495057; | |
| } | |
| .btn-light:hover { | |
| background-color: #e9ecef; | |
| border-color: #dee2e6; | |
| color: #495057; | |
| } | |
| /* --- Tabs --- */ | |
| .nav-tabs { | |
| border-bottom: 2px solid #e9ecef; | |
| } | |
| .nav-tabs .nav-link { | |
| color: #6c757d; | |
| border: none; | |
| padding: 0.75rem 1.5rem; | |
| font-weight: 500; | |
| position: relative; | |
| transition: all 0.3s ease; | |
| } | |
| .nav-tabs .nav-link::after { | |
| content: ''; | |
| position: absolute; | |
| bottom: 0; | |
| left: 50%; | |
| width: 0; | |
| height: 3px; | |
| background: #667eea; | |
| transform: translateX(-50%); | |
| transition: width 0.3s ease; | |
| } | |
| .nav-tabs .nav-link:hover { | |
| color: #667eea; | |
| background-color: #f8f9fa; | |
| } | |
| .nav-tabs .nav-link:hover::after { | |
| width: 100%; | |
| } | |
| .nav-tabs .nav-link.active { | |
| color: #667eea; | |
| background-color: transparent; | |
| border-bottom: 3px solid #667eea; | |
| } | |
| .nav-tabs .nav-link.active::after { | |
| width: 100%; | |
| } | |
| /* --- Graphs & Visualizations --- */ | |
| .graph-container { | |
| background: white; | |
| border-radius: 8px; | |
| padding: 1rem; | |
| box-shadow: 0 2px 4px rgba(0,0,0,0.05); | |
| margin-bottom: 1.5rem; | |
| position: relative; | |
| min-height: 400px; /* Ensure minimum height */ | |
| width: 100%; /* Full width */ | |
| } | |
| /* Ensure Plotly graphs are fully visible */ | |
| .graph-container .js-plotly-plot, | |
| .graph-container .plot-container, | |
| .graph-container .plotly { | |
| width: 100% !important; | |
| height: auto !important; | |
| min-height: 350px; | |
| } | |
| /* Fix for the main modebar groups */ | |
| .graph-container .modebar { | |
| position: absolute !important; | |
| top: 10px; | |
| right: 10px; | |
| } | |
| /* Ensure the SVG container is properly sized */ | |
| .graph-container .main-svg { | |
| overflow: visible !important; | |
| } | |
| /* Tab content container should have proper height */ | |
| #tab-content-container { | |
| min-height: 500px; | |
| width: 100%; | |
| } | |
| /* Individual tab content */ | |
| [id^="content-"] { | |
| width: 100%; | |
| min-height: 450px; | |
| } | |
| /* Ensure the graph output container has proper dimensions */ | |
| #graph-output-container { | |
| width: 100%; | |
| overflow-x: auto; /* Allow horizontal scroll if needed */ | |
| overflow-y: visible; | |
| } | |
| /* Visualization Results card should expand to content */ | |
| .card:has(#graph-output-container) { | |
| overflow: visible; | |
| } | |
| .card-body:has(#graph-output-container) { | |
| overflow: visible; | |
| padding-bottom: 2rem; /* Extra padding at bottom */ | |
| } | |
| /* --- Execution Summary --- */ | |
| .execution-summary { | |
| background: linear-gradient(135deg, #f8f9ff 0%, #f0f2ff 100%); | |
| border-radius: 8px; | |
| padding: 1.5rem; | |
| margin-top: 2rem; | |
| } | |
| .metric-card { | |
| background: white; | |
| border-radius: 8px; | |
| padding: 1.5rem; | |
| text-align: center; | |
| box-shadow: 0 2px 4px rgba(0,0,0,0.05); | |
| transition: all 0.3s ease; | |
| } | |
| .metric-card:hover { | |
| transform: translateY(-5px); | |
| box-shadow: 0 8px 20px rgba(102, 126, 234, 0.15); | |
| } | |
| .metric-value { | |
| font-size: 2rem; | |
| font-weight: 700; | |
| color: #667eea; | |
| } | |
| .metric-label { | |
| font-size: 0.875rem; | |
| color: #6c757d; | |
| margin-top: 0.25rem; | |
| } | |
| /* --- Alerts & Toasts --- */ | |
| .alert { | |
| border-radius: 8px; | |
| border: none; | |
| } | |
| .alert-info { | |
| background-color: #e7f3ff; | |
| color: #0c5460; | |
| } | |
| .alert-light { | |
| background-color: #f8f9fa; | |
| color: #495057; | |
| } | |
| .toast { | |
| min-width: 300px; | |
| border-radius: 8px; | |
| border: none; | |
| animation: slideIn 0.3s ease-out; | |
| } | |
| .toast-header { | |
| background-color: transparent; | |
| border-bottom: 1px solid rgba(0,0,0,0.05); | |
| } | |
| @keyframes slideIn { | |
| from { | |
| transform: translateX(100%); | |
| opacity: 0; | |
| } | |
| to { | |
| transform: translateX(0); | |
| opacity: 1; | |
| } | |
| } | |
| /* --- Badges --- */ | |
| .badge { | |
| padding: 0.35em 0.65em; | |
| font-weight: 500; | |
| animation: pulse 2s infinite; | |
| } | |
| @keyframes pulse { | |
| 0% { transform: scale(1); } | |
| 50% { transform: scale(1.05); } | |
| 100% { transform: scale(1); } | |
| } | |
| /* --- Progress Bars --- */ | |
| .progress { | |
| height: 10px; | |
| border-radius: 5px; | |
| background-color: #e9ecef; | |
| overflow: visible; | |
| } | |
| .progress-bar { | |
| border-radius: 5px; | |
| position: relative; | |
| animation: progressAnimation 1s ease-out; | |
| } | |
| @keyframes progressAnimation { | |
| from { width: 0; } | |
| } | |
| /* --- Loading Animation --- */ | |
| ._dash-loading { | |
| position: relative; | |
| } | |
| ._dash-loading::after { | |
| content: ''; | |
| position: absolute; | |
| top: 50%; | |
| left: 50%; | |
| width: 40px; | |
| height: 40px; | |
| margin: -20px 0 0 -20px; | |
| border: 3px solid #f3f3f3; | |
| border-top: 3px solid #667eea; | |
| border-radius: 50%; | |
| animation: spin 1s linear infinite; | |
| } | |
| @keyframes spin { | |
| 0% { transform: rotate(0deg); } | |
| 100% { transform: rotate(360deg); } | |
| } | |
| /* --- Tooltips --- */ | |
| .tooltip { | |
| font-size: 0.875rem; | |
| } | |
| .tooltip-inner { | |
| background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); | |
| padding: 8px 12px; | |
| border-radius: 6px; | |
| } | |
| /* --- Utilities --- */ | |
| html { | |
| scroll-behavior: smooth; | |
| } | |
| .collapse { | |
| transition: height 0.35s ease; | |
| } | |
| /* --- Footer --- */ | |
| footer { | |
| background-color: #f8f9fa; | |
| margin-top: 3rem; | |
| } | |
| /* --- Responsive Design --- */ | |
| @media (max-width: 992px) { | |
| .main-header { | |
| padding: 1.5rem 0; | |
| } | |
| .main-header h1 { | |
| font-size: 1.75rem; | |
| } | |
| .section-title { | |
| font-size: 1rem; | |
| } | |
| .metric-value { | |
| font-size: 1.5rem; | |
| } | |
| } | |
| @media (max-width: 768px) { | |
| .main-header h1 { | |
| font-size: 1.5rem; | |
| } | |
| .strategy-card { | |
| margin-bottom: 0.75rem; | |
| } | |
| .metric-card { | |
| margin-bottom: 1rem; | |
| } | |
| .nav-tabs .nav-link { | |
| padding: 0.5rem 1rem; | |
| font-size: 0.875rem; | |
| } | |
| .card-body { | |
| padding: 1rem; | |
| } | |
| } | |
| /* --- Dark Mode Support --- */ | |
| @media (prefers-color-scheme: dark) { | |
| body { | |
| background-color: #1a1a1a; | |
| color: #e0e0e0; | |
| } | |
| .card { | |
| background-color: #2a2a2a; | |
| color: #e0e0e0; | |
| } | |
| .strategy-card { | |
| background-color: #2a2a2a; | |
| border-color: #3a3a3a; | |
| } | |
| .form-control, .form-select { | |
| background-color: #3a3a3a; | |
| border-color: #4a4a4a; | |
| color: #e0e0e0; | |
| } | |
| .form-control:focus { | |
| background-color: #3a3a3a; | |
| border-color: #667eea; | |
| color: #e0e0e0; | |
| } | |
| .input-group-text { | |
| background-color: #3a3a3a; | |
| border-color: #4a4a4a; | |
| color: #e0e0e0; | |
| } | |
| .nav-tabs .nav-link { | |
| color: #a0a0a0; | |
| } | |
| .nav-tabs .nav-link:hover { | |
| background-color: #2a2a2a; | |
| } | |
| .alert-info { | |
| background-color: #1e3a5f; | |
| color: #a0c4ff; | |
| } | |
| .alert-light { | |
| background-color: #2a2a2a; | |
| color: #e0e0e0; | |
| } | |
| footer { | |
| background-color: #2a2a2a; | |
| } | |
| } | |
| /* --- Print Styles --- */ | |
| @media print { | |
| .main-header { | |
| background: none !important; | |
| color: #000 !important; | |
| } | |
| .card { | |
| box-shadow: none !important; | |
| border: 1px solid #ddd !important; | |
| } | |
| .btn, .toast-container { | |
| display: none !important; | |
| } | |
| .strategy-card { | |
| border: 1px solid #ddd !important; | |
| } | |
| } | |
| /* --- Layout Fixes for Graph Display --- */ | |
| /* Ensure the visualization column takes proper space */ | |
| .row > .col-lg-8 { | |
| flex: 0 0 auto; | |
| width: 66.66667%; | |
| max-width: none; /* Remove max-width constraint */ | |
| } | |
| /* Ensure cards don't clip content */ | |
| .card { | |
| overflow: visible !important; | |
| } | |
| .card-body { | |
| overflow: visible !important; | |
| } | |
| /* Fix for tab container */ | |
| .tab-content { | |
| overflow: visible !important; | |
| } | |
| /* Ensure proper spacing for graph container */ | |
| .graph-container { | |
| margin: 0 -0.5rem; /* Negative margin to use full width */ | |
| padding: 1rem 1.5rem; /* Compensate with padding */ | |
| } | |
| /* Override any Bootstrap constraints */ | |
| .container-fluid { | |
| max-width: none !important; | |
| } | |
| /* Responsive adjustments for larger screens */ | |
| @media (min-width: 1200px) { | |
| .row > .col-lg-8 { | |
| width: 70%; /* Give more space to visualization on large screens */ | |
| } | |
| .row > .col-lg-4 { | |
| width: 30%; | |
| } | |
| } | |
| /* Fix plotly's own responsive behavior */ | |
| .js-plotly-plot .plotly .main-svg { | |
| overflow: visible !important; | |
| } | |
| .js-plotly-plot .plotly .modebar-container { | |
| position: absolute; | |
| top: 0; | |
| right: 0; | |
| } | |
| /* Ensure the alert message doesn't interfere */ | |
| #welcome-message { | |
| margin-bottom: 0; | |
| } | |
| /* Final fixes for Plotly graph display */ | |
| .dash-graph { | |
| width: 100% !important; | |
| height: auto !important; | |
| } | |
| .js-plotly-plot { | |
| width: 100% !important; | |
| height: auto !important; | |
| } | |
| .plotly-graph-div { | |
| width: 100% !important; | |
| overflow: visible !important; | |
| } | |
| /* Ensure the graph container div inside dcc.Graph has proper dimensions */ | |
| ._dash-graph-container { | |
| width: 100% !important; | |
| overflow: visible !important; | |
| } | |
| /* Fix for SVG container */ | |
| .svg-container { | |
| width: 100% !important; | |
| height: auto !important; | |
| } | |
| /* Ensure modebar doesn't interfere with layout */ | |
| .modebar-container { | |
| position: absolute !important; | |
| z-index: 1000; | |
| } | |
| /* Override any inline styles that might be constraining the graph */ | |
| div[style*="height: 400px"] { | |
| height: auto !important; | |
| min-height: 400px !important; | |
| } | |
| /* Ensure responsive behavior on window resize */ | |
| @media screen and (max-width: 1400px) { | |
| .row > .col-lg-8 { | |
| width: 100%; | |
| margin-bottom: 2rem; | |
| } | |
| .row > .col-lg-4 { | |
| width: 100%; | |
| } | |
| } |