.tws-logo[data-astro-cid-imj4vfzo]{position:fixed;top:0;left:0;padding-block:max(0px,calc((65px - var(--logo-size-px, 40px)) / 2));padding-inline-end:var(--container-padding-x);padding-inline-start:max(var(--container-padding-x),calc(50vw - var(--container-max) / 2 + var(--container-padding-x)),env(safe-area-inset-left));z-index:60;display:inline-flex;align-items:center;text-decoration:none;color:var(--color-on-image-fg);font-family:var(--font-heading);font-size:1rem;line-height:1;transform:translateY(0);transition:transform var(--chrome-hide-duration) var(--chrome-hide-ease);pointer-events:none}.tws-logo__img[data-astro-cid-imj4vfzo],.tws-logo__text[data-astro-cid-imj4vfzo]{pointer-events:auto}.tws-logo__img[data-astro-cid-imj4vfzo]{display:block;height:var(--logo-size-px, 40px);width:auto;max-width:min(220px,calc(var(--logo-size-px, 40px) * 5));object-fit:contain}.tws-logo__img--light[data-astro-cid-imj4vfzo]{display:block}.tws-logo__img--dark[data-astro-cid-imj4vfzo]{display:none}html[data-mode=light] body.is-scrolled .tws-logo__img--light[data-astro-cid-imj4vfzo]{display:none}html[data-mode=light] body.is-scrolled .tws-logo__img--dark[data-astro-cid-imj4vfzo]{display:block}html[data-mode=light] body.is-scrolled .tws-logo[data-astro-cid-imj4vfzo]{color:var(--color-fg)}.tws-logo__text[data-astro-cid-imj4vfzo]{display:inline-block;letter-spacing:0.02em;font-size:calc(var(--logo-size-px, 40px) * 0.92);font-weight:500;line-height:1}.tws-logo[data-astro-cid-imj4vfzo]:focus-visible{outline:2px solid var(--color-on-image-fg);outline-offset:4px;border-radius:2px}html[data-mode=light] body.is-scrolled .tws-logo[data-astro-cid-imj4vfzo]:focus-visible{outline-color:var(--color-fg)}@media (min-width: 768px){.tws-logo[data-astro-cid-imj4vfzo]{padding-block:max(0px,calc((69px - var(--logo-size-px, 40px)) / 2))}}.tws-nav[data-astro-cid-e4iakw3m]{position:fixed;top:0;left:0;right:0;z-index:50;background-color:transparent;transform:translateY(0);transition:background-color 0.25s ease,transform var(--chrome-hide-duration) var(--chrome-hide-ease)}.tws-nav[data-astro-cid-e4iakw3m].is-scrolled{background-color:var(--color-bg)}.tws-nav[data-astro-cid-e4iakw3m].is-scrolled .tws-nav__cta[data-astro-cid-e4iakw3m]{background-color:var(--color-fg);color:var(--color-bg);border-color:var(--color-fg)}.tws-nav[data-astro-cid-e4iakw3m].is-scrolled .tws-nav__cta[data-astro-cid-e4iakw3m]:hover{background-color:color-mix(in srgb,var(--color-fg) 88%,var(--color-bg));border-color:color-mix(in srgb,var(--color-fg) 88%,var(--color-bg))}.tws-nav__inner[data-astro-cid-e4iakw3m]{display:flex;align-items:center;justify-content:space-between;padding-block:1.125rem;padding-inline-start:max(var(--container-padding-x),env(safe-area-inset-left));padding-inline-end:max(var(--container-padding-x),env(safe-area-inset-right));max-width:var(--container-max);margin:0 auto}.tws-nav__spacer[data-astro-cid-e4iakw3m]{width:68px;height:1px}.tws-nav__cta[data-astro-cid-e4iakw3m]{display:inline-flex;align-items:center;padding:0.5rem 1rem;border:1px solid color-mix(in srgb,var(--color-on-image-fg) 40%,transparent);border-radius:var(--radius-base);color:var(--color-on-image-fg);text-decoration:none;font-family:var(--font-body);font-size:11px;font-weight:500;letter-spacing:0.14em;line-height:1;text-transform:uppercase;transition:border-color 0.25s ease,color 0.25s ease,background-color 0.25s ease,filter 100ms ease,opacity var(--motion-duration) var(--motion-ease) var(--tws-enter-delay, 0ms),transform var(--motion-duration) var(--motion-ease) var(--tws-enter-delay, 0ms)}.tws-nav__cta[data-astro-cid-e4iakw3m]:active{filter:brightness(0.92)}.tws-nav__cta[data-astro-cid-e4iakw3m]:hover{border-color:var(--color-on-image-fg)}.tws-nav__cta[data-astro-cid-e4iakw3m]:focus-visible{outline:2px solid var(--color-on-image-fg);outline-offset:2px}body[data-route=home] .tws-nav__cta--menu[data-astro-cid-e4iakw3m],body:not([data-route="menu"]) .tws-nav__cta--menu[data-astro-cid-e4iakw3m]{display:none}body[data-route=menu] .tws-nav__cta--home[data-astro-cid-e4iakw3m]{display:none}@media (min-width: 768px){.tws-nav__inner[data-astro-cid-e4iakw3m]{padding-block:1.25rem}.tws-nav__spacer[data-astro-cid-e4iakw3m]{width:92px}}@media (prefers-reduced-motion: reduce){.tws-nav[data-astro-cid-e4iakw3m],.tws-nav__cta[data-astro-cid-e4iakw3m]{transition:none}}.tws-footer[data-astro-cid-nbpnc35u]{background-color:var(--color-bg);color:var(--color-muted)}.tws-footer__inner[data-astro-cid-nbpnc35u]{max-width:var(--container-max);margin:0 auto;padding:var(--block-pt-mobile, 3rem) var(--container-padding-x) var(--footer-divider-gap-mobile, 1.5rem);text-align:left}.tws-footer__logo-row[data-astro-cid-nbpnc35u]{display:flex;justify-content:flex-start;margin-bottom:0.5rem}.tws-footer__logo[data-astro-cid-nbpnc35u]{display:block;width:auto;object-fit:contain}.tws-footer__logo-text[data-astro-cid-nbpnc35u]{display:inline-block;font-family:var(--font-heading);font-weight:500;color:var(--color-fg);line-height:1;letter-spacing:0.02em}.tws-footer__cols[data-astro-cid-nbpnc35u]{display:flex;flex-direction:column;gap:2rem}.tws-footer__col[data-astro-cid-nbpnc35u]{display:flex;flex-direction:column;gap:0.5rem}.tws-footer__slogan[data-astro-cid-nbpnc35u]{font-family:var(--font-heading);color:var(--color-fg);font-size:0.875rem;line-height:1.4;margin:0}.tws-footer__address[data-astro-cid-nbpnc35u]{margin:0;display:flex;flex-direction:column;gap:0}.tws-footer__address-line[data-astro-cid-nbpnc35u]{font-size:0.875rem;line-height:1.5;margin:0}.tws-footer__address-line--city[data-astro-cid-nbpnc35u]{color:color-mix(in srgb,var(--color-fg) 50%,transparent)}.footer-link[data-astro-cid-nbpnc35u]{color:var(--color-muted);text-decoration:none;font-size:0.875rem;line-height:1.5;transition:color 0.25s ease}.footer-link[data-astro-cid-nbpnc35u]:hover{color:var(--color-fg);text-decoration:underline;text-underline-offset:4px}.footer-link[data-astro-cid-nbpnc35u]:focus-visible{outline:2px solid var(--color-fg);outline-offset:2px;color:var(--color-fg)}.footer-link--instagram[data-astro-cid-nbpnc35u]{display:inline-flex;align-items:center;gap:0.5rem}.footer-link--instagram[data-astro-cid-nbpnc35u]:hover,.footer-link--instagram[data-astro-cid-nbpnc35u]:focus-visible{text-decoration:none}.footer-link--instagram[data-astro-cid-nbpnc35u]:hover span[data-astro-cid-nbpnc35u]{text-decoration:underline;text-underline-offset:4px}.footer-link__icon[data-astro-cid-nbpnc35u]{flex:0 0 auto;display:block}.tws-footer__credit[data-astro-cid-nbpnc35u]{margin:0;display:flex;flex-direction:column;gap:0.125rem;line-height:1.5}.tws-footer__credit-prefix[data-astro-cid-nbpnc35u]{font-size:0.875rem;color:color-mix(in srgb,var(--color-fg) 50%,transparent)}.sr-only[data-astro-cid-nbpnc35u]{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.tws-footer__subfooter[data-astro-cid-nbpnc35u]{max-width:var(--container-max);margin:0 auto;padding-block:var(--block-pb-mobile, 2rem);padding-inline:var(--container-padding-x);text-align:center;border-top:1px solid var(--color-divider)}.tws-footer__copyright[data-astro-cid-nbpnc35u]{font-size:0.75rem;color:color-mix(in srgb,var(--color-fg) 35%,transparent);margin:0;line-height:1.5}@media (min-width: 768px){.tws-footer__inner[data-astro-cid-nbpnc35u]{padding:var(--block-pt, 3.5rem) var(--container-padding-x) var(--footer-divider-gap, 2rem)}.tws-footer__logo-row[data-astro-cid-nbpnc35u]{margin-bottom:0.75rem}.tws-footer__cols[data-astro-cid-nbpnc35u]{display:grid;grid-template-columns:2fr 1fr 1fr;gap:3rem;align-items:flex-start}.tws-footer__cols[data-astro-cid-nbpnc35u]:not(:has(.tws-footer__col--system)):not(:has(.tws-footer__col--contact)){grid-template-columns:1fr}.tws-footer__cols[data-astro-cid-nbpnc35u]:not(:has(.tws-footer__col--system)):has(.tws-footer__col--contact){grid-template-columns:2fr 1fr}.tws-footer__cols[data-astro-cid-nbpnc35u]:not(:has(.tws-footer__col--contact)):has(.tws-footer__col--system){grid-template-columns:2fr 1fr}.tws-footer__subfooter[data-astro-cid-nbpnc35u]{padding-block:var(--block-pb, 2.5rem);padding-inline:var(--container-padding-x)}}/*! tailwindcss v4.2.4 | MIT License | https://tailwindcss.com */
@layer properties {
  @supports (((-webkit-hyphens: none)) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color: rgb(from red r g b)))) {
    *, :before, :after, ::backdrop {
      --tw-rotate-x: initial;
      --tw-rotate-y: initial;
      --tw-rotate-z: initial;
      --tw-skew-x: initial;
      --tw-skew-y: initial;
      --tw-border-style: solid;
      --tw-shadow: 0 0 #0000;
      --tw-shadow-color: initial;
      --tw-shadow-alpha: 100%;
      --tw-inset-shadow: 0 0 #0000;
      --tw-inset-shadow-color: initial;
      --tw-inset-shadow-alpha: 100%;
      --tw-ring-color: initial;
      --tw-ring-shadow: 0 0 #0000;
      --tw-inset-ring-color: initial;
      --tw-inset-ring-shadow: 0 0 #0000;
      --tw-ring-inset: initial;
      --tw-ring-offset-width: 0px;
      --tw-ring-offset-color: #fff;
      --tw-ring-offset-shadow: 0 0 #0000;
      --tw-outline-style: solid;
      --tw-blur: initial;
      --tw-brightness: initial;
      --tw-contrast: initial;
      --tw-grayscale: initial;
      --tw-hue-rotate: initial;
      --tw-invert: initial;
      --tw-opacity: initial;
      --tw-saturate: initial;
      --tw-sepia: initial;
      --tw-drop-shadow: initial;
      --tw-drop-shadow-color: initial;
      --tw-drop-shadow-alpha: 100%;
      --tw-drop-shadow-size: initial;
      --tw-backdrop-blur: initial;
      --tw-backdrop-brightness: initial;
      --tw-backdrop-contrast: initial;
      --tw-backdrop-grayscale: initial;
      --tw-backdrop-hue-rotate: initial;
      --tw-backdrop-invert: initial;
      --tw-backdrop-opacity: initial;
      --tw-backdrop-saturate: initial;
      --tw-backdrop-sepia: initial;
      --tw-ease: initial;
    }
  }
}

