/*
 * The one design language for custom pages: every page served outside the
 * Django admin, such as /analytics/ and the Stripe checkout harness.
 *
 * Tokens first, then components. Pages style themselves with these classes
 * and variables only; a colour or spacing value written anywhere below the
 * token block is a token that has not been named yet.
 *
 * The tokens are the mobile app's dark theme, copied from
 * app_flutter/lib/colors.dart (`WilmaColors` and `_buildDarkTheme`), so the
 * web pages and the app read as one product. When the app's palette moves,
 * move these with it; the comment on each names its source.
 */

:root {
    color-scheme: dark;

    --color-bg: #292929;              /* scaffoldBackgroundColor */
    --color-header: #1f1f1f;          /* appBarTheme.backgroundColor */
    --color-surface: #333333;         /* colorScheme.surfaceContainerHigh */
    --color-surface-raised: #424242;  /* colorScheme.surfaceContainerHighest */
    --color-sunken: #1a1a1a;          /* colorScheme.surfaceContainerLow */
    --color-border: rgba(255, 255, 255, 0.2);  /* dividerColor, _hairlineDark */
    --color-text: #ededed;            /* colorScheme.onSurface */
    --color-text-muted: #aaaaaa;      /* onSurfaceVariant, _mutedGreyDark */
    --color-link: #8e97d6;            /* PERIWINKLE */

    --color-primary: #e11e3c;         /* RED, the elevated button fill */
    --color-danger: #cb0000;          /* colorScheme.error */
    --color-warning: #fa85be;         /* PINK */
    --color-success: #2e9e5b;         /* GREEN */
    --color-on-accent: #ffffff;       /* elevated button foreground */
    --color-on-light-accent: #111111; /* CHARCOAL, ink on PINK */

    /* LIGHT_PINK and PERIWINKLE, translucent over the dark surface. */
    --color-category-regular: rgba(253, 196, 218, 0.16);
    --color-category-pregnancy: rgba(142, 151, 214, 0.22);

    /* ScheduledVideo.subscription_type, on the scheduler's blocks; each
     * light enough to take CHARCOAL ink. */
    --color-type-combo: #8e97d6;      /* PERIWINKLE */
    --color-type-home: #fdc4da;       /* LIGHT_PINK */
    --color-type-gym: #cdd0e0;        /* LIGHT_BLUE */
    --color-scrim: rgba(0, 0, 0, 0.27);  /* OVERLAY_SCRIM */

    --shadow-card: 0 2px 4px rgba(0, 0, 0, 0.3);  /* cardTheme elevation 2, SHADOW_STRONG */
    --hover-filter: brightness(1.12);
    --disabled-opacity: 0.59;         /* withAlpha(150) on disabled buttons */

    /* The app's faces (Founders Grotesk and friends) are licensed for the
     * app bundle only, so the web falls back to the system stack. */
    --font-body: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto,
        sans-serif;
    --font-mono: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
    --font-size-sm: 13px;
    --font-size-md: 15px;             /* textTheme.bodyMedium */
    --font-size-button: 16px;         /* elevatedButtonTheme textStyle */
    --font-size-lg: 18px;
    --font-size-xl: 24px;

    --space-xs: 4px;
    --space-sm: 8px;
    --space-md: 16px;
    --space-lg: 24px;
    --space-xl: 32px;

    --radius-sm: 4px;                 /* toggleButtonsTheme */
    --radius-card: 15px;              /* dialogTheme */
    --radius-pill: 999px;             /* M3 stadium button shape */
    --button-height: 44px;            /* PillButton default height */

    --logo-width: 240px;
    --header-logo-height: 28px;
    --narrow-width: 560px;
    /* The logo artwork is black on transparent; the dark theme inverts it. */
    --logo-filter: invert(1);
    --content-width: 1100px;
    --wide-content-width: 1600px;
    --scheduler-hour-height: 48px;
    --scheduler-gutter-width: 56px;
    --scheduler-sidebar-width: 240px;
    --scheduler-sidebar-max-width: 320px;
    --scheduler-panel-width: 380px;
    --scheduler-grid-height: 72vh;
    --scheduler-block-min-height: 18px;
    --field-width: 480px;
    --border-width: 1px;
    --accent-border-width: 4px;
}

/* ---------------------------------------------------------------- base */

