/* === partials/animations === */
@keyframes fadeUp {
  from { opacity: 0; transform: translateY(24px); }
  to   { opacity: 1; transform: translateY(0); }
}

@keyframes shimmer {
  from { left: -80%; }
  to   { left: 120%; }
}

@keyframes scrollBounce {
  0%, 100% { transform: translateX(-50%) translateY(0); opacity: 0.5; }
  50%       { transform: translateX(-50%) translateY(7px); opacity: 0.9; }
}

@keyframes revealIn {
  from { opacity: 0; transform: translateY(28px); }
  to   { opacity: 1; transform: translateY(0); }
}


/* === partials/scroll_reveal === */
/* Driven by Locomotive Scroll's `is-inview` class. */
[data-scroll] {
  opacity: 0;
  transform: translateY(28px);
  transition: opacity 0.65s ease, transform 0.65s ease;
}

[data-scroll].is-inview {
  opacity: 1;
  transform: translateY(0);
}

/* Hero elements use CSS keyframe animations, not scroll-reveal. */
#hero[data-scroll],
#hero [data-scroll] {
  opacity: unset;
  transform: unset;
  transition: none;
}


/* === application === */
/*
 * Public-site stylesheet entry point.
 *
 * Component styles live in partials/_*.css and are loaded as separate
 * stylesheets from app/views/layouts/application.html.erb. This file
 * keeps only the @font-face declarations, the html/body base, and a
 * couple of cross-cutting utilities that don't justify their own
 * partials. CSS variables live in variables.css (loaded separately so
 * admin pages can pull them in without inheriting these rules).
 */

@font-face {
  font-family: 'CormorantGaramond';
  src: url("/assets/CormorantGaramond-VariableFont_wght-cd2ab63e.ttf") format('truetype');
  font-weight: 100 900;
  font-style: normal;
  font-display: swap;
}

@font-face {
  font-family: 'CormorantGaramond';
  src: url("/assets/CormorantGaramond-Italic-VariableFont_wght-bebd4704.ttf") format('truetype');
  font-weight: 100 900;
  font-style: italic;
  font-display: swap;
}

html {
  scroll-behavior: smooth;
  font-size: 20px;
  scrollbar-width: thin;
  scrollbar-color: var(--color-scrollbar) transparent;
}

html::-webkit-scrollbar { width: 5px; }
html::-webkit-scrollbar-track { background: transparent; }
html::-webkit-scrollbar-thumb {
  background: var(--color-scrollbar);
  border-radius: 99px;
  transition: background 0.4s ease;
}
html::-webkit-scrollbar-thumb:hover { background: var(--color-scrollbar-hover); }

html.scrollbar--on-dark::-webkit-scrollbar-thumb { background: var(--color-scrollbar-dark); }
html.scrollbar--on-dark::-webkit-scrollbar-thumb:hover { background: var(--color-scrollbar-dark-hover); }
html.scrollbar--on-dark { scrollbar-color: var(--color-scrollbar-dark) transparent; }

body {
  margin: 0;
  padding: 0;
  background-color: var(--color-bg);
  font-family: var(--font-serif);
  font-weight: 700;
  letter-spacing: 0.03em;
  color: var(--color-text);
}

/* Subtle dot grid using brand burgundy — applied via .pattern-bg utility class. */
.pattern-bg::before {
  content: "";
  position: absolute;
  inset: 0;
  background-image: radial-gradient(circle, var(--color-burgundy) 1px, transparent 1px);
  background-size: 22px 22px;
  opacity: 0.06;
  pointer-events: none;
  z-index: 0;
}

.noscript-menu {
  padding: 2rem;
  font-family: var(--font-serif);
  max-width: var(--content-max-width);
  margin: 0 auto;
}


/* === partials/menu_canvas === */
/* WebGL canvas (scoped, not full-page). */
#glcanvas {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  z-index: 1;
  cursor: grab;
  display: block;
  touch-action: pan-y; /* overridden to none by JS when cloth is grabbed */
}

#glcanvas:active {
  cursor: grabbing;
}

/* menu-section contains the canvas */
.menu-section {
  position: sticky;
  top: 0;
  z-index: 2;
  will-change: transform;
  height: 100vh;
  height: 100svh;
  overflow: hidden;
  touch-action: pan-y;   /* allow vertical scroll; JS locks to none when cloth is grabbed */
  box-shadow: 0 -12px 32px var(--shadow-soft);
}

.menu-section__inner {
  position: relative;
  width: 100%;
  height: 100%;
}

#indicator {
  position: absolute;
  width: 32px;
  height: 32px;
  background: var(--shadow-soft);
  border: 2px solid rgb(var(--rgb-black) / 0.25);
  border-radius: 50%;
  transform: translate(-50%, -50%);
  pointer-events: none;
  display: none;
  z-index: 10;
}

/* Category arrows. */
.menu__arrow {
  position: absolute;
  /* Aligned with the category title's first row, painted near the top of the
     cloth texture. The title sits ~15-17% of viewport height depending on the
     panel's texture height (camera/FOV fixed); 16% is the tuned midpoint.
     texture.js reserves horizontal space on the first title row so the name
     wraps clear of these arrows instead of overlapping them. */
  top: 16%;
  transform: translateY(-50%);
  z-index: 3;
  width: 44px;
  height: 44px;
  display: flex;
  align-items: center;
  justify-content: center;
  background: rgb(var(--rgb-bg) / 0.75);
  border: 1px solid var(--color-border);
  border-radius: 50%;
  color: var(--color-burgundy);
  cursor: pointer;
  backdrop-filter: blur(4px);
  transition: opacity 0.2s, background 0.2s;
}

.menu__arrow svg {
  width: 20px;
  height: 20px;
}

.menu__arrow--prev {
  left: 16px;
}

.menu__arrow--next {
  right: 16px;
}

.menu__arrow:hover:not(:disabled) {
  background: rgb(var(--rgb-pink) / 0.95);
}

.menu__arrow:disabled {
  opacity: 0.25;
  cursor: default;
}


/* === partials/menu_type_switcher === */
.menu__type-switcher {
  display: flex;
  gap: 0.75rem;
  justify-content: safe center;
  padding: 1rem 0;
  z-index: 10;
}

.menu__type-btn {
  display: inline-block;
  padding: 0.45rem 1.25rem;
  border: 1.5px solid var(--color-burgundy);
  border-radius: 99px;
  background: transparent;
  color: var(--color-burgundy);
  font-family: inherit;
  font-size: 0.85rem;
  letter-spacing: 0.05em;
  text-transform: uppercase;
  cursor: pointer;
  transition: background 0.2s ease, color 0.2s ease;
}

.menu__type-btn:hover,
.menu__type-btn--active {
  background: var(--color-burgundy);
  color: var(--color-pink);
}

/* Canvas: overlay at top */
#menu-canvas .menu__type-switcher {
  position: absolute;
  top: 0.25rem;
  left: 0;
  right: 0;

  overflow-x: auto;
  overflow-y: hidden;
  -webkit-overflow-scrolling: touch;
  touch-action: pan-x;

  /* Inline padding so first/last buttons aren't flush against viewport edges */
  padding-inline: 1rem;

  /* Snap each button to centre when scrolling stops */
  scroll-snap-type: x mandatory;
  scroll-padding-inline: 1rem;

  /* Hide scrollbar across browsers */
  scrollbar-width: none;            /* Firefox */
  -ms-overflow-style: none;         /* legacy Edge / IE */
}

#menu-canvas .menu__type-switcher::-webkit-scrollbar {
  display: none;                    /* WebKit / Blink */
}

#menu-canvas .menu__type-btn {
  /* Keep buttons from being shrunk by the flex container */
  flex: 0 0 auto;
  scroll-snap-align: center;
}

/* Static section: pin the switcher absolutely at the top of the section
   so its position stays consistent across layout types. Without this it
   sat at .site-section's padding-top in kitchen/bar (multi-column flow,
   column-span: all) but at y=0 in cocktails (height:100% site-section
   with padding 0), causing a visible jump when switching types. */
#menu-static .menu__type-switcher {
  position: absolute;
  top: 0;
  left: 0;
  right: 0;
}


/* === partials/menu_static === */
/* The #menu anchor wrapper holds both menu sections (one hidden via media
   query). Without display: contents, the wrapper's height equals the visible
   section's height, leaving zero pin-range for `position: sticky` so the
   section never actually pins. display: contents takes the wrapper out of
   layout so the sticky child's containing block becomes <body>, matching
   how #hero is set up. */
#menu { display: contents; }

/* Static (non-touch) menu joins the same sticky section stack as the canvas
   variant: outer is one viewport, pinned to top so reservations/booking can
   scroll over. */
.menu-section--static {
  position: sticky;
  top: 0;
  height: 100vh;
  height: 100svh;
  overflow: hidden;
  z-index: 2;
  background: var(--color-white);
  display: flex;
  align-items: center;
  justify-content: center;
}

.menu-section--static .site-section {
  width: 100%;
  box-sizing: border-box;
  overflow: hidden;
  columns: 3;
  column-fill: balance;
  column-gap: clamp(0.25rem, 3vw, 3rem);
  margin: 0;
  max-width: none;
  padding: 0 clamp(0.25rem, 1vw, 0.75rem);
  padding-top: clamp(1.25rem, 3vw, 2.25rem);
  padding-bottom: clamp(1.5rem, 4vw, 3rem);
}

.menu-section--static .menu__static-category {
  break-inside: avoid;
  display: grid;
  grid-template-columns: 1fr 1fr;
  column-gap: clamp(0.25rem, 1.25vw, 1.25rem);
  row-gap: 0;
}

.menu-section--static .menu__static-category-name {
  grid-column: 1 / -1;
}

/* Hide the top "Menu" section heading — categories speak for themselves */
.menu-section--static .site-section > .section-heading {
  display: none;
}

/* Hide all type-scoped elements by default; the inline JS in
   _menu_section.html.erb sets `.is-active` on those whose type matches
   the section's data-active-type. */
.menu-section--static .menu__static-group { display: none; }
.menu-section--static .menu__static-group.is-active { display: contents; }

.menu__static-logo {
  break-inside: avoid;
  text-align: center;
  margin-bottom: clamp(0.25rem, 2vw, 2rem);
}

.menu__static-logo--top .menu__static-logo-wordmark {
  width: 80%;
  height: auto;
  margin: 0 auto;
  display: block;
}

.menu__static-logo--top .menu__static-logo-cat-top {
  width: 55%;
  height: auto;
  margin: clamp(0.5rem, 2vw, 1.5rem) auto 0;
  display: block;
}

.menu__static-menu-end {
  break-inside: avoid;
  margin-top: 2rem;
}

.menu__static-logo-tag {
  display: flex;
  align-items: center;
  gap: 0.5rem;
  border: 1px solid var(--color-burgundy);
  margin-bottom: 0.5rem;
}

.menu__static-logo .menu__static-logo-cat {
  width: clamp(1rem, 4vw, 4rem);
  height: auto;
  flex-shrink: 0;
}

.menu__static-logo-info {
  font-family: var(--font-serif);
  font-size: clamp(0.15rem, 0.55vw, 0.6rem);
  font-weight: 100;
  color: var(--color-burgundy);
  line-height: 1;
  letter-spacing: 0;
  white-space: pre-line;
  text-align: left;
  margin: 0;
}

.menu__static-logo-tag-text {
  display: flex;
  flex-direction: column;
  gap: 0.15rem;
  flex: 1 1 auto;
  min-width: 0;
}

.menu__static-allergens-note {
  font-family: var(--font-serif);
  font-size: clamp(0.15rem, 0.55vw, 0.6rem);
  font-weight: 700;
  letter-spacing: 0.05em;
  text-transform: uppercase;
  color: var(--color-burgundy);
  line-height: 1;
}

.menu__static-logo-tag--legend {
  align-items: stretch;
  gap: 0;
  padding: 0;
}

.menu__static-logo-tag--legend .menu__static-logo-tag-col {
  flex: 1 1 0;
  display: flex;
  align-items: center;
  justify-content: center;
  padding: clamp(0.15rem, 0.6vw, 0.3rem) clamp(0.25rem, 1vw, 1rem);
  min-width: 0;
}

.menu__static-logo-tag--legend .menu__static-logo-tag-col + .menu__static-logo-tag-col {
  border-left: 1px solid var(--color-burgundy);
}

.menu__static-diet-legend {
  list-style: none;
  margin: 0;
  padding: 0;
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  gap: clamp(0.2rem, 0.75vw, 0.75rem);
  font-family: var(--font-serif);
  font-size: clamp(0.15rem, 0.55vw, 0.6rem);
  font-weight: 700;
  letter-spacing: 0.05em;
  text-transform: uppercase;
  color: var(--color-burgundy);
  line-height: 1;
}

.menu__static-diet-legend li {
  display: inline-flex;
  flex-direction: column;
  align-items: center;
  gap: 0.2rem;
}

.menu__static-diet-legend-icon {
  width: clamp(0.4rem, 0.9vw, 0.85rem);
  height: clamp(0.4rem, 0.9vw, 0.85rem);
  display: block;
}

.menu__static-logo > img {
  width: 100%;
  height: auto;
}

.menu__static-logo-name {
  font-family: var(--font-serif);
  font-size: clamp(0.8rem, 3.8vw, 3.5rem);
  font-weight: 700;
  text-transform: uppercase;
  color: var(--color-burgundy);
  text-align: center;
  margin: 0;
}

.menu__static-logo-subtitle {
  font-family: var(--font-serif);
  font-size: clamp(0.2rem, 1vw, 0.875rem);
  font-weight: 700;
  color: var(--color-burgundy);
  letter-spacing: 0.02em;
}

