/* ===== Peertje custom styles ===== */

:root {
  --pink-50: #fde9ef;
  --pink-100: #fbd0dc;
  --mint-50: #e7f4f0;
  --mint-200: #b9e2d3;
  --lavender: #6b5a8a;
  --lavender-dark: #4d4068;
  --cream: #f7f3ec;
  --accent-magenta: #e63b7a;
  --accent-green: #7ed957;
  --accent-yellow: #ffd145;
  --accent-blue: #2e7fb8;
  --ink: #161616;
  /* Spaties, geen komma's: deze waarde gaat in Tailwind's
     `rgb(var(--ink-rgb) / <alpha-value>)`, en `rgb(22, 22, 22 / .4)` is
     ongeldig — dan valt elke text-ink/40, border-ink/15 enz. stil terug op
     de volle inktkleur. `rgb(22 22 22 / .4)` klopt wél. */
  --ink-rgb: 22 22 22;
  /* Overridden by assets/brand.php when huisstijl sets a custom / Google font. */
  --brand-font: 'Inter', system-ui, -apple-system, sans-serif;
}

html, body {
  background: var(--cream);
  color: var(--ink);
  font-family: var(--brand-font);
  -webkit-font-smoothing: antialiased;
}
html {
  overflow-x: clip;
}
body.has-page-shell {
  overflow-x: clip;
}

main {
  min-height: 100vh;
}

/* ----- Decorative photo (rounded, no frame) ----- */
.photo-deco {
  border-radius: 10px;
  object-fit: cover;
  box-shadow:
    0 1px 2px rgba(0,0,0,.08),
    0 10px 24px -10px rgba(0,0,0,.25);
  transition: transform .35s cubic-bezier(.2,.7,.2,1);
  will-change: transform;
}
.photo-deco:hover {
  transform: rotate(0deg) scale(1.05) !important;
  z-index: 5;
}

/* Credited hero photos: wrapper holds the photo + a marker-style credit label,
   so the credit travels with the photo's tilt / parallax / hover. */
.photo-deco--credited {
  box-shadow: none;
}
.photo-deco--credited > img {
  width: 100%;
  height: 100%;
  border-radius: 10px;
  object-fit: cover;
  box-shadow:
    0 1px 2px rgba(0,0,0,.08),
    0 10px 24px -10px rgba(0,0,0,.25);
}
.photo-credit {
  position: absolute;
  display: inline-flex;
  align-items: center;
  gap: calc(14px * var(--cs, 1));
  max-width: calc(9rem * var(--cs, 1));
  color: var(--ink);
  opacity: .5;
  pointer-events: none;
  white-space: nowrap;
  transform-origin: center center;
  font-family: 'Permanent Marker', 'Inter', cursive;
  font-size: calc(13px * var(--cs, 1));
  line-height: 1;
  z-index: 1;
}
.photo-credit__arrow {
  width: calc(26px * var(--cs, 1));
  height: calc(26px * var(--cs, 1));
  flex: none;
  opacity: .85;
  transform-origin: center center;
  overflow: visible;
}
.photo-credit__name {
  letter-spacing: .01em;
  flex: none;
}
.photo-credit__van {
  position: relative;
  top: calc(-5px * var(--cs, 1));
  left: calc(-5px * var(--cs, 1));
  font-size: calc(9px * var(--cs, 1));
  opacity: .85;
}

/* ===== Hero swipe canvas ===== */
/* min-height is animated from JS (explicit px → px) so it eases gracefully;
   transitioning from the initial `auto` value would just jump. */
.hero-section { transition: min-height .45s cubic-bezier(.2,.7,.2,1); }

.hero-canvas {
  position: absolute;
  inset: 0;
  z-index: 0;
  overflow: hidden;
  cursor: grab;
  touch-action: none;
  user-select: none;
  -webkit-user-select: none;
  /* Match whatever corners .hero-section currently has (it varies inline
     depending on whether the Solaris ticker is capping the top). */
  border-radius: inherit;
}
.hero-canvas.is-grabbing { cursor: grabbing; }
.hero-canvas__track {
  position: absolute;
  inset: 0;
}
.hero-tile {
  position: absolute;
  top: 0;
  left: 0;
  overflow: visible;
  opacity: 0;
  will-change: transform, opacity;
  transition: opacity .7s ease-out;
}
.hero-tile.is-visible { opacity: 1; }
.hero-tile > img {
  display: block;
  width: 100%;
  height: 100%;
  border-radius: 12px;
  object-fit: contain;
  box-shadow:
    0 1px 2px rgba(0,0,0,.08),
    0 14px 30px -12px rgba(0,0,0,.32);
  pointer-events: none;
  -webkit-user-drag: none;
}
.hero-canvas__hint {
  position: absolute;
  right: 16px;
  bottom: 12px;
  z-index: 2;
  font-family: 'Permanent Marker', 'Inter', cursive;
  font-size: 13px;
  color: var(--ink);
  opacity: .42;
  pointer-events: none;
  transition: opacity .4s ease;
}
.hero-canvas.is-grabbing .hero-canvas__hint,
.hero-canvas.has-explored .hero-canvas__hint { opacity: 0; }

/* Hero greeting fades as you drag through the photos */
[data-hero-content] {
  position: relative;
  z-index: 10;
  transition: opacity .25s ease, transform .25s ease;
}
/* Soft scrim keeps the greeting legible over the photos (fades out with it) */
[data-hero-content]::before {
  content: "";
  position: absolute;
  inset: -12% -6%;
  z-index: -1;
  pointer-events: none;
  background: radial-gradient(60% 62% at 50% 44%, rgba(253,233,239,.94), rgba(253,233,239,0));
}
@media (prefers-color-scheme: dark) {
  [data-hero-content]::before {
    background: radial-gradient(60% 62% at 50% 44%, rgba(33,19,26,.94), rgba(33,19,26,0));
  }
}

/* ----- Floating edge photos (subpages): scroll with page, in side gutters ----- */
.page-shell {
  position: relative;
  overflow-x: clip;
}
.page-edge-deco {
  display: none;
  position: absolute;
  inset: 0;
  pointer-events: none;
  z-index: 1;
  /* No overflow clip here on purpose: mixing overflow-x:hidden with
     overflow-y:visible makes the browser compute overflow-y as `auto`
     (per the CSS overflow spec), which turned this box into its own
     scroll container — a second scrollbar next to the page's. Horizontal
     clipping (needed so peeking photos don't cause a horizontal
     scrollbar) is already handled by .page-shell's overflow-x: clip
     above; this box just needs to stay unclipped vertically. */
}
@media (min-width: 900px) {
  .page-edge-deco {
    display: block;
  }
}
/* The frame is the parallax-positioned element: it never rotates or
   scales, so its own box — the thing that counts towards the page's
   scrollable area — never changes. It clips (overflow: hidden) an inner
   padding ring around the photo, big enough to absorb the un-tilt +
   scale-up on hover without visibly cropping it. That keeps the tilt/
   hover animation on the photo itself while making it impossible for
   that animation to perturb the document's scrollHeight (which used to
   yank the scroll position back when the bottom-most photo un-hovered). */
.page-edge-deco__frame {
  position: absolute;
  overflow: hidden;
  pointer-events: none;
  box-sizing: border-box;
  transition: transform .35s cubic-bezier(.2,.7,.2,1);
}
/* Fit in side gutter + outward peek; never overlap max-w-3xl (48rem) column */
.page-edge-deco__frame--left,
.page-edge-deco__frame--right {
  max-width: calc((100vw - min(48rem, 100vw - 2rem)) / 2 + 72px);
}
.page-edge-deco__photo {
  display: block;
  width: 100%;
  height: 100%;
  object-fit: cover;
  pointer-events: auto;
  opacity: 0;
  transition: opacity .4s ease, transform .35s cubic-bezier(.2,.7,.2,1);
}
.page-edge-deco__photo.is-loaded {
  opacity: 1;
}

/* ----- Display headline ----- */
.display {
  letter-spacing: -0.035em;
  font-weight: 800;
  line-height: 0.95;
}

/* ----- Avatar pin (colored border card w/ floating avatars) ----- */
.pin-card {
  position: relative;
  background: #fff;
  border-radius: 12px;
  border: 3px solid currentColor;
}
.pin-card__avatars {
  position: absolute;
  top: -28px;
  left: 22px;
  display: flex;
  gap: -8px;
}
.pin-avatar {
  width: 46px;
  height: 56px;
  border-radius: 28px 28px 28px 6px;
  background: currentColor;
  display: grid;
  place-items: center;
  padding: 4px;
  box-shadow: 0 4px 10px rgba(0,0,0,.15);
}
.pin-avatar + .pin-avatar { margin-left: -14px; }
.pin-avatar img {
  width: 100%;
  height: 100%;
  border-radius: 24px 24px 24px 4px;
  object-fit: cover;
  display: block;
}

/* ----- Dashed schedule rows ----- */
.schedule-row {
  display: grid;
  grid-template-columns: 170px 1fr;
  align-items: center;
  gap: 20px;
  padding: 14px 12px;
  border-bottom: 2px dotted rgba(255,255,255,.25);
  transition: background .15s ease;
  text-decoration: none;
  color: inherit;
  cursor: pointer;
}
.schedule-row:last-child { border-bottom: 0; }
.schedule-row:hover {
  background: rgba(255,255,255,.1);
  transform: translateX(2px);
}
.schedule-row .time {
  font-style: italic;
  color: rgba(255,255,255,.6);
  font-weight: 500;
  font-size: 1.05rem;
  font-variant-numeric: tabular-nums;
}
.schedule-row .title {
  color: #fff;
  font-weight: 700;
  font-size: 1.2rem;
}

/* ----- Day pill ----- */
.day-pill {
  display: inline-flex;
  align-items: center;
  padding: 14px 22px;
  font-weight: 800;
  font-size: 0.95rem;
  letter-spacing: 0.04em;
  border: 0;
  cursor: pointer;
  color: var(--ink);
  background: rgba(255,255,255,.35);
  transition: background .15s ease;
}
.day-pill:hover { background: rgba(255,255,255,.5); }
.day-pill.is-active {
  background: var(--accent-green);
  color: var(--ink);
}
/* Element-level opacity must never apply in the stuck (camera-ring) state:
   it dims the whole pill as one unit, so the capsule's clip mask can't
   split icon+text into a dark inside half and a white outside half — the
   pill just reads as uniformly grey. Outside the stuck state there is no
   clip effect, so the dimming is kept there. */
