:root { --bg-gradient: linear-gradient(135deg, #667eea 0%, #764ba2 100%); --card-bg: rgba(255, 255, 255, 0.95); --card-bg-secondary: rgba(255, 255, 255, 0.9); --card-border: rgba(255, 255, 255, 0.2); --text-primary: #333; --text-secondary: #555; --text-muted: #666; --accent-primary: #667eea; --accent-secondary: #764ba2; --accent-gradient: linear-gradient(135deg, #667eea 0%, #764ba2 100%); --button-gradient: linear-gradient(135deg, #667eea 0%, #764ba2 100%); --error-color: #e74c3c; --error-hover: #c0392b; --border-color: #e1e5e9; --border-focus: #667eea; --shadow-color: rgba(0, 0, 0, 0.1); --shadow-hover: rgba(0, 0, 0, 0.15); --backdrop-blur: blur(10px); --chart-primary: rgba(102, 126, 234, 0.8); --chart-primary-selected: rgba(102, 126, 234, 0.9); --chart-primary-border: rgba(102, 126, 234, 1); --chart-secondary: rgba(180, 180, 180, 0.5); --chart-secondary-border: rgba(140, 140, 140, 0.8); --filter-bg: rgba(102, 126, 234, 0.1); --filter-border: rgba(102, 126, 234, 0.3); --filter-active-gradient: linear-gradient(135deg, #667eea 0%, #764ba2 100%); } [data-theme="dark"] { --bg-gradient: linear-gradient(135deg, #1a1a2e 0%, #16213e 50%, #0f3460 100%); --card-bg: rgba(30, 30, 46, 0.95); --card-bg-secondary: rgba(26, 26, 42, 0.9); --card-border: rgba(255, 255, 255, 0.1); --text-primary: #e0e0e0; --text-secondary: #b0b0b0; --text-muted: #888; --accent-primary: #4fc3f7; --accent-secondary: #29b6f6; --accent-gradient: linear-gradient(135deg, #4fc3f7 0%, #29b6f6 100%); --button-gradient: linear-gradient(135deg, #4fc3f7 0%, #29b6f6 100%); --error-color: #ef5350; --error-hover: #d32f2f; --border-color: #404040; --border-focus: #4fc3f7; --shadow-color: rgba(0, 0, 0, 0.3); --shadow-hover: rgba(0, 0, 0, 0.4); --backdrop-blur: blur(15px); --chart-primary: rgba(79, 195, 247, 0.8); --chart-primary-selected: rgba(79, 195, 247, 0.9); --chart-primary-border: rgba(79, 195, 247, 1); --chart-secondary: rgba(100, 100, 100, 0.6); --chart-secondary-border: rgba(120, 120, 120, 0.8); --filter-bg: rgba(79, 195, 247, 0.15); --filter-border: rgba(79, 195, 247, 0.3); --filter-active-gradient: linear-gradient(135deg, #4fc3f7 0%, #29b6f6 100%); } [data-theme="pastel"] { --bg-gradient: linear-gradient(135deg, #ffecd2 0%, #fcb69f 100%); --card-bg: rgba(255, 255, 255, 0.9); --card-bg-secondary: rgba(252, 248, 245, 0.95); --card-border: rgba(252, 182, 159, 0.3); --text-primary: #5a5a5a; --text-secondary: #757575; --text-muted: #999; --accent-primary: #ff9a9e; --accent-secondary: #fecfef; --accent-gradient: linear-gradient(135deg, #ff9a9e 0%, #fecfef 100%); --button-gradient: linear-gradient(135deg, #ff9a9e 0%, #fecfef 100%); --error-color: #ff7979; --error-hover: #e17055; --border-color: #f0f0f0; --border-focus: #ff9a9e; --shadow-color: rgba(255, 154, 158, 0.15); --shadow-hover: rgba(255, 154, 158, 0.25); --backdrop-blur: blur(12px); --chart-primary: rgba(255, 154, 158, 0.8); --chart-primary-selected: rgba(255, 154, 158, 0.9); --chart-primary-border: rgba(255, 154, 158, 1); --chart-secondary: rgba(200, 200, 200, 0.6); --chart-secondary-border: rgba(170, 170, 170, 0.8); --filter-bg: rgba(255, 154, 158, 0.1); --filter-border: rgba(255, 154, 158, 0.3); --filter-active-gradient: linear-gradient(135deg, #ff9a9e 0%, #fecfef 100%); } [data-theme="azure"] { --bg-gradient: linear-gradient(135deg, #95acdf 0%, #b8c9f5 100%); --card-bg: rgba(245, 250, 255, 0.95); --card-bg-secondary: rgba(235, 240, 255, 0.9); --card-border: rgba(160, 180, 220, 0.35); --text-primary: #1d2a50; --text-secondary: #32487c; --text-muted: #5d6f9e; --accent-primary: #7f9ff8; --accent-secondary: #9bb5fc; --accent-gradient: linear-gradient(135deg, #7f9ff8 0%, #9bb5fc 100%); --button-gradient: linear-gradient(135deg, #7f9ff8 0%, #9bb5fc 100%); --error-color: #e74c3c; --error-hover: #c0392b; --border-color: #b8c7e1; --border-focus: #6689f2; --shadow-color: rgba(0, 0, 0, 0.05); --shadow-hover: rgba(0, 0, 0, 0.1); --backdrop-blur: blur(10px); --chart-primary: rgba(127, 159, 248, 0.85); --chart-primary-selected: rgba(127, 159, 248, 0.98); --chart-primary-border: rgba(127, 159, 248, 1); --chart-secondary: rgba(180, 185, 210, 0.5); --chart-secondary-border: rgba(150, 155, 180, 0.85); --filter-bg: rgba(70, 100, 180, 0.3); --filter-border: rgba(70, 100, 180, 0.75); --filter-active-gradient: linear-gradient(135deg, #4a6bcf 0%, #3654b0 100%); } [data-theme="professional"] { --bg-gradient: linear-gradient(135deg, #2c2c2c 0%, #1a1a1a 100%); --card-bg: rgba(74, 144, 226, 0.95); --card-bg-secondary: rgba(60, 60, 60, 0.95); --card-border: rgba(255, 255, 255, 0.1); --text-primary: #ffffff; --text-secondary: #f0f0f0; --text-muted: #cccccc; --accent-primary: #4A90E2; --accent-secondary: #357ABD; --accent-gradient: linear-gradient(135deg, #4A90E2 0%, #357ABD 100%); --button-gradient: linear-gradient(135deg, #4A90E2 0%, #357ABD 100%); --error-color: #ff4757; --error-hover: #ff3838; --border-color: #404040; --border-focus: #4A90E2; --shadow-color: rgba(0, 0, 0, 0.4); --shadow-hover: rgba(0, 0, 0, 0.6); --backdrop-blur: blur(8px); --chart-primary: rgba(74, 144, 226, 0.85); --chart-primary-selected: rgba(74, 144, 226, 0.95); --chart-primary-border: rgba(74, 144, 226, 1); --chart-secondary: rgba(120, 120, 120, 0.6); --chart-secondary-border: rgba(140, 140, 140, 0.8); --filter-bg: rgba(74, 144, 226, 0.15); --filter-border: rgba(74, 144, 226, 0.3); --filter-active-gradient: linear-gradient(135deg, #4A90E2 0%, #357ABD 100%); } [data-theme="professional"] .metric-card { background: rgba(60, 60, 60, 0.95); color: #ffffff; } [data-theme="professional"] .metric-card .metric-value, [data-theme="professional"] .metric-card .metric-label { color: #ffffff; } [data-theme="professional"] .metric-card:nth-child(even) { background: linear-gradient(135deg, #4A90E2 0%, #357ABD 100%); } [data-theme="professional"] .chart-container, [data-theme="professional"] .filters, [data-theme="professional"] .header { background: rgba(60, 60, 60, 0.95); border: 1px solid rgba(255, 255, 255, 0.1); } [data-theme="professional"] .chart-container:hover { box-shadow: 0 15px 35px rgba(0, 0, 0, 0.6); } [data-theme="professional"] .chart-container.filtered { border: 2px solid #4A90E2; box-shadow: 0 15px 35px rgba(74, 144, 226, 0.3); } [data-theme="professional"] .theme-dropdown, [data-theme="professional"] .form-group input, [data-theme="professional"] .form-group select { background: rgba(40, 40, 40, 0.95); border-color: rgba(255, 255, 255, 0.2); color: #ffffff; } [data-theme="professional"] .form-group input::placeholder { color: #cccccc; } * { margin: 0; padding: 0; box-sizing: border-box; -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; -webkit-touch-callout: none; -webkit-tap-highlight-color: transparent; } *, *:hover, *:focus, *:active { transition: none !important; transform: none !important; -webkit-tap-highlight-color: transparent !important; } .chartjs-tooltip { font-family: monospace !important; } *:focus { outline: none !important; -webkit-tap-highlight-color: transparent !important; } body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; background: var(--bg-gradient); min-height: 100vh; color: var(--text-primary); -webkit-overflow-scrolling: touch; overscroll-behavior: contain; transition: all 0.3s ease; } .dashboard { padding: 20px; max-width: 1400px; margin: 0 auto; } .header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 30px; background: var(--card-bg); padding: 20px; border-radius: 15px; backdrop-filter: var(--backdrop-blur); box-shadow: 0 10px 25px var(--shadow-color); } .header-right { display: flex; align-items: center; gap: 15px; } .theme-selector { position: relative; } .theme-dropdown { background: var(--card-bg-secondary); border: 1px solid var(--border-color); border-radius: 8px; padding: 8px 12px; color: var(--text-primary); font-size: 14px; cursor: pointer; min-width: 120px; transition: all 0.3s ease; } .theme-dropdown:hover { border-color: var(--border-focus); box-shadow: 0 2px 8px var(--shadow-hover); } .theme-dropdown:focus { outline: none; border-color: var(--border-focus); box-shadow: 0 0 0 3px var(--filter-bg); } .welcome { font-size: 24px; font-weight: 600; color: var(--text-primary); } .logout-btn { padding: 10px 20px; background: var(--error-color); color: white; border: none; border-radius: 8px; cursor: pointer; font-weight: 500; transition: all 0.3s ease; } .logout-btn:hover { background: var(--error-hover); transform: translateY(-2px); } .filters { background: var(--card-bg); padding: 10px; border-radius: 15px; margin-bottom: 5px; backdrop-filter: var(--backdrop-blur); box-shadow: 0 10px 25px var(--shadow-color); } .filters h3 { margin-bottom: 20px; color: var(--text-primary); font-weight: 600; } .filter-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); gap: 18px; } .form-group { margin-bottom: 18px; } .form-group label { display: block; margin-bottom: 7px; font-weight: 500; color: var(--text-secondary); font-size: 15px; } .form-group input, .form-group select { width: 100%; padding: 11px 14px; border: 2px solid var(--border-color); border-radius: 9px; font-size: 15px; transition: all 0.3s ease; background: var(--card-bg-secondary); color: var(--text-primary); } .form-group input:focus, .form-group select:focus { outline: none; border-color: var(--border-focus); box-shadow: 0 0 0 3px var(--filter-bg); transform: translateY(-1.5px); } .metrics { display: grid; grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); gap: 18px; margin-bottom: 27px; padding: 0 20px; } .metric-card { background: var(--card-bg); padding: 22px; border-radius: 13px; text-align: center; backdrop-filter: var(--backdrop-blur); box-shadow: 0 9px 22px var(--shadow-color); border: 1px solid var(--card-border); transition: all 0.3s ease; min-height: 108px; display: flex; flex-direction: column; justify-content: center; } .metric-card:hover { transform: translateY(-4px); box-shadow: 0 13px 31px var(--shadow-hover); } .metric-value { font-size: 25px; font-weight: 700; color: var(--accent-primary); margin-bottom: 7px; } .metric-label { font-size: 13px; color: var(--text-muted); font-weight: 500; text-transform: uppercase; letter-spacing: 0.45px; line-height: 1.3; } .charts { display: grid; grid-template-columns: repeat(auto-fit, minmax(400px, 1fr)); gap: 25px; } .filter-tag { display: inline-flex; align-items: center; background: var(--accent-gradient); color: white; padding: 4px 8px; border-radius: 12px; font-size: 12px; font-weight: 500; gap: 6px; } .filter-tag .remove-filter { background: rgba(255, 255, 255, 0.3); border: none; color: white; border-radius: 50%; width: 16px; height: 16px; cursor: pointer; font-size: 10px; display: flex; align-items: center; justify-content: center; transition: background 0.2s; } .filter-tag .remove-filter:hover { background: rgba(255, 255, 255, 0.5); } .chart-container { background: var(--card-bg); padding: 25px; border-radius: 15px; backdrop-filter: var(--backdrop-blur); box-shadow: 0 10px 25px var(--shadow-color); border: 1px solid var(--card-border); transition: all 0.3s ease; position: relative; min-height: 400px; max-height: 400px; display: flex; flex-direction: column; touch-action: manipulation; transform: translateZ(0); will-change: auto; } .chart-container:hover { transform: translateY(-3px) translateZ(0); box-shadow: 0 15px 35px var(--shadow-hover); } .chart-container.filtered { border: 2px solid var(--accent-primary); box-shadow: 0 15px 35px var(--shadow-hover); } .chart-info { position: absolute; top: 10px; right: 15px; background: var(--filter-bg); color: var(--accent-primary); padding: 4px 8px; border-radius: 8px; font-size: 11px; font-weight: 600; display: flex; align-items: center; gap: 6px; opacity: 0; pointer-events: none; transition: opacity 0.2s ease; height: 24px; min-width: 80px; } .chart-container.filtered .chart-info { opacity: 1; pointer-events: auto; } .clear-chart-filter { background: rgba(231, 76, 60, 0.8); color: white; border: none; border-radius: 4px; width: 16px; height: 16px; cursor: pointer; font-size: 10px; display: flex; align-items: center; justify-content: center; transition: background 0.2s; font-weight: bold; } .clear-chart-filter:hover { background: rgba(231, 76, 60, 1); } .chart-title { font-size: 12px; font-weight: 600; margin-top: 15px; color: var(--text-primary); text-align: center; position: absolute; bottom: 10px; left: 0; right: 0; z-index: 10; } .chart-wrapper { position: relative; flex: 1; min-height: 300px; transform: translateZ(0); } .chart-wrapper canvas { cursor: pointer !important; touch-action: none; position: absolute !important; top: 0 !important; left: 0 !important; right: 0 !important; bottom: 0 !important; width: 100% !important; height: 100% !important; } .chart-wrapper canvas:hover { opacity: 0.9; } .loading { text-align: center; padding: 50px; color: var(--text-muted); font-style: italic; } .filter-buttons { display: flex; flex-wrap: wrap; gap: 7px; margin-top: 7px; } .filter-button { background: var(--card-bg-secondary); border: 2px solid var(--filter-border); color: var(--accent-primary); padding: 8px 12px; border-radius: 16px; font-size: 12px; font-weight: 500; cursor: pointer; transition: all 0.2s ease; min-width: 55px; text-align: center; } .filter-button:hover { background: var(--filter-bg); border-color: var(--accent-primary); transform: translateY(-1px); } .filter-button.active { background: var(--filter-active-gradient); border-color: var(--accent-primary); color: white; box-shadow: 0 2px 8px var(--shadow-hover); } .filter-button.active:hover { transform: translateY(-1px); box-shadow: 0 4px 12px var(--shadow-hover); } .filter-group { margin-bottom: 20px; } .filter-group-label { font-weight: 600; color: var(--text-primary); margin-bottom: 8px; font-size: 14px; } .hide-filters-btn { background: rgba(231, 76, 60, 0.8); color: white; border: none; border-radius: 50%; width: 30px; height: 30px; cursor: pointer; font-size: 16px; font-weight: bold; display: flex; align-items: center; justify-content: center; transition: all 0.2s ease; } .hide-filters-btn:hover { background: rgba(231, 76, 60, 1); transform: scale(1.1); } .show-filters-btn { padding: 10px 20px; background: var(--accent-primary); color: white; border: none; border-radius: 8px; cursor: pointer; font-weight: 500; margin: 20px; transition: all 0.3s ease; font-size: 14px; } .show-filters-btn:hover { background: var(--accent-secondary); transform: translateY(-2px); } .toggle-filters-btn { background: var(--accent-primary); color: white; border: none; border-radius: 20%; width: 30px; height: 30px; cursor: pointer; font-size: 10px; font-weight: bold; display: flex; align-items: center; justify-content: center; transition: all 0.3s ease; } .toggle-filters-btn:hover { background: var(--accent-secondary); transform: scale(1.1); } .filters-content { transition: all 0.3s ease; overflow: hidden; } .filters-content.collapsed { height: 0 !important; margin: 0; padding: 0; opacity: 0; } .filters.collapsed { padding-bottom: 10px; } #activeFilters { margin-bottom: 12px !important; font-size: 13px; } #activeFilters > div:first-child { gap: 8px !important; margin-bottom: 8px !important; } #activeFilters strong { font-size: 13px; font-weight: 500; } .info-box { background: var(--filter-bg); padding: 12px; border-radius: 8px; margin-bottom: 15px; font-size: 14px; color: var(--text-primary); border-left: 4px solid var(--accent-primary); } .dataset-card { position: relative; display: flex; flex-direction: column; justify-content: center; align-items: center; } .direction-stats { display: flex; flex-direction: column; gap: 4px; align-items: center; margin-bottom: 8px; } .direction-item { display: flex; align-items: center; gap: 6px; } .direction-value { font-size: 16px; font-weight: 700; color: var(--accent-primary); min-width: 40px; text-align: right; } .direction-label { font-size: 11px; color: var(--text-muted); font-weight: 500; text-transform: uppercase; letter-spacing: 0.3px; min-width: 45px; } .dataset-count { position: absolute; bottom: 12px; right: 15px; display: flex; align-items: baseline; gap: 4px; } .dataset-label { font-size: 9px; color: var(--text-muted); font-weight: 500; text-transform: uppercase; letter-spacing: 0.3px; } .dataset-number { font-size: 12px; font-weight: 700; color: var(--accent-primary); } .confirmation-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 6px; } .confirmation-toggle-btn { background: var(--accent-primary); color: white; border: none; border-radius: 50%; width: 20px; height: 20px; cursor: pointer; font-size: 10px; font-weight: bold; display: flex; align-items: center; justify-content: center; transition: all 0.3s ease; } .confirmation-toggle-btn:hover { background: var(--accent-secondary); transform: scale(1.1); } .confirmation-buttons { display: flex; flex-wrap: wrap; gap: 5px; min-height: 35px; transition: all 0.3s ease; overflow: hidden; } .confirmation-buttons.collapsed { height: 0 !important; min-height: 0 !important; margin: 0; padding: 0; opacity: 0; } .confirmation-button { background: var(--card-bg-secondary); border: 2px solid var(--filter-border); color: var(--accent-primary); padding: 6px 8px; border-radius: 12px; font-size: 10px; font-weight: 500; cursor: pointer; transition: all 0.2s ease; min-width: 40px; text-align: center; white-space: nowrap; } .confirmation-button:hover { background: var(--filter-bg); border-color: var(--accent-primary); transform: translateY(-1px); } .confirmation-button.active { background: var(--filter-active-gradient); border-color: var(--accent-primary); color: white; box-shadow: 0 2px 8px var(--shadow-hover); } .confirmation-button.active:hover { transform: translateY(-1px); box-shadow: 0 4px 12px var(--shadow-hover); } .confirmation-buttons:empty::after { content: "No times available"; font-size: 10px; color: var(--text-muted); font-style: italic; padding: 8px; } .confirmation-buttons.collapsed:empty::after { display: none; } @media (max-width: 768px) { .charts { grid-template-columns: 1fr; } .filter-grid { grid-template-columns: 1fr; } .metrics { grid-template-columns: repeat(2, 1fr); } .header { flex-direction: column; gap: 15px; } .header-right { width: 100%; justify-content: space-between; } .chart-container, .chart-wrapper { transform: translate3d(0,0,0); } }