/* Hairstyle — Custom · based on shadcn.
   Tokens live here; change them and the whole app follows. */
:root {
  --ink: #18181b;
  --surface: #fafafa;
  --paper: #ffffff;              /* card background, above the page surface */
  --accent: #db2777;
  --radius: 0px;
  --topbar-h: 60px;              /* fixed so a docked sidebar can clear it */
  --sidebar-w: 280px;            /* the docked width; the drawer uses its own */
  --line: 1px;                /* border weight on cards and controls */
  --outline: rgba(24, 24, 27, 0.14);          /* border colour */
  --toggle-border: var(--line) solid var(--outline);  /* the light/dark switch; `none` in some themes */
  --shadow: 0 1px 2px 0 rgb(0 0 0 / 0.15);            /* full box-shadow value, or `none` */
  --font-display: 'Outfit', sans-serif;
  --font-body: ui-monospace, 'JetBrains Mono', monospace;

  /* Typography beyond the family: casing, tracking and weight are what make a
     design system recognisable at a glance. */
  --h-transform: none;
  --h-spacing: -0.02em;
  --h-weight: 600;
  --l-transform: none;   /* buttons and small labels */
  --l-spacing: normal;
  --l-weight: 500;

  /* One colour per person, picked from their name — see app.js. */
  --c1: #7c3aed;
  --c2: #3d3d3d;
  --c3: #5c5c5c;
  --c4: #7a7a7a;
  --c5: #2b2b2b;
  --c6: #494949;

  --border: color-mix(in srgb, var(--ink) 16%, transparent);
  --ease: cubic-bezier(0.22, 1, 0.36, 1);
  --pop: cubic-bezier(0.34, 1.56, 0.64, 1);
}

/* Dark mode. The class is set on <html> by app.js before first paint, so the
   page never flashes the wrong palette. Only the colours change — radius,
   type, and spacing are the same design either way. */
.dark {
  --ink: #fafafa;
  --surface: #18181b;
  --paper: #27272a;
  --accent: #f472b6;
  --outline: rgba(250, 250, 250, 0.14);
  --shadow: 0 1px 2px 0 rgb(0 0 0 / 0.15);
  --border: color-mix(in srgb, var(--ink) 20%, transparent);
}

.dark body { background: var(--surface); }

* { box-sizing: border-box; }

body {
  margin: 0;
  font-family: var(--font-body);
  background: var(--surface);
  background-attachment: fixed;
  color: var(--ink);
  line-height: 1.6;
}

:focus-visible { outline: 3px solid var(--ink); outline-offset: 2px; }

/* ---------- Splash ---------- */

.splash {
  position: fixed;
  inset: 0;
  z-index: 60;
  background: var(--surface);
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: 18px;
  animation: splash-lift 0.5s var(--ease) 0.9s both;
}

.splash.is-gone { display: none; }

.splash-name {
  font-family: var(--font-display);
  font-size: 1.8rem;
  font-weight: var(--h-weight);
  letter-spacing: var(--h-spacing);
  text-transform: var(--h-transform);
  animation: splash-in 0.4s var(--ease) both;
}

.splash-bar {
  width: 120px;
  height: 2px;
  background: var(--border);
  overflow: hidden;
}

.splash-bar i {
  display: block;
  height: 100%;
  background: var(--accent);
  transform-origin: left;
  animation: splash-fill 0.85s var(--ease) 0.1s both;
}

@keyframes splash-lift { to { transform: translateY(-101%); } }
@keyframes splash-in { from { opacity: 0; transform: translateY(8px); } }
@keyframes splash-fill { from { transform: scaleX(0); } to { transform: scaleX(1); } }

/* ---------- Top bar ---------- */

/* Scoped to the element: `.topbar` is also a layout flag on <body>, and an
   unscoped rule made the body itself a 60px sticky flex box, which pushed the
   whole page content out of view. */
header.topbar {
  position: sticky;
  top: 0;
  z-index: 30;
  height: var(--topbar-h);
  display: flex;
  align-items: center;
  gap: 14px;
  padding: 0 18px;
  background: var(--surface);
  border-bottom: var(--line) solid var(--outline);
}