.page-nav:not(.is-stuck) a.page-nav__pill {
  opacity: 0.6;
  border-color: #cbcbcb;
}

.page-nav:not(.is-stuck) a.page-nav__pill.is-active {
  opacity: 1.0;
  border-color: #444444;
  /* Thicken the ring with an inset shadow, NOT border-width. A border-width
     change alters the pill's box size, so every .is-stuck toggle silently
     reflowed the whole strip by ~1px — invalidating the cached pill offsets
     mid-scroll, which shifted the capsule off its pill and let scroll-settle
     snap to a different tab entirely. Inset shadow costs no layout. */
  box-shadow: inset 0 0 0 0.5px #444444;
  outline: unset;
}
/* ----- Sticky bottom bar ----- */
.sticky-bar {
  position: fixed;
  left: 0; right: 0; bottom: 0;
  background: rgba(20,20,22,.92);
  backdrop-filter: blur(8px);
  color: #fff;
  z-index: 50;
}

/* ----- Logo tag (STUDIO/K style overlay) ----- */
.logo-tag {
  background: var(--ink);
  color: var(--cream);
  padding: 10px 18px;
  font-weight: 800;
  letter-spacing: 0.04em;
  display: inline-block;
  box-shadow: 0 4px 14px rgba(0,0,0,.1);
}

/* ----- Birthday card ----- */
.bday-card {
  background: #fff;
  border-radius: 12px;
  padding: 18px;
  border: 2px solid var(--ink);
}

/* ----- Home entrance: fade up 20px, staggered ----- */
@keyframes home-rise {
  from { opacity: 0; transform: translateY(20px); }
  to   { opacity: 1; transform: translateY(0); }
}
.home-reveal {
  animation: home-rise .65s cubic-bezier(.22, 1, .36, 1) backwards;
  animation-delay: calc(var(--d, 0) * 70ms);
}
@media (prefers-reduced-motion: reduce) {
  .home-reveal { animation: none; }
}

/* ----- Action button ----- */
/* Bold tile buttons — same family as the countdown cells */
.action-list {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: 14px;
}
@media (max-width: 640px) {
  .action-list { grid-template-columns: 1fr; }
}
.action-btn {
  background: #fff;
  border: 2px solid var(--ink);
  border-radius: 12px;
  padding: 16px 18px;
  font-weight: 700;
  display: flex;
  align-items: center;
  gap: 14px;
  text-align: left;
  cursor: pointer;
  color: var(--ink);
  text-decoration: none;
  width: 100%;
  box-shadow: 3px 3px 0 var(--ink);
  transition: transform .12s ease, box-shadow .12s ease;
}
.action-btn:hover {
  transform: translate(-2px, -2px);
  box-shadow: 5px 5px 0 var(--ink);
}
.action-btn:active {
  transform: translate(1px, 1px);
  box-shadow: 2px 2px 0 var(--ink);
}
.action-btn .ico { transition: transform .25s ease; }
.action-btn:hover .ico { transform: rotate(-6deg) scale(1.08); }
.action-btn:hover .chev { transform: translateX(4px); }
.action-btn .chev { transition: transform .2s ease; }
.action-btn .ico {
  width: 36px; height: 36px;
  border-radius: 8px;
  display: grid; place-items: center;
  flex: none;
  font-size: 18px;
}

/* ----- Week-off chip card ----- */
.week-chip {
  background: #fff;
  border-radius: 12px;
  padding: 16px 18px;
  border: 2px solid var(--ink);
  min-width: 180px;
  box-shadow: 3px 3px 0 var(--ink);
  transition: transform .12s ease, box-shadow .12s ease;
  cursor: pointer;
}
.week-chip:hover {
  transform: translate(-2px, -2px);
  box-shadow: 5px 5px 0 var(--ink);
}
.week-chip:active {
  transform: translate(1px, 1px);
  box-shadow: 2px 2px 0 var(--ink);
}

/* ----- Feed photo: reserved aspect + gray shimmer until decode ----- */
.feed-photo {
  position: relative;
  width: 100%;
  background: #e5e2db;
  overflow: hidden;
}
.feed-photo::after {
  content: '';
  position: absolute;
  inset: 0;
  background: linear-gradient(
    105deg,
    transparent 35%,
    rgba(255, 255, 255, .55) 50%,
    transparent 65%
  );
  transform: translateX(-100%);
  animation: feed-photo-shimmer 1.25s ease-in-out infinite;
  pointer-events: none;
}
.feed-photo.is-loaded::after {
  display: none;
}
.feed-photo__img {
  display: block;
  width: 100%;
  height: auto;
  vertical-align: top;
  opacity: 0;
  transition: opacity .28s ease;
}
.feed-photo.is-loaded .feed-photo__img {
  opacity: 1;
}
@keyframes feed-photo-shimmer {
  to { transform: translateX(100%); }
}
@media (prefers-reduced-motion: reduce) {
  .feed-photo::after {
    animation: none;
    opacity: .35;
    transform: none;
    background: rgba(255, 255, 255, .25);
  }
  .feed-photo__img { transition: none; }
}

/* ----- Feed view switcher: 3-column square grid ----- */
.feed-view-btn.text-ink { background: rgba(0, 0, 0, .06); }
#feed-list.feed-list--grid {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 3px;
  align-items: start;
}
/* Override the space-y-4 utility's margin-top, which otherwise throws off
   row heights/alignment in the grid (Tailwind's :not(:first-child) selector
   still matches inside a grid). */
#feed-list.feed-list--grid > * {
  margin-top: 0 !important;
}
#feed-list.feed-list--grid .feed-card {
  border: none;
  box-shadow: none;
  /* Only the outer corners of the whole grid are rounded — individual
     tiles are square so the grid reads as one continuous block. */
  border-radius: 0;
  cursor: pointer;
}
/* Match the rounded-xl radius used by individual (list-view) posts, but
   only on the tiles that sit at a corner of the 3-column grid. */
#feed-list.feed-list--grid .feed-card:first-child {
  border-top-left-radius: 0.75rem;
}
#feed-list.feed-list--grid .feed-card:nth-child(3),
#feed-list.feed-list--grid .feed-card:nth-child(-n+3):last-child {
  border-top-right-radius: 0.75rem;
}
#feed-list.feed-list--grid .feed-card:nth-child(3n+1):nth-last-child(-n+3) {
  border-bottom-left-radius: 0.75rem;
}
#feed-list.feed-list--grid .feed-card:last-child {
  border-bottom-right-radius: 0.75rem;
}
#feed-list.feed-list--grid .feed-card__header {
  display: none;
}
#feed-list.feed-list--grid .feed-photo {
  aspect-ratio: 1 / 1 !important;
}
#feed-list.feed-list--grid .feed-photo__img {
  width: 100%;
  height: 100%;
  object-fit: cover;
}

/* ----- Archive list (BSH archief) ----- */
.archive-description {
  font-size: 0.92rem;
  color: var(--ink);
  opacity: 0.6;
  margin-bottom: 1.25rem;
}
.archive-list {
  display: flex;
  flex-direction: column;
  gap: 10px;
}
.archive-item {
  background: #fff;
  border: 2px solid var(--ink);
  border-radius: 12px;
  box-shadow: 3px 3px 0 var(--ink);
  transition: transform .12s ease, box-shadow .12s ease;
}
.archive-item:hover {
  transform: translate(-2px, -2px);
  box-shadow: 5px 5px 0 var(--ink);
}
.archive-item:active {
  transform: translate(1px, 1px);
  box-shadow: 2px 2px 0 var(--ink);
}
/* De lijst staat in <article class="prose">, maar is geen lopende tekst. De
   prose-regels voor koppen en links zijn even specifiek als een kale
   .archive-item-selector en staan later in dit bestand, dus deze component
   moet met .prose ervoor geschreven worden om te winnen. */
.prose .archive-list > * + * { margin-top: 0; }
.archive-item a,
.prose .archive-item a {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 12px;
  padding: 14px 18px;
  color: var(--ink);
  text-decoration: none;
}
.archive-item h2,
.prose .archive-item h2 {
  display: block;
  margin: 0 0 2px;
  font-size: 1rem;
  font-weight: 700;
  letter-spacing: normal;
  color: var(--ink);
  line-height: 1.3;
}
.archive-item h2::before,
.prose .archive-item h2::before { content: none; display: none; }
.archive-item .deadline {
  font-size: 0.8rem;
  font-weight: 500;
  color: var(--ink);
  opacity: 0.5;
  font-style: normal;
  margin: 0;
}
.archive-item__year {
  margin-left: .5rem;
  font-size: .8rem;
  font-weight: 600;
  opacity: .45;
}
.archive-item .chev {
  font-size: 1rem;
  font-weight: 700;
  opacity: 0.4;
  flex: none;
  transition: transform .15s ease, opacity .15s ease;
}
.archive-item:hover .chev { transform: translateX(3px); opacity: 0.7; }
.archive-empty {
  border: 2px dashed rgba(22,22,22,.18);
  border-radius: 12px;
  padding: 1.75rem 1.25rem;
  text-align: center;
}
.archive-empty__title { font-weight: 700; margin: 0 0 .25rem; }
.archive-empty__text  { font-size: .875rem; opacity: .55; margin: 0; }

@media (prefers-color-scheme: dark) {
  .archive-item {
    background: #1e1e1e;
    border-color: rgba(228,223,216,.2);
    box-shadow: 3px 3px 0 rgba(228,223,216,.15);
  }
  .archive-item:hover  { box-shadow: 5px 5px 0 rgba(228,223,216,.2); }
  .archive-item:active { box-shadow: 2px 2px 0 rgba(228,223,216,.12); }
  .archive-empty { border-color: rgba(228,223,216,.22); }
}

.status-dot {
  display: inline-block;
  width: 8px; height: 8px;
  border-radius: 50%;
  margin-right: 6px;
  vertical-align: middle;
}