body.custom-page {
    margin: 0;
    background-color: var(--color-bg);
    color: var(--color-text);
    font-family: var(--font-body);
    font-size: var(--font-size-md);
    line-height: 1.5;
}

/* A component class's `display` would otherwise beat the `hidden` attribute. */
.custom-page [hidden] {
    display: none !important;
}

.custom-page a {
    color: var(--color-link);
}

.custom-page h1,
.custom-page h2,
.custom-page h3 {
    margin: 0 0 var(--space-sm);
    line-height: 1.25;
}

.custom-page code {
    font-family: var(--font-mono);
    font-size: 0.9em;
    padding: 0 var(--space-xs);
    border-radius: var(--radius-sm);
    background-color: var(--color-surface-raised);
}

/* -------------------------------------------------------------- layout */

.page-header {
    display: flex;
    align-items: center;
    justify-content: space-between;
    flex-wrap: wrap;
    gap: var(--space-sm);
    padding: var(--space-md) var(--space-lg);
    background-color: var(--color-header);
    border-bottom: var(--border-width) solid var(--color-border);
}

.page-header__logo {
    display: block;
    height: var(--header-logo-height);
    filter: var(--logo-filter);
}

.page-header__nav {
    display: flex;
    align-items: center;
    gap: var(--space-md);
    font-size: var(--font-size-sm);
    color: var(--color-text-muted);
}

.page-header__logout {
    margin: 0;
}

/* A button that reads as a link, for actions that must POST from a row of
 * links (logout). */
.link-button {
    padding: 0;
    border: 0;
    background: none;
    color: var(--color-link);
    font: inherit;
    text-decoration: underline;
    cursor: pointer;
}

.page-main {
    max-width: var(--content-width);
    margin: 0 auto;
    padding: var(--space-xl) var(--space-lg);
}

.page-main--wide {
    max-width: var(--wide-content-width);
}

.page-title {
    display: flex;
    align-items: center;
    gap: var(--space-md);
    margin-bottom: var(--space-sm);
    font-size: var(--font-size-xl);
}

.page-intro {
    margin: 0 0 var(--space-lg);
    color: var(--color-text-muted);
}

/* -------------------------------------------------------------- panels */

.panel {
    margin-bottom: var(--space-lg);
    padding: var(--space-lg);
    background-color: var(--color-surface);
    border: var(--border-width) solid var(--color-border);
    border-radius: var(--radius-card);
    box-shadow: var(--shadow-card);
}

.panel__title {
    font-size: var(--font-size-lg);
}

.panel__hint {
    margin: 0 0 var(--space-md);
    font-size: var(--font-size-sm);
    color: var(--color-text-muted);
}

/* -------------------------------------------------------------- badges */

.badge {
    display: inline-block;
    padding: var(--space-xs) var(--space-sm);
    border-radius: var(--radius-pill);
    font-size: var(--font-size-sm);
    font-weight: 600;
    color: var(--color-on-accent);
    background-color: var(--color-text-muted);
}

.badge--test {
    background-color: var(--color-warning);
    color: var(--color-on-light-accent);
}

.badge--live {
    background-color: var(--color-danger);
}

.badge--success {
    background-color: var(--color-success);
}

/* ------------------------------------------------------------- notices */

.notice {
    margin-bottom: var(--space-lg);
    padding: var(--space-md);
    border: var(--border-width) solid var(--color-border);
    border-left-width: var(--accent-border-width);
    border-radius: var(--radius-card);
    background-color: var(--color-surface);
}

.notice--danger {
    border-left-color: var(--color-danger);
}

.notice--info {
    border-left-color: var(--color-primary);
}

.notice:empty {
    display: none;
}

/* -------------------------------------------------------------- forms */

.field {
    display: flex;
    flex-direction: column;
    gap: var(--space-xs);
    margin-bottom: var(--space-md);
}

.field__label {
    font-size: var(--font-size-sm);
    color: var(--color-text-muted);
}

.field__input {
    max-width: var(--field-width);
    padding: var(--space-sm);
    border: var(--border-width) solid var(--color-border);
    border-radius: var(--radius-sm);
    background-color: var(--color-surface-raised);
    color: var(--color-text);
    font: inherit;
}

.actions {
    display: flex;
    flex-wrap: wrap;
    gap: var(--space-sm);
}

.actions--end {
    justify-content: flex-end;
}

