@font-face { font-family: "Roboto Flex"; font-style: normal; font-weight: 100 1000; font-stretch: 25% 151%; font-display: swap; src: url("/fonts/RobotoFlex-Variable.ttf") format("truetype"); } :root { --md-sys-color-primary: #6750a4; --md-sys-color-on-primary: #fff; --md-sys-color-primary-container: #eaddff; --md-sys-color-on-primary-container: #21005d; --md-sys-color-secondary: #625b71; --md-sys-color-on-secondary: #fff; --md-sys-color-secondary-container: #e8def8; --md-sys-color-on-secondary-container: #1d192b; --md-sys-color-tertiary: #7d5260; --md-sys-color-on-tertiary: #fff; --md-sys-color-tertiary-container: #ffd8e4; --md-sys-color-on-tertiary-container: #31111d; --md-sys-color-surface: #fef7ff; --md-sys-color-on-surface: #1d1b20; --md-sys-color-on-surface-variant: #49454f; --md-sys-color-surface-container-lowest: #fff; --md-sys-color-surface-container-low: #f7f2fa; --md-sys-color-surface-container: #f3edf7; --md-sys-color-surface-container-high: #ece6f0; --md-sys-color-surface-container-highest: #e6e0e9; --md-sys-color-outline: #79747e; --md-sys-color-outline-variant: #cac4d0; --md-sys-color-error: #b3261e; --md-sys-color-error-container: #f9dedc; --md-sys-color-on-error-container: #410e0b; --md-sys-color-inverse-surface: #322f35; --md-sys-color-inverse-on-surface: #f5eff7; --md-sys-color-shadow: #000; --md-sys-color-scrim: #000; --source-green-container: #d5e8d4; --source-on-green-container: #284f34; --week-white: #fff; --on-week-white: #1d1b20; --week-green: #c8efb8; --md-sys-shape-corner-small: 8px; --md-sys-shape-corner-medium: 12px; --md-sys-shape-corner-large: 16px; --md-sys-shape-corner-large-increased: 20px; --md-sys-shape-corner-extra-large: 28px; --md-sys-shape-corner-extra-large-increased: 32px; --md-sys-shape-corner-full: 9999px; --md-ref-typeface-plain: "Roboto Flex", Roboto, system-ui, sans-serif; --md-sys-typescale-display-small-size: 2.25rem; --md-sys-typescale-headline-large-size: 2rem; --md-sys-typescale-headline-small-size: 1.5rem; --md-sys-typescale-title-large-size: 1.375rem; --md-sys-typescale-title-medium-size: 1.25rem; --md-sys-typescale-body-large-size: 1rem; --md-sys-typescale-body-medium-size: 0.875rem; --md-sys-typescale-label-large-size: 0.875rem; --md-sys-motion-easing-emphasized: cubic-bezier(0.2, 0, 0, 1); --md-sys-motion-easing-emphasized-decelerate: cubic-bezier(0.05, 0.7, 0.1, 1); --md-sys-motion-spring-fast-spatial: cubic-bezier(0.42, 1.67, 0.21, 0.9); --md-sys-motion-duration-short: 180ms; --md-sys-motion-duration-medium: 350ms; --md-sys-motion-duration-long: 450ms; --space-unit: 8px; font-family: var(--md-ref-typeface-plain); font-size: 16px; font-weight: 400; line-height: 1.5; color: var(--md-sys-color-on-surface); background: var(--md-sys-color-surface); font-synthesis: none; color-scheme: light; } * { box-sizing: border-box; } [hidden] { display: none !important; } body { margin: 0; background: var(--md-sys-color-surface); color: var(--md-sys-color-on-surface); } h1, h2, h3, h4, p { margin: 0; } button, input, select { font: inherit; color: inherit; } button, a, input, select { -webkit-tap-highlight-color: transparent; } button { border: 0; background: none; cursor: pointer; } button:disabled { opacity: 0.38; cursor: default; } button, a { touch-action: manipulation; } a { color: var(--md-sys-color-primary); text-underline-offset: 4px; } .icon { flex-shrink: 0; vertical-align: middle; fill: currentColor; } html { scrollbar-color: var(--md-sys-color-outline-variant) transparent; } button:focus-visible, a:focus-visible, input:focus-visible, select:focus-visible, summary:focus-visible { outline: 3px solid var(--md-sys-color-primary); outline-offset: 3px; } button:disabled:hover { filter: none; } input, select { min-width: 0; accent-color: var(--md-sys-color-primary); } input { caret-color: var(--md-sys-color-primary); } input::placeholder { color: var(--md-sys-color-on-surface-variant); opacity: 1; } ::selection { background: var(--md-sys-color-primary-container); color: var(--md-sys-color-on-primary-container); } button, a { transition: background-color var(--md-sys-motion-duration-short) var(--md-sys-motion-easing-emphasized), border-radius var(--md-sys-motion-duration-short) var(--md-sys-motion-easing-emphasized), color var(--md-sys-motion-duration-short) var(--md-sys-motion-easing-emphasized); } .skip-link { position: fixed; top: -80px; left: 16px; padding: 16px 24px; z-index: 10; background: var(--md-sys-color-primary); color: var(--md-sys-color-on-primary); border-radius: var(--md-sys-shape-corner-full); } .skip-link:focus { top: 16px; } .main { max-width: 1120px; margin: 0 auto; padding-bottom: 112px; min-height: 100dvh; } .app-bar { position: sticky; top: 0; z-index: 2; display: flex; align-items: center; justify-content: space-between; gap: 16px; min-height: 80px; padding: calc(8px + env(safe-area-inset-top)) 24px 8px; background: var(--md-sys-color-surface); transition: background-color var(--md-sys-motion-duration-medium) var(--md-sys-motion-easing-emphasized); } .app-bar.scrolled { background: var(--md-sys-color-surface-container); } .app-bar h1 { font-size: var(--md-sys-typescale-headline-small-size); font-weight: 550; line-height: 1.25; letter-spacing: 0; } .app-actions { display: flex; gap: 4px; } .icon-button { display: inline-flex; justify-content: center; align-items: center; flex-shrink: 0; min-width: 48px; width: 48px; height: 48px; border-radius: var(--md-sys-shape-corner-full); color: var(--md-sys-color-on-surface-variant); } .icon-button:hover:not(:disabled) { background: var(--md-sys-color-surface-container-high); } .icon-button:active:not(:disabled) { background: var(--md-sys-color-surface-container-highest); border-radius: var(--md-sys-shape-corner-large); } .main-content { padding: 0 24px 40px; max-width: 1000px; margin: 0 auto; } .group-selector { display: flex; align-items: center; justify-content: space-between; text-align: left; gap: 16px; width: 100%; padding: 24px 28px; background: var(--md-sys-color-primary-container); color: var(--md-sys-color-on-primary-container); border-radius: var(--md-sys-shape-corner-extra-large-increased); margin: 12px 0 32px; } .group-selector > span:first-child { min-width: 0; } .group-selector strong { display: block; font-size: var(--md-sys-typescale-display-small-size); font-weight: 650; line-height: 1.2; letter-spacing: -0.02em; } .group-context { font-size: var(--md-sys-typescale-body-large-size); display: block; margin-top: 8px; } .group-selector-arrow { display: grid; place-items: center; width: 56px; height: 56px; border-radius: var(--md-sys-shape-corner-full); background: color-mix( in srgb, var(--md-sys-color-on-primary-container) 8%, var(--md-sys-color-primary-container) ); flex-shrink: 0; } .group-selector:hover { background: color-mix( in srgb, var(--md-sys-color-primary) 8%, var(--md-sys-color-primary-container) ); } .group-selector:active { border-radius: var(--md-sys-shape-corner-large-increased); } .schedule-toolbar { display: flex; justify-content: space-between; align-items: center; gap: 12px; margin-bottom: 24px; } /* * M3 Expressive connected button group. Outer corners are a real half-height * radius, not 9999px: mixing 9999px with 8px on one edge makes the browser * scale every radius down until the 8px inner corners become square. */ .view-switch { --segment-round: 24px; --segment-inner: var(--md-sys-shape-corner-small); --segment-pressed: 4px; display: flex; gap: 2px; padding: 0; flex-shrink: 0; } .view-switch button { display: flex; align-items: center; justify-content: center; gap: 8px; padding: 12px 24px; min-height: 48px; font-size: var(--md-sys-typescale-body-large-size); font-weight: 550; border-radius: var(--segment-inner); background: var(--md-sys-color-secondary-container); color: var(--md-sys-color-on-secondary-container); min-width: 112px; transition: background-color var(--md-sys-motion-duration-short) var(--md-sys-motion-easing-emphasized), border-radius var(--md-sys-motion-duration-medium) var(--md-sys-motion-spring-fast-spatial); } .view-switch button:first-child { border-radius: var(--segment-round) var(--segment-inner) var(--segment-inner) var(--segment-round); } .view-switch button:last-child { border-radius: var(--segment-inner) var(--segment-round) var(--segment-round) var(--segment-inner); } /* The selected segment becomes a full pill. */ .view-switch button.selected { background: var(--md-sys-color-primary); color: var(--md-sys-color-on-primary); font-weight: 650; border-radius: var(--segment-round); } /* Pressing squeezes the inner corners of an unselected segment. */ .view-switch button:not(.selected):active:first-child { border-radius: var(--segment-round) var(--segment-pressed) var(--segment-pressed) var(--segment-round); } .view-switch button:not(.selected):active:last-child { border-radius: var(--segment-pressed) var(--segment-round) var(--segment-round) var(--segment-pressed); } .view-switch button:not(.selected):hover { background: color-mix( in srgb, var(--md-sys-color-on-secondary-container) 8%, var(--md-sys-color-secondary-container) ); } .variant-select { position: relative; display: flex; align-items: center; gap: 8px; color: var(--md-sys-color-on-surface-variant); border: 1px solid var(--md-sys-color-outline); border-radius: var(--md-sys-shape-corner-full); padding: 0 14px; min-height: 48px; flex: 0 1 auto; min-width: 0; max-width: 220px; } .variant-select select { appearance: none; background: transparent; border: 0; min-height: 46px; max-width: 155px; font-size: var(--md-sys-typescale-body-medium-size); font-weight: 500; color: var(--md-sys-color-on-surface); cursor: pointer; outline: 0; padding: 0 28px 0 4px; margin-right: -24px; } .variant-select > .icon:last-child { pointer-events: none; } .variant-select select option { background: var(--md-sys-color-surface-container); color: var(--md-sys-color-on-surface); } .variant-select:hover { background: var(--md-sys-color-surface-container-high); } .variant-select:focus-within { outline: 3px solid var(--md-sys-color-primary); outline-offset: 3px; } .day-strip { display: flex; gap: 8px; max-width: 100%; padding: 4px 0; margin: 0 0 28px; } .day-strip button { flex: 1 1 0; min-width: 0; min-height: 64px; border-radius: var(--md-sys-shape-corner-extra-large); background: var(--md-sys-color-surface-container); color: var(--md-sys-color-on-surface-variant); display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 8px; font-weight: 550; font-size: var(--md-sys-typescale-body-large-size); } .day-strip button:hover { background: var(--md-sys-color-surface-container-highest); } .day-strip button.today:not(.selected) { color: var(--md-sys-color-primary); box-shadow: inset 0 0 0 2px var(--md-sys-color-primary); } .day-strip button.selected { background: var(--md-sys-color-primary); color: var(--md-sys-color-on-primary); border-radius: var(--md-sys-shape-corner-large); font-weight: 700; transition: background-color var(--md-sys-motion-duration-short) var(--md-sys-motion-easing-emphasized), border-radius var(--md-sys-motion-duration-medium) var(--md-sys-motion-spring-fast-spatial), color var(--md-sys-motion-duration-short) var(--md-sys-motion-easing-emphasized); } .day-strip button:active { border-radius: var(--md-sys-shape-corner-medium); } .day-strip button:disabled { opacity: 0.38; } .day-strip.dated button { min-height: 76px; gap: 2px; } .day-number { font-size: var(--md-sys-typescale-title-medium-size); font-weight: 650; line-height: 1.2; font-variant-numeric: tabular-nums; } .day-strip.dated .day-dot { margin-top: 4px; } .week-switcher { display: flex; align-items: center; gap: 4px; margin: 0 -8px 16px; } .week-label { flex: 1; min-width: 0; display: flex; flex-wrap: wrap; align-items: center; gap: 2px 8px; padding: 0 4px; } .week-label small { flex-basis: 100%; } .week-chip { padding: 2px 10px; border-radius: var(--md-sys-shape-corner-small); font-size: var(--md-sys-typescale-label-large-size); font-weight: 600; line-height: 1.4; } .week-chip.white { background: var(--week-white); color: var(--on-week-white); box-shadow: inset 0 0 0 1px var(--md-sys-color-outline-variant); } .week-chip.green { background: var(--week-green); color: var(--source-on-green-container); } .week-label strong { font-size: var(--md-sys-typescale-title-medium-size); font-weight: 650; line-height: 1.3; } .week-label small { font-size: var(--md-sys-typescale-body-medium-size); color: var(--md-sys-color-on-surface-variant); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .swatch { display: inline-block; flex-shrink: 0; border-radius: var(--md-sys-shape-corner-full); } .swatch.white { background: var(--week-white); box-shadow: inset 0 0 0 1px var(--md-sys-color-outline); } .swatch.green { background: var(--week-green); box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--source-on-green-container) 40%, transparent); } .today-button { display: inline-flex; align-items: center; gap: 6px; min-height: 40px; padding: 0 16px 0 12px; border-radius: var(--md-sys-shape-corner-full); background: var(--md-sys-color-tertiary-container); color: var(--md-sys-color-on-tertiary-container); font-size: var(--md-sys-typescale-label-large-size); font-weight: 600; flex-shrink: 0; } .today-button:active { border-radius: var(--md-sys-shape-corner-medium); } .day-dot { height: 4px; width: 4px; border-radius: var(--md-sys-shape-corner-full); background: transparent; } .day-dot.has-lessons { background: currentColor; } .day-title { display: flex; align-items: center; justify-content: space-between; gap: 16px; margin-bottom: 16px; } .day-title h2, .week-day > h2 { font-size: var(--md-sys-typescale-headline-large-size); font-weight: 600; line-height: 1.25; letter-spacing: -0.02em; } .day-date { margin-top: 2px; font-size: var(--md-sys-typescale-body-large-size); color: var(--md-sys-color-on-surface-variant); } .week-day > h2 small { display: block; margin-top: 4px; font-size: var(--md-sys-typescale-body-large-size); font-weight: 400; letter-spacing: 0; color: var(--md-sys-color-on-surface-variant); } .day-actions { display: flex; gap: 0; flex-shrink: 0; } .search-bar { display: flex; align-items: center; gap: 16px; background: var(--md-sys-color-surface-container-high); color: var(--md-sys-color-on-surface-variant); min-height: 56px; border-radius: var(--md-sys-shape-corner-full); padding: 4px 20px; margin-bottom: 32px; } .search-bar:focus-within { outline: 2px solid var(--md-sys-color-primary); outline-offset: 2px; } .search-bar input { border: 0; outline: 0; flex: 1; width: 100%; background: none; min-height: 48px; font-size: var(--md-sys-typescale-body-large-size); } .search-bar .icon-button { margin-right: -12px; } .search-bar input::-webkit-search-cancel-button { display: none; } .lesson-list { display: grid; gap: 32px; } /* "Занятия в Полоцке": the day's town above its lessons, tonal like the update banners. */ .day-places { display: grid; gap: 12px; margin-bottom: 24px; padding: 16px 20px; border-radius: var(--md-sys-shape-corner-large-increased); background: var(--md-sys-color-tertiary-container); color: var(--md-sys-color-on-tertiary-container); } .day-places p { display: flex; align-items: center; gap: 16px; margin: 0; } .day-places span { display: flex; flex-direction: column; gap: 2px; min-width: 0; } .day-places strong { font-size: var(--md-sys-typescale-title-medium-size); font-weight: 600; line-height: 1.3; } .day-places small { font-size: var(--md-sys-typescale-body-medium-size); } .week-day > .day-places { margin-top: 16px; } .day-pane[data-slide] { animation: day-enter var(--md-sys-motion-duration-medium) var(--md-sys-motion-easing-emphasized-decelerate); } .day-pane[data-slide="prev"] { --day-enter-from: -40px; } @keyframes day-enter { from { transform: translateX(var(--day-enter-from, 40px)); opacity: 0.4; } } .time-slot { min-width: 0; display: grid; grid-template-columns: 116px minmax(0, 1fr); gap: 24px; align-items: start; } .slot-time { display: flex; flex-direction: column; gap: 4px; padding: 16px 0; color: var(--md-sys-color-on-surface); font-size: var(--md-sys-typescale-title-large-size); font-weight: 600; line-height: 1.25; font-variant-numeric: tabular-nums; } .slot-time > span { color: var(--md-sys-color-on-surface-variant); font-size: var(--md-sys-typescale-body-medium-size); font-weight: 450; line-height: 1.5; } .slot-pair { font-size: var(--md-sys-typescale-label-large-size); font-weight: 500; color: var(--md-sys-color-on-surface-variant); } .live-chip { align-self: flex-start; margin-top: 4px; padding: 4px 10px; border-radius: var(--md-sys-shape-corner-small); background: var(--md-sys-color-surface-container-high); color: var(--md-sys-color-on-surface); font-size: var(--md-sys-typescale-label-large-size); font-weight: 600; line-height: 1.4; white-space: nowrap; } .live-chip.on { background: var(--md-sys-color-primary); color: var(--md-sys-color-on-primary); } .time-slot.now .lesson-card { background: var(--md-sys-color-primary-container); color: var(--md-sys-color-on-primary-container); } .time-slot.now .lesson-meta, .time-slot.now .condition, .time-slot.now .lesson-chevron { color: color-mix( in srgb, var(--md-sys-color-on-primary-container) 80%, transparent ); } .time-slot.now .type-tag, .time-slot.now .variant-tag, .time-slot.now .shared-tag { background: var(--md-sys-color-surface-container-lowest); color: var(--md-sys-color-on-surface); } .time-slot.now .lesson-card:hover { background: color-mix( in srgb, var(--md-sys-color-on-primary-container) 8%, var(--md-sys-color-primary-container) ); } .slot-lessons { display: grid; gap: 4px; } .lesson-card { display: flex; align-items: center; text-align: left; gap: 16px; min-width: 0; width: 100%; padding: 24px; background: var(--md-sys-color-surface-container-low); color: var(--md-sys-color-on-surface); border-radius: var(--md-sys-shape-corner-small); } .lesson-card:first-child { border-start-start-radius: var(--md-sys-shape-corner-extra-large); border-start-end-radius: var(--md-sys-shape-corner-extra-large); } .lesson-card:last-child { border-end-start-radius: var(--md-sys-shape-corner-extra-large); border-end-end-radius: var(--md-sys-shape-corner-extra-large); } .lesson-card:hover { background: var(--md-sys-color-surface-container-high); } .lesson-card:active { background: var(--md-sys-color-surface-container-highest); } .lesson-body { display: flex; flex: 1; min-width: 0; flex-direction: column; gap: 12px; } .lesson-body > strong { font-size: var(--md-sys-typescale-title-medium-size); font-weight: 600; line-height: 1.4; text-wrap: pretty; overflow-wrap: anywhere; } .lesson-tags, .detail-tags { display: flex; align-items: center; flex-wrap: wrap; gap: 8px; } .type-tag, .variant-tag, .shared-tag { display: inline-flex; align-items: center; gap: 6px; padding: 4px 10px; font-size: var(--md-sys-typescale-label-large-size); line-height: 1.4; border-radius: var(--md-sys-shape-corner-small); font-weight: 500; } .type-tag.lecture { background: var(--md-sys-color-primary-container); color: var(--md-sys-color-on-primary-container); } .type-tag.practice { background: var(--md-sys-color-tertiary-container); color: var(--md-sys-color-on-tertiary-container); } .type-tag.lab, .variant-tag.lower { background: var(--source-green-container); color: var(--source-on-green-container); } .type-tag.other, .shared-tag { background: var(--md-sys-color-secondary-container); color: var(--md-sys-color-on-secondary-container); } .variant-tag.upper { background: var(--md-sys-color-surface-container-lowest); color: var(--md-sys-color-on-surface-variant); } .variant-tag > i { width: 8px; height: 8px; display: block; background: currentColor; border-radius: var(--md-sys-shape-corner-full); } .lesson-meta { display: flex; flex-wrap: wrap; gap: 8px 24px; font-size: var(--md-sys-typescale-body-large-size); color: var(--md-sys-color-on-surface-variant); } .lesson-meta > span { display: inline-flex; align-items: center; gap: 8px; min-width: 0; overflow-wrap: anywhere; } .condition { display: flex; align-items: flex-start; gap: 8px; color: var(--md-sys-color-on-surface-variant); font-size: var(--md-sys-typescale-body-medium-size); } .condition > .icon { margin-top: 2px; } .lesson-chevron { color: var(--md-sys-color-on-surface-variant); } .condition-raw { opacity: 0.8; white-space: nowrap; } .condition.unknown { color: var(--md-sys-color-error); } .lesson-card.muted { background: transparent; box-shadow: inset 0 0 0 1px var(--md-sys-color-outline-variant); } .lesson-card.muted .lesson-body > strong, .lesson-card.muted .lesson-meta { color: var(--md-sys-color-on-surface-variant); } .lesson-card.muted .type-tag { background: var(--md-sys-color-surface-container-high); color: var(--md-sys-color-on-surface-variant); } .other-weeks { margin-top: 32px; } .other-weeks > summary { display: flex; align-items: center; justify-content: space-between; gap: 12px; min-height: 56px; padding: 8px 16px 8px 20px; border-radius: var(--md-sys-shape-corner-full); background: var(--md-sys-color-surface-container); color: var(--md-sys-color-on-surface-variant); font-weight: 500; cursor: pointer; list-style: none; transition: background-color var(--md-sys-motion-duration-short) var(--md-sys-motion-easing-emphasized), border-radius var(--md-sys-motion-duration-medium) var(--md-sys-motion-easing-emphasized); } .other-weeks > summary::-webkit-details-marker { display: none; } .other-weeks > summary:hover { background: var(--md-sys-color-surface-container-high); } .other-weeks > summary > .icon { transition: transform var(--md-sys-motion-duration-medium) var(--md-sys-motion-easing-emphasized); } .other-weeks[open] > summary { border-radius: var(--md-sys-shape-corner-large); margin-bottom: 24px; } .other-weeks[open] > summary > .icon { transform: rotate(180deg); } .empty-state + .other-weeks { margin-top: 0; } .week-list { display: grid; gap: 48px; } .week-day > h2 { margin: 0 0 24px; } .navigation-rail { display: none; } .navigation-bar { position: fixed; bottom: 0; inset-inline: 0; z-index: 3; display: flex; justify-content: center; gap: 8px; padding: 12px 12px calc(12px + env(safe-area-inset-bottom)); background: var(--md-sys-color-surface-container); color: var(--md-sys-color-on-surface-variant); } .navigation-bar button, .navigation-rail button { flex: 1; display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 6px; min-height: 56px; font-size: var(--md-sys-typescale-label-large-size); font-weight: 500; border-radius: var(--md-sys-shape-corner-large); color: var(--md-sys-color-on-surface-variant); } .nav-indicator { width: 64px; min-height: 32px; border-radius: var(--md-sys-shape-corner-full); display: grid; place-items: center; transition: background-color var(--md-sys-motion-duration-short), border-radius var(--md-sys-motion-duration-short); } .active > .nav-indicator { background: var(--md-sys-color-secondary-container); color: var(--md-sys-color-on-secondary-container); } .navigation-bar button.active, .navigation-rail button.active { font-weight: 700; color: var(--md-sys-color-on-surface); } .navigation-bar button:hover .nav-indicator, .navigation-rail button:hover .nav-indicator { background: var(--md-sys-color-surface-container-highest); } .navigation-bar button:active .nav-indicator, .navigation-rail button:active .nav-indicator { border-radius: var(--md-sys-shape-corner-medium); } .primary, .secondary { min-height: 48px; border-radius: var(--md-sys-shape-corner-full); padding: 12px 24px; display: inline-flex; justify-content: center; align-items: center; gap: 10px; font-size: var(--md-sys-typescale-body-large-size); font-weight: 550; text-decoration: none; } .primary { background: var(--md-sys-color-primary); color: var(--md-sys-color-on-primary); } .primary:hover { background: color-mix( in srgb, var(--md-sys-color-primary) 90%, var(--md-sys-color-on-primary) ); } .secondary { background: var(--md-sys-color-secondary-container); color: var(--md-sys-color-on-secondary-container); } .secondary:hover { background: var(--md-sys-color-surface-container-highest); } .primary:active, .secondary:active { border-radius: var(--md-sys-shape-corner-large); } .text-link { display: inline-flex; align-items: center; gap: 8px; font-size: var(--md-sys-typescale-body-large-size); font-weight: 500; min-height: 48px; padding: 8px 0; color: var(--md-sys-color-primary); } .empty-state { display: flex; flex-direction: column; align-items: center; text-align: center; gap: 16px; padding: 48px 16px; color: var(--md-sys-color-on-surface-variant); } .empty-state h3 { font-size: var(--md-sys-typescale-headline-small-size); font-weight: 550; color: var(--md-sys-color-on-surface); } .empty-state p { font-size: var(--md-sys-typescale-body-large-size); max-width: 42ch; line-height: 1.6; } .empty-state .primary, .empty-state .secondary { margin-top: 8px; } .status-message { display: flex; align-items: flex-start; gap: 12px; padding: 16px; background: var(--md-sys-color-secondary-container); color: var(--md-sys-color-on-secondary-container); border-radius: var(--md-sys-shape-corner-large); font-size: var(--md-sys-typescale-body-medium-size); margin: 0 0 24px; } .status-message > .icon { margin-top: 1px; } .update-banner { display: grid; grid-template-columns: auto minmax(0, 1fr) auto; align-items: center; gap: 16px; padding: 16px 12px 16px 16px; margin: 0 0 24px; border-radius: var(--md-sys-shape-corner-extra-large); background: var(--md-sys-color-tertiary-container); color: var(--md-sys-color-on-tertiary-container); } .update-icon { display: grid; place-items: center; width: 48px; height: 48px; border-radius: var(--md-sys-shape-corner-large); background: var(--md-sys-color-tertiary); color: var(--md-sys-color-on-tertiary); } .update-text { display: flex; flex-direction: column; gap: 4px; min-width: 0; } .update-text strong { font-size: var(--md-sys-typescale-title-medium-size); font-weight: 600; line-height: 1.3; } .update-text span { font-size: var(--md-sys-typescale-body-medium-size); overflow-wrap: anywhere; } .update-actions { display: flex; align-items: center; gap: 4px; } .update-actions .primary { background: var(--md-sys-color-tertiary); color: var(--md-sys-color-on-tertiary); } .update-actions .icon-button { color: var(--md-sys-color-on-tertiary-container); } .changes-banner { background: var(--md-sys-color-secondary-container); color: var(--md-sys-color-on-secondary-container); } .changes-banner .update-icon, .changes-banner .update-actions .primary { background: var(--md-sys-color-secondary); color: var(--md-sys-color-on-secondary); } .changes-banner .update-actions .icon-button { color: var(--md-sys-color-on-secondary-container); } .hidden-tag { display: inline-flex; align-items: center; gap: 4px; padding: 4px 10px; border-radius: var(--md-sys-shape-corner-small); background: var(--md-sys-color-surface-container-highest); color: var(--md-sys-color-on-surface-variant); font-size: var(--md-sys-typescale-label-large-size); font-weight: 500; line-height: 1.4; } .hidden-toggle { display: flex; align-items: center; gap: 8px; min-height: 48px; margin: 24px auto 0; padding: 8px 20px; border-radius: var(--md-sys-shape-corner-full); color: var(--md-sys-color-on-surface-variant); font-size: var(--md-sys-typescale-body-medium-size); font-weight: 500; } .hidden-toggle:hover { background: var(--md-sys-color-surface-container-high); } .menu-list small { display: block; margin-top: 2px; font-size: var(--md-sys-typescale-body-medium-size); color: var(--md-sys-color-on-surface-variant); } .changes section + section { margin-top: 28px; } .changes h3 { font-size: var(--md-sys-typescale-title-medium-size); font-weight: 600; margin-bottom: 12px; } .changes ul { list-style: none; margin: 0; padding: 0; display: grid; gap: 4px; } .change { display: flex; flex-direction: column; gap: 4px; padding: 16px; border-radius: var(--md-sys-shape-corner-small); background: var(--md-sys-color-surface-container); } .changes ul > .change:first-child { border-start-start-radius: var(--md-sys-shape-corner-large); border-start-end-radius: var(--md-sys-shape-corner-large); } .changes ul > .change:last-child { border-end-start-radius: var(--md-sys-shape-corner-large); border-end-end-radius: var(--md-sys-shape-corner-large); } .change small { font-size: var(--md-sys-typescale-body-medium-size); color: var(--md-sys-color-on-surface-variant); } .change b { font-size: var(--md-sys-typescale-body-large-size); font-weight: 600; overflow-wrap: anywhere; } .change-field { display: flex; flex-wrap: wrap; align-items: center; gap: 4px 6px; font-size: var(--md-sys-typescale-body-medium-size); color: var(--md-sys-color-on-surface-variant); } .change-field del { color: var(--md-sys-color-on-surface-variant); } .change-field ins { text-decoration: none; font-weight: 600; color: var(--md-sys-color-on-surface); } .change.removed b { text-decoration: line-through; color: var(--md-sys-color-on-surface-variant); } .change.added { background: color-mix( in srgb, var(--source-green-container) 70%, var(--md-sys-color-surface-container) ); } .share { display: flex; flex-direction: column; align-items: stretch; } .qr { display: block; width: min(240px, 70vw); height: auto; margin: 0 auto 24px; border-radius: var(--md-sys-shape-corner-large); } .share-link { display: flex; align-items: center; gap: 12px; min-height: 56px; padding: 4px 16px; border-radius: var(--md-sys-shape-corner-full); background: var(--md-sys-color-surface-container-lowest); color: var(--md-sys-color-on-surface-variant); } .share-link:focus-within { outline: 2px solid var(--md-sys-color-primary); outline-offset: 2px; } .share-link input { flex: 1; min-width: 0; border: 0; outline: 0; background: none; font-size: var(--md-sys-typescale-body-medium-size); color: var(--md-sys-color-on-surface); text-overflow: ellipsis; } .share-actions, .detail-actions { display: flex; gap: 8px; margin-top: 24px; } .share-actions > *, .detail-actions > * { flex: 1; } /* Groups */ #modal-heading:focus { outline: none; } .groups-hero { margin: 8px 0 24px; } .groups-hero h2 { font-size: var(--md-sys-typescale-headline-large-size); font-weight: 650; line-height: 1.2; letter-spacing: -0.02em; } .groups-hero p { margin-top: 8px; font-size: var(--md-sys-typescale-body-large-size); color: var(--md-sys-color-on-surface-variant); } .groups-screen .search-bar { margin-bottom: 24px; } .current-group { display: grid; gap: 16px; padding: 20px; margin-bottom: 28px; border-radius: var(--md-sys-shape-corner-extra-large); background: var(--md-sys-color-primary-container); color: var(--md-sys-color-on-primary-container); } .current-head { display: flex; align-items: center; gap: 16px; } .current-head .menu-icon { width: 48px; height: 48px; background: var(--md-sys-color-primary); color: var(--md-sys-color-on-primary); } .current-head > div { display: flex; flex-direction: column; min-width: 0; } .current-head small, .current-head span { font-size: var(--md-sys-typescale-body-medium-size); } .current-head strong { font-size: var(--md-sys-typescale-headline-small-size); font-weight: 650; line-height: 1.25; } .chip-row { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; } .chip-row + .chip-row { margin-top: 12px; } .chip-row > span { width: 100%; font-size: var(--md-sys-typescale-body-medium-size); color: inherit; opacity: 0.85; } .filter-chip { display: inline-flex; align-items: center; gap: 6px; min-height: 40px; padding: 6px 16px; border-radius: var(--md-sys-shape-corner-small); box-shadow: inset 0 0 0 1px var(--md-sys-color-outline); color: var(--md-sys-color-on-surface-variant); font-size: var(--md-sys-typescale-label-large-size); font-weight: 550; } .current-group .filter-chip { color: var(--md-sys-color-on-primary-container); box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--md-sys-color-on-primary-container) 45%, transparent); } .filter-chip:hover { background: color-mix(in srgb, currentColor 8%, transparent); } .filter-chip.selected { padding-left: 10px; box-shadow: none; background: var(--md-sys-color-secondary-container); color: var(--md-sys-color-on-secondary-container); } .current-group .filter-chip.selected { background: var(--md-sys-color-primary); color: var(--md-sys-color-on-primary); } .recent-chips { display: flex; gap: 8px; overflow-x: auto; padding-bottom: 4px; margin: 0 -16px; padding-inline: 16px; scrollbar-width: none; } .recent-chips > button { display: flex; flex-direction: column; align-items: flex-start; flex-shrink: 0; gap: 2px; min-height: 64px; padding: 10px 16px; text-align: left; border-radius: var(--md-sys-shape-corner-large); background: var(--md-sys-color-surface-container); } .recent-chips > button:hover { background: var(--md-sys-color-surface-container-high); } .recent-chips b { font-size: var(--md-sys-typescale-title-medium-size); } .recent-chips small { font-size: var(--md-sys-typescale-body-medium-size); color: var(--md-sys-color-on-surface-variant); white-space: nowrap; } .catalog-browse .chip-row { margin-bottom: 12px; } .catalog-browse .result-list { margin-top: 16px; } .result-list b { font-weight: 600; } .result-list > button:disabled { opacity: 1; } .result-list > button:disabled:not([aria-busy="true"]) { opacity: 0.6; } .empty-state.compact { padding: 8px 0; align-items: flex-start; text-align: left; } .groups-footer { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 4px 16px; margin-top: 8px; padding-top: 16px; border-top: 1px solid var(--md-sys-color-outline-variant); font-size: var(--md-sys-typescale-body-medium-size); color: var(--md-sys-color-on-surface-variant); } /* University search */ .search-tabs { margin-bottom: 24px; } .search-tabs button { flex: 1 1 auto; } .search-screen .search-bar { margin-bottom: 24px; } .result-group { margin-bottom: 28px; } .result-group > h3 { font-size: var(--md-sys-typescale-title-medium-size); font-weight: 600; margin-bottom: 12px; } .result-list { display: grid; gap: 4px; } .result-list > button { display: flex; align-items: center; gap: 16px; min-height: 64px; padding: 12px 16px; text-align: left; border-radius: var(--md-sys-shape-corner-small); background: var(--md-sys-color-surface-container-low); font-size: var(--md-sys-typescale-body-large-size); } .result-list > button:first-child { border-start-start-radius: var(--md-sys-shape-corner-large); border-start-end-radius: var(--md-sys-shape-corner-large); } .result-list > button:last-child { border-end-start-radius: var(--md-sys-shape-corner-large); border-end-end-radius: var(--md-sys-shape-corner-large); } .result-list > button:hover { background: var(--md-sys-color-surface-container-high); } .result-list > button > span:nth-child(2) { flex: 1; min-width: 0; } .result-list small, .target-header small { display: block; margin-top: 2px; font-size: var(--md-sys-typescale-body-medium-size); color: var(--md-sys-color-on-surface-variant); } .result-list > button > .icon:last-child { color: var(--md-sys-color-on-surface-variant); } .room-chips { display: flex; flex-wrap: wrap; gap: 8px; } .room-chips > button { display: inline-flex; align-items: center; gap: 6px; min-height: 48px; min-width: 64px; justify-content: center; padding: 8px 16px; border-radius: var(--md-sys-shape-corner-medium); background: var(--md-sys-color-secondary-container); color: var(--md-sys-color-on-secondary-container); font-size: var(--md-sys-typescale-body-large-size); font-weight: 550; font-variant-numeric: tabular-nums; } .room-chips > button:hover { background: color-mix( in srgb, var(--md-sys-color-on-secondary-container) 8%, var(--md-sys-color-secondary-container) ); } .room-chips > button:active { border-radius: var(--md-sys-shape-corner-full); } .target-header { display: flex; align-items: center; gap: 12px; margin: 0 0 20px -12px; } .target-header h2 { font-size: var(--md-sys-typescale-headline-small-size); font-weight: 600; line-height: 1.25; } .target-header > div { min-width: 0; } .search-days .week-switcher { margin-bottom: 12px; } .search-days .day-strip { margin-bottom: 24px; } .search-date { font-size: var(--md-sys-typescale-title-large-size); font-weight: 600; margin-bottom: 16px; } .directory-card { cursor: default; } .directory-card:hover { background: var(--md-sys-color-surface-container-low); } .pair-picker { display: grid; grid-template-columns: repeat(8, minmax(0, 1fr)); gap: 4px; margin-bottom: 24px; } .pair-picker > button { display: flex; flex-direction: column; align-items: center; gap: 2px; min-height: 56px; min-width: 0; padding: 6px 2px; border-radius: var(--md-sys-shape-corner-large); background: var(--md-sys-color-surface-container); color: var(--md-sys-color-on-surface-variant); font-variant-numeric: tabular-nums; } .pair-picker > button b { font-size: var(--md-sys-typescale-title-medium-size); line-height: 1.2; } .pair-picker > button small { font-size: 0.75rem; } .pair-picker > button.selected { background: var(--md-sys-color-primary); color: var(--md-sys-color-on-primary); border-radius: var(--md-sys-shape-corner-medium); } .free-summary { font-size: var(--md-sys-typescale-body-large-size); color: var(--md-sys-color-on-surface-variant); margin-bottom: 24px; } .free-summary strong { color: var(--md-sys-color-on-surface); } .maybe-list { list-style: none; margin: 0; padding: 0; display: grid; gap: 12px; } .maybe-list li { display: flex; flex-direction: column; gap: 2px; font-size: var(--md-sys-typescale-body-medium-size); color: var(--md-sys-color-on-surface-variant); } .maybe-list b { font-size: var(--md-sys-typescale-body-large-size); color: var(--md-sys-color-on-surface); } .coverage-note { margin-top: 24px; font-size: var(--md-sys-typescale-body-medium-size); line-height: 1.6; color: var(--md-sys-color-on-surface-variant); } /* Session */ .exam-card { display: flex; align-items: center; gap: 16px; width: 100%; margin: 0 0 24px; padding: 16px 12px 16px 16px; text-align: left; border-radius: var(--md-sys-shape-corner-extra-large); background: var(--md-sys-color-tertiary-container); color: var(--md-sys-color-on-tertiary-container); } .exam-card:hover { background: color-mix( in srgb, var(--md-sys-color-on-tertiary-container) 8%, var(--md-sys-color-tertiary-container) ); } .exam-card:active { border-radius: var(--md-sys-shape-corner-large-increased); } .exam-countdown { display: flex; flex-direction: column; align-items: center; justify-content: center; flex-shrink: 0; width: 72px; height: 72px; border-radius: var(--md-sys-shape-corner-large-increased); background: var(--md-sys-color-tertiary); color: var(--md-sys-color-on-tertiary); font-variant-numeric: tabular-nums; } .exam-countdown b { font-size: var(--md-sys-typescale-headline-large-size); font-weight: 700; line-height: 1; } .exam-countdown b.exam-soon { font-size: var(--md-sys-typescale-body-large-size); } .exam-countdown small { font-size: var(--md-sys-typescale-label-large-size); } .exam-text { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 2px; } .exam-text small, .exam-text > span { font-size: var(--md-sys-typescale-body-medium-size); } .exam-text strong { font-size: var(--md-sys-typescale-title-medium-size); font-weight: 600; line-height: 1.3; overflow-wrap: anywhere; } .exam-more { display: flex; flex-direction: column; align-items: center; gap: 2px; flex-shrink: 0; } .exam-more small { font-size: var(--md-sys-typescale-label-large-size); white-space: nowrap; } .exams ul { list-style: none; margin: 0; padding: 0; display: grid; gap: 4px; } .exam-item { display: flex; align-items: flex-start; gap: 12px; padding: 16px; border-radius: var(--md-sys-shape-corner-small); background: var(--md-sys-color-surface-container); } .exams ul > .exam-item:first-child { border-start-start-radius: var(--md-sys-shape-corner-large); border-start-end-radius: var(--md-sys-shape-corner-large); } .exams ul > .exam-item:last-child { border-end-start-radius: var(--md-sys-shape-corner-large); border-end-end-radius: var(--md-sys-shape-corner-large); } .exam-chip { flex-shrink: 0; min-width: 88px; padding: 6px 10px; border-radius: var(--md-sys-shape-corner-small); background: var(--md-sys-color-surface-container-highest); font-size: var(--md-sys-typescale-label-large-size); font-weight: 600; text-align: center; } .exam-chip.soon { background: var(--md-sys-color-tertiary); color: var(--md-sys-color-on-tertiary); } .exam-body { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 8px; } .exam-body strong { font-size: var(--md-sys-typescale-body-large-size); font-weight: 600; overflow-wrap: anywhere; } .exam-source, .exam-item.past small { font-size: var(--md-sys-typescale-body-medium-size); color: var(--md-sys-color-on-surface-variant); } .exam-item.past { opacity: 0.7; } .exams .other-weeks { margin-top: 24px; } .status-message.error, .inline-error { background: var(--md-sys-color-error-container); color: var(--md-sys-color-on-error-container); } .status-message button { font-weight: 600; min-height: 48px; align-self: center; white-space: nowrap; margin: -12px -8px -12px auto; padding: 8px; } .schedule-skeleton { display: grid; gap: 24px; } .schedule-skeleton > span { height: 152px; background: var(--md-sys-color-surface-container); border-radius: var(--md-sys-shape-corner-extra-large); animation: skeleton-pulse 1.5s ease-in-out infinite alternate; } .schedule-skeleton > span:nth-child(2) { height: 192px; } .spin { animation: spin 1s linear infinite; } @keyframes spin { to { transform: rotate(360deg); } } @keyframes skeleton-pulse { to { background: var(--md-sys-color-surface-container-highest); } } .modal { max-width: 680px; width: calc(100% - 48px); max-height: 88dvh; overflow: auto; padding: 24px; border: 0; border-radius: var(--md-sys-shape-corner-extra-large); background: var(--md-sys-color-surface-container-high); color: var(--md-sys-color-on-surface); box-shadow: 0 8px 32px color-mix(in srgb, var(--md-sys-color-shadow) 20%, transparent); } .modal::backdrop { background: color-mix(in srgb, var(--md-sys-color-scrim) 40%, transparent); } .modal[open] { animation: dialog-enter var(--md-sys-motion-duration-medium) var(--md-sys-motion-easing-emphasized-decelerate); } .modal[open]::backdrop { animation: scrim-enter var(--md-sys-motion-duration-medium) linear; } @keyframes dialog-enter { from { transform: scale(0.94); opacity: 0; } } @keyframes scrim-enter { from { opacity: 0; } } .sheet-handle { display: none; } .modal-header { display: flex; align-items: center; justify-content: space-between; gap: 16px; margin-bottom: 24px; } .modal-header h2 { font-size: var(--md-sys-typescale-headline-small-size); font-weight: 550; line-height: 1.3; } .modal-intro { font-size: var(--md-sys-typescale-body-large-size); color: var(--md-sys-color-on-surface-variant); margin-bottom: 24px; line-height: 1.6; } .import-preview label { position: relative; display: flex; flex-direction: column; gap: 8px; font-size: var(--md-sys-typescale-body-medium-size); color: var(--md-sys-color-on-surface-variant); } .import-preview select { appearance: none; border: 1px solid var(--md-sys-color-outline); border-radius: var(--md-sys-shape-corner-small); min-height: 56px; width: 100%; background: transparent; padding: 12px 48px 12px 16px; font-size: var(--md-sys-typescale-body-large-size); color: var(--md-sys-color-on-surface); cursor: pointer; text-overflow: ellipsis; } .import-preview select:hover { border-color: var(--md-sys-color-on-surface); } .import-preview select:focus-visible { outline: 0; border-color: var(--md-sys-color-primary); box-shadow: inset 0 0 0 1px var(--md-sys-color-primary); } .import-preview select option { background: var(--md-sys-color-surface-container-high); color: var(--md-sys-color-on-surface); } .import-preview label > .icon { position: absolute; right: 12px; bottom: 16px; pointer-events: none; color: var(--md-sys-color-on-surface-variant); } .menu-list { display: grid; gap: 4px; } .menu-list > button, .menu-list > a { display: flex; align-items: center; gap: 16px; min-height: 72px; padding: 16px; border-radius: var(--md-sys-shape-corner-large); background: var(--md-sys-color-surface-container); text-align: left; text-decoration: none; color: var(--md-sys-color-on-surface); font-size: var(--md-sys-typescale-body-large-size); } .menu-list > button > span, .menu-list > a > span { flex: 1; } .menu-list > button > .menu-icon, .menu-list > a > .menu-icon { flex: 0 0 40px; } .menu-list > button:hover, .menu-list > a:hover { background: var(--md-sys-color-surface-container-highest); } .menu-list > button > .icon, .menu-list > a > .icon { color: var(--md-sys-color-on-surface-variant); } .theme-row { display: grid; grid-template-columns: minmax(0, 1fr); gap: 12px; padding: 16px; margin-bottom: 8px; border-radius: var(--md-sys-shape-corner-large); background: var(--md-sys-color-surface-container); } .theme-row > span { font-size: var(--md-sys-typescale-body-medium-size); color: var(--md-sys-color-on-surface-variant); } .theme-switch { width: 100%; } .view-switch.theme-switch button { flex: 1 1 0; min-width: 0; padding-inline: 8px; gap: 6px; font-size: var(--md-sys-typescale-label-large-size); } .menu-icon { display: grid; place-items: center; width: 40px; height: 40px; flex-shrink: 0; border-radius: var(--md-sys-shape-corner-full); background: var(--md-sys-color-secondary-container); color: var(--md-sys-color-on-secondary-container); } .upload-zone { display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 16px; width: 100%; min-height: 216px; background: var(--md-sys-color-surface-container); border: 2px dashed var(--md-sys-color-outline); border-radius: var(--md-sys-shape-corner-extra-large); padding: 24px; color: var(--md-sys-color-primary); text-align: center; } .upload-zone b { font-size: var(--md-sys-typescale-title-medium-size); font-weight: 550; color: var(--md-sys-color-on-surface); } .upload-zone small { font-size: var(--md-sys-typescale-body-medium-size); color: var(--md-sys-color-on-surface-variant); } .privacy-note, .parser-note { font-size: var(--md-sys-typescale-body-medium-size); color: var(--md-sys-color-on-surface-variant); line-height: 1.6; margin-top: 20px; } .inline-error { font-size: var(--md-sys-typescale-body-large-size); padding: 16px; border-radius: var(--md-sys-shape-corner-medium); margin: 16px 0; } .import-preview { margin-top: 32px; } .import-success { display: flex; align-items: center; gap: 10px; font-size: var(--md-sys-typescale-body-large-size); background: var(--source-green-container); color: var(--source-on-green-container); border-radius: var(--md-sys-shape-corner-medium); padding: 16px; margin-bottom: 24px; } .import-preview > p { font-size: var(--md-sys-typescale-body-large-size); margin: 24px 0 16px; } .preview-line { display: flex; flex-direction: column; gap: 8px; padding: 16px 0; border-bottom: 1px solid var(--md-sys-color-outline-variant); } .preview-line small, .preview-line span { font-size: var(--md-sys-typescale-body-medium-size); color: var(--md-sys-color-on-surface-variant); } .preview-line b { font-size: var(--md-sys-typescale-body-large-size); font-weight: 550; } .import-preview > .primary { margin-top: 24px; width: 100%; } .lesson-details h3 { font-size: var(--md-sys-typescale-headline-small-size); font-weight: 550; line-height: 1.4; margin: 20px 0 24px; overflow-wrap: anywhere; } .detail-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 24px; } .detail-grid > span { display: grid; grid-template-columns: 24px minmax(0, 1fr); gap: 4px 12px; } .detail-grid .icon { grid-row: span 2; color: var(--md-sys-color-on-surface-variant); margin-top: 2px; } .detail-grid small { font-size: var(--md-sys-typescale-body-medium-size); color: var(--md-sys-color-on-surface-variant); } .detail-grid b { font-size: var(--md-sys-typescale-body-large-size); font-weight: 500; overflow-wrap: anywhere; } .detail-halves { grid-column: 2; } .detail-weeks { margin-top: 28px; } .detail-weeks h4 { margin-top: 0; } .detail-status { font-size: var(--md-sys-typescale-body-large-size); margin-bottom: 16px; } .week-grid { list-style: none; margin: 0; padding: 0; display: grid; grid-template-columns: repeat(9, minmax(0, 1fr)); gap: 6px; } .week-grid li { display: grid; place-items: center; aspect-ratio: 1; min-height: 32px; border-radius: var(--md-sys-shape-corner-medium); font-size: var(--md-sys-typescale-label-large-size); font-weight: 500; font-variant-numeric: tabular-nums; color: var(--md-sys-color-on-surface-variant); } .week-grid li.white { background: var(--week-white); color: var(--on-week-white); box-shadow: inset 0 0 0 1px var(--md-sys-color-outline-variant); } .week-grid li.green { background: var(--week-green); color: var(--source-on-green-container); } .week-grid li.on { background: var(--md-sys-color-primary); color: var(--md-sys-color-on-primary); box-shadow: none; font-weight: 700; border-radius: var(--md-sys-shape-corner-full); } .week-grid li.past { opacity: 0.5; } .week-grid li.current { outline: 2px solid var(--md-sys-color-on-surface); outline-offset: 2px; opacity: 1; } .week-legend { display: flex; flex-wrap: wrap; gap: 8px 16px; margin-top: 12px; font-size: var(--md-sys-typescale-body-medium-size); color: var(--md-sys-color-on-surface-variant); } .week-legend > span { display: inline-flex; align-items: center; gap: 6px; } .swatch { width: 12px; height: 12px; } .swatch.on { background: var(--md-sys-color-primary); } .swatch.current { box-shadow: inset 0 0 0 2px var(--md-sys-color-on-surface); } .detail-condition.unknown { background: var(--md-sys-color-error-container); color: var(--md-sys-color-on-error-container); align-items: flex-start; } .bells { width: 100%; margin-top: 12px; border-collapse: collapse; font-size: var(--md-sys-typescale-body-large-size); font-variant-numeric: tabular-nums; } .bells th, .bells td { padding: 10px 8px; border-bottom: 1px solid var(--md-sys-color-outline-variant); text-align: left; } .bells th { font-weight: 550; white-space: nowrap; padding-left: 0; } .bells td { color: var(--md-sys-color-on-surface-variant); } .detail-condition { display: flex; gap: 12px; align-items: center; background: var(--md-sys-color-primary-container); color: var(--md-sys-color-on-primary-container); padding: 16px; border-radius: var(--md-sys-shape-corner-large); margin: 24px 0; font-size: var(--md-sys-typescale-body-large-size); } .lesson-details h4 { font-size: var(--md-sys-typescale-body-medium-size); font-weight: 550; margin: 24px 0 12px; } .lesson-details blockquote { white-space: pre-wrap; padding: 20px; margin: 0; background: var(--md-sys-color-surface-container); border-radius: var(--md-sys-shape-corner-large); font-size: var(--md-sys-typescale-body-large-size); line-height: 1.6; } .detail-original { margin-top: 16px; } .install-help > p { font-size: var(--md-sys-typescale-body-large-size); line-height: 1.6; } .install-help ol { padding-left: 24px; margin: 24px 0; } .install-help li { padding: 8px 0 8px 8px; } .install-help li > b { display: block; font-size: var(--md-sys-typescale-body-large-size); font-weight: 550; margin-bottom: 8px; } .install-help li > span { font-size: var(--md-sys-typescale-body-large-size); color: var(--md-sys-color-on-surface-variant); } .install-help .privacy-note { font-size: var(--md-sys-typescale-body-medium-size); } .install-help > .primary { margin-top: 24px; width: 100%; } .about-schedule p { font-size: var(--md-sys-typescale-body-large-size); line-height: 1.6; color: var(--md-sys-color-on-surface-variant); margin-top: 16px; white-space: pre-wrap; } .about-schedule h3 { font-size: var(--md-sys-typescale-title-large-size); font-weight: 550; margin-top: 32px; } .document-name { display: flex; gap: 16px; align-items: center; overflow-wrap: anywhere; font-size: var(--md-sys-typescale-title-medium-size); } .document-name .icon { color: var(--md-sys-color-primary); } .document-name strong { font-weight: 550; min-width: 0; } .source-facts { display: grid; gap: 20px; margin: 24px 0; } .source-facts > div { display: grid; grid-template-columns: 132px minmax(0, 1fr); gap: 16px; } .source-facts dt { font-size: var(--md-sys-typescale-body-medium-size); color: var(--md-sys-color-on-surface-variant); } .source-facts dd { font-size: var(--md-sys-typescale-body-large-size); margin: 0; overflow-wrap: anywhere; } @media (min-width: 600px) { .main { margin-left: 88px; max-width: none; padding-bottom: 0; } .app-bar { min-height: 88px; padding-inline: max(40px, calc((100% - 920px) / 2)); } .main-content { padding-inline: 40px; } .navigation-bar { display: none; } .navigation-rail { display: flex; flex-direction: column; align-items: center; gap: 12px; width: 88px; position: fixed; inset: 0 auto 0 0; padding: 32px 0; background: var(--md-sys-color-surface-container); z-index: 3; } .navigation-rail button { flex: 0 0 auto; width: 88px; min-height: 80px; font-size: var(--md-sys-typescale-body-medium-size); } .menu-trigger { display: none; } } @media (min-width: 1200px) { .main { margin-left: 112px; } .navigation-rail { width: 112px; } .navigation-rail button { width: 104px; } .main-content { padding-top: 8px; } .app-bar { padding-top: 16px; } .group-selector { margin-top: 16px; } } @media (max-width: 599px) { .app-bar { min-height: 64px; padding: calc(4px + env(safe-area-inset-top)) 4px 4px 16px; } .app-bar h1 { font-size: var(--md-sys-typescale-title-large-size); } .main-content { padding: 0 16px 24px; } .group-selector { padding: 20px 24px; margin: 8px 0 24px; } .group-selector strong { font-size: var(--md-sys-typescale-headline-large-size); } .group-context { font-size: var(--md-sys-typescale-body-medium-size); margin-top: 4px; } .group-selector-arrow { width: 48px; height: 48px; } .schedule-toolbar { gap: 8px; margin-bottom: 16px; } .view-switch button { min-width: 80px; padding: 12px 16px; font-size: var(--md-sys-typescale-body-medium-size); gap: 6px; } .variant-select { gap: 4px; padding-inline: 14px 12px; } .variant-select > .icon:first-child { display: none; } .variant-select select { max-width: none; width: 100%; font-size: var(--md-sys-typescale-body-medium-size); text-overflow: ellipsis; } .variant-select select { padding-right: 24px; } .day-strip { gap: 4px; margin-bottom: 20px; } .day-strip button { min-height: 56px; font-size: var(--md-sys-typescale-body-medium-size); gap: 6px; border-radius: var(--md-sys-shape-corner-large-increased); } .day-strip button.selected { border-radius: var(--md-sys-shape-corner-medium); } .day-strip.dated button { min-height: 68px; } .day-number { font-size: var(--md-sys-typescale-body-large-size); } .week-switcher { margin-inline: -12px; margin-bottom: 12px; } .today-button { padding: 0 12px; } .today-button > .icon { display: none; } .slot-pair { margin-left: auto; } .slot-time { flex-wrap: wrap; } .live-chip { margin-top: 0; order: 5; } .week-grid { gap: 4px; } .day-title h2 { font-size: var(--md-sys-typescale-headline-small-size); } .day-title { gap: 8px; margin-bottom: 12px; } .day-actions .icon-button { width: 48px; min-width: 48px; } .search-bar { gap: 12px; padding-inline: 16px; margin-bottom: 24px; } .search-bar input { font-size: var(--md-sys-typescale-body-large-size); } .time-slot { display: block; } .slot-time { padding: 0 4px; margin-bottom: 12px; display: flex; flex-direction: row; align-items: baseline; gap: 8px; font-size: var(--md-sys-typescale-title-large-size); } .slot-time > span { font-size: var(--md-sys-typescale-body-large-size); } .lesson-list { gap: 28px; } .lesson-card { padding: 20px; gap: 8px; } .lesson-body > strong { font-size: var(--md-sys-typescale-title-medium-size); } .lesson-meta { gap: 8px 16px; } .lesson-body { gap: 12px; } .lesson-chevron { width: 20px; } .week-list { gap: 40px; } .week-day > h2 { font-size: var(--md-sys-typescale-headline-small-size); } .modal { width: 100%; max-width: 100%; max-height: 92dvh; margin: auto 0 0; inset: auto 0 0; border-radius: var(--md-sys-shape-corner-extra-large) var(--md-sys-shape-corner-extra-large) 0 0; padding: 0 20px calc(24px + env(safe-area-inset-bottom)); animation-name: sheet-enter; animation-duration: var(--md-sys-motion-duration-long); } .sheet-handle { display: block; width: 32px; height: 4px; margin: 16px auto 8px; border-radius: var(--md-sys-shape-corner-full); background: color-mix( in srgb, var(--md-sys-color-on-surface-variant) 40%, transparent ); } @keyframes sheet-enter { from { transform: translateY(100%); } } .modal-header h2 { font-size: var(--md-sys-typescale-headline-small-size); } .detail-grid { grid-template-columns: 1fr; gap: 20px; } .source-facts > div { grid-template-columns: 1fr; gap: 4px; } .menu-list > button, .menu-list > a { min-height: 72px; } .status-message { gap: 8px; } .update-banner { grid-template-columns: auto minmax(0, 1fr); padding: 16px; } .pair-picker { grid-template-columns: repeat(4, minmax(0, 1fr)); } .exam-countdown { width: 60px; height: 60px; } .exam-item { flex-direction: column; } .target-header { margin-left: -8px; } .update-icon { width: 40px; height: 40px; } .update-actions { grid-column: 1 / -1; justify-content: flex-end; margin: -4px -8px -8px 0; } .status-message button { margin: -8px -8px -8px auto; } .empty-state { padding: 32px 16px; } } @media (max-width: 359px) { .view-switch button { min-width: 72px; padding-inline: 12px; } .variant-select { padding-inline: 8px; gap: 2px; } .group-selector { padding: 20px; } .day-title h2 { font-size: var(--md-sys-typescale-title-large-size); } .day-actions { gap: 0; } .day-actions .icon-button { width: 48px; min-width: 48px; } .lesson-card { padding: 18px 16px; } .lesson-chevron { display: none; } .source-facts > div { gap: 8px; } } /* * Dark tokens apply when the system is dark and the student has not chosen * light, or when they chose dark explicitly (data-theme on ). */ @media (prefers-color-scheme: dark) { :root:not([data-theme="light"]) { color-scheme: dark; --md-sys-color-primary: #d0bcff; --md-sys-color-on-primary: #381e72; --md-sys-color-primary-container: #4f378b; --md-sys-color-on-primary-container: #eaddff; --md-sys-color-secondary: #ccc2dc; --md-sys-color-on-secondary: #332d41; --md-sys-color-secondary-container: #4a4458; --md-sys-color-on-secondary-container: #e8def8; --md-sys-color-tertiary: #efb8c8; --md-sys-color-on-tertiary: #492532; --md-sys-color-tertiary-container: #633b48; --md-sys-color-on-tertiary-container: #ffd8e4; --md-sys-color-surface: #141218; --md-sys-color-on-surface: #e6e0e9; --md-sys-color-on-surface-variant: #cac4d0; --md-sys-color-surface-container-lowest: #0f0d13; --md-sys-color-surface-container-low: #1d1b20; --md-sys-color-surface-container: #211f26; --md-sys-color-surface-container-high: #2b2930; --md-sys-color-surface-container-highest: #36343b; --md-sys-color-outline: #938f99; --md-sys-color-outline-variant: #49454f; --md-sys-color-error: #f2b8b5; --md-sys-color-error-container: #8c1d18; --md-sys-color-on-error-container: #f9dedc; --md-sys-color-inverse-surface: #e6e0e9; --md-sys-color-inverse-on-surface: #322f35; --source-green-container: #304c35; --source-on-green-container: #d5e8d4; --week-white: #e6e0e9; --week-green: #3d6a3a; } } :root[data-theme="dark"] { color-scheme: dark; --md-sys-color-primary: #d0bcff; --md-sys-color-on-primary: #381e72; --md-sys-color-primary-container: #4f378b; --md-sys-color-on-primary-container: #eaddff; --md-sys-color-secondary: #ccc2dc; --md-sys-color-on-secondary: #332d41; --md-sys-color-secondary-container: #4a4458; --md-sys-color-on-secondary-container: #e8def8; --md-sys-color-tertiary: #efb8c8; --md-sys-color-on-tertiary: #492532; --md-sys-color-tertiary-container: #633b48; --md-sys-color-on-tertiary-container: #ffd8e4; --md-sys-color-surface: #141218; --md-sys-color-on-surface: #e6e0e9; --md-sys-color-on-surface-variant: #cac4d0; --md-sys-color-surface-container-lowest: #0f0d13; --md-sys-color-surface-container-low: #1d1b20; --md-sys-color-surface-container: #211f26; --md-sys-color-surface-container-high: #2b2930; --md-sys-color-surface-container-highest: #36343b; --md-sys-color-outline: #938f99; --md-sys-color-outline-variant: #49454f; --md-sys-color-error: #f2b8b5; --md-sys-color-error-container: #8c1d18; --md-sys-color-on-error-container: #f9dedc; --md-sys-color-inverse-surface: #e6e0e9; --md-sys-color-inverse-on-surface: #322f35; --source-green-container: #304c35; --source-on-green-container: #d5e8d4; --week-white: #e6e0e9; --week-green: #3d6a3a; } @media (prefers-reduced-motion: reduce) { *, *::before, *::after { animation: none !important; transition: none !important; scroll-behavior: auto !important; } }