:root { --horaires-blue-950: #082e4f; --horaires-blue-900: #0d3d67; --horaires-blue-800: #11507e; --horaires-blue-700: #1d5f90; --horaires-blue-500: #0088ce; --horaires-surface: #ffffff; --horaires-surface-soft: #f7fbff; --horaires-border: #d8e5f3; --horaires-text: #12324e; --horaires-muted: #62809a; --horaires-shadow-soft: 0 8px 26px rgba(8, 46, 79, 0.1); --horaires-shadow-strong: 0 16px 40px rgba(8, 46, 79, 0.2); } .horaires-page { background: radial-gradient(circle at 0 0, rgba(17, 80, 126, 0.14) 0, rgba(17, 80, 126, 0) 35%), radial-gradient(circle at 100% 0, rgba(8, 46, 79, 0.16) 0, rgba(8, 46, 79, 0) 40%), #f2f7fd; min-height: 100%; } .horaires-page-content { width: min(1460px, 100%); margin: 0 auto; padding-bottom: 12px; } .horaires-page-header { background: linear-gradient(140deg, var(--horaires-blue-950) 0%, var(--horaires-blue-800) 70%, var(--horaires-blue-700) 100%); border-radius: 18px; color: #f8fbff; padding: 26px; margin-bottom: 16px; display: flex; justify-content: space-between; gap: 14px; align-items: flex-start; box-shadow: var(--horaires-shadow-strong); border: 1px solid rgba(255, 255, 255, 0.14); } .horaires-page-kicker { margin: 0 0 8px; text-transform: uppercase; letter-spacing: 0.1em; font-size: 11px; font-weight: 700; opacity: 0.86; } .horaires-page-header h2 { margin: 0; font-size: 30px; letter-spacing: -0.01em; color: #f8fbff !important; text-shadow: 0 1px 1px rgba(0, 0, 0, 0.18); } .horaires-page-kicker, .horaires-page-description { color: #f2f9ff !important; } .horaires-page-description { margin: 10px 0 0; color: rgba(247, 251, 255, 0.94); max-width: 780px; } .horaires-alert { margin-bottom: 1rem; } .horaires-main-tabs { border-radius: 16px; border: 1px solid var(--horaires-border); background: linear-gradient(180deg, #ffffff 0%, #f8fbff 100%); box-shadow: var(--horaires-shadow-soft); padding: 10px 14px 14px; overflow: hidden; } .horaires-main-tabs { --wcs-tabs-color: var(--horaires-blue-800); } .horaires-workspace { display: flex; gap: 0; min-height: 560px; border-radius: 14px; overflow: hidden; border: 1px solid #e1eaf4; background: #f6faff; } .horaires-workspace > div:first-child { box-shadow: inset -1px 0 0 rgba(255, 255, 255, 0.15); background: linear-gradient(180deg, #0a3558 0%, #0f446f 60%, #12507f 100%) !important; border-right: none !important; } /* Contraste panneau latéral lignes (normal / secondaire / actif) */ .horaires-workspace > div:first-child { color: #e8f4ff; } /* Hover / active styles for lignes panel items */ .horaires-workspace > div:first-child .ligne-item .ligne-name, .horaires-workspace > div:first-child .ligne-item .ligne-count, .horaires-workspace > div:first-child .ligne-item wcs-mat-icon { transition: color 0.15s ease, background 0.15s ease, font-weight 0.15s ease; } /* When hovering an item, make its text and icon blue and the badge blue like the selected state */ .horaires-workspace > div:first-child .ligne-item:hover .ligne-name { color: #0088ce !important; font-weight: 700 !important; } .horaires-workspace > div:first-child .ligne-item:hover wcs-mat-icon { color: #0088ce !important; } .horaires-workspace > div:first-child .ligne-item:hover .ligne-count { background: #0088ce !important; color: #fff !important; } /* Keep selected (active) appearance */ .horaires-workspace > div:first-child .ligne-item.is-active .ligne-name { color: #0088ce !important; font-weight: 700 !important; } .horaires-workspace > div:first-child .ligne-item.is-active wcs-mat-icon { color: #0088ce !important; } .horaires-workspace > div:first-child .ligne-item.is-active .ligne-count { background: #0088ce !important; color: #fff !important; } .horaires-workspace > div:first-child [style*="color: #374151"], .horaires-workspace > div:first-child [style*="color: #1f2937"], .horaires-workspace > div:first-child [style*="color: #0088ce"], .horaires-workspace > div:first-child [style*="color: #0369a1"], .horaires-workspace > div:first-child [style*="color: #0c4a6e"] { color: #f4faff !important; } .horaires-workspace > div:first-child [style*="color: #6b7280"], .horaires-workspace > div:first-child [style*="color: #9ca3af"], .horaires-workspace > div:first-child [style*="color: #d1d5db"] { color: #b7d0e3 !important; } .horaires-workspace > div:first-child [style*="background: #e5e7eb"], .horaires-workspace > div:first-child [style*="background: #f3f4f6"], .horaires-workspace > div:first-child [style*="background: #e8f4fd"] { background: rgba(255, 255, 255, 0.14) !important; } .horaires-workspace > div:first-child [style*="background: #0088ce"] { background: #7dc8f3 !important; color: #05263f !important; } .horaires-workspace > div:first-child button[style*="background: #e8f4fd"] { background: rgba(125, 200, 243, 0.3) !important; } .horaires-workspace > div:first-child button[style*="background: transparent"]:hover { background: rgba(255, 255, 255, 0.18) !important; } .horaires-workspace > div:first-child button { border-radius: 10px !important; } .horaires-main-content { flex: 1; min-width: 0; padding: 18px 18px 18px 20px; background: linear-gradient(180deg, rgba(255, 255, 255, 0.96) 0%, rgba(246, 250, 255, 0.96) 100%); } .horaires-toolbar { display: flex; justify-content: space-between; margin-bottom: 16px; flex-wrap: wrap; gap: 10px; padding: 12px; border: 1px solid #dce8f5; border-radius: 12px; background: #f8fbff; } .horaires-toolbar-left { display: flex; gap: 8px; align-items: center; flex-wrap: wrap; } .horaires-select-btn { margin-left: 8px; } .horaires-search-wrap { margin-left: 6px; } .horaires-search-input { padding: 9px 12px; border: 1px solid #c9daeb; border-radius: 10px; min-width: 280px; background: #fff; color: var(--horaires-text); outline: none; } .horaires-search-input:focus { border-color: #61a8d4; box-shadow: 0 0 0 3px rgba(0, 136, 206, 0.12); } .horaires-selection-panel { display: flex; align-items: center; justify-content: space-between; padding: 13px 16px; background: linear-gradient(135deg, #e8f4fd 0%, #f1f9ff 100%); border: 1px solid #8fc4e6; border-radius: 10px; margin-bottom: 16px; gap: 10px; flex-wrap: wrap; } .horaires-selection-left { display: flex; align-items: center; gap: 12px; } .horaires-selection-count { color: #005f93; font-weight: 600; } .horaires-selection-actions { display: flex; gap: 8px; } .horaires-page .table-container { border: 1px solid #d9e6f3; border-radius: 14px; overflow: hidden; background: #fff; box-shadow: 0 10px 30px rgba(8, 46, 79, 0.08); } .horaires-page .wcs-table { border-collapse: separate; border-spacing: 0; } .horaires-page .wcs-table thead tr { background: linear-gradient(90deg, #0f456e 0%, #165989 100%); } .horaires-page .wcs-table th { color: #f5fbff; border-bottom: none; font-weight: 600; font-size: 12px; letter-spacing: 0.04em; text-transform: uppercase; padding: 13px 12px; } .horaires-page .wcs-table td { border-bottom: 1px solid #ebf2fa; padding: 12px; color: var(--horaires-text); vertical-align: middle; } .horaires-page .wcs-table tbody tr:hover { background: #f6fbff; } .horaires-responsive-table td[data-label] { position: relative; } .horaires-page details { border-radius: 10px; background: #f9fcff; } .horaires-page details > summary { color: #10486f; } .horaires-page input, .horaires-page select, .horaires-page textarea { border: 1px solid #c8d9e9 !important; border-radius: 10px !important; background: #fff; color: var(--horaires-text); } .horaires-page input:focus, .horaires-page select:focus, .horaires-page textarea:focus { border-color: #64acd8 !important; box-shadow: 0 0 0 3px rgba(0, 136, 206, 0.12); outline: none; } .horaires-page .modal-overlay { background: rgba(6, 28, 46, 0.56); backdrop-filter: blur(2px); } .horaires-page .modal-content { border-radius: 16px; border: 1px solid #d5e3f2; background: linear-gradient(180deg, #ffffff 0%, #f7fbff 100%); box-shadow: 0 20px 42px rgba(8, 46, 79, 0.28); overflow: hidden; } .horaires-page .modal-header { background: linear-gradient(125deg, #0a3456 0%, #11507e 75%, #1d5f90 100%); color: #f6fbff; border-bottom: 1px solid rgba(255, 255, 255, 0.18); } .horaires-page .modal-header h3, .horaires-page .modal-header strong { color: inherit; } .horaires-page .modal-close { color: #f3f9ff; } .horaires-page .modal-body { background: transparent; } .horaires-page .modal-footer { background: #f2f8ff; border-top: 1px solid #dbe7f4; } .horaires-page .form-group label { color: #1d4768; font-weight: 600; } .horaires-loading { color: var(--horaires-muted); padding: 12px; } .horaires-empty-state { text-align: center; padding: 44px; border-radius: 14px; border: 1px dashed #a9c7df; background: linear-gradient(180deg, #f9fcff 0%, #f2f8ff 100%); } .horaires-empty-icon { font-size: 50px; color: #72a8cc; } .horaires-empty-text { color: #557894; } .horaires-main-content > div[style*="grid-template-columns: repeat(auto-fill, minmax(300px, 1fr))"] { gap: 18px !important; } .horaires-main-content > div[style*="grid-template-columns: repeat(auto-fill, minmax(300px, 1fr))"] > div { border-radius: 14px !important; border: 1px solid #d6e3f1 !important; box-shadow: 0 10px 24px rgba(8, 46, 79, 0.09); background: linear-gradient(180deg, #ffffff 0%, #f8fbff 100%) !important; } .horaires-page .quai-row-modal { background: #f8fbff; border-radius: 10px; } .horaires-section-header { display: flex; justify-content: space-between; gap: 12px; align-items: center; margin-bottom: 16px; padding: 12px 14px; border-radius: 12px; border: 1px solid #d9e7f5; background: linear-gradient(120deg, #f8fbff 0%, #eef6ff 100%); } .horaires-section-title { margin: 0; color: #0d3f66; font-size: 21px; } .horaires-section-description { margin: 0 0 16px; color: #5a7b96; } .horaires-table-full { width: 100%; } .horaires-row-actions { display: flex; gap: 6px; } .horaires-empty-state-compact { padding: 36px; } .horaires-search-input-wide { min-width: 300px; } .horaires-clickable-row { cursor: pointer; } .horaires-time-muted { color: #62809a; } .horaires-status-success { color: #138a56; font-weight: 600; } .horaires-status-muted { color: #90a4b7; } .horaires-gare-autocomplete { position: relative; } .horaires-gare-suggestions { position: absolute; top: calc(100% + 4px); left: 0; right: 0; z-index: 50; border: 1px solid #c9daeb; border-radius: 10px; background: #ffffff; box-shadow: 0 10px 22px rgba(8, 46, 79, 0.16); max-height: 220px; overflow-y: auto; } .horaires-gare-suggestion-item { display: block; width: 100%; text-align: left; border: 0; background: transparent; padding: 9px 11px; color: #12324e; cursor: pointer; } .horaires-gare-suggestion-item:hover { background: #eef6ff; color: #0b4b78; } .horaires-modal-tabs { display: flex; gap: 4px; border-bottom: 1px solid #d8e5f3; background: #eef6ff; padding: 8px 10px 0; flex-shrink: 0; overflow-x: auto; white-space: nowrap; -webkit-overflow-scrolling: touch; } /* Hide scrollbar for a cleaner look */ .horaires-modal-tabs::-webkit-scrollbar { display: none; } .horaires-modal-tabs { -ms-overflow-style: none; /* IE and Edge */ scrollbar-width: none; /* Firefox */ } .horaires-modal-tabs-alt { margin-bottom: 20px; } .horaires-modal-tab-btn { padding: 10px 14px; border: none; background: transparent; border-radius: 10px 10px 0 0; color: #446884; cursor: pointer; font-weight: 500; border-bottom: 3px solid transparent; transition: all 0.2s ease; flex-shrink: 0; white-space: nowrap; } .horaires-modal-tab-btn.is-active { background: #ffffff; color: #0b4b78; font-weight: 700; border-bottom-color: #0088ce; } .horaires-modal-body-scroll { flex: 1; overflow-y: auto; padding: 20px 24px; } .horaires-form-error { background: #fff1f1; border: 1px solid #f5b5b5; border-radius: 8px; padding: 10px 14px; margin-bottom: 16px; color: #b42318; font-size: 14px; } .horaires-tab-panel { padding: 4px 2px; } .horaires-modal-body { background: linear-gradient(180deg, #fbfdff 0%, #f4f9ff 100%); } .horaires-modal-large { max-width: 900px; } .horaires-modal-medium { max-width: 800px; } .horaires-modal-small { max-width: 620px; } .horaires-form-group { margin-bottom: 16px; } .horaires-field { width: 100%; padding: 10px; box-sizing: border-box; } .horaires-two-cols { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; margin-bottom: 16px; } .horaires-trace-list { margin-top: 12px; } .horaires-trace-empty { color: #7991a5; text-align: center; padding: 20px; background: #f6faff; border: 1px dashed #bfd4e8; border-radius: 10px; } .horaires-trace-row { display: grid; grid-template-columns: 34px 2fr 1fr auto; gap: 8px; align-items: center; margin-bottom: 8px; } .horaires-trace-index { color: #4f6f89; font-weight: 600; } .horaires-pdf-current-card { display: flex; align-items: center; gap: 12px; padding: 12px 16px; background: linear-gradient(120deg, #f0fdf4 0%, #ecfdf5 100%); border: 1px solid #86efac; border-radius: 10px; margin-bottom: 20px; } .horaires-upload-error { margin-top: 10px; color: #dc2626; font-size: 13px; display: flex; align-items: center; gap: 6px; } .horaires-upload-loading { margin-top: 12px; display: flex; align-items: center; gap: 8px; color: #0074d9; } .horaires-info-note { margin-top: 16px; padding: 10px 14px; background: #fffbeb; border: 1px solid #fbbf24; border-radius: 8px; font-size: 13px; color: #92400e; } .horaires-trajet-banner { margin-bottom: 16px; padding: 10px 14px; background: linear-gradient(120deg, #eaf5ff 0%, #f2f9ff 100%); border: 1px solid #93c5fd; border-radius: 8px; color: #0b4b78; } .horaires-quai-card { margin-bottom: 12px; padding: 12px; background: linear-gradient(180deg, #f8fbff 0%, #f3f8ff 100%); border: 1px solid #d8e5f3; border-radius: 10px; } .horaires-quai-row-modal { display: flex; justify-content: space-between; align-items: center; gap: 8px; } .horaires-quai-select { padding: 8px; min-width: 220px; } @media (max-width: 1200px) { .horaires-main-content { padding: 12px; } .horaires-search-input { min-width: 220px; } } @media (max-width: 1024px) { .horaires-page .table-container { border: none; box-shadow: none; background: transparent; } .horaires-responsive-table { display: block; width: 100%; border: 0; background: transparent; } .horaires-responsive-table thead { display: none; } .horaires-responsive-table tbody { display: grid; gap: 12px; } .horaires-responsive-table tbody tr { display: grid; gap: 8px; padding: 12px; border-radius: 14px; border: 1px solid #cfe1f2; background: linear-gradient(145deg, #ffffff 0%, #f3f9ff 100%); box-shadow: 0 10px 24px rgba(8, 46, 79, 0.11); } .horaires-responsive-table tbody td { display: grid; grid-template-columns: minmax(130px, 38%) 1fr; gap: 8px; align-items: start; border: 0 !important; padding: 0; min-height: 22px; } .horaires-responsive-table tbody td::before { content: attr(data-label); font-size: 11px; text-transform: uppercase; letter-spacing: 0.06em; font-weight: 700; color: #19527f; padding-top: 2px; } .horaires-responsive-table tbody td[data-label="Actions"], .horaires-responsive-table tbody td[data-label="Action"] { grid-template-columns: 1fr; gap: 10px; margin-top: 2px; padding-top: 8px; border-top: 1px dashed #c7dcef !important; } .horaires-responsive-table tbody td[data-label="Actions"]::before, .horaires-responsive-table tbody td[data-label="Action"]::before { padding-top: 0; } .horaires-responsive-table .horaires-row-actions { display: flex; flex-wrap: wrap; gap: 8px; } .horaires-responsive-table tbody td[data-label="Sélection"] { grid-template-columns: 1fr; } .horaires-responsive-table tbody td[data-label="Sélection"]::before { display: none; } .horaires-responsive-table tbody td[colspan] { display: block; padding: 0 !important; } .horaires-responsive-table tbody td[colspan]::before { display: none; } .horaires-responsive-table details { border: 1px solid #cfe1f2; background: linear-gradient(145deg, #ffffff 0%, #f5faff 100%); } .horaires-responsive-table-horaires tbody td[data-label="N° Train"] strong, .horaires-responsive-table-lignes tbody td[data-label="Nom"] strong, .horaires-responsive-table-services tbody td[data-label="Nom"] strong, .horaires-responsive-table-quais tbody td[data-label="N° Train"] strong { color: #0f4e79; font-size: 15px; } } @media (max-width: 980px) { .horaires-main-content { padding-left: 10px; } .horaires-workspace { flex-direction: column; } .horaires-workspace > div:first-child { width: 100% !important; min-width: 100% !important; } .horaires-toolbar { flex-direction: column; align-items: stretch; } .horaires-search-wrap, .horaires-select-btn { margin-left: 0; } .horaires-search-input { width: 100%; min-width: 0; } .horaires-search-input-wide { min-width: 0; } .horaires-section-header { flex-direction: column; align-items: stretch; } .horaires-row-actions { flex-wrap: wrap; } .horaires-responsive-table tbody td { grid-template-columns: 1fr; gap: 4px; } .horaires-responsive-table tbody td::before { font-size: 10px; } .horaires-two-cols { grid-template-columns: 1fr; } .horaires-trace-row { grid-template-columns: 1fr; } .horaires-pdf-current-card { flex-direction: column; align-items: flex-start; } .horaires-quai-select { width: 100%; min-width: 0; } .horaires-page .modal-content { width: min(96vw, 900px); } .horaires-page .quai-row-modal { flex-direction: column !important; align-items: flex-start !important; } }