/* The destructive action, held at the far left as the admin's submit row does. */
.actions__start {
    margin-right: auto;
}

/* ------------------------------------------------------------- buttons */

.button {
    min-height: var(--button-height);
    padding: 0 var(--space-md);
    border: var(--border-width) solid var(--color-text);
    border-radius: var(--radius-pill);
    background-color: transparent;
    color: var(--color-text);
    font: inherit;
    font-size: var(--font-size-button);
    cursor: pointer;
}

.button:hover:not(:disabled) {
    filter: var(--hover-filter);
}

.button:disabled {
    opacity: var(--disabled-opacity);
    cursor: not-allowed;
}

.button--primary {
    background-color: var(--color-primary);
    border-color: var(--color-primary);
    color: var(--color-on-accent);
}

.button--danger {
    background-color: var(--color-danger);
    border-color: var(--color-danger);
    color: var(--color-on-accent);
}

.button--warning {
    background-color: var(--color-warning);
    border-color: var(--color-warning);
    color: var(--color-on-light-accent);
}

/* -------------------------------------------------------------- lists */

.item-list {
    margin: 0;
    padding: 0;
    list-style: none;
}

.item {
    display: flex;
    flex-direction: column;
    gap: var(--space-sm);
    padding: var(--space-md);
    border: var(--border-width) solid var(--color-border);
    border-radius: var(--radius-card);
    background-color: var(--color-surface-raised);
}

.item + .item {
    margin-top: var(--space-sm);
}

.item--empty {
    color: var(--color-text-muted);
}

.item__title {
    font-weight: 600;
}

.item__meta {
    display: flex;
    flex-wrap: wrap;
    gap: var(--space-xs) var(--space-md);
    font-size: var(--font-size-sm);
    color: var(--color-text-muted);
}

/* ------------------------------------------------------------- output */

.output {
    margin: 0;
    padding: var(--space-md);
    overflow-x: auto;
    border: var(--border-width) solid var(--color-border);
    border-radius: var(--radius-sm);
    background-color: var(--color-sunken);
    font-family: var(--font-mono);
    font-size: var(--font-size-sm);
    white-space: pre-wrap;
}

.output:empty {
    display: none;
}

/* --------------------------------------------------------- breadcrumbs */

.breadcrumbs {
    margin-bottom: var(--space-md);
    font-size: var(--font-size-sm);
    color: var(--color-text-muted);
}

/* ---------------------------------------------------------- link cards */

/*
 * One card per destination, the whole card being the link: a small hit
 * target in the corner reads as decoration around a link rather than a
 * button. The chevron is decorative and hidden from screen readers in markup.
 */
.link-card {
    display: flex;
    align-items: center;
    gap: var(--space-md);
    padding: var(--space-md) var(--space-lg);
    border: var(--border-width) solid var(--color-border);
    border-radius: var(--radius-card);
    box-shadow: var(--shadow-card);
    background-color: var(--color-surface);
    color: inherit;
    text-decoration: none;
}

.item-list > li + li > .link-card,
.link-card + .link-card {
    margin-top: var(--space-sm);
}

.link-card:hover {
    border-color: var(--color-primary);
}

.link-card__text {
    flex: 1;
    min-width: 0;
}

.link-card__title {
    display: block;
    margin-bottom: var(--space-xs);
    font-weight: 600;
    color: var(--color-link);
}

.link-card__description {
    display: block;
    font-size: var(--font-size-sm);
    color: var(--color-text-muted);
}

.link-card__chevron {
    flex: none;
    font-size: var(--font-size-xl);
    line-height: 1;
    color: var(--color-text-muted);
}

.link-card:hover .link-card__chevron {
    color: var(--color-primary);
}

/* ---------------------------------------------------------- data tables */

.data-table {
    margin-bottom: var(--space-xl);
    border-collapse: collapse;
    background-color: var(--color-surface);
    font-size: var(--font-size-sm);
}

.data-table caption {
    padding-bottom: var(--space-sm);
    text-align: left;
    font-weight: 600;
}

.data-table th,
.data-table td {
    padding: var(--space-sm) var(--space-md);
    border: var(--border-width) solid var(--color-border);
    text-align: left;
}

.data-table th {
    background-color: var(--color-surface-raised);
}

.data-table__group {
    text-align: center;
}

