- Parser 14 (server/places.js): "Занятия в Полоцке/Новополоцке/г. Новополоцк" over a day's first row is no longer a lesson but a note of the day for its column (`places`); lessons of that day get `place`. A lesson below the note in the same cell keeps its own subject.
- A town on its own line ("Новополоцк", "г.Новополоцк") or after a room ("246(Новополоцк)") becomes the lesson's `place` and leaves the subject and room. "История Полоцка" is not a town.
- API 14: `place` on lessons and `places` on days of /api/timetable, `place` in the directory. The day notes are shared by the server and the PWA (shared/places.js); the same note in every subgroup reads as the whole group's.
- Android, PWA and iOS: a "Занятия в Полоцке" card above the day's lessons (day pages, calendar, overview, week view, desk stand), "Полоцк" under the date in the week grid, "249Ж · Полоцк" on lesson cards, a "Город" row in details, the town in widgets, tile, reminders and change lists.
- Snapshot lines show the town and the day notes; tests for notes, towns in cells and the API.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2662 lines
63 KiB
CSS
2662 lines
63 KiB
CSS
@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 <html>).
|
|
*/
|
|
@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;
|
|
}
|
|
}
|