/* ----- Section card ----- */
.section {
  border-radius: 14px;
  padding: 40px 36px;
  position: relative;
  overflow: hidden;
}
/* Content die doorloopt tot de randen van de .section-kaart, terwijl de
   tekst erin nog netjes uitlijnt met de rest van de content:
   .section-bleed      → padding op de wrapper zelf (scrollers, blokken)
   .section-bleed-list → padding op de rijen, zodat scheidingslijnen en
                         hover-vlakken wél van rand tot rand lopen. */
.section-bleed,
.section-bleed-list {
  --section-pad: 36px;
  margin-left: calc(var(--section-pad) * -1);
  margin-right: calc(var(--section-pad) * -1);
}
.section-bleed {
  padding-left: var(--section-pad);
  padding-right: var(--section-pad);
  scroll-padding-left: var(--section-pad);
  scroll-padding-right: var(--section-pad);
}
.section-bleed-list > * {
  padding-left: var(--section-pad);
  padding-right: var(--section-pad);
}

@media (max-width: 640px) {
  .section { padding: 28px 22px; border-radius: 12px; }
  .section-bleed,
  .section-bleed-list { --section-pad: 22px; }
  .schedule-row { grid-template-columns: 130px 1fr; gap: 12px; padding: 12px 8px; }
  .schedule-row .time { font-size: 0.9rem; }
  .schedule-row .title { font-size: 1.05rem; }
}

/* fade-in when switching tab content */
[data-day-panel] { display: none; }
[data-day-panel].is-active { display: block; animation: fadeIn .18s ease; }
@keyframes fadeIn { from { opacity: 0; transform: translateY(4px); } to { opacity: 1; transform: none; } }

/* Active tab panel always tall enough that the page can scroll past navTop */
.tab-panel:not(.hidden) { min-height: 100vh; }

/* ----- Page nav (horizontal scroller with edge fades) ----- */
.page-nav {
  position: sticky;
  /* Sit below the notch/status bar in PWA (viewport-fit=cover). 0 on
     devices with no inset. Sticky `top` only applies when docked — no
     mid-page gap above the pills. */
  top: env(safe-area-inset-top, 0px);
  z-index: 50;
  margin: 0;
  /* Scrubbed stuck bg: 0→1 over 63px of scroll AFTER sticky docks (app.js).
     Wipe stops are pixel lengths set by JS (--nav-wipe-solid / --nav-wipe-end)
     so the bar and L/R fades share one identical edge (%-based masks on
     different layers were compositing a stepped seam). */
  --nav-stuck-progress: 0;
  --nav-stuck-feather: 14px;
  --nav-wipe-solid: -14px;
  --nav-wipe-end: 0px;
  /* Bar + black edge fades: opaque above the wipe, feather to transparent. */
  --nav-mask-y: linear-gradient(
    to bottom,
    #000 0%,
    #000 var(--nav-wipe-solid),
    transparent var(--nav-wipe-end)
  );
  /* Cream edge fades: only BELOW the wipe end (hard cut — no feather overlap,
     which was shifting the left scrub line up vs the bar). */
  --nav-mask-y-inv: linear-gradient(
    to bottom,
    transparent 0%,
    transparent var(--nav-wipe-end),
    #000 var(--nav-wipe-end)
  );
}
.tab-panel {
  min-height: 100vh !important;
}
/* Full-width stuck background — extends beyond the max-w-5xl container via
   left:50% + translateX(-50%) + width:100vw. One continuous bar scrubbed
   in from the top; L/R pill fades are a separate overlay. */