/* Cross-tabulations put the two product categories side by side; tinting each
 * half keeps them apart at a glance. Declared after the header rule so a
 * tinted header keeps its tint. */
.data-table .category-regular {
    background-color: var(--color-category-regular);
}

.data-table .category-pregnancy {
    background-color: var(--color-category-pregnancy);
}

/* ---------------------------------------------------------------- hero */

.hero {
    max-width: var(--narrow-width);
    margin: var(--space-xl) auto;
    text-align: center;
}

.hero .page-title {
    justify-content: center;
}

.hero__logo {
    width: var(--logo-width);
    max-width: 80%;
    margin-bottom: var(--space-lg);
    filter: var(--logo-filter);
}

.hero__links {
    max-width: var(--narrow-width);
    margin: 0 auto;
    text-align: left;
}

/* ---------------------------------------------------------- segmented */

.segmented {
    display: inline-flex;
    border: var(--border-width) solid var(--color-border);
    border-radius: var(--radius-pill);
    overflow: hidden;
}

.segmented__option {
    min-height: var(--button-height);
    padding: 0 var(--space-md);
    border: 0;
    background: transparent;
    color: var(--color-text);
    font: inherit;
    cursor: pointer;
}

.segmented__option[aria-pressed="true"] {
    background-color: var(--color-surface-raised);
    font-weight: 600;
}

/* -------------------------------------------------------------- dialog */

.dialog {
    max-width: var(--narrow-width);
    padding: var(--space-lg);
    border: var(--border-width) solid var(--color-border);
    border-radius: var(--radius-card);
    background-color: var(--color-surface);
    color: var(--color-text);
    box-shadow: var(--shadow-card);
}

.dialog::backdrop {
    background-color: var(--color-scrim);
}

/* ----------------------------------------------------------- scheduler */

.scheduler__toolbar {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: var(--space-md);
    margin-bottom: var(--space-md);
}

.scheduler__toolbar .page-title {
    margin: 0;
}

.scheduler__range {
    flex: 1;
    margin: 0;
    font-size: var(--font-size-lg);
}

.scheduler__layout {
    display: grid;
    grid-template-columns: var(--scheduler-sidebar-width) minmax(0, 1fr) var(--scheduler-panel-width);
    gap: var(--space-md);
    align-items: start;
}

.scheduler__panel {
    margin: 0;
    max-height: var(--scheduler-grid-height);
    overflow-y: auto;
}

.scheduler__legend {
    margin: var(--space-md) 0 0;
    padding: 0;
    list-style: none;
    font-size: var(--font-size-sm);
    color: var(--color-text-muted);
}

.scheduler__legend li {
    display: flex;
    align-items: center;
    gap: var(--space-sm);
}

.type-swatch {
    width: var(--space-md);
    height: var(--space-md);
    border-radius: var(--radius-sm);
}

.type-swatch--combo,
.scheduler-block--combo {
    background-color: var(--color-type-combo);
}

.type-swatch--home,
.scheduler-block--home {
    background-color: var(--color-type-home);
}

.type-swatch--gym,
.scheduler-block--gym {
    background-color: var(--color-type-gym);
}

.scheduler__video-summary {
    font-weight: 600;
}

.scheduler__video-summary--problem {
    color: var(--color-danger);
}

.scheduler__player {
    width: 100%;
    margin: var(--space-md) 0;
    border-radius: var(--radius-sm);
    background-color: var(--color-sunken);
}

.scheduler__tool,
.scheduler__footer {
    padding-top: var(--space-md);
    margin-top: var(--space-md);
    border-top: var(--border-width) solid var(--color-border);
}
@media (max-width: 1200px) {
    .scheduler__layout {
        grid-template-columns: minmax(0, 1fr);
    }

    /* Full width, the square day cells would grow with the screen. */
    .scheduler__sidebar {
        width: 100%;
        max-width: var(--scheduler-sidebar-max-width);
        justify-self: center;
    }

    .scheduler__panel {
        max-height: none;
    }
}

/* ------------------------------------------------------- mini calendar */

.mini-calendar {
    padding: var(--space-sm);
    border: var(--border-width) solid var(--color-border);
    border-radius: var(--radius-card);
    background-color: var(--color-surface);
}

.mini-calendar__header {
    display: flex;
    align-items: center;
    justify-content: space-between;
    margin-bottom: var(--space-xs);
    font-weight: 600;
}