@layer theme {
  :root, :host {
    --font-sans: ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji",
      "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
    --font-mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono",
      "Courier New", monospace;
    --spacing: .25rem;
    --ease-in: cubic-bezier(.4, 0, 1, 1);
    --ease-out: cubic-bezier(0, 0, .2, 1);
    --ease-in-out: cubic-bezier(.4, 0, .2, 1);
    --default-transition-duration: .15s;
    --default-transition-timing-function: cubic-bezier(.4, 0, .2, 1);
    --default-font-family: var(--font-sans);
    --default-mono-font-family: var(--font-mono);
  }
}

@layer base {
  *, :after, :before, ::backdrop {
    box-sizing: border-box;
    border: 0 solid;
    margin: 0;
    padding: 0;
  }

  ::file-selector-button {
    box-sizing: border-box;
    border: 0 solid;
    margin: 0;
    padding: 0;
  }

  html, :host {
    -webkit-text-size-adjust: 100%;
    tab-size: 4;
    line-height: 1.5;
    font-family: var(--default-font-family, ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");
    font-feature-settings: var(--default-font-feature-settings, normal);
    font-variation-settings: var(--default-font-variation-settings, normal);
    -webkit-tap-highlight-color: transparent;
  }

  hr {
    height: 0;
    color: inherit;
    border-top-width: 1px;
  }

  abbr:where([title]) {
    -webkit-text-decoration: underline dotted;
    text-decoration: underline dotted;
  }

  h1, h2, h3, h4, h5, h6 {
    font-size: inherit;
    font-weight: inherit;
  }

  a {
    color: inherit;
    -webkit-text-decoration: inherit;
    -webkit-text-decoration: inherit;
    -webkit-text-decoration: inherit;
    text-decoration: inherit;
  }

  b, strong {
    font-weight: bolder;
  }

  code, kbd, samp, pre {
    font-family: var(--default-mono-font-family, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);
    font-feature-settings: var(--default-mono-font-feature-settings, normal);
    font-variation-settings: var(--default-mono-font-variation-settings, normal);
    font-size: 1em;
  }

  small {
    font-size: 80%;
  }

  sub, sup {
    vertical-align: baseline;
    font-size: 75%;
    line-height: 0;
    position: relative;
  }

  sub {
    bottom: -.25em;
  }

  sup {
    top: -.5em;
  }

  table {
    text-indent: 0;
    border-color: inherit;
    border-collapse: collapse;
  }

  :-moz-focusring {
    outline: auto;
  }

  progress {
    vertical-align: baseline;
  }

  summary {
    display: list-item;
  }

  ol, ul, menu {
    list-style: none;
  }

  img, svg, video, canvas, audio, iframe, embed, object {
    vertical-align: middle;
    display: block;
  }

  img, video {
    max-width: 100%;
    height: auto;
  }

  button, input, select, optgroup, textarea {
    font: inherit;
    font-feature-settings: inherit;
    font-variation-settings: inherit;
    letter-spacing: inherit;
    color: inherit;
    opacity: 1;
    background-color: #0000;
    border-radius: 0;
  }

  ::file-selector-button {
    font: inherit;
    font-feature-settings: inherit;
    font-variation-settings: inherit;
    letter-spacing: inherit;
    color: inherit;
    opacity: 1;
    background-color: #0000;
    border-radius: 0;
  }

  :where(select:is([multiple], [size])) optgroup {
    font-weight: bolder;
  }

  :where(select:is([multiple], [size])) optgroup option {
    padding-inline-start: 20px;
  }

  ::file-selector-button {
    margin-inline-end: 4px;
  }

  ::placeholder {
    opacity: 1;
  }

  @supports (not ((-webkit-appearance: -apple-pay-button))) or (contain-intrinsic-size: 1px) {
    ::placeholder {
      color: currentColor;
    }

    @supports (color: color-mix(in lab, red, red)) {
      ::placeholder {
        color: color-mix(in oklab, currentcolor 50%, transparent);
      }
    }
  }

  textarea {
    resize: vertical;
  }

  ::-webkit-search-decoration {
    -webkit-appearance: none;
  }

  ::-webkit-date-and-time-value {
    min-height: 1lh;
    text-align: inherit;
  }

  ::-webkit-datetime-edit {
    display: inline-flex;
  }

  ::-webkit-datetime-edit-fields-wrapper {
    padding: 0;
  }

  ::-webkit-datetime-edit {
    padding-block: 0;
  }

  ::-webkit-datetime-edit-year-field {
    padding-block: 0;
  }

  ::-webkit-datetime-edit-month-field {
    padding-block: 0;
  }

  ::-webkit-datetime-edit-day-field {
    padding-block: 0;
  }

  ::-webkit-datetime-edit-hour-field {
    padding-block: 0;
  }

  ::-webkit-datetime-edit-minute-field {
    padding-block: 0;
  }

  ::-webkit-datetime-edit-second-field {
    padding-block: 0;
  }

  ::-webkit-datetime-edit-millisecond-field {
    padding-block: 0;
  }

  ::-webkit-datetime-edit-meridiem-field {
    padding-block: 0;
  }

  ::-webkit-calendar-picker-indicator {
    line-height: 1;
  }

  :-moz-ui-invalid {
    box-shadow: none;
  }

  button, input:where([type="button"], [type="reset"], [type="submit"]) {
    appearance: button;
  }

  ::file-selector-button {
    appearance: button;
  }

  ::-webkit-inner-spin-button {
    height: auto;
  }

  ::-webkit-outer-spin-button {
    height: auto;
  }

  [hidden]:where(:not([hidden="until-found"])) {
    display: none !important;
  }
}

@layer components;

@layer utilities {
  .\@container {
    container-type: inline-size;
  }

  .collapse {
    visibility: collapse;
  }

  .invisible {
    visibility: hidden;
  }

  .visible {
    visibility: visible;
  }

  .sr-only {
    clip-path: inset(50%);
    white-space: nowrap;
    border-width: 0;
    width: 1px;
    height: 1px;
    margin: -1px;
    padding: 0;
    position: absolute;
    overflow: hidden;
  }

  .absolute {
    position: absolute;
  }

  .fixed {
    position: fixed;
  }

  .relative {
    position: relative;
  }

  .static {
    position: static;
  }

  .sticky {
    position: sticky;
  }

  .start {
    inset-inline-start: var(--spacing);
  }

  .end {
    inset-inline-end: var(--spacing);
  }

  .-top-10 {
    top: calc(var(--spacing) * -10);
  }

  .left-0 {
    left: calc(var(--spacing) * 0);
  }

  .z-50 {
    z-index: 50;
  }

  .col-1 {
    grid-column: 1;
  }

  .container {
    width: 100%;
  }

  @media (min-width: 40rem) {
    .container {
      max-width: 40rem;
    }
  }

  @media (min-width: 48rem) {
    .container {
      max-width: 48rem;
    }
  }

  @media (min-width: 64rem) {
    .container {
      max-width: 64rem;
    }
  }

  @media (min-width: 80rem) {
    .container {
      max-width: 80rem;
    }
  }

  @media (min-width: 96rem) {
    .container {
      max-width: 96rem;
    }
  }

  .block {
    display: block;
  }

  .contents {
    display: contents;
  }

  .flex {
    display: flex;
  }

  .grid {
    display: grid;
  }

  .hidden {
    display: none;
  }

  .inline {
    display: inline;
  }

  .table {
    display: table;
  }

  .flex-shrink, .shrink {
    flex-shrink: 1;
  }

  .grow {
    flex-grow: 1;
  }

  .transform {
    transform: var(--tw-rotate-x, ) var(--tw-rotate-y, ) var(--tw-rotate-z, ) var(--tw-skew-x, ) var(--tw-skew-y, );
  }

  .resize {
    resize: both;
  }

  .rounded {
    border-radius: .25rem;
  }

  .border {
    border-style: var(--tw-border-style);
    border-width: 1px;
  }

  .px-4 {
    padding-inline: calc(var(--spacing) * 4);
  }

  .py-2 {
    padding-block: calc(var(--spacing) * 2);
  }

  .text-wrap {
    text-wrap: wrap;
  }

  .lowercase {
    text-transform: lowercase;
  }

  .italic {
    font-style: italic;
  }

  .underline {
    text-decoration-line: underline;
  }

  .antialiased {
    -webkit-font-smoothing: antialiased;
    -moz-osx-font-smoothing: grayscale;
  }

  .shadow {
    --tw-shadow: 0 1px 3px 0 var(--tw-shadow-color, #0000001a), 0 1px 2px -1px var(--tw-shadow-color, #0000001a);
    box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
  }

  .ring {
    --tw-ring-shadow: var(--tw-ring-inset, ) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);
    box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
  }

  .outline {
    outline-style: var(--tw-outline-style);
    outline-width: 1px;
  }

  .blur {
    --tw-blur: blur(8px);
    filter: var(--tw-blur, ) var(--tw-brightness, ) var(--tw-contrast, ) var(--tw-grayscale, ) var(--tw-hue-rotate, ) var(--tw-invert, ) var(--tw-saturate, ) var(--tw-sepia, ) var(--tw-drop-shadow, );
  }

  .invert {
    --tw-invert: invert(100%);
    filter: var(--tw-blur, ) var(--tw-brightness, ) var(--tw-contrast, ) var(--tw-grayscale, ) var(--tw-hue-rotate, ) var(--tw-invert, ) var(--tw-saturate, ) var(--tw-sepia, ) var(--tw-drop-shadow, );
  }

  .filter {
    filter: var(--tw-blur, ) var(--tw-brightness, ) var(--tw-contrast, ) var(--tw-grayscale, ) var(--tw-hue-rotate, ) var(--tw-invert, ) var(--tw-saturate, ) var(--tw-sepia, ) var(--tw-drop-shadow, );
  }

  .backdrop-filter {
    -webkit-backdrop-filter: var(--tw-backdrop-blur, ) var(--tw-backdrop-brightness, ) var(--tw-backdrop-contrast, ) var(--tw-backdrop-grayscale, ) var(--tw-backdrop-hue-rotate, ) var(--tw-backdrop-invert, ) var(--tw-backdrop-opacity, ) var(--tw-backdrop-saturate, ) var(--tw-backdrop-sepia, );
    backdrop-filter: var(--tw-backdrop-blur, ) var(--tw-backdrop-brightness, ) var(--tw-backdrop-contrast, ) var(--tw-backdrop-grayscale, ) var(--tw-backdrop-hue-rotate, ) var(--tw-backdrop-invert, ) var(--tw-backdrop-opacity, ) var(--tw-backdrop-saturate, ) var(--tw-backdrop-sepia, );
  }

  .transition {
    transition-property: color, background-color, border-color, outline-color, text-decoration-color, fill, stroke, --tw-gradient-from, --tw-gradient-via, --tw-gradient-to, opacity, box-shadow, transform, translate, scale, rotate, filter, -webkit-backdrop-filter, backdrop-filter, display, content-visibility, overlay, pointer-events;
    transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));
    transition-duration: var(--tw-duration, var(--default-transition-duration));
  }

  .ease-in {
    --tw-ease: var(--ease-in);
    transition-timing-function: var(--ease-in);
  }

  .ease-in-out {
    --tw-ease: var(--ease-in-out);
    transition-timing-function: var(--ease-in-out);
  }

  .ease-out {
    --tw-ease: var(--ease-out);
    transition-timing-function: var(--ease-out);
  }

  .focus\:top-0:focus {
    top: calc(var(--spacing) * 0);
  }
}

