:root{--csu-blue: #0f44cd;--csu-blue-tint: #dbe5ff;--csu-orange: #fa4618;--csu-orange-tint: #ffece5;--csu-orange-ink: #c2370f;--csu-ink: #000000;--csu-muted: #6b7280;--csu-surface: #ffffff;--csu-subtle: #f5f5f5;--csu-line: #e5e5e5;--csu-shadow: 0 0 6px #aaa;--csu-good: #15803d;--csu-good-tint: #dcfce7;--csu-ok: #b45309;--csu-ok-tint: #fef3c7;--csu-bad: #b91c1c;--csu-bad-tint: #fee2e2;--header-h: 60px;--panel-w: 420px}*,*:before,*:after{box-sizing:border-box;margin:0;padding:0}html,body{background:var(--csu-surface);color:var(--csu-ink);font-family:Sora,system-ui,sans-serif;font-size:15px;-webkit-font-smoothing:antialiased}button,input,select{font:inherit;color:inherit}button{cursor:pointer;background:none;border:none}:focus-visible{outline:2px solid var(--csu-blue);outline-offset:2px}.topbar{position:fixed;inset:0 0 auto 0;z-index:50;height:var(--header-h);display:flex;align-items:center;justify-content:space-between;gap:12px;padding:0 20px;background:#ffffffe6;-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);border-bottom:1px solid var(--csu-line)}.brand{display:flex;align-items:center;gap:10px;min-width:0}.brand-name{font-weight:600;font-size:1.1rem}.brand-sub{color:var(--csu-muted);font-size:.8rem;font-weight:300;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.button{display:inline-flex;align-items:center;justify-content:center;gap:6px;min-height:36px;padding:6px 16px;border-radius:9999px;font-size:.85rem;font-weight:500;border:1.5px solid var(--csu-line);background:var(--csu-surface);transition:background-color .15s ease,border-color .15s ease,color .15s ease}.button:hover{border-color:var(--csu-blue);color:var(--csu-blue)}.button.primary{background:var(--csu-blue);border-color:var(--csu-blue);color:#fff}.button.primary:hover{background:#0b37a8;color:#fff}.button:disabled{opacity:.5;cursor:default}.button.ghost{font-weight:400;justify-content:flex-start}.button.add{width:100%;border-style:dashed;color:var(--csu-blue);margin-top:4px}.link{color:var(--csu-blue);font-weight:500;font-size:inherit;padding:0}.link:hover{text-decoration:underline}.link.small,.small{font-size:.78rem}.icon-button{display:grid;place-items:center;width:32px;height:32px;flex-shrink:0;border-radius:9999px;color:var(--csu-muted)}.icon-button:hover{background:var(--csu-subtle);color:var(--csu-ink)}.muted{color:var(--csu-muted)}.center{text-align:center}.layout{display:grid;grid-template-columns:var(--panel-w) 1fr;padding-top:var(--header-h);height:100vh;height:100dvh}.panel{grid-column:1;grid-row:1;overflow-y:auto;padding:22px 24px;display:flex;flex-direction:column;gap:18px;background:var(--csu-subtle);border-right:1px solid var(--csu-line)}.map-pane{grid-column:2;grid-row:1;position:relative;min-height:0}@media (max-width: 899px){:root{--header-h: 54px}.topbar{padding:0 14px}.brand-sub{display:none}.layout{display:block;height:auto}.map-pane{position:sticky;top:var(--header-h);z-index:5;height:44vh;height:44dvh;border-bottom:1px solid var(--csu-line)}.panel{overflow:visible;padding:18px 16px calc(28px + env(safe-area-inset-bottom));border-right:none}}.card{background:var(--csu-surface);border-radius:14px;border:1.5px solid var(--csu-line);padding:18px 18px 20px}.card-head{display:flex;align-items:baseline;justify-content:space-between;margin-bottom:10px}.card h2{font-size:.95rem;font-weight:600}.card h2 small{color:var(--csu-muted);font-weight:400;margin-left:4px}input[type=text],input[type=time],input[type=number],select{width:100%;min-height:38px;padding:7px 10px;border:1.5px solid var(--csu-line);border-radius:10px;background:var(--csu-surface);font-size:.88rem;transition:border-color .15s ease}input:focus,select:focus{outline:none;border-color:var(--csu-blue);box-shadow:0 0 0 3px var(--csu-blue-tint)}input::placeholder{color:#9ca3af}.field{display:flex;flex-direction:column;gap:4px;min-width:0}.field>span,.stop-times label>span:first-child,.tfield>span{font-size:.72rem;font-weight:500;color:var(--csu-muted);display:flex;gap:8px;align-items:baseline}.field.grow{flex:1}.trip{display:flex;flex-direction:column;gap:10px}.trip-row{display:grid;grid-template-columns:130px 1fr;gap:10px;align-items:end}.segmented{display:flex;background:var(--csu-subtle);border-radius:9999px;padding:3px;min-height:38px}.segmented button{flex:1;border-radius:9999px;font-size:.82rem;color:var(--csu-muted);transition:background-color .15s ease,color .15s ease}.segmented button.on{background:var(--csu-surface);color:var(--csu-blue);font-weight:600;box-shadow:0 1px 3px #0002}.stops{list-style:none;display:flex;flex-direction:column;gap:12px}.stop{border:1.5px solid var(--csu-line);border-radius:12px;padding:12px 14px 14px;display:flex;flex-direction:column;gap:10px;scroll-margin:12px;transition:border-color .15s ease,box-shadow .15s ease}.stop.active{border-color:var(--csu-blue);box-shadow:0 0 0 3px var(--csu-blue-tint)}.stop-head{display:flex;align-items:center;gap:8px}.stop-name{font-weight:600;border-color:transparent!important;padding-left:4px!important;background:transparent!important}.stop-name:focus{border-color:var(--csu-blue)!important}.badge{display:grid;place-items:center;width:26px;height:26px;flex-shrink:0;border-radius:9999px;background:var(--csu-orange);color:#fff;font-size:.78rem;font-weight:700}.badge.empty{background:var(--csu-subtle);color:var(--csu-muted)}.badge.start{background:var(--csu-ink)}.where{font-size:.76rem;line-height:1.4;margin-top:-2px;padding-left:2px}.where.ok{color:var(--csu-good)}.where.warn{color:var(--csu-ok)}.where.bad{color:var(--csu-bad)}.stop-times{display:grid;grid-template-columns:repeat(3,1fr);gap:8px}.stop-times label,.tfield{display:flex;flex-direction:column;gap:4px;min-width:0}.with-unit{position:relative;display:block}.with-unit i{position:absolute;right:10px;top:50%;transform:translateY(-50%);font-style:normal;font-size:.78rem;color:var(--csu-muted);pointer-events:none}.with-unit input{padding-right:36px}.stop-extra{display:grid;grid-template-columns:1fr 1.6fr;gap:8px}.stop>.link.small{align-self:flex-start;padding-left:2px}.empty-note{font-size:.85rem;color:var(--csu-muted);padding:4px 0 12px}.address{position:relative}.suggestions{position:absolute;z-index:20;top:calc(100% + 4px);left:0;right:0;list-style:none;background:var(--csu-surface);border:1.5px solid var(--csu-line);border-radius:10px;box-shadow:0 6px 20px #0002;overflow:hidden}.suggestions li{display:flex;justify-content:space-between;align-items:center;gap:8px;padding:8px 10px;font-size:.85rem;cursor:pointer}.suggestions li.on,.suggestions li:hover{background:var(--csu-blue-tint)}.suggestions small{color:var(--csu-muted);font-size:.7rem;flex-shrink:0}.totals{display:grid;grid-template-columns:repeat(3,1fr);gap:8px;margin-bottom:14px}.totals div{background:var(--csu-subtle);border-radius:10px;padding:8px 10px}.totals dt{font-size:.7rem;color:var(--csu-muted);font-weight:500}.totals dd{font-weight:600;font-size:.92rem;font-variant-numeric:tabular-nums}.totals dd small{display:block;font-weight:400;color:var(--csu-muted);font-size:.72rem}.notice{font-size:.8rem;border-radius:10px;padding:8px 10px;margin-bottom:12px}.notice.bad{background:var(--csu-bad-tint);color:var(--csu-bad)}.timeline{list-style:none;position:relative}.timeline>li{position:relative}.tl-stop,.tl-start{display:flex;gap:10px;align-items:flex-start}.tl-start{margin-bottom:2px}.tl-stop>div,.tl-start>div{display:flex;flex-direction:column;min-width:0;padding-top:2px}.tl-stop strong,.tl-start strong{font-size:.9rem;font-weight:600}.tl-time{font-size:.8rem;font-variant-numeric:tabular-nums}.tl-sub{font-size:.75rem;color:var(--csu-muted)}.tl-sub.bad,.missed .tl-time{color:var(--csu-bad)}.missed .badge{background:var(--csu-bad)}.tl-leg{margin-left:12px;padding:8px 0 8px 22px;border-left:2px dotted #c7cdd8;font-size:.75rem;color:var(--csu-muted)}.tl-leg em{font-style:normal;color:var(--csu-ok)}.others{margin-top:16px;border-top:1px solid var(--csu-line);padding-top:12px}.others h3{font-size:.75rem;font-weight:500;color:var(--csu-muted);margin-bottom:6px}.others ul{list-style:none}.others button{width:100%;text-align:left;padding:7px 8px;margin:0 -8px;width:calc(100% + 16px);border-radius:8px;display:flex;flex-direction:column;gap:1px}.others button:hover{background:var(--csu-subtle)}.others-route{font-size:.8rem}.others small{font-size:.72rem;color:var(--csu-muted)}.actions{display:flex;justify-content:center}.foot{font-size:.7rem;color:var(--csu-muted);text-align:center;padding:4px 0 8px}.toast{position:fixed;left:50%;bottom:calc(24px + env(safe-area-inset-bottom));transform:translate(-50%);z-index:100;background:var(--csu-ink);color:#fff;font-size:.85rem;padding:8px 16px;border-radius:9999px}.map{position:absolute;top:0;right:0;bottom:0;left:0;overflow:hidden;background:var(--map-land);touch-action:none;user-select:none;-webkit-user-select:none;cursor:grab}.map:active{cursor:grabbing}.map.placing{cursor:crosshair}.map svg{display:block}.map-loading{display:grid;place-items:center;color:var(--csu-muted);font-size:.9rem}.map-base,.map-overlay{position:absolute;top:0;right:0;bottom:0;left:0;display:block}.map-overlay{overflow:visible}.map{--map-land: #fbfaf7;--map-green: #e8f0e1;--map-campus: #edf1ff;--map-water: #cfe0f5;--map-rail: #c9c3b8;--road-path: #d6d3cc;--road-service: #dcd9d2;--road-minor: #c9c6bf;--road-tertiary: #b0aca4;--road-secondary: #9c978e;--road-major: #7f7a72;--road-motorway: #e9a48e}.map-overlay .map-labels{transition:opacity .15s ease}.map-land{fill:var(--map-land)}.map-green{fill:var(--map-green)}.map-campus{fill:var(--map-campus)}.map-water{fill:var(--map-water)}.map-rail{fill:none;stroke:#c9c3b8;stroke-width:1.2;stroke-dasharray:5 3}.map-road{fill:none;stroke-linecap:round;stroke-linejoin:round}.map-road.path{stroke:#d6d3cc;stroke-dasharray:3 3}.map-road.service{stroke:#dcd9d2}.map-road.minor{stroke:#c9c6bf}.map-road.tertiary{stroke:#b0aca4}.map-road.secondary{stroke:#9c978e}.map-road.major{stroke:#7f7a72}.map-road.motorway{stroke:#e9a48e}.map-route-halo{fill:none;stroke:#fff;stroke-width:10;stroke-linecap:round;stroke-linejoin:round}.map-route{fill:none;stroke:var(--csu-blue);stroke-width:5.5;stroke-linecap:round;stroke-linejoin:round}.map-labels text{fill:#6b675f;stroke:var(--map-land);paint-order:stroke;stroke-linejoin:round;font-weight:500;letter-spacing:.02em;pointer-events:none}.map-labels .map-landmark{fill:#3e5aa6;font-weight:600}.map-pin{position:absolute;transform:translate(-50%,-50%);display:flex;align-items:center;gap:6px;padding:0;touch-action:none;cursor:grab;z-index:2}.map-pin.active,.map-pin.dragging{z-index:3}.map-pin-dot{display:grid;place-items:center;width:28px;height:28px;border-radius:9999px;background:var(--csu-orange);color:#fff;font-size:.8rem;font-weight:700;border:2.5px solid #fff;box-shadow:0 1px 4px #0005;transition:transform .12s ease}.map-pin.start .map-pin-dot{background:var(--csu-ink)}.map-pin.active .map-pin-dot,.map-pin.dragging .map-pin-dot{transform:scale(1.18)}.map-pin-name{position:absolute;left:32px;white-space:nowrap;max-width:180px;overflow:hidden;text-overflow:ellipsis;background:#ffffffeb;border-radius:9999px;padding:2px 8px;font-size:.72rem;font-weight:600;box-shadow:0 1px 3px #0003}.map-banner{position:absolute;top:12px;left:50%;transform:translate(-50%);display:flex;align-items:center;gap:12px;background:var(--csu-ink);color:#fff;border-radius:9999px;padding:6px 6px 6px 16px;font-size:.82rem;white-space:nowrap;max-width:calc(100% - 24px);z-index:4}.map-banner span{overflow:hidden;text-overflow:ellipsis}.map-banner button{background:#ffffff26;color:#fff;border-radius:9999px;padding:4px 12px;font-size:.78rem}.map-controls{position:absolute;right:12px;bottom:28px;display:flex;flex-direction:column;background:var(--csu-surface);border-radius:12px;box-shadow:0 1px 5px #0003;overflow:hidden;z-index:4}.map-controls button{width:38px;height:38px;display:grid;place-items:center;font-size:1.2rem;line-height:1;border-bottom:1px solid var(--csu-line)}.map-controls button:last-child{border-bottom:none}.map-controls button:hover{color:var(--csu-blue)}.map-credit{position:absolute;right:6px;bottom:4px;font-size:.62rem;color:var(--csu-muted);text-decoration:none;background:#ffffffb0;padding:1px 5px;border-radius:4px;z-index:4}@media (max-width: 899px){.map-controls{bottom:22px;right:10px}.map-controls button{width:36px;height:36px}.trip-row{grid-template-columns:124px 1fr}.stop-times{grid-template-columns:1.15fr .85fr 1.15fr}input[type=time]{padding:7px 6px;font-size:.82rem}.map-pin-name{max-width:120px}}.time{position:relative}.time-button{width:100%;min-height:38px;padding:7px 10px;border:1.5px solid var(--csu-line);border-radius:10px;background:var(--csu-surface);font-size:.88rem;font-variant-numeric:tabular-nums;text-align:left;white-space:nowrap;transition:border-color .15s ease}.time-button:hover,.time-button[aria-expanded=true]{border-color:var(--csu-blue)}.time-button.blank{color:#9ca3af}.time-list{position:absolute;z-index:30;top:calc(100% + 4px);left:0;min-width:100%;width:130px;max-height:232px;overflow-y:auto;overscroll-behavior:contain;list-style:none;background:var(--csu-surface);border:1.5px solid var(--csu-line);border-radius:10px;box-shadow:0 6px 20px #0002;padding:4px}.time-list li{padding:7px 10px;border-radius:7px;font-size:.85rem;font-variant-numeric:tabular-nums;cursor:pointer}.time-list li:hover{background:var(--csu-subtle)}.time-list li.on{background:var(--csu-blue);color:#fff}.time-list li.midnight{margin-top:4px;box-shadow:0 -3px 0 -2px var(--csu-line)}.time-list .time-clear{color:var(--csu-muted)}.stepper{display:flex;align-items:center;min-height:38px;border:1.5px solid var(--csu-line);border-radius:10px;overflow:hidden}.stepper button{width:30px;align-self:stretch;flex-shrink:0;font-size:1rem;color:var(--csu-muted)}.stepper button:hover{background:var(--csu-subtle);color:var(--csu-blue)}.stepper output{flex:1;text-align:center;font-size:.85rem;font-variant-numeric:tabular-nums;white-space:nowrap}.tl-stop{position:relative}.tl-stop>div{flex:1}.grip{align-self:center;display:grid;place-items:center;width:32px;height:36px;margin-right:-6px;border-radius:8px;color:#b8bcc5;cursor:grab;touch-action:none;flex-shrink:0}.grip svg{fill:currentColor}.grip:hover,.grip:focus-visible{color:var(--csu-blue);background:var(--csu-subtle)}.timeline.sorting,.timeline.sorting .grip{cursor:grabbing;-webkit-user-select:none;user-select:none}.timeline>li.lifted .tl-stop{background:var(--csu-blue-tint);border-radius:10px;margin:0 -8px;padding:4px 8px}.hint{margin-top:10px;font-size:.74rem;color:var(--csu-muted)}.notice.info{background:var(--csu-blue-tint);color:#0b37a8}.field.inline{flex-direction:row;align-items:center;gap:12px}.field.inline>span{flex-shrink:0}.field.inline select{width:auto;flex:1;max-width:200px}.field .where{margin-top:2px}