.page-nav::before {
  content: '';
  position: absolute;
  top: 0;
  bottom: 0;
  left: 50%;
  width: 100vw;
  transform: translateX(-50%);
  /* Subtle warm-dark centre, pure black toward the ring's edges */
  background: radial-gradient(ellipse 60% 300% at 50% 50%, #161311 0%, #000 100%);
  -webkit-mask-image: var(--nav-mask-y);
  mask-image: var(--nav-mask-y);
  z-index: -1;
  pointer-events: none;
}

/* Installed PWA only: the status bar is translucent (see apple-mobile-web-app
   -status-bar-style), so it shows whatever's painted behind it — normally the
   page's own background, but once the pill nav sticks that clashes with its
   black bar right below. Fade the safe area to black with the same scrub. */
.pwa-status-fill {
  display: none;
  --nav-stuck-progress: 0;
}
@media (display-mode: standalone) {
  .pwa-status-fill {
    display: block;
    position: fixed;
    top: 0;
    left: 0;
    right: 0;
    height: env(safe-area-inset-top);
    background: #000;
    /* Progress-driven only — .is-stuck now turns on at progress > 0 for
       pill layers, so it must NOT force opacity: 1 here. */
    opacity: var(--nav-stuck-progress);
    z-index: 51;
    pointer-events: none;
  }
}

.page-nav__scroll {
  display: flex;
  position: relative;
  gap: 8px;
  overflow-x: auto;
  padding: 10px 50%;
  scroll-padding: 0 50%;
  scroll-snap-type: x mandatory;
}
/* Sliding active-pill highlight. It is pinned dead-center of the pill row
   at all times (pure CSS, never JS-positioned) — only its width/height
   morph between the two pills straddling the current swipe/scroll progress
   (see updateIndicator in index.php). The pill row itself is what moves
   (scrollLeft) to bring pills to/from center, so there's a single source
   of motion instead of the capsule and the scroll position each trying to
   independently track "centered," which is what read as blinking/jumping.
   IMPORTANT: this must live OUTSIDE .page-nav__scroll (a sibling, not a
   child) — .page-nav__scroll scrolls, and an absolutely positioned child
   of a scrolling container scrolls right along with its content even
   though "left:50%" is a fixed pixel value, so it would drift out of view
   as the pill row scrolls. Positioned against .page-nav instead (which
   never scrolls), left:50% always means the nav bar's true visual center. */
.page-nav__indicator {
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  width: 0; height: 0;
  border-radius: 999px;
  background: #fff;
  box-shadow: 0 0 0 1.5px rgba(22, 22, 22, .12);
  pointer-events: none;
  /* Above the real pills (z-index 1), below the ghost row (3). Being an
     OPAQUE layer painted over the pills is what removes the need for any
     per-pill masking: whatever a pill draws, the capsule simply covers it
     inside its own footprint, and the ghost row redraws it dark on top. */
  z-index: 2;
  will-change: width, height;
}
.page-nav__indicator.is-animated {
  transition: width .28s cubic-bezier(0.25, 0.46, 0.45, 0.94),
              height .28s cubic-bezier(0.25, 0.46, 0.45, 0.94),
              box-shadow .2s ease;
}
.page-nav.is-stuck .page-nav__indicator {
  /* Capsule fades in with the scrub (opacity), glow scales with it too. */
  opacity: var(--nav-stuck-progress);
  box-shadow:
    0 0 calc(18px * var(--nav-stuck-progress)) rgba(255, 255, 255, calc(0.14 * var(--nav-stuck-progress))),
    0 0 calc(5px * var(--nav-stuck-progress)) rgba(255, 255, 255, calc(0.22 * var(--nav-stuck-progress)));
}
.page-nav.is-stuck .page-nav__ghost-row {
  opacity: var(--nav-stuck-progress);
}

/* Ghost row — the "inside the capsule" layer. A single duplicate of the
   whole pill row, drawn dark-on-white, clipped by ONE clip-path to exactly
   the capsule's rectangle (see updateIndicator in index.php).

   It lives inside .page-nav__scroll, so it scrolls in native lockstep with
   the real pills — nothing to sync. And because it's one element, the
   reveal is a single clip-path write per frame instead of per-pill mask
   maths, which is what kept going subtly wrong. */
.page-nav__ghost-row {
  position: absolute;
  top: 0;
  left: 0;
  z-index: 3;
  pointer-events: none;
}
/* Descendant selector, not a bare .page-nav__pill-ghost: the clones also
   carry .page-nav__pill, whose rule appears LATER in this file with equal
   specificity and would otherwise win `position: relative`. That dropped
   every clone into normal flow inside the row — turning left/top into
   relative nudges off a flow position — so the ghost track drifted out of
   register with the real pills instead of sitting exactly on top of them. */
.page-nav__ghost-row .page-nav__pill-ghost {
  position: absolute;
  margin: 0;
  pointer-events: none;
  opacity: 1 !important;
  background: transparent !important;
  border-color: transparent !important;
  box-shadow: none !important;
  color: #161616 !important;
}
/* No capsule and no inversion outside the stuck state: there the pills are
   already dark-on-light, so both layers would just double up. */
.page-nav:not(.is-stuck) .page-nav__ghost-row,
.page-nav:not(.is-stuck) .page-nav__indicator {
  display: none;
}
/* The ghost is the "inside the capsule" layer, so it always renders the
   solid icon — never the line one — regardless of its source pill's active
   state. Paired with the real pill keeping the line icon while stuck, the
   mask edge sweeping across a pill converts its icon line→solid in step
   with the capsule covering it. Both variants share a viewBox and a fixed
   18px box, so they occupy identical space and the swap happens purely at
   the mask boundary with no reflow or glyph shift. */
.page-nav__pill-ghost .pill-icon--line { display: none !important; }
.page-nav__pill-ghost .pill-icon--solid { display: block !important; }

/* Drag-to-scroll: grab cursor on pointer devices that can hover (desktop) */
@media (hover: hover) and (pointer: fine) {
  .page-nav__scroll { cursor: grab; }
  .page-nav__scroll.is-dragging { cursor: grabbing; }
}
/* While actively dragging: free-scroll (no snap) and don't let pills swallow the drag */
.page-nav__scroll.is-dragging {
  scroll-snap-type: none;
  scroll-behavior: auto;
  user-select: none;
}
.page-nav__scroll.is-dragging .page-nav__pill {
  pointer-events: none;
}
.page-nav__pill {
  position: relative;
  z-index: 1;
  flex: none;
  display: inline-flex;
  align-items: center;
  padding: 9px 18px;
  border-radius: 999px;
  background: #fff;
  border: 1.5px solid var(--ink);
  color: var(--ink);
  font-weight: 700;
  font-size: 0.92rem;
  white-space: nowrap;
  text-decoration: none;
  scroll-snap-align: center;
  /* No transition on background/color/border-color: the active-state swap
     must be an instant hard cut, not a crossfade, or it visually competes
     with the sliding capsule's own motion instead of snapping cleanly the
     moment a pill settles. box-shadow alone still eases for a soft glow-in. */
  transition: box-shadow .2s ease;
}
.page-nav__pill:hover { background: var(--ink); color: #fff; }
.pill-icon {
  width: 18px;
  height: 18px;
  flex: none;
  margin-right: 6px;
  margin-left: -2px;
}
.pill-icon--solid { display: none; }
/* Active real pills always keep the solid icon — including during the stuck
   scrub. Switching to line when .is-stuck flipped on caused a solid→line→
   solid flash across the progression; the ghost row still supplies solid
   inside the capsule at the end. Inactive pills keep the line icon. */
.page-nav__pill.is-active:not(.page-nav__pill-ghost) .pill-icon--line { display: none; }
.page-nav__pill.is-active:not(.page-nav__pill-ghost) .pill-icon--solid { display: block; }
.page-nav__pill.is-active {
  background: #fff;
  color: #161616;
  border-color: transparent;
  box-shadow: 0 0 0 1.5px rgba(22, 22, 22, .12);
}

/* Pill overrides while scrubbing into / sitting on the camera-ring bg.
   At progress 0→1 the light pills dissolve into the "outside the capsule"
   look: plain white icon+text, no fill of their own. Borders fade from the
   light-state greys (#cbcbcb / #444) straight to transparent — never through
   a full ink/black ring, which read as a third intermediate state.

   !important is load-bearing: the dark-mode block later in this file
   redefines pill colours, and it previously re-added background:#fff on the
   active stuck pill — producing a second welded-on capsule. Ghost clones
   are excluded; they own their own dark styling. */
.page-nav.is-stuck .page-nav__pill:not(.page-nav__pill-ghost) {
  background: rgba(255, 255, 255, calc(1 - var(--nav-stuck-progress))) !important;
  box-shadow: none !important;
  color: color-mix(
    in srgb,
    #fff calc(var(--nav-stuck-progress) * 100%),
    var(--ink)
  ) !important;
}
.page-nav.is-stuck a.page-nav__pill:not(.page-nav__pill-ghost):not(.is-active) {
  /* #cbcbcb → transparent (same grey as the light inactive ring) */
  border-color: rgba(203, 203, 203, calc(1 - var(--nav-stuck-progress))) !important;
  opacity: calc(0.6 + 0.4 * var(--nav-stuck-progress));
}
.page-nav.is-stuck a.page-nav__pill.is-active:not(.page-nav__pill-ghost) {
  /* #444 → transparent (same as the light active ring), not ink black */
  border-color: rgba(68, 68, 68, calc(1 - var(--nav-stuck-progress))) !important;
  opacity: 1;
}

/* Wide edge fades — 25vw, pinned to the viewport edges (same centering math
   as .page-nav::before) so they don't start at the padded nav box and seam
   against the full-bleed bar. Cream below the wipe; black above it; both
   masks share --nav-wipe-* pixels from app.js. */
.page-nav__fade {
  position: absolute;
  top: 0; bottom: 0;
  left: 50%;
  width: 25vw;
  pointer-events: none;
  z-index: 5; /* above .page-nav__pill (1) / .page-nav__pill-ghost (2) so pill text fades out under it instead of sitting on top */
  overflow: hidden;
  background: none;
}
.page-nav__fade::before,
.page-nav__fade::after {
  content: '';
  position: absolute;
  inset: 0;
}
.page-nav__fade::before {
  -webkit-mask-image: var(--nav-mask-y-inv);
  mask-image: var(--nav-mask-y-inv);
}
.page-nav__fade::after {
  -webkit-mask-image: var(--nav-mask-y);
  mask-image: var(--nav-mask-y);
}
.page-nav__fade--l {
  transform: translateX(-50vw);
}
.page-nav__fade--l::before {
  background: linear-gradient(to right, var(--cream), transparent);
}
.page-nav__fade--l::after {
  background: linear-gradient(to right, #000, transparent);
}
.page-nav__fade--r {
  transform: translateX(25vw);
}
.page-nav__fade--r::before {
  background: linear-gradient(to left, var(--cream), transparent);
}
.page-nav__fade--r::after {
  background: linear-gradient(to left, #000, transparent);
}

/* ----- Beschikbaarheid (urgent) ----- */
.beschikbaarheid {
  background: linear-gradient(180deg, #fff5f8 0%, var(--mint-50) 100%);
  border: 2px solid rgba(230,59,122,.55);
  position: relative;
}
.beschikbaarheid--deadline-passed {
  background: linear-gradient(180deg, #fff9eb 0%, var(--cream) 100%);
  border-color: rgba(255,209,69,.7);
}
.beschikbaarheid--deadline-passed .text-magenta {
  color: #b8860b;
}
.beschikbaarheid--valid {
  background: linear-gradient(180deg, #f0faf0 0%, var(--mint-50) 100%);
  border-color: rgba(126,217,87,.55);
}
.beschikbaarheid--empty {
  background: linear-gradient(180deg, var(--cream) 0%, var(--mint-50) 100%);
  border-color: rgba(17,17,17,.12);
}
.beschikbaarheid__status {
  max-width: 36rem;
  line-height: 1.5;
}
.beschikbaarheid__pulse {
  position: absolute; inset: -2px;
  border-radius: inherit;
  pointer-events: none;
  box-shadow: 0 0 0 0 rgba(230,59,122,.4);
  animation: urgentPulse 2.4s ease-out infinite;
}
@keyframes urgentPulse {
  0%   { box-shadow: 0 0 0 0   rgba(230,59,122,.35); }
  70%  { box-shadow: 0 0 0 14px rgba(230,59,122,0); }
  100% { box-shadow: 0 0 0 0   rgba(230,59,122,0); }
}
@keyframes pingSlow {
  0%, 100% { transform: scale(1); opacity: 1; }
  50%      { transform: scale(2.4); opacity: 0; }
}
.animate-ping-slow {
  position: relative;
}
.animate-ping-slow::after {
  content: '';
  position: absolute; inset: 0;
  border-radius: inherit;
  background: inherit;
  animation: pingSlow 1.6s ease-out infinite;
}

/* Ink pill CTA — invert + outward push on enter AND leave (JS: .is-in / .is-out) */
.home-cta {
  --home-cta-bg: var(--ink);
  --home-cta-fg: #fff;
  --home-cta-hover-bg: #fff;
  --home-cta-hover-fg: #161616;
  --home-cta-dur: .45s;
  --home-cta-ease: cubic-bezier(.22, 1, .36, 1);
  position: relative;
  isolation: isolate;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 8px;
  padding: 14px 24px;
  border-radius: 9999px;
  border: 2px solid var(--home-cta-bg);
  background: var(--home-cta-bg);
  color: var(--home-cta-fg);
  font: inherit;
  font-weight: 700;
  line-height: 1.2;
  text-align: center;
  text-decoration: none;
  cursor: pointer;
  /* Clip the push fill; keeps ::before from painting over sibling buttons
     (e.g. Annuleren next to Doorgaan in modal footers). */
  overflow: hidden;
  transform: scale(1);
  -webkit-tap-highlight-color: transparent;
  touch-action: manipulation;
  user-select: none;
  transition:
    color .25s ease,
    border-color .35s ease,
    gap .28s ease,
    transform .4s var(--home-cta-ease);
}
.home-cta--muted {
  --home-cta-bg: rgba(22, 22, 22, .8);
}
/* .home-cta sets its own display (styles.css loads after Tailwind), which would
   override Tailwind's .hidden, so toggled buttons (e.g. the event modal's
   Aanmelden) stayed visible. */
.home-cta.hidden { display: none; }
.home-cta--sm {
  padding: 10px 18px;
  font-size: .875rem;
}
.home-cta--block {
  display: flex;
  width: 100%;
  flex: 1 1 0%;
  min-width: 0;
  box-sizing: border-box;
}

/* Home rooster CTAs: full-width pair on mobile, content-sized on the right on desktop */
.home-schedule-ctas {
  display: grid;
  gap: 12px;
  width: 100%;
}
.home-schedule-ctas--duo {
  grid-template-columns: 1fr 1fr;
}
@media (min-width: 640px) {
  .home-schedule-ctas {
    width: auto;
    margin-left: auto;
    grid-template-columns: auto auto;
  }
  .home-schedule-ctas .home-cta--block {
    width: auto;
    flex: none;
  }
}

.home-cta--xl {
  display: flex;
  width: 100%;
  border-radius: 12px;
  padding: 16px 24px;
  font-size: 1rem;
}
.home-cta:disabled,
.home-cta[aria-disabled="true"] {
  opacity: .45;
  cursor: not-allowed;
  pointer-events: none;
}
.home-cta::before {
  content: '';
  position: absolute;
  inset: 0;
  z-index: 0;
  border-radius: inherit;
  background: var(--home-cta-hover-bg);
  transform: scale(0);
  pointer-events: none;
}
.home-cta > * {
  position: relative;
  z-index: 1;
  transition: transform .28s ease;
}
.home-cta.is-in,
.home-cta.is-out {
  transform: scale(1.06);
  gap: 12px;
  border-color: var(--home-cta-hover-fg);
  transition:
    color .25s ease,
    border-color .35s ease,
    gap .28s ease,
    transform .4s var(--home-cta-ease);
}
.home-cta.is-in {
  color: var(--home-cta-hover-fg);
  background: var(--home-cta-bg);
}
.home-cta.is-in::before {
  background: var(--home-cta-hover-bg);
  animation: home-cta-push var(--home-cta-dur) var(--home-cta-ease) forwards;
}
.home-cta.is-in > *:last-child:not(:only-child) {
  transform: translateX(3px);
}
.home-cta.is-out {
  color: var(--home-cta-fg);
  background: var(--home-cta-hover-bg);
}
.home-cta.is-out::before {
  background: var(--home-cta-bg);
  animation: home-cta-push var(--home-cta-dur) var(--home-cta-ease) forwards;
}
.home-cta.is-out > *:last-child {
  transform: none;
}
.home-cta:active.is-in {
  transform: scale(1.02);
}
@keyframes home-cta-push {
  from { transform: scale(0); }
  to   { transform: scale(1); }
}
.home-cta.is-loading,
.home-cta.is-loading.is-in,
.home-cta.is-loading.is-out {
  pointer-events: none;
  animation: home-cta-pulse 1s ease-in-out infinite;
}
@keyframes home-cta-pulse {
  0%, 100% { transform: scale(1); opacity: 1; }
  50% { transform: scale(1.06); opacity: .7; }
}

/* No-JS / reduced-motion: simple invert, no push animation */
@media (hover: hover) {
  .home-cta:not(.home-cta--live):hover,
  .home-cta:not(.home-cta--live):focus-visible {
    color: var(--home-cta-hover-fg);
    background: var(--home-cta-hover-bg);
    border-color: var(--home-cta-hover-fg);
    outline: none;
  }
}
@media (prefers-reduced-motion: reduce) {
  .home-cta,
  .home-cta > * {
    transition: color .2s ease, background-color .2s ease, border-color .2s ease !important;
  }
  .home-cta::before { display: none !important; }
  .home-cta.is-in,
  .home-cta.is-out,
  .home-cta:active.is-in {
    transform: none !important;
    gap: 8px !important;
  }
  .home-cta.is-loading {
    animation: none !important;
    opacity: .72;
  }
  .home-cta.is-in,
  .home-cta:not(.home-cta--live):hover,
  .home-cta:not(.home-cta--live):focus-visible {
    color: var(--home-cta-hover-fg);
    background: var(--home-cta-hover-bg);
  }
  .home-cta.is-out {
    color: var(--home-cta-fg);
    background: var(--home-cta-bg);
  }
}

.countdown {
  display: flex;
  align-items: flex-end;
  gap: 8px;
  font-variant-numeric: tabular-nums;
}
.countdown__cell {
  background: #fff;
  border: 2px solid var(--ink);
  border-radius: 10px;
  padding: 10px 14px;
  min-width: 64px;
  text-align: center;
  display: flex;
  flex-direction: column;
  gap: 2px;
  box-shadow: 3px 3px 0 var(--ink);
}
.countdown__num {
  display: block;
  font-weight: 900;
  font-size: 1.8rem;
  line-height: 1;
  letter-spacing: -0.02em;
}
.countdown__lbl {
  font-size: 0.65rem;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.1em;
  color: rgba(0,0,0,.55);
}
.countdown__sep {
  font-weight: 900;
  font-size: 1.5rem;
  color: var(--accent-magenta);
  padding-bottom: 18px;
  animation: blink 1s steps(2) infinite;
}
@keyframes blink { 50% { opacity: .25; } }
@media (max-width: 480px) {
  .countdown__cell { min-width: 52px; padding: 8px 10px; }
  .countdown__num { font-size: 1.4rem; }
  .countdown__sep { font-size: 1.1rem; padding-bottom: 16px; }
}

/* ----- Modal ----- */
/* Brand face on overlays: many are hoisted onto <body>, so inheritance from
   page chrome alone is unreliable — pin --brand-font on the dialog root. */
.modal,
.modal__panel,
[role="dialog"],
#fm-ov,
#feed-edit-modal,
#hf-modal,
#pm-modal,
#lv-cv-modal,
#ev-modal,
#info-modal,
.sv-sheet-modal,
.tour {
  font-family: var(--brand-font, inherit);
}
.modal {
  position: fixed; inset: 0;
  z-index: 80;
  display: grid;
  place-items: center;
  padding: 16px;
}
.modal[hidden] { display: none; }
.modal__backdrop {
  position: absolute; inset: 0;
  background: rgba(20,20,22,.5);
  backdrop-filter: blur(4px);
  animation: fadeIn .15s ease;
}
.modal__panel {
  position: relative;
  background: #fff;
  border-radius: 14px;
  padding: 28px;
  width: 100%;
  max-width: 460px;
  max-height: 80vh;
  overflow-y: auto;
  box-shadow: 0 30px 60px -20px rgba(0,0,0,.4);
  animation: panelIn .2s ease;
}
@keyframes panelIn {
  from { opacity: 0; transform: translateY(12px) scale(.98); }
  to   { opacity: 1; transform: none; }
}

/* hide scrollbar on horizontal scrollers */
.no-scrollbar::-webkit-scrollbar { display: none; }
.no-scrollbar { scrollbar-width: none; }

/* ----- Sticky nav (on scroll) ----- */
.sticky-nav-wrapper {
  position: fixed;
  top: 0;
  left: 0;
  right: 0;
  z-index: 60;
  pointer-events: none;
}
.sticky-nav-wrapper.is-sticky {
  pointer-events: all;
}

.sticky-nav-inner {
  background: var(--ink);
  color: #fff;
  border-radius: 0;
  width: 100%;
  display: flex;
  align-items: center;
  gap: 4px;
  /* horizontal inset mirrors max-w-5xl (64rem) + px-4/sm:px-6 */
  padding: 10px max(1rem, calc((100% - 64rem) / 2 + 1.5rem));
  transform: translateY(-100%);
  opacity: 0;
  transition:
    transform 0.32s cubic-bezier(0.16, 1, 0.3, 1),
    opacity   0.18s ease;
}
.sticky-nav-wrapper.is-sticky .sticky-nav-inner {
  transform: translateY(0);
  opacity: 1;
}

.sticky-nav-logo {
  display: flex;
  align-items: center;
  flex: none;
  text-decoration: none;
  margin-right: 6px;
  opacity: 0.6;
  transition: opacity 0.15s ease;
}
.sticky-nav-logo:hover { opacity: 1; }
.sticky-nav-logo__dot {
  width: 26px;
  height: 26px;
  border-radius: 50%;
  background: var(--accent-magenta);
  display: grid;
  place-items: center;
  color: #fff;
  font-size: 0.62rem;
  font-weight: 900;
}

.sticky-pill {
  flex: none;
  display: inline-flex;
  align-items: center;
  padding: 7px 14px;
  border-radius: 999px;
  color: rgba(255, 255, 255, 0.6);
  font-weight: 700;
  font-size: 0.88rem;
  white-space: nowrap;
  text-decoration: none;
  transition: background 0.12s ease, color 0.12s ease;
}
.sticky-pill:hover {
  background: rgba(255, 255, 255, 0.1);
  color: #fff;
}
.sticky-pill.is-active {
  background: #fff;
  color: var(--ink);
}

/* ============================================================
   Sub-page shell
   ============================================================ */
body.has-save-bar { padding-bottom: 70px !important; }
.save-bar__inner a {
  color: var(--ink);
}
.back-link {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  font-weight: 700;
  font-size: 0.9rem;
  color: var(--ink);
  text-decoration: none;
  padding: 8px 14px 8px 10px;
  border-radius: 999px;
  background: #fff;
  border: 2px solid var(--ink);
  box-shadow: 3px 3px 0 var(--ink);
  transition: transform .12s ease, box-shadow .12s ease;
}
.back-link:hover {
  transform: translate(-2px, -2px);
  box-shadow: 5px 5px 0 var(--ink);
}
.back-link:active {
  transform: translate(1px, 1px);
  box-shadow: 2px 2px 0 var(--ink);
}
.back-link span[aria-hidden] { transition: transform .15s ease; }
.back-link:hover span[aria-hidden] { transform: translateX(-2px); }

.subpage-head {
  margin: 28px 0 24px;
}
.subpage-eyebrow {
  font-size: 0.72rem;
  font-weight: 900;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  color: var(--accent-magenta);
  margin-bottom: 10px;
}
.subpage-title {
  font-size: clamp(2.4rem, 6vw, 3.6rem);
}
.subpage-meta {
  margin-top: 10px;
  font-size: 0.85rem;
  color: rgba(0,0,0,.5);
  font-weight: 500;
}
.subpage-meta--row {
  display: flex;
  align-items: center;
  gap: 8px;
  flex-wrap: wrap;
}
.subpage-meta__avatar {
  width: 20px;
  height: 20px;
  border-radius: 50%;
  object-fit: cover;
}
.subpage-meta__edit {
  margin-left: auto;
  color: inherit;
  text-decoration: underline;
  text-underline-offset: 2px;
}
.subpage-meta__edit:hover {
  color: var(--ink);
}

/* ----- Prose typography ----- */
.prose {
  font-size: 1.02rem;
  line-height: 1.65;
  color: rgba(0,0,0,.82);
}
.prose > * + * { margin-top: 1.05em; }
.prose p { margin-top: 0; margin-bottom: 0; }
.prose .lead {
  font-size: 1.15rem;
  line-height: 1.55;
  color: rgba(0,0,0,.78);
}
.prose strong { color: var(--ink); font-weight: 700; }
.prose a { color: var(--lavender); text-decoration: underline; text-underline-offset: 3px; }
.prose a:hover { color: var(--lavender-dark); }

.prose h2 {
  font-family: 'Inter', system-ui, sans-serif;
  font-weight: 800;
  font-size: 1.9rem;
  letter-spacing: -0.025em;
  line-height: 1.1;
  margin-top: 2em;
  margin-bottom: 0.6em;
  color: var(--ink);
  display: flex;
  align-items: center;
  gap: 0.55em;
}
.prose h2::before {
  content: '';
  display: inline-block;
  width: 6px;
  height: 1em;
  background: var(--accent-magenta);
  border-radius: 3px;
  flex-shrink: 0;
  transform: skewY(-8deg);
}
.prose h3 {
  font-weight: 800;
  font-size: 1.15rem;
  letter-spacing: -0.01em;
  margin-top: 1.6em;
  color: var(--ink);
  display: flex;
  align-items: center;
  gap: 0.45em;
}
.prose h3::before {
  content: '';
  display: inline-block;
  width: 4px;
  height: 0.85em;
  background: var(--accent-magenta);
  border-radius: 2px;
  flex-shrink: 0;
  opacity: 0.7;
}

.prose ol {
  margin: 0;
  padding-left: 1.4em;
}
.prose ol > li {
  margin-top: 0.4em;
}
.prose ol > li::marker {
  color: var(--accent-magenta);
  font-weight: 900;
}

/* ----- Prose link-card list ----- */
.prose ul {
  list-style: none;
  padding: 0;
  margin: 0;
  display: grid;
  gap: 8px;
}
.prose ul > li {
  background: #fff;
  border: 2px solid var(--ink);
  border-radius: 12px;
  padding: 13px 16px;
  box-shadow: 3px 3px 0 var(--ink);
  font-size: 0.95rem;
  line-height: 1.35;
  transition: transform .12s ease, box-shadow .12s ease;
}
.prose ul > li:hover {
  transform: translate(-2px, -2px);
  box-shadow: 5px 5px 0 var(--ink);
}
.prose ul > li::before { content: none; }
.prose ul > li a {
  font-weight: 800;
  color: var(--ink);
  text-decoration: none;
  border-bottom: 2.5px solid var(--accent-magenta);
  padding-bottom: 1px;
}
.prose ul > li a:hover {
  color: var(--accent-magenta);
  border-bottom-color: var(--accent-magenta);
}

.prose ul ul {
  display: grid;
  margin-top: 0.4em;
  padding-left: 1.2em;
  gap: 0;
}
.prose ul ul > li {
  background: none;
  border: none;
  box-shadow: none;
  border-radius: 0;
  padding: 0.2em 0;
  font-size: inherit;
  display: list-item;
  list-style: disc;
  transition: none;
}
.prose ul ul > li:hover { transform: none; box-shadow: none; }
.prose ul ul > li::marker { color: rgba(0,0,0,.4); }
.prose a.uren-btn {
  text-decoration: none;
}

.prose a.uren-btn--primary {
  color: white;
}
.prose a.uren-btn--ghost {
  color: black;
}

.week-card-head .week-num {
  width: unset;
}
/* ----- Inline note callout ----- */
.prose .note {
  background: #fff;
  border: 2px solid var(--ink);
  border-radius: 12px;
  padding: 14px 18px;
  box-shadow: 3px 3px 0 var(--ink);
  position: relative;
}
.prose .note::before {
  content: "!";
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 22px; height: 22px;
  border-radius: 999px;
  background: var(--accent-yellow);
  color: var(--ink);
  font-weight: 900;
  margin-right: 10px;
  vertical-align: -4px;
  border: 1.5px solid var(--ink);
}

/* ----- TOC chips ----- */
.prose-toc {
  display: flex;
  flex-wrap: wrap;
  gap: 8px;
  align-items: center;
  padding: 14px 16px;
  background: var(--mint-50);
  border: 2px solid var(--ink);
  border-radius: 12px;
}
.prose-toc__label {
  font-size: 0.7rem;
  font-weight: 900;
  text-transform: uppercase;
  letter-spacing: 0.14em;
  color: rgba(0,0,0,.55);
  margin-right: 4px;
}
.prose-toc a {
  font-size: 0.85rem;
  font-weight: 700;
  text-decoration: none;
  color: var(--ink);
  padding: 4px 12px;
  border-radius: 999px;
  background: #fff;
  border: 1.5px solid var(--ink);
  transition: background .12s ease, color .12s ease;
}
.prose-toc a:hover { background: var(--ink); color: #fff; }

/* ----- Numbered consequence steps ----- */
.prose-steps {
  list-style: none;
  padding: 0;
  counter-reset: step;
  display: grid;
  gap: 12px;
}
.prose-steps li {
  position: relative;
  display: grid;
  gap: 14px;
  align-items: start;
  background: #fff;
  border: 2px solid var(--ink);
  border-radius: 12px;
  padding: 14px 16px;
  box-shadow: 3px 3px 0 var(--ink);
  counter-increment: step;
}
.prose-steps li::before {
  content: counter(step);
  display: grid;
  place-items: center;
  width: 36px; height: 36px;
  border-radius: 10px;
  background: var(--accent-magenta);
  color: #fff;
  font-weight: 900;
  font-size: 1.1rem;
  border: 2px solid var(--ink);
}
.prose-steps li strong { display: block; font-size: 1rem; }
.prose-steps li span { color: rgba(0,0,0,.7); font-size: 0.95rem; margin-top: -14px;}

/* ----- Author figure ----- */
.prose figure.author {
  margin: 2.5em 0 0;
  display: flex;
  align-items: center;
  gap: 16px;
  padding: 16px;
  background: var(--pink-50);
  border: 2px solid var(--ink);
  border-radius: 12px;
}
.prose figure.author img {
  width: 64px; height: 64px;
  border-radius: 10px;
  object-fit: cover;
  border: 2px solid var(--ink);
  box-shadow: 3px 3px 0 var(--ink);
  flex: none;
}
.prose figure.author figcaption {
  display: flex;
  flex-direction: column;
  gap: 2px;
  font-size: 0.9rem;
}
.prose figure.author figcaption strong { font-weight: 800; }
.prose figure.author figcaption span { color: rgba(0,0,0,.55); }

/* ----- Save bar (for form sub-pages) ----- */
.save-bar {
  position: fixed;
  left: 0; right: 0; bottom: 0;
  background: var(--ink);
  color: #fff;
  z-index: 60;
  border-top: 2px solid var(--ink);
  animation: slideUp .3s cubic-bezier(.2,.7,.2,1);
}
.save-bar__inner {
  max-width: 48rem;
  margin: 0 auto;
  padding: 14px 20px;
  display: flex;
  align-items: center;
  justify-content: flex-end;
  gap: 12px;
}
.save-bar .ghost {
  background: transparent;
  color: #fff;
  border: 2px solid rgba(255,255,255,.3);
  padding: 11px 18px;
  border-radius: 999px;
  font-weight: 700;
  cursor: pointer;
}
.save-bar .primary {
  background: #fff;
  color: var(--ink);
  border: 2px solid #fff;
  padding: 11px 22px;
  border-radius: 999px;
  font-weight: 800;
  cursor: pointer;
  box-shadow: 3px 3px 0 rgba(255,255,255,.25);
  transition: transform .12s ease, box-shadow .12s ease;
}
.save-bar .primary:hover {
  transform: translate(-1px, -1px);
  box-shadow: 4px 4px 0 rgba(255,255,255,.25);
}
@keyframes slideUp {
  from { transform: translateY(100%); }
  to   { transform: translateY(0); }
}

/* Date chip on event cards */
.ev-date-chip {
  background: rgba(255,255,255,.92);
  color: var(--ink);
}

/* De handmatige .text-ink/.bg-ink-overrides die hier stonden zijn niet meer
   nodig: die waren er omdat --ink-rgb komma's had, waardoor Tailwind's eigen
   `rgb(22, 22, 22 / 1)` ongeldig werd. Met spaties klopt de generatie zelf. */

/* ----- Native date/time inputs ----- */
/* iOS Safari keeps the platform's intrinsic width on these controls and simply
   ignores `width: 100%`, so a date/time field spills out of its column (and
   centres its value). Dropping the platform appearance makes them lay out like
   any other input, in a grid cell or on their own row. */
input[type="date"],
input[type="time"],
input[type="datetime-local"] {
  -webkit-appearance: none;
  appearance: none;
  min-width: 0;
  text-align: left;
}
input[type="date"]::-webkit-date-and-time-value,
input[type="time"]::-webkit-date-and-time-value,
input[type="datetime-local"]::-webkit-date-and-time-value {
  text-align: left;
  min-height: 1.25em; /* without this iOS collapses the value box */
}

/* ----- Type picker (radio cards) ----- */
/* Horizontal row of choices; each option sets its own accent via --tp-color. */
.type-picker {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: 8px;
}
.type-picker--2 { grid-template-columns: repeat(2, minmax(0, 1fr)); }
.type-picker__opt {
  display: block;
  cursor: pointer;
  -webkit-tap-highlight-color: transparent;
}
.type-picker__input {
  position: absolute;
  width: 1px;
  height: 1px;
  padding: 0;
  margin: -1px;
  overflow: hidden;
  clip: rect(0 0 0 0);
  white-space: nowrap;
  border: 0;
}
/* Alpha's staan hier als losse rgba()-waardes, net als in de rest van dit
   bestand; de donkere modus zet ze verderop expliciet om. */
.type-picker__card {
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: flex-start;
  gap: 4px;
  height: 100%;
  padding: 12px 6px 10px;
  text-align: center;
  background: #fff;
  border: 2px solid rgba(22,22,22,.15);
  border-radius: 14px;
  transition: border-color .12s ease, box-shadow .12s ease, transform .12s ease, background-color .12s ease;
}
.type-picker__icon {
  width: 22px;
  height: 22px;
  flex: none;
  color: rgba(22,22,22,.35);
  transition: color .12s ease;
}
.type-picker__label {
  font-size: 11.5px;
  font-weight: 700;
  line-height: 1.15;
  letter-spacing: -.01em;
  color: rgba(22,22,22,.8);
}
.type-picker__byline {
  font-size: 10.5px;
  line-height: 1.25;
  color: rgba(22,22,22,.5);
}
.type-picker__opt:hover .type-picker__card { border-color: rgba(22,22,22,.3); }
.type-picker__input:focus-visible + .type-picker__card {
  outline: 2px solid var(--tp-color, #161616);
  outline-offset: 2px;
}
/* Aangevinkt: accentrand + offset-schaduw in de stijl van de rest van de site.
   De tint is een progressive enhancement; zonder color-mix blijft de kaart wit. */
.type-picker__input:checked + .type-picker__card {
  border-color: var(--tp-color, #161616);
  box-shadow: 2px 2px 0 var(--tp-color, #161616);
  background: color-mix(in srgb, var(--tp-color, #888) 10%, #fff);
}
.type-picker__input:checked + .type-picker__card .type-picker__icon  { color: var(--tp-color); }
.type-picker__input:checked + .type-picker__card .type-picker__label { color: rgb(var(--ink-rgb)); }
.type-picker__opt:active .type-picker__card { transform: translate(1px, 1px); }

@media (min-width: 640px) {
  .type-picker { gap: 12px; }
  .type-picker__card { padding: 16px 12px 14px; gap: 6px; }
  .type-picker__icon { width: 26px; height: 26px; }
  .type-picker__label { font-size: 14px; }
  .type-picker__byline { font-size: 11.5px; }
}

@media (prefers-color-scheme: dark) {
  .type-picker__card   { background: #1e1e1e; border-color: rgba(228,223,216,.2); }
  .type-picker__icon   { color: rgba(228,223,216,.4); }
  .type-picker__label  { color: rgba(228,223,216,.85); }
  .type-picker__byline { color: rgba(228,223,216,.5); }
  .type-picker__opt:hover .type-picker__card { border-color: rgba(228,223,216,.35); }
  .type-picker__input:checked + .type-picker__card {
    background: color-mix(in srgb, var(--tp-color, #888) 22%, #1e1e1e);
  }
}

/* ===== Dark mode ===== */
@media (prefers-color-scheme: dark) {
  :root {
    --cream: #111111;
    --ink: #e4dfd8;
    --ink-rgb: 228 223 216;     /* drives all text-ink/* and border-ink/* Tailwind variants */
    --pink-50: #21131a;
    --pink-100: #2e1921;
    --mint-50: #0f1a16;
    --mint-200: #152219;
    --lavender: #7b6a9a;
    --lavender-dark: #5d5078;
  }

  html, body { background: var(--cream); color: var(--ink); }

  /* Tailwind background overrides */
  .bg-pink-50   { background-color: #21131a !important; }
  .bg-cream     { background-color: #111111 !important; }
  .bg-white     { background-color: #1e1e1e !important; }
  .bg-white\/60 { background-color: rgba(30,30,30,.6) !important; }
  .bg-white\/70 { background-color: rgba(30,30,30,.7) !important; }
  .hover\:bg-white:hover     { background-color: #2a2a2a !important; }
  .hover\:bg-white\/80:hover { background-color: rgba(40,40,40,.8) !important; }
  .ring-pink-50 { --tw-ring-color: #21131a !important; }

  /* bg-ink buttons: intentionally softer dark on dark pages */
  .bg-ink     { background-color: #2a2a2a !important; }
  .bg-ink\/80 { background-color: rgba(42,42,42,.8) !important; }
  .hover\:bg-ink\/80:hover { background-color: rgba(42,42,42,.8) !important; }

  /* Cards & white surfaces */
  .action-btn {
    background: #1e1e1e;
    border-color: rgba(228,223,216,.2);
    box-shadow: 3px 3px 0 rgba(228,223,216,.15);
    color: var(--ink);
  }
  .action-btn:hover { box-shadow: 5px 5px 0 rgba(228,223,216,.2); }
  .action-btn:active { box-shadow: 2px 2px 0 rgba(228,223,216,.12); }

  .week-chip {
    background: #1e1e1e;
    border-color: rgba(228,223,216,.2);
    box-shadow: 3px 3px 0 rgba(228,223,216,.15);
  }
  .week-chip:hover { box-shadow: 5px 5px 0 rgba(228,223,216,.2); }
  .week-chip:active { box-shadow: 2px 2px 0 rgba(228,223,216,.12); }

  .countdown__cell {
    background: #1e1e1e;
    border-color: rgba(228,223,216,.2);
    box-shadow: 3px 3px 0 rgba(228,223,216,.15);
  }
  .countdown__lbl { color: rgba(228,223,216,.55); }

  .bday-card, .pin-card {
    background: #1e1e1e;
    border-color: rgba(228,223,216,.2);
  }

  .modal__panel { background: #1a1a1a; }

  /* Page nav */
  .page-nav__pill {
    background: #1e1e1e;
    border-color: rgba(228,223,216,.2);
    color: var(--ink);
  }
  .page-nav__pill:hover { background: var(--ink); color: #111111; }
  /* Must beat base .page-nav__pill.is-active and unstuck-specificity stuck rules */
  .page-nav__pill.is-active {
    background: var(--ink);
    color: #111111;
    border-color: transparent;
    box-shadow: 3px 3px 0 rgba(228, 223, 216, .15);
  }
  /* Unstuck rings: beat the light-mode #cbcbcb / #444 rules (higher specificity). */
  .page-nav:not(.is-stuck) a.page-nav__pill {
    border-color: rgba(228, 223, 216, .2);
  }
  .page-nav:not(.is-stuck) a.page-nav__pill.is-active {
    border-color: transparent;
    box-shadow: 3px 3px 0 rgba(228, 223, 216, .15);
  }
  /* Stuck scrub: fade from dark pill fills → transparent (not white →
     transparent, which flashed a light wash across dark mode). Active
     starts as cream ink; inactives as #1e1e1e. Text ends white on the
     black bar; active text starts near-black to match the cream fill. */
  .page-nav.is-stuck .page-nav__pill:not(.page-nav__pill-ghost) {
    background: rgba(30, 30, 30, calc(1 - var(--nav-stuck-progress))) !important;
    color: color-mix(
      in srgb,
      #fff calc(var(--nav-stuck-progress) * 100%),
      var(--ink)
    ) !important;
  }
  .page-nav.is-stuck a.page-nav__pill:not(.page-nav__pill-ghost):not(.is-active) {
    border-color: rgba(228, 223, 216, calc(0.2 * (1 - var(--nav-stuck-progress)))) !important;
  }
  .page-nav.is-stuck a.page-nav__pill.is-active:not(.page-nav__pill-ghost) {
    background: rgba(228, 223, 216, calc(1 - var(--nav-stuck-progress))) !important;
    border-color: transparent !important;
    color: color-mix(
      in srgb,
      #fff calc(var(--nav-stuck-progress) * 100%),
      #111111
    ) !important;
  }
  /* Cream on ::before (base rule) — don't reintroduce a solid fade bg here. */
  .page-nav__fade--l,
  .page-nav__fade--r { background: none; }

  /* Back link */
  .back-link {
    background: #1e1e1e;
    border-color: rgba(228,223,216,.2);
    box-shadow: 3px 3px 0 rgba(228,223,216,.15);
    color: var(--ink);
  }
  .back-link:hover  { box-shadow: 5px 5px 0 rgba(228,223,216,.2); }
  .back-link:active { box-shadow: 2px 2px 0 rgba(228,223,216,.12); }

  /* Beschikbaarheid */
  .beschikbaarheid {
    background: linear-gradient(180deg, #230d17 0%, #0f1a16 100%);
    border-color: rgba(230,59,122,.4);
  }
  .beschikbaarheid--deadline-passed {
    background: linear-gradient(180deg, #1e190a 0%, #111111 100%);
    border-color: rgba(255,209,69,.5);
  }
  .beschikbaarheid--deadline-passed .text-magenta { color: #d4a017; }
  .beschikbaarheid--valid {
    background: linear-gradient(180deg, #0d1f11 0%, #0f1a16 100%);
    border-color: rgba(126,217,87,.4);
  }
  .beschikbaarheid--empty {
    background: linear-gradient(180deg, #1a1a1a 0%, #0f1a16 100%);
    border-color: rgba(228,223,216,.18);
  }

  .home-cta {
    --home-cta-bg: #2a2a2a;
    --home-cta-fg: var(--ink);
    --home-cta-hover-bg: #fff;
    --home-cta-hover-fg: #111111;
  }
  .home-cta--muted {
    --home-cta-bg: rgba(42, 42, 42, .85);
  }

  /* Prose */
  .prose ul > li,
  .prose .note,
  .prose-steps li {
    background: #1e1e1e;
    border-color: rgba(228,223,216,.2);
    box-shadow: 3px 3px 0 rgba(228,223,216,.15);
  }
  .prose ul > li:hover { box-shadow: 5px 5px 0 rgba(228,223,216,.2); }
  .prose-steps li:hover { box-shadow: 5px 5px 0 rgba(228,223,216,.2); }
  .prose ul ul > li { background: none; border: none; box-shadow: none; }
  .prose-toc {
    background: var(--mint-50);
    border-color: rgba(228,223,216,.2);
  }
  .prose-toc a {
    background: #1e1e1e;
    border-color: rgba(228,223,216,.2);
    color: var(--ink);
  }
  .prose-toc a:hover { background: var(--ink); color: #111111; }
  .prose figure.author {
    background: #21131a;
    border-color: rgba(228,223,216,.2);
  }
  .prose figure.author img {
    border-color: rgba(228,223,216,.2);
    box-shadow: 3px 3px 0 rgba(228,223,216,.15);
  }
  .prose { color: rgba(228,223,216,.82); }
  .prose strong { color: var(--ink); }

  /* Subpage meta */
  .subpage-meta { color: rgba(228,223,216,.5); }

  /* Inherited / hardcoded dark text that must flip with the palette */
  .countdown__num { color: var(--ink); }
  .countdown__sep { color: var(--accent-magenta); }

  .prose .lead { color: rgba(228,223,216,.78); }
  .prose-toc__label { color: rgba(228,223,216,.55); }
  .prose ul ul > li::marker { color: rgba(228,223,216,.4); }
  .prose a.uren-btn--ghost { color: var(--ink); }
  .prose-steps li span { color: rgba(228,223,216,.7); }
  .prose figure.author figcaption span { color: rgba(228,223,216,.55); }

  /* Muted ink utilities: keep readable on dark section backgrounds */
  .text-ink\/40 { color: rgba(228,223,216,.55) !important; }
  .text-ink\/50 { color: rgba(228,223,216,.62) !important; }
  .text-ink\/55 { color: rgba(228,223,216,.65) !important; }
  .text-ink\/60 { color: rgba(228,223,216,.72) !important; }
  .text-ink\/70 { color: rgba(228,223,216,.8) !important; }
  .text-ink\/80 { color: rgba(228,223,216,.88) !important; }

  /* Section surfaces that inherit body copy */
  .section.bg-pink-50,
  .section.bg-cream,
  .beschikbaarheid {
    color: var(--ink);
  }

  /* Stemronde card: drop the (light) gradient/mint fill in dark mode — keep the border */
  .sv-round-card { background: transparent !important; }

  /* Tailwind gray + white utility overrides */
  .ev-date-chip { background: rgba(30,30,30,.92); }

  .bg-gray-50                    { background-color: #1e1e1e !important; }
  .bg-gray-50\/60                { background-color: rgba(30,30,30,.6) !important; }
  .bg-gray-100                   { background-color: #252525 !important; }
.hover\:bg-gray-50:hover       { background-color: #1e1e1e !important; }
  .hover\:bg-gray-50\/70:hover   { background-color: rgba(30,30,30,.7) !important; }
  .hover\:bg-gray-100:hover      { background-color: #252525 !important; }
  /* Near-white Tailwind borders read as chalk lines on dark cards — keep faint. */
  .border-gray-100               { border-color: rgba(228,223,216,.08) !important; }
  .border-gray-200               { border-color: rgba(228,223,216,.12) !important; }
  .hover\:border-gray-300:hover  { border-color: rgba(228,223,216,.2) !important; }

  .feed-photo {
    background: #1a1a1a;
  }
  .feed-photo::after {
    background: linear-gradient(
      105deg,
      transparent 35%,
      rgba(228, 223, 216, .08) 50%,
      transparent 65%
    );
  }
  .ring-white                    { --tw-ring-color: #3a3a3a !important; }
  .text-gray-500                 { color: rgba(228,223,216,.5) !important; }
  .text-gray-600                 { color: rgba(228,223,216,.62) !important; }
  .text-gray-700                 { color: rgba(228,223,216,.75) !important; }
  .text-gray-800                 { color: rgba(228,223,216,.9) !important; }

  /* "Gestemd"/"Ingevuld" groen: de 600/700-tinten zijn te donker op de
     donkere kaarten (o.a. de stemformulier-rijen op de home-tab). */
  .text-green-600                { color: #6ee7a0 !important; }
  .text-green-700                { color: #6ee7a0 !important; }

  /* Save bar: keep a dark strip; don't let --ink (cream) light up the footer.
     Action buttons use .bg-white which is remapped to #1e1e1e globally — restore
     a light pill so labels stay readable (Week aanvragen, Opslaan, etc.). */
  .save-bar {
    background: #161616;
    border-top-color: #161616;
    color: #fff;
  }
  .save-bar .bg-white {
    background-color: #e4dfd8 !important;
    color: #111111 !important;
  }
  .save-bar .bg-white:hover,
  .save-bar .hover\:bg-gray-800:hover {
    background-color: #fff !important;
    color: #111111 !important;
  }
  .save-bar .primary {
    background: #e4dfd8;
    color: #111111;
    border-color: #e4dfd8;
  }
  .save-bar .ghost {
    color: #fff;
    border-color: rgba(255,255,255,.3);
  }

  /* "JE ROOSTER" logo tag: keep a dark tag (var(--ink) flips to light otherwise) */
  .logo-tag {
    background: rgba(0,0,0,.3);
    color: #fff;
  }

  /* Member bio textarea: white text on a translucent light-black surface */
  #lv-bio {
    background-color: rgba(255,255,255,.2);
    color: #fff !important;
    border-color: rgba(228,223,216,.2) !important;
  }
  #lv-bio::placeholder { color: rgba(255,255,255,.4); }
}

/* ── PWA: offline banner + install nudge (homepage) ─────────────────────── */

.offline-banner {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 8px;
  max-width: 64rem;
  margin: 0 auto 12px;
  padding: 10px 16px;
  background: #fde9ef;
  border: 1px solid #fbd0dc;
  border-radius: 12px;
  color: #e63b7a;
  font-size: 13px;
  font-weight: 600;
  line-height: 1.35;
}
.offline-banner[hidden] { display: none !important; }

/* Flash toast after redirects (e.g. stem-bevestiging → home) */
.home-toast-host {
  position: fixed;
  left: 50%;
  bottom: calc(1.5rem + env(safe-area-inset-bottom, 0px));
  transform: translateX(-50%);
  z-index: 1200;
  pointer-events: none;
  width: min(92vw, 28rem);
}
.home-toast {
  background: var(--ink, #161616);
  color: #fff;
  padding: 0.85rem 1.15rem;
  border-radius: 12px;
  font-size: 0.9rem;
  font-weight: 600;
  line-height: 1.35;
  text-align: center;
  box-shadow: 0 10px 28px -12px rgba(0, 0, 0, 0.45);
  opacity: 0;
  transform: translateY(10px);
  transition: opacity 0.25s ease, transform 0.25s ease;
}
.home-toast.is-visible {
  opacity: 1;
  transform: translateY(0);
}
.home-toast--success { background: #16a34a; }
.home-toast--error   { background: #dc2626; }
.home-toast--info    { background: var(--lavender-dark, #4d4068); }
@media (prefers-reduced-motion: reduce) {
  .home-toast { transition: none; }
}

.pwa-nudge {
  position: fixed;
  inset: 0;
  z-index: 200;
  display: flex;
  align-items: flex-end;
  justify-content: center;
  padding: 16px;
  padding-bottom: max(16px, env(safe-area-inset-bottom));
  background: rgba(22, 22, 22, 0.45);
  animation: pwaNudgeFadeIn .25s ease;
}
@keyframes pwaNudgeFadeIn {
  from { opacity: 0; }
  to   { opacity: 1; }
}

.pwa-nudge__panel {
  position: relative;
  width: 100%;
  max-width: 420px;
  background: var(--cream, #f7f3ec);
  border: 2px solid var(--ink, #161616);
  border-radius: 20px;
  padding: 24px 20px 20px;
  box-shadow: 6px 6px 0 var(--ink, #161616);
  animation: pwaNudgeSlideUp .3s cubic-bezier(.2,.8,.2,1);
}
@keyframes pwaNudgeSlideUp {
  from { opacity: 0; transform: translateY(24px); }
  to   { opacity: 1; transform: none; }
}

.pwa-nudge__close {
  position: absolute;
  top: 10px;
  right: 12px;
  width: 32px;
  height: 32px;
  border: none;
  background: transparent;
  color: rgb(var(--ink-rgb, 22 22 22) / 0.45);
  font-size: 24px;
  line-height: 1;
  cursor: pointer;
  border-radius: 8px;
}
.pwa-nudge__close:hover { background: rgb(var(--ink-rgb, 22 22 22) / 0.06); color: var(--ink, #161616); }

.pwa-nudge__icon {
  width: 44px;
  height: 44px;
  border-radius: 12px;
  object-fit: contain;
  background: var(--magenta, #e63b7a);
  color: #fff;
  font-weight: 900;
  font-size: 15px;
  display: grid;
  place-items: center;
  margin-bottom: 12px;
}

.pwa-nudge__title {
  font-family: inherit;
  font-size: 1.25rem;
  font-weight: 800;
  letter-spacing: -0.02em;
  color: var(--ink, #161616);
  margin: 0 0 12px;
}

.pwa-nudge__steps {
  margin: 0 0 16px;
  padding-left: 0;
  list-style-position: inside;
  color: rgb(var(--ink-rgb, 22 22 22) / 0.78);
  font-size: 14px;
  line-height: 1.55;
}
.pwa-nudge__steps li + li { margin-top: 8px; }

.pwa-nudge__share {
  display: inline-flex;
  vertical-align: middle;
  align-items: center;
  justify-content: center;
  width: 28px;
  height: 28px;
  border-radius: 6px;
  background: rgb(var(--ink-rgb, 22 22 22) / 0.08);
  color: var(--ink, #161616);
}

.pwa-nudge__copy {
  margin: 0 0 16px;
  font-size: 14px;
  line-height: 1.5;
  color: rgb(var(--ink-rgb, 22 22 22) / 0.78);
}

.pwa-nudge__install,
.pwa-nudge__later {
  display: block;
  width: 100%;
  border-radius: 999px;
  font-family: inherit;
  font-size: 14px;
  font-weight: 700;
  cursor: pointer;
  padding: 12px 16px;
}

.pwa-nudge__install {
  border: 2px solid var(--ink, #161616);
  background: var(--ink, #161616);
  color: var(--cream, #f7f3ec);
  margin-bottom: 8px;
}
.pwa-nudge__install:hover { opacity: 0.9; }

.pwa-nudge__later {
  border: none;
  background: transparent;
  color: rgb(var(--ink-rgb, 22 22 22) / 0.5);
}
.pwa-nudge__later:hover { color: var(--ink, #161616); }

/* ===== Event create wizard / edit form (events/_form.php) ===== */
.evf-reveal { animation: evfReveal .22s cubic-bezier(.2,.7,.2,1); }
@keyframes evfReveal {
  from { opacity: 0; transform: translateY(-4px); }
  to   { opacity: 1; transform: none; }
}
@media (prefers-reduced-motion: reduce) { .evf-reveal { animation: none; } }

/* Wizard stepper: dot state is set by event-form.js via data-state. */
.evf-dot { --dot-bg: #fff; --dot-fg: rgb(var(--ink-rgb) / .4); --dot-border: rgb(var(--ink-rgb) / .15); }
.evf-dot__num {
  background: var(--dot-bg); color: var(--dot-fg); border-color: var(--dot-border);
  transition: background .15s ease, color .15s ease, border-color .15s ease, transform .15s ease;
}
.evf-dot__check { display: none; }
.evf-dot[data-state="current"] { --dot-bg: var(--ink); --dot-fg: var(--cream); --dot-border: var(--ink); }
.evf-dot[data-state="current"] .evf-dot__num { transform: scale(1.08); box-shadow: 2px 2px 0 rgb(var(--ink-rgb) / .25); }
.evf-dot[data-state="done"]    { --dot-bg: #7ed957; --dot-fg: #161616; --dot-border: #161616; }
.evf-dot[data-state="done"] .evf-dot__n { display: none; }
.evf-dot[data-state="done"] .evf-dot__check { display: block; }
.evf-dot[data-state="current"] .evf-dot__label { color: rgb(var(--ink-rgb)); }
.evf-dot:disabled { cursor: default; }

/* Edit page section nav */
.evf-nav a.is-active { background: var(--ink); color: var(--cream); border-color: var(--ink); }

@media (prefers-color-scheme: dark) {
  .evf-dot { --dot-bg: #1e1e1e; }
  [data-evf-form] { --tw-ring-offset-color: #1e1e1e; }
  [data-evf-form] .shadow-\[3px_3px_0_\#161616\],
  #evf-preview .shadow-\[3px_3px_0_\#161616\] { box-shadow: 3px 3px 0 rgba(228,223,216,.15); }
}