.topbar-title {
  flex: 1;
  min-width: 0;
  margin: 0;
  font-family: var(--font-display);
  font-size: 1.05rem;
  font-weight: var(--h-weight);
  letter-spacing: var(--h-spacing);
  text-transform: var(--h-transform);
  /* The bar has a fixed height so a docked sidebar can clear it, which means a
     long name has to truncate rather than wrap out of it. */
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}

.burger {
  display: flex;
  flex-direction: column;
  justify-content: center;
  gap: 4px;
  width: 22px;
  height: 22px;
  padding: 0;
  border: 0;
  background: transparent;
  cursor: pointer;
  flex: none;
}

.burger i { display: block; height: 3px; border-radius: 3px; background: var(--ink); }

/* ---------- Avatars ---------- */

.avatar {
  width: 32px;
  height: 32px;
  border-radius: 50%;
  flex: none;
  display: grid;
  place-items: center;
  font-family: var(--font-display);
  font-size: 0.75rem;
  font-weight: 700;
  /* --who is set per row in app.js from the person's name. */
  background: var(--who, var(--accent));
  color: var(--surface);
  border: var(--line) solid var(--outline);
}

.avatar--me { background: var(--accent); }

/* ---------- Light / dark toggle ---------- */

.mode-toggle {
  display: grid;
  place-items: center;
  width: 34px;
  height: 34px;
  padding: 0;
  flex: none;
  cursor: pointer;
  color: inherit;
  background: transparent;
  border: var(--toggle-border);
  border-radius: var(--radius);
}

.mode-toggle:hover { background: color-mix(in srgb, var(--ink) 7%, transparent); }

/* Sun in light mode, moon in dark — only one is ever drawn. */
.mode-toggle .mt-moon { display: none; }
.dark .mode-toggle .mt-sun,
.dark .mode-toggle .mt-rays { display: none; }
.dark .mode-toggle .mt-moon { display: block; }

/* ---------- Sidebar ---------- */

.sidebar {
  position: fixed;
  top: 0;
  left: 0;
  bottom: 0;
  width: min(280px, 78vw);
  z-index: 50;
  padding: 20px 0;
  background: var(--surface);
  border-right: var(--line) solid var(--outline);
  transform: translateX(-100%);
  transition: transform 0.32s var(--ease);
}

body.nav-open .sidebar { transform: translateX(0); }

.sidebar-head {
  font-family: var(--font-display);
  font-size: 1rem;
  font-weight: var(--h-weight);
  letter-spacing: var(--h-spacing);
  text-transform: var(--h-transform);
  padding: 0 20px 16px;
  border-bottom: var(--line) solid var(--outline);
  margin-bottom: 10px;
}

.side-link {
  display: block;
  padding: 11px 20px;
  color: inherit;
  text-decoration: none;
  font-family: var(--font-display);
  font-weight: var(--l-weight);
  letter-spacing: var(--l-spacing);
  text-transform: var(--l-transform);
  opacity: 0.65;
  border-left: 3px solid transparent;
}

.side-link:hover { opacity: 1; }

.side-link.is-active {
  opacity: 1;
  border-left-color: var(--accent);
  background: color-mix(in srgb, var(--accent) 10%, transparent);
}

/* The drawer comes over the page, so the page goes back: dimmed and blurred,
   which reads as "this is on top of that" far better than a flat dim alone. */
.scrim {
  position: fixed;
  inset: 0;
  z-index: 40;
  background: rgba(0, 0, 0, 0.42);
  backdrop-filter: blur(6px);
  -webkit-backdrop-filter: blur(6px);
  opacity: 0;
  pointer-events: none;
  transition: opacity 0.32s var(--ease);
}

body.nav-open .scrim { opacity: 1; pointer-events: auto; }

/* ---------- Layout ----------
   The chrome that exists is decided by the layout picked at creation; these
   rules are inert unless <body> carries the matching class, so one stylesheet
   serves every combination. */

/* Docked on wide viewports, off-canvas below — a drawer is right on a phone
   and wrong on a desktop, and 900px is where the content column stops needing
   the full width. */
