@import "https://unpkg.com/leaflet@1.9.4/dist/leaflet.css";*,:before,:after{box-sizing:border-box;margin:0;padding:0}html,body,#root{height:100%}body{color:#e8f0fe;background:linear-gradient(135deg,#0c1929 0%,#162a42 40%,#1a3a5c 70%,#0e2030 100%);min-height:100vh;font-family:Segoe UI,system-ui,-apple-system,sans-serif}@keyframes float{0%,to{opacity:.6;transform:translateY(0)rotate(0)}50%{opacity:1;transform:translateY(-20px)rotate(180deg)}}@keyframes shimmer{0%{background-position:-200%}to{background-position:200%}}@keyframes pulse-glow{0%,to{box-shadow:0 0 8px #64b4ff4d}50%{box-shadow:0 0 20px #64b4ff99}}@keyframes wave{0%,to{transform:translate(0)}50%{transform:translate(5px)}}@keyframes bob{0%,to{transform:translateY(0)}50%{transform:translateY(-3px)}}.app{flex-direction:column;height:100vh;display:flex;overflow:hidden}.app-header{-webkit-backdrop-filter:blur(24px)saturate(160%);z-index:100;background:#0c1929b3;border-bottom:1px solid #64b4ff1f;flex-shrink:0;justify-content:space-between;align-items:center;padding:.6em 1.2em;display:flex;box-shadow:0 4px 24px #0000004d,inset 0 1px #ffffff0d}.header-left{align-items:center;gap:.75em;display:flex}.ferry-fairy-logo{align-items:center;gap:.6em;display:flex}.logo-icon{filter:drop-shadow(0 0 8px #ffdc6480);font-size:1.8em;animation:3s ease-in-out infinite bob}.ferry-fairy-logo h1{background:linear-gradient(90deg,#a8d8ff,gold,#a8d8ff) 0 0/200%;-webkit-text-fill-color:transparent;letter-spacing:.5px;-webkit-background-clip:text;background-clip:text;font-size:1.2em;font-weight:700;animation:4s linear infinite shimmer}.tagline{color:#a8d8ff99;letter-spacing:.3px;font-size:.72em;font-style:italic}.menu-toggle{cursor:pointer;background:0 0;border:none;border-radius:8px;flex-direction:column;gap:4px;padding:4px;transition:background .15s;display:flex}.menu-toggle:hover{background:#ffffff14}.menu-toggle span{background:#a8d8ffcc;border-radius:1px;width:20px;height:2px;display:block}.header-tabs{gap:4px;display:flex}.tab-btn{color:#a8d8ffb3;cursor:pointer;-webkit-backdrop-filter:blur(8px);background:#ffffff0a;border:1px solid #64b4ff26;border-radius:12px;padding:.45em 1.1em;font-size:.85em;transition:all .35s cubic-bezier(.22,1,.36,1);position:relative;overflow:hidden}.tab-btn:before{content:"";opacity:0;background:linear-gradient(135deg,#64b4ff1a,#ffd7000d);transition:opacity .35s;position:absolute;inset:0}.tab-btn:hover{color:#fff;border-color:#64b4ff4d;transform:scale(1.04);box-shadow:0 4px 16px #64b4ff26}.tab-btn:hover:before{opacity:1}.tab-btn.active{color:#fff;background:linear-gradient(135deg,#1e64b466,#3c8cdc4d);border-color:#64b4ff66;animation:3s ease-in-out infinite pulse-glow;box-shadow:0 4px 20px #3c8cdc40,inset 0 1px #ffffff1a}.app-body{flex:1;display:flex;overflow:hidden}.sidebar{-webkit-backdrop-filter:blur(20px)saturate(150%);background:#0c19298c;border-right:1px solid #64b4ff1a;flex-direction:column;width:340px;min-width:340px;transition:width .35s cubic-bezier(.22,1,.36,1),min-width .35s cubic-bezier(.22,1,.36,1);display:flex;overflow:hidden}.sidebar.closed{border:none;width:0;min-width:0;overflow:hidden}.route-filter{border-bottom:1px solid #64b4ff14;flex-shrink:0;padding:.85em}.filter-row{margin-bottom:.5em}.filter-row:last-child{margin-bottom:0}.search-input{color:#e8f0fe;-webkit-backdrop-filter:blur(8px);background:#ffffff0d;border:1px solid #64b4ff26;border-radius:12px;outline:none;width:100%;padding:.6em .85em;font-size:.9em;transition:all .35s cubic-bezier(.22,1,.36,1)}.search-input::placeholder{color:#a8d8ff59}.search-input:focus{background:#ffffff14;border-color:#64b4ff66;box-shadow:0 0 0 3px #64b4ff1a,0 4px 16px #64b4ff1a}.filters{flex-wrap:wrap;gap:.5em;display:flex}.filters select{color:#c8e0ff;-webkit-backdrop-filter:blur(8px);cursor:pointer;background:#ffffff0a;border:1px solid #64b4ff1f;border-radius:10px;outline:none;flex:1;min-width:0;padding:.5em;font-size:.8em;transition:border-color .15s}.filters select:focus{border-color:#64b4ff4d}.filters select option{color:#c8e0ff;background:#162a42}.route-list{flex-direction:column;flex:1;display:flex;overflow:hidden}.route-list-header{border-bottom:1px solid #64b4ff0f;padding:.65em .85em}.route-list-header h3{color:#a8d8ff80;text-transform:uppercase;letter-spacing:1px;font-size:.8em;font-weight:500}.route-list-scroll{flex:1;padding:.55em;overflow-y:auto}.route-card{cursor:pointer;-webkit-backdrop-filter:blur(8px);background:#ffffff08;border:1px solid #64b4ff14;border-radius:14px;margin-bottom:.5em;padding:.75em;transition:all .35s cubic-bezier(.22,1,.36,1);position:relative;overflow:hidden}.route-card:before{content:"";opacity:0;background:linear-gradient(135deg,#64b4ff0f,#0000);transition:opacity .35s;position:absolute;inset:0}.route-card:hover{background:#ffffff0f;border-color:#64b4ff33;transform:translateY(-2px);box-shadow:0 8px 24px #0003,0 0 0 1px #64b4ff1a}.route-card:hover:before{opacity:1}.route-card.selected{background:linear-gradient(135deg,#1e64b433,#3c8cdc1a);border-color:#64b4ff59;box-shadow:0 4px 20px #3c8cdc26,inset 0 1px #ffffff14}.route-card-header{justify-content:space-between;align-items:center;margin-bottom:.3em;display:flex}.route-name{color:#e8f0fe;font-size:.9em;font-weight:600}.route-status{color:#fff;text-transform:uppercase;letter-spacing:.5px;border-radius:10px;padding:.2em .6em;font-size:.6em;font-weight:700}.route-operator{opacity:.8;margin-bottom:.4em;font-size:.72em;font-weight:500}.route-stops{flex-wrap:wrap;gap:.3em;margin-bottom:.4em;display:flex}.stop-tag{color:#a8d8ff99;background:#64b4ff14;border:1px solid #64b4ff0f;border-radius:8px;padding:.15em .55em;font-size:.62em}.route-meta{color:#a8d8ff66;gap:.75em;font-size:.68em;display:flex}.service-type{text-transform:capitalize}.no-results{text-align:center;color:#a8d8ff59;padding:2em;font-size:.85em}.main-content{flex:1;display:flex;position:relative;overflow:hidden}.map-panel,.timetable-panel,.live-panel{flex-direction:column;flex:1;display:flex;overflow:hidden}.map-panel.hidden-mobile,.timetable-panel.hidden-mobile,.live-panel.hidden-mobile{display:none}.timetable-view{flex:1;padding:1.25em;overflow-y:auto}.timetable-empty{color:#a8d8ff66;flex-direction:column;justify-content:center;align-items:center;gap:.5em;height:100%;font-size:1.05em;display:flex}.empty-illustration{font-size:3.5em;animation:3s ease-in-out infinite bob}.timetable-header{margin-bottom:1.25em}.timetable-header h2{color:#e8f0fe;text-shadow:0 0 20px #64b4ff33;margin-bottom:.45em;font-size:1.5em}.timetable-route-info{flex-wrap:wrap;gap:.5em;display:flex}.badge{text-transform:uppercase;letter-spacing:.5px;-webkit-backdrop-filter:blur(8px);border-radius:12px;padding:.3em .75em;font-size:.68em;font-weight:600}.badge.operator{color:#7ab8f5;background:#1e64b440;border:1px solid #64b4ff26}.badge.status{color:#5ddb8f;background:#27ae6033;border:1px solid #27ae6026}.badge.service{color:#f5c842;background:#f39c1226;border:1px solid #f39c121f}.route-note{color:#a8d8ff80;margin-bottom:1em;font-size:.85em;font-style:italic}.route-effective{color:#a8d8ff59;margin-bottom:1em;font-size:.78em}.schedule-section{margin-bottom:1.5em}.schedule-section h3{color:#c8e0ff;margin-bottom:.6em;font-size:1.05em}.schedule-section h4{color:#a8d8ffb3;margin-bottom:.5em;font-size:.9em}.table-wrapper{overflow-x:auto}.schedule-table{border-collapse:collapse;border-radius:12px;width:100%;font-size:.85em;overflow:hidden}.schedule-table th{text-align:left;color:#a8d8ffcc;white-space:nowrap;background:#1e3c6466;border-bottom:1px solid #64b4ff1a;padding:.55em .8em;font-weight:600}.schedule-table td{color:#e8f0fecc;white-space:nowrap;border-bottom:1px solid #64b4ff0d;padding:.5em .8em}.schedule-table tr:hover td{background:#64b4ff0d}.note{color:#f39c12;font-size:.85em}.note-col{width:120px}.note-cell{color:#f39c12;white-space:normal;max-width:200px;font-size:.85em}.schedule-text-ref{color:#a8d8ff99;font-size:.85em;line-height:1.5}.schedule-text-ref a{color:#7ab8f5;text-decoration:none}.schedule-text-ref a:hover{text-decoration:underline}.time-list{flex-wrap:wrap;gap:.4em;display:flex}.time-chip{color:#a8d8ff;background:#1e64b426;border:1px solid #64b4ff1a;border-radius:10px;align-items:center;gap:.3em;padding:.4em .8em;font-size:.85em;font-weight:500;transition:all .15s;display:inline-flex}.time-chip:hover{background:#1e64b440;border-color:#64b4ff33;transform:translateY(-1px)}.time-chip small{color:#a8d8ff66;font-size:.75em;font-weight:400}.tis-schedule{grid-template-columns:1fr 1fr;gap:1em;margin-bottom:1.5em;display:grid}.tis-column h4{color:#a8d8ffb3;margin-bottom:.5em;font-size:.9em}.tours-section{margin-bottom:1.5em}.tours-section h3{color:#c8e0ff;margin-bottom:.75em;font-size:1em}.tour-grid{grid-template-columns:repeat(auto-fill,minmax(200px,1fr));gap:.75em;display:grid}.tour-card{-webkit-backdrop-filter:blur(8px);background:#ffffff08;border:1px solid #64b4ff1a;border-radius:14px;padding:.85em;transition:all .35s cubic-bezier(.22,1,.36,1)}.tour-card:hover{background:#ffffff0f;border-color:#64b4ff33;transform:translateY(-2px);box-shadow:0 8px 24px #0003}.tour-name{color:#e8f0fe;margin-bottom:.25em;font-size:.9em;font-weight:600}.tour-price{color:#5ddb8f;margin-bottom:.25em;font-size:.9em;font-weight:600}.tour-desc{color:#a8d8ff80;font-size:.78em}.fares-section{margin-bottom:1.5em}.fares-section h3{color:#c8e0ff;margin-bottom:.5em;font-size:1em}.fare-table{border-collapse:collapse;width:100%;max-width:300px;font-size:.85em}.fare-table td{color:#e8f0fecc;border-bottom:1px solid #64b4ff0f;padding:.45em .65em}.fare-table td:last-child{text-align:right;color:#5ddb8f;font-weight:600}.payment-methods{color:#a8d8ff80;margin-top:.5em;font-size:.8em}.fare-note{color:#f39c12;margin-top:.4em;font-size:.78em}.stops-section{margin-bottom:1.5em}.stops-section h3{color:#c8e0ff;margin-bottom:.5em;font-size:1em}.stops-list{padding-left:1.25em;font-size:.85em}.stops-list li{color:#a8d8ff99;margin-bottom:.3em}.timetable-footer{border-top:1px solid #64b4ff14;margin-top:1.5em;padding-top:1em}.btn-website{color:#a8d8ff;-webkit-backdrop-filter:blur(8px);background:linear-gradient(135deg,#1e64b466,#3c8cdc4d);border:1px solid #64b4ff26;border-radius:12px;padding:.55em 1.1em;font-size:.85em;font-weight:500;text-decoration:none;transition:all .35s cubic-bezier(.22,1,.36,1);display:inline-block}.btn-website:hover{color:#fff;background:linear-gradient(135deg,#1e64b499,#3c8cdc80);border-color:#64b4ff4d;transform:translateY(-1px);box-shadow:0 4px 16px #3c8cdc33}.live-view{flex:1;padding:1.25em;overflow-y:auto}.live-header{margin-bottom:1.25em}.live-header h2{color:#e8f0fe;text-shadow:0 0 20px #64b4ff33;margin-bottom:.25em;font-size:1.5em}.live-subtitle{color:#a8d8ff80;font-size:.88em}.live-status-card{-webkit-backdrop-filter:blur(12px);border-radius:14px;margin-bottom:1.5em;padding:1em;transition:all .35s cubic-bezier(.22,1,.36,1)}.live-status-card.online{background:#27ae600f;border:1px solid #27ae6033;box-shadow:0 4px 20px #27ae6014}.live-status-card.offline{background:#e74c3c0a;border:1px solid #e74c3c26}.live-status-card.loading{background:#f39c120a;border:1px solid #f39c1226}.live-status-card.no-data{background:#f39c1208;border:1px solid #f39c121f}.live-status-indicator{color:#c8e0ff;align-items:center;gap:.5em;margin-bottom:.5em;font-weight:600;display:flex}.status-dot{border-radius:50%;flex-shrink:0;width:10px;height:10px;display:inline-block}.status-dot.gray{background:#95a5a6}.status-dot.green{background:#27ae60;animation:2s infinite pulse}.status-dot.yellow{background:#f39c12}.status-dot.red{background:#e74c3c}@keyframes pulse{0%,to{opacity:1}50%{opacity:.4}}.live-last-update{color:#a8d8ff59;font-size:.78em}.live-alert-badge{color:#f39c12;font-weight:600}.live-refresh-btn{color:#a8d8ff99;cursor:pointer;-webkit-backdrop-filter:blur(8px);background:#ffffff0a;border:1px solid #64b4ff1f;border-radius:8px;padding:.3em .7em;font-size:.75em;transition:all .15s}.live-refresh-btn:hover{color:#c8e0ff;background:#ffffff14;border-color:#64b4ff33}.live-error-detail{color:#a8d8ff73;margin:.5em 0;font-size:.85em;line-height:1.4}.live-fallback-toggle{margin-top:.75em}.live-fallback-toggle label{color:#a8d8ff80;cursor:pointer;align-items:center;gap:.5em;font-size:.85em;display:flex}.live-fallback-toggle input{accent-color:#4a9fd4}.live-section{margin-bottom:1.5em}.live-section h3{color:#c8e0ff;margin-bottom:.75em;font-size:1em}.source-list{flex-direction:column;gap:.75em;display:flex}.source-card{-webkit-backdrop-filter:blur(8px);background:#ffffff05;border:1px solid #64b4ff14;border-radius:14px;padding:.85em;transition:all .35s cubic-bezier(.22,1,.36,1)}.source-card:hover{background:#ffffff0a;border-color:#64b4ff26}.source-card.primary{background:#1e64b414;border-color:#64b4ff33}.source-name{color:#c8e0ff;margin-bottom:.35em;font-size:.9em;font-weight:600}.source-desc{color:#a8d8ff80;margin-bottom:.5em;font-size:.8em;line-height:1.4}.source-meta{flex-wrap:wrap;gap:.4em;margin-bottom:.5em;display:flex}.source-tag{color:#a8d8ff80;background:#64b4ff14;border:1px solid #64b4ff0f;border-radius:8px;padding:.15em .55em;font-size:.62em}.source-tag.paid{color:#f5c842;background:#f39c121a;border-color:#f39c121a}.source-tag.green{color:#5ddb8f;background:#27ae601a;border-color:#27ae601a}.source-tag.red{color:#e07060;background:#e74c3c1a;border-color:#e74c3c1a}.source-link{color:#7ab8f5;font-size:.8em;font-weight:500;text-decoration:none}.source-link:hover{text-decoration:underline}.operator-live-list{flex-direction:column;gap:.5em;display:flex}.operator-live-card{-webkit-backdrop-filter:blur(8px);background:#ffffff05;border:1px solid #64b4ff14;border-left-width:4px;border-radius:12px;flex-wrap:wrap;align-items:center;gap:1em;padding:.75em;display:flex}.operator-live-name{color:#c8e0ff;flex:1;font-size:.85em;font-weight:600}.operator-live-routes{color:#a8d8ff66;font-size:.75em}.operator-live-link{color:#7ab8f5;font-size:.75em;text-decoration:none}.integration-notes{color:#a8d8ff8c;font-size:.85em;line-height:1.6}.integration-notes ol{margin-top:.5em;padding-left:1.25em}.integration-notes li{margin-bottom:.25em}.integration-notes code{color:#a8d8ff;background:#1e3c644d;border:1px solid #64b4ff14;border-radius:6px;padding:.1em .4em;font-size:.88em}.live-vessel-list{flex-direction:column;gap:.75em;display:flex}.live-vessel-card{-webkit-backdrop-filter:blur(8px);background:#ffffff08;border:1px solid #64b4ff1a;border-left:4px solid #4a9fd4;border-radius:14px;padding:.85em;transition:all .35s cubic-bezier(.22,1,.36,1)}.live-vessel-card:hover{background:#ffffff0d;border-color:#64b4ff33;transform:translateY(-1px);box-shadow:0 4px 16px #00000026}.live-vessel-header{flex-wrap:wrap;align-items:center;gap:.5em;margin-bottom:.5em;display:flex}.live-vessel-route-color{border-radius:50%;flex-shrink:0;width:12px;height:12px;display:inline-block}.live-vessel-name{color:#e8f0fe;flex:1;font-size:.95em;font-weight:600}.live-vessel-status{text-transform:uppercase;letter-spacing:.5px;border-radius:10px;padding:.2em .65em;font-size:.62em;font-weight:700}.live-vessel-status.status-in_transit_to{color:#5ddb8f;background:#27ae6026}.live-vessel-status.status-incoming_at{color:#f5c842;background:#f39c121f}.live-vessel-status.status-stopped_at{color:#e07060;background:#e74c3c1f}.live-vessel-details{flex-wrap:wrap;gap:.75em;display:flex}.live-vessel-detail{color:#a8d8ff80;font-size:.8em}.live-vessel-detail.eta{color:#5ddb8f;font-weight:600}.live-vessel-next-stop{color:#a8d8ff66;margin-top:.4em;font-size:.8em}.live-alert-card{-webkit-backdrop-filter:blur(8px);background:#f39c120a;border:1px solid #f39c1226;border-radius:12px;margin-bottom:.5em;padding:.75em}.live-alert-header{color:#f5c842;margin-bottom:.25em;font-size:.9em;font-weight:600}.live-alert-body{color:#a8d8ff8c;font-size:.85em;line-height:1.4}.live-alert-meta{flex-wrap:wrap;gap:.5em;margin-top:.4em;display:flex}.live-alert-routes{color:#7ab8f5;font-size:.7em;font-weight:500}.live-alert-cause{color:#f5c842;background:#f39c121a;border-radius:6px;padding:.1em .45em;font-size:.7em}.live-alert-effect{color:#e07060;background:#e74c3c1a;border-radius:6px;padding:.1em .45em;font-size:.7em}.ferry-marker{background:0 0!important;border:none!important}.ferry-marker svg{filter:drop-shadow(0 2px 6px #0006)}.leaflet-marker-icon.ferry-marker{transition:transform 1s linear!important}.live-dot{vertical-align:middle;background:#27ae60;border-radius:50%;width:8px;height:8px;margin-left:4px;animation:2s infinite pulse;display:inline-block}.leaflet-container{font-family:inherit}.leaflet-popup-content-wrapper{-webkit-backdrop-filter:blur(16px)saturate(150%)!important;color:#e8f0fe!important;background:#0c1929d9!important;border:1px solid #64b4ff26!important;border-radius:14px!important;box-shadow:0 8px 32px #0006!important}.leaflet-popup-tip{background:#0c1929d9!important;border:1px solid #64b4ff1a!important}.leaflet-popup-content{color:#c8e0ff;font-size:.85em;line-height:1.5}.leaflet-popup-content strong{color:#e8f0fe;font-size:1.05em}.leaflet-popup-close-button{color:#a8d8ff80!important}::-webkit-scrollbar{width:6px}::-webkit-scrollbar-track{background:0 0}::-webkit-scrollbar-thumb{background:#64b4ff26;border-radius:3px}::-webkit-scrollbar-thumb:hover{background:#64b4ff40}@media (width<=768px){.sidebar{z-index:200;position:absolute;top:0;bottom:0;left:0;box-shadow:4px 0 24px #0006}.sidebar.closed{width:0;min-width:0}.app-header h1{font-size:.95em}.tagline{display:none}.filters{flex-direction:column}.filters select{width:100%}.main-content{flex-direction:column}.map-panel,.timetable-panel,.live-panel{flex:none;height:100%}.map-panel.active,.timetable-panel.active,.live-panel.active{display:flex}.tis-schedule,.tour-grid{grid-template-columns:1fr}}@media (width>=769px){.map-panel.hidden-mobile,.timetable-panel.hidden-mobile,.live-panel.hidden-mobile{display:flex}.menu-toggle{display:none}}@media (prefers-reduced-motion:reduce){*,:before,:after{transition-duration:.01ms!important;animation-duration:.01ms!important;animation-iteration-count:1!important}}body{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;margin:0}.leaflet-container{width:100%;height:100%}