:root {
  interpolate-size: allow-keywords;
  --container-max: 1000px;
  --container-max-narrow: 800px;
  --container-padding-x: 1.25rem;
}

@media (min-width: 768px) {
  :root {
    --container-padding-x: 2rem;
  }
}

@media (prefers-reduced-motion: no-preference) {
  html {
    scroll-behavior: smooth;
  }
}

:where([id]) {
  scroll-margin-top: 5rem;
}

.gallery-item img {
  opacity: 0;
  transition: opacity var(--motion-duration) var(--motion-ease);
}

.gallery-item img.is-loaded {
  opacity: 1;
}

.tws-hero__image, .tws-menu-banner__image {
  opacity: 0;
}

@media (prefers-reduced-motion: reduce) {
  .gallery-item img {
    opacity: 1 !important;
    transition: none !important;
  }

  .tws-hero__image, .tws-menu-banner__image {
    opacity: .85;
  }
}

@property --tw-rotate-x {
  syntax: "*";
  inherits: false
}

@property --tw-rotate-y {
  syntax: "*";
  inherits: false
}

@property --tw-rotate-z {
  syntax: "*";
  inherits: false
}

@property --tw-skew-x {
  syntax: "*";
  inherits: false
}

@property --tw-skew-y {
  syntax: "*";
  inherits: false
}