/* The drawer and its scrim start below the top bar rather than covering it, so
   the burger that opened it stays visible and can close it again. */
body.topbar .sidebar,
body.topbar .scrim { top: var(--topbar-h); }

/* On the right, when that is the side it was asked for. */
body.sidebar-right .sidebar {
  left: auto;
  right: 0;
  border-right: 0;
  border-left: var(--line) solid var(--outline);
}

body.sidebar-right .sidebar { transform: translateX(100%); }
body.sidebar-right.nav-open .sidebar { transform: translateX(0); }

/* Controls that would have lived in the top bar, when there is not one. */
.floating-controls {
  position: fixed;
  top: 14px;
  right: 14px;
  z-index: 45;
  display: flex;
  gap: 8px;
}

/* A docked right sidebar outranks these and would sit on top of them, so they
   move to the other corner when that is the layout. */
body.sidebar-right .floating-controls { right: auto; left: 14px; }

/* With no top bar the controls float over the content, so the content starts
   below them instead of underneath them. */
body:not(.topbar) .main { padding-top: 66px; }

.floating-controls .burger,
.floating-controls .mode-toggle {
  background: var(--paper);
  border: var(--line) solid var(--outline);
  border-radius: var(--radius);
}



/* ---------- Footer navigation ---------- */

.footernav {
  position: fixed;
  left: 0;
  right: 0;
  bottom: 0;
  z-index: 30;
  display: flex;
  justify-content: space-around;
  align-items: stretch;
  background: var(--paper);
  border-top: var(--line) solid var(--outline);
}

.foot-link {
  flex: 1;
  padding: 13px 8px;
  display: flex;
  align-items: center;
  justify-content: center;
  color: inherit;
  text-decoration: none;
  opacity: 0.55;
  border-top: 2px solid transparent;
  margin-top: -1px;
}

.foot-link:hover { opacity: 1; }
.foot-link.is-active { opacity: 1; border-top-color: var(--accent); color: var(--accent); }

/* The footer sits over the page, so the content column and the floating
   button both have to clear it. */
body.footer .main { padding-bottom: 124px; }
body.footer .fab { bottom: 76px; }



/* ---------- Content ---------- */

.main { max-width: 640px; margin: 0 auto; padding: 24px 18px 96px; }

.lede { margin: 0 0 24px; opacity: 0.65; }

.composer { display: grid; gap: 10px; margin-bottom: 28px; }

/* An author `display` beats the UA stylesheet's rule for [hidden], so the
   attribute needs restating or the composer is always visible. */
.composer[hidden] { display: none; }

.composer-actions { display: flex; gap: 10px; justify-content: flex-end; }

input, textarea {
  font: inherit;
  font-family: var(--font-body);
  color: inherit;
  background: var(--paper);
  border: var(--line) solid var(--outline);
  border-radius: var(--radius);
  padding: 11px 13px;
  width: 100%;
}

input:focus, textarea:focus { outline: 2px solid var(--accent); outline-offset: -2px; }

.btn {
  font-family: var(--font-display);
  font-size: 0.8rem;
  font-weight: var(--l-weight);
  letter-spacing: var(--l-spacing);
  text-transform: var(--l-transform);
  cursor: pointer;
  padding: 10px 20px;
  border: var(--line) solid transparent;
  border-radius: var(--radius);
  background: var(--accent);
  color: var(--surface);
  box-shadow: var(--shadow);
}

.btn:hover { filter: brightness(1.12); }

.btn--ghost { background: transparent; color: inherit; border-color: var(--border); }
.btn--ghost:hover { filter: none; border-color: var(--ink); }

/* ---------- Summary ----------
   One series in the accent hue, so no legend is needed — the caption says what
   is plotted. Bars grow from a single zero baseline, carry a rounded data-end
   and a square foot, and are separated by surface gaps rather than strokes. */

.summary { margin-bottom: 28px; }

.tiles {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 10px;
  margin-bottom: 18px;
}

.tile {
  background: var(--paper);
  border: var(--line) solid var(--outline);
  border-radius: var(--radius);
  box-shadow: var(--shadow);
  padding: 12px 14px;
}

