:root{--sky: #bee3f5;--sky-deep: #8ec8ec;--cream: #fff8ec;--bluey: #4e9bd4;--bluey-deep: #2c5f8a;--bingo: #e8935b;--bingo-deep: #c2633a;--ink: #28384a;--grass: #7fbf6e;--radius: 18px;--shadow: 0 4px 14px rgba(44, 95, 138, .18);--font-display: "Fredoka", system-ui, sans-serif;--font-body: "Nunito", system-ui, sans-serif}*{box-sizing:border-box;-webkit-tap-highlight-color:transparent}html,body,#root{height:100%;margin:0}body{font-family:var(--font-body);color:var(--ink);background:var(--cream);user-select:none;-webkit-user-select:none;touch-action:manipulation;overscroll-behavior-y:none}.map{position:fixed;top:0;right:0;bottom:0;left:0;width:100vw;height:100dvh;z-index:0}.leaflet-container{font-family:var(--font-body);background:var(--sky)}.dog-marker{position:relative;display:flex;flex-direction:column;align-items:center;animation:bob 2.4s ease-in-out infinite}.dog-bubble{width:44px;height:44px;border-radius:50%;background:var(--fill);border:3px solid var(--deep);display:flex;align-items:center;justify-content:center;box-shadow:var(--shadow)}.dog-rotor{position:absolute;top:0;left:50%;width:44px;height:44px;margin-left:-22px;transform:rotate(var(--bearing, 0deg));transform-origin:50% 50%;pointer-events:none}.dog-rotor[data-has-bearing=false]{display:none}.dog-arrow{position:absolute;top:-11px;left:50%;margin-left:-7px;width:0;height:0;border-left:7px solid transparent;border-right:7px solid transparent;border-bottom:11px solid var(--deep);filter:drop-shadow(0 1px 1px rgba(0,0,0,.25))}.dog-tag{margin-top:2px;font-family:var(--font-display);font-size:11px;font-weight:700;background:var(--cream);color:var(--deep);padding:1px 7px;border-radius:999px;border:2px solid var(--deep)}@keyframes bob{0%,to{transform:translateY(0)}50%{transform:translateY(-5px)}}.user-dot{position:relative;width:22px;height:22px;display:grid;place-items:center}.user-dot:before{content:"";position:absolute;top:0;right:0;bottom:0;left:0;border-radius:50%;background:#2e6ea04d;animation:userpulse 2s ease-out infinite}.user-dot-core{width:14px;height:14px;border-radius:50%;background:#2e6ea0;border:3px solid #fff;box-shadow:0 1px 4px #00000059}@keyframes userpulse{0%{transform:scale(.5);opacity:.8}to{transform:scale(1.9);opacity:0}}.topbar{position:fixed;top:0;left:0;right:0;z-index:200;background:linear-gradient(180deg,var(--sky-deep),var(--sky));padding:calc(env(safe-area-inset-top) + 10px) 16px 10px;display:flex;align-items:center;justify-content:space-between;box-shadow:0 2px 12px #2c5f8a2e}.brand{display:flex;align-items:center;gap:8px}.brand-paw{font-size:22px;transform:rotate(-12deg)}.topbar h1{font-family:var(--font-display);font-weight:700;font-size:21px;margin:0;color:var(--bluey-deep);letter-spacing:.3px}.status-chip{display:inline-flex;align-items:center;gap:6px;font-size:12px;font-weight:800;background:var(--cream);color:var(--bluey-deep);border-radius:999px;padding:4px 10px;box-shadow:var(--shadow)}.status-chip .pulse{width:8px;height:8px;border-radius:50%;background:var(--grass);animation:pulse 1.6s ease-in-out infinite}.status-chip.error .pulse{background:var(--bingo-deep);animation:none}.status-chip.connecting .pulse{background:var(--sky-deep)}@keyframes pulse{0%,to{transform:scale(1);opacity:1}50%{transform:scale(1.5);opacity:.55}}.ferry-buttons{position:fixed;left:12px;top:calc(env(safe-area-inset-top) + 74px);z-index:2500;display:flex;flex-direction:column;gap:8px}.ferry-btn{display:flex;align-items:center;gap:8px;padding:9px 16px 9px 12px;border-radius:999px;border:3px solid transparent;font-family:var(--font-display);font-weight:700;font-size:15px;cursor:pointer;box-shadow:0 3px 12px #00000038;backdrop-filter:blur(6px);-webkit-backdrop-filter:blur(6px);transition:transform .12s ease,box-shadow .12s ease}.ferry-btn:active{transform:scale(.95);box-shadow:0 1px 6px #0000002e}.ferry-btn-bluey{background:#2e6ea0e6;border-color:var(--bluey-deep);color:#fff}.ferry-btn-bingo{background:#c2633ae6;border-color:var(--bingo-deep);color:#fff}.foot{position:fixed;bottom:0;left:0;right:0;z-index:200;padding:8px 16px calc(env(safe-area-inset-bottom) + 8px);font-size:11px;text-align:center;color:var(--bluey-deep);background:#fff8ece0;backdrop-filter:blur(6px);-webkit-backdrop-filter:blur(6px);box-shadow:0 -2px 10px #2c5f8a1a}.foot-link{color:var(--bluey-deep);font-weight:800;text-decoration:none;border-bottom:1.5px solid var(--bluey)}.foot-link:hover{opacity:.8}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:2000;background:#28384a73;display:grid;place-items:center;padding:20px;animation:fadein .15s ease}.modal-card{width:min(420px,100%);background:var(--cream);border-radius:22px;box-shadow:0 12px 40px #00000040;border:4px solid var(--sky-deep);animation:pop .18s ease;overflow:hidden}.modal-head{display:flex;align-items:center;justify-content:space-between;padding:14px 18px 0}.modal-head h2{font-family:var(--font-display);font-size:20px;margin:0;color:var(--bluey-deep)}.modal-close{border:none;background:var(--sky);color:var(--bluey-deep);width:32px;height:32px;border-radius:50%;font-size:20px;cursor:pointer;flex-shrink:0}.modal-body{padding:10px 18px 18px;font-size:15px;line-height:1.5}.btn-primary{width:100%;margin-top:8px;border:none;cursor:pointer;background:var(--bluey);color:#fff;font-family:var(--font-display);font-weight:700;font-size:17px;padding:12px;border-radius:999px;box-shadow:var(--shadow)}.btn-primary:active{transform:scale(.98)}@keyframes fadein{0%{opacity:0}}@keyframes pop{0%{transform:scale(.92);opacity:0}}.modal-banner{padding:7px 0;text-align:center;font-size:15px;letter-spacing:6px;font-style:italic}.modal-banner-bluey{background:linear-gradient(90deg,#d4ecfa,#eef7fd);color:var(--bluey-deep)}.modal-banner-bingo{background:linear-gradient(90deg,#fbe2d2,#fdf2ea);color:var(--bingo-deep)}.modal-card.modal-bluey{border-color:var(--sky-deep);background:#f3faff}.modal-card.modal-bluey .modal-head h2{color:var(--bluey-deep)}.modal-card.modal-bluey .modal-close{background:#dceffb;color:var(--bluey-deep)}.modal-card.modal-bluey .timetable{background:#ffffffb3}.modal-card.modal-bluey .timetable h3{color:var(--bluey-deep)}.modal-card.modal-bluey .timetable li{border-bottom-color:#cfe6f5}.modal-card.modal-bingo{border-color:#f3b48d;background:#fff7f1}.modal-card.modal-bingo .modal-head h2{color:var(--bingo-deep)}.modal-card.modal-bingo .modal-close{background:#fbe2d2;color:var(--bingo-deep)}.modal-card.modal-bingo .timetable{background:#ffffffb3}.modal-card.modal-bingo .timetable h3,.modal-card.modal-bingo .timetable li.next{color:var(--bingo-deep)}.modal-card.modal-bingo .timetable li{border-bottom-color:#f5d4bf}.modal-card.modal-bingo .tt-toggle{color:var(--bingo-deep)}.modal-title-group{display:flex;flex-direction:column;gap:2px}.modal-title-group h2{margin:0}.modal-card.modal-stop{border-color:var(--sky-deep);background:#f6fbff}.modal-card.modal-stop .modal-head h2{color:var(--bluey-deep)}.modal-card.modal-stop .modal-close{background:#dceffb;color:var(--bluey-deep)}.modal-banner-stop{background:linear-gradient(90deg,#d4ecfa,#fbe2d2);color:var(--bluey-deep)}.stop-subtitle{font-size:12px;font-weight:800;opacity:.6}.stop-est{font-size:10px;font-weight:800;letter-spacing:.04em;text-transform:uppercase;color:#fff;background:var(--bingo);padding:1px 7px;border-radius:999px;vertical-align:middle;margin-left:4px}.stop-forecast{list-style:none;margin:0;padding:0}.stop-forecast .sa-time{font-style:italic}.stop-empty{margin:6px 2px;font-weight:700;color:var(--bluey-deep)}.stop-arrivals{list-style:none;margin:0;padding:0}.stop-arrival{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:12px;margin-bottom:8px;border-radius:var(--radius);border:2.5px solid transparent;background:#ffffffbf}.stop-arrival:last-child{margin-bottom:0}.stop-arrival-bluey{border-color:var(--bluey)}.stop-arrival-bingo{border-color:var(--bingo)}.sa-name{font-family:var(--font-display);font-weight:700;font-size:17px}.stop-arrival-bluey .sa-name{color:var(--bluey-deep)}.stop-arrival-bingo .sa-name{color:var(--bingo-deep)}.sa-detail{display:flex;flex-direction:column;align-items:flex-end;gap:2px}.sa-when{display:flex;align-items:baseline;gap:6px}.sa-time{font-family:var(--font-display);font-weight:700;font-size:16px;font-variant-numeric:tabular-nums}.sa-rel{font-size:12px;font-weight:700;opacity:.7}.sa-dir{font-size:12px;font-weight:800;opacity:.8}.sa-none{font-size:13px;font-weight:700;opacity:.65;text-align:right}.stop-section-label{margin:4px 2px 8px;font-family:var(--font-display);font-weight:700;font-size:13px;color:var(--bluey-deep);opacity:.8}.stop-section-label:not(:first-child){margin-top:16px}.stop-sched{list-style:none;margin:0;padding:0}.sched-row{display:flex;align-items:center;gap:10px;padding:8px 2px;border-bottom:1.5px dashed #cfe6f5;font-size:14px}.sched-row:last-child{border-bottom:none}.sched-route{flex-shrink:0;font-family:var(--font-display);font-weight:700;font-size:12px;color:#fff;background:var(--bluey);padding:2px 8px;border-radius:999px}.sched-dir{flex:1;min-width:0;font-weight:700;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sched-when{display:flex;flex-direction:column;align-items:flex-end;gap:1px}.stop-foot{margin:12px 2px 0;font-size:11px;opacity:.55;font-weight:700}.ferry-modal-status{font-size:12px;font-weight:800;display:inline-flex;align-items:center;gap:5px}.ferry-modal-status:before{content:"";width:8px;height:8px;border-radius:50%;display:inline-block}.ferry-modal-status-on{color:var(--grass)}.ferry-modal-status-on:before{background:var(--grass);box-shadow:0 0 0 3px #7fbf6e4d}.ferry-modal-status-off{color:#9b9289}.ferry-modal-status-off:before{background:#c9c2b4}.timetable{margin-top:10px;background:#ffffffa6;border-radius:var(--radius);box-shadow:var(--shadow);padding:14px 16px}.timetable h3{font-family:var(--font-display);margin:0 0 8px;font-size:16px;color:var(--bluey-deep)}.timetable ul{list-style:none;margin:0;padding:0}.timetable li{display:flex;align-items:center;justify-content:space-between;gap:10px;padding:7px 2px;border-bottom:1.5px dashed var(--sky);font-weight:700;font-size:14px}.timetable li:last-child{border-bottom:none}.tt-stop{display:flex;flex-direction:column;gap:1px;min-width:0}.tt-name{font-weight:700}.timetable li.next .tt-name:before{content:"🐾 "}.timetable li.next{color:var(--bluey-deep)}.tt-role{font-size:10px;font-weight:800;letter-spacing:.05em;text-transform:uppercase;opacity:.55}.timetable li.past{opacity:.6}.timetable li.past .tt-time{font-style:italic;font-size:12px}.tt-time{font-variant-numeric:tabular-nums;white-space:nowrap;text-align:right}.tt-toggle-row{justify-content:center;padding:0}.tt-toggle{width:100%;background:none;border:none;cursor:pointer;font-family:var(--font-body);font-weight:800;font-size:12.5px;letter-spacing:.03em;color:var(--bluey-deep);opacity:.7;padding:8px 2px}.tt-toggle:hover{opacity:1}.timetable.empty p{margin:4px 0;font-weight:700}.timetable.empty h3{margin-bottom:4px}.locate-btn{position:fixed;left:12px;bottom:calc(env(safe-area-inset-bottom) + 46px);z-index:200;display:inline-flex;align-items:center;gap:6px;padding:8px 14px;border-radius:999px;border:3px solid var(--bluey-deep);background:#ffffffeb;color:var(--bluey-deep);font-family:var(--font-display);font-weight:700;font-size:13px;box-shadow:0 3px 12px #0000002e;cursor:pointer;backdrop-filter:blur(6px);-webkit-backdrop-filter:blur(6px);transition:transform .12s ease}.locate-btn:active{transform:scale(.95)}.locate-granted{border-color:var(--grass);color:#3f7a32}.locate-denied,.locate-unsupported{border-color:#c9c2b4;color:#8a8275}.install-pill{position:fixed;left:50%;transform:translate(-50%);bottom:calc(env(safe-area-inset-bottom) + 36px);z-index:1500;border:3px solid var(--bingo-deep);background:var(--bingo);color:#fff;font-family:var(--font-display);font-weight:700;font-size:14px;padding:9px 18px;border-radius:999px;box-shadow:var(--shadow);cursor:pointer}.install-steps{padding-left:20px}.install-steps li{margin-bottom:8px}.kbd{background:var(--sky);border-radius:6px;padding:0 6px;font-weight:800}@media (min-width: 760px){.topbar h1{font-size:23px}.ferry-buttons{gap:10px}.ferry-btn{font-size:16px;padding:10px 18px 10px 14px}}@media (prefers-reduced-motion: reduce){.dog-marker,.status-chip .pulse{animation:none}*{transition:none!important}}