/* Each category block — aligns to top of its grid cell */
.menu__static-category {
  align-self: start;
}

/* Category name: large bold centered uppercase — like WOK / GRILL / OVEN in PDF */
.menu__static-category-name {
  font-family: var(--font-serif);
  font-size: clamp(0.64rem, 3.04vw, 2.08rem);
  font-weight: 700;
  text-transform: uppercase;
  color: var(--color-burgundy);
  text-align: center;
  margin: 0;
  padding-bottom: clamp(0.1rem, 0.75vw, 0.5rem);
}

/* Dish row */
.menu__static-dish {
  padding: clamp(0.02rem, 0.1vw, 0.1rem) 0;
}

.menu__static-dish:last-child {
  padding-bottom: clamp(0.1rem, 0.75vw, 0.75rem);
}

/* Name left, price right — both on baseline */
.menu__static-dish-header {
  display: flex;
  justify-content: space-between;
  align-items: baseline;
  gap: clamp(0.1rem, 0.75vw, 0.75rem);
  margin-bottom: 0;
}

.menu__static-dish-name {
  font-family: var(--font-serif);
  font-size: clamp(0.2rem, 1vw, 0.8rem);
  font-weight: 700;
  color: var(--color-burgundy);
  letter-spacing: 0.02em;
  flex: 1 1 auto;
  min-width: 0;
}

/* Serving sizes: parenthetical after dish name, slightly muted, same font */
.menu__static-dish-serving-sizes {
  font-weight: 400;
  opacity: 0.7;
  margin-left: 0.15em;
}

/* Diet icons sit between name and price, baseline-aligned */
.menu__static-dish-header .dish-diet-icons {
  display: inline-flex;
  align-items: center;
  gap: 0.15rem;
  flex-shrink: 0;
}

.menu__static-dish-header .dish-diet-icons__icon {
  width:  clamp(0.4rem, 0.9vw, 0.85rem);
  height: clamp(0.4rem, 0.9vw, 0.85rem);
  display: block;
}

.menu__static-dish-price {
  font-family: var(--font-serif);
  font-size: clamp(0.2rem, 1vw, 0.875rem);
  font-weight: 400;
  color: var(--color-burgundy);
  white-space: nowrap;
  flex-shrink: 0;
}

.menu__static-dish-description {
  font-family: var(--font-serif);
  font-size: clamp(0.15rem, 0.8vw, 0.75rem);
  color: var(--color-burgundy);
  line-height: 1.5;
  margin: 0;
  font-weight: 400;
}


/* === partials/menu_static_kitchen_menu_layout === */
/* The #menu anchor wrapper holds both menu sections (one hidden via media
   query). Without display: contents, the wrapper's height equals the visible
   section's height, leaving zero pin-range for `position: sticky` so the
   section never actually pins. display: contents takes the wrapper out of
   layout so the sticky child's containing block becomes <body>, matching
   how #hero is set up. */
#menu { display: contents; }

/* Static (non-touch) menu joins the same sticky section stack as the canvas
   variant: outer is one viewport, pinned to top so reservations/booking can
   scroll over. */
.menu-section--static {
  position: sticky;
  top: 0;
  height: 100vh;
  height: 100svh;
  overflow: hidden;
  z-index: 2;
  background: var(--color-white);
  display: flex;
  align-items: center;
  justify-content: center;
}

.menu-section--static .site-section {
  width: 100%;
  box-sizing: border-box;
  overflow: hidden;
  columns: 3;
  column-fill: balance;
  column-gap: clamp(0.25rem, 3vw, 3rem);
  margin: 0;
  max-width: none;
  padding: 0 clamp(0.25rem, 1vw, 0.75rem);
  padding-top: clamp(1.25rem, 3vw, 2.25rem);
  padding-bottom: clamp(1.5rem, 4vw, 3rem);
}

.menu-section--static .menu__static-category {
  break-inside: avoid;
  display: grid;
  grid-template-columns: 1fr 1fr;
  column-gap: clamp(0.25rem, 1.25vw, 1.25rem);
  row-gap: 0;
}

.menu-section--static .menu__static-category-name {
  grid-column: 1 / -1;
}

/* Hide the top "Menu" section heading — categories speak for themselves */
.menu-section--static .site-section > .section-heading {
  display: none;
}

/* Hide all type-scoped elements by default; the inline JS in
   _menu_section.html.erb sets `.is-active` on those whose type matches
   the section's data-active-type. */
.menu-section--static .menu__static-group { display: none; }
.menu-section--static .menu__static-group.is-active { display: contents; }

.menu__static-logo {
  break-inside: avoid;
  text-align: center;
  margin-bottom: clamp(0.25rem, 2vw, 2rem);
}

.menu__static-logo--top .menu__static-logo-wordmark {
  width: 80%;
  height: auto;
  margin: 0 auto;
  display: block;
}

.menu__static-logo--top .menu__static-logo-cat-top {
  width: 55%;
  height: auto;
  margin: clamp(0.5rem, 2vw, 1.5rem) auto 0;
  display: block;
}

.menu__static-menu-end {
  break-inside: avoid;
  margin-top: 2rem;
}

.menu__static-logo-tag {
  display: flex;
  align-items: center;
  gap: 0.5rem;
  border: 1px solid var(--color-burgundy);
  margin-bottom: 0.5rem;
}

.menu__static-logo .menu__static-logo-cat {
  width: clamp(1rem, 4vw, 4rem);
  height: auto;
  flex-shrink: 0;
}

.menu__static-logo-info {
  font-family: var(--font-serif);
  font-size: clamp(0.15rem, 0.55vw, 0.6rem);
  font-weight: 100;
  color: var(--color-burgundy);
  line-height: 1;
  letter-spacing: 0;
  white-space: pre-line;
  text-align: left;
  margin: 0;
}

.menu__static-logo-tag-text {
  display: flex;
  flex-direction: column;
  gap: 0.15rem;
  flex: 1 1 auto;
  min-width: 0;
}

.menu__static-allergens-note {
  font-family: var(--font-serif);
  font-size: clamp(0.15rem, 0.55vw, 0.6rem);
  font-weight: 700;
  letter-spacing: 0.05em;
  text-transform: uppercase;
  color: var(--color-burgundy);
  line-height: 1;
}

.menu__static-logo-tag--legend {
  align-items: stretch;
  gap: 0;
  padding: 0;
}

.menu__static-logo-tag--legend .menu__static-logo-tag-col {
  flex: 1 1 0;
  display: flex;
  align-items: center;
  justify-content: center;
  padding: clamp(0.15rem, 0.6vw, 0.3rem) clamp(0.25rem, 1vw, 1rem);
  min-width: 0;
}

.menu__static-logo-tag--legend .menu__static-logo-tag-col + .menu__static-logo-tag-col {
  border-left: 1px solid var(--color-burgundy);
}

.menu__static-diet-legend {
  list-style: none;
  margin: 0;
  padding: 0;
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  gap: clamp(0.2rem, 0.75vw, 0.75rem);
  font-family: var(--font-serif);
  font-size: clamp(0.15rem, 0.55vw, 0.6rem);
  font-weight: 700;
  letter-spacing: 0.05em;
  text-transform: uppercase;
  color: var(--color-burgundy);
  line-height: 1;
}

.menu__static-diet-legend li {
  display: inline-flex;
  flex-direction: column;
  align-items: center;
  gap: 0.2rem;
}

.menu__static-diet-legend-icon {
  width: clamp(0.4rem, 0.9vw, 0.85rem);
  height: clamp(0.4rem, 0.9vw, 0.85rem);
  display: block;
}

.menu__static-logo > img {
  width: 100%;
  height: auto;
}

.menu__static-logo-name {
  font-family: var(--font-serif);
  font-size: clamp(0.8rem, 3.8vw, 3.5rem);
  font-weight: 700;
  text-transform: uppercase;
  color: var(--color-burgundy);
  text-align: center;
  margin: 0;
}

.menu__static-logo-subtitle {
  font-family: var(--font-serif);
  font-size: clamp(0.2rem, 1vw, 0.875rem);
  font-weight: 700;
  color: var(--color-burgundy);
  letter-spacing: 0.02em;
}

/* Each category block — aligns to top of its grid cell */
.menu__static-category {
  align-self: start;
}

/* Category name: large bold centered uppercase — like WOK / GRILL / OVEN in PDF */
.menu__static-category-name {
  font-family: var(--font-serif);
  font-size: clamp(0.64rem, 3.04vw, 2.08rem);
  font-weight: 700;
  text-transform: uppercase;
  color: var(--color-burgundy);
  text-align: center;
  margin: 0;
  padding-bottom: clamp(0.1rem, 0.75vw, 0.5rem);
}

/* Dish row */
.menu__static-dish {
  padding: clamp(0.02rem, 0.1vw, 0.1rem) 0;
}

.menu__static-dish:last-child {
  padding-bottom: clamp(0.1rem, 0.75vw, 0.75rem);
}

/* Name left, price right — both on baseline */
.menu__static-dish-header {
  display: flex;
  justify-content: space-between;
  align-items: baseline;
  gap: clamp(0.1rem, 0.75vw, 0.75rem);
  margin-bottom: 0;
}

.menu__static-dish-name {
  font-family: var(--font-serif);
  font-size: clamp(0.2rem, 1vw, 0.8rem);
  font-weight: 700;
  color: var(--color-burgundy);
  letter-spacing: 0.02em;
  flex: 1 1 auto;
  min-width: 0;
}

/* Serving sizes: parenthetical after dish name, slightly muted, same font */
.menu__static-dish-serving-sizes {
  font-weight: 400;
  opacity: 0.7;
  margin-left: 0.15em;
}

/* Diet icons sit between name and price, baseline-aligned */
.menu__static-dish-header .dish-diet-icons {
  display: inline-flex;
  align-items: center;
  gap: 0.15rem;
  flex-shrink: 0;
}

.menu__static-dish-header .dish-diet-icons__icon {
  width:  clamp(0.4rem, 0.9vw, 0.85rem);
  height: clamp(0.4rem, 0.9vw, 0.85rem);
  display: block;
}

.menu__static-dish-price {
  font-family: var(--font-serif);
  font-size: clamp(0.2rem, 1vw, 0.875rem);
  font-weight: 400;
  color: var(--color-burgundy);
  white-space: nowrap;
  flex-shrink: 0;
}

.menu__static-dish-description {
  font-family: var(--font-serif);
  font-size: clamp(0.15rem, 0.8vw, 0.75rem);
  color: var(--color-burgundy);
  line-height: 1.5;
  margin: 0;
  font-weight: 400;
}


/* === partials/menu_static_bar_menu_layout === */
/* The #menu anchor wrapper holds both menu sections (one hidden via media
   query). Without display: contents, the wrapper's height equals the visible
   section's height, leaving zero pin-range for `position: sticky` so the
   section never actually pins. display: contents takes the wrapper out of
   layout so the sticky child's containing block becomes <body>, matching
   how #hero is set up. */
#menu { display: contents; }

/* Static (non-touch) menu joins the same sticky section stack as the canvas
   variant: outer is one viewport, pinned to top so reservations/booking can
   scroll over. */
.menu-section--static {
  position: sticky;
  top: 0;
  height: 100vh;
  height: 100svh;
  overflow: hidden;
  z-index: 2;
  background: var(--color-white);
  display: flex;
  align-items: center;
  justify-content: center;
}

.menu-section--static .site-section {
  width: 100%;
  box-sizing: border-box;
  overflow: hidden;
  columns: 3;
  column-fill: balance;
  column-gap: clamp(0.25rem, 3vw, 3rem);
  margin: 0;
  max-width: none;
  padding: 0 clamp(0.25rem, 1vw, 0.75rem);
  padding-top: clamp(1.25rem, 3vw, 2.25rem);
  padding-bottom: clamp(1.5rem, 4vw, 3rem);
}

.menu-section--static .menu__static-category {
  break-inside: avoid;
  display: grid;
  grid-template-columns: 1fr 1fr;
  column-gap: clamp(0.25rem, 1.25vw, 1.25rem);
  row-gap: 0;
}

.menu-section--static .menu__static-category-name {
  grid-column: 1 / -1;
}

/* Hide the top "Menu" section heading — categories speak for themselves */
.menu-section--static .site-section > .section-heading {
  display: none;
}

/* Hide all type-scoped elements by default; the inline JS in
   _menu_section.html.erb sets `.is-active` on those whose type matches
   the section's data-active-type. */
.menu-section--static .menu__static-group { display: none; }
.menu-section--static .menu__static-group.is-active { display: contents; }

.menu__static-logo {
  break-inside: avoid;
  text-align: center;
  margin-bottom: clamp(0.25rem, 2vw, 2rem);
}

.menu__static-logo--top .menu__static-logo-wordmark {
  width: 80%;
  height: auto;
  margin: 0 auto;
  display: block;
}

.menu__static-logo--top .menu__static-logo-cat-top {
  width: 55%;
  height: auto;
  margin: clamp(0.5rem, 2vw, 1.5rem) auto 0;
  display: block;
}

.menu__static-menu-end {
  break-inside: avoid;
  margin-top: 2rem;
}

.menu__static-logo-tag {
  display: flex;
  align-items: center;
  gap: 0.5rem;
  border: 1px solid var(--color-burgundy);
  margin-bottom: 0.5rem;
}

.menu__static-logo .menu__static-logo-cat {
  width: clamp(1rem, 4vw, 4rem);
  height: auto;
  flex-shrink: 0;
}