@property --tw-border-style {
  syntax: "*";
  inherits: false;
  initial-value: solid;
}

@property --tw-shadow {
  syntax: "*";
  inherits: false;
  initial-value: 0 0 #0000;
}

@property --tw-shadow-color {
  syntax: "*";
  inherits: false
}

@property --tw-shadow-alpha {
  syntax: "<percentage>";
  inherits: false;
  initial-value: 100%;
}

@property --tw-inset-shadow {
  syntax: "*";
  inherits: false;
  initial-value: 0 0 #0000;
}

@property --tw-inset-shadow-color {
  syntax: "*";
  inherits: false
}

@property --tw-inset-shadow-alpha {
  syntax: "<percentage>";
  inherits: false;
  initial-value: 100%;
}

@property --tw-ring-color {
  syntax: "*";
  inherits: false
}

@property --tw-ring-shadow {
  syntax: "*";
  inherits: false;
  initial-value: 0 0 #0000;
}

@property --tw-inset-ring-color {
  syntax: "*";
  inherits: false
}

@property --tw-inset-ring-shadow {
  syntax: "*";
  inherits: false;
  initial-value: 0 0 #0000;
}

@property --tw-ring-inset {
  syntax: "*";
  inherits: false
}

@property --tw-ring-offset-width {
  syntax: "<length>";
  inherits: false;
  initial-value: 0;
}

@property --tw-ring-offset-color {
  syntax: "*";
  inherits: false;
  initial-value: #fff;
}

@property --tw-ring-offset-shadow {
  syntax: "*";
  inherits: false;
  initial-value: 0 0 #0000;
}

@property --tw-outline-style {
  syntax: "*";
  inherits: false;
  initial-value: solid;
}

@property --tw-blur {
  syntax: "*";
  inherits: false
}

@property --tw-brightness {
  syntax: "*";
  inherits: false
}

@property --tw-contrast {
  syntax: "*";
  inherits: false
}

@property --tw-grayscale {
  syntax: "*";
  inherits: false
}

@property --tw-hue-rotate {
  syntax: "*";
  inherits: false
}

@property --tw-invert {
  syntax: "*";
  inherits: false
}

@property --tw-opacity {
  syntax: "*";
  inherits: false
}

@property --tw-saturate {
  syntax: "*";
  inherits: false
}

@property --tw-sepia {
  syntax: "*";
  inherits: false
}

@property --tw-drop-shadow {
  syntax: "*";
  inherits: false
}

@property --tw-drop-shadow-color {
  syntax: "*";
  inherits: false
}

@property --tw-drop-shadow-alpha {
  syntax: "<percentage>";
  inherits: false;
  initial-value: 100%;
}