.tile-value {
  font-family: var(--font-display);
  font-size: 1.5rem;
  font-weight: var(--h-weight);
  letter-spacing: var(--h-spacing);
  line-height: 1.1;
}

.tile-label {
  font-size: 0.72rem;
  opacity: 0.6;
  margin-top: 2px;
}

.chart { margin: 0; }

.chart figcaption {
  font-size: 0.72rem;
  opacity: 0.6;
  margin-bottom: 10px;
}

.bars {
  display: grid;
  grid-auto-flow: column;
  grid-auto-columns: 1fr;
  align-items: end;
  gap: 2px;                      /* the surface gap doing the separating */
  height: 118px;
  border-bottom: 1px solid var(--outline);   /* recessive hairline baseline */
}

.bar {
  display: flex;
  flex-direction: column;
  justify-content: flex-end;
  align-items: center;
  height: 100%;
}

.bar i {
  display: block;
  width: 100%;
  max-width: 24px;               /* capped: never fill the whole slot */
  background: var(--accent);
  border-radius: var(--radius) var(--radius) 0 0;   /* rounded end, square foot */
  min-height: 2px;
  /* Without this the bar is a shrinkable flex item: a labelled bar gave up
     height to its own label and rendered SHORTER than a smaller unlabelled
     one, which inverts the data the chart is meant to show. */
  flex: none;
}

/* The plot area proper. Bar heights are a percentage of this, not of the whole
   column — measuring against the column made a full-height bar overflow past
   the caption once its label was added. */
.bar-track {
  flex: 1;
  min-height: 0;
  width: 100%;
  display: flex;
  align-items: flex-end;
  justify-content: center;
}

/* Reserved on every column, labelled or not, so all bars measure against the
   same track and their heights stay comparable. */
.bar-value {
  flex: none;
  height: 1rem;
  line-height: 1rem;
  font-size: 0.68rem;
  opacity: 0.75;
}

.bar-day {
  flex: none;
  font-size: 0.68rem;
  opacity: 0.5;
  margin-top: 6px;
}

.notes { list-style: none; margin: 0; padding: 0; display: grid; gap: 12px; }

.note {
  display: flex;
  align-items: flex-start;
  gap: 13px;
  background: var(--paper);
  border: var(--line) solid var(--outline);
  border-radius: var(--radius);
  box-shadow: var(--shadow);
  padding: 13px 15px;
  /* Each row lifts into place as it scrolls in — see app.js. */
  opacity: 0;
  transform: translateY(14px);
}

.note.is-in {
  opacity: 1;
  transform: none;
  transition: opacity 0.45s var(--ease), transform 0.45s var(--ease);
}

.note-text { flex: 1; min-width: 0; }
.note h3 {
  margin: 0 0 3px;
  font-family: var(--font-display);
  font-size: 0.95rem;
  font-weight: var(--h-weight);
  letter-spacing: var(--h-spacing);
  text-transform: var(--h-transform);
}
.note p { margin: 0; opacity: 0.7; font-size: 0.88rem; white-space: pre-wrap; }
.note-who { font-size: 0.72rem; opacity: 0.5; margin-top: 5px; }

.note-del {
  border: 0;
  background: transparent;
  color: inherit;
  cursor: pointer;
  opacity: 0.35;
  font-size: 0.9rem;
  padding: 2px 4px;
  flex: none;
}

.note-del:hover { opacity: 1; color: var(--accent); }

.empty { opacity: 0.5; text-align: center; padding: 40px 0; }

/* ---------- Floating action button ---------- */

.fab {
  position: fixed;
  right: 20px;
  bottom: 20px;
  z-index: 35;
  width: 54px;
  height: 54px;
  border-radius: 50%;
  border: var(--line) solid transparent;
  background: var(--accent);
  color: var(--surface);
  font-family: var(--font-display);
  font-size: 1.9rem;
  font-weight: 700;
  line-height: 1;
  cursor: pointer;
  box-shadow: var(--shadow);
  transition: transform 0.25s var(--pop);
}

.fab:hover { transform: scale(1.06); }
.fab.is-active { transform: rotate(45deg); }

