.roster-page{padding-top:1rem}.roster-page h2{color:#1e4f8a;margin:0 0 .35rem;font-size:1.35rem}.roster-page .subtitle{color:#4a5560;margin:0 0 1.25rem;font-size:.95rem;line-height:1.45}.roster-form{background:#fff;border-radius:12px;padding:1rem;box-shadow:0 2px 10px #0000000f}.roster-form .field{margin-bottom:1rem}.roster-form label{margin-bottom:.35rem;font-size:.9rem;font-weight:600;display:block}.roster-form select,.roster-form input[type=number],.roster-form input[type=date],.roster-form input[type=text]{background:#fff;border:1px solid #c5d0db;border-radius:8px;width:100%;min-height:2.75rem;padding:.55rem .65rem;font-size:16px}.roster-form button{color:#fff;cursor:pointer;touch-action:manipulation;background:#2b6cb0;border:none;border-radius:8px;width:100%;min-height:3rem;font-size:1rem;font-weight:700}.roster-form button:active{transform:scale(.99)}.roster-error{color:#9b1c1c;background:#fde8e8;border-radius:8px;margin-top:1rem;padding:.75rem;font-weight:600}.roster-results{margin-top:1.25rem}.roster-today{margin-bottom:1.25rem}.roster-today h3,.roster-schedule h3{color:#1e4f8a;margin:0 0 .75rem;font-size:1.05rem}.roster-legend{color:#4a5568;flex-wrap:wrap;gap:.45rem .85rem;margin-bottom:.75rem;font-size:.78rem;font-weight:600;display:flex}.roster-legend__item{align-items:center;gap:.35rem;display:inline-flex}.roster-legend__dot{border-radius:50%;flex-shrink:0;width:.55rem;height:.55rem}.roster-legend__dot.status-scheduled{background:#0d9488}.roster-legend__dot.status-rest{background:#64748b}.roster-legend__dot.status-off-day{background:#7c3aed}.roster-legend__hint{color:#718096;font-weight:500}.roster-legend__hint strong{color:#1e4f8a;font-weight:700}.roster-schedule-table{background:#fff;border:1px solid #e2e8f0;border-radius:12px;overflow:hidden;box-shadow:0 2px 10px #0000000d}.roster-schedule-head{display:none}.roster-schedule-body{flex-direction:column;display:flex}.status-scheduled{--status-accent:#0d9488;--status-bg:#f0fdfa;--status-pill-bg:#ccfbf1;--status-pill-text:#115e59}.status-rest{--status-accent:#64748b;--status-bg:#f8fafc;--status-pill-bg:#e2e8f0;--status-pill-text:#334155}.status-off-day{--status-accent:#7c3aed;--status-bg:#f5f3ff;--status-pill-bg:#ede9fe;--status-pill-text:#5b21b6}.roster-day-row{border-bottom:1px solid #eef2f6;border-left:3px solid var(--status-accent);box-sizing:border-box;background:#fff;grid-template-columns:minmax(4.5rem,5.25rem) minmax(0,1fr) auto;grid-template-areas:"date duty status""date duty rule";align-items:start;gap:.15rem .65rem;width:100%;min-width:0;padding:.65rem .75rem;transition:background .12s;display:grid}.roster-schedule-body .roster-day-row:last-child{border-bottom:none}.roster-day-row:nth-child(2n){background:#fafbfc}.roster-day-row.has-rule{cursor:pointer}.roster-day-row.has-rule:active{background:#f0f4f8}.roster-day-row.has-rule:focus-visible{outline-offset:-2px;z-index:1;outline:2px solid #1e4f8a}.roster-row-date{grid-area:date;min-width:0;line-height:1.25}.roster-row-date__main{color:#1a202c;white-space:nowrap;font-size:.78rem;font-weight:700;display:block}.roster-row-date__day{color:#718096;text-transform:uppercase;letter-spacing:.03em;font-size:.72rem;font-weight:600;display:block}.roster-row-duty{grid-area:duty;min-width:0;overflow:hidden}.roster-row-train{color:#1e4f8a;word-break:break-word;font-size:.88rem;font-weight:700;line-height:1.3;display:block}.roster-row-meta{color:#718096;margin-top:.1rem;font-size:.72rem;font-weight:600;line-height:1.3;display:block}.roster-row-trip-type{display:none}.roster-row-route{color:#4a5568;word-break:break-word;margin-top:.15rem;font-size:.8rem;line-height:1.35;display:block}.roster-row-route-col{display:none}.roster-row-status{grid-area:status;justify-self:end}.status-pill{white-space:nowrap;background:var(--status-pill-bg);color:var(--status-pill-text);border-radius:999px;padding:.18rem .45rem;font-size:.68rem;font-weight:700;line-height:1.2;display:inline-block}.roster-row-rule{flex-wrap:wrap;grid-area:rule;justify-content:flex-end;justify-self:end;gap:.25rem;display:flex}.roster-day-row.rules-hidden{grid-template-areas:"date duty status""date duty status"}.roster-today-hero{border:1px solid #c8ddf5;border-left:4px solid var(--status-accent);box-sizing:border-box;background:linear-gradient(135deg,#edf5ff 0%,#fff 100%);border-radius:12px;grid-template-columns:minmax(4.5rem,5.5rem) minmax(0,1fr) auto;grid-template-areas:"date duty status""date duty rule";align-items:start;gap:.2rem .75rem;width:100%;margin-bottom:0;padding:.85rem 1rem;display:grid;overflow:hidden;box-shadow:0 2px 12px #1e4f8a1a}.roster-today-hero.rules-hidden{grid-template-areas:"date duty status""date duty status"}.roster-today-hero .roster-row-date{grid-area:date}.roster-today-hero .roster-row-duty{grid-area:duty;display:block}.roster-today-hero .roster-row-route{display:block}.roster-today-hero .roster-row-route-col{display:none}.roster-today-hero .roster-row-status{grid-area:status;justify-self:end}.roster-today-hero .roster-row-rule{grid-area:rule;justify-self:end}.roster-today-hero .roster-row-date__main{white-space:normal;font-size:.85rem}.roster-today-hero .roster-row-train{font-size:1rem}.roster-today-hero .status-pill{padding:.25rem .55rem;font-size:.72rem}.rule-badge{cursor:pointer;color:#fff;touch-action:manipulation;background:#1e4f8a;border:none;border-radius:999px;padding:.18rem .5rem;font-size:.68rem;font-weight:700;line-height:1.2}.rule-badge-cycle{cursor:default;color:#4a5568;background:#e2e8f0}.roster-today-hero.has-rule{cursor:pointer}.roster-today-hero.has-rule:focus-visible{outline-offset:2px;outline:2px solid #1e4f8a}@media (width>=720px){.roster-schedule-head,.roster-schedule-body .roster-day-row{grid-template-columns:7.5rem minmax(5rem,1.1fr) 3.5rem minmax(4.5rem,.9fr) minmax(4.5rem,.9fr) 5.75rem;align-items:center;gap:.5rem .75rem;padding:.55rem 1rem;display:grid;grid-template-areas:none!important}.roster-schedule-table:not(.rules-hidden) .roster-schedule-head,.roster-schedule-table:not(.rules-hidden) .roster-schedule-body .roster-day-row{grid-template-columns:7.5rem minmax(5rem,1.1fr) 3.5rem minmax(4.5rem,.9fr) minmax(4.5rem,.9fr) 5.75rem 4.25rem}.roster-schedule-head{text-transform:uppercase;letter-spacing:.04em;color:#718096;background:#f7f9fc;border-bottom:1px solid #e2e8f0;padding-top:.65rem;padding-bottom:.65rem;font-size:.7rem;font-weight:700;display:grid}.roster-schedule-body .roster-day-row>*{grid-area:auto}.roster-schedule-body .roster-day-row .roster-row-date{flex-direction:column;grid-column:1;display:flex}.roster-schedule-body .roster-day-row .roster-row-duty{grid-column:2;min-width:0;display:block}.roster-schedule-body .roster-day-row .roster-row-train{font-size:.85rem}.roster-schedule-body .roster-day-row .roster-row-meta,.roster-schedule-body .roster-day-row .roster-row-route{display:none}.roster-schedule-body .roster-day-row .roster-row-trip-type{color:#4a5568;grid-column:3;min-width:0;font-size:.8rem;font-weight:600;display:block}.roster-schedule-body .roster-day-row .roster-row-route-col{display:contents}.roster-schedule-body .roster-day-row .roster-row-from{color:#2d3748;grid-area:auto/4;min-width:0;font-size:.85rem}.roster-schedule-body .roster-day-row .roster-row-to{color:#2d3748;grid-area:auto/5;min-width:0;font-size:.85rem}.roster-schedule-body .roster-day-row .roster-row-status{grid-column:6;justify-self:start}.roster-schedule-body .roster-day-row .roster-row-rule{grid-column:7;justify-self:start}.roster-today-hero{grid-template-columns:minmax(5rem,6.5rem) minmax(0,1fr) auto;grid-template-areas:"date duty status""date duty rule";padding:1rem 1.15rem}.roster-today-hero.rules-hidden{grid-template-areas:"date duty status""date duty status"}.roster-today-hero .roster-row-date{grid-area:date}.roster-today-hero .roster-row-duty{grid-area:duty;display:block}.roster-today-hero .roster-row-status{grid-area:status}.roster-today-hero .roster-row-rule{grid-area:rule}}.rule-modal{z-index:1000;justify-content:center;align-items:flex-end;padding:0;display:flex;position:fixed;inset:0}.rule-modal.hidden{display:none}body.rule-modal-open{overflow:hidden}.rule-modal-backdrop{background:#00000073;position:absolute;inset:0}.rule-modal-panel{z-index:1;width:100%;max-width:40rem;max-height:85dvh;padding:1.25rem 1rem max(1rem, env(safe-area-inset-bottom));background:#fff;border-radius:16px 16px 0 0;position:relative;overflow-y:auto;box-shadow:0 -4px 24px #00000026}@media (width>=480px){.rule-modal{align-items:center;padding:1rem}.rule-modal-panel{border-radius:16px;max-height:90dvh}}.rule-modal-close{color:#4a5568;cursor:pointer;background:0 0;border:none;padding:.25rem;font-size:1.75rem;line-height:1;position:absolute;top:.5rem;right:.65rem}.rule-modal-id{color:#2b6cb0;text-transform:uppercase;margin:0 0 .25rem;font-size:.78rem;font-weight:700}.rule-modal-title{color:#1e4f8a;margin:0 0 .25rem;padding-right:2rem;font-size:1.1rem}.rule-modal-title-bn{color:#2d3748;margin:0 0 1rem;font-size:.95rem;font-weight:600}.rule-modal-details{gap:.75rem;margin:0;font-size:.92rem;display:grid}.rule-modal-details dt{text-transform:uppercase;color:#718096;margin-bottom:.2rem;font-size:.78rem;font-weight:700}.rule-modal-details dd{margin:0;line-height:1.45}.rule-modal-details .rule-bn{color:#2d3748;margin-top:.3rem;font-size:.9rem}.rule-modal-footer{margin:1rem 0 0;font-size:.88rem}.rule-modal-footer a{color:#2b6cb0;font-weight:600}.roster-subnav{-webkit-overflow-scrolling:touch;gap:.5rem;margin-bottom:1rem;display:flex;overflow-x:auto}.roster-subnav a{color:#1e4f8a;background:#e8f0fa;border:1px solid #c8ddf5;border-radius:999px;flex:none;padding:.5rem .85rem;font-size:.88rem;font-weight:600;text-decoration:none}.roster-subnav a.active{color:#fff;background:#1e4f8a;border-color:#1e4f8a}.rules-link{color:#2b6cb0;margin-top:.35rem;font-weight:600;display:inline-block}.rules-meta{color:#5a6570;margin:0 0 1rem;font-size:.88rem}.rules-meta a{color:#2b6cb0;font-weight:600}.rules-list{flex-direction:column;gap:.75rem;margin:0;padding:0;list-style:none;display:flex}.rule-card{background:#fff;border-left:4px solid #2b6cb0;border-radius:12px;padding:1rem;box-shadow:0 2px 10px #0000000f}.rule-header{flex-wrap:wrap;align-items:flex-start;gap:.5rem;margin-bottom:.65rem;display:flex}.rule-titles{flex:1;min-width:12rem}.rule-title-bn{color:#2d3748;margin:.2rem 0 0;font-size:.95rem;font-weight:600;line-height:1.4}.subtitle-bn{color:#5a6570;margin-top:-.75rem;font-size:.9rem}.dt-bn{color:#718096;text-transform:none;letter-spacing:0;font-size:.85em;font-weight:600}.rule-en{margin:0;line-height:1.45}.rule-bn{color:#2d3748;margin:.35rem 0 0;font-size:.95rem;line-height:1.55}.rule-details dd p.rule-en+p.rule-bn{border-top:1px dashed #e2e8f0;padding-top:.35rem}.rule-id{text-transform:uppercase;letter-spacing:.04em;color:#2b6cb0;background:#edf5ff;border-radius:4px;padding:.2rem .5rem;font-size:.78rem;font-weight:700}.rule-title{color:#1e4f8a;margin:0;font-size:1rem}.rule-details{gap:.5rem;margin:0;font-size:.92rem;display:grid}.rule-details dt{color:#4a5560;text-transform:uppercase;letter-spacing:.03em;margin:0 0 .15rem;font-size:.78rem;font-weight:700}.rule-details dd{margin:0;line-height:1.45}.rule-trains{flex-wrap:wrap;gap:.35rem;display:flex}.rule-trains code{background:#f0f4f8;border-radius:4px;padding:.15rem .4rem;font-size:.82rem}.rule-note{color:#5a6570;font-style:italic}.rules-footer-note{color:#4a5560;background:#fff;border-radius:12px;margin-top:1.5rem;padding:1rem;font-size:.88rem;line-height:1.5}.rules-footer-note h3{color:#1e4f8a;margin:0 0 .5rem;font-size:.95rem}.rules-footer-note p{margin:0}.rules-footer-note code{font-size:.82rem}
