:root { --primary-color: #3f51b5; --primary-light: #757de8; --primary-dark: #002984; --secondary-color: #4caf50; --accent-color: #ff9800; --error-color: #f44336; --text-primary: #333; --text-secondary: #666; --background-light: #fff; --background-off: #f5f7fa; --border-color: #ddd; --font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, sans-serif; --shadow-sm: 0 1px 3px rgba(0, 0, 0, 0.12), 0 1px 2px rgba(0, 0, 0, 0.24); } /* Base Styles */ body { font-family: var(--font-family); margin: 0; padding: 0; background: var(--background-off); color: var(--text-primary); } .app-container { min-height: 100vh; display: flex; flex-direction: column; } /* Header */ .main-header { background-color: var(--primary-color); color: white; padding: 1rem; box-shadow: var(--shadow-sm); } .header-container { display: flex; justify-content: space-between; align-items: center; max-width: 1200px; margin: 0 auto; } .logo { font-size: 1.5rem; font-weight: bold; } .tagline { font-size: 0.8rem; opacity: 0.8; } /* Navigation */ .nav-list { list-style: none; display: flex; gap: 1rem; padding: 0; margin: 0; } .nav-link { color: white; cursor: pointer; padding: 0.5rem 1rem; border-radius: 4px; text-decoration: none; } .nav-link:hover { background-color: rgba(255, 255, 255, 0.1); } .nav-link.active { background-color: rgba(255, 255, 255, 0.2); } /* Main Content */ .main-content { flex: 1; max-width: 1200px; margin: 0 auto; padding: 1rem; } .section-title { font-size: 2rem; color: var(--primary-dark); margin-bottom: 1.5rem; } /* Grid Layout */ .lab-container { display: grid; grid-template-columns: 300px 1fr; gap: 1.5rem; } @media (max-width: 900px) { .lab-container { grid-template-columns: 1fr; } } /* Panels */ .panel { background: white; border-radius: 8px; padding: 1rem; box-shadow: var(--shadow-sm); } .panel-title { font-size: 1.2rem; margin-bottom: 1rem; color: var(--primary-dark); } /* Parameter Controls */ .parameter-control { margin-bottom: 1rem; } .parameter-label { display: block; margin-bottom: 0.5rem; font-weight: 500; } .parameter-slider { width: 100%; margin-bottom: 0.5rem; } .slider-display { display: flex; justify-content: space-between; font-size: 0.9rem; color: var(--text-secondary); } /* Privacy Budget Display */ .budget-display { margin-top: 1.5rem; padding: 1rem; background: var(--background-off); border-radius: 4px; } .budget-bar { height: 8px; background-color: #e0e0e0; border-radius: 4px; position: relative; margin: 0.5rem 0; } .budget-fill { height: 100%; border-radius: 4px; background-color: var(--accent-color); transition: width 0.3s ease; } .budget-fill.low { background-color: var(--secondary-color); } .budget-fill.medium { background-color: var(--accent-color); } .budget-fill.high { background-color: var(--error-color); } /* Buttons */ .control-button { width: 100%; padding: 0.8rem; border: none; border-radius: 4px; background-color: var(--primary-color); color: white; font-weight: bold; cursor: pointer; margin-top: 1rem; transition: background-color 0.3s ease; } .control-button:hover { background-color: var(--primary-dark); } .control-button.running { background-color: var(--error-color); } /* Charts */ .chart-container { position: relative; height: 300px; width: 100%; margin-bottom: 1rem; } .chart-container canvas { width: 100% !important; height: 100% !important; } /* Metrics */ .metrics-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 1rem; margin-bottom: 1rem; } .metric-card { background-color: var(--background-off); border-radius: 4px; padding: 1rem; text-align: center; } .metric-value { font-size: 1.5rem; font-weight: bold; margin-bottom: 0.5rem; } .metric-label { color: var(--text-secondary); font-weight: 500; } /* Recommendations */ .recommendation-list { list-style: none; padding: 0; margin: 0; } .recommendation-item { display: flex; align-items: flex-start; padding: 0.8rem 0; border-bottom: 1px solid var(--border-color); } .recommendation-icon { margin-right: 0.5rem; font-size: 1.2rem; } /* Tabs */ .tabs { display: flex; margin-bottom: 1rem; } .tab { padding: 0.5rem 1rem; cursor: pointer; border-bottom: 2px solid transparent; transition: all 0.3s ease; } .tab:hover { color: var(--primary-color); } .tab.active { border-bottom: 2px solid var(--primary-color); color: var(--primary-color); } .tab-content { display: none; } .tab-content.active { display: block; } /* Training Status */ .status-badge { display: flex; align-items: center; gap: 1rem; padding: 0.5rem 1rem; background-color: #f5f5f5; border-radius: 4px; margin-top: 1rem; } .pulse { display: inline-block; width: 8px; height: 8px; border-radius: 50%; background-color: #4caf50; animation: pulse 1s infinite; } @keyframes pulse { 0% { transform: scale(0.95); box-shadow: 0 0 0 0 rgba(76, 175, 80, 0.7); } 70% { transform: scale(1); box-shadow: 0 0 0 10px rgba(76, 175, 80, 0); } 100% { transform: scale(0.95); box-shadow: 0 0 0 0 rgba(76, 175, 80, 0); } } /* Footer */ .footer { text-align: center; padding: 1rem; background-color: var(--primary-dark); color: white; margin-top: 2rem; } /* Tooltips */ .tooltip { position: relative; display: inline-block; margin-left: 0.5rem; } .tooltip-icon { width: 16px; height: 16px; border-radius: 50%; background-color: var(--primary-light); color: white; font-size: 12px; display: flex; align-items: center; justify-content: center; cursor: help; } .tooltip-text { visibility: hidden; width: 200px; background-color: #333; color: white; text-align: center; border-radius: 4px; padding: 0.5rem; position: absolute; z-index: 1; bottom: 125%; left: 50%; margin-left: -100px; opacity: 0; transition: opacity 0.3s; font-size: 0.8rem; } .tooltip:hover .tooltip-text { visibility: visible; opacity: 1; } /* Learning Hub Styles */ .learning-container { display: grid; grid-template-columns: 250px 1fr; gap: 1.5rem; } .learning-sidebar { background: white; border-radius: 8px; padding: 1rem; box-shadow: var(--shadow-sm); } .learning-content { background: white; border-radius: 8px; padding: 1.5rem; box-shadow: var(--shadow-sm); } .learning-steps { list-style: none; padding: 0; margin: 0; } .learning-step { padding: 0.75rem 0.5rem; border-radius: 4px; cursor: pointer; margin-bottom: 0.5rem; transition: all 0.3s ease; } .learning-step:hover { background-color: var(--background-off); } .learning-step.active { background-color: var(--background-off); color: var(--primary-color); font-weight: 500; } /* Concept Boxes */ .concept-highlight { background-color: var(--background-off); border-radius: 4px; padding: 1rem; margin: 1rem 0; } .formula { background-color: #f5f7fa; padding: 0.75rem; border-radius: 4px; font-family: monospace; margin: 1rem 0; } .concept-box { display: flex; margin: 1rem 0; gap: 1rem; } .concept-box > div { flex: 1; padding: 1rem; border-radius: 8px; } .concept-box .box1 { background-color: #e3f2fd; } .concept-box .box2 { background-color: #fff8e1; } /* Error Message */ .error-message { background-color: #ffebee; color: #c62828; padding: 1rem; margin-bottom: 1rem; border-radius: 4px; border-left: 4px solid #c62828; animation: slideIn 0.3s ease-out; } /* View Toggle Buttons */ .view-toggle { padding: 4px 12px; border: none; background: transparent; cursor: pointer; border-radius: 2px; font-size: 0.8rem; transition: background-color 0.2s ease; color: var(--text-secondary); } .view-toggle:hover { background-color: rgba(63, 81, 181, 0.1); } .view-toggle.active { background-color: var(--primary-color); color: white; } @keyframes slideIn { from { transform: translateY(-20px); opacity: 0; } to { transform: translateY(0); opacity: 1; } }