@media (prefers-reduced-motion: reduce) {
  .splash, .splash-name, .splash-bar i { animation: none; }
  .sidebar, .scrim, .note, .fab { transition: none; }
  .note { opacity: 1; transform: none; }
}

/* ================================================================
   Barberista — booking

   The shop's opening hours are drawn as bars on one shared time axis
   and that drawing IS the day picker: you read the week and choose
   from the same object. Everything else stays quiet around it —
   hairline rules, uppercase labels, ink for the week, accent only for
   the choice you have made.
   ================================================================ */

.view { display: none; }
.view.is-active { display: block; animation: view-in 0.3s var(--ease) both; }

@keyframes view-in { from { opacity: 0; transform: translateY(6px); } }

.page-title { margin: 0 0 20px; }

/* ---------- The sign in the window ---------- */

.status {
  display: flex;
  align-items: baseline;
  gap: 9px;
  margin: 0 0 16px;
  font-size: 0.82rem;
}

/* An author `display` beats the UA rule for [hidden], so it needs restating. */
.status[hidden] { display: none; }

.status-mark {
  width: 7px;
  height: 7px;
  flex: none;
  align-self: center;
  border: 1px solid var(--ink);
  opacity: 0.45;
}

.status.is-open .status-mark { background: var(--accent); border-color: var(--accent); opacity: 1; }

.status-label {
  font-family: var(--font-display);
  font-weight: var(--h-weight);
  letter-spacing: var(--h-spacing);
}

.status-detail { opacity: 0.55; }

/* ---------- Week rail ---------- */

.rail-head {
  display: flex;
  align-items: center;
  gap: 10px;
  margin-bottom: 12px;
}

.rail-range {
  flex: 1;
  min-width: 0;
  font-size: 0.66rem;
  text-transform: uppercase;
  letter-spacing: 0.18em;
  opacity: 0.55;
  text-align: center;
}

.rail-step {
  width: 30px;
  height: 30px;
  flex: none;
  display: grid;
  place-items: center;
  padding: 0 0 2px;
  font-size: 1.1rem;
  line-height: 1;
  cursor: pointer;
  color: inherit;
  background: transparent;
  border: var(--line) solid var(--outline);
  border-radius: var(--radius);
}

.rail-step:hover:not([disabled]) { background: color-mix(in srgb, var(--ink) 7%, transparent); }
.rail-step[disabled] { opacity: 0.3; cursor: default; }

.rail {
  --head-h: 36px;
  --track-h: 108px;
  display: flex;
  align-items: flex-start;
  gap: 6px;
}

/* Hour labels, set against the same axis every bar is measured on. */
.rail-axis {
  position: relative;
  flex: none;
  width: 22px;
  height: var(--track-h);
  margin-top: var(--head-h);
}

.rail-axis span {
  position: absolute;
  right: 0;
  transform: translateY(-50%);
  font-size: 0.58rem;
  letter-spacing: 0.06em;
  opacity: 0.4;
}

.rail-days {
  flex: 1;
  min-width: 0;
  display: grid;
  grid-template-columns: repeat(7, 1fr);
  gap: 2px;
}

.day {
  display: flex;
  flex-direction: column;
  padding: 0;
  border: 0;
  background: transparent;
  color: inherit;
  font: inherit;
  text-align: center;
  cursor: pointer;
}

.day[disabled] { cursor: default; opacity: 0.4; }

.day-dow {
  height: 14px;
  font-size: 0.58rem;
  line-height: 14px;
  text-transform: uppercase;
  letter-spacing: 0.12em;
  opacity: 0.5;
}

.day-num {
  height: 22px;
  font-family: var(--font-display);
  font-size: 0.95rem;
  font-weight: var(--h-weight);
  line-height: 22px;
  letter-spacing: var(--h-spacing);
}

.day-track {
  position: relative;
  height: var(--track-h);
  border-bottom: 1px solid var(--outline);
}

/* Hour rules, drawn per column so the gaps between days stay legible. */
.day-track u {
  position: absolute;
  left: 0;
  right: 0;
  height: 1px;
  background: var(--outline);
}