.menu__static-logo-info {
  font-family: var(--font-serif);
  font-size: clamp(0.15rem, 0.55vw, 0.6rem);
  font-weight: 100;
  color: var(--color-burgundy);
  line-height: 1;
  letter-spacing: 0;
  white-space: pre-line;
  text-align: left;
  margin: 0;
}

.menu__static-logo-tag-text {
  display: flex;
  flex-direction: column;
  gap: 0.15rem;
  flex: 1 1 auto;
  min-width: 0;
}

.menu__static-allergens-note {
  font-family: var(--font-serif);
  font-size: clamp(0.15rem, 0.55vw, 0.6rem);
  font-weight: 700;
  letter-spacing: 0.05em;
  text-transform: uppercase;
  color: var(--color-burgundy);
  line-height: 1;
}

.menu__static-logo-tag--legend {
  align-items: stretch;
  gap: 0;
  padding: 0;
}

.menu__static-logo-tag--legend .menu__static-logo-tag-col {
  flex: 1 1 0;
  display: flex;
  align-items: center;
  justify-content: center;
  padding: clamp(0.15rem, 0.6vw, 0.3rem) clamp(0.25rem, 1vw, 1rem);
  min-width: 0;
}

.menu__static-logo-tag--legend .menu__static-logo-tag-col + .menu__static-logo-tag-col {
  border-left: 1px solid var(--color-burgundy);
}

.menu__static-diet-legend {
  list-style: none;
  margin: 0;
  padding: 0;
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  gap: clamp(0.2rem, 0.75vw, 0.75rem);
  font-family: var(--font-serif);
  font-size: clamp(0.15rem, 0.55vw, 0.6rem);
  font-weight: 700;
  letter-spacing: 0.05em;
  text-transform: uppercase;
  color: var(--color-burgundy);
  line-height: 1;
}

.menu__static-diet-legend li {
  display: inline-flex;
  flex-direction: column;
  align-items: center;
  gap: 0.2rem;
}

.menu__static-diet-legend-icon {
  width: clamp(0.4rem, 0.9vw, 0.85rem);
  height: clamp(0.4rem, 0.9vw, 0.85rem);
  display: block;
}

.menu__static-logo > img {
  width: 100%;
  height: auto;
}

.menu__static-logo-name {
  font-family: var(--font-serif);
  font-size: clamp(0.8rem, 3.8vw, 3.5rem);
  font-weight: 700;
  text-transform: uppercase;
  color: var(--color-burgundy);
  text-align: center;
  margin: 0;
}

.menu__static-logo-subtitle {
  font-family: var(--font-serif);
  font-size: clamp(0.2rem, 1vw, 0.875rem);
  font-weight: 700;
  color: var(--color-burgundy);
  letter-spacing: 0.02em;
}

/* Each category block — aligns to top of its grid cell */
.menu__static-category {
  align-self: start;
}

/* Category name: large bold centered uppercase — like WOK / GRILL / OVEN in PDF */
.menu__static-category-name {
  font-family: var(--font-serif);
  font-size: clamp(0.64rem, 3.04vw, 2.08rem);
  font-weight: 700;
  text-transform: uppercase;
  color: var(--color-burgundy);
  text-align: center;
  margin: 0;
  padding-bottom: clamp(0.1rem, 0.75vw, 0.5rem);
}

/* Dish row */
.menu__static-dish {
  padding: clamp(0.02rem, 0.1vw, 0.1rem) 0;
}

.menu__static-dish:last-child {
  padding-bottom: clamp(0.1rem, 0.75vw, 0.75rem);
}

/* Name left, price right — both on baseline */
.menu__static-dish-header {
  display: flex;
  justify-content: space-between;
  align-items: baseline;
  gap: clamp(0.1rem, 0.75vw, 0.75rem);
  margin-bottom: 0;
}

.menu__static-dish-name {
  font-family: var(--font-serif);
  font-size: clamp(0.2rem, 1vw, 0.8rem);
  font-weight: 700;
  color: var(--color-burgundy);
  letter-spacing: 0.02em;
  flex: 1 1 auto;
  min-width: 0;
}

/* Serving sizes: parenthetical after dish name, slightly muted, same font */
.menu__static-dish-serving-sizes {
  font-weight: 400;
  opacity: 0.7;
  margin-left: 0.15em;
}

/* Diet icons sit between name and price, baseline-aligned */
.menu__static-dish-header .dish-diet-icons {
  display: inline-flex;
  align-items: center;
  gap: 0.15rem;
  flex-shrink: 0;
}

.menu__static-dish-header .dish-diet-icons__icon {
  width:  clamp(0.4rem, 0.9vw, 0.85rem);
  height: clamp(0.4rem, 0.9vw, 0.85rem);
  display: block;
}

.menu__static-dish-price {
  font-family: var(--font-serif);
  font-size: clamp(0.2rem, 1vw, 0.875rem);
  font-weight: 400;
  color: var(--color-burgundy);
  white-space: nowrap;
  flex-shrink: 0;
}

.menu__static-dish-description {
  font-family: var(--font-serif);
  font-size: clamp(0.15rem, 0.8vw, 0.75rem);
  color: var(--color-burgundy);
  line-height: 1.5;
  margin: 0;
  font-weight: 400;
}


/* === partials/menu_static_cocktails_menu_layout === */
/* ============================================================================
   cocktails_menu_layout
   --------------------------------------------------------------------------
   Bespoke cocktails layout matching page 2 of
   ../UKOI_Menu_Bar_297x210+1,5mm_PL.ai. No selectors are shared with the
   kitchen or bar layout partials.

   This file is loaded after partials/menu_static.css in
   application.html.erb, so equal-specificity rules here win the cascade.
   ============================================================================ */

/* ─── Section-level overrides when cocktails is the active type ────────────
   The shared inline <script> in _menu_section.html.erb keeps the section's
   data-active-type attribute in sync with the active menu slug, so these
   rules engage automatically as the user toggles the type switcher. */

.menu-section--static[data-active-type="cocktails"] .site-section {
  columns: auto;          /* disable the shared 3-column multi-column flow */
  column-gap: 0;
  padding: 0;             /* full-bleed within the sticky 100svh viewport */
  max-width: none;
  width: 100%;
  height: 100%;
}

/* The cocktails layout partial intentionally omits the shared top/end
   blocks (page 2 of the .ai is full-bleed), so no hiding rules are
   needed here — the elements simply aren't in the DOM for this type. */

/* ─── Cocktails wrapper: full-bleed background, vertical grid of three rows
        (upper panel | central artwork gap | lower panel). The shared
        .menu__static-group rule sets display: contents on .is-active;
        increase specificity here so the wrapper becomes a real grid box. */

.menu-section--static .menu__static-group.cocktails-menu.is-active {
  display: grid;
  grid-template-rows: minmax(0, 1fr) clamp(4rem, 18vh, 14rem) minmax(0, 1fr);
  grid-template-columns: 1fr;
  width: 100%;
  height: 100%;
  background-color: var(--color-bg);
  background-image: url("/UKOI_Menu_Background_2.0-1024w.webp");
  background-size: cover;
  background-position: center;
  background-repeat: no-repeat;
}

@media (min-width: 1024px) {
  .menu-section--static .menu__static-group.cocktails-menu.is-active {
    background-image: url("/UKOI_Menu_Background_2.0-1920w.webp");
  }
}

/* ─── Cream-coloured dish panels. The artwork shows through the gaps
        (above the upper panel, between the panels, below the lower panel). */

.cocktails-menu__panel {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  column-gap: clamp(0.5rem, 2vw, 2rem);
  padding: clamp(0.75rem, 2vw, 2rem) clamp(1rem, 4vw, 4rem);
  align-items: start;
  justify-items: center;
}

/* Solid cream at the inner edge (meeting the central artwork band) fading to
   50% cream at the outer edge, so the artwork trims (top: snowy pines;
   bottom: waves) show through tinted instead of being cut off by a hard
   cream rectangle. */

.cocktails-menu__panel--upper {
  grid-row: 1;
  /* Extra top padding to clear the absolutely-positioned type-switcher
     pinned at the section's top edge; without it the KOKTAJLE category
     pill sits behind the switcher buttons. */
  padding-top: clamp(3rem, 6vw, 4.5rem);
  background: linear-gradient(
    to top,
    var(--color-bg),
    color-mix(in srgb, var(--color-bg) 90%, transparent)
  );
}

.cocktails-menu__panel--lower {
  grid-row: 3;
  background: linear-gradient(
    to bottom,
    var(--color-bg),
    color-mix(in srgb, var(--color-bg) 90%, transparent)
  );
}

/* ─── Column: vertical stack of header + dishes, centred. */

.cocktails-menu__col {
  display: flex;
  flex-direction: column;
  align-items: center;
  text-align: center;
  gap: clamp(0.4rem, 1vw, 1rem);
  width: 100%;
  max-width: 32ch;
}

/* ─── Category pill (KOKTAJLE / MOCKTAJLE) — bordered uppercase rectangle. */

.cocktails-menu__category {
  font-family: var(--font-serif);
  font-size: clamp(0.5rem, 0.95vw, 0.9rem);
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.18em;
  color: var(--color-burgundy);
  padding: clamp(0.15rem, 0.4vw, 0.4rem) clamp(0.6rem, 1.4vw, 1.4rem);
  margin: 0 0 clamp(0.4rem, 1vw, 1rem);
  align-self: center;
  line-height: 1;
}

/* ─── Dish block — three centred lines (name, ingredients, price+serving). */

.cocktails-menu__dish {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: clamp(0.1rem, 0.3vw, 0.3rem);
  width: 100%;
}

.cocktails-menu__dish + .cocktails-menu__dish {
  margin-top: clamp(0.5rem, 1.2vw, 1.2rem);
}

.cocktails-menu__dish-name {
  font-family: var(--font-serif);
  font-style: italic;
  font-weight: 500;
  font-size: clamp(1.5rem, 1.81vw, 1.6rem);
  color: var(--color-burgundy);
  margin: 0;
  line-height: 1.1;
}

.cocktails-menu__dish-ingredients {
  font-family: var(--font-serif);
  font-size: clamp(0.7rem, 0.82vw, 0.8rem);
  font-weight: 400;
  color: var(--color-burgundy);
  line-height: 1.35;
  letter-spacing: 0.02em;
  margin: 0;
}

.cocktails-menu__dish-meta {
  display: inline-flex;
  justify-content: center;
  gap: clamp(1rem, 3vw, 3rem);
  font-family: var(--font-serif);
  font-size: clamp(0.7rem, 0.82vw, 0.8rem);
  font-weight: 400;
  color: var(--color-burgundy);
  letter-spacing: 0.05em;
  margin: 0;
}

.cocktails-menu__dish-price,
.cocktails-menu__dish-serving {
  white-space: nowrap;
}


/* === partials/menu_static_child_menu_layout === */
/* When the active menu type uses child_menu_layout, the active group itself
   becomes an explicit 3-column grid: top logo block in column 1, a single
   block-flow wrapper of categories in column 2, end block in column 3.

   The shared `.menu__static-group.is-active { display: contents }` rule is
   overridden here so the group acts as the layout container instead of
   dissolving into the site-section flow.

   data-active-layout is set on .menu-section--static by the inline JS in
   _menu_section.html.erb, mirroring data-active-type. */
.menu-section--static[data-active-layout="child_menu_layout"] .site-section {
  columns: auto;
  column-gap: 0;
}

.menu-section--static[data-active-layout="child_menu_layout"] .menu__static-group--child.is-active {
  display: grid;
  grid-template-columns: 1fr 1fr 1fr;
  gap: clamp(0.25rem, 3vw, 3rem);
  align-items: start;
}

.menu-section--static[data-active-layout="child_menu_layout"] .menu__static-group--child .menu__static-logo--top {
  grid-column: 1;
  margin-bottom: 0;
}

.menu-section--static[data-active-layout="child_menu_layout"] .menu__static-group--child .menu__static-menu-end {
  grid-column: 3;
  margin-top: 0;
}

.menu-section--static[data-active-layout="child_menu_layout"] .menu__static-group--child .menu__static-group--child-categories {
  grid-column: 2;
}

.menu-section--static[data-active-layout="child_menu_layout"] .menu__static-group--child .menu__static-category + .menu__static-category {
  margin-top: clamp(0.5rem, 2vw, 2rem);
}


/* === partials/media_routing === */
/* Both menu sections are always in the DOM. CSS pointer media queries
   decide which to show. pointer:coarse = touch screen (phones, tablets —
   including modern iPads that report a desktop UA). pointer:fine =
   mouse/trackpad. JS in menu_controller also guards WebGL init behind
   the same check. */
@media not (pointer: coarse) {
  .menu-section:not(.menu-section--static) { display: none; }
}
@media (pointer: coarse) {
  .menu-section--static { display: none; }
}


/* === partials/reservations === */
#reservations {
  position: relative;        /* keeps z-index:3 layering outside ScrollTrigger pinning */
  min-height: 100vh;
  min-height: 100svh;
  z-index: 3;
  background: var(--color-surface);
  box-shadow: 0 -12px 32px var(--shadow-soft);
}

/* Booking-soon overlay: covers only the Q&A grid (absolute, in
   .reservations__grid's coordinate space — the section heading stays
   visible above it) and scrolls with the section. Toggled by
   opacity/pointer-events only — never changes the grid's or section's
   height (ScrollTrigger pins #reservations with pinSpacing:false; a height
   change would corrupt pin geometry). */
.reservations__overlay {
  position: absolute;
  inset: 0;
  z-index: 2;
  display: flex;
  align-items: center;
  justify-content: center;
  padding: clamp(1rem, 5vw, 3rem);
  background: var(--color-surface);
  transition: opacity 0.35s ease;
}