@property --tw-drop-shadow-size {
  syntax: "*";
  inherits: false
}

@property --tw-backdrop-blur {
  syntax: "*";
  inherits: false
}

@property --tw-backdrop-brightness {
  syntax: "*";
  inherits: false
}

@property --tw-backdrop-contrast {
  syntax: "*";
  inherits: false
}

@property --tw-backdrop-grayscale {
  syntax: "*";
  inherits: false
}

@property --tw-backdrop-hue-rotate {
  syntax: "*";
  inherits: false
}

@property --tw-backdrop-invert {
  syntax: "*";
  inherits: false
}

@property --tw-backdrop-opacity {
  syntax: "*";
  inherits: false
}

@property --tw-backdrop-saturate {
  syntax: "*";
  inherits: false
}

@property --tw-backdrop-sepia {
  syntax: "*";
  inherits: false
}

@property --tw-ease {
  syntax: "*";
  inherits: false
}
/* ─── Reveal & motion system ───────────────────────────────────────────────
 *
 * S47 (post-strip): the [data-tx-depth] page-transition entry system
 * is gone, alongside <ClientRouter /> and the spring-stagger preset
 * machinery. S53 round 10 reintroduces a SIMPLE entrance system that
 * shares the reveal vocabulary. What's here now:
 *
 * 1. SCROLL REVEAL ([data-reveal])
 *    Below-the-fold elements animate as they enter the viewport.
 *    FOUC-locked: default state is visible (opacity 1, no transform).
 *    The animation is gated by the [data-reveal-active] class which
 *    reveal.ts adds AFTER initial paint — meaning:
 *      - noscript / pre-JS: elements visible at correct position.
 *      - JS init: case-B (in-viewport) elements get marked + animated
 *        immediately; below-fold elements transition in on intersection.
 *    No flash-of-invisible-content even if the module bundle is slow.
 *
 *    S53 round 10 fix: the to-hidden transition is now snap (transition:
 *    none). Previously the active gate transitioned over 320ms FROM the
 *    default visible state INTO hidden state, then transitioned back
 *    to visible on intersection. Below-fold this was invisible, but if
 *    the user scrolled fast enough on fresh load, the gallery (or any
 *    below-fold reveal target) was caught mid-fade-out when the IO
 *    fired, producing the Safari "bounce" — element dipped down 8px
 *    + faded out, then reversed. With snap-to-hidden, only the to-
 *    visible direction animates. Above-fold case unchanged (still uses
 *    [data-reveal-immediate] override).
 *
 * 2. STAGGERED ENTRANCE ([data-tws-enter])
 *    Above-the-fold chrome that should fade in on first paint AND on
 *    every SPA-shell route swap (because @starting-style fires for
 *    elements newly mounted inside <main>.innerHTML). Pure CSS — no JS
 *    observer, no race against module load. Stagger via per-element
 *    --tws-enter-delay (CSS variable). Translate amount via per-element
 *    --tws-enter-translate (defaults 8px; set to 0 for fade-only).
 *
 *    Browser support: Chrome 117+, Safari 17.4+, Firefox 129+. Older
 *    browsers see no entrance — content arrives instant. Same fallback
 *    profile the prior inline @starting-style blocks in Nav and Hero
 *    already accepted. Keeps a single motion vocabulary with the reveal
 *    system above (same opacity / translate / duration / easing).
 *
 * 3. HERO SCALE TRANSFORM-ORIGIN ([data-hero-scale])
 *    JS sets transform on scroll; CSS only owns transform-origin and
 *    the reduced-motion zero-out.
 *
 * Reduced motion zeroes everything. */