/* The open window itself. */
.day-open {
  position: absolute;
  left: 22%;
  right: 22%;
  background: color-mix(in srgb, var(--ink) 42%, transparent);
  transition: background 0.2s var(--ease), left 0.2s var(--ease), right 0.2s var(--ease);
}

/* Closed: no bar, just a hairline where the day would have been. */
.day-shut {
  position: absolute;
  left: 30%;
  right: 30%;
  top: 50%;
  height: 1px;
  background: var(--outline);
}

/* Where we are in today, on today's column only. */
.day-now {
  position: absolute;
  left: 0;
  right: 0;
  height: 1px;
  background: var(--accent);
}

.day-now::before {
  content: '';
  position: absolute;
  left: -1px;
  top: -2px;
  width: 5px;
  height: 5px;
  background: var(--accent);
}

/* Open and close stacked, so seven columns still fit a 390px phone. */
.day-hours {
  display: flex;
  flex-direction: column;
  margin-top: 7px;
  font-size: 0.58rem;
  line-height: 1.45;
  letter-spacing: 0.01em;
  opacity: 0.45;
  white-space: nowrap;
}

.day-hours b { font-weight: 400; }
.day-hours b + b { opacity: 0.7; }

.day:hover:not([disabled]) .day-open { left: 16%; right: 16%; }
.day.is-today .day-num { color: var(--accent); }

.day.is-selected .day-open { background: var(--accent); left: 14%; right: 14%; }
.day.is-selected .day-dow,
.day.is-selected .day-hours { opacity: 1; }
.day.is-selected .day-num { color: var(--ink); }

.rail-legend {
  margin: 10px 0 30px;
  font-size: 0.72rem;
  opacity: 0.45;
}

/* ---------- Sections ---------- */

.sect { margin-bottom: 30px; }

.sect-label {
  display: flex;
  align-items: center;
  gap: 12px;
  margin: 0 0 14px;
  font-family: var(--font-display);
  font-size: 0.66rem;
  font-weight: var(--h-weight);
  text-transform: uppercase;
  letter-spacing: 0.18em;
  opacity: 0.55;
}

.sect-label::after {
  content: '';
  flex: 1;
  height: 1px;
  background: var(--outline);
}

.sect-note {
  text-transform: none;
  letter-spacing: 0.02em;
  font-family: var(--font-body);
  font-weight: 400;
  opacity: 0.8;
}

/* ---------- Services ---------- */

.svc-list { display: grid; gap: 8px; }

.svc {
  display: flex;
  align-items: baseline;
  gap: 12px;
  width: 100%;
  padding: 13px 15px;
  text-align: left;
  cursor: pointer;
  color: inherit;
  font: inherit;
  background: var(--paper);
  border: var(--line) solid var(--outline);
  border-radius: var(--radius);
  border-left: 2px solid transparent;
}

.svc:hover { border-color: color-mix(in srgb, var(--ink) 35%, transparent); }
.svc.is-selected { border-color: var(--outline); border-left-color: var(--accent); }

.svc-main { flex: 1; min-width: 0; }
.svc-main > span, .svc-side > span { display: block; }

.svc-name {
  font-family: var(--font-display);
  font-size: 0.95rem;
  font-weight: var(--h-weight);
  letter-spacing: var(--h-spacing);
}

.svc-desc { font-size: 0.78rem; opacity: 0.55; margin-top: 2px; }

.svc-side { flex: none; text-align: right; }
.svc-price { font-family: var(--font-display); font-size: 0.9rem; font-weight: var(--h-weight); }
.svc-mins { font-size: 0.68rem; opacity: 0.5; margin-top: 2px; }

/* ---------- Slots ---------- */

.slots {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(74px, 1fr));
  gap: 6px;
}

.slot {
  padding: 10px 4px;
  font: inherit;
  font-size: 0.82rem;
  color: inherit;
  cursor: pointer;
  background: var(--paper);
  border: var(--line) solid var(--outline);
  border-radius: var(--radius);
}

.slot:hover { border-color: color-mix(in srgb, var(--ink) 40%, transparent); }