.mini-calendar__days {
    display: grid;
    grid-template-columns: repeat(7, 1fr);
    text-align: center;
    font-size: var(--font-size-sm);
}

.mini-calendar__weekday {
    color: var(--color-text-muted);
}

.mini-calendar__day {
    aspect-ratio: 1;
    padding: 0;
    border: 0;
    border-radius: var(--radius-pill);
    background: transparent;
    color: var(--color-text);
    font: inherit;
    cursor: pointer;
}

.mini-calendar__day:hover {
    background-color: var(--color-surface-raised);
}

.mini-calendar__day--outside {
    color: var(--color-text-muted);
}

.mini-calendar__day--in-range {
    background-color: var(--color-surface-raised);
}

.mini-calendar__day--today {
    background-color: var(--color-primary);
    color: var(--color-on-accent);
}

.mini-calendar__nav {
    padding: 0 var(--space-sm);
    border: 0;
    background: transparent;
    color: var(--color-text);
    font-size: var(--font-size-lg);
    cursor: pointer;
}

/* -------------------------------------------------------- scheduler grid */

.scheduler-grid {
    height: var(--scheduler-grid-height);
    overflow-y: auto;
    border: var(--border-width) solid var(--color-border);
    border-radius: var(--radius-card);
    background-color: var(--color-surface);
}

.scheduler-grid__head,
.scheduler-grid__body {
    display: grid;
    grid-template-columns: var(--scheduler-gutter-width) repeat(var(--scheduler-days), minmax(0, 1fr));
}

.scheduler-grid__head {
    position: sticky;
    top: 0;
    z-index: 3;
    border-bottom: var(--border-width) solid var(--color-border);
    background-color: var(--color-surface);
}

.scheduler-grid__day-label {
    padding: var(--space-sm);
    border: 0;
    border-left: var(--border-width) solid var(--color-border);
    background: transparent;
    color: var(--color-text-muted);
    font: inherit;
    font-size: var(--font-size-sm);
    text-align: center;
    cursor: pointer;
}

.scheduler-grid__day-label--today {
    color: var(--color-primary);
    font-weight: 600;
}

.scheduler-grid__gutter {
    position: relative;
    height: calc(24 * var(--scheduler-hour-height));
}

.scheduler-grid__hour {
    position: absolute;
    right: var(--space-xs);
    transform: translateY(-50%);
    font-size: var(--font-size-sm);
    color: var(--color-text-muted);
}

.scheduler-day {
    position: relative;
    height: calc(24 * var(--scheduler-hour-height));
    border-left: var(--border-width) solid var(--color-border);
    background-image: linear-gradient(var(--color-border) var(--border-width), transparent var(--border-width));
    background-size: 100% var(--scheduler-hour-height);
    cursor: cell;
}

.scheduler-block {
    box-sizing: border-box;
    position: absolute;
    min-height: var(--scheduler-block-min-height);
    overflow: hidden;
    padding: 0 var(--space-xs);
    border: var(--border-width) solid var(--color-surface);
    border-radius: var(--radius-sm);
    color: var(--color-on-light-accent);
    font-size: var(--font-size-sm);
    line-height: 1.3;
    cursor: grab;
    touch-action: none;
    user-select: none;
    z-index: 1;
}

.scheduler-block--selected {
    border-color: var(--color-text);
    box-shadow: var(--shadow-card);
    z-index: 2;
}

.scheduler-block--dragging {
    opacity: var(--disabled-opacity);
    cursor: grabbing;
    z-index: 2;
}

/* Where the stream being created will land. Clicks pass through to the day,
 * so clicking elsewhere moves it. */
.scheduler-block--placeholder {
    border: var(--border-width) dashed var(--color-text-muted);
    background-color: var(--color-surface-raised);
    color: var(--color-text-muted);
    opacity: var(--disabled-opacity);
    pointer-events: none;
    cursor: default;
}

.scheduler-block--unschedulable {
    border: var(--accent-border-width) dashed var(--color-danger);
}

.scheduler-block__title {
    display: block;
    font-weight: 600;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}

.scheduler-now {
    position: absolute;
    left: 0;
    right: 0;
    height: calc(2 * var(--border-width));
    background-color: var(--color-primary);
    pointer-events: none;
    z-index: 2;
}