/* ─── Unified motion vocabulary (S53 round 11) ─────────────────────────
   ONE set of values across [data-reveal], [data-tws-enter], FAQ open/
   close, and image fade-in. Cinematic feel comes from coherence — every
   transition uses the same duration + easing curve so the page reads as
   one orchestrated system instead of a collection of ad-hoc animations.

     --motion-duration:  560ms   — slower than crisp/snappy; reads deliberate
     --motion-ease:      cubic-bezier(0.6, 0, 0, 1) — S-curve; soft start,
                                   strong middle, soft settle (S70 round 6)
     --motion-translate: 9px     — soft lift; entrance slides up from +9,
                                   exit (router.ts) lifts away to -9
     --motion-stagger:   100ms   — between siblings (cards, FAQ items, hero
                                   stagger between CTA / title / subtitle)

   These values are also referenced by component-local rules (Nav CTA,
   Hero CTA, InfoCards CTA, FAQ open/close, hero.ts parallax). If you
   tune here, components inherit. */
:root {
  --motion-duration: 560ms;
  --motion-ease: cubic-bezier(0.6, 0, 0, 1);
  --motion-translate: 9px;
  --motion-stagger: 100ms;

  /* S58: chrome-hide motion (Nav + Logo translateY exit when
     body.chrome-hidden is set on gallery reach). The default
     --motion-duration / --motion-ease pair has a heavy ease-out curve
     that completes most of the motion in the first ~100ms — reads as
     "snap" when the gallery hits the trigger. Slower duration + a
     gentler curve makes the chrome glide off-screen rather than
     vanish. Used by .tws-nav and .tws-logo transitions. */
  --chrome-hide-duration: 720ms;
  --chrome-hide-ease: cubic-bezier(0.6, 0, 0, 1);
}

/* Default state: visible. Anything that reads HTML without the
   reveal.ts module — noscript, crawlers, slow-JS first paint —
   sees the content at its correct position. */
[data-reveal] {
  opacity: 1;
}

/* Animation gate. reveal.ts adds [data-reveal-active] post-Case-B
   handling, so by the time this class lands, in-viewport elements
   have already been marked is-in-view and won't see the transition
   to the hidden state. Below-fold elements start hidden (snap, no
   transition), animate in on intersection.

   S53 round 11: --reveal-delay support added on the .is-in-view rule.
   Sibling stagger (e.g. InfoCards rows, FAQ items) sets --reveal-delay
   per element via inline style or nth-child rules. Default 0ms means
   no delay if the variable is unset. */
@media (prefers-reduced-motion: no-preference) {
  [data-reveal][data-reveal-active] {
    opacity: 0;
    transform: translateY(var(--motion-translate));
    /* Snap into hidden — never animate INTO hidden. The to-visible
       transition lives on .is-in-view below. Kills the Safari fresh-
       load bounce where below-fold elements were caught mid-fade-out
       when IO fired ahead of the transition completing. */
    transition: none;
    /* S67c: pre-promote the compositor layer for elements waiting to
       reveal. Without this, Safari promotes mid-animation when the
       IntersectionObserver fires, and the layer-promotion repaint
       causes the symptom Ann observed: at the bottom of the page on
       fresh load, the FAQ→Footer area on cafebien jumps a frame, and
       the gallery rAF belt on mimbre stutters because Safari's paint
       pause stalls the next rAF tick. Pre-promoting moves all layer
       work off the IO event handler — the animation runs on a layer
       that already exists. (will-change applies to both axes that
       transition fires on so the compositor knows what to optimize.)
       Safari-only symptom; the hint is cheap enough on Chromium and
       Firefox to leave global. Layer is naturally dropped when the
       element is removed from the DOM — no manual cleanup needed
       because the gate is the [data-reveal-active] class which only
       lives while the page does. */
    will-change: transform, opacity;
  }

  [data-reveal][data-reveal-active].is-in-view {
    opacity: 1;
    transform: translateY(0);
    transition:
      opacity var(--motion-duration) var(--motion-ease) var(--reveal-delay, 0ms),
      transform var(--motion-duration) var(--motion-ease) var(--reveal-delay, 0ms);
  }

  /* In-viewport on init: marker that suppresses the transition so the
     content the user is already looking at doesn't re-fade. reveal.ts
     applies this synchronously before paint. */
  [data-reveal][data-reveal-active][data-reveal-immediate] {
    opacity: 1;
    transform: translateY(0);
    transition: none;
  }

  /* ─── Staggered entrance ([data-tws-enter]) ───────────────────────
     Default state: visible at rest. Per-element stagger via inline
     --tws-enter-delay. Translate amount via --tws-enter-translate
     (defaults to --motion-translate; set to 0px on Nav CTA — fade only).

     ⚠ Component-local rules (Nav CTA, Hero CTA, InfoCards CTA) MUST
     include `opacity` + `transform` in their `transition` shorthand
     with this duration/easing/delay or the entrance will SNAP instead
     of fading. CSS `transition` shorthand is whole-property override —
     local rules can't extend the global list, only replace it. The
     local rules in those components carry the full longhand for this
     reason. If you add a new component using [data-tws-enter] that
     also has a local `transition`, mirror the CTA pattern. */
  [data-tws-enter] {
    opacity: 1;
    transform: translateY(0);
    transition:
      opacity var(--motion-duration) var(--motion-ease) var(--tws-enter-delay, 0ms),
      transform var(--motion-duration) var(--motion-ease) var(--tws-enter-delay, 0ms);
  }

  @starting-style {
    [data-tws-enter] {
      opacity: 0;
      transform: translateY(var(--tws-enter-translate, var(--motion-translate)));
    }
  }
}