.slot.is-selected {
  background: var(--accent);
  border-color: var(--accent);
  color: var(--surface);
}

.slot--taken {
  cursor: default;
  opacity: 0.32;
  background: transparent;
  text-decoration: line-through;
}

.slot--taken:hover { border-color: var(--outline); }

/* ---------- Forms and results ---------- */

.form { display: grid; gap: 16px; }
.book-btn { width: 100%; margin-top: 4px; }

.lookup { display: grid; gap: 14px; margin-bottom: 26px; }

.note-line {
  margin: 0;
  padding: 26px 0;
  text-align: center;
  font-size: 0.85rem;
  opacity: 0.45;
}

/* The slot area is a grid; a message in it has to span the whole width rather
   than squeeze itself into one 74px slot-sized column. */
.slots > .note-line,
.slots > .kit-skeleton { grid-column: 1 / -1; }

.hours-table { margin-bottom: 30px; }
.hours-table td { font-size: 0.85rem; }
.hours-table .is-today td { font-weight: 600; }
.hours-table .hours-day { font-family: var(--font-display); letter-spacing: 0.02em; }
.hours-table .hours-time { text-align: right; white-space: nowrap; }

.closures { list-style: none; margin: 0; padding: 0; display: grid; gap: 8px; }

.closures li {
  display: flex;
  justify-content: space-between;
  gap: 14px;
  font-size: 0.82rem;
  padding-bottom: 8px;
  border-bottom: 1px solid var(--outline);
}

.closures .closure-why { opacity: 0.55; }

.fineprint { font-size: 0.75rem; opacity: 0.45; line-height: 1.7; }

/* ---------- The ticket ---------- */

.ticket {
  background: var(--paper);
  border: var(--line) solid var(--outline);
  border-radius: var(--radius);
  box-shadow: var(--shadow);
  padding: 24px 22px;
}

.ticket-kicker {
  font-size: 0.66rem;
  text-transform: uppercase;
  letter-spacing: 0.18em;
  opacity: 0.5;
}

.ticket-when {
  font-family: var(--font-display);
  font-size: 1.5rem;
  font-weight: var(--h-weight);
  letter-spacing: var(--h-spacing);
  line-height: 1.2;
  margin: 6px 0 18px;
}

.ticket-rows { display: grid; gap: 0; margin-bottom: 20px; }

.ticket-row {
  display: flex;
  justify-content: space-between;
  gap: 16px;
  padding: 9px 0;
  font-size: 0.82rem;
  border-bottom: 1px solid var(--outline);
}

.ticket-row:last-child { border-bottom: 0; }
.ticket-row dt { margin: 0; opacity: 0.5; }
.ticket-row dd { margin: 0; text-align: right; }

.ticket-ref {
  font-family: var(--font-display);
  font-size: 1.05rem;
  font-weight: 700;
  letter-spacing: 0.22em;
}

.ticket-foot { margin: 0 0 18px; font-size: 0.75rem; opacity: 0.45; }

.ticket-actions { display: flex; flex-wrap: wrap; gap: 10px; }
.ticket-actions .kit-btn { flex: 1; min-width: 130px; }

.mine-list { display: grid; gap: 12px; }
.mine-list .ticket { padding: 18px 20px; }

/* ---------- Toast ---------- */

.toast-wrap {
  position: fixed;
  left: 50%;
  bottom: 74px;
  z-index: 45;
  transform: translateX(-50%);
  width: min(420px, calc(100vw - 32px));
  display: grid;
  gap: 8px;
  pointer-events: none;
}

.toast-wrap .kit-toast { animation: toast-in 0.28s var(--ease) both; }

@keyframes toast-in { from { opacity: 0; transform: translateY(10px); } }

@media (max-width: 430px) {
  .rail { --track-h: 96px; }
  .day-hours { font-size: 0.54rem; letter-spacing: 0; }
  .slots { grid-template-columns: repeat(auto-fill, minmax(66px, 1fr)); }
}

@media (prefers-reduced-motion: reduce) {
  .view.is-active, .toast-wrap .kit-toast { animation: none; }
  .day-open { transition: none; }
}