.reservations__overlay--hidden {
  opacity: 0;
  pointer-events: none;
}

.reservations__overlay-card {
  position: relative;
  background: var(--color-bg);
  border: 1px solid var(--color-border);
  padding: clamp(2.25rem, 5vw, 3rem) clamp(1.75rem, 4vw, 2.75rem);
  max-width: 560px;
  width: 100%;
  box-shadow:
    0 1px 0 rgb(var(--rgb-burgundy) / 0.08),
    0 24px 60px -20px rgb(var(--rgb-text) / 0.35);
}

.reservations__overlay-card::after {
  content: "";
  position: absolute;
  top: 0; left: 0; right: 0;
  height: 3px;
  background: var(--color-burgundy);
  opacity: 0.9;
}

.reservations__overlay-close {
  position: absolute;
  top: 0.85rem;
  right: 0.85rem;
  width: 2.25rem;
  height: 2.25rem;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  background: transparent;
  border: 1px solid var(--color-border);
  border-radius: 50%;
  cursor: pointer;
  color: var(--color-text-muted);
  padding: 0;
  transition: color 0.2s ease, border-color 0.2s ease, background 0.2s ease, transform 0.25s ease;
}

.reservations__overlay-close:hover {
  color: var(--color-bg);
  background: var(--color-burgundy);
  border-color: var(--color-burgundy);
  transform: rotate(90deg);
}

.reservations__overlay-close:focus-visible {
  outline: 2px solid var(--color-burgundy);
  outline-offset: 2px;
}

.reservations__overlay-close-icon {
  width: 0.9rem;
  height: 0.9rem;
  stroke: currentColor;
  stroke-width: 1.6;
  stroke-linecap: round;
  fill: none;
  display: block;
  overflow: visible;
}

.reservations__overlay-body {
  font-family: var(--font-serif);
  font-size: clamp(0.95rem, 2vw, 1.05rem);
  line-height: 1.7;
  color: var(--color-text-muted);
  margin: 0;
  padding-right: 1.5rem;
  white-space: pre-line;
}

.reservations__overlay-ninja {
  display: block;
  width: clamp(84px, 18vw, 120px);
  height: auto;
  margin: 1.75rem auto 0;
}

@media (prefers-reduced-motion: reduce) {
  .reservations__overlay,
  .reservations__overlay-close {
    transition: none;
  }
}

.reservations__grid {
  position: relative;        /* containing block for the booking-soon overlay */
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 2rem 3rem;
}

@media (max-width: 600px) {
  .reservations__grid {
    grid-template-columns: 1fr;
  }
}

.reservations__item h3 {
  font-family: var(--font-serif);
  font-size: 0.85rem;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.05em;
  color: var(--color-burgundy);
  margin: 0 0 0.5rem;
}

.reservations__item p {
  font-size: 0.95rem;
  line-height: 1.6;
  color: var(--color-text);
  margin: 0;
}


/* === partials/booking === */
#booking {
  min-height: 100vh;
  min-height: 100svh;
  z-index: 4;
  background: var(--color-surface);
  box-shadow: 0 -12px 32px var(--shadow-soft);
}

/* Booking section uses tighter vertical padding than other sections so the
   fully-revealed form fits within one viewport. */
#booking > .site-section {
  padding-block: clamp(2rem, 5vw, 3.5rem);
}

/* Author classes here set display: block | flex | grid, which outranks
   the UA rule for [hidden]. Re-hide explicitly so the controller's
   hidden=true actually hides the element. */
.booking__floor[hidden],
.booking__layout-tabs[hidden],
.booking__date-first[hidden],
.booking__field[hidden] { display: none; }

/* Visually hidden field — kept in the DOM and the form's submit data, but
   off-screen for sighted users and out-of-tree for AT/keyboard. */
.booking__field--aux {
  position: absolute;
  width: 1px;
  height: 1px;
  margin: -1px;
  padding: 0;
  overflow: hidden;
  opacity: 0;
  pointer-events: none;
  border: 0;
  clip-path: inset(50%);
}

.booking__layout {
  display: flex;
  flex-direction: column;
  gap: 2rem;
  width: 100%;
  min-width: 0;
}

/* Grid/flex items default to min-width: auto, expanding to fit content.
   Without min-width: 0 the 1fr column would inflate to the Konva canvas's
   1200 px design width and overflow .site-section. */
.booking__floors,
.booking__form-panel { min-width: 0; max-width: 100%; }

.booking__floors { width: 100%; }

.booking__canvas-wrap {
  position: relative;
  width: 100%;
  min-height: 240px;
}

/* Per-layout wrap; holds the floor title + the Konva-sized stage box.
   On mobile floors stack; on desktop they sit in a row (see media query). */
.booking__floor {
  display: block;
  margin: 0 auto;
  max-width: 100%;
  padding: 1rem;
  border-radius: 4px;
  background: rgb(var(--rgb-white) / 0.4);
}
.booking__floor + .booking__floor { margin-top: 1.5rem; }

.booking__floor-title {
  font-family: var(--font-serif);
  font-size: 0.85rem;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.05em;
  color: var(--color-burgundy);
  margin: 0 0 0.5rem;
  text-align: center;
}

/* The inline-SVG stage container. The SVG carries a viewBox, so width:100%
   + height:auto scales it to the available width at every breakpoint with
   no JS — this replaces the old Konva #fitStage measure/scale loop. */
.booking__floor-stage { display: block; margin: 0 auto; max-width: 100%; }
.booking__floor-stage svg {
  display: block;
  width: 100%;
  height: auto;       /* viewBox aspect ratio drives height */
  max-width: 100%;
}

.booking__hint {
  padding: 0 1rem;
  color: var(--color-text-muted);
  font-size: 0.95rem;
}

/* Layout selector: a row of pill buttons that switch which floor's SVG
   stage is visible. Hidden when there's only one layout (controller side). */
.booking__layout-tabs {
  display: flex;
  flex-wrap: wrap;
  gap: 0.5rem;
  justify-content: center;
  margin-bottom: 1rem;
}

.booking__layout-tab {
  position: relative;          /* anchor for the iOS-style count badge */
  min-height: 36px;
  padding: 0 1rem;
  background: transparent;
  border: 1px solid var(--color-border);
  border-radius: 999px;
  cursor: pointer;
  font: inherit;
  font-size: 0.85rem;
  color: var(--color-text);
  transition: background 0.15s ease, color 0.15s ease, border-color 0.15s ease;
}

.booking__layout-tab--active {
  background: var(--color-burgundy);
  color: var(--color-pink);
  border-color: var(--color-burgundy);
}

/* iOS-notification-style count badge: small burgundy pill anchored to the
   tab's top-right corner. Only present after a time is picked (controller
   toggles [hidden]); absence of the badge ≠ "0 free". */
.booking__layout-tab__badge {
  position: absolute;
  top: -6px;
  right: -6px;
  min-width: 18px;
  height: 18px;
  padding: 0 5px;
  display: inline-flex;
  justify-content: center;
  box-sizing: border-box;
  border-radius: 999px;
  border: 1px solid var(--color-pink);
  background: var(--color-burgundy);
  color: var(--color-pink);
  font-size: 0.7rem;
  font-weight: 700;
  line-height: 1;
  pointer-events: none;
}

.booking__layout-tab__badge[hidden] { display: none; }

/* Two-tab pill that switches the booking section between table-first and
   date-first entry paths. Lives at the top of the section, ABOVE the
   canvas/form layout, so it spans the full width and reads as a primary
   control. Radio inputs are visually replaced by their <span> labels;
   the input itself stays in the DOM for keyboard / screen-reader semantics. */
.booking__mode-toggle {
  display: flex;
  gap: 0.25rem;
  padding: 0.25rem;
  margin: 0 auto 1rem;
  max-width: 480px;
  background: var(--color-pink);
  border: 1px solid var(--color-border);
  border-radius: 999px;
}

.booking__mode-option {
  flex: 1 1 50%;
  display: flex;
  position: relative;
  cursor: pointer;
}

.booking__mode-option input {
  position: absolute;
  opacity: 0;
  pointer-events: none;
}

.booking__mode-option > span {
  display: flex;
  flex: 1;
  align-items: center;
  justify-content: center;
  text-align: center;
  padding: 0.55rem 0.75rem;
  border-radius: 999px;
  font-size: 0.9rem;
  color: var(--color-text);
  transition: background 0.15s ease, color 0.15s ease;
}

.booking__mode-option input:checked + span {
  background: var(--color-burgundy);
  color: var(--color-pink);
}

.booking__mode-option input:focus-visible + span {
  outline: 2px solid var(--color-burgundy);
  outline-offset: 2px;
}

/* Date-first stage: date / party / duration / time stacked in a single
   column. Fields stack the same way at every breakpoint (no inner grid). */
.booking__date-first {
  margin-bottom: 0.625rem;
}

.booking__date-first .booking__field { margin-bottom: 0.625rem; }

/* Once the start-time pills become available the date_first_hint is
   redundant — the next step (pick a time, then a table) is implicit in
   the pills row itself. Hide the hint so the surfaced controls aren't
   competing with stale instructions. */
[data-booking-form-target="startFieldGlobal"]:not([hidden]) + .booking__hint {
  display: none;
}

.booking__form-panel {
  padding: 0;
}

.booking__summary {
  font-size: 0.95rem;
  line-height: 1.4;
  color: var(--color-text-muted);
  margin: 0;
  /* Hold a consistent control-height baseline so the summary text box
     reads at the same height as the field inputs stacked below it. */
  min-height: 36px;
  display: flex;
  align-items: center;
}

.booking__field {
  display: block;
  margin-bottom: 0.625rem;
  border: 0;
  padding: 0;
}

/* Opt-in horizontal grouping. Wrap two (or more) .booking__field elements in
   a .booking__row to place them side by side (e.g. first name + last name).
   Children flex to equal widths and wrap back to a stack on narrow viewports
   so the width:100% inputs never overflow — no media query needed. The row
   carries the vertical rhythm so grouped fields keep the same spacing as the
   stacked ones around them. Apply manually around whichever fields should
   share a row inside .booking__form-top / .booking__form-bottom. */
.booking__row {
  display: flex;
  flex-wrap: wrap;
  gap: 0.625rem 0.75rem;        /* row-gap when wrapped to a stack / column-gap when side by side */
  margin-bottom: 0.625rem;
}

.booking__row > .booking__field {
  flex: 1 1 0;                  /* equal widths, no per-field minimum: the row's
                                   children always stay on one line and scale
                                   down together, even in the narrow booking
                                   form column / on mobile date-first */
  min-width: 0;                 /* let the 100%-width inputs shrink instead of overflowing */
  margin-bottom: 0;             /* the row owns the bottom spacing */
}

/* A field flagged --wide always takes its own full-width row even inside a
   .booking__row (matches its standalone behaviour for textarea etc.). */
.booking__row > .booking__field--wide {
  flex-basis: 100%;
}

/* Table-first mode reveals fields one step at a time (date → duration →
   start → party size). Without reserving their layout space the rest of
   the form (name, email, phone, …) jumps down on each reveal. Hold each
   progressive field in flow with a min-height baseline; while [hidden],
   the field stays in flow but invisible (visibility: hidden) so siblings
   below stay anchored. The start-time pills field is excluded — its
   height is too variable (number of slots wraps unpredictably) so it
   keeps the default reveal-and-push behavior. Scoped to table-first;
   date-first mode keeps `display: none`. */
[data-booking-form-mode-value="table-first"] [data-booking-form-target="dateField"],
[data-booking-form-mode-value="table-first"] [data-booking-form-target="durationField"],
[data-booking-form-mode-value="table-first"] [data-booking-form-target="partySizeField"] {
  /* Match a static field row: ~19px label + 4px label-margin + 40-44px input
     control ≈ 63-67px. 4rem (64px) lines up empty placeholders with the
     surrounding name/email rows so spacing reads the same whether the field
     is filled or reserved. */
  min-height: 4rem;
}
[data-booking-form-mode-value="table-first"] [data-booking-form-target="dateField"][hidden],
[data-booking-form-mode-value="table-first"] [data-booking-form-target="durationField"][hidden],
[data-booking-form-mode-value="table-first"] [data-booking-form-target="partySizeField"][hidden] {
  display: block;
  visibility: hidden;
}

.booking__field > span,
.booking__field > legend {
  display: block;
  margin-bottom: 0.25rem;
  font-family: var(--font-serif);
  font-size: 0.8rem;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.05em;
  color: var(--color-burgundy);
}

.booking__field input,
.booking__field textarea,
.booking__field select {
  box-sizing: border-box;       /* width: 100% + padding must stay within parent */
  width: 100%;
  padding: 0.6rem 0.75rem;
  border: 1px solid var(--color-border);
  border-radius: 4px;
  background: var(--color-pink);
  color: var(--color-text);
  font: inherit;
  min-height: 44px;
}

.booking__field textarea { min-height: 56px; resize: vertical; }

/* iOS Safari gives <input type="date"> an intrinsic min-width that ignores
   `width: 100%`, causing the field to overflow narrow mobile containers.
   It also injects vertical metrics into the native date control that don't
   respect the shared `min-height: 44px`, so the field renders a few px off
   from the surrounding inputs — pin an explicit height to align them. */
.booking__field input[type="date"] {
  -webkit-appearance: none;
  appearance: none;
  min-width: 0;
  max-width: 100%;
  height: 44px;
}

.booking__field input:focus,
.booking__field textarea:focus,
.booking__field select:focus {
  outline: none;
  border-color: var(--color-burgundy);
}

/* `appearance: base-select` opts into the new customizable native select.
   Browsers without support fall back to the platform's default rendering. */
.booking__field select {
  appearance: base-select;
  cursor: pointer;
  text-align: left;
}

.booking__field select::picker-icon {
  color: var(--color-burgundy);
  transition: transform 0.15s ease;
}

.booking__field select:open::picker-icon { transform: rotate(180deg); }

.booking__field select::picker(select) {
  appearance: base-select;
  border: 1px solid var(--color-border);
  border-radius: 4px;
  background: var(--color-pink);
  padding: 0.25rem;
  box-shadow: 0 8px 24px rgb(var(--rgb-black) / 0.12);
}

.booking__field select option {
  padding: 0.4rem 0.6rem;
  border-radius: 3px;
  color: var(--color-text);
}

.booking__field select option:checked {
  background: var(--color-burgundy);
  color: var(--color-pink);
}

.booking__field select option:hover { background: var(--color-burgundy-light); }

.booking__pills {
  display: flex;
  flex-wrap: wrap;
  gap: 0.5rem;
  align-items: center;
}

/* Empty-state placeholder for pills — shown until the controller injects
   pill buttons (or a hint paragraph). The :empty selector matches only
   when the container has no children, so the placeholder cleanly
   disappears as soon as content lands. */
.booking__pills:empty::before {
  content: attr(data-placeholder);
  color: var(--color-text-muted);
  font-style: italic;
  font-size: 0.95rem;
}

.booking__pill {
  min-height: 30px;
  padding: 0 0.5rem;
  background: transparent;
  border: 1px solid var(--color-border);
  border-radius: 999px;
  cursor: pointer;
  font: inherit;
  color: var(--color-text);
  text-align: center;
}

.booking__pill--selected {
  background: var(--color-burgundy);
  color: var(--color-pink);
  border-color: var(--color-burgundy);
}

/* Warning banner shown directly under the booking heading when bookings
   are temporarily unavailable. */
.booking__notice {
  margin: 1rem 0 1.5rem;
  padding: 0.75rem 1.25rem;
  background: var(--color-pink);
  border: 1px solid var(--color-burgundy);
  border-radius: 4px;
  color: var(--color-burgundy);
  font-size: 0.95rem;
  font-weight: 700;
  text-align: center;
}

.booking__errors {
  margin: 0 0 0.75rem;
  padding: 0;
  list-style: none;
  color: var(--color-burgundy);
  font-size: 0.9rem;
}

.booking__submit {
  display: inline-block;
  padding: 0.6rem 1.6rem;
  min-height: 40px;
  font-family: var(--font-serif);
  font-size: 0.85rem;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.10em;
  background: var(--color-burgundy);
  color: var(--color-pink);
  border: none;
  border-radius: 4px;
  cursor: pointer;
  transition: background 0.2s ease;
}

.booking__submit:hover { background: var(--color-burgundy-light); }
.booking__submit:disabled { opacity: 0.5; }

.booking__submit.is-loading {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 0.6rem;
}
.booking__submit.is-loading::before {
  content: "";
  width: 0.9em;
  height: 0.9em;
  border: 2px solid currentColor;
  border-right-color: transparent;
  border-radius: 50%;
  animation: booking-submit-spin 0.7s linear infinite;
  flex-shrink: 0;
}
@keyframes booking-submit-spin { to { transform: rotate(360deg); } }

/* Mobile — when the user picks the date-first entry path, slot the canvas
   between the date/time selectors and the contact fields:
     date / party / duration / time  →  canvas  →  contact fields  →  book.
   .booking__form-panel and its <form> become display: contents so their
   children (.booking__form-top, .booking__form-bottom, the submit button)
   collapse into flex children of .booking__layout; four order values then
   interleave the canvas between the datetime and contact blocks.
   Table-first keeps the natural canvas-then-form source order. */
@media (max-width: 1023.98px) {
  [data-booking-form-mode-value="date-first"] .booking__form-panel,
  [data-booking-form-mode-value="date-first"] .booking__form-panel > form {
    display: contents;
  }
  /* .booking__layout is already display:flex; flex-direction:column at the
     mobile base — these order values interleave the canvas between the
     datetime block and the contact block. */
  [data-booking-form-mode-value="date-first"] .booking__form-top    { order: 1; }
  [data-booking-form-mode-value="date-first"] .booking__floors      { order: 2; }
  [data-booking-form-mode-value="date-first"] .booking__form-bottom { order: 3; }
  [data-booking-form-mode-value="date-first"] .booking__submit      { order: 4; }

  .booking__submit { margin-bottom: 2rem; }
}

/* Desktop — canvas (with floor selector tabs above it) on the left,
   booking form panel on the right. */
@media (min-width: 1024px) {
  .booking__layout {
    flex-direction: row;
    align-items: flex-start;
    gap: 2.5rem;
  }

  .booking__floors { flex: 1.4 1 0; min-width: 0; }

  .booking__form-panel {
    flex: 1 1 0;
    min-width: 320px;
    padding: 0;
    position: sticky;
    top: calc(var(--nav-height) + 1rem);
  }

  .booking__canvas-wrap { display: block; }

  .booking__floor {
    margin: 0 auto;
    min-width: 0;
  }
  .booking__floor + .booking__floor { margin-top: 0; }

  .booking__field {
    margin-bottom: 0.625rem;
    min-width: 0;
  }

  .booking__field input,
  .booking__field select,
  .booking__field textarea {
    min-height: 40px;
    padding: 0.45rem 0.7rem;
  }

  .booking__field textarea {
    min-height: 56px;
  }

  /* Mobile rule pins the date input to 44px; bring it down to 40px here so
     it matches the tighter desktop input height. */
  .booking__field input[type="date"] { height: 40px; }
}

/* Flatpickr is injected into <body>, so target its classes at the top level.
   Visual sibling: the .booking__field select::picker(select) dropdown — same
   pink surface, hairline border, soft shadow, and burgundy selected state.
   The `body` prefix bumps specificity above flatpickr's own rules so we win
   the cascade regardless of which stylesheet's preload completes first. */
body .flatpickr-calendar {
  background: var(--color-pink);
  border: 1px solid var(--color-border);
  border-radius: 4px;
  box-shadow: 0 8px 24px rgb(var(--rgb-black) / 0.12);
  color: var(--color-text);
  font-family: var(--font-sans);
  font-weight: 500;
}

body .flatpickr-calendar.arrowTop::before,
body .flatpickr-calendar.arrowBottom::before { border-bottom-color: var(--color-border); border-top-color: var(--color-border); }
body .flatpickr-calendar.arrowTop::after { border-bottom-color: var(--color-pink); }
body .flatpickr-calendar.arrowBottom::after { border-top-color: var(--color-pink); }

body .flatpickr-months {
  background: var(--color-pink);
  border-top-left-radius: 4px;
  border-top-right-radius: 4px;
}

body .flatpickr-months .flatpickr-month {
  background: var(--color-pink);
  color: var(--color-burgundy);
}

body .flatpickr-current-month,
body .flatpickr-current-month .cur-month,
body .flatpickr-current-month .flatpickr-monthDropdown-months,
body .flatpickr-current-month .numInputWrapper input.cur-year {
  color: var(--color-burgundy);
  font-family: var(--font-serif);
  font-weight: 700;
}

body .flatpickr-current-month .numInputWrapper { color: var(--color-burgundy); }

body .flatpickr-monthDropdown-months .flatpickr-monthDropdown-month {
  background: var(--color-pink);
  color: var(--color-text);
}

body .flatpickr-months .flatpickr-prev-month,
body .flatpickr-months .flatpickr-next-month {
  color: var(--color-burgundy);
  fill: var(--color-burgundy);
}

body .flatpickr-months .flatpickr-prev-month svg,
body .flatpickr-months .flatpickr-next-month svg { fill: var(--color-burgundy); }

body .flatpickr-months .flatpickr-prev-month:hover,
body .flatpickr-months .flatpickr-next-month:hover { color: var(--color-burgundy-light); }

body .flatpickr-months .flatpickr-prev-month:hover svg,
body .flatpickr-months .flatpickr-next-month:hover svg { fill: var(--color-burgundy-light); }

body .flatpickr-weekdays { background: var(--color-pink); }

body .flatpickr-weekdaycontainer { background: var(--color-pink); }

body span.flatpickr-weekday {
  background: var(--color-pink);
  color: var(--color-burgundy);
  font-family: var(--font-serif);
  font-size: 0.8rem;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.05em;
}

body .flatpickr-days,
body .dayContainer { background: var(--color-pink); }

body .flatpickr-day {
  border-radius: 4px;
  color: var(--color-text);
  font-weight: 500;
}

body .flatpickr-day:hover,
body .flatpickr-day:focus {
  background: var(--color-burgundy-light);
  border-color: var(--color-burgundy-light);
  color: var(--color-pink);
}

body .flatpickr-day.today {
  border-color: var(--color-burgundy);
  color: var(--color-burgundy);
  font-weight: 700;
}

body .flatpickr-day.today:hover,
body .flatpickr-day.today:focus {
  background: var(--color-burgundy-light);
  border-color: var(--color-burgundy-light);
  color: var(--color-pink);
}

body .flatpickr-day.selected,
body .flatpickr-day.selected:hover,
body .flatpickr-day.selected:focus,
body .flatpickr-day.startRange,
body .flatpickr-day.endRange,
body .flatpickr-day.selected.startRange,
body .flatpickr-day.selected.endRange {
  background: var(--color-burgundy);
  border-color: var(--color-burgundy);
  color: var(--color-pink);
  font-weight: 700;
}

body .flatpickr-day.flatpickr-disabled,
body .flatpickr-day.flatpickr-disabled:hover,
body .flatpickr-day.flatpickr-disabled:focus,
body .flatpickr-day.notAllowed,
body .flatpickr-day.notAllowed.prevMonthDay,
body .flatpickr-day.notAllowed.nextMonthDay {
  background: transparent;
  border-color: transparent;
  color: rgb(var(--rgb-text) / 0.25);
  cursor: default;
}

body .flatpickr-day.prevMonthDay,
body .flatpickr-day.nextMonthDay { color: rgb(var(--rgb-text) / 0.25); }


/* === partials/booking_show === */
/* Standalone confirmation page at /bookings/:uuid. */
.booking-show {
  position: relative;
  min-height: 100vh;
  padding-block: clamp(2rem, 6vw, 4rem);
  background: var(--color-bg);
  box-sizing: border-box;
}

.booking-show .site-section {
  position: relative;
  z-index: 1;
  background: var(--color-surface);
  border-radius: 8px;
  padding: clamp(2rem, 6vw, 3.5rem) clamp(1.5rem, 5vw, 3rem);
  box-shadow: 0 12px 40px rgb(var(--rgb-black) / 0.05);
}

.booking-show__flash {
  margin: 0 0 1.5rem;
  padding: 0.75rem 1rem;
  border-radius: 4px;
  font-size: 0.95rem;
  line-height: 1.5;
}

.booking-show__flash--notice {
  background: var(--color-pink);
  color: var(--color-burgundy);
  border: 1px solid var(--color-border);
}

.booking-show__flash--alert {
  background: var(--color-burgundy);
  color: var(--color-pink);
}

.booking-show__status-row {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 0.75rem;
  margin: 0 0 2rem;
}

.booking-show__status {
  display: inline-flex;
  align-items: center;
  gap: 0.6rem;
  margin: 0;
  padding: 0.55rem 1.1rem;
  border-radius: 999px;
  background: rgb(var(--rgb-white) / 0.5);
  border: 1px solid var(--color-border);
  font-family: var(--font-serif);
  font-size: 0.9rem;
  font-weight: 700;
  color: var(--color-text);
  letter-spacing: 0.04em;
}

.booking-show__status strong {
  font-size: 0.7rem;
  text-transform: uppercase;
  letter-spacing: 0.10em;
  color: var(--color-burgundy);
  font-weight: 700;
}

.booking-show__status--approved {
  background: var(--color-burgundy);
  color: var(--color-pink);
  border-color: var(--color-burgundy);
}

.booking-show__status--approved strong { color: rgb(var(--rgb-pink) / 0.65); }

.booking-show__status--cancelled {
  background: transparent;
  border-color: var(--color-text-muted);
  color: var(--color-text-muted);
}

.booking-show__status--cancelled strong { color: var(--color-text-muted); }

.booking-show__details {
  display: grid;
  grid-template-columns: max-content 1fr;
  gap: 0.85rem 1.5rem;
  margin: 0 0 2rem;
  padding: 1.25rem 1.5rem;
  background: rgb(var(--rgb-white) / 0.45);
  border-radius: 4px;
}

.booking-show__details dt {
  font-family: var(--font-serif);
  font-size: 0.78rem;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.05em;
  color: var(--color-burgundy);
  margin: 0;
  align-self: center;
}

.booking-show__details dd {
  font-family: var(--font-serif);
  font-size: 1rem;
  font-weight: 700;
  color: var(--color-text);
  margin: 0;
  align-self: center;
}

.booking-show__notes,
.booking-show__guest {
  margin: 0 0 2rem;
  padding: 1.25rem 1.5rem;
  background: rgb(var(--rgb-white) / 0.45);
  border-radius: 4px;
}

.booking-show__notes h2 {
  font-family: var(--font-serif);
  font-size: 0.85rem;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.05em;
  color: var(--color-burgundy);
  margin: 0 0 0.6rem;
}

.booking-show__notes p {
  font-size: 0.95rem;
  line-height: 1.7;
  color: var(--color-text);
  margin: 0;
}

.booking-show__guest {
  font-size: 1rem;
  line-height: 1.7;
  color: var(--color-text);
}

.booking-show__guest strong {
  display: block;
  font-family: var(--font-serif);
  font-size: 0.78rem;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.05em;
  color: var(--color-burgundy);
  margin-bottom: 0.5rem;
}

.booking-show__cancel {
  display: inline-flex;
  align-items: center;
  padding: 0.85rem 2rem;
  min-height: 48px;
  font-family: var(--font-serif);
  font-size: 0.85rem;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.10em;
  background: var(--color-burgundy);
  color: var(--color-pink);
  border: none;
  border-radius: 4px;
  cursor: pointer;
  transition: background 0.2s ease;
}

.booking-show__cancel:hover { background: var(--color-burgundy-light); }

.booking-show__add-to-calendar {
  display: inline-flex;
  align-items: center;
  gap: 0.4rem;
  padding: 0.55rem 1rem;
  font-family: var(--font-serif);
  font-size: 0.8rem;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.06em;
  background: rgb(var(--rgb-white) / 0.5);
  color: var(--color-burgundy);
  border: 1px solid var(--color-border);
  border-radius: 999px;
  text-decoration: none;
  transition: background 0.2s ease, color 0.2s ease, border-color 0.2s ease;
}

.booking-show__add-to-calendar:hover {
  background: var(--color-burgundy);
  color: var(--color-pink);
  border-color: var(--color-burgundy);
}

.booking-show__add-to-calendar-icon {
  width: 1.05em;
  height: 1.05em;
  flex-shrink: 0;
}

@media (max-width: 600px) {
  .booking-show__add-to-calendar-label { display: none; }
  .booking-show__add-to-calendar { padding: 0.5rem 0.7rem; gap: 0; }
}

@media (max-width: 600px) {
  .booking-show__details {
    grid-template-columns: 1fr;
    gap: 0.2rem 0;
  }
  .booking-show__details dd {
    margin: 0 0 0.85rem;
  }
  .booking-show__details dd:last-of-type { margin-bottom: 0; }
}


/* === partials/allergens === */
/* Standalone allergens page at /:locale/allergens. */
.allergens {
  position: relative;
  min-height: 100vh;
  padding-block: clamp(2rem, 6vw, 4rem);
  background: var(--color-bg);
  box-sizing: border-box;
}

.allergens .site-section {
  position: relative;
  z-index: 1;
  background: var(--color-surface);
  border-radius: 8px;
  padding: clamp(2rem, 6vw, 3.5rem) clamp(1.5rem, 5vw, 3rem);
  box-shadow: 0 12px 40px rgb(var(--rgb-black) / 0.05);
}

.allergens__intro {
  font-size: 1rem;
  line-height: 1.7;
  color: var(--color-text);
  margin: 0 0 1rem;
}

.allergens__key {
  font-size: 0.8rem;
  color: var(--color-text-muted);
  margin: 0 0 1.25rem;
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 0.4rem;
}

.allergens__key-icon {
  width: 0.9rem;
  height: 0.9rem;
  vertical-align: middle;
}

/* Scroll wrapper. Keeps the table inside the card; provides horizontal pan
   on narrow viewports. */
/* Scroll panel: cap the height so the wrapper itself is the scroll
   container for BOTH axes. This is what lets the sticky column headers
   (top:0) and category band rows (top:var(--thead-h)) actually pin —
   they stick to the top of this box instead of scrolling off the page
   with it. Height = viewport minus the fixed nav and a little breathing
   room. */
.allergens-table-wrapper {
  position: relative;
  overflow: auto;
  max-width: 100%;
  max-height: calc(100vh - var(--nav-height) - 2rem);
}

.allergens-table {
  --thead-h: 7rem;
  border-collapse: separate;
  border-spacing: 0;
  width: max-content;
  min-width: 100%;
  font-family: var(--font-serif);
  color: var(--color-text);
}

/* Column headers */
.allergens-table__corner,
.allergens-table__col-header {
  background: var(--color-surface);
  border-bottom: 2px solid var(--color-burgundy);
  font-weight: 700;
  padding: 0.4rem 0.25rem;
  vertical-align: bottom;
  text-align: center;
  position: sticky;
  top: 0;
  z-index: 2;
}

.allergens-table__col-header {
  height: var(--thead-h);
  min-width: 1.8rem;
  max-width: 2.2rem;
}

.allergens-table__col-num {
  display: block;
  font-size: 0.9rem;
  line-height: 1;
  color: var(--color-burgundy);
}

.allergens-table__col-label {
  display: inline-block;
  writing-mode: vertical-rl;
  transform: rotate(180deg);
  font-size: 0.75rem;
  font-weight: 600;
  letter-spacing: 0.02em;
  line-height: 1;
  text-transform: lowercase;
  color: var(--color-text-muted);
  margin-top: 0.4rem;
  white-space: nowrap;
}

/* Corner cell (top-left) — both top and left sticky. */
.allergens-table__corner {
  left: 0;
  z-index: 3;
}

/* Category band: full-width row, sticky just below the column-header row.
   The header cells are content-box, so their real rendered height is
   --thead-h PLUS their vertical padding (0.4rem top + 0.4rem bottom) and
   2px bottom border. Offsetting by exactly that lands the band on the
   header's bottom edge instead of ~0.9rem too high (which made it drift
   up under the header on scroll). Tracks both breakpoints since only
   --thead-h changes responsively; padding/border are constant. */
.allergens-table__band-row {
  position: sticky;
  top: calc(var(--thead-h) + 0.8rem + 2px);
  z-index: 2;
}

.allergens-table__band {
  background: var(--color-burgundy);
  color: rgb(var(--rgb-white));
  font-family: var(--font-serif);
  font-size: 0.85rem;
  font-weight: 700;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  text-align: left;
  padding: 0;
}

.allergens-table__band-label {
  position: sticky;
  left: 0;
  display: inline-block;
  padding: 0.5rem 0.9rem;
}

.allergens-table__band-menu {
  font-weight: 400;
  opacity: 0.7;
}

.allergens-table__band-sep {
  opacity: 0.7;
}

/* Ingredients sub-row: the cell spans the table, but its content is pinned
   to the left and constrained to the dish-name column width so it does not
   scroll horizontally with the allergen columns. */
.allergens-table__ingredients {
  padding: 0;
  border-bottom: 1px solid rgb(var(--rgb-black) / 0.08);
}

.allergens-table__ingredients-inner {
  position: sticky;
  left: 0;
  display: block;
  box-sizing: border-box;
  min-width: 14rem;
  max-width: 18rem;
  text-align: left;
  font-size: 0.8rem;
  line-height: 1.4;
  color: rgb(var(--rgb-black) / 0.6);
  white-space: normal;
  overflow-wrap: anywhere;
  padding: 0.15rem 0.9rem 0.6rem;
}

.allergens-table__ingredients-label {
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.04em;
  font-size: 0.7rem;
  margin-right: 0.35rem;
}

/* Dish rows */
.allergens-table__dish-row > th,
.allergens-table__dish-row > td {
  border-bottom: 1px solid rgb(var(--rgb-black) / 0.08);
  padding: 0.55rem 0.15rem;
}

.allergens-table__dish-row:hover > td,
.allergens-table__dish-row:hover > th {
  background: rgb(var(--rgb-burgundy) / 0.04);
}

.allergens-table__dish-name {
  position: sticky;
  left: 0;
  z-index: 1;
  background: var(--color-surface);
  text-align: left;
  font-weight: 700;
  font-size: 0.95rem;
  padding-right: 1rem;
  box-shadow: inset -1px 0 0 rgb(var(--rgb-black) / 0.08);
  overflow-wrap: anywhere;
  min-width: 14rem;
  max-width: 18rem;
}

/* Keep the sticky name column opaque on hover — layer the tint over the
   surface instead of replacing it, otherwise the 4%-alpha colour makes the
   column see-through and dots in columns scrolled underneath show through. */
.allergens-table__dish-row:hover > .allergens-table__dish-name {
  background:
    linear-gradient(rgb(var(--rgb-burgundy) / 0.04), rgb(var(--rgb-burgundy) / 0.04)),
    var(--color-surface);
}

.allergens-table__dish-name-text {
  display: inline;
}

.allergens-table__dish-serving {
  font-weight: 400;
  opacity: 0.7;
  margin-left: 0.15em;
}

.allergens-table__dish-name .dish-diet-icons {
  display: inline-flex;
  align-items: center;
  gap: 0.2rem;
  margin-left: 0.4rem;
  vertical-align: middle;
}

.allergens-table__dish-name .dish-diet-icons__icon {
  width: 0.9rem;
  height: 0.9rem;
  display: block;
}

/* Cells */
.allergens-table__cell {
  text-align: center;
  vertical-align: middle;
}

.allergens-table__dot {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 1.1rem;
  height: 1.1rem;
  font-size: 0.95rem;
  line-height: 1;
}

.allergens-table__dot--contains {
  color: var(--color-burgundy);
}

.allergens-table__dot--may {
  color: var(--color-burgundy);
  opacity: 0.65;
}

@media (max-width: 700px) {
  .allergens-table { --thead-h: 6rem; }
  .allergens-table__dish-name {
    min-width: 11rem;
    max-width: 13rem;
    font-size: 0.85rem;
  }
  .allergens-table__col-header { min-width: 1.5rem; max-width: 1.9rem; }
  .allergens-table__col-num    { font-size: 0.8rem; }
  .allergens-table__col-label  { font-size: 0.65rem; margin-top: 0.3rem; }
  .allergens-table__band       { font-size: 0.75rem; }
  .allergens-table__band-label { padding: 0.4rem 0.6rem; }
  .allergens-table__dish-row > th,
  .allergens-table__dish-row > td { padding: 0.45rem 0.1rem; }
  .allergens-table__ingredients-inner {
    min-width: 11rem;
    max-width: 13rem;
    font-size: 0.72rem;
    padding: 0.1rem 0.6rem 0.5rem;
  }
}


/* === partials/faq === */
#faq {
  position: relative;
  min-height: 100vh;
  min-height: 100svh;
  z-index: 5;
  background: var(--color-bg);
  box-shadow: 0 -12px 32px var(--shadow-soft);
}

.faq__list {
  display: flex;
  flex-direction: column;
  gap: 0;
  border-top: 1px solid var(--color-border);
}

details.faq__item {
  border-bottom: 1px solid var(--color-border);
}

details.faq__item summary {
  list-style: none;
  padding: 1.1rem 0;
  font-family: var(--font-serif);
  font-size: 0.95rem;
  font-weight: 700;
  color: var(--color-text);
  cursor: pointer;
  display: flex;
  justify-content: space-between;
  align-items: center;
  gap: 1rem;
  user-select: none;
}

details.faq__item summary::-webkit-details-marker {
  display: none;
}

.faq__icon {
  position: relative;
  flex-shrink: 0;
  width: 1rem;
  height: 1rem;
  color: var(--color-burgundy);
  transition: transform 0.25s ease;
}

.faq__icon::before,
.faq__icon::after {
  content: "";
  position: absolute;
  top: 50%;
  left: 50%;
  background: currentColor;
  border-radius: 1px;
}

.faq__icon::before {
  width: 1rem;
  height: 1.6px;
  transform: translate(-50%, -50%);
}

.faq__icon::after {
  width: 1.6px;
  height: 1rem;
  transform: translate(-50%, -50%);
}

details.faq__item[open] .faq__icon {
  transform: rotate(45deg);
}

details.faq__item .faq__answer {
  overflow: hidden;
  transition: height 0.28s ease;
  padding: 0 0 1.25rem;
  font-size: 0.95rem;
  line-height: 1.7;
  color: var(--color-text-muted);
}

details.faq__item .faq__answer .faq__answer-link {
  color: var(--color-burgundy);
  font-weight: 700;
  letter-spacing: 0.03em;
  text-decoration: underline;
  text-underline-offset: 2px;
}

details.faq__item .faq__answer .faq__answer-link:hover {
  text-decoration: none;
}


/* === partials/contact === */
#contact {
  z-index: 6;
  background: var(--color-burgundy);
  color: var(--color-pink);
  box-shadow: 0 -12px 32px rgb(var(--rgb-black) / 0.15);
}

#contact .section-heading {
  color: var(--color-pink);
}

#contact .section-heading::after {
  background: var(--color-pink);
}

.contact__grid {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 2rem 3rem;
}

@media (max-width: 600px) {
  .contact__grid {
    grid-template-columns: 1fr;
  }
}

.contact__group h3 {
  font-family: var(--font-serif);
  font-size: 0.8rem;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.10em;
  color: rgb(var(--rgb-pink) / 0.55);
  margin: 0 0 0.4rem;
}

.contact__group p,
.contact__group a {
  font-size: 1rem;
  line-height: 1.6;
  color: var(--color-pink);
  text-decoration: none;
  margin: 0;
  display: block;
}

.contact__group a:hover {
  text-decoration: underline;
}

.contact__hours-list {
  list-style: none;
  padding: 0;
  margin: 0;
  font-size: 0.9rem;
  line-height: 1.8;
  color: var(--color-pink);
}


/* === partials/footer === */
footer {
  position: relative;
  z-index: 10;
  background: var(--color-burgundy);
  border-top: 1px solid rgb(var(--rgb-pink) / 0.12);
  padding: 1.5rem clamp(1rem, 5vw, 3rem);
  text-align: center;
  font-family: var(--font-serif);
  font-size: 0.75rem;
  color: rgb(var(--rgb-pink) / 0.4);
  letter-spacing: 0.05em;
}


/* === partials/popup === */
body.popup-open {
  overflow: hidden;
  touch-action: none;
}

.popup {
  position: fixed;
  inset: 0;
  z-index: 9995;
  display: flex;
  align-items: center;
  justify-content: center;
  padding: clamp(1rem, 4vw, 2rem);
  opacity: 1;
  transition: opacity 0.4s ease;
}

.popup--hidden {
  opacity: 0;
  pointer-events: none;
}

.popup__overlay {
  position: absolute;
  inset: 0;
  background: var(--color-popup-backdrop);
}

.popup__card {
  position: relative;
  z-index: 1;
  background: var(--color-bg);
  border: 1px solid var(--color-border);
  padding: clamp(2.25rem, 5vw, 3rem) clamp(1.75rem, 4vw, 2.75rem) clamp(2rem, 4vw, 2.5rem);
  max-width: 480px;
  width: 100%;
  box-shadow:
    0 1px 0 rgb(var(--rgb-burgundy) / 0.08),
    0 24px 60px -20px rgb(var(--rgb-text) / 0.35),
    0 8px 24px -12px rgb(var(--rgb-burgundy) / 0.18);
  overflow: hidden;
  transform: translateY(0) scale(1);
  transition: transform 0.55s cubic-bezier(0.22, 1, 0.36, 1),
              opacity 0.45s ease;
}

.popup--hidden .popup__card {
  transform: translateY(20px) scale(0.97);
  opacity: 0;
}

.popup__card::after {
  content: "";
  position: absolute;
  top: 0;
  left: 0;
  right: 0;
  height: 3px;
  background: var(--color-burgundy);
  opacity: 0.9;
}

.popup__close {
  position: absolute;
  top: 0.85rem;
  right: 0.85rem;
  width: 2.25rem;
  height: 2.25rem;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  background: transparent;
  border: 1px solid var(--color-border);
  border-radius: 50%;
  cursor: pointer;
  color: var(--color-text-muted);
  padding: 0;
  z-index: 2;
  transition: color 0.2s ease, border-color 0.2s ease, background 0.2s ease, transform 0.25s ease;
}

.popup__close-icon {
  width: 0.9rem;
  height: 0.9rem;
  stroke: currentColor;
  stroke-width: 1.6;
  stroke-linecap: round;
  fill: none;
  display: block;
  overflow: visible;
}

.popup__close:hover {
  color: var(--color-bg);
  background: var(--color-burgundy);
  border-color: var(--color-burgundy);
  transform: rotate(90deg);
}

.popup__close:focus-visible {
  outline: 2px solid var(--color-burgundy);
  outline-offset: 2px;
}

.popup__title {
  position: relative;
  font-family: var(--font-serif);
  font-size: clamp(1.35rem, 3.2vw, 1.75rem);
  font-weight: 700;
  letter-spacing: 0.10em;
  text-transform: uppercase;
  color: var(--color-burgundy);
  margin: 0 0 1.25rem;
  padding-right: 2rem;
}

.popup__title::after { margin-top: 0.75rem; }

.popup__image {
  display: block;
  width: calc(100% + 2 * clamp(1.75rem, 4vw, 2.75rem));
  margin-left: calc(-1 * clamp(1.75rem, 4vw, 2.75rem));
  margin-right: calc(-1 * clamp(1.75rem, 4vw, 2.75rem));
  margin-bottom: 1.25rem;
  max-height: 300px;
  height: auto;
  object-fit: contain;
}

.popup__body {
  position: relative;
  font-family: var(--font-serif);
  font-weight: 400;
  font-size: clamp(0.95rem, 2vw, 1.05rem);
  line-height: 1.7;
  letter-spacing: 0.01em;
  color: var(--color-text-muted);
  margin: 0;
}

@media (prefers-reduced-motion: reduce) {
  .popup,
  .popup__card,
  .popup__close {
    transition: none;
    animation: none;
  }
}


/* === partials/coming_soon === */
.coming-soon-page {
  position: relative;
  height: 100vh;
  height: 100svh;
  overflow: hidden;
  background-color: var(--color-bg);
}

.coming-soon {
  position: relative;
  z-index: 1;
  box-sizing: border-box;
  height: 100vh;
  height: 100svh;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  text-align: center;
  padding: clamp(2rem, 8vw, 5rem) clamp(1rem, 5vw, 3rem);
}

.coming-soon__ninja {
  width: 300px;
  height: 300px;
  margin-bottom: 2rem;
}

.coming-soon__heading {
  font-family: var(--font-serif);
  font-size: clamp(1.3rem, 3vw, 1.7rem);
  font-weight: 700;
  color: var(--color-burgundy);
  letter-spacing: 0.10em;
  text-transform: uppercase;
  margin: 0 0 1rem;
}

.coming-soon__heading::after { margin: 0.6rem auto 0; }

.coming-soon__body {
  font-family: var(--font-serif);
  font-size: clamp(0.9rem, 2vw, 1.1rem);
  line-height: 1.7;
  color: var(--color-text-muted);
  margin: 0;
  max-width: 480px;
}


/* === partials/errors === */
/* Branded error page (404/500). Mirrors the hero's full-bleed pink layout,
   serif typography and burgundy accent rules so the page reads as part of
   the site even when it's the only thing the user ever sees. */

.errors {
  position: relative;
  /* Offset for the fixed minimal nav — the error pages render a bare <nav>
     without the full nav's flow spacer, so reserve its height here. */
  margin-top: var(--nav-height);
  min-height: calc(100vh - var(--nav-height));
  min-height: calc(100svh - var(--nav-height));
  background-color: var(--color-pink);
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  text-align: center;
  padding: calc(var(--section-padding) - 30px) clamp(1rem, 5vw, 3rem) calc(var(--section-padding) + 30px);
  overflow: hidden;
  z-index: 5;
}

/* Cat logo — same opacity/scale pattern as hero__brand-mark, but parked
   behind the numeral so the 404/500 reads as the focal point. */
.errors__brand-mark {
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -55%);
  width: clamp(280px, 60vw, 520px);
  height: clamp(280px, 60vw, 520px);
  opacity: 0;
  pointer-events: none;
  z-index: 0;
  animation: errorsBrandFadeIn 1.1s 0.1s ease forwards;
}

@keyframes errorsBrandFadeIn {
  to { opacity: 0.12; }
}

.errors__brand-mark img {
  width: 100%;
  height: 100%;
  display: block;
}

.errors__inner {
  position: relative;
  z-index: 1;
  max-width: 36rem;
  display: flex;
  flex-direction: column;
  align-items: center;
}

/* The big 404/500 numeral — burgundy serif, sized like a poster. */
.errors__mark {
  display: block;
  font-family: var(--font-serif);
  font-size: clamp(6rem, 18vw, 12rem);
  font-weight: 700;
  line-height: 0.9;
  letter-spacing: -0.02em;
  color: var(--color-burgundy);
  margin: 0 0 0.75rem;
  animation: fadeUp 0.9s ease both;
}

/* Heading mirrors .section-heading styling (uppercase, letterspaced, burgundy
   underline) so the page sits inside the visual system. */
.errors__heading {
  font-family: var(--font-serif);
  font-size: clamp(1.1rem, 2.4vw, 1.5rem);
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.10em;
  color: var(--color-burgundy);
  margin: 0 0 1.75rem;
  animation: fadeUp 0.9s 0.15s ease both;
}

.errors__heading::after {
  content: "";
  display: block;
  width: 2.5rem;
  height: 3px;
  background: var(--color-burgundy);
  opacity: 0.45;
  margin: 0.6rem auto 0;
}

.errors__body {
  font-family: var(--font-serif);
  font-size: clamp(1rem, 2vw, 1.15rem);
  line-height: 1.6;
  color: var(--color-text-muted);
  margin: 0 0 2.25rem;
  max-width: 30rem;
  animation: fadeUp 0.9s 0.3s ease both;
}

.errors__cta {
  display: inline-block;
  padding: 0.85rem 1.75rem;
  border: 1px solid var(--color-burgundy);
  border-radius: 999px;
  font-family: var(--font-serif);
  font-size: 0.95rem;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.10em;
  text-decoration: none;
  color: var(--color-burgundy);
  background: transparent;
  transition: background-color 200ms ease, color 200ms ease, transform 200ms ease;
  animation: fadeUp 0.9s 0.45s ease both;
}

.errors__cta:hover,
.errors__cta:focus-visible {
  background: var(--color-burgundy);
  color: var(--color-bg);
  transform: translateY(-1px);
}

.errors__cta:focus-visible {
  outline: 2px solid var(--color-burgundy);
  outline-offset: 3px;
}

/* Tighter spacing for narrow mobile viewports. */
@media (max-width: 480px) {
  .errors {
    padding: var(--section-padding) 1rem;
  }

  .errors__mark {
    margin-bottom: 0.5rem;
  }
}


/* === vendor/locomotive-scroll === */
html.lenis,html.lenis body{height:auto}.lenis:not(.lenis-autoToggle).lenis-stopped{overflow:clip}.lenis [data-lenis-prevent-touch],.lenis [data-lenis-prevent-wheel],.lenis [data-lenis-prevent]{overscroll-behavior:contain}.lenis.lenis-smooth iframe{pointer-events:none}.lenis.lenis-autoToggle{transition-behavior:allow-discrete;transition-duration:1ms;transition-property:overflow}

/* === vendor/flatpickr === */
.flatpickr-calendar{background:transparent;opacity:0;display:none;text-align:center;visibility:hidden;padding:0;-webkit-animation:none;animation:none;direction:ltr;border:0;font-size:14px;line-height:24px;border-radius:5px;position:absolute;width:307.875px;-webkit-box-sizing:border-box;box-sizing:border-box;-ms-touch-action:manipulation;touch-action:manipulation;background:#fff;-webkit-box-shadow:1px 0 0 #e6e6e6,-1px 0 0 #e6e6e6,0 1px 0 #e6e6e6,0 -1px 0 #e6e6e6,0 3px 13px rgba(0,0,0,0.08);box-shadow:1px 0 0 #e6e6e6,-1px 0 0 #e6e6e6,0 1px 0 #e6e6e6,0 -1px 0 #e6e6e6,0 3px 13px rgba(0,0,0,0.08)}.flatpickr-calendar.open,.flatpickr-calendar.inline{opacity:1;max-height:640px;visibility:visible}.flatpickr-calendar.open{display:inline-block;z-index:99999}.flatpickr-calendar.animate.open{-webkit-animation:fpFadeInDown 300ms cubic-bezier(.23,1,.32,1);animation:fpFadeInDown 300ms cubic-bezier(.23,1,.32,1)}.flatpickr-calendar.inline{display:block;position:relative;top:2px}.flatpickr-calendar.static{position:absolute;top:calc(100% + 2px)}.flatpickr-calendar.static.open{z-index:999;display:block}.flatpickr-calendar.multiMonth .flatpickr-days .dayContainer:nth-child(n+1) .flatpickr-day.inRange:nth-child(7n+7){-webkit-box-shadow:none !important;box-shadow:none !important}.flatpickr-calendar.multiMonth .flatpickr-days .dayContainer:nth-child(n+2) .flatpickr-day.inRange:nth-child(7n+1){-webkit-box-shadow:-2px 0 0 #e6e6e6,5px 0 0 #e6e6e6;box-shadow:-2px 0 0 #e6e6e6,5px 0 0 #e6e6e6}.flatpickr-calendar .hasWeeks .dayContainer,.flatpickr-calendar .hasTime .dayContainer{border-bottom:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.flatpickr-calendar .hasWeeks .dayContainer{border-left:0}.flatpickr-calendar.hasTime .flatpickr-time{height:40px;border-top:1px solid #e6e6e6}.flatpickr-calendar.noCalendar.hasTime .flatpickr-time{height:auto}.flatpickr-calendar:before,.flatpickr-calendar:after{position:absolute;display:block;pointer-events:none;border:solid transparent;content:'';height:0;width:0;left:22px}.flatpickr-calendar.rightMost:before,.flatpickr-calendar.arrowRight:before,.flatpickr-calendar.rightMost:after,.flatpickr-calendar.arrowRight:after{left:auto;right:22px}.flatpickr-calendar.arrowCenter:before,.flatpickr-calendar.arrowCenter:after{left:50%;right:50%}.flatpickr-calendar:before{border-width:5px;margin:0 -5px}.flatpickr-calendar:after{border-width:4px;margin:0 -4px}.flatpickr-calendar.arrowTop:before,.flatpickr-calendar.arrowTop:after{bottom:100%}.flatpickr-calendar.arrowTop:before{border-bottom-color:#e6e6e6}.flatpickr-calendar.arrowTop:after{border-bottom-color:#fff}.flatpickr-calendar.arrowBottom:before,.flatpickr-calendar.arrowBottom:after{top:100%}.flatpickr-calendar.arrowBottom:before{border-top-color:#e6e6e6}.flatpickr-calendar.arrowBottom:after{border-top-color:#fff}.flatpickr-calendar:focus{outline:0}.flatpickr-wrapper{position:relative;display:inline-block}.flatpickr-months{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.flatpickr-months .flatpickr-month{background:transparent;color:rgba(0,0,0,0.9);fill:rgba(0,0,0,0.9);height:34px;line-height:1;text-align:center;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;overflow:hidden;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.flatpickr-months .flatpickr-prev-month,.flatpickr-months .flatpickr-next-month{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;text-decoration:none;cursor:pointer;position:absolute;top:0;height:34px;padding:10px;z-index:3;color:rgba(0,0,0,0.9);fill:rgba(0,0,0,0.9)}.flatpickr-months .flatpickr-prev-month.flatpickr-disabled,.flatpickr-months .flatpickr-next-month.flatpickr-disabled{display:none}.flatpickr-months .flatpickr-prev-month i,.flatpickr-months .flatpickr-next-month i{position:relative}.flatpickr-months .flatpickr-prev-month.flatpickr-prev-month,.flatpickr-months .flatpickr-next-month.flatpickr-prev-month{/*
      /*rtl:begin:ignore*/left:0/*
      /*rtl:end:ignore*/}/*
      /*rtl:begin:ignore*/
/*
      /*rtl:end:ignore*/
.flatpickr-months .flatpickr-prev-month.flatpickr-next-month,.flatpickr-months .flatpickr-next-month.flatpickr-next-month{/*
      /*rtl:begin:ignore*/right:0/*
      /*rtl:end:ignore*/}/*
      /*rtl:begin:ignore*/
/*
      /*rtl:end:ignore*/
.flatpickr-months .flatpickr-prev-month:hover,.flatpickr-months .flatpickr-next-month:hover{color:#959ea9}.flatpickr-months .flatpickr-prev-month:hover svg,.flatpickr-months .flatpickr-next-month:hover svg{fill:#f64747}.flatpickr-months .flatpickr-prev-month svg,.flatpickr-months .flatpickr-next-month svg{width:14px;height:14px}.flatpickr-months .flatpickr-prev-month svg path,.flatpickr-months .flatpickr-next-month svg path{-webkit-transition:fill .1s;transition:fill .1s;fill:inherit}.numInputWrapper{position:relative;height:auto}.numInputWrapper input,.numInputWrapper span{display:inline-block}.numInputWrapper input{width:100%}.numInputWrapper input::-ms-clear{display:none}.numInputWrapper input::-webkit-outer-spin-button,.numInputWrapper input::-webkit-inner-spin-button{margin:0;-webkit-appearance:none}.numInputWrapper span{position:absolute;right:0;width:14px;padding:0 4px 0 2px;height:50%;line-height:50%;opacity:0;cursor:pointer;border:1px solid rgba(57,57,57,0.15);-webkit-box-sizing:border-box;box-sizing:border-box}.numInputWrapper span:hover{background:rgba(0,0,0,0.1)}.numInputWrapper span:active{background:rgba(0,0,0,0.2)}.numInputWrapper span:after{display:block;content:"";position:absolute}.numInputWrapper span.arrowUp{top:0;border-bottom:0}.numInputWrapper span.arrowUp:after{border-left:4px solid transparent;border-right:4px solid transparent;border-bottom:4px solid rgba(57,57,57,0.6);top:26%}.numInputWrapper span.arrowDown{top:50%}.numInputWrapper span.arrowDown:after{border-left:4px solid transparent;border-right:4px solid transparent;border-top:4px solid rgba(57,57,57,0.6);top:40%}.numInputWrapper span svg{width:inherit;height:auto}.numInputWrapper span svg path{fill:rgba(0,0,0,0.5)}.numInputWrapper:hover{background:rgba(0,0,0,0.05)}.numInputWrapper:hover span{opacity:1}.flatpickr-current-month{font-size:135%;line-height:inherit;font-weight:300;color:inherit;position:absolute;width:75%;left:12.5%;padding:7.48px 0 0 0;line-height:1;height:34px;display:inline-block;text-align:center;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.flatpickr-current-month span.cur-month{font-family:inherit;font-weight:700;color:inherit;display:inline-block;margin-left:.5ch;padding:0}.flatpickr-current-month span.cur-month:hover{background:rgba(0,0,0,0.05)}.flatpickr-current-month .numInputWrapper{width:6ch;width:7ch\0;display:inline-block}.flatpickr-current-month .numInputWrapper span.arrowUp:after{border-bottom-color:rgba(0,0,0,0.9)}.flatpickr-current-month .numInputWrapper span.arrowDown:after{border-top-color:rgba(0,0,0,0.9)}.flatpickr-current-month input.cur-year{background:transparent;-webkit-box-sizing:border-box;box-sizing:border-box;color:inherit;cursor:text;padding:0 0 0 .5ch;margin:0;display:inline-block;font-size:inherit;font-family:inherit;font-weight:300;line-height:inherit;height:auto;border:0;border-radius:0;vertical-align:initial;-webkit-appearance:textfield;-moz-appearance:textfield;appearance:textfield}.flatpickr-current-month input.cur-year:focus{outline:0}.flatpickr-current-month input.cur-year[disabled],.flatpickr-current-month input.cur-year[disabled]:hover{font-size:100%;color:rgba(0,0,0,0.5);background:transparent;pointer-events:none}.flatpickr-current-month .flatpickr-monthDropdown-months{appearance:menulist;background:transparent;border:none;border-radius:0;box-sizing:border-box;color:inherit;cursor:pointer;font-size:inherit;font-family:inherit;font-weight:300;height:auto;line-height:inherit;margin:-1px 0 0 0;outline:none;padding:0 0 0 .5ch;position:relative;vertical-align:initial;-webkit-box-sizing:border-box;-webkit-appearance:menulist;-moz-appearance:menulist;width:auto}.flatpickr-current-month .flatpickr-monthDropdown-months:focus,.flatpickr-current-month .flatpickr-monthDropdown-months:active{outline:none}.flatpickr-current-month .flatpickr-monthDropdown-months:hover{background:rgba(0,0,0,0.05)}.flatpickr-current-month .flatpickr-monthDropdown-months .flatpickr-monthDropdown-month{background-color:transparent;outline:none;padding:0}.flatpickr-weekdays{background:transparent;text-align:center;overflow:hidden;width:100%;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;height:28px}.flatpickr-weekdays .flatpickr-weekdaycontainer{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}span.flatpickr-weekday{cursor:default;font-size:90%;background:transparent;color:rgba(0,0,0,0.54);line-height:1;margin:0;text-align:center;display:block;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;font-weight:bolder}.dayContainer,.flatpickr-weeks{padding:1px 0 0 0}.flatpickr-days{position:relative;overflow:hidden;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:start;-webkit-align-items:flex-start;-ms-flex-align:start;align-items:flex-start;width:307.875px}.flatpickr-days:focus{outline:0}.dayContainer{padding:0;outline:0;text-align:left;width:307.875px;min-width:307.875px;max-width:307.875px;-webkit-box-sizing:border-box;box-sizing:border-box;display:inline-block;display:-ms-flexbox;display:-webkit-box;display:-webkit-flex;display:flex;-webkit-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-wrap:wrap;-ms-flex-pack:justify;-webkit-justify-content:space-around;justify-content:space-around;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}.dayContainer + .dayContainer{-webkit-box-shadow:-1px 0 0 #e6e6e6;box-shadow:-1px 0 0 #e6e6e6}.flatpickr-day{background:none;border:1px solid transparent;border-radius:150px;-webkit-box-sizing:border-box;box-sizing:border-box;color:#393939;cursor:pointer;font-weight:400;width:14.2857143%;-webkit-flex-basis:14.2857143%;-ms-flex-preferred-size:14.2857143%;flex-basis:14.2857143%;max-width:39px;height:39px;line-height:39px;margin:0;display:inline-block;position:relative;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;text-align:center}.flatpickr-day.inRange,.flatpickr-day.prevMonthDay.inRange,.flatpickr-day.nextMonthDay.inRange,.flatpickr-day.today.inRange,.flatpickr-day.prevMonthDay.today.inRange,.flatpickr-day.nextMonthDay.today.inRange,.flatpickr-day:hover,.flatpickr-day.prevMonthDay:hover,.flatpickr-day.nextMonthDay:hover,.flatpickr-day:focus,.flatpickr-day.prevMonthDay:focus,.flatpickr-day.nextMonthDay:focus{cursor:pointer;outline:0;background:#e6e6e6;border-color:#e6e6e6}.flatpickr-day.today{border-color:#959ea9}.flatpickr-day.today:hover,.flatpickr-day.today:focus{border-color:#959ea9;background:#959ea9;color:#fff}.flatpickr-day.selected,.flatpickr-day.startRange,.flatpickr-day.endRange,.flatpickr-day.selected.inRange,.flatpickr-day.startRange.inRange,.flatpickr-day.endRange.inRange,.flatpickr-day.selected:focus,.flatpickr-day.startRange:focus,.flatpickr-day.endRange:focus,.flatpickr-day.selected:hover,.flatpickr-day.startRange:hover,.flatpickr-day.endRange:hover,.flatpickr-day.selected.prevMonthDay,.flatpickr-day.startRange.prevMonthDay,.flatpickr-day.endRange.prevMonthDay,.flatpickr-day.selected.nextMonthDay,.flatpickr-day.startRange.nextMonthDay,.flatpickr-day.endRange.nextMonthDay{background:#569ff7;-webkit-box-shadow:none;box-shadow:none;color:#fff;border-color:#569ff7}.flatpickr-day.selected.startRange,.flatpickr-day.startRange.startRange,.flatpickr-day.endRange.startRange{border-radius:50px 0 0 50px}.flatpickr-day.selected.endRange,.flatpickr-day.startRange.endRange,.flatpickr-day.endRange.endRange{border-radius:0 50px 50px 0}.flatpickr-day.selected.startRange + .endRange:not(:nth-child(7n+1)),.flatpickr-day.startRange.startRange + .endRange:not(:nth-child(7n+1)),.flatpickr-day.endRange.startRange + .endRange:not(:nth-child(7n+1)){-webkit-box-shadow:-10px 0 0 #569ff7;box-shadow:-10px 0 0 #569ff7}.flatpickr-day.selected.startRange.endRange,.flatpickr-day.startRange.startRange.endRange,.flatpickr-day.endRange.startRange.endRange{border-radius:50px}.flatpickr-day.inRange{border-radius:0;-webkit-box-shadow:-5px 0 0 #e6e6e6,5px 0 0 #e6e6e6;box-shadow:-5px 0 0 #e6e6e6,5px 0 0 #e6e6e6}.flatpickr-day.flatpickr-disabled,.flatpickr-day.flatpickr-disabled:hover,.flatpickr-day.prevMonthDay,.flatpickr-day.nextMonthDay,.flatpickr-day.notAllowed,.flatpickr-day.notAllowed.prevMonthDay,.flatpickr-day.notAllowed.nextMonthDay{color:rgba(57,57,57,0.3);background:transparent;border-color:transparent;cursor:default}.flatpickr-day.flatpickr-disabled,.flatpickr-day.flatpickr-disabled:hover{cursor:not-allowed;color:rgba(57,57,57,0.1)}.flatpickr-day.week.selected{border-radius:0;-webkit-box-shadow:-5px 0 0 #569ff7,5px 0 0 #569ff7;box-shadow:-5px 0 0 #569ff7,5px 0 0 #569ff7}.flatpickr-day.hidden{visibility:hidden}.rangeMode .flatpickr-day{margin-top:1px}.flatpickr-weekwrapper{float:left}.flatpickr-weekwrapper .flatpickr-weeks{padding:0 12px;-webkit-box-shadow:1px 0 0 #e6e6e6;box-shadow:1px 0 0 #e6e6e6}.flatpickr-weekwrapper .flatpickr-weekday{float:none;width:100%;line-height:28px}.flatpickr-weekwrapper span.flatpickr-day,.flatpickr-weekwrapper span.flatpickr-day:hover{display:block;width:100%;max-width:none;color:rgba(57,57,57,0.3);background:transparent;cursor:default;border:none}.flatpickr-innerContainer{display:block;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-sizing:border-box;box-sizing:border-box;overflow:hidden}.flatpickr-rContainer{display:inline-block;padding:0;-webkit-box-sizing:border-box;box-sizing:border-box}.flatpickr-time{text-align:center;outline:0;display:block;height:0;line-height:40px;max-height:40px;-webkit-box-sizing:border-box;box-sizing:border-box;overflow:hidden;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.flatpickr-time:after{content:"";display:table;clear:both}.flatpickr-time .numInputWrapper{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;width:40%;height:40px;float:left}.flatpickr-time .numInputWrapper span.arrowUp:after{border-bottom-color:#393939}.flatpickr-time .numInputWrapper span.arrowDown:after{border-top-color:#393939}.flatpickr-time.hasSeconds .numInputWrapper{width:26%}.flatpickr-time.time24hr .numInputWrapper{width:49%}.flatpickr-time input{background:transparent;-webkit-box-shadow:none;box-shadow:none;border:0;border-radius:0;text-align:center;margin:0;padding:0;height:inherit;line-height:inherit;color:#393939;font-size:14px;position:relative;-webkit-box-sizing:border-box;box-sizing:border-box;-webkit-appearance:textfield;-moz-appearance:textfield;appearance:textfield}.flatpickr-time input.flatpickr-hour{font-weight:bold}.flatpickr-time input.flatpickr-minute,.flatpickr-time input.flatpickr-second{font-weight:400}.flatpickr-time input:focus{outline:0;border:0}.flatpickr-time .flatpickr-time-separator,.flatpickr-time .flatpickr-am-pm{height:inherit;float:left;line-height:inherit;color:#393939;font-weight:bold;width:2%;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-align-self:center;-ms-flex-item-align:center;align-self:center}.flatpickr-time .flatpickr-am-pm{outline:0;width:18%;cursor:pointer;text-align:center;font-weight:400}.flatpickr-time input:hover,.flatpickr-time .flatpickr-am-pm:hover,.flatpickr-time input:focus,.flatpickr-time .flatpickr-am-pm:focus{background:#eee}.flatpickr-input[readonly]{cursor:pointer}@-webkit-keyframes fpFadeInDown{from{opacity:0;-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0)}to{opacity:1;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}@keyframes fpFadeInDown{from{opacity:0;-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0)}to{opacity:1;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}