/* Reduced-motion override for staggered entrance: instant arrival, no
   @starting-style hidden state, no transition. */
@media (prefers-reduced-motion: reduce) {
  [data-tws-enter] {
    opacity: 1 !important;
    transform: none !important;
    transition: none !important;
  }
  @starting-style {
    [data-tws-enter] {
      opacity: 1;
      transform: none;
    }
  }
}

/* ─── Chrome hide on gallery reach (S53 round 24) ──────────────────────────
 *
 * Nav.astro's inline script toggles body.chrome-hidden via a passive
 * scroll listener that watches the gallery section's bounding rect.
 * When gallery's top edge crosses the viewport top, body.chrome-hidden
 * is added; Nav + Logo translate up out of view via the rule below.
 * Restored when scrolling back up moves gallery's top below.
 *
 * The transform transition lives on .tws-nav (Nav.astro) and .tws-logo
 * (Logo.astro) themselves so the animation duration/easing comes from
 * the global motion vocabulary (--motion-duration, --motion-ease).
 *
 * Specificity: body.chrome-hidden .tws-{nav,logo} = (0,2,1) — beats the
 * scoped selectors in the component .astro files (which include the
 * data-astro-cid attribute, totaling (0,2,0) for plain class match). */
body.chrome-hidden .tws-nav,
body.chrome-hidden .tws-logo {
  transform: translateY(-100%);
}

@media (prefers-reduced-motion: reduce) {
  /* Reduced-motion users: still hide chrome (functional), just no
     transition animation. The transitions on .tws-nav / .tws-logo are
     not gated on reduced-motion explicitly — the snap is fine. */
}

/* ─── Hero image scale (scroll-driven, JS-controlled) ──────────────────────
 *
 * src/scripts/hero.ts owns the transform value via a single rAF loop
 * keyed off scroll position. CSS only sets transform-origin so the
 * scale grows from the image center and not the top-left corner. */

[data-hero-scale] {
  transform-origin: center center;
}

@media (prefers-reduced-motion: reduce) {
  [data-hero-scale] {
    transform: none !important;
    transition: none !important;
  }
}

/* ─── Reduced motion: instant arrival ──────────────────────────────────── */
@media (prefers-reduced-motion: reduce) {
  [data-reveal] {
    animation: none !important;
    opacity: 1 !important;
    transform: none !important;
    transition: none !important;
  }
}
.gallery[data-astro-cid-ihllb3az]{padding-block-start:var(--block-pt-mobile, 2rem);padding-block-end:var(--block-pb-mobile, 2rem);padding-inline:0;background:var(--color-bg);color:var(--color-fg);overflow:hidden}@media (min-width: 1024px){.gallery[data-astro-cid-ihllb3az]{padding-block-start:var(--block-pt, 4rem);padding-block-end:var(--block-pb, 4rem)}}.gallery-belt-wrap[data-astro-cid-ihllb3az]{position:relative;height:320px;cursor:grab;overflow:hidden;touch-action:pan-y}@media (min-width: 641px){.gallery-belt-wrap[data-astro-cid-ihllb3az]{height:420px}}@media (min-width: 1024px){.gallery-belt-wrap[data-astro-cid-ihllb3az]{height:480px}}.gallery-belt[data-astro-cid-ihllb3az]{display:flex;height:100%;will-change:transform}.gallery-item[data-astro-cid-ihllb3az]{flex-shrink:0;height:100%;aspect-ratio:4 / 3;padding-inline:0;background:color-mix(in srgb,var(--color-fg) 6%,transparent)}.gallery-item[data-astro-cid-ihllb3az] img[data-astro-cid-ihllb3az]{width:100%;height:100%;object-fit:cover;display:block;user-select:none;pointer-events:none}@media (prefers-reduced-motion: reduce){.gallery-belt[data-astro-cid-ihllb3az]{transform:none!important}}