@charset "UTF-8";
html {
  font-size: 16px;
  scroll-padding-block-start: calc(var(--hc-header-height) + var(--hc-nav-secondary-height));
}

.powered-by-zendesk {
  display: none;
}

/* The page's content column, and the numbers the two drawers' pushes have to
   reason about (see the pinning rule below and .browse-products further down). */
:root {
  --container-max: 1400px;
  /* The width of the page as the reader sees it, which stopped being 100vw
     when the design editor became a left rail that pushes <body>
     (styles/_admin-apps.scss). Anything sizing itself against the viewport
     has to use this instead, or it overhangs the rail by the rail's width.

     Only the DESIGN EDITOR's inset belongs here, not the chat drawer's: the
     chat drawer pushes .chat-drawer-host, which is inside the page, so the
     rules below that need it subtract it at their own site (and only the ones
     inside the host do). The design editor pushes <body> itself, so every
     viewport measurement on the page is off by it. */
  --hc-page-width: calc(100vw - var(--admin-apps-inset, 0px));
  /* Where a centred content column's box starts: the distance from the
     viewport's leading edge to a --container-max block, or 0 once the window
     is narrower than one.

     Viewport-relative on purpose. It could be derived from the container's own
     containing block instead (100% + --chat-drawer-inset), which would be
     exact to the pixel — but that block's width is what the drawer's push
     animates, while --chat-drawer-inset switches in one step, so the two would
     disagree for the length of the transition and the content's leading edge
     would visibly slide and settle on every toggle. Holding it steady is the
     whole point, so it is measured against something the push doesn't move:
     this stays constant through the animation, and the column's width absorbs
     all of it.

     Consequence to know about: on platforms with classic (space-taking)
     scrollbars 100vw includes the scrollbar, so a pushed container's leading
     edge lands ~half a scrollbar width (7-8px) inside the closed-drawer
     position. Overlay-scrollbar platforms (macOS, iOS) are exact. The theme
     already accepts the same approximation in the .browse-products full-bleed
     math below. */
  --container-lead: max(0px, calc((var(--hc-page-width) - var(--container-max)) / 2));
}

.container {
  max-width: var(--container-max);
  margin-inline: auto;
  padding-inline: 24px;
}

/* Hold the content column's leading edge where a full-width page puts it — in
   line with the header, which sits outside the drawer's host and so never
   narrows.

   Centring inside the host is what breaks that alignment once the chat drawer
   opens: the host gives up the drawer's width (styles/_chat-drawer.scss), so
   `margin-inline: auto` re-centres every container in what's left and walks its
   leading edge HALF the drawer's width — 220px — away from the header's. Pinning
   the leading margin and zeroing the trailing one hands the whole squeeze to the
   trailing side instead, which is the side the drawer is on. max-width still caps
   the column; when the remaining room exceeds it the over-constrained margin
   rules drop the slack on the trailing side, in RTL as well as LTR, so the column
   stays put rather than re-centring.

   NOT gated on .chat-drawer-pushed, deliberately. With the drawer closed this
   resolves to exactly the centred position it replaces (lead = (100vw - max) / 2,
   width capped at max ⇒ the same box `margin-inline: auto` produces, at every
   width), so applying it unconditionally costs nothing — and it is what keeps the
   toggle smooth. Gating it meant the rule switched off the instant the class was
   removed, while the host's padding was still 240ms from finishing: the column
   re-centred in a page that was still narrow, jumping 220px inward, then slid
   back as the padding animated. Unconditional, the only thing that changes during
   the transition is the `100%` below — so the geometry is a continuous function of
   the animating page width, and nothing jumps in either direction.

   Scoped inside .chat-drawer-host because only containers inside the host are
   narrowed — the header's and the footer's own layouts are outside it and keep
   their full width (and their own centring) either way. */
.chat-drawer-host .container,
.chat-drawer-host .promoted-articles-inner {
  margin-inline: var(--container-lead) 0;
  /* The width has to be stated, not left to the margins. hc-components
     ships a Tailwind `.container` utility carrying `width: 100%` (theme
     rules outrank its @layer max-widths, but nothing here was overriding
     its width), so an auto width would never shrink to make room for the
     leading margin — the column would keep the host's full width and hang
     its trailing edge straight under the drawer. Subtracting the same lead
     the margin adds keeps the trailing edge flush with the page, so the
     column gives up only the width the drawer actually covers.
     max-width still caps it on a very wide window. */
  width: calc(100% - var(--container-lead));
}

/* The home page centres its columns in whatever width the drawer leaves, as the
   drawer-open design does, instead of pinning the leading edge like the rule
   above. Closed, this is the same box that rule produces. Equal margins, so the
   column fills a narrow host and centres in a wide one; the width is stated for
   the same Tailwind `.container` reason as above. */
.chat-drawer-host .home-page .container {
  margin-inline: auto;
  width: 100%;
}

.section.knowledge-base {
  padding: 64px 0;
}

.promoted-articles-section {
  position: relative;
  overflow: hidden;
  color: #fff;
  padding: 80px 0;
}

.recent-activity-heading {
  font-family: var(--font-sqsp-heading);
  font-size: 1.5rem;
  font-weight: 400;
  margin-bottom: 40px;
  color: #fff;
}
@media (min-width: 1025px) {
  .recent-activity-heading {
    font-size: 2.5rem;
    margin-bottom: 80px;
  }
}

.promoted-articles-bg {
  position: absolute;
  inset: 0;
  z-index: 0;
}
.promoted-articles-bg img {
  width: 100%;
  height: 100%;
  object-fit: cover;
}
.promoted-articles-bg::after {
  content: "";
  position: absolute;
  inset: 0;
  background: linear-gradient(rgba(0, 0, 0, 0) 85%, #000 100%);
}

/* Same content column as .container, hand-rolled because this section's inner
   also carries the stacking context over its background image. It is pinned
   alongside .container by the pushed rule above. */
.promoted-articles-inner {
  position: relative;
  z-index: 1;
  max-width: var(--container-max);
  margin-inline: auto;
  padding-inline: 24px;
}

.promoted-articles-heading {
  font-family: var(--font-sqsp-heading);
  font-size: 1.5rem;
  font-weight: 400;
  margin-bottom: 40px;
  color: #000;
}
@media (min-width: 1025px) {
  .promoted-articles-heading {
    font-size: 2.5rem;
    margin-bottom: 80px;
  }
}

.promoted-articles-section .promoted-articles-heading {
  color: #000;
}

.section.home-section {
  padding: 80px 0;
}

.browse-products {
  background: #000;
  color: #fff;
  overflow-x: clip;
}

.browse-products-heading {
  font-family: var(--font-sqsp-heading);
  font-size: 1.5rem;
  font-weight: 400;
  margin-bottom: 32px;
  color: #fff;
}
@media (min-width: 1025px) {
  .browse-products-heading {
    font-size: 2.5rem;
    margin-bottom: 48px;
  }
}

.browse-products-pills {
  margin-bottom: 40px;
}
.browse-products-pills .pill-list {
  justify-content: flex-start;
}
@media (max-width: 800px) {
  .browse-products-pills .pill-list {
    padding-inline: 0;
  }
}
.browse-products-pills .pill-list-track {
  justify-content: flex-start;
}

.browse-products-panel[hidden] {
  display: none;
}

/* Full-bleed: the viewport breaks out of .container with a negative inline
   margin and re-pads itself to the container's edge.

   The gutter is that break-out distance, so it is exactly the container's own
   leading gutter — --container-lead (the box) plus the container's 24px padding.
   Reading it from the same variable the container is positioned with is what
   keeps the two in step when the chat drawer pins the container's leading edge
   (see the pushed rule at the top of this file); computing it independently is
   how they drift. --container-lead is already clamped at 0, so it can't fall
   under the 24px minimum this used to spell out.

   The width still has to be net of --chat-drawer-inset
   (styles/_chat-drawer.scss): the chat drawer is a persistent drawer, so while
   it's open the page is narrower than the viewport and a true 100vw would
   overrun it by the drawer's width, bleeding under the drawer instead of
   stopping at the page's edge. The inset is 0 whenever the drawer is closed or
   overlaying. */
.browse-products .carousel-card-viewport {
  --browse-products-gutter: calc(var(--container-lead) + 24px);
  width: calc(var(--hc-page-width) - var(--chat-drawer-inset, 0px));
  margin-inline: calc(-1 * var(--browse-products-gutter));
  padding-inline-start: var(--browse-products-gutter);
  padding-inline-end: 48px;
  scroll-padding-inline-start: var(--browse-products-gutter);
  scroll-padding-inline-end: 48px;
  border-radius: 0;
}
@media (max-width: 800px) {
  .browse-products .carousel-card-viewport {
    padding-inline-end: var(--browse-products-gutter);
    scroll-padding-inline-end: var(--browse-products-gutter);
  }
  .browse-products .carousel-card-viewport .carousel-card {
    width: calc(var(--hc-page-width) - var(--chat-drawer-inset, 0px) - 2 * var(--browse-products-gutter));
  }
}

.section.faq--dark {
  background-color: black;
  color: #fff;
}

.faq-layout {
  display: flex;
  flex-direction: column;
  gap: 40px;
}
@media (min-width: 1025px) {
  .faq-layout {
    flex-direction: row;
    gap: 64px;
  }
}

.faq-heading {
  flex-shrink: 0;
}
@media (min-width: 1025px) {
  .faq-heading {
    flex: 1;
  }
}

.faq-title {
  font-family: var(--font-sqsp-heading);
  font-size: 1.5rem;
  font-weight: 400;
  color: #fff;
}
@media (min-width: 1025px) {
  .faq-title {
    font-size: 2.5rem;
    position: sticky;
    top: calc(var(--hc-header-height) + 36px);
  }
}

@media (min-width: 1025px) {
  .faq-content {
    flex: 1;
  }
}
.faq-content .accordion-header {
  padding: var(--spacing-sqsp-6) 0;
}
.faq-content .accordion-label {
  font-size: 1.125rem;
  font-weight: 500;
}
@media (min-width: 1025px) {
  .faq-content .accordion-label {
    font-size: 1.25rem;
  }
}
.faq-content .accordion-body-content {
  font-size: 0.875rem;
}
@media (min-width: 1025px) {
  .faq-content .accordion-body-content {
    font-size: 0.9rem;
  }
}

.section.activity--dark {
  background-color: black;
  color: #fff;
}

.section.resources-section--dark {
  position: relative;
  overflow: hidden;
  background-color: black;
  color: #fff;
}
.section.resources-section--dark::before, .section.resources-section--dark::after {
  content: "";
  position: absolute;
  left: 0;
  right: 0;
  z-index: 1;
  pointer-events: none;
}
.section.resources-section--dark::before {
  top: 0;
  height: 35%;
  background: linear-gradient(to bottom, black 0%, transparent 100%);
}
.section.resources-section--dark::after {
  bottom: 0;
  height: 25%;
  background: linear-gradient(to top, rgba(0, 0, 0, 0.6) 0%, transparent 100%);
}
.section.resources-section--dark > .container {
  position: relative;
  z-index: 2;
}
.section.resources-section--dark .carousel-card-image {
  object-position: top;
}
.section.resources-section--dark .resources-heading {
  font-family: var(--font-sqsp-heading);
  font-size: 1.5rem;
  font-weight: 400;
  margin-bottom: 40px;
  color: #fff;
  text-transform: lowercase;
}
.section.resources-section--dark .resources-heading::first-letter {
  text-transform: uppercase;
}
@media (min-width: 1025px) {
  .section.resources-section--dark .resources-heading {
    font-size: 2.5rem;
    margin-bottom: 80px;
  }
}

.resources-glow {
  background: var(--glow-color, #8c613d);
  opacity: 0.6;
  filter: blur(150px);
  will-change: transform;
  border-radius: 700px;
  width: 100%;
  height: 700px;
  position: absolute;
  top: 0;
  left: 0;
  transform: translateZ(0);
  pointer-events: none;
}
@media (min-width: 744px) {
  .resources-glow {
    height: 160%;
  }
}

.section.activity [data-rosetta] .recent-activity-item.card {
  cursor: pointer;
}

.section.activity [data-rosetta] .recent-activity-item-link.card-title {
  display: block;
}
.section.activity [data-rosetta] .recent-activity-item-link.card-title::after {
  content: "";
  position: absolute;
  inset: 0;
}

.section.activity [data-rosetta] .recent-activity-item-meta.card-footer {
  display: flex;
  align-items: center;
  gap: 12px;
  color: var(--color-sqsp-gray-300);
  font-size: var(--text-sqsp-2);
  line-height: var(--leading-sqsp-1);
}

.section.activity [data-rosetta] .recent-activity-item-comment {
  display: none;
}

.section.activity [data-rosetta] .recent-activity-loader {
  padding: 48px 0;
  text-align: center;
}
.section.activity [data-rosetta] .recent-activity-loader .activity-indicator {
  margin: 0 auto;
}

.section.activity [data-rosetta] .recent-activity-controls {
  margin-top: 24px;
  text-align: center;
}

.skip-navigation {
  position: fixed;
  top: -100%;
  left: 50%;
  transform: translateX(-50%);
  z-index: 10000;
  padding: 12px 24px;
  background: var(--color-accent, #000);
  color: #fff;
  font-size: 1rem;
  font-weight: 600;
  text-decoration: none;
  border-radius: 8px;
  white-space: nowrap;
  opacity: 0;
  pointer-events: none;
  transition: top 0.15s ease, opacity 0.15s ease;
}
.skip-navigation:focus, .skip-navigation:focus-visible {
  top: 12px;
  opacity: 1;
  pointer-events: auto;
  outline: 2px solid #fff;
  outline-offset: 2px;
}

html[data-hc-leaving] body {
  visibility: hidden !important;
}

html[data-hc-hero-pending] .home-hero-inner,
html[data-hc-hero-pending] .search-hero .container,
html[data-hc-hero-pending] .request-intro-text,
html[data-hc-hero-pending] [data-footer] {
  visibility: hidden;
}

/* ── Sticky header ───────────────────────────────────────────────────────────
   The bar stays pinned to the top of the viewport for the whole page. It has to:
   the navbar chat toggle is the ONLY control that opens and closes the chat
   drawer (the drawer carries no chrome of its own — styles/_chat-drawer.scss),
   so a header that scrolls away is a drawer that can't be closed.

   The sticky lives on templates/header.hbs's [data-rosetta] WRAPPER, not on
   .navbar itself, and that isn't cosmetic: a sticky box is clamped to its
   parent's content box, and .navbar's parent is that wrapper — exactly bar
   height, so it would have zero travel and never appear to stick at all. The
   wrapper's parent is <body>, which spans the document. Keep the class there.
   (Nothing sets transform/contain on html, body or the [data-rosetta] base
   rules, so nothing clips it or re-anchors it to an inner scrollport. The one
   `overflow: hidden` on html, the open phone menu's scroll lock under
   "Below-desktop bar", propagates to the viewport, which stays the
   scrollport.)

   This wrapper contains ONLY the navbar — the announcement/verification
   banners live in their own preceding, non-sticky [data-rosetta] wrapper
   (templates/header.hbs) so they scroll away with the page instead of
   freezing to the viewport top alongside the bar.

   --hc-header-height is the strip the bar occupies, published here from
   $header-height (styles/_content-width.scss) for the three places that need to
   reason about it: the chat drawer's offset + height, the page's
   scroll-padding, and the .faq-title sticky (both styles/_page.scss). The
   min-block-size below is what makes it a contract rather than a guess — the
   bar is AT LEAST this tall, so the constant can't be an underestimate.
   box-sizing: border-box is already set on [data-rosetta] *, so it includes
   .navbar-inner's block padding. */
:root {
  --hc-header-height: 76px;
}

[data-rosetta] .navbar-inner {
  min-block-size: var(--hc-header-height);
}

.site-header {
  position: sticky;
  inset-block-start: 0;
  /* Above the chat drawer (z-index: 20, styles/_chat-drawer.scss) so the bar —
     and with it the only way to close the drawer — is never covered.
     `position: sticky` opens a stacking context, so the navbar's own dropdown
     and mega flyouts (--popover-z: 50, hc-components popover.css) resolve
     INSIDE it: the whole header subtree composites at 40, which still puts
     those flyouts over the drawer and over page content exactly as before. */
  z-index: 40;
}

/* Selected chat toggle — the drawer is open. src/chatToggle.js flips
   aria-pressed on every [data-chat-toggle] from the drawer's state event, so the
   attribute carries the state directly rather than needing a parallel class (the
   same attribute-driven idiom the support card uses).

   Pressed inverts the toggle to a solid bar-foreground pill, which no other
   control in .navbar-actions wears (the brand CTA is `alt`; the toggle rests as
   `animated`, hc-components' drifting-gradient extension of it — see
   src/header.js). `background` is the shorthand rather than `background-color`
   on purpose: animated's resting fill is a `background-image` gradient
   (src/primitives/button.css), and the shorthand resets that longhand to `none`
   along with position/size/origin/repeat, so pressed shows a flat fill with the
   drift animation running over nothing rather than a gradient bleeding through
   underneath. Hover is pinned to the same pair so the fill doesn't drop out from
   under the pointer. Unlayered here, so it wins over hc-components' @layer
   components .btn rules regardless of specificity. */
[data-rosetta] [data-navbar] .navbar-actions .btn[aria-pressed=true],
[data-rosetta] [data-navbar] .navbar-actions .btn[aria-pressed=true]:hover {
  background: var(--color-base-content, #0e0e0e);
  border-color: var(--color-base-content, #0e0e0e);
  color: var(--color-base-100, #fff);
}

/* ── Logo: image lockup vs. text wordmark ─────────────────────────────────────
   templates/header.hbs ships both inside the home link; exactly one shows.
   Every brand defaults to its image logo (.navbar-logo, branding.logo) over the
   dc eyebrow. squarespace and forma swap both for the live-text
   .navbar-wordmark (Figma Ldk8mN7DkefwTsA6evgxh1 nodes 895:58966 and
   1840:58461). The sandboxes match because data-brand is the Rosetta brand,
   which strips "-sandbox". A hidden <img> is still fetched, so these brands
   download their logo.svg unused; it is the same file the footer shows, so it
   is a cache hit there.

   `display: none` also takes the hidden lockup out of the link's accessible
   name, so the link is named by whichever lockup shows: the image's alt
   text, or the wordmark's own text. */
[data-rosetta] [data-navbar] .navbar-wordmark,
[data-rosetta] [data-navbar] .navbar-wordmark-prefix {
  display: none;
}

[data-rosetta]:is([data-brand=squarespace], [data-brand=forma]) [data-navbar] .navbar-wordmark {
  display: inline-flex;
}

[data-rosetta]:is([data-brand=squarespace], [data-brand=forma]) [data-navbar] .navbar-logo,
[data-rosetta]:is([data-brand=squarespace], [data-brand=forma]) [data-navbar] .navbar-eyebrow {
  display: none;
}

/* Forma's lockup reads "SQUARESPACE ■ Forma Help Center": the prefix is part
   of the product name, in its Book weight, and stays beside it below the
   desktop breakpoint, where the name drops to "■ Forma Help Center". */
[data-rosetta][data-brand=forma] [data-navbar] .navbar-wordmark-prefix {
  display: inline;
}

/* The Help Center lockup's artwork sets the square off by 0.4 of its own size
   (the cap height) on each side. 0.285em is that gap at Clarkson's ~0.71em cap
   height, up from the library's 0.2em. Forma's artwork spaces it the same. */
[data-rosetta]:is([data-brand=squarespace], [data-brand=forma]) [data-navbar] .navbar-wordmark {
  gap: 0.285em;
}

/* The image lockup (30px logo + gap + ~9px eyebrow) must fit the 44px the bar
   is sized for ($header-height, styles/_content-width.scss): at hc-components'
   6px gap it is ~45px, which would make those bars ~1px taller than the
   --hc-header-height the chat drawer is offset by, and clip the drawer's
   bottom edge. 4px keeps it at ~43px. No --spacing-sqsp- entry (0/6 bracket
   it), so the literal. Only the image brands see this: the squarespace
   wordmark is the link's one visible child, so there is no gap to close. */
[data-rosetta] [data-navbar] .navbar-brand {
  gap: 4px;
}

/* The chat toggle takes the box corner rather than animated's selector pill
   (Help Center "Nav Bar", node 1052:23484). Unlayered, so it beats
   button.css's layered `.btn.animated { border-radius: var(--radius-selector) }`.
   Its message glyph is 16px (--size-sqsp-125), matching the nav chevrons
   rather than following the button's font-size. */
[data-rosetta] [data-navbar] .navbar-actions .navbar-chat-toggle {
  --icon-size: var(--size-sqsp-125);
  border-radius: var(--radius-box);
}

/* The width change between "Chat" and "Close chat" eases rather than jumps:
   src/chatToggle.js pins the old width inline and sets the new one, and this
   transition carries it across (the same 250ms ease-in-out-cubic as the
   accordions). While the box is narrower than its new label, the label is
   clipped on one line rather than wrapping, and flex-start keeps the glyph
   still while the text is revealed or tucked away. At rest the button is
   exactly its content's width, so flex-start sits it where centring did.
   button.css's :active press scale sets `transition: transform`, which this
   unlayered rule would otherwise drop, so it is listed here too. */
[data-rosetta] [data-navbar] .navbar-actions .navbar-chat-toggle[data-chat-toggle-resize] {
  justify-content: flex-start;
  overflow: hidden;
  white-space: nowrap;
  transition: width var(--duration-sqsp-250) var(--ease-sqsp-ease-in-out-cubic), transform var(--duration-sqsp-100) var(--ease-sqsp-ease-out);
}

@media (prefers-reduced-motion: reduce) {
  [data-rosetta] [data-navbar] .navbar-actions .navbar-chat-toggle[data-chat-toggle-resize] {
    transition-duration: 0s;
  }
}
/* The locale switcher's globe is 22px (--size-sqsp-150) at every breakpoint
   (Help Center "Nav Bar", node 1096:48835: the "Global" instance in each
   frame's Language group). hc-components sizes the whole trigger at 16px, so
   the glyph is set directly and the chevron keeps the trigger's size. */
[data-rosetta] [data-navbar] .locale-switcher-trigger .icon-global {
  --icon-size: var(--size-sqsp-150);
}

/* ── Hamburger toggle ─────────────────────────────────────────────────────────
   hc-components' navbar.css crossfades the menu glyph for a cross
   (icon-cross-large) on aria-expanded="true" (its .navbar-toggle-open/-close
   opacity rules, @layer components). templates/header.hbs now ships only the
   menu glyph, so the first override just holds it visible instead of fading
   it out. The rest gives the button the same size, centering, and pressed
   treatment as its sibling .navbar-toggle-chat below — a filled
   bar-foreground swatch with the icon inverted to the bar background — so the
   two icon buttons read as a matching pair at rest and whichever one is open.
   Unlayered here, so all of these win over hc-components' @layer rule
   regardless of specificity. */
[data-rosetta] [data-navbar] .navbar-toggle[aria-expanded=true] .navbar-toggle-open {
  opacity: 1;
}

/* hc-components positions this glyph with position:absolute; inset:0 to stack
   it with the (now-removed) close glyph for the crossfade. With only one
   glyph left, that absolute positioning fights the centering below — an
   inset:0 box anchors to the container's top/left rather than centering a
   smaller fixed-size icon inside a now-larger button — so drop it back into
   flow and let the button's flex alignment center it instead, same as
   .navbar-toggle-chat's icon-message span. */
[data-rosetta] [data-navbar] .navbar-toggle-open {
  position: static;
}

[data-rosetta] [data-navbar] .navbar-toggle {
  width: var(--size-sqsp-200);
  height: var(--size-sqsp-200);
  align-items: center;
  justify-content: center;
  border-radius: var(--radius-sqsp-1);
}

[data-rosetta] [data-navbar] .navbar-toggle[aria-expanded=true] {
  background: var(--color-base-content, #0e0e0e);
  color: var(--color-base-100, #fff);
}

/* ── Mobile chat toggle ───────────────────────────────────────────────────────
   On a phone-width bar (below the tablet tier, see "Below-desktop bar" below)
   chat is an icon button rather than the labelled one: .navbar-toggle-chat, a
   standalone control src/header.js inserts as the hamburger's next sibling
   that opens/closes the chat drawer directly. The labelled toggle
   (.navbar-actions .navbar-chat-toggle) is hidden at this breakpoint, so the
   bar never offers chat twice. The tablet bar shows the labelled one instead. */
@media (max-width: 743px) {
  [data-rosetta] [data-navbar] .navbar-actions .navbar-chat-toggle {
    display: none;
  }
}
/* Sized and positioned like hc-components' own .navbar-toggle (navbar.css)
   since it sits right beside it and should read as its twin at rest. A
   distinct class rather than reusing .navbar-toggle itself: that class is
   also hc-components' navbar.js delegated-click selector for
   expanding/collapsing .navbar-menu, so sharing it would fire both toggles
   off one click. */
[data-rosetta] [data-navbar] .navbar-toggle-chat {
  position: relative;
  display: inline-flex;
  flex: none;
  align-items: center;
  justify-content: center;
  width: var(--size-sqsp-200);
  height: var(--size-sqsp-200);
  padding: 0;
  border: 0;
  border-radius: var(--radius-sqsp-1);
  background: none;
  cursor: pointer;
  color: var(--color-base-content);
  --icon-size: var(--size-sqsp-150);
}

[data-rosetta] [data-navbar] .navbar-toggle-chat:focus-visible {
  outline: var(--border-width-sqsp-2) solid var(--color-base-content);
  outline-offset: var(--size-sqsp-50);
}

[data-rosetta] [data-navbar] .navbar-toggle-chat:focus:not(:focus-visible) {
  outline: none;
}

/* Hidden at the tablet and desktop breakpoints: both bars keep their single
   chat toggle in .navbar-actions instead. Desktop needs 1025px, so 744px
   covers both. */
@media (min-width: 744px) {
  [data-rosetta] [data-navbar] .navbar-toggle-chat {
    display: none;
  }
}
/* Selected — the drawer is open. Same attribute-driven idiom and the same
   fill/text-color pair as the desktop toggle's pressed state above, scoped to
   this bare icon button instead of .navbar-actions .btn — no hover rule is
   needed here since nothing about this control changes on hover. */
[data-rosetta] [data-navbar] .navbar-toggle-chat[aria-pressed=true] {
  background: var(--color-base-content, #0e0e0e);
  color: var(--color-base-100, #fff);
}

/* The accessible name (src/chatToggle.js swaps this text between "Chat"
   / "Close chat", the same [data-chat-toggle-label] contract the desktop
   toggle uses) — visually hidden rather than removed, since a display:none or
   zero-size node drops out of some screen readers' accessibility tree. Same
   clip recipe as .chat-drawer-loading-label (styles/_chat-drawer.scss),
   scoped separately here rather than shared — that file's own comment notes
   the theme has no visually-hidden utility to reuse yet. */
[data-rosetta] [data-navbar] .navbar-toggle-chat-label {
  position: absolute;
  inline-size: 1px;
  block-size: 1px;
  margin: -1px;
  padding: 0;
  overflow: hidden;
  clip-path: inset(50%);
  white-space: nowrap;
  border: 0;
}

/* The signed-in account control (templates/header.hbs's shared
   [data-navbar-auth], revealed by src/auth.js for whichever brand's switch —
   Keystatic config or Statsig gate — says to): the account-name trigger,
   styled as bar text. Signed out, the same slot holds hc-components' subtle
   Button (.btn.subtle.navbar-signin), which needs nothing here.

   hc-components' own .navbar-item/.navbar-login pair sets line-height: 1 for
   icon-only bar items; the 22px line here is the text line. */
[data-rosetta] [data-navbar] .navbar-login {
  display: inline-flex;
  align-items: center;
  color: var(--color-base-content, #0e0e0e);
  font-weight: var(--font-weight-sqsp-book, 400);
  line-height: 22px;
  text-decoration: none;
  white-space: nowrap;
}

[data-rosetta] [data-navbar] .navbar-login:hover,
[data-rosetta] [data-navbar] .navbar-login:focus-visible {
  text-decoration: underline;
}

/* The signed-in account-name variant of .navbar-login (header.hbs) reads as a
   name label rather than a link, so it takes no underline in any state. It's
   the trigger of a hover .popover whose panel is the same .navbar-mega card
   (icon | title rows) the mobile menu sections use, so the two read as one
   family. */
[data-rosetta] [data-navbar] .navbar-login-account,
[data-rosetta] [data-navbar] .navbar-login-account:hover,
[data-rosetta] [data-navbar] .navbar-login-account:focus-visible {
  text-decoration: none;
}

/* hc-components' mega default (`.popover:has(> .navbar-mega) { position:
   static }`) anchors a mega panel to .navbar-inner so the Resources mega can
   centre on the bar. This trigger sits mid-bar, so the panel has to anchor
   to the trigger itself instead:
   restore `position: relative` on the wrapper and pin the panel's right edge
   to the trigger's (undoing the mega's bar-centring transform). */
[data-rosetta] [data-navbar] .navbar-login-account.popover {
  position: relative;
}

[data-rosetta] [data-navbar] .navbar-login-account:has(> .navbar-mega) .popover-panel.navbar-mega {
  left: auto;
  right: 0;
  transform: none;
}

/* The account card is a fixed 262px measure with a 22px inset and the larger
   radius, against the Resources mega's 300px column, 33px inset and default
   radius. 262 has no --size-sqsp- entry (247/276 are the neighbours), so the
   Figma literal stays. The column fills the card so the item reads flush left
   from the inset. */
[data-rosetta] [data-navbar] .navbar-login-account .popover-panel.navbar-mega {
  width: 262px;
  padding: var(--spacing-sqsp-4);
  border-radius: var(--radius-sqsp-3);
}

[data-rosetta] [data-navbar] .navbar-login-account .navbar-mega-col {
  width: 100%;
}

/* {{link 'sign_out'}} can't nest children, so the link itself carries
   .navbar-mega-title inside a plain (glyph-less) .navbar-mega-link row.
   Stretch the link's hit area over the row so the card behaves like the
   JS-built mega links (src/header.js buildMegaLink), where the <a> is the row. */
[data-rosetta] [data-navbar] .navbar-login-account .navbar-mega-link {
  position: relative;
  width: 100%;
}

[data-rosetta] [data-navbar] .navbar-login-account .navbar-mega-link > a.navbar-mega-title {
  line-height: var(--leading-sqsp-2);
  text-align: left;
  text-decoration: none;
  white-space: nowrap;
}

[data-rosetta] [data-navbar] .navbar-login-account .navbar-mega-link > a.navbar-mega-title::after {
  content: "";
  position: absolute;
  inset: 0;
}

/* The bar sets the account control 22px off the chat CTA rather than the 33px
   --spacing-sqsp-6 rhythm hc-components gives .navbar-actions. Scoped to the
   horizontal layout: below the breakpoint .navbar-actions is a column and that
   33px is the menu's own vertical rhythm, which stays. */
@media (any-pointer: fine) and (min-width: 1025px) {
  [data-rosetta] [data-navbar] .navbar-actions {
    gap: var(--spacing-sqsp-4);
  }
  /* The Help Center bar runs edge to edge at every width with a 33px inset
     (Figma Ldk8mN7DkefwTsA6evgxh1, Dev Handoff notes 1096:48922 and
     1075:36389): only the page content between the nav and the footer is
     held to 1440px. hc-components caps .navbar-inner at that 1440px and
     insets it 38px (--spacing-sqsp-7), so on a wide window the wordmark and
     buttons pulled in from the edges. */
  [data-rosetta] [data-navbar] .navbar-inner {
    max-width: none;
    padding-inline: var(--spacing-sqsp-6);
  }
}
/* The avatar fronts the account row in the mobile menu only — in the bar the
   name (and its chevron) stands alone. Its photo is laid over hc-components'
   initial badge and clipped to its circle; src/header.js removes the photo
   when it is Zendesk's stand-in for a user without one, or fails to load, so
   the initial shows instead. */
[data-rosetta] [data-navbar] .navbar-login-avatar {
  position: relative;
  display: none;
  overflow: hidden;
}

[data-rosetta] [data-navbar] .navbar-login-avatar-img {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
}

/* The mobile menu's own Sign out control, hidden wherever the dropdown works. */
[data-rosetta] [data-navbar] .navbar-login-logout {
  display: none;
}

/* ── Mobile menu blocks ───────────────────────────────────────────────────────
   Below the bar breakpoint the open hamburger menu is a stack of flush blocks
   — All Topics, Resources, Developers, the sibling-brand list, then the
   account row — separated by edge-to-edge #e7e7e7 hairlines (Figma
   Ldk8mN7DkefwTsA6evgxh1 nodes 1934:61717 signed out, 1934:61266 signed in,
   1934:61407 the default open state). Each nav
   section is an hc-components Accordion src/header.js builds
   (.navbar-mobile-section): a 22px-inset header row — Clarkson title, plus /
   minus on the right — over its list of links, 22px apart, which opens and
   closes on its own.

   The rows bleed over .navbar-inner's inline inset so their hairlines run edge
   to edge, and pad back in so their text sits on the menu's inset — 22px
   here, 33px on the tablet bar (see "Below-desktop bar" below). */
@media not all and (any-pointer: fine) and (min-width: 1025px) {
  [data-rosetta] [data-navbar] .navbar-nav {
    gap: 0;
    align-items: stretch;
  }
  [data-rosetta] [data-navbar] .navbar-mobile-section,
  [data-rosetta] [data-navbar] [data-navbar-auth],
  [data-rosetta] [data-navbar] .locale-switcher-panel {
    --navbar-menu-inset: var(--spacing-sqsp-4);
    box-sizing: border-box;
  }
  /* The bar's own #e7e7e7 hairline colour (navbar.css), so the dividers and
     the bar's bottom edge read as one set — not accordion.css's 20%-alpha
     foreground, which renders darker. The locale menu (see "Below-desktop
     bar") is one of these blocks too. The account row's top edge is the
     pinned footer's, drawn under "Below-desktop bar".

     navbar.css draws the bar's hairline at the bottom of the whole .navbar,
     which an open menu pushes down to the viewport's bottom edge, so each
     block draws the line above it, the first one directly under the bar.
     The last section also closes itself off: with the menu stretched to the
     viewport, white space follows it (Figma 1934:61717). The desktop
     popovers are sibling divs, so :last-of-type can't find it; "no section
     after it" can. */
  [data-rosetta] [data-navbar] .navbar-mobile-section,
  [data-rosetta] [data-navbar] .locale-switcher-panel {
    border-top: var(--border-width-sqsp-1) solid var(--navbar-border-color, var(--colors-border-default));
  }
  [data-rosetta] [data-navbar] .navbar-mobile-section:not(:has(~ .navbar-mobile-section)) {
    border-bottom: var(--border-width-sqsp-1) solid var(--navbar-border-color, var(--colors-border-default));
  }
  [data-rosetta] [data-navbar] [data-navbar-auth] {
    padding: var(--spacing-sqsp-4) var(--navbar-menu-inset);
  }
  /* The section's own rule (above) replaces the accordion item's. The shared
     .navbar-mega-* cells read their colours from the popover vars; outside a
     popover, point them at the bar surface the same way navbar.css's
     accordion re-skin does. */
  [data-rosetta] [data-navbar] .navbar-mobile-section {
    --popover-fg: var(--color-base-content);
    --navbar-mega-muted: color-mix(in oklab, var(--color-base-content) 55%, var(--color-base-100));
  }
  [data-rosetta] [data-navbar] .navbar-mobile-section .accordion-item {
    border-top: 0;
  }
  /* accordion.css pads the header 24px (32px from 744px) with no inline
     inset, and the body 20px (32px) below; the menu is 22px all round at
     every width. */
  [data-rosetta] [data-navbar] .navbar-mobile-section .accordion-header {
    gap: var(--spacing-sqsp-4);
    padding: var(--spacing-sqsp-4) var(--navbar-menu-inset);
  }
  [data-rosetta] [data-navbar] .navbar-mobile-section .accordion-body-content {
    padding-inline: var(--navbar-menu-inset);
  }
  [data-rosetta] [data-navbar] .navbar-mobile-section .accordion-header[aria-expanded=true] + .accordion-body .accordion-body-content {
    padding-bottom: var(--spacing-sqsp-4);
  }
  /* Figma sets the title in Clarkson Semibold, but the CDN serves Clarkson
     only at 400 and 500 (templates/document_head.hbs) — a 600 here is
     synthesised from the 500 face and smears. Medium is the real face
     closest to it, and still reads a step above the Book links. */
  [data-rosetta] [data-navbar] .navbar-mobile-section-title {
    font-size: var(--text-sqsp-3);
    font-weight: var(--font-weight-sqsp-medium);
    line-height: var(--leading-sqsp-2);
  }
  /* Single column, 22px between rows; each row is one 22px Clarkson Book
     line, a 16px glyph 11px off its label where the link has one. */
  [data-rosetta] [data-navbar] .navbar-mobile-section .navbar-mega-grid {
    gap: var(--spacing-sqsp-4);
  }
  [data-rosetta] [data-navbar] .navbar-mobile-section .navbar-mega-col {
    gap: var(--spacing-sqsp-4);
  }
  [data-rosetta] [data-navbar] .navbar-mobile-section .navbar-mega-link.has-icon {
    gap: var(--spacing-sqsp-2);
  }
  [data-rosetta] [data-navbar] .navbar-mobile-section .navbar-mega-icon {
    --icon-size: var(--size-sqsp-125);
  }
  [data-rosetta] [data-navbar] .navbar-mobile-section .navbar-mega-title {
    font-weight: var(--font-weight-sqsp-book);
    line-height: var(--leading-sqsp-2);
  }
  /* The account row: the hover popover is unreachable here — touch has no
     hover and popover.js opens on mouseover — so [data-navbar-auth] stops
     being a dropdown and lays out as the last block (Figma 1934:61266):
     avatar | name, 11px apart, with the Log out button 11px after the name.
     Only that button is interactive; the name is a static label, matching
     how the row reads with no panel to open. :not([hidden]) because this
     author `display` would otherwise beat the UA's [hidden] rule and show the
     row for brands src/auth.js never reveals it on. */
  [data-rosetta] [data-navbar] [data-navbar-auth]:not([hidden]) {
    display: flex;
    align-items: center;
    gap: var(--spacing-sqsp-2);
  }
  /* hc-components' initial badge at the Figma's 32px (no --size-sqsp- entry:
     28/36 bracket it), its initial in Book, on the Figma's avatar fill —
     Rosetta's marketing "schist" subtle foreground, #8D906B — rather than
     the badge's --color-accent, which is near-black for squarespace. */
  [data-rosetta] [data-navbar] .navbar-login-avatar {
    display: inline-flex;
    width: 32px;
    height: 32px;
    background-color: var(--color-sqsp-marketing-schist-fg-subtle);
    color: var(--colors-fg-on-strong);
    font-weight: var(--font-weight-sqsp-book);
  }
  /* A long name is cut off with an ellipsis rather than pushing Log out off
     the row. */
  [data-rosetta] [data-navbar] .navbar-login-account {
    min-width: 0;
    max-width: 100%;
  }
  /* With an account page (authentication.accountUrl, src/auth.js) the avatar
     and name are a link there, the bar's Log in button style. In this row it
     still reads as the Figma's avatar and name: hc-components' subtle
     Button height, padding, weight and centring come off. */
  [data-rosetta] [data-navbar] .navbar-login-link {
    justify-content: flex-start;
    min-height: 0;
    padding: 0;
    font-weight: var(--font-weight-sqsp-book);
    line-height: var(--leading-sqsp-2);
    letter-spacing: normal;
  }
  [data-rosetta] [data-navbar] .navbar-login-name {
    min-width: 0;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
  }
  /* Signed out, the row is a single full-width neutral Button, "Log in"
     (Figma 1934:61717, Button "Default / Medium"): 36px tall on the
     --color-base-300 fill.
     hc-components' .btn.subtle drops the fill and the inline
     padding, so the palette and box are re-pointed here; the hover is the
     library's own derivation over that fill (as for .navbar-login-logout
     below). */
  [data-rosetta] [data-navbar] .navbar-signin {
    --btn-bg: var(--color-base-300);
    --btn-bg-hover: oklch(from var(--color-base-300) calc(l + sign(0.5 - l) * var(--hover-bg-delta)) calc(c * var(--hover-chroma)) h);
    --btn-fg-hover: var(--btn-fg);
    flex: 1;
    min-height: var(--size-sqsp-200);
    padding-block: 0;
    padding-inline: var(--spacing-sqsp-2);
    border-radius: var(--radius-sqsp-1);
  }
  /* Figma sets 11px avatar → name here, against the bar's 6px name →
     chevron. */
  [data-rosetta] [data-navbar] .navbar-login {
    gap: var(--spacing-sqsp-2);
  }
  [data-rosetta] [data-navbar] .navbar-login-account.popover {
    flex: 1;
  }
  [data-rosetta] [data-navbar] .navbar-login-account .popover-panel,
  [data-rosetta] [data-navbar] .navbar-login-account .navbar-item-chevron {
    display: none;
  }
  [data-rosetta] [data-navbar] button.navbar-login-account {
    cursor: default;
    pointer-events: none;
  }
  /* Styled to read as the neutral Button in the Figma's account row
     (1934:61266, Button "Default / Small"): the signed-out Log in button's
     fill, in the small size — 28px tall, 6px inline padding, the same box
     as hc-components' .btn.sm. */
  [data-rosetta] [data-navbar] .navbar-login-logout {
    box-sizing: border-box;
    display: inline-flex;
    flex: none;
    align-items: center;
    justify-content: center;
    min-height: var(--size-sqsp-175);
    padding-block: 0;
    padding-inline: var(--spacing-sqsp-1);
    border: 1px solid transparent;
    border-radius: var(--radius-sqsp-1);
    background-color: var(--color-base-300);
    color: var(--color-base-content);
    font-family: var(--font-body);
    font-size: var(--text-sqsp-3);
    font-weight: var(--font-weight-emphasis);
    line-height: 1;
    letter-spacing: -0.01em;
    text-align: center;
    text-decoration: none;
    white-space: nowrap;
    cursor: pointer;
    -webkit-font-smoothing: antialiased;
  }
  /* hc-components derives every .btn hover from --hover-bg-delta/--hover-chroma
     (see --btn-default-bg-hover); same formula, over this button's own fill. */
  [data-rosetta] [data-navbar] .navbar-login-logout:hover {
    background-color: oklch(from var(--color-base-300) calc(l + sign(0.5 - l) * var(--hover-bg-delta)) calc(c * var(--hover-chroma)) h);
  }
  [data-rosetta] [data-navbar] .navbar-login-logout:focus-visible {
    outline: var(--border-width-sqsp-2) solid var(--colors-border-strong);
    outline-offset: var(--size-sqsp-50);
  }
  [data-rosetta] [data-navbar] .navbar-login-logout:focus:not(:focus-visible) {
    outline: none;
  }
}
/* ── Below-desktop bar ────────────────────────────────────────────────────────
   Help Center "Nav Bar" (Figma Ldk8mN7DkefwTsA6evgxh1 node 1096:48835). Below
   the desktop bar the nav dropdowns and the account control move into the
   hamburger menu, while the bar keeps hamburger | locale switcher | chat on
   the right of the wordmark:

     tablet (744 frame, 1096:48937) — the full "SQUARESPACE ■ Help Center"
       wordmark, then hamburger | globe | the labelled Chat button, 22px
       apart, at a 33px inset;
     phone (375 frame, 1096:48975) — "■ Help Center", then three 36px icon
       buttons: hamburger | globe | chat, 11px apart, at an 11px inset.

   The globe is a menu button, the hamburger's twin: it opens the locale list
   as a full-width menu under the bar rather than the desktop's flyout card
   (see "Locale menu" below).

   The tablet tier is everything wide enough for its row (744px, Rosetta's
   tablet floor) that the desktop bar doesn't claim. The theme's desktop bar
   starts at 1025px (Rosetta's desktop-100), so tablet covers fine-pointer
   windows 744–1024px and every coarse-pointer viewport from 744px up, which
   gives iPads the tablet bar in both orientations. Every 1025px boundary in
   this file is that same split. The mobile-menu block above still applies;
   this one lays out the bar and places the menu rows.

   hc-components keeps its own desktop boundary at 801px, so for fine-pointer
   windows 801–1024px its layered desktop-50 rules are live here too: they hide
   the hamburger, lay .navbar-nav out as a row, and show the nav's dropdown
   flyouts instead of the accordions. The overrides marked "desktop-50" below
   undo those. They are unlayered, so they win.

   No markup of its own. The locale switcher, chat toggle / CTA and admin toggle
   are the desktop ones in .navbar-actions, which sits inside the collapsible
   .navbar-menu, so here both wrappers are `display: contents` and .navbar-inner
   becomes a grid that places each piece directly: the bar items in row 1, the
   nav sections in row 2, the account row in row 3. The collapse that navbar.css applies to
   .navbar-menu as a whole is re-applied to just the menu rows, leaving the bar
   items visible while the menu is shut.

   Bar items sit in fixed columns rather than auto-placed ones, so the menu rows
   can span them all with `1 / -1`. The column gap is 0 and the gap is margin on
   each bar item, because an absent item (no alternative locales, no chat, no
   admin toggle) leaves an empty, zero-width auto column that would still
   collect a gap. Row 1 is held to the bar's 44px content height (76px less the
   16px block padding either side), so a phone bar of 36px buttons is still the
   76px --hc-header-height the chat drawer is offset by, open menu or not.

   Only the top padding stays. The bottom 16px belongs under the bar, not under
   whichever menu row comes last, so it is dropped and the nav / locale menu
   take it back as their top margin. With the menu shut, the min-block-size
   (top of this file) still makes the bar 76px: the spare 16px falls to the
   empty fr row, below the bar items.

   An open menu (the hamburger's or the locale list) fills the viewport
   (Figma 1934:61717, 1934:60859): .navbar-inner is exactly 100dvh tall, so
   the minmax(0, 1fr) row 2 takes every pixel the bar and the account row
   don't. The sections scroll inside it and the account row sits pinned to
   the viewport's bottom edge under them, the white space
   between the last section and the footer included. dvh rather than vh so
   the footer clears iOS Safari's toolbar. Shut, the bar is content height
   again. Without JS the toggle has no aria-expanded, so none of this applies
   and the menu stays inline. */
@media not all and (any-pointer: fine) and (min-width: 1025px) {
  [data-rosetta] [data-navbar] .navbar-inner {
    --navbar-bar-gap: var(--spacing-sqsp-4);
    display: grid;
    grid-template-columns: minmax(0, 1fr) repeat(4, auto);
    grid-template-rows: calc(var(--hc-header-height) - 2 * var(--spacing-sqsp-3)) minmax(0, 1fr) auto;
    align-items: center;
    gap: 0;
    max-block-size: 100dvh;
    padding-block-end: 0;
    padding-inline: var(--spacing-sqsp-6);
  }
  [data-rosetta] [data-navbar] .navbar-inner:has(> .navbar-toggle[aria-expanded=true]),
  [data-rosetta] [data-navbar] .navbar-inner:has(.locale-switcher-trigger[aria-expanded=true]) {
    block-size: 100dvh;
  }
  /* The sticky header only reaches the viewport's top once the banners and
     consent bar above it have scrolled away; at the top of a page with an
     announcement it sits below them, and a 100dvh menu from there would push
     its footer off the bottom of a page that can no longer scroll. Fixed to
     the viewport while a menu is open, it covers them instead. The page
     behind loses the header's height from its flow for as long, which is
     out of sight under the menu; shutting the menu puts both back. */
  .site-header:has([data-navbar] .navbar-toggle[aria-expanded=true]),
  .site-header:has([data-navbar] .locale-switcher-trigger[aria-expanded=true]) {
    position: fixed;
    inset-inline: 0;
  }
  /* Scroll lock: with a menu over the whole viewport, the page behind it
     stays put (src/navbarInert.js takes it out of the tab order and the
     accessibility tree to match). The selectors start at html rather than
     the file's [data-rosetta] [data-navbar] prefix because html is outside
     every [data-rosetta] root. */
  html:has([data-navbar] .navbar-toggle[aria-expanded=true]),
  html:has([data-navbar] .locale-switcher-trigger[aria-expanded=true]) {
    overflow: hidden;
  }
  /* The pinned footer's chrome (Figma 1934:61717 / 1934:61266): white, a
     #e7e7e7 hairline on top and the --shadow-md raise (the Figma's
     0 4px 16px / 0 0 1px pair is exactly --shadow-sqsp-200). Drawn as a
     decorative grid item behind row 3 rather than on [data-navbar-auth]
     itself, so it bleeds edge to edge like the menu rows while the row's
     content keeps the menu's inset. Shown only while the hamburger is open
     and the account row has something in it: the locale menu has no
     footer, and a brand with login off has nothing to put in one. */
  [data-rosetta] [data-navbar] .navbar-inner::after {
    content: "";
    display: none;
    grid-row: 3;
    grid-column: 1/-1;
    align-self: stretch;
    z-index: 0;
    margin-inline: calc(-1 * var(--navbar-inline-inset, var(--spacing-sqsp-6)));
    border-top: var(--border-width-sqsp-1) solid var(--navbar-border-color, var(--colors-border-default));
    background-color: var(--color-base-100);
    box-shadow: var(--shadow-md);
  }
  [data-rosetta] [data-navbar] .navbar-inner:has(> .navbar-toggle[aria-expanded=true]):has([data-navbar-auth]:not([hidden]))::after {
    display: block;
  }
  /* Over the chrome: grid items stack by z-index without needing position. */
  [data-rosetta] [data-navbar] [data-navbar-auth] {
    z-index: 1;
  }
  [data-rosetta] [data-navbar] .navbar-menu,
  [data-rosetta] [data-navbar] .navbar-actions {
    display: contents;
  }
  [data-rosetta] [data-navbar] .navbar-brand {
    grid-area: 1/1;
    justify-self: start;
  }
  /* display: desktop-50 hides the hamburger. */
  [data-rosetta] [data-navbar] .navbar-toggle {
    grid-area: 1/2;
    display: inline-flex;
    margin-inline-start: var(--navbar-bar-gap);
  }
  /* ── Locale menu ──
     The desktop locale popover, re-laid as a menu button like the hamburger:
     a 36px globe icon button that inverts while its menu is open, and the
     locale list as a full-width block under the bar instead of a flyout
     card. The popover wrapper dissolves (display: contents, which also beats
     navbar.css's mobile flip hiding every .navbar-dd-pop) so the trigger takes
     bar column 3 and the panel takes the hamburger menu's nav row. The two
     menus are never open together: opening the hamburger is an outside click
     that popover.js closes this on, and src/header.js closes the hamburger
     when this opens. popover.js still drives open/close, Escape and focus
     return; src/header.js turns its hover-open off at these widths, since a
     full-width menu that opens and shuts as the pointer crosses the globe
     would be unusable. */
  [data-rosetta] [data-navbar] .locale-switcher {
    display: contents;
  }
  [data-rosetta] [data-navbar] .locale-switcher-trigger {
    grid-area: 1/3;
    justify-content: center;
    width: var(--size-sqsp-200);
    height: var(--size-sqsp-200);
    margin-inline-start: var(--navbar-bar-gap);
    border-radius: var(--radius-sqsp-1);
  }
  [data-rosetta] [data-navbar] .locale-switcher-trigger .locale-switcher-chevron {
    display: none;
  }
  /* The hamburger's pressed treatment. Hover is pinned to the same pair, or
     navbar.css's hover colour shift would grey the glyph out on the fill. */
  [data-rosetta] [data-navbar] .locale-switcher-trigger[aria-expanded=true],
  [data-rosetta] [data-navbar] .locale-switcher-trigger[aria-expanded=true]:hover {
    background: var(--color-base-content, #0e0e0e);
    color: var(--color-base-100, #fff);
  }
  /* A menu block like the hamburger's (the hairline and --navbar-menu-inset
     come from the mobile-menu block): popover.css's card chrome and
     positioning come off, and it scrolls in the menu row like the nav does. */
  [data-rosetta] [data-navbar] .popover-panel.locale-switcher-panel {
    grid-row: 2;
    align-self: stretch;
    position: static;
    width: auto;
    max-width: none;
    max-block-size: none;
    margin-block: var(--spacing-sqsp-3) 0;
    padding: var(--spacing-sqsp-6) 0;
    border-inline: 0;
    border-bottom: 0;
    border-radius: 0;
    box-shadow: none;
    background-color: var(--color-base-100);
    color: var(--color-base-content);
    --popover-fg: var(--color-base-content);
    flex-direction: column;
  }
  /* Only display is gated on the open state (an unconditional display: flex
     would override `hidden`). flex-direction stays on the rule above: on
     close the fade (data-popover-animate) holds the panel at display: flex
     until the opacity transition ends, after `hidden` is already set, so a
     direction gated here too would drop to row and lay the locales out in
     a line for the length of the fade. */
  [data-rosetta] [data-navbar] .locale-switcher-panel:not([hidden]) {
    display: flex;
  }
  /* Rows 44px tall like the desktop list — 22px lines 22px apart (Figma
     1934:60859, the mobile locale menu). The panel's 33px block padding
     (above) plus a row's own 11px puts the first label 44px under the bar
     and leaves 44px under the last, the Figma's section padding. Every
     label sits past a 16px
     checkmark slot and an 11px gap, so the labels line up whichever row is
     checked, and the current locale's checkmark hangs in that slot at the
     menu's inset: navbar.css's desktop arrangement, re-measured from the
     menu's inset instead of the card's. */
  [data-rosetta] [data-navbar] .locale-switcher-option {
    padding-block: var(--spacing-sqsp-2);
    padding-inline: calc(var(--navbar-menu-inset) + var(--size-sqsp-125) + var(--spacing-sqsp-2)) var(--navbar-menu-inset);
  }
  [data-rosetta] [data-navbar] .locale-switcher-check {
    inset-inline-start: var(--navbar-menu-inset);
  }
  [data-rosetta] [data-navbar] .navbar-chat-toggle,
  [data-rosetta] [data-navbar] .navbar-toggle-chat,
  [data-rosetta] [data-navbar] .navbar-cta {
    grid-area: 1/4;
    margin-inline-start: var(--navbar-bar-gap);
  }
  [data-rosetta] [data-navbar] .navbar-toggle-admin {
    grid-area: 1/5;
    margin-inline-start: var(--navbar-bar-gap);
  }
  /* The menu rows bleed over the bar's inset so their hairlines run edge to
     edge, the same move the mobile-menu block makes; their content is inset
     by --navbar-menu-inset (above) instead. The nav's top margin is the
     bar's own bottom padding, so the first hairline lands on the bar's. */
  [data-rosetta] [data-navbar] .navbar-nav,
  [data-rosetta] [data-navbar] [data-navbar-auth],
  [data-rosetta] [data-navbar] .locale-switcher-panel {
    grid-column: 1/-1;
    margin-inline: calc(-1 * var(--navbar-inline-inset, var(--spacing-sqsp-6)));
  }
  /* flex-direction / justify-content: desktop-50 makes the nav a centred
     row. Centring a column that overflows would push its first section
     above the scroll origin, out of reach. */
  [data-rosetta] [data-navbar] .navbar-nav {
    grid-row: 2;
    flex-direction: column;
    justify-content: flex-start;
    align-self: stretch;
    margin-block-start: var(--spacing-sqsp-3);
    overflow-y: auto;
    overscroll-behavior: contain;
  }
  /* desktop-50: navbar.css shows the nav's dropdown flyouts and hides the
     accordions from 801px. */
  [data-rosetta] [data-navbar] .navbar-nav .navbar-dd-pop {
    display: none;
  }
  [data-rosetta] [data-navbar] .navbar-nav .navbar-dd-acc {
    display: block;
  }
  [data-rosetta] [data-navbar] [data-navbar-auth] {
    grid-row: 3;
  }
  [data-rosetta] [data-navbar] .navbar-toggle[aria-expanded=false] ~ .navbar-menu .navbar-nav,
  [data-rosetta] [data-navbar] .navbar-toggle[aria-expanded=false] ~ .navbar-menu [data-navbar-auth] {
    display: none;
  }
}
/* Tablet only: the menu text lines up with the wordmark's 33px inset, and the
   full "SQUARESPACE ■ Help Center" lockup fits, so the name navbar.css hides
   below the desktop breakpoint comes back (the same reset as navbar.css's
   desktop variants). */
@media (min-width: 744px) and (not ((any-pointer: fine) and (min-width: 1025px))) {
  [data-rosetta] [data-navbar] .navbar-mobile-section,
  [data-rosetta] [data-navbar] [data-navbar-auth],
  [data-rosetta] [data-navbar] .locale-switcher-panel {
    --navbar-menu-inset: var(--spacing-sqsp-6);
  }
  [data-rosetta] [data-navbar] .navbar-wordmark-name {
    position: static;
    width: auto;
    height: auto;
    margin: 0;
    overflow: visible;
    clip-path: none;
  }
}
/* Phone: an 11px inset and 11px between the bar's icon buttons. Without
   chat, the brand CTA doesn't fit beside the wordmark, and the menu has no
   place for it either (Figma 1934:61717 / 1934:61266: sections, then the
   account row, nothing else), so on a phone the header carries no CTA. The
   tablet bar still fits it in column 4. */
@media (max-width: 743px) {
  [data-rosetta] [data-navbar] .navbar-inner {
    --navbar-bar-gap: var(--spacing-sqsp-2);
    --navbar-inline-inset: var(--spacing-sqsp-2);
    padding-inline: var(--navbar-inline-inset);
  }
  [data-rosetta] [data-navbar] .navbar-cta {
    display: none;
  }
}
/* ── Announcement banner ─────────────────────────────────────────────────────
   Vertical breathing room for the site-wide notice above the navbar
   (templates/header.hbs, built by src/announcementBanner.js). The section also
   carries .container, which supplies the standard page gutters and max-width,
   so the banner lines up with page content instead of running to the viewport
   edge — .banner has a border on all four sides and no max-width of its own.

   Deliberately nothing else: no rule here reaches inside .banner, so the
   component keeps sole ownership of its own layout, variants, and responsive
   stacking and cannot drift out from under the theme. The section is empty and
   [hidden] until the module fills it, and this padding applies to neither. */
.announcement-banner {
  padding-block: 16px;
}

/* Same rationale as .announcement-banner above, for the verification banner
   (templates/header.hbs, built by src/verificationBanner.js). Kept as its own
   rule rather than merged into a shared selector: the two sections are
   independent, and this stays this way even if a future one drops the shared
   padding. */
.verification-banner {
  padding-block: 16px;
}

/* Footer — logo: image lockup vs. text wordmark.
   templates/footer.hbs ships both inside the home link; exactly one shows.
   Every brand defaults to its image logo (.footer-logo img, branding.logo).
   squarespace swaps it for the live-text .footer-wordmark ("■ SQUARESPACE",
   Figma Ldk8mN7DkefwTsA6evgxh1 node 1091:45154). The sandbox matches because
   data-brand is the Rosetta brand, which strips "-sandbox". A hidden <img> is
   still fetched, so squarespace downloads its logo.svg unused; it is the same
   file the header loads, so it is a cache hit there.

   `display: none` also takes the hidden lockup out of the link's accessible
   name, so the link is named by whichever lockup shows: the image's alt text,
   or the wordmark's own text. Same approach as the header's lockups
   (styles/_header.scss). */
[data-rosetta] [data-footer] .footer-wordmark {
  display: none;
}

[data-rosetta][data-brand=squarespace] [data-footer] .footer-wordmark {
  display: inline-flex;
}

[data-rosetta][data-brand=squarespace] [data-footer] .footer-logo img {
  display: none;
}

/* The Squarespace lockup's artwork sets the square off by ~0.37 of its own
   size (the cap height). 0.26em is that gap at the wordmark's ~0.71em cap
   height, up from the library's 0.18em. */
[data-rosetta][data-brand=squarespace] [data-footer] .footer-wordmark {
  gap: 0.26em;
}

/* Footer — TrustArc "Your privacy choices" control.
   src/footer.js appends the #teconsent placeholder to the footer's legal
   column, and the TrustArc consent notice (templates/document_head.hbs,
   c=teconsent) mounts an <a class="truste_cursor_pointer"> containing its
   privacy-choices icon + label into it. The icon is TrustArc's and is left
   alone; these rules only bring the injected link's text into line with the
   sibling .footer-link items. That link contract lives in the components layer
   (frontend/components/src/front-site/footer.css), so its type and colours are
   mirrored here rather than shared. */
[data-rosetta] .footer-consent a {
  color: oklch(from var(--color-neutral-content) l c h/70%);
  font-family: var(--font-body);
  font-size: var(--text-sqsp-2);
  font-weight: var(--font-weight-sqsp-book);
  line-height: var(--leading-sqsp-1);
  text-decoration: none;
  transition: color var(--duration-sqsp-150) var(--ease-sqsp-ease-out);
}

/* The components layer resets `[data-rosetta] img` to display:block, which would
   drop TrustArc's icon onto its own line. Restore inline flow so the icon sits
   beside the label as one control (its size stays TrustArc's). */
[data-rosetta] .footer-consent a img {
  display: inline-block;
  vertical-align: middle;
}

[data-rosetta] .footer-consent a:hover {
  color: var(--color-neutral-content);
}

[data-rosetta] .footer-consent a:focus-visible {
  outline: var(--border-width-sqsp-2) solid var(--color-neutral-content);
  outline-offset: var(--border-width-sqsp-2);
  border-radius: var(--radius-sqsp-1);
}

@media (prefers-reduced-motion: reduce) {
  [data-rosetta] .footer-consent a {
    transition-duration: 0s;
  }
}
/* ── Home page (HEX-4504, Figma node 546-32183) ──────────────────────────────
   Page-level layout glue around the hc-components compositions built by
   src/homePage.js. The hero band is the secondary brand surface, so it reads
   --color-secondary / --color-secondary-content directly. The section
   headings/subheadings and the support blades (icon tile + title) are brand
   emphasis instead, so they read --color-accent / --color-accent-content —
   the same pair the footer reads. Brand colour is declared once in
   frontend/components/src/brands/<brand>.css, not in the Zendesk theme; the
   one brand block here (Acuity, end of the hero panel section) only changes
   how much of the brand's own pair the hero mixes, never the colours. */
.home-page {
  background-color: var(--color-base-200);
  /* Contain the hero's top margin. Without a formatting context of its own
     the wrapper lets .home-hero's 33px margin collapse through it, so the
     gap sits above this element and shows the page behind it instead of
     this background. */
  display: flow-root;
}

/* The hero is a rounded panel inset 33px from the page on every side (Figma
   Dev Handoff 895:59069, "Hero Area": 1374px wide at 1440), on every brand.
   Unlike the sections below it, the panel isn't capped at the content
   column's max-width, so on a wide window it is wider than they are, as in
   the design. Its colours are the brand's secondary pair in whichever palette
   the hero is in: brandConfig.home.hero.theme: dark makes
   compile-brand-templates.mjs stamp data-theme="dark" on it at deploy
   (src/rosettaBrand.js in local preview), which gives Squarespace and Forma
   their near-black panel; without it the panel takes the page palette, which
   gives Acuity its teal one. */
.home-hero {
  margin: 33px;
  background: var(--color-secondary);
  color: var(--color-secondary-content);
  /* .text children color themselves from --color-base-content (primitives/text.css);
     repoint it so the hero copy renders on the panel, same pattern as the
     carousel items' own fg reassign. */
  --color-base-content: var(--color-secondary-content);
  /* Figma's 11px corner. --radius-box is 3px in this theme, so the panel
     takes the 11px step of the radius scale directly. */
  border-radius: var(--radius-sqsp-3);
  /* No inline padding: the hero's .container supplies the gutter. Figma:
     145px to the content stack, plus the stack's own 22px. */
  padding: 167px 0;
  /* Figma mobile: 100px to the content stack, plus the stack's 22px. */
}
@media (max-width: 900px) {
  .home-hero {
    padding: 122px 0;
  }
}
@media (max-width: 1340px) {
  html.chat-drawer-pushed .home-hero {
    padding: 122px 0;
  }
}
@media (max-width: 768px) {
  .home-hero {
    margin: 16px;
  }
}
@media (max-width: 1208px) {
  html.chat-drawer-pushed .home-hero {
    margin: 16px;
  }
}
.home-hero {
  /* Centre the content in the panel. The page's .container pins its leading
     edge to the header's (styles/_page.scss), measured against the whole page,
     which inside an inset panel puts the hero off centre. */
}
.home-hero > .container {
  margin-inline: auto;
  width: auto;
}
@media (max-width: 600px) {
  .home-hero > .container {
    padding-inline: 16px;
  }
}
@media (max-width: 1040px) {
  html.chat-drawer-pushed .home-hero > .container {
    padding-inline: 16px;
  }
}

/* Hero background (brandConfig.home.hero.background, built by src/homePage.js):
   a video or image filling the panel behind its copy. The panel itself stays
   unclipped — the search suggestions dropdown hangs out of it — so the media
   sits in its own frame that takes the panel's corners and clips to them, and
   the copy's .container is lifted above it. That container's stacking context
   sits where the search field's own did (z-index 1, see .home-hero .search),
   so the dropdown still paints over the sections below. The load sequence's
   reveal clips the whole panel, frame included.

   The scrim is the panel colour itself, so the copy keeps reading as
   --color-secondary-content on --color-secondary, whatever the footage does
   under it. --home-hero-background-scrim is how much of it covers the media. */
.home-hero--background {
  --home-hero-background-scrim: 50%;
  position: relative;
}
.home-hero--background > .container {
  position: relative;
  z-index: 1;
}

.home-hero-background {
  position: absolute;
  inset: 0;
  overflow: hidden;
  border-radius: inherit;
  pointer-events: none;
}
.home-hero-background::after {
  content: "";
  position: absolute;
  inset: 0;
  background: color-mix(in oklch, var(--color-secondary) var(--home-hero-background-scrim), transparent);
}

.home-hero-background-media {
  display: block;
  width: 100%;
  height: 100%;
  object-fit: cover;
}

/* Centred within the hero's .container — i.e. within the page's content column,
   not within the page. The distinction only shows once the chat drawer is open:
   the column keeps the header's leading edge and gives up width on the drawer's
   side (styles/_page.scss), so centring in it keeps this block on the same centre
   as the guides and support sections below, which are columns of the same kind.
   Centring in the page instead — which is what plain auto margins did while this
   block sat directly in the full-width band — put the hero on the middle of
   whatever the drawer left over, ~150px off the sections it sits above. */
.home-hero-inner {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 22px;
  max-width: 826px;
  margin-inline: auto;
  text-align: center;
}

/* Figma title: 50px / 1.08, -2px tracking. .text.display-lg still supplies the
   brand's --font-display face and book weight; only its 66px size is
   overridden, since no Text variant ships the hero's 50px. */
.home-hero-heading {
  /* Unitless, and a custom property so the flippy header's word window
     (.home-hero-flip) can size itself to exactly one line of the heading. */
  --home-hero-heading-leading: 1.08;
  margin: 0;
  font-size: 50px;
  line-height: var(--home-hero-heading-leading);
  letter-spacing: -0.04em;
  /* Figma mobile (1527:26872): 40px on a 44px line. */
}
@media (max-width: 768px) {
  .home-hero-heading {
    --home-hero-heading-leading: 1.1;
    font-size: 40px;
  }
}
@media (max-width: 1208px) {
  html.chat-drawer-pushed .home-hero-heading {
    --home-hero-heading-leading: 1.1;
    font-size: 40px;
  }
}

/* src/searchComposition.js reshapes the {{search}} helper's markup into the
   Search element's contract (frontend/components/src/elements/search.css), so
   the input-group/leading-glyph structure comes from the components library.
   The Figma hero field (node 1975-65439, "Search Field") is a single 62px
   frosted-glass pill with the search glyph leading and an arrow submit
   trailing inside it — src/homePage.js swaps the helper's labelled submit for
   that arrow button — so the submit is laid over the field's trailing edge
   rather than sitting beside it.

   The field is the panel's text colour at 14% under a 25px backdrop blur, so
   a hero background (video or image) shows through it frosted; its glyphs
   and typed text are the panel's text colour (Foreground/onStrong) and its
   placeholder that colour at 50%. Both are shares of --color-secondary-content
   over transparent, so the glass follows whatever panel the brand paints.

   The suggestions stay the panel's inverse (Figma 1578:58547: a white
   dropdown with #E7E7E7 hairlines, a #F2F2F2 highlight, near-black titles
   and #666 excerpts). Rosetta has no selector that puts a child of a dark
   element back in the light theme, so the colours are shares of the panel's
   text colour over its surface, sized to land on the light theme's own values
   for Squarespace (#FFFFFF over #0E0E0E): bg.default #F2F2F2 is 94.6%,
   fg.muted #666666 36.5% (--home-search-muted-share, which Acuity lowers, see
   the end of this section), border.default #E7E7E7 90%. Titles are the
   surface colour itself (#0E0E0E), and the dropdown is the text colour itself
   (#FFFFFF). The shadow is the light theme's Shadow 200 written out: the dark
   theme's token is a heavy black shadow with a light inner rim, made for dark
   surfaces. */
.home-hero .search {
  --home-search-inset: 24px;
  --home-search-glyph: 24px;
  --home-search-gap: 16px;
  /* Figma's 22px Submit frame sits 22px in from the trailing edge, its 24px
     arrow overhanging the frame by 2px a side. */
  --home-search-submit-inset: 22px;
  --home-search-surface: color-mix(
      in srgb,
      var(--color-secondary-content) 14%,
      transparent
  );
  --home-search-blur: 25px;
  --home-search-ink: var(--color-secondary-content);
  --home-search-faint: color-mix(
      in srgb,
      var(--color-secondary-content) 50%,
      transparent
  );
  --home-search-hover: color-mix(
      in srgb,
      var(--color-secondary-content) 70%,
      transparent
  );
  --home-search-focus: var(--color-secondary-content);
  --home-search-menu: var(--color-secondary-content);
  --home-search-menu-ink: var(--color-secondary);
  --home-search-muted: color-mix(
      in srgb,
      var(--color-secondary-content) var(--home-search-muted-share, 36.5%),
      var(--color-secondary)
  );
  --home-search-menu-hover: color-mix(
      in srgb,
      var(--color-secondary-content) 94.6%,
      var(--color-secondary)
  );
  --home-search-menu-rule: color-mix(
      in srgb,
      var(--color-secondary-content) 90%,
      var(--color-secondary)
  );
  --home-search-menu-shadow: 0 4px 16px 0 rgb(0 0 0 / 12%),
      0 0 1px 0 rgb(0 0 0 / 8%);
  position: relative;
  /* Above the Trending row, so the suggestions dropdown (z-index 60,
     styles/_search-suggestions.scss) paints over the chips. While the
     load sequence runs, each row is its own stacking context, and the
     later Trending row would otherwise paint over the dropdown. */
  z-index: 1;
  width: 100%;
  max-width: 600px;
  /* 33px Figma wrapper padding on top of the hero stack's 22px gap. */
  margin-block: 33px;
}
@media (max-width: 768px) {
  .home-hero .search {
    margin-block: 11px;
  }
}
@media (max-width: 1208px) {
  html.chat-drawer-pushed .home-hero .search {
    margin-block: 11px;
  }
}
.home-hero .search {
  /* Lifted over the field: the field's backdrop-filter makes it a stacking
     context painted in DOM order, and the glyph comes before it, so at
     z-index auto the glass would paint over the glyph and blur it away
     (once the intro's opacity animation ends and the blur takes effect). */
}
.home-hero .search .input-icon {
  z-index: 1;
  inset-inline-start: var(--home-search-inset);
  width: var(--home-search-glyph);
  height: var(--home-search-glyph);
  color: var(--home-search-ink);
  --icon-size: 100%;
}
.home-hero .search .input {
  min-height: 62px;
  /* Room for the glyph on each side: inset + glyph + gap. */
  padding-inline: calc(var(--home-search-inset) + var(--home-search-glyph) + var(--home-search-gap));
  border-color: transparent;
  border-radius: var(--radius-sqsp-pill);
  background-color: var(--home-search-surface);
  -webkit-backdrop-filter: blur(var(--home-search-blur));
  backdrop-filter: blur(var(--home-search-blur));
  color: var(--home-search-ink);
  /* Typed text, Figma 1447:26724: 14px on a 22px line. The placeholder
     (and the flip's hint over it) stays at the field's 15px. */
  font-size: 14px;
  line-height: 22px;
  letter-spacing: -0.14px;
}
.home-hero .search .input::placeholder {
  color: var(--home-search-faint);
  font-size: 15px;
  letter-spacing: -0.1px;
}
.home-hero .search .input {
  /* Figma 1447:26155 / 1447:26724: a 3px edge inside the focused field,
     in the glyphs' colour so it reads on the glass, however it got
     focus (a text field takes the caret on a click too). An inset
     outline rather than a border, so focusing doesn't move the text or
     the glyphs. */
}
.home-hero .search .input:focus {
  outline: 3px solid var(--home-search-focus);
  outline-offset: -3px;
}
.home-hero .search .input {
  /* WebKit renders its own cancel affordance inside search inputs; the
     hero search has no clear control (below). */
}
.home-hero .search .input::-webkit-search-cancel-button {
  display: none;
  -webkit-appearance: none;
  appearance: none;
}
.home-hero .search {
  /* The arrow submit src/homePage.js puts in place of the helper's input. */
}
.home-hero .search .btn.home-hero-submit {
  position: absolute;
  top: 50%;
  inset-inline-end: var(--home-search-submit-inset);
  display: flex;
  align-items: center;
  justify-content: center;
  width: var(--home-search-glyph);
  min-height: 0;
  height: var(--home-search-glyph);
  padding: 0;
  border: none;
  border-radius: var(--radius-sqsp-1);
  background: transparent;
  color: var(--home-search-ink);
  transform: translateY(-50%);
  --icon-size: 100%;
}
.home-hero .search .btn.home-hero-submit:hover {
  background: transparent;
  color: var(--home-search-hover);
}
.home-hero .search .btn.home-hero-submit:focus-visible {
  outline: 2px solid var(--home-search-ink);
  outline-offset: 2px;
}
.home-hero .search {
  /* No clear control in the hero (Figma 1329:40541, "No clear button").
     src/search.js still appends one to every search form. */
}
.home-hero .search .clear-button {
  display: none;
}
.home-hero .search {
  /* Suggestions (src/searchSuggestions.js; base look in
     styles/_search-suggestions.scss), Figma 1447:26627: the field's width,
     11px below it, a 6px corner. Light on either hero, through the same
     --home-search-* properties as the field. The 60px rows (11px padding,
     22px title, 16px excerpt) and the hairlines come from the base rules. */
}
.home-hero .search .search-suggestions {
  --color-base-content: var(--home-search-menu-ink);
  --color-base-content-muted: var(--home-search-muted);
  top: calc(100% + 11px);
  border-radius: var(--radius-sqsp-2);
  background: var(--home-search-menu);
  box-shadow: var(--home-search-menu-shadow);
}
.home-hero .search {
  /* Highlight (hover, or the row the arrow keys picked), Figma 1447:26699:
     a full-width bg.default (#F2F2F2) fill, square like the row itself. */
}
.home-hero .search .search-suggestions-option {
  border-bottom-color: var(--home-search-menu-rule);
  border-radius: 0;
  /* Figma draws each row 60px with its hairline inside: take the 1px
     back from the bottom padding, so five rows make the 312px list. */
  padding-bottom: calc(var(--spacing-sqsp-2) - 1px);
}
.home-hero .search .search-suggestions-option:last-child {
  padding-bottom: var(--spacing-sqsp-2);
}
.home-hero .search .search-suggestions-option:hover, .home-hero .search .search-suggestions-option[aria-selected=true] {
  background: var(--home-search-menu-hover);
}

/* "Trending" row (Figma node 1091-45049): a lead-in label, then up to four
   link chips built by src/homePage.js. The chips are the components library's
   Chip element, repointed through Chip's own --chip-* hooks to a tint of the
   panel's text colour over its surface, labelled in that text colour (the
   prototype's "white at 20% over the panel"). 23% is the share that lands on
   Figma's #454545 for Squarespace (#FFFFFF over #0E0E0E); Acuity changes it
   (--home-hero-chip-share, end of the hero panel section).
   <a class="chip"> picks up Chip's base styles only (its hover/focus states are
   scoped to button.chip), so the link states are added alongside. */
/* The label and the chips flow as ONE wrapping line, each line centred, so on a
   narrow screen the label sits beside the first chip and the chips wrap after
   it (Figma mobile 1527:26883). With flex, the label and the <ul> are two
   items and the whole list drops below the label; flattening the <ul> with
   display: contents would fix that but loses its list role in some browsers
   (Safari/VoiceOver). So the row is an inline formatting context instead: the
   label and every chip are inline-blocks on the same lines. font-size: 0 drops
   the whitespace between them (the label and chips set their own sizes); the
   11px gaps are a 5.5px margin on every item, cancelled at the row's edges. */
.home-hero-trending {
  --home-hero-trending-gap: 11px;
  margin: calc(var(--home-hero-trending-gap) / -2);
  font-size: 0;
  text-align: center;
}
.home-hero-trending[hidden] {
  display: none;
}

.home-hero-trending-label {
  display: inline-block;
  margin: calc(var(--home-hero-trending-gap) / 2);
  /* 11px Figma trailing padding on top of the row's 11px gap. */
  padding-inline-end: 11px;
  vertical-align: middle;
  /* display above outranks the hidden attribute's UA rule; a brand with no
     label must still render none. */
}
.home-hero-trending-label[hidden] {
  display: none;
}

.home-hero-trending-list {
  display: inline;
  margin: 0;
  padding: 0;
  list-style: none;
}
.home-hero-trending-list > li {
  display: inline-block;
  margin: calc(var(--home-hero-trending-gap) / 2);
  vertical-align: middle;
}
.home-hero-trending-list .chip {
  vertical-align: top;
  --chip-bg: color-mix(
      in srgb,
      var(--color-secondary-content) var(--home-hero-chip-share, 23%),
      var(--color-secondary)
  );
  --chip-fg: var(--home-hero-chip-fg, var(--color-secondary-content));
  text-decoration: none;
}
.home-hero-trending-list .chip:hover {
  background-color: color-mix(in srgb, var(--color-secondary-content) var(--home-hero-chip-hover-share, 33%), var(--color-secondary));
  text-decoration: none;
}
.home-hero-trending-list .chip:focus-visible {
  outline: var(--border-width-sqsp-2) solid var(--colors-border-strong);
  outline-offset: var(--size-sqsp-50);
}

/* Acuity's panel is its light-theme teal (#3D6168 under #FCF1F9 text), which
   is only 6.1:1 even at full strength, so the Squarespace shares above leave
   the suggestion excerpts at 2.8:1 and the chip labels at 3.7:1. Lower shares
   bring the excerpts to 4.9:1; the chips flip to the panel's text colour with
   the page's text colour on the panel's text colour (the Figma's fg/default
   label, 17:1), since a 10% tint would barely show against the panel. The
   hero repoints --color-base-content to the panel's text colour, so the label
   reads the alias the contract derives it from, which the hero leaves alone. */
[data-rosetta][data-brand=scheduling] .home-hero {
  --home-search-muted-share: 10%;
  --home-hero-chip-share: 100%;
  --home-hero-chip-hover-share: 85%;
  --home-hero-chip-fg: var(--colors-fg-default);
  /* The field stays opaque rather than glass: the page's white surface
     with its glyphs and typed text in the page's text colour (fg/default),
     a fg.disabled placeholder, a fg.muted hovered arrow and the panel's
     teal focus edge. The shared glass mixes are the panel's pink-tinted
     off-white over transparent, which would vanish on white. Set on
     .search, where the shared rule declares the properties. */
}
[data-rosetta][data-brand=scheduling] .home-hero .search {
  --home-search-surface: var(--colors-bg-base);
  --home-search-ink: var(--colors-fg-default);
  --home-search-faint: var(--colors-fg-disabled);
  --home-search-hover: var(--colors-fg-muted);
  --home-search-focus: var(--color-secondary);
}
[data-rosetta][data-brand=scheduling] .home-hero {
  /* The Trending chips are Rosetta's literal default Chip (gray.800 fill,
     fg.default label) in place of the panel's tinted text colour, stepping
     down the gray scale on hover like the Popular section's View All. */
}
[data-rosetta][data-brand=scheduling] .home-hero .home-hero-trending-list .chip {
  --chip-bg: var(--color-sqsp-gray-800);
}
[data-rosetta][data-brand=scheduling] .home-hero .home-hero-trending-list .chip:hover {
  background-color: var(--color-sqsp-gray-700);
}

/* Squarespace (and its sandbox, both stamp data-brand="squarespace") draws the
   hero field's focus edge as a 1px ring in the panel's surface colour hugging
   the field, with a ring in the panel's text colour outside it, so the edge
   reads on the dark panel. A box-shadow rather than an outline, so focusing
   doesn't move the text or the glyphs. */
[data-rosetta][data-brand=squarespace] .home-hero .search .input:focus {
  outline: none;
  box-shadow: 0 0 0 1px var(--color-secondary), 0 0 0 3px var(--color-secondary-content);
}

/* ── Flippy header (brandConfig.home.hero.flip, src/homeHeroFlip.js) ───────────
   "I need help with <topic>": the topic sits in a one-line window whose list of
   words slides up a line per step (--i, set by the script). The window is as
   wide as the current word (--w, measured by the script) so the whole line stays
   centred, and its height never changes, so nothing below the hero moves when
   it flips. Motion values come from the designer's prototype. */
.home-hero-heading--flip {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  align-items: flex-start;
  column-gap: 11px;
  /* When the prefix stacks over the topic (mobile, or a narrow column):
     Figma mobile puts the topic line 11px below the prefix line. */
  row-gap: 11px;
  white-space: nowrap;
  /* Figma mobile (1527:26872): the prefix takes its own line. So does any
     width where the longest topic can't share a line with it
     (.home-hero-heading--stacked, decided by src/homeHeroFlip.js), so the
     heading's height never changes between topics. */
}
.home-hero-heading--flip.home-hero-heading--stacked .home-hero-flip-prefix {
  flex-basis: 100%;
}
@media (max-width: 768px) {
  .home-hero-heading--flip .home-hero-flip-prefix {
    flex-basis: 100%;
  }
}
@media (max-width: 1208px) {
  html.chat-drawer-pushed .home-hero-heading--flip .home-hero-flip-prefix {
    flex-basis: 100%;
  }
}

.home-hero-flip {
  /* Exactly one line of the heading (.home-hero-heading's leading: 54px at
     the desktop 50px size, 44px at the mobile 40px), so the window follows
     the heading at every size. */
  --lh: calc(var(--home-hero-heading-leading) * 1em);
  --home-hero-flip-ease: cubic-bezier(0.645, 0.045, 0.355, 1);
  display: block;
  /* 8px of room for descenders; the negative margin gives it back so the
     heading's height is unchanged. The 11px gap between words keeps the next
     word out of that extra room. */
  height: calc(var(--lh) + 8px);
  margin-bottom: -8px;
  width: var(--w, auto);
  overflow: hidden;
  transition: width 0.6s var(--home-hero-flip-ease);
}

.home-hero-flip-list {
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  gap: 11px;
  transform: translateY(calc(var(--i, 0) * -1 * (var(--lh) + 11px)));
  transition: transform 0.6s var(--home-hero-flip-ease);
}

.home-hero-flip-word {
  display: block;
  width: max-content;
  height: var(--lh);
  line-height: var(--lh);
}

/* Completes the heading's accessible name ("I need help with help topics")
   while the visible word is aria-hidden. Same visually-hidden recipe as
   .chat-drawer-loading-label. */
.home-hero-flip-label {
  position: absolute;
  inline-size: 1px;
  block-size: 1px;
  margin: -1px;
  padding: 0;
  overflow: hidden;
  clip-path: inset(50%);
  white-space: nowrap;
  border: 0;
}

/* "Search <topic>" over the empty field, where the placeholder would sit (the
   script blanks the placeholder to " " so :placeholder-shown still tracks an
   empty field). Clicking in clears it; it fades back if the field is left
   empty. */
.home-hero .search .home-hero-search-hint {
  position: absolute;
  top: 50%;
  inset-inline-start: calc(var(--home-search-inset) + var(--home-search-glyph) + var(--home-search-gap));
  max-width: calc(100% - 2 * (var(--home-search-inset) + var(--home-search-glyph) + var(--home-search-gap)));
  overflow: hidden;
  white-space: nowrap;
  pointer-events: none;
  /* Same type and colour as the field's ::placeholder above. */
  color: var(--home-search-faint);
  font-size: 15px;
  line-height: 1.4;
  letter-spacing: -0.1px;
  transform: translateY(-50%);
  transition: opacity 0.2s ease;
}

.home-hero .search:focus-within .home-hero-search-hint,
.home-hero .search input:not(:placeholder-shown) + .home-hero-search-hint {
  opacity: 0;
}

.home-hero-search-hint-ch {
  display: inline-block;
}

/* The hero render gate (html[data-hc-hero-pending], styles/_page.scss) holds
   back only the hero's contents. On the home page it also holds back the
   panel itself and the first section below it (Popular on the topics layout,
   Guides By Topic on the cards layout): the load sequence opens the panel from
   a thin line and raises that section, so showing it during the gate would
   make the sequence snap it away and replay it. visibility, not display, so
   the pill list and card carousels still measure their real layout while
   held. The gate stays the only hold (it clears once script.js has run, see
   document_head.hbs). */
html[data-hc-hero-pending] .home-hero,
html[data-hc-hero-pending] .home-hero ~ .home-popular .home-section-heading,
html[data-hc-hero-pending] .home-hero ~ .home-popular .home-popular-card,
html[data-hc-hero-pending] .home-hero ~ .home-guides .home-section-heading,
html[data-hc-hero-pending] .home-hero ~ .home-guides .home-section-subheading,
html[data-hc-hero-pending] .home-hero ~ .home-guides .home-guides-pills,
html[data-hc-hero-pending] .home-hero ~ .home-guides .home-guides-panels {
  visibility: hidden;
}

/* ── Load sequence ─────────────────────────────────────────────────────────────
   Keyed on .home-page--intro, which src/homeHeroFlip.js adds only once the hero
   render gate has cleared, so nothing animates while the hero is hidden. The
   panel itself does not animate: the hero's rows rise in one after another,
   then the section below follows: the Popular heading and cards, or
   the guides heading, pills and carousels. The rise is a translate and an
   opacity, neither of which changes a box's size, so the pill indicator and
   the carousels measure the same widths mid-animation as after it.

   The rows fill `backwards`, not `both`: the "from" state holds through each
   delay, and nothing is left applied once the animation ends. A finished
   animation that kept its final transform would leave each row its own
   stacking context (trapping the search suggestions under the Trending row). */
@media (prefers-reduced-motion: no-preference) {
  .home-page--intro {
    --home-intro-ease: cubic-bezier(0.165, 0.84, 0.44, 1);
  }
  .home-page--intro .home-hero-heading,
  .home-page--intro .home-hero-search,
  .home-page--intro .home-hero-trending,
  .home-page--intro .home-popular .home-section-heading,
  .home-page--intro .home-popular-card,
  .home-page--intro .home-guides .home-section-heading,
  .home-page--intro .home-guides .home-section-subheading,
  .home-page--intro .home-guides-pills,
  .home-page--intro .home-guides-panels {
    animation: home-hero-rise 0.9s var(--home-intro-ease) backwards;
  }
  .home-page--intro .home-hero-heading {
    animation-delay: 0.55s;
  }
  .home-page--intro .home-hero-search {
    animation-delay: 0.7s;
  }
  .home-page--intro .home-hero-trending {
    animation-delay: 0.85s;
  }
  .home-page--intro .home-popular .home-section-heading {
    animation-delay: 1.1s;
  }
  .home-page--intro {
    /* POPULAR_COUNT (src/homePage.js) keeps two cards. */
  }
  .home-page--intro .home-popular-card:nth-child(1) {
    animation-delay: 1.25s;
  }
  .home-page--intro .home-popular-card:nth-child(2) {
    animation-delay: 1.4s;
  }
  .home-page--intro {
    /* Guides By Topic, on the same beats: heading and subheading, then
       the pills, then the carousels. */
  }
  .home-page--intro .home-guides .home-section-heading,
  .home-page--intro .home-guides .home-section-subheading {
    animation-delay: 1.1s;
  }
  .home-page--intro .home-guides-pills {
    animation-delay: 1.25s;
  }
  .home-page--intro .home-guides-panels {
    animation-delay: 1.4s;
  }
  .home-page--intro {
    /* The hint's letters rise in after the field lands. */
  }
  .home-page--intro .home-hero-search-hint-ch {
    animation: home-hero-hint-in 0.6s var(--home-intro-ease) both;
    animation-delay: calc(1.2s + var(--n, 0) * 28ms);
  }
  /* On each flip only the new word's letters rise in. */
  .home-hero-search-hint-word.is-swap .home-hero-search-hint-ch {
    animation: home-hero-hint-in 0.5s cubic-bezier(0.165, 0.84, 0.44, 1) both;
    animation-delay: calc(0.12s + var(--n, 0) * 22ms);
  }
  /* The categories request landed after the hero was revealed: the flip
     replaces the static heading in view, so it rises in like the intro. */
  .home-hero-flip--late .home-hero-flip-prefix,
  .home-hero-flip--late .home-hero-flip {
    animation: home-hero-rise 0.9s cubic-bezier(0.165, 0.84, 0.44, 1) backwards;
  }
}
@media (prefers-reduced-motion: reduce) {
  .home-hero-flip,
  .home-hero-flip-list,
  .home-hero .search .home-hero-search-hint {
    transition: none;
  }
}
@keyframes home-hero-rise {
  from {
    opacity: 0;
    transform: translateY(18px);
  }
  to {
    opacity: 1;
    transform: none;
  }
}
@keyframes home-hero-hint-in {
  from {
    opacity: 0;
    transform: translateY(0.6em);
  }
  to {
    opacity: 1;
    transform: none;
  }
}
.section.home-guides {
  padding: 38px 0 22px;
}

/* Callout (frontend/components/src/front-site/callout.css, filled by
   src/homePage.js from brandConfig.home.callout). The panel's 44px of air
   above and below comes from its neighbours: the Popular section's bottom
   padding and the Topics section's top padding. Under the guides (whose
   bottom padding is only 22px) it adds the rest. */
[data-rosetta] .section.home-callout {
  padding: 0;
}
[data-rosetta] .section.home-guides + .section.home-callout {
  padding-top: 22px;
}
[data-rosetta] {
  /* The component stacks below 900px of viewport; the page also stacks it
     when the chat drawer pushes the content that narrow. */
}
@media (max-width: 900px) {
  [data-rosetta] .home-callout .callout {
    flex-direction: column;
  }
}
@media (max-width: 1340px) {
  html.chat-drawer-pushed [data-rosetta] .home-callout .callout {
    flex-direction: column;
  }
}
@media (max-width: 900px) {
  [data-rosetta] .home-callout .callout-image {
    order: -1;
    width: 100%;
    height: auto;
    aspect-ratio: 422/289;
  }
}
@media (max-width: 1340px) {
  html.chat-drawer-pushed [data-rosetta] .home-callout .callout-image {
    order: -1;
    width: 100%;
    height: auto;
    aspect-ratio: 422/289;
  }
}

/* "Featured articles" band (Figma 1052-23435 drawer closed / 1052-23575 open).
   The metrics are the mock's: 22px outside the rules, 55px inside them, two
   equal columns 44px apart, 16px between link rows. Both mock frames share
   them — only the overall width differs — so the band is simply fluid: the
   .container inside the chat-drawer host already gives up the drawer's width. */
.section.home-featured {
  padding: 22px 0;
}

.home-featured-band {
  display: flex;
  gap: 44px;
  padding: 55px 0;
  /* --color-base-400 is the brand contract's hairline/border token (the
     mock's light grey in the default theme), so each brand's theme and
     dark mode restyle the rules without touching this file. */
  border-top: 1px solid var(--color-base-400);
  border-bottom: 1px solid var(--color-base-400);
  /* The drawer-open mock (1052-23575, a 1040px page) keeps both columns, so
     the stack point sits below it — phones stack, a drawer-narrowed desktop
     page doesn't. */
}
@media (max-width: 768px) {
  .home-featured-band {
    flex-direction: column;
    gap: 22px;
  }
}
@media (max-width: 1208px) {
  html.chat-drawer-pushed .home-featured-band {
    flex-direction: column;
    gap: 22px;
  }
}

.home-featured-title {
  flex: 1 1 0;
  min-width: 0;
  margin: 0;
}

.home-featured-list {
  flex: 1 1 0;
  min-width: 0;
  display: flex;
  flex-direction: column;
  gap: 16px;
  margin: 0;
  padding: 0;
  list-style: none;
}

.home-featured-link {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  color: inherit;
  text-decoration: none;
}
.home-featured-link:hover {
  text-decoration: underline;
}

/* "Learn by video" (Figma 1052-23408 drawer closed / 1052-23548 open). The
   metrics are the mock's: 66px above and below the section, a header block of
   22px around its 36px title/button row, 22px from that block to the first
   row, four equal columns 44px apart, and 11px between a card's thumbnail and
   its title. Horizontally the section sits in the page's .container like the
   featured band below it (the mock's own 66px side padding would pull it out
   of line with the guides and support sections). Both mock frames share the
   metrics — only the overall width differs — so the grid is simply fluid: the
   .container inside the chat-drawer host already gives up the drawer's width,
   and the four cards shrink with it (294px → 194px in the mock). */
.section.home-videos {
  padding: 66px 0;
}

.home-videos-inner {
  display: flex;
  flex-direction: column;
  gap: 22px;
}

.home-videos-header,
.home-videos-row-header {
  display: flex;
  align-items: center;
  gap: 8px;
  min-height: 36px;
}

.home-videos-header {
  padding: 22px 0;
}

.home-videos-title,
.home-videos-row-title {
  flex: 1 1 0;
  min-width: 0;
  margin: 0;
}

/* The mock's Button is the neutral filled one: bg/default fill, page text.
   Button's own default variant is the brand's strong pair, so repoint its
   palette hooks at the surface tokens instead of restyling the box. */
.home-videos-view-all {
  --btn-bg: var(--color-base-300);
  --btn-border-color: var(--color-base-300);
  --btn-fg: var(--color-base-content);
  --btn-bg-hover: var(--color-base-400);
  --btn-border-hover: var(--color-base-400);
  --btn-fg-hover: var(--color-base-content);
  flex-shrink: 0;
  gap: 8px;
  margin-inline-start: auto;
}

/* Row gap is not in the mock (it shows one playlist); 44px is the grid's own
   column gap, so stacked playlists read as one rhythm. */
.home-videos-rows {
  display: flex;
  flex-direction: column;
  gap: 44px;
}

.home-videos-row {
  position: relative;
  display: flex;
  flex-direction: column;
  gap: 22px;
}

.home-videos-grid {
  display: grid;
  grid-template-columns: repeat(4, minmax(0, 1fr));
  gap: 44px;
  margin: 0;
  padding: 0;
  list-style: none;
  /* The mock designs no narrower layout: the drawer-open frame (1040px page)
     still holds four columns, so the first step-down sits below it. */
}
@media (max-width: 900px) {
  .home-videos-grid {
    grid-template-columns: repeat(2, minmax(0, 1fr));
  }
}
@media (max-width: 1340px) {
  html.chat-drawer-pushed .home-videos-grid {
    grid-template-columns: repeat(2, minmax(0, 1fr));
  }
}
@media (max-width: 480px) {
  .home-videos-grid {
    grid-template-columns: minmax(0, 1fr);
  }
}
@media (max-width: 920px) {
  html.chat-drawer-pushed .home-videos-grid {
    grid-template-columns: minmax(0, 1fr);
  }
}

.home-videos-card {
  display: flex;
  flex-direction: column;
  gap: 11px;
  color: inherit;
  text-decoration: none;
}

/* The hidden player that counts a playlist's videos (src/homePage.js
   fetchPlaylistIds): kept in the layout but invisible and inert, since the
   player needs a mounted element; removed once the ids are read. */
.home-videos-probe {
  position: absolute;
  width: 1px;
  height: 1px;
  overflow: hidden;
  opacity: 0;
  pointer-events: none;
}

.home-videos-thumb {
  position: relative;
  display: block;
  aspect-ratio: 16/9;
  overflow: hidden;
  border: 1px solid var(--color-base-400);
  border-radius: 11px;
  background-color: var(--color-base-300);
}
.home-videos-thumb img {
  display: block;
  width: 100%;
  height: 100%;
  object-fit: cover;
}

/* The play affordance: a 44px disc inset 22px from the thumbnail's
   bottom-left corner, the page surface under the page text colour so it
   stays legible over any still. Decorative — the whole card is the link. */
.home-videos-play {
  --icon-size: 16px;
  position: absolute;
  left: 22px;
  bottom: 22px;
  display: flex;
  align-items: center;
  justify-content: center;
  width: 44px;
  height: 44px;
  border-radius: 50%;
  background-color: var(--color-base-100);
  color: var(--color-base-content);
}

/* No underline, resting or hover: the mock's titles are plain text and the
   play disc already marks the card as the link. */
.home-videos-card-title,
.home-videos-card:hover .home-videos-card-title {
  display: -webkit-box;
  -webkit-box-orient: vertical;
  -webkit-line-clamp: 2;
  overflow: hidden;
  margin: 0;
  text-decoration: none;
}

/* The mock's "# videos" eyebrow under the title, in the muted text colour. */
.home-videos-card-count,
.home-videos-card:hover .home-videos-card-count {
  margin: 0;
  color: var(--color-base-content-muted);
  text-decoration: none;
}

/* Full-bleed clip: the carousel's .swiper is overflow:visible (below) so slides
   spill past the .container gutter; clip that bleed at the viewport edge here so
   no horizontal page scrollbar appears. overflow-x:clip (not hidden) keeps the
   pill-list's own horizontal scroller and vertical overflow working. */
.section.home-guides {
  overflow-x: clip;
}

.home-section-heading {
  margin: 0;
  color: var(--color-accent);
}

.home-section-subheading {
  margin: 6px 0 0;
  color: var(--color-accent);
  font-weight: 500;
}

.home-guides-pills {
  display: flex;
  align-items: center;
  margin-block: 22px;
  /* Let the pill-list shrink below its content width so it scrolls (arrows +
     edge fades) instead of widening the row; "View All" keeps its footprint. */
}
.home-guides-pills [data-pill-list] {
  min-width: 0;
}

/* "View All" is a link, not a topic tab — it shares the pill footprint but
   sits at the row's trailing edge, a sibling of the pill-list outside the
   tablist semantics. */
.home-guides-view-all {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  flex-shrink: 0;
  margin-inline-start: auto;
  padding-inline: var(--spacing-sqsp-3);
  color: inherit;
  font-size: var(--text-sqsp-4);
  text-decoration: none;
}
.home-guides-view-all:hover {
  text-decoration: underline;
}

/* One carousel per topic, stacked in a single grid cell; the pill selection
   toggles which one is visible. visibility (not display) so hidden carousels
   keep real layout metrics — the React card-carousel module (Swiper) measures
   its .swiper width on mount and would read zero inside display:none (see
   CardCarousel's deferred swiper.update() on the panel becoming active). */
.home-guides-panels {
  display: grid;
}

.home-guides-panel {
  grid-area: 1/1;
  /* grid items default to min-width:auto, which would let the carousel track's
     max-content width widen the page instead of staying within the grid cell */
  min-width: 0;
  visibility: hidden;
}

.home-guides-panel.is-active {
  visibility: visible;
}

.section-title-card {
  font-family: var(--font-sqsp-ui);
}

/* ── Swiper track (React card-carousel module) ───────────────────────────────
   The theme's module rollup config has no CSS-import plugin, so `swiper/css`
   can't be imported inside the module. The few base rules Swiper's layout needs
   are hand-authored here, scoped to the guides section, alongside the
   container-aligned full-bleed override. The reused card-carousel.css chrome
   (.card-carousel-item surface/hover, dots, arrows, tag) still applies; only the
   *track* changes — Swiper's .swiper-wrapper/.swiper-slide replace the CSS
   scroll-snap .card-carousel-track when the cards overflow. A category whose
   cards already fit renders no Swiper at all: the module falls back to
   card-carousel.css's own track in fill mode (.card-carousel-track[data-fill]),
   where the cards flex to consume the row and these .swiper-* rules — including
   `.swiper-slide { flex-shrink: 0 }`, which would fight that — simply never
   match. The same track is still the no-JS fallback. */
.home-guides {
  /* Container-aligned, clipped to the content column: <Swiper> sits inside
     .container (.home-guides-inner), so its leading edge already lines up
     with the pill list and heading, and clipping the paged track at its own
     (container-width) edge keeps a trailing card peeking past the last full
     one — the "there's more, page it" affordance — without letting whole
     slides escape into the page margin.

     This replaces an earlier `overflow: visible` full-bleed that was only
     "clipped to the viewport". That reads as a peek when the viewport is
     about as wide as the content column, but on wide monitors (container ≪
     viewport) the trailing slide of a paged category — e.g. the 4th card of
     a 4-section category, which pages rather than fills since 4 > the widest
     slidesPerView of 3.2 — floated out whole in the empty margin, detached
     from the column and misaligned with everything else on the page.

     `overflow-x: clip` (not `hidden`/`auto`) so `overflow-y` can stay
     `visible`: the cards' hover lift/shadow (see the .card-carousel-item
     hover rule below) extends vertically and must not be clipped — an
     `auto`/`hidden` pair would compute the other axis to `auto` and clip it.
     Only the paged Swiper overflows; the 1–3 card fill track already flexes
     to fit the column exactly (card-carousel.css `[data-fill]`). */
}
.home-guides .swiper {
  position: relative;
  overflow-x: clip;
  overflow-y: visible;
}
.home-guides .swiper-wrapper {
  display: flex;
  box-sizing: content-box;
  transition-property: transform;
}
.home-guides .swiper-slide {
  flex-shrink: 0;
}

/* Guide cards behave like the feature card (frontend/components card.css
   a.card.filled): the whole card is clickable via its .card-action anchor
   stretched over it (.card-carousel-item is position:relative), and on hover
   the card lifts and the trailing arrow chip fills in. This mirrors card.css's
   own interactive recipe (same --card-lift / --card-shadow-hover tokens and the
   currentColor arrow-fill) rather than adding `.card`/`a.card` to the slide —
   those would reassign --color-base-content to the light-surface pair and break the dark
   palette-gradient text the carousel card relies on. Scoped under [data-rosetta]
   so the transition override beats card-carousel.css's box-shadow-only one. */
[data-rosetta] .home-guides .card-carousel-item {
  transition: transform var(--duration-sqsp-150) var(--ease-sqsp-ease-out), box-shadow var(--duration-sqsp-150) var(--ease-sqsp-ease-out);
}
[data-rosetta] .home-guides .card-carousel-item a.card-action::before {
  content: "";
  position: absolute;
  inset: 0;
}
[data-rosetta] .home-guides .card-carousel-item:hover {
  transform: translate3d(0, var(--card-lift), 0);
}
[data-rosetta] .home-guides .card-carousel-item:hover .card-action {
  /* The trailing arrow inverts to a solid chip on card hover (card.css
     a.card:hover .card-action). */
  border-color: currentColor;
  background-color: color-mix(in oklch, currentColor 12%, transparent);
}

/* ── Popular + Topics (home.variant "topics") ─────────────────────────────────
   Squarespace Help Center Figma nodes 1091-45057 / 1091-45087. The cards are the
   components library's card.links / card.tile variants; this file only lays
   them out. Each section is 44px of block padding around a heading that carries
   the Figma header's own 22px padding top and bottom plus the 22px gap down to
   its cards — at every width: the mobile frames (1091-41422 / 1091-41452) keep
   the desktop spacing. */
.section.home-popular,
.section.home-topics {
  padding: 44px 0;
}
.section.home-popular .home-section-heading,
.section.home-topics .home-section-heading {
  margin: 22px 0 44px;
}

/* Two cards side by side, stacked once the content column can't hold both. */
.home-popular-grid {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: 22px;
}
@media (max-width: 768px) {
  .home-popular-grid {
    grid-template-columns: minmax(0, 1fr);
  }
}
@media (max-width: 1208px) {
  html.chat-drawer-pushed .home-popular-grid {
    grid-template-columns: minmax(0, 1fr);
  }
}

/* The View All button (Figma node 1091-45074) is Rosetta's literal default
   Button — gray.800 fill, fg.default label — which the components library's
   default variant maps onto the brand's --color-primary instead (near-black
   under squarespace). Repointed here through Button's own --btn-* hooks; the
   gray scale flips with the dark theme, so the pair stays legible there too. */
.home-popular-view-all {
  --btn-bg: var(--color-sqsp-gray-800);
  --btn-border-color: var(--color-sqsp-gray-800);
  --btn-fg: var(--colors-fg-default);
  --btn-bg-hover: var(--color-sqsp-gray-700);
}

/* Three tiles a row (Figma), two once a third would squeeze the titles — down to
   phones, which keep two (Figma node 1091-41452). Every tile in a row matches
   the tallest, so a wrapped title doesn't leave its neighbours short. */
.home-topics-grid {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: 22px;
  margin: 0;
  padding: 0;
  list-style: none;
}
@media (max-width: 1024px) {
  .home-topics-grid {
    grid-template-columns: repeat(2, minmax(0, 1fr));
  }
}
@media (max-width: 1464px) {
  html.chat-drawer-pushed .home-topics-grid {
    grid-template-columns: repeat(2, minmax(0, 1fr));
  }
}

/* The mobile tiles stand 178px tall with the glyph pinned to the top and the
   title + count sunk to the bottom (the Figma's space-between column); a title
   that wraps past the floor grows the row instead. */
@media (max-width: 768px) {
  .home-topics-grid .card.tile {
    min-height: 178px;
  }
  .home-topics-grid .card.tile .card-icon + .text {
    margin-top: auto;
  }
}
@media (max-width: 1208px) {
  html.chat-drawer-pushed .home-topics-grid .card.tile {
    min-height: 178px;
  }
  html.chat-drawer-pushed .home-topics-grid .card.tile .card-icon + .text {
    margin-top: auto;
  }
}

.home-topics-item {
  display: flex;
  min-width: 0;
}
.home-topics-item > .card {
  flex: 1;
  min-width: 0;
}

/* The tiles hover like the "More ways to get support" link cards
   (styles/_more-ways-support.scss): the same card with a deeper shadow, no lift
   and no border change. card.css's a.card:hover lifts the card and recolours
   its border, so both are undone here (unlayered, so this wins the cascade). */
[data-rosetta] .home-topics-grid .card.tile {
  transition: box-shadow var(--duration-sqsp-300) var(--ease-sqsp-ease-out);
}
[data-rosetta] .home-topics-grid .card.tile:hover {
  transform: none;
  border-color: var(--card-border-color);
  box-shadow: var(--shadow-sqsp-200);
}

/* Reserve the count line's height while the articles request is in flight, so
   the tile doesn't grow when the count lands (src/homePage.js removes the line
   if the request fails). */
.home-topics-grid [data-topic-count] {
  min-height: var(--leading-sqsp-1);
}

.article-sidebar-heading {
  font-family: var(--font-sqsp-ui);
  font-size: 1rem;
  font-weight: 500;
  line-height: 22px;
  letter-spacing: -0.01em;
  color: var(--colors-fg-default, #0e0e0e);
  margin: 0 0 11px;
}

.section.more-ways-support {
  padding: var(--spacing-sqsp-8) 0 100px;
}

.request-page-inner .more-ways-support,
.category-page-inner .more-ways-support,
.section-page-inner .more-ways-support {
  padding-bottom: 0;
}

.request-page-inner .more-ways-support-heading,
.category-page-inner .more-ways-support-heading,
.section-page-inner .more-ways-support-heading {
  font-size: var(--text-sqsp-6, 22px);
  line-height: 28px;
}

.request-page-inner .more-ways-support-grid {
  margin-top: var(--spacing-sqsp-4);
}

.request-intro ~ .more-ways-support {
  padding-top: calc(var(--spacing-sqsp-8) + var(--spacing-sqsp-4));
}

.category-page-inner .more-ways-support {
  padding-top: 77px;
}

.section-page-inner .more-ways-support {
  padding-top: 121px;
}

.search-results-page .section-page-inner:has(#algolia-pagination .ais-pagination--item__page + .ais-pagination--item__page) .more-ways-support,
.search-results-page .section-page-inner:not(:has(#algolia-pagination)):has(nav.pagination) .more-ways-support {
  padding-top: 99px;
}

.more-ways-support-heading {
  margin: 0;
  color: var(--color-base-content);
}

.more-ways-support-grid {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: var(--spacing-sqsp-6);
  margin-top: var(--spacing-sqsp-8);
}
@media (max-width: 1024px) {
  .more-ways-support-grid {
    grid-template-columns: minmax(0, 1fr);
    gap: var(--spacing-sqsp-4);
  }
}
@media (max-width: 1464px) {
  html.chat-drawer-pushed .more-ways-support-grid {
    grid-template-columns: minmax(0, 1fr);
    gap: var(--spacing-sqsp-4);
  }
}
.more-ways-support-grid > :only-child {
  grid-column: 1/-1;
}

[data-rosetta] .more-ways-support-lead {
  justify-content: space-between;
  gap: var(--spacing-sqsp-6);
  min-height: 418px;
  padding: var(--spacing-sqsp-8) var(--spacing-sqsp-6);
  --card-border-color: var(--color-base-400);
  --card-radius: 8px;
  cursor: pointer;
  transition: box-shadow var(--duration-sqsp-300) var(--ease-sqsp-ease-out);
}
[data-rosetta] .more-ways-support-lead:hover {
  box-shadow: var(--shadow-sqsp-400);
}
[data-rosetta] .more-ways-support-lead:hover .more-ways-support-action {
  background-color: var(--btn-bg-hover);
  border-color: var(--btn-border-hover);
  color: var(--btn-fg-hover);
}
@media (max-width: 1024px) {
  [data-rosetta] .more-ways-support-lead {
    min-height: 0;
  }
}
@media (max-width: 1464px) {
  html.chat-drawer-pushed [data-rosetta] .more-ways-support-lead {
    min-height: 0;
  }
}
[data-rosetta] .more-ways-support-lead:only-child {
  min-height: 0;
}
[data-rosetta] .more-ways-support-lead .card-body {
  flex: 0 0 auto;
  gap: 12px;
  padding: 0;
}

.more-ways-support-lead-title {
  margin: 0;
  font-family: var(--font-sqsp-ui);
  font-size: 20px;
  font-weight: 500;
  line-height: 27px;
  letter-spacing: -0.01em;
}

.more-ways-support-lead-description {
  margin: 0;
  color: var(--color-base-content-muted);
}

[data-rosetta] .more-ways-support-action {
  align-self: flex-start;
  gap: var(--spacing-sqsp-1);
  --btn-bg: var(--color-base-300);
  --btn-border-color: transparent;
  --btn-fg: var(--color-base-content);
  --btn-bg-hover: oklch(from var(--color-base-300) calc(l + sign(0.5 - l) * var(--hover-bg-delta)) c h);
  --btn-border-hover: transparent;
  --btn-fg-hover: var(--color-base-content);
}
[data-rosetta] .more-ways-support-action:active:not(:disabled) {
  transform: none;
}
[data-rosetta] .more-ways-support-action::after {
  content: "";
  position: absolute;
  inset: 0;
  border-radius: var(--card-radius);
}

.more-ways-support-links {
  display: flex;
  flex-direction: column;
  gap: var(--spacing-sqsp-4);
  margin: 0;
  padding: 0;
  list-style: none;
}
.more-ways-support-links > li {
  display: flex;
  flex: 1 1 0;
}

[data-rosetta] .more-ways-support-link {
  flex: 1;
  justify-content: center;
  --card-border-color: var(--color-base-400);
  --card-radius: var(--radius-sqsp-2);
  transition: box-shadow var(--duration-sqsp-300) var(--ease-sqsp-ease-out);
}
[data-rosetta] .more-ways-support-link:hover {
  transform: none;
  border-color: var(--card-border-color);
  box-shadow: var(--shadow-sqsp-200);
}
[data-rosetta] .more-ways-support-link .card-body {
  flex: 0 0 auto;
  gap: var(--spacing-sqsp-2);
  padding: var(--spacing-sqsp-3) var(--spacing-sqsp-6);
}

.more-ways-support-link-icon {
  display: inline-flex;
  align-self: flex-start;
  align-items: center;
  justify-content: center;
  --icon-size: 18px;
}

.more-ways-support-link-title {
  margin: 0;
  font-size: 1rem;
  line-height: 22px;
}

.more-ways-support-link-description {
  margin: 0;
  color: var(--color-base-content-muted);
}

.more-ways-support-links:only-child {
  flex-direction: row;
  gap: var(--spacing-sqsp-6);
}
@media (max-width: 1024px) {
  .more-ways-support-links:only-child {
    flex-direction: column;
    gap: var(--spacing-sqsp-4);
  }
}
@media (max-width: 1464px) {
  html.chat-drawer-pushed .more-ways-support-links:only-child {
    flex-direction: column;
    gap: var(--spacing-sqsp-4);
  }
}
[data-rosetta] .more-ways-support-links:only-child .more-ways-support-link {
  min-height: 240px;
}
@media (max-width: 1024px) {
  [data-rosetta] .more-ways-support-links:only-child .more-ways-support-link {
    min-height: 0;
  }
}
@media (max-width: 1464px) {
  html.chat-drawer-pushed [data-rosetta] .more-ways-support-links:only-child .more-ways-support-link {
    min-height: 0;
  }
}
[data-rosetta] .more-ways-support-links:only-child .more-ways-support-link {
  justify-content: flex-start;
}
[data-rosetta] .more-ways-support-links:only-child .more-ways-support-link .card-body {
  gap: var(--spacing-sqsp-4);
  padding: 66px var(--spacing-sqsp-4) var(--spacing-sqsp-4);
}
@media (max-width: 1024px) {
  [data-rosetta] .more-ways-support-links:only-child .more-ways-support-link .card-body {
    padding-top: var(--spacing-sqsp-4);
  }
}
@media (max-width: 1464px) {
  html.chat-drawer-pushed [data-rosetta] .more-ways-support-links:only-child .more-ways-support-link .card-body {
    padding-top: var(--spacing-sqsp-4);
  }
}
.more-ways-support-links:only-child .more-ways-support-link-icon {
  --icon-size: 18px;
}
.more-ways-support-links:only-child .more-ways-support-link-title {
  font-family: var(--font-sqsp-ui);
  font-size: var(--text-sqsp-6, 22px);
  line-height: 28px;
  letter-spacing: -0.02em;
}
.more-ways-support-links:only-child .more-ways-support-link-description {
  font-size: 14px;
  line-height: 22px;
  color: var(--color-base-content);
}

[data-rosetta] .request-page-inner .more-ways-support-links:only-child .more-ways-support-link {
  --card-radius: var(--radius-sqsp-3);
}

[data-rosetta][data-brand=scheduling] .more-ways-support-link-icon {
  color: var(--color-secondary);
}
[data-rosetta][data-brand=scheduling] .more-ways-support-heading,
[data-rosetta][data-brand=scheduling] .more-ways-support-lead-title,
[data-rosetta][data-brand=scheduling] .more-ways-support-link-title {
  color: var(--color-secondary);
}
[data-rosetta][data-brand=scheduling] .more-ways-support-link-description {
  color: var(--color-base-content-muted);
}

.search-results-page .search-result-list {
  margin: 33px 0 0;
  padding: 0;
  list-style: none;
}
.search-results-page .search-result {
  display: flex;
  flex-direction: column;
  gap: var(--spacing-sqsp-2, 11px);
  padding: var(--spacing-sqsp-4, 22px) 0 var(--spacing-sqsp-6, 33px);
  font-family: var(--font-sqsp-ui);
  letter-spacing: 0;
}
.search-results-page .search-result-title {
  margin: 0;
  font-family: inherit;
  font-size: 16px;
  font-weight: 500;
  line-height: 22px;
}
.search-results-page .search-result-link {
  color: inherit;
  text-decoration: none;
}
.search-results-page .search-result-link:hover, .search-results-page .search-result-link:focus-visible {
  text-decoration: underline;
}
.search-results-page .search-result-snippet {
  margin: 0;
  font-size: 14px;
  line-height: 22px;
}
.search-results-page .search-result-snippet::before {
  content: "... ";
}
.search-results-page .search-result-snippet::after {
  content: " ...";
}
.search-results-page .search-result-snippet:empty {
  display: none;
}
.search-results-page .search-result-snippet em {
  font-style: normal;
  font-weight: 500;
}
.search-results-page .search-result-path {
  display: flex;
  flex-wrap: wrap;
  gap: 6px;
  margin: 0;
  padding: 0;
  list-style: none;
  color: var(--color-base-content-muted);
  font-size: 12px;
  line-height: 16px;
}
.search-results-page .search-result-path:empty {
  display: none;
}
.search-results-page .search-result-path li + li::before {
  content: "/";
  margin-right: 6px;
}
.search-results-page .search-result-path[data-path-root] li:first-child {
  display: none;
}
.search-results-page .search-result-path[data-path-root] li:nth-child(2)::before {
  content: none;
}

.search-results-page .pagination {
  margin-top: var(--spacing-sqsp-4);
}

[data-rosetta][data-brand=scheduling] .search-results .search-result-link {
  color: var(--color-secondary);
}

.search-results-page .no-results {
  margin-top: 33px;
}
.search-results-page .no-results p {
  margin: 0;
  font-family: var(--font-sqsp-ui);
  font-size: 14px;
  line-height: 22px;
  letter-spacing: -0.01em;
}
.search-results-page .no-results .headline {
  font-weight: 500;
}
.search-results-page .no-results .action-prompt {
  color: var(--color-base-content-muted);
}
.search-results-page .no-results a {
  color: var(--color-base-content);
}

.algolia-autocomplete {
  flex: 1;
  min-width: 0;
  width: 100%;
}
.algolia-autocomplete input {
  width: 100%;
}

.algolia-autocomplete input[type=search]::-webkit-search-cancel-button {
  display: none;
  -webkit-appearance: none;
  appearance: none;
}

#algolia-facets,
#algolia-facets-open,
#algolia-facets-close,
#algolia-labels,
#algolia-stats-line,
#algolia-powered-by-container {
  display: none !important;
}

#algolia-hits {
  float: none;
  width: 100%;
  margin-top: 33px;
}
#algolia-hits .ais-hits--item {
  list-style: none;
}

.search-results-page .search-result-link {
  color: inherit;
}

.search-results-page .ais-hits--empty {
  margin: 33px 0 0;
  font-family: var(--font-sqsp-ui);
  font-size: 14px;
  font-weight: 500;
  font-style: normal;
  line-height: 22px;
  letter-spacing: -0.01em;
  color: var(--color-base-content);
}

#algolia-pagination .ais-pagination {
  flex-wrap: wrap;
  gap: var(--spacing-sqsp-2);
  list-style: none;
  padding: 0;
}
#algolia-pagination .ais-pagination--item__first,
#algolia-pagination .ais-pagination--item__last {
  display: none;
}
#algolia-pagination .ais-pagination--item__previous {
  margin-inline-end: calc(var(--spacing-sqsp-3) - var(--spacing-sqsp-2));
}
#algolia-pagination .ais-pagination--item__next {
  margin-inline-start: calc(var(--spacing-sqsp-3) - var(--spacing-sqsp-2));
}
#algolia-pagination .ais-pagination--item__disabled .ais-pagination--link {
  color: var(--color-base-content-disabled);
  pointer-events: none;
}
#algolia-pagination .ais-pagination--link {
  font-family: var(--font-sqsp-ui);
  font-size: 14px;
  line-height: 22px;
  color: inherit;
  text-decoration: none;
}
#algolia-pagination .ais-pagination--link:hover, #algolia-pagination .ais-pagination--link:focus-visible {
  text-decoration: underline;
}
#algolia-pagination .ais-pagination--item__page .ais-pagination--link {
  font-weight: 400;
  color: var(--color-base-content-muted);
}
#algolia-pagination .ais-pagination--item__active .ais-pagination--link {
  font-weight: 500;
  color: var(--color-base-content);
}
#algolia-pagination .ais-pagination--item__active .ais-pagination--link:hover, #algolia-pagination .ais-pagination--item__active .ais-pagination--link:focus-visible {
  text-decoration: none;
}
#algolia-pagination:not(:has(.ais-pagination--item__page + .ais-pagination--item__page)) {
  display: none;
}

.search-suggestions-anchor {
  position: relative;
}

.search-suggestions {
  position: absolute;
  top: calc(100% + var(--spacing-sqsp-1));
  inset-inline: 0;
  z-index: 60;
}

.search-suggestions,
.aa-dropdown-menu {
  --color-base-content: var(--colors-fg-default);
  --color-base-content-muted: var(--colors-fg-muted);
  box-sizing: border-box;
  padding: var(--spacing-sqsp-1) 0;
  border-radius: var(--radius-sqsp-1);
  background: var(--color-base-100);
  box-shadow: var(--shadow-sqsp-200);
  text-align: start;
  overflow: hidden;
}

.aa-dropdown-menu {
  min-width: 100%;
  margin-top: var(--spacing-sqsp-1);
}

.search-suggestions-option,
.aa-suggestion {
  display: block;
  padding: var(--spacing-sqsp-2) var(--spacing-sqsp-3);
  border-bottom: 1px solid var(--color-base-400);
  border-radius: var(--radius-sqsp-1);
  color: inherit;
  text-decoration: none;
  cursor: pointer;
}
.search-suggestions-option:last-child,
.aa-suggestion:last-child {
  border-bottom: 0;
}

.search-suggestions-option:hover,
.search-suggestions-option[aria-selected=true],
.aa-suggestion:hover,
.aa-suggestion.aa-cursor {
  background: var(--color-base-200);
}

.search-suggestion {
  display: flex;
  flex-direction: column;
  min-width: 0;
}

.search-suggestion-title,
.search-suggestion-excerpt {
  overflow: hidden;
  white-space: nowrap;
  text-overflow: ellipsis;
}

.search-suggestion-excerpt {
  color: var(--color-base-content-muted);
}

.article-page {
  background: var(--color-base-100);
}

.article-page-inner {
  max-width: 1142px;
  margin-inline: auto;
  padding: 0 0 77px;
}

.article-layout {
  display: grid;
  grid-template-columns: minmax(0, 1fr) 322px;
  grid-template-rows: auto 1fr;
  grid-template-areas: "header header" "main aside";
  column-gap: 66px;
  row-gap: var(--spacing-sqsp-8, 44px);
  align-items: start;
}
@media (max-width: 1024px) {
  .article-layout {
    display: flex;
    flex-direction: column;
    align-items: stretch;
    gap: var(--spacing-sqsp-8, 44px);
    max-width: 752px;
    margin-inline: auto;
  }
}
html.chat-drawer-pushed .article-layout {
  display: flex;
  flex-direction: column;
  align-items: stretch;
  gap: var(--spacing-sqsp-8, 44px);
  max-width: 752px;
  margin-inline: auto;
}

.article-header {
  grid-area: header;
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  gap: var(--spacing-sqsp-4, 22px);
  max-width: 830px;
  min-width: 0;
  padding-top: var(--spacing-sqsp-8, 44px);
}
@media (max-width: 1024px) {
  .article-header {
    order: -2;
  }
}
html.chat-drawer-pushed .article-header {
  order: -2;
}

.article-title {
  margin: 0;
  font-family: var(--font-sqsp-ui);
  font-size: var(--text-sqsp-9, 40px);
  font-weight: 400;
  line-height: 44px;
  letter-spacing: -0.03em;
  color: var(--color-base-content);
}
.article-title .icon-lock {
  vertical-align: middle;
  margin-left: 6px;
}

.article-subtitle {
  margin: 0;
  font-family: var(--font-sqsp-ui);
  font-size: var(--text-sqsp-4, 16px);
  font-weight: 500;
  line-height: 22px;
  letter-spacing: -0.01em;
  color: var(--color-base-content);
}
.article-subtitle[hidden] {
  display: none;
}

.article-main {
  grid-area: main;
  display: flex;
  flex-direction: column;
  gap: var(--spacing-sqsp-4, 22px);
  min-width: 0;
}

.article-sidebar {
  grid-area: aside;
  display: flex;
  flex-direction: column;
  gap: 66px;
  position: sticky;
  top: calc(var(--hc-header-height) + var(--hc-nav-secondary-height) + var(--spacing-sqsp-8, 44px));
}
@media (max-width: 1024px) {
  .article-sidebar {
    display: contents;
    position: static;
  }
}
html.chat-drawer-pushed .article-sidebar {
  display: contents;
  position: static;
}

.article-page .article-sidebar-heading {
  margin: 0 0 var(--spacing-sqsp-2, 11px);
  font-family: var(--font-sqsp-ui);
  font-size: var(--text-sqsp-2, 12px);
  font-weight: 500;
  line-height: 16px;
  letter-spacing: 0;
  color: var(--color-base-content-muted);
}

.article-toc .article-sidebar-heading {
  padding-bottom: var(--spacing-sqsp-2, 11px);
  border-bottom: 1px solid var(--color-base-400);
}

@media (max-width: 1024px) {
  .article-toc {
    order: -1;
    position: static;
  }
}
html.chat-drawer-pushed .article-toc {
  order: -1;
  position: static;
}

@media (max-width: 1024px) {
  .article-support {
    position: static;
  }
}
html.chat-drawer-pushed .article-support {
  position: static;
}

.support-links-heading {
  margin: 0 0 var(--spacing-sqsp-4);
  padding-bottom: var(--spacing-sqsp-2);
  border-bottom: 1px solid var(--color-base-400);
  font-family: var(--font-sqsp-ui);
  font-size: 12px;
  font-weight: 500;
  line-height: 16px;
  color: var(--color-base-content-muted);
}

.support-links {
  display: flex;
  flex-direction: column;
  gap: var(--spacing-sqsp-2);
  margin: 0;
  padding: 0;
  list-style: none;
}

.support-link {
  display: flex;
  align-items: center;
  gap: var(--spacing-sqsp-4);
  font-size: 14px;
  line-height: 22px;
  color: var(--color-base-content-muted);
  text-decoration: none;
}

a.support-link:hover,
a.support-link:focus-visible {
  color: var(--color-base-content);
  text-decoration: underline;
}

.support-link-icon {
  flex-shrink: 0;
  --icon-size: 16px;
}

.article-toc-list {
  list-style: none;
  margin: 0;
  padding: 0;
  display: flex;
  flex-direction: column;
  gap: var(--spacing-sqsp-2, 11px);
}
@media (min-width: 1025px) {
  html:not(.chat-drawer-pushed) .article-toc-list {
    max-height: 420px;
    overflow-y: auto;
  }
}

.article-toc-link {
  display: block;
  font-family: var(--font-sqsp-ui);
  font-size: 14px;
  font-weight: 400;
  line-height: 22px;
  letter-spacing: -0.01em;
  color: var(--color-base-content-muted);
  text-decoration: none;
}
.article-toc-link:hover {
  color: var(--color-base-content);
}
.article-toc-link.is-active {
  font-weight: 500;
  color: var(--color-base-content);
}

.article-related {
  display: flex;
  flex-direction: column;
  gap: var(--spacing-sqsp-2, 11px);
  margin-top: var(--spacing-sqsp-8, 44px);
}
.article-related section,
.article-related ul,
.article-related li {
  display: contents;
}
.article-related .article-sidebar-heading {
  margin: 0;
}
.article-related h1:not(.article-sidebar-heading),
.article-related h2:not(.article-sidebar-heading),
.article-related h3:not(.article-sidebar-heading),
.article-related h4:not(.article-sidebar-heading),
.article-related h5:not(.article-sidebar-heading),
.article-related h6:not(.article-sidebar-heading) {
  display: none;
}

.article-summary {
  background: var(--color-base-100);
  border-radius: 6px;
  padding: 22px;
  display: flex;
  flex-direction: column;
  gap: 6px;
}
.article-summary[hidden] {
  display: none;
}

.article-summary-header {
  display: flex;
  align-items: center;
  gap: 6px;
}

.article-summary-icon {
  --icon-size: 22px;
  color: var(--color-accent);
}

.article-summary-title {
  font-size: 1rem;
  font-weight: 500;
  line-height: 28px;
  margin: 0;
  color: var(--color-accent, var(--color-base-content));
}

.article-summary-body {
  color: var(--color-body, var(--color-base-content));
  font-family: var(--font-sqsp-ui);
  font-size: 1rem;
  font-weight: 400;
  line-height: 28px;
}
.article-summary-body * {
  font-size: inherit;
  font-weight: 400 !important;
}
.article-summary-body > *:first-child {
  margin-top: 0;
}
.article-summary-body > *:last-child {
  margin-bottom: 0;
}
.article-summary-body p {
  margin: 0 0 1em;
}
.article-summary-body a {
  color: inherit;
  text-decoration: underline;
}
.article-summary-body a:hover {
  text-decoration: none;
}

.article-content-card {
  background: none;
  border-radius: 0;
  padding: 0;
}

.article-updated {
  margin: 0 0 var(--spacing-sqsp-2, 11px);
  padding-block: 8px;
  font-family: var(--font-sqsp-ui);
  font-size: var(--text-sqsp-2, 12px);
  font-weight: 400;
  line-height: 16px;
  color: var(--color-base-content-muted);
}

[data-rosetta] .article-body {
  font-size: 16px;
  line-height: 22px;
  letter-spacing: -0.01em;
}
[data-rosetta] .article-body p,
[data-rosetta] .article-body ul,
[data-rosetta] .article-body ol {
  margin-block: 0 var(--spacing-sqsp-2, 11px);
}
[data-rosetta] .article-body h1,
[data-rosetta] .article-body h2 {
  padding-top: var(--spacing-sqsp-8, 44px);
  margin-block: 0 var(--spacing-sqsp-2, 11px);
}
[data-rosetta] .article-body h1:first-child,
[data-rosetta] .article-body h2:first-child {
  padding-top: 0;
}
[data-rosetta] .article-body h2 {
  font-size: 26px;
  font-weight: 400;
  line-height: 28px;
  letter-spacing: -0.02em;
}
[data-rosetta] .article-body h3 {
  margin-block: var(--spacing-sqsp-4, 22px) var(--spacing-sqsp-2, 11px);
  font-size: 16px;
  font-weight: 500;
  line-height: 22px;
  letter-spacing: -0.01em;
}
[data-rosetta] .article-body h4 {
  font-size: 16px;
  font-weight: 500;
  line-height: 22px;
}
[data-rosetta] .article-body ol > li,
[data-rosetta] .article-body ul > li {
  font-size: 16px;
  line-height: 22px;
  letter-spacing: -0.01em;
}
[data-rosetta] .article-body ol > li::before {
  top: -1px;
  background: var(--color-base-300);
  color: var(--color-base-content);
  font-weight: 400;
}
[data-rosetta] .article-body ol ul {
  margin: var(--spacing-sqsp-2, 11px) 0 0;
  padding-inline-start: var(--spacing-sqsp-5, 27px);
}
[data-rosetta] .article-body img {
  border: 1px solid var(--color-base-content);
}
[data-rosetta] .article-body .article-heading-anchor {
  display: inline-flex;
  vertical-align: middle;
  margin-left: 8px;
  margin-block: -8px;
  opacity: 0;
  transition: opacity 120ms ease-in-out;
  --icon-size: 20px;
  line-height: 1;
}
[data-rosetta] .article-body :is(h2, h3, h4):hover > .article-heading-anchor,
[data-rosetta] .article-body .article-heading-anchor:focus-visible,
[data-rosetta] .article-body .article-heading-anchor.is-copied {
  opacity: 1;
}
[data-rosetta] .article-body .article-heading-anchor.is-copied {
  --btn-fg: var(--color-sqsp-green-300);
  --btn-fg-hover: var(--color-sqsp-green-300);
}
@media (hover: none) {
  [data-rosetta] .article-body .article-heading-anchor {
    opacity: 1;
  }
}
@media (prefers-reduced-motion: reduce) {
  [data-rosetta] .article-body .article-heading-anchor {
    transition: none;
  }
}
[data-rosetta] .article-body blockquote {
  display: block;
  margin: var(--spacing-sqsp-4, 22px) 0;
  padding: var(--spacing-sqsp-4, 22px);
  border: 0 !important;
  border-radius: 6px;
  background-color: var(--color-base-300) !important;
  color: var(--color-base-content-muted);
  font-size: 15px;
  line-height: 1.4;
  letter-spacing: -0.01em;
}
[data-rosetta] .article-body blockquote > :first-child {
  margin-top: 0;
}
[data-rosetta] .article-body blockquote > :last-child {
  margin-bottom: 0;
}
[data-rosetta] .article-body blockquote a {
  color: inherit;
}
[data-rosetta] .article-body blockquote li {
  font-size: inherit;
  line-height: inherit;
}
[data-rosetta] .article-body .article-tabs {
  margin: var(--spacing-sqsp-5) 0;
}
[data-rosetta] .article-body .youtube-wrapper iframe,
[data-rosetta] .article-body iframe[src*="youtube.com/embed"],
[data-rosetta] .article-body iframe[src*="youtube-nocookie.com/embed"] {
  display: block;
  max-width: 100%;
  height: auto;
  aspect-ratio: 16/9;
}
[data-rosetta] .article-body a[data-external-link]::after {
  content: " ↗";
}
[data-rosetta] .article-body .banner-title.article-callout-title {
  margin: 0 0 var(--spacing-sqsp-2, 11px);
  font-size: 9.75px;
  font-weight: 500;
  line-height: 16px;
  letter-spacing: 0.75px;
  text-transform: uppercase;
  color: var(--color-base-content-muted);
}

.content-tags {
  margin-top: 22px;
}
.content-tags p {
  margin: 0 0 8px;
  font-size: 0.8125rem;
  font-weight: 500;
  color: var(--color-base-content-muted);
}
.content-tags .content-tag-list {
  list-style: none;
  margin: 0;
  padding: 0;
  display: flex;
  flex-wrap: wrap;
  gap: 8px;
}
.content-tags .content-tag-item a {
  display: inline-block;
  padding: 4px 12px;
  border: 1px solid var(--color-base-400);
  border-radius: 999px;
  background: var(--color-base-200);
  color: var(--color-base-content-muted);
  font-size: 0.8125rem;
  line-height: 20px;
  text-decoration: none;
}
.content-tags .content-tag-item a:hover {
  border-color: var(--color-accent);
  color: var(--color-accent);
}

.article-attachments {
  margin-top: 22px;
}
.article-attachments .attachments {
  list-style: none;
  margin: 0;
  padding: 0;
  display: flex;
  flex-direction: column;
  gap: 8px;
}
.article-attachments .attachment-item {
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: 8px;
  padding: 12px 16px;
  border: 1px solid var(--color-base-400);
  border-radius: 6px;
}
.article-attachments .attachment-icon {
  flex-shrink: 0;
  color: var(--color-base-content-muted);
}
.article-attachments .attachment-item > a {
  color: var(--color-accent, var(--color-base-content));
  font-weight: 500;
  text-decoration: none;
}
.article-attachments .attachment-item > a:hover {
  text-decoration: underline;
}
.article-attachments .attachment-meta {
  display: flex;
  gap: 8px;
  margin-left: auto;
  color: var(--color-base-content-muted);
  font-size: 0.8125rem;
}
.article-attachments .attachment-meta a {
  color: inherit;
}

.article-content-card footer {
  margin-top: var(--spacing-sqsp-8, 44px);
  padding-top: var(--spacing-sqsp-2, 11px);
  border-top: 1px solid var(--color-base-400);
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  gap: var(--spacing-sqsp-2, 11px);
}

.article-more-questions {
  color: var(--color-base-content-muted);
  font-size: 0.875rem;
}
.article-more-questions a {
  color: var(--color-accent, var(--color-base-content));
  font-weight: 500;
  text-decoration: none;
}
.article-more-questions a:hover {
  text-decoration: underline;
}

.article-return-to-top a {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  font-family: var(--font-sqsp-ui);
  font-size: 14px;
  line-height: 22px;
  letter-spacing: -0.01em;
  color: var(--color-base-content);
  text-decoration: none;
}
.article-return-to-top a:hover {
  text-decoration: underline;
}
.article-return-to-top a .article-return-to-top-icon {
  transform: rotate(180deg);
}

.request-page {
  background: var(--color-base-100);
}

.request-page-inner {
  padding-top: var(--spacing-sqsp-8, 44px);
  padding-bottom: var(--spacing-sqsp-8, 44px);
}
.request-page-inner:has([data-request-form]) {
  padding-bottom: 88px;
}
.request-page-inner > * {
  max-width: 1152px;
  margin-inline: auto;
}

.request-intro {
  display: flex;
  align-items: stretch;
  gap: var(--spacing-sqsp-8, 44px);
  padding: 0 0 66px;
}
@media (max-width: 743px) {
  .request-intro {
    flex-direction: column;
    padding-bottom: 33px;
  }
}
@media (max-width: 1183px) {
  html.chat-drawer-pushed .request-intro {
    flex-direction: column;
    padding-bottom: 33px;
  }
}

.request-intro-text {
  flex: 1 1 0;
  min-width: 0;
  color: var(--color-base-content);
}
@media (max-width: 900px) {
  .request-intro-text {
    flex: 1 1 50%;
  }
}
@media (max-width: 1340px) {
  html.chat-drawer-pushed .request-intro-text {
    flex: 1 1 50%;
  }
}

.request-intro-title {
  margin: 0;
  font-family: var(--font-sqsp-ui);
  font-size: var(--text-sqsp-9, 40px);
  font-weight: 400;
  line-height: 44px;
  letter-spacing: -0.03em;
}

.request-intro-subtitle {
  display: flex;
  flex-direction: column;
  gap: var(--spacing-sqsp-4, 22px);
  max-width: 561px;
  margin: 11px 0 0;
  padding: var(--spacing-sqsp-8, 44px) 0;
}
.request-intro-subtitle p {
  margin: 0;
}
.request-intro-subtitle {
  font-family: var(--font-sqsp-ui);
  font-size: 1rem;
  font-weight: 500;
  line-height: 22px;
  letter-spacing: -0.01em;
}

.request-contact-panel {
  display: flex;
  flex: 0 0 361px;
  align-items: center;
  justify-content: center;
  min-width: 0;
  padding: var(--spacing-sqsp-10, 55px) var(--spacing-sqsp-8, 44px);
  background: var(--color-base-300);
  border-radius: var(--radii-3, 11px);
}
@media (max-width: 900px) {
  .request-contact-panel {
    flex: 1 1 50%;
  }
}
@media (max-width: 1340px) {
  html.chat-drawer-pushed .request-contact-panel {
    flex: 1 1 50%;
  }
}
.request-contact-panel[hidden] {
  display: none;
}
.request-contact-panel .request-contact-panel-button {
  width: 100%;
}

.request-contact-panel:has(.request-login) {
  justify-content: flex-start;
  align-items: center;
}

.request-login {
  display: flex;
  flex-direction: column;
  align-items: stretch;
  gap: var(--spacing-sqsp-6, 33px);
  width: 100%;
}

.request-login-title {
  margin: 0;
  font-family: var(--font-sqsp-ui);
  font-size: var(--text-sqsp-6, 22px);
  font-weight: 500;
  line-height: 28px;
  letter-spacing: -0.02em;
}

.request-login-links {
  display: flex;
  flex-wrap: wrap;
  gap: 6px var(--spacing-sqsp-4, 22px);
  margin: 0;
  font-family: var(--font-sqsp-ui);
  font-size: 0.75rem;
  font-weight: 400;
  line-height: 16px;
}
.request-login-links a,
.request-login-links .request-login-link {
  color: var(--color-base-content);
  text-decoration: underline;
  text-underline-position: from-font;
}
.request-login-links a:hover, .request-login-links a:focus-visible,
.request-login-links .request-login-link:hover,
.request-login-links .request-login-link:focus-visible {
  text-decoration: none;
}
.request-login-links .request-login-link {
  padding: 0;
  border: 0;
  background: none;
  font: inherit;
  cursor: pointer;
}

.request-main {
  min-width: 0;
}

[data-request-form] {
  padding-bottom: var(--spacing-sqsp-8, 44px);
  max-width: 738px;
  margin: 0 auto;
}
[data-request-form] .request-form__heading {
  margin-bottom: var(--spacing-sqsp-8, 44px);
}

[data-rosetta][data-brand=scheduling] .request-intro-text,
[data-rosetta][data-brand=scheduling] .request-login-title {
  color: var(--color-secondary);
}
[data-rosetta][data-brand=scheduling] .request-contact-panel {
  background: color-mix(in oklch, var(--color-secondary) 8%, var(--color-base-100));
}
[data-rosetta][data-brand=scheduling] .request-contact-panel-button {
  --btn-bg: var(--color-secondary);
  --btn-fg: var(--color-secondary-content);
  --btn-bg-hover: color-mix(in oklch, var(--color-secondary) 85%, black);
  --btn-fg-hover: var(--color-secondary-content);
}
[data-rosetta][data-brand=scheduling] .request-login-links a,
[data-rosetta][data-brand=scheduling] .request-login-link {
  color: var(--color-secondary);
}

.request-form {
  display: flex;
  flex-direction: column;
  gap: 16px;
}

.request-form__footer {
  margin-top: 8px;
}

.request-form__field {
  display: flex;
  flex-direction: column;
  gap: 6px;
}

.request-form__lock {
  display: flex;
  flex-direction: column;
  gap: 16px;
  border: 0;
  margin: 0;
  padding: 0;
  min-width: 0;
}

.request-form__lock--trigger .request-form__field > p {
  color: var(--colors-fg-danger);
}

.request-form__plaid {
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  gap: 6px;
}

/* ── Chat drawer ─────────────────────────────────────────────────────────────
   The site-wide chatbot surface, replacing the retired /hc/p/chat page. Mounted
   on every page by src/modules/chat-drawer, which appends its own [data-rosetta]
   container INSIDE the page-content landmark — the <main role="main"> Zendesk
   Guide injects around the page template (no .hbs in this theme authors it).
   Opened and closed from any [data-chat-toggle] control, which in practice means
   the navbar button (src/header.js) — the one control on the page. (The search
   page's contact blades still build one too, src/searchResults.js, but that
   markup only renders for a brand with no home.support.card, which is no shipped
   brand. The support card's "Contact us" blade used to be one and is now an
   ordinary link to the ticket form.)

   That mount point is load-bearing. Because the host is a sibling of the header
   and the footer rather than an ancestor, "between the header and the footer" is
   simply "inside the host" — expressible as an absolutely positioned rail
   spanning the host, with the drawer sticky inside it. No geometry measuring, no
   scroll listener, and none of the inertial-scroll judder that comes from a
   fixed box chasing the chrome one frame late.

   The drawer stays in the DOM across close/open — it hides by transform, not by
   unmounting — so Assembled's iframe and the conversation inside it survive.
   That is also why the closed state must be un-hittable: `visibility: hidden`
   (transitioned so it only applies once the slide-out finishes) plus the `inert`
   attribute ChatDrawer.tsx sets.

   PERSISTENT, not overlay: while open the drawer takes its width out of the
   page rather than covering it — see the push block below. */
/* The width the drawer takes out of the page while open. `--chat-drawer-inset`
   is the live value: 0 when closed, and 0 at the full-screen breakpoint (where
   there is no room left to push into, so the drawer covers the page instead).
   ChatDrawer.tsx toggles .chat-drawer-pushed on <html>; keeping the switch on
   the root element is what lets every descendant inherit the inset.

   Anything doing full-bleed math off 100vw has to subtract it or it will
   overflow the narrowed page — styles/_page.scss's .browse-products viewport is
   the one such rule in the theme today. Grep --chat-drawer-inset before adding
   another. */
:root {
  /* $chat-drawer-width (styles/_content-width.scss) rather than a literal:
     the page layouts' breakpoints are derived from this width, so the two
     can't be allowed to drift. */
  --chat-drawer-width: 440px;
  --chat-drawer-inset: 0px;
}

html.chat-drawer-pushed {
  --chat-drawer-inset: min(var(--chat-drawer-width), 100vw);
}

/* The host — the element renderChatDrawer mounted into, marked by that module
   so this stylesheet needs no knowledge of which element it turned out to be
   (the <main> landmark in practice, <body> only as a degenerate fallback).
   Three jobs:

   1. positioning context for the rail below;
   2. `overflow-x: clip` so the closed drawer — parked a full width past the
      inline-end edge — can't extend the page or raise a scrollbar. `clip` and
      NOT `hidden`: hidden would make this a scroll container, which would
      re-anchor the sticky drawer to the host instead of the viewport and break
      the whole approach;
   3. the push (below).

   The theme's one full-bleed rule (.browse-products, styles/_page.scss) sizes
   itself to 100vw minus the inset, so it lands exactly on the host's content box
   and is never the thing being clipped. */
.chat-drawer-host {
  position: relative;
  overflow-x: clip;
  transition: padding-inline-end 240ms ease;
}

/* The push. Padding rather than margin so the page background still paints
   behind the drawer during the slide; matched to the drawer's own 240ms so the
   two move together. Declared only under the pushed class, never as a `0px`
   base, so it can't clobber a padding somebody adds later — the transition sits
   on the base so closing animates too.

   Note what is NOT here any more: the header and footer needed an equal negative
   margin to escape the old <body> padding. They are outside the host now, so
   they keep their full width for free. */
html.chat-drawer-pushed .chat-drawer-host {
  padding-inline-end: var(--chat-drawer-inset);
}

/* The rail: spans the host's full block size at its inline-end edge, and is the
   containing block the drawer sticks within. Out of flow, so page content is
   untouched — the host's padding is what actually makes room.

   pointer-events are off because the rail covers a strip of every page even
   while the drawer is closed; the drawer itself turns them back on. */
.chat-drawer-root {
  position: absolute;
  inset-block: 0;
  inset-inline-end: 0;
  inline-size: min(var(--chat-drawer-width), 100vw);
  pointer-events: none;
}

.chat-drawer {
  /* Sticky, not fixed. Two clamps come free, and they are exactly the two the
     old measuring code hand-computed:
       - it sticks at --hc-header-height, the strip the sticky header
         permanently occupies (styles/_header.scss), so it can never cover the
         header — and therefore never covers the toggle that closes it.
       - it can't ride past the host's bottom, which is where the footer
         begins. It can never cover the footer.
     Being compositor-driven, it also can't lag behind inertial scrolling. */
  position: sticky;
  inset-block-start: var(--hc-header-height);
  /* Exactly the viewport below the header, at every scroll position — which is
     what keeps BOTH flex children (Assembled's iframe and the AI disclaimer
     under it) on screen from the first paint.
       - scrolled: top is the sticky offset, so the bottom edge lands on the
         fold for any value of the variable;
       - at scroll-top: the drawer is still at its unstuck position — the
         rail's top, i.e. immediately under the in-flow header — so the bottom
         edge lands on the fold precisely because the variable equals the real
         bar height. styles/_header.scss pins the bar to it with a
         min-block-size so that stays true.
     This is what the header being sticky bought: before it, the drawer had to
     assume nothing about the header's visible height, so a 100dvh box hung
     below the fold at the top of every page and the disclaimer was cut off
     until the reader scrolled. */
  block-size: calc(100dvh - var(--hc-header-height));
  /* Never taller than the rail, so a page shorter than the viewport gets a
     drawer that stops at the footer instead of overflowing past it. */
  max-block-size: 100%;
  pointer-events: auto;
  display: flex;
  flex-direction: column;
  gap: 16px;
  /* Figma puts the drawer's content 33px in from every edge. Assembled already
     pads its own content 20px inside the iframe, so the drawer supplies only
     the remaining 13px. The disclaimer has no such inner padding and makes up
     the difference itself (below). */
  padding: 13px;
  background: var(--color-base-100, #fff);
  /* Border only, no shadow — the drawer is flat in Figma. */
  border-inline-start: 1px solid var(--colors-border-default, #e7e7e7);
  /* Above ordinary page content — which matters during the slide (the drawer
     travels over the page before the padding catches up) and at the
     full-screen breakpoint, where it genuinely overlays — but deliberately
     BELOW the header's dropdown / mega flyouts (--popover-z: 50), which drop
     down out of the header and across this strip.
     (The old fixed drawer sat at 100 and covered them; it had to, because it
     spanned the whole viewport.)

     `position: sticky` already opens a stacking context, so Assembled's own
     high z-index is trapped inside the drawer and can't escape past the
     header — the same guarantee the retired chat page bought with
     `isolation: isolate`. */
  z-index: 20;
  transform: translateX(100%);
  visibility: hidden;
  transition: transform 240ms ease, visibility 0s linear 240ms;
  /* RTL: the drawer sits at the inline-end edge, so it slides out the other
     way. transform is physical, so the logical property can't do this. */
}
[dir=rtl] .chat-drawer {
  transform: translateX(-100%);
}

.chat-drawer--open {
  transform: translateX(0);
  visibility: visible;
  transition: transform 240ms ease, visibility 0s linear 0s;
}
[dir=rtl] .chat-drawer--open {
  transform: translateX(0);
}

@media (prefers-reduced-motion: reduce) {
  .chat-drawer,
  .chat-drawer-host {
    transition: none;
  }
}
/* The drawer carries no chrome of its own — no title bar, no close button. The
   navbar toggle is the single open/close control, and the drawer sticks at
   --hc-header-height precisely so the pinned header holding that control is
   never covered. Assembled is embedded with data-disable-close-button, so it
   contributes none either.

   The drawer takes focus on open (tabIndex={-1} in ChatDrawer.tsx) since there
   is no control inside it to land on. That's a programmatic container focus, so
   suppress the ring — it would outline the whole panel for a move the user
   didn't make with the keyboard. */
.chat-drawer:focus {
  outline: none;
}

/* Holds the widget and the loading state that covers it while it arrives. It is
   the flex child that claims the drawer's free space (the widget itself just
   fills it), and the containing block the spinner centers in — so the spinner
   stays clear of the disclaimer, which is outside this box. */
.chat-drawer-body {
  position: relative;
  display: flex;
  flex: 1;
  min-block-size: 0;
}

/* Assembled injects its iframe here (data-embedded-container). Empty until the
   first open — the script is only fetched then — so it must hold its own space
   rather than collapse. */
.chat-drawer-widget {
  flex: 1;
  min-block-size: 0;
  /* Assembled's public_chat.html pins its own <html> to the light theme
     whenever it runs in an iframe, whatever theme the embed passes, so its
     page background squares off light around a dark chat. Rounding and
     clipping the host trims that background to the chat's own shape. 25px
     has no step in the radius scale (it stops at 11px before the pill). */
  border-radius: 25px;
  overflow: hidden;
}
.chat-drawer-widget iframe {
  inline-size: 100%;
  block-size: 100%;
  border: 0;
}

/* public-chat.js injects an `iframe.assembled-chat` rule with a box-shadow meant
   for its floating mode, and appends it to <head> after this stylesheet — so a
   rule of equal specificity loses. The container class is what wins here,
   without reaching for !important. The drawer is flat in Figma; the iframe
   should read as part of it, not as a card inside it. */
.chat-drawer-widget iframe.assembled-chat {
  box-shadow: none;
}

/* While the widget has nothing worth showing — still loading, or in outage with
   the recovery poll running behind the message (ChatDrawer.tsx).

   `visibility`, deliberately not `display: none`: the host has to keep its
   layout box so Assembled measures the size it will actually be rendered at.
   A retry that laid out its iframe inside a zero-height container would come
   back sized wrong, and there is no second load event to fix it. */
.chat-drawer-widget--hidden {
  visibility: hidden;
}

/* Shown from the first open until Assembled's iframe has loaded
   (src/modules/chat-drawer/widgetSettled.ts), in place of the blank panel that
   span used to be.

   Deliberately NOT hc-components' Activity Indicator: that is a port of
   Rosetta's flipping square, which reads as Squarespace brand expression. What
   stands in for a third-party chat window should be anonymous, so this is a
   plain ring in the drawer's own border/muted colors.

   The fade is delayed rather than immediate — the Activity Indicator's
   documented rule, that a sub-second wait must never flash a spinner, holds for
   any loader. Doing it in CSS keeps it out of the component: `both` holds the
   from-state through the delay, so nothing paints for the first 100ms. */
.chat-drawer-loading {
  position: absolute;
  inset: 0;
  display: flex;
  align-items: center;
  justify-content: center;
  animation: chat-drawer-loading-in 120ms ease 100ms both;
}

/* The loading state's accessible name (ChatDrawer.tsx). Announced by the
   role="status" live region above, never drawn — the spinner is the visible
   half. Scoped to the drawer rather than added as a shared utility because the
   theme has no visually-hidden class to reuse; promote it if a second caller
   turns up.

   Out of flow, so it can't disturb the spinner's centering. The 1px box plus
   clip-path is the standard recipe: a zero-size or display:none element is
   dropped from the accessibility tree by some screen readers, so it has to
   occupy space and be clipped instead. */
.chat-drawer-loading-label {
  position: absolute;
  inline-size: 1px;
  block-size: 1px;
  margin: -1px;
  padding: 0;
  overflow: hidden;
  clip-path: inset(50%);
  white-space: nowrap;
  border: 0;
}

.chat-drawer-spinner {
  inline-size: 24px;
  block-size: 24px;
  border: 2px solid var(--colors-border-default, #e7e7e7);
  /* One side in the darker color is what makes the rotation legible. */
  border-block-start-color: var(--colors-fg-muted, #5a5a5a);
  border-radius: 50%;
  animation: chat-drawer-spin 800ms linear infinite;
}

@keyframes chat-drawer-loading-in {
  from {
    opacity: 0;
  }
  to {
    opacity: 1;
  }
}
@keyframes chat-drawer-spin {
  to {
    transform: rotate(360deg);
  }
}
/* Reduced motion: hold the ring still rather than removing the only thing in
   the panel — it still reads as "something is coming". Matches the drawer's own
   transitions being dropped above. */
@media (prefers-reduced-motion: reduce) {
  .chat-drawer-spinner {
    animation: none;
  }
}
/* Shown when the widget failed to load, in place of the blank panel that used to
   be the whole failure experience. Positioned over the widget host exactly like
   the spinner — the host stays in the DOM so the recovery poll has a container to
   render into — which is why it needs an opaque background of its own rather than
   inheriting the drawer's.

   Not a shared component: nothing else in the theme has a panel-scoped outage
   state to share with, and the page-level announcement banner
   (src/announcementBanner.js) is styled and positioned for a site-wide notice.

   Centred and narrow-measured because it stands alone in a 440px column — a
   full-width paragraph in a box this narrow reads as a wall. */
.chat-drawer-outage {
  position: absolute;
  inset: 0;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: 12px;
  padding: 24px;
  text-align: center;
  background: var(--color-base-100, #fff);
}

/* Type comes from the Text component (.text.heading-sm); this only drops the
   margin a <p> carries, since the flex gap above owns the spacing. */
.chat-drawer-outage-title,
.chat-drawer-outage-body {
  margin: 0;
  /* Narrow enough that the sentence doesn't read as a wall in a 440px column,
     wide enough that the default body copy doesn't leave a one-word last line.
     Brand copy will wrap differently — this is a comfortable measure, not a
     fit to one string. */
  max-inline-size: 36ch;
}

.chat-drawer-outage-body {
  color: var(--colors-fg-muted, #5a5a5a);
}

/* The manual retry, under the CTA. Chrome and hover/focus states come from
   hc-components' IconButton (.btn.icon-btn.subtle.sm), which is transparent at
   rest — so at the `sm` default of 1em the glyph reads as a stray mark rather
   than a control. Two adjustments make it legible as one without making it
   compete with the CTA:

   - the glyph goes up to 18px in the 28px button, which is as large as it can be
     before it stops reading as secondary. The button box is left alone: at 28px
     it already clears the 24px minimum target size (WCAG 2.5.8);
   - it takes the body copy's muted color, so it reads as part of the message
     rather than as something floating under it. The IconButton's hover and focus
     states still bring it to full contrast on interaction. */
.chat-drawer-outage-retry {
  --icon-size: 18px;
  color: var(--colors-fg-muted, #5a5a5a);
}

/* AI disclaimer under the widget (window.brandConfig.chat.disclaimer). Type
   comes from the Text component (.text.body-sm, 12px); this only adds the
   centering + muted color the component doesn't carry. */
.chat-drawer-disclaimer {
  margin: 0;
  /* The 20px the iframe's content gets from Assembled, so the disclaimer sits
     on the same 33px inset as the widget above it. */
  padding: 0 20px 20px;
  text-align: center;
  color: var(--colors-fg-muted, #5a5a5a);
  /* A link inside the disclaimer (the "Terms of Service" wording, carried in
     the copy itself) keeps the muted color of the sentence around it, so the
     underline is the only thing marking it as a link — it can't be dropped. */
}
.chat-drawer-disclaimer a {
  color: inherit;
  text-decoration: underline;
}

/* ── Full-width (small viewports) ────────────────────────────────────────────
   Two families of query, and both are needed. The width one covers a narrowed
   desktop window. The coarse-pointer pair is Rosetta's mobile-0 variant, which
   keys off DEVICE dimensions — a resized desktop window never matches it, and a
   phone in landscape never matches the width query. Repeated literally rather
   than via @variant because this stylesheet is unlayered (see the same copy in
   styles/_homepage.scss).

   900px is deliberately ahead of the 801px fine-pointer boundary the navbar
   itself flips at (hc-components navbar.css), which this query used to mirror:
   the push leaves only (viewport - 440px) for the page, so anywhere in the
   801–900px band the reader is left with ~360–460px of content — narrower than
   the mobile layout the same content gets on a phone. Better to cover the page
   than to squeeze it that far. The theme's header now keeps its tablet bar up
   to 1024px (styles/_header.scss), so the navbar is never in its desktop form
   while the drawer is full-screen. Either way the drawer is inset below the
   header at every size, so the navbar chat toggle (the only way to close it)
   stays reachable.

   The number lives in styles/_content-width.scss as
   $chat-drawer-fullscreen-max, because that is where the page layouts document
   what it means for them: below it the drawer stops narrowing the page, so
   their content-width breakpoints and the viewport agree again. */
@media (max-width: 900px), only screen and (pointer: coarse) and (orientation: portrait) and (max-device-height: 956px), only screen and (pointer: coarse) and (orientation: landscape) and (max-device-width: 956px) {
  /* Here the drawer goes back to covering the content instead of pushing it:
     at full width there is no page left to push into, and a push would drive
     the content to zero. Zeroing the inset (rather than the
     .chat-drawer-pushed class, which ChatDrawer.tsx sets regardless of
     viewport) also means crossing the breakpoint with the drawer already open
     just works — no resize listener. */
  html.chat-drawer-pushed {
    --chat-drawer-inset: 0px;
  }
  /* The rail widens to the whole host; the drawer fills it. The rail is still
     scoped to the host, so the drawer stays below the header and above the
     footer at this size too — which is what keeps the navbar toggle (the only
     way to close the drawer) reachable. */
  .chat-drawer-root {
    inline-size: 100%;
  }
  .chat-drawer {
    border-inline-start: 0;
  }
}
/* ── Admin apps ───────────────────────────────────────────────────────────────
   The admin-only drawer: a left rail that opens onto a grid of admin tools and,
   once one is picked, hands the rail over to that tool. Mounted on <body> by
   src/modules/admin-apps, which appends its own
   [data-rosetta][data-admin-app] container there — never inside a template,
   since it is chrome for the whole document.

   This file is the FRAME: the rail, the push it applies to the page, the title
   bar, the app grid and the resize handle. An app's own insides are its own
   file (the design editor's are styles/_design-editor.scss), so adding an app
   adds a partial rather than editing this one.

   HOW IT DIFFERS FROM THE CHAT DRAWER, and why. The chat drawer is deliberately
   inset between the header and the footer: it is sticky inside the <main>
   landmark so the sticky bar (which holds the only control that closes it) can
   never be covered. This one is the opposite by design — the design editor
   inside it exists to show a token change rippling through the ENTIRE page,
   header and footer included, so it is a fixed full-height rail beside all of
   it, and the page is pushed off the leading edge rather than squeezed between
   two pieces of chrome. Nothing about it is sticky.

   The push is padding on <body>, so the header and footer — which are body's
   own children and outside the drawer's host in every other sense — move with
   the content instead of underlapping the rail. A sticky box is positioned
   within its parent's content box, so .site-header respects the padding for
   free and keeps its toggle reachable at every scroll position.

   The one body child that is NOT the page is Zendesk's #preview-bar-container
   — chrome for the preview session rather than content being previewed — so it
   is exempted from the push and left spanning the viewport; see the rule below
   the rail. */
/* Registered so it can be TRANSITIONED. Both moves the drawer makes — the push
   on <body> and the preview bar's counter-push — are derived from this single
   animating value, which is what keeps them in lockstep: two separately
   transitioned properties would drift apart mid-animation and open (or close) a
   gap at the viewport edge for a couple of hundred milliseconds. That is not
   avoidable any other way here, because Zendesk sets `transition: margin .3s
   ease-in-out` inline on the preview bar and an inline declaration cannot be
   outrun from a stylesheet. */
@property --admin-apps-inset {
  syntax: "<length>";
  inherits: true;
  initial-value: 0px;
}
:root {
  /* Live width, driven by the resize handle (AdminApps.tsx writes it on the
       root element). The default matches DEFAULT_WIDTH in adminAppsState.ts; it
       only applies for the frame before React mounts. */
  --admin-apps-width: 380px;
  /* 0 unless the drawer is open — the value every layout below subtracts.
       Kept separate from the width so a closed drawer costs the page nothing
       and no rule needs to know about the open class. */
  --admin-apps-inset: 0px;
  /* On :root and unconditional, so the value eases back to 0 on close too —
       the open class is gone by then, and a transition declared under it would
       have been removed in the same style change that reset the value. */
  transition: --admin-apps-inset 240ms ease;
  /* How far Zendesk's own viewport-pinned chrome — the signed-in navigation
       bar, the theme-preview bar — reaches down the viewport, written by
       src/modules/admin-apps/topInset.ts and consumed by the rail below.
       Deliberately NOT transitioned: it is measured live, so it already
       arrives as every frame of Zendesk's own minimize/expand animation, and
       easing it again would make the rail lag the bar it is clearing. 0 until
       the drawer mounts, and on a page with no such chrome. */
  --admin-apps-top-inset: 0px;
}

html.admin-apps-open {
  /* Never wider than the viewport: at that point there is no page left to
       look at, which is the one thing the design editor exists to show. */
  --admin-apps-inset: min(var(--admin-apps-width), 100vw);
}

body {
  padding-inline-start: var(--admin-apps-inset);
}

/* The rail. Fixed, not sticky: it spans the viewport at every scroll position,
   which is what makes this a side-by-side rather than a panel that drifts
   through the page.

   Above the sticky header (z-index: 40, styles/_header.scss) and the chat
   drawer (20, styles/_chat-drawer.scss) — those live inside the pushed page and
   never overlap the rail once the padding lands, but they DO overlap during the
   240ms the padding takes to animate. Below #preview-bar-container (70), the
   one thing the rail is meant to slide under. */
.admin-apps-root {
  position: fixed;
  /* Starts below Zendesk's chrome rather than under it. Both bars paint above
       the rail on Zendesk's own z-indexes (the preview bar's is 2147483634),
       so a rail pinned to the viewport top puts .admin-apps-header — back,
       title and close — underneath them.

       On the RAIL, not on .admin-apps inside it: the panel is `block-size:
       100%` of this box, so insetting here brings the panel, its shadow and
       the resize handle down together, where insetting the panel alone would
       leave the handle and the rail's own edge running up behind the bar. */
  inset-block-start: var(--admin-apps-top-inset);
  inset-block-end: 0;
  inset-inline-start: 0;
  inline-size: min(var(--admin-apps-width), 100vw);
  z-index: 60;
  /* Closed, the rail is parked a full width off-screen and must not extend
       the page or raise a horizontal scrollbar. */
  pointer-events: none;
  transform: translateX(-100%);
  visibility: hidden;
  transition: transform 240ms ease, visibility 0s linear 240ms;
  /* Physical, so RTL slides out the other way. */
}
[dir=rtl] .admin-apps-root {
  transform: translateX(100%);
}
.admin-apps-root {
  /* Its own scheme, not the page's: a brand-wide dark brand declares
     color-scheme: dark for the document (its brand-head meta), which would
     darken the drawer's native controls, scrollbars and form fields while the
     editor has it light. The drawer's theme is the design editor's
     (design-editor/previewScope.ts stamps data-theme here). */
  color-scheme: light;
}
.admin-apps-root[data-theme=dark] {
  color-scheme: dark;
}

html.admin-apps-open .admin-apps-root {
  pointer-events: auto;
  transform: translateX(0);
  visibility: visible;
  transition: transform 240ms ease, visibility 0s linear 0s;
}

/* Zendesk's theme-preview bar. It is a plain in-flow block that Zendesk's own
   script collapses by setting `height` and a negative `margin-top` on it, which
   means the push above reaches it like any other body child — and it should
   not: the bar belongs to the preview session, not to the page under test, so
   it stays anchored to the viewport at full width however wide the rail is.

   Undo exactly the push, no more. `100%` here is <body>'s content box, i.e. the
   viewport minus the inset, so adding the inset back lands on the viewport
   width at every frame of the animation rather than only at the ends — nothing
   transient overhangs the trailing edge and raises a horizontal scrollbar.

   `position: relative` adds no offset; it is only there to make the z-index
   apply, and with it the bar (and everything Zendesk renders inside it) paints
   above the rail's 60 — so the drawer slides UNDER the bar instead of over it. */
#preview-bar-container {
  position: relative;
  z-index: 70;
  margin-inline-start: calc(-1 * var(--admin-apps-inset));
  inline-size: calc(100% + var(--admin-apps-inset));
}

@media (prefers-reduced-motion: reduce) {
  :root,
  .admin-apps-root {
    transition: none;
  }
}
/* ── Panel ─────────────────────────────────────────────────────────────────── */
.admin-apps {
  display: flex;
  flex-direction: column;
  block-size: 100%;
  /* The drawer keeps the page's own brand and is excluded from the design
       editor's overrides (see design-editor/previewScope.ts) — so these read
       the UNEDITED aliases and the panel stays legible no matter what the page
       has been retuned to. */
  background: var(--colors-bg-base, #fff);
  color: var(--colors-fg-default, #0e0e0e);
  border-inline-end: 1px solid var(--colors-border-default, #e7e7e7);
  box-shadow: 8px 0 24px oklch(0% 0 0deg / 0.08);
  /* Set here rather than in an app's own file: the rail is narrow, and every
       app inside it inherits the same compact scale. */
  font-size: 13px;
}

/* The one bar every app shares. Back (absent on the app grid), the app's title,
   and close — so backing out of an app never means hunting for a control the
   app happened to place somewhere else. */
.admin-apps-header {
  display: flex;
  align-items: center;
  gap: 8px;
  padding: 10px 14px;
  border-block-end: 1px solid var(--colors-border-default, #e7e7e7);
}

/* Takes the slack so the close button stays pinned to the trailing edge whether
   or not the back button is there. `min-inline-size: 0` lets a long app title
   ellipsize instead of pushing the close button out of a 280px rail. */
.admin-apps-title {
  flex: 1;
  min-inline-size: 0;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.admin-apps-close {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  inline-size: 28px;
  block-size: 28px;
  flex: none;
  padding: 0;
  border: 0;
  border-radius: 4px;
  background: none;
  color: inherit;
  cursor: pointer;
}
.admin-apps-close:hover {
  background: var(--colors-bg-default, #f2f2f2);
}

/* ── App grid (home) ─────────────────────────────────────────────────────────
   Scrolls in its own right, so a future list of apps longer than the rail
   behaves like the apps themselves do rather than clipping. */
.admin-apps-home {
  flex: 1;
  min-block-size: 0;
  overflow-y: auto;
  overscroll-behavior: contain;
  padding: 14px;
}

/* Two columns, fixed — not auto-fit. The rail is resizable (280–720px), and an
   auto-fitting grid would reflow from one column to three while the user drags
   the edge: a launcher whose layout moves as you reach for it. Two is the count
   that fits at the narrowest width and still reads as a grid at the widest. */
.admin-apps-grid {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: 10px;
  margin: 0;
  padding: 0;
  list-style: none;
}

/* The <ul>/<li> is for semantics only; the tile is the whole item. */
.admin-apps-grid-item {
  display: flex;
}

.admin-apps-tile {
  display: flex;
  flex: 1;
  flex-direction: column;
  align-items: center;
  gap: 6px;
  /* Icon above a label, both centred, so the grid scans as a launcher rather
       than as a list of settings rows. */
  padding: 16px 10px;
  border: 1px solid var(--colors-border-default, #e7e7e7);
  border-radius: 8px;
  background: none;
  color: inherit;
  font: inherit;
  text-align: center;
  cursor: pointer;
  transition: background-color 120ms ease, border-color 120ms ease;
}
.admin-apps-tile:hover {
  background: var(--colors-bg-default, #f2f2f2);
  border-color: var(--colors-border-emphasis, #b8b8b8);
}
.admin-apps-tile:focus-visible {
  outline: 2px solid var(--colors-fg-accent, #0862d1);
  outline-offset: 2px;
}

.admin-apps-tile-icon {
  display: flex;
  align-items: center;
  justify-content: center;
  inline-size: 44px;
  block-size: 44px;
  border-radius: 8px;
  background: var(--colors-bg-default, #f2f2f2);
  color: var(--colors-fg-default, #0e0e0e);
}

.admin-apps-tile-title {
  /* A two-word title in a 280px rail's half-column wraps; keep it readable
       rather than clipped, and let the tile grow. */
  line-height: 1.25;
}

.admin-apps-tile-doc {
  line-height: 1.3;
}

.admin-apps-empty {
  padding: 14px;
}

/* ── Resize handle ─────────────────────────────────────────────────────────── */
.admin-apps-resize {
  position: absolute;
  inset-block: 0;
  inset-inline-end: -3px;
  inline-size: 7px;
  cursor: col-resize;
  /* Above the panel's own content so a drag started on the edge is never
       stolen by a control sitting under it. */
  z-index: 1;
  /* Invisible until reached for: a permanent divider beside the panel's own
       border reads as a rendering bug. */
  background: transparent;
  touch-action: none;
}
.admin-apps-resize:hover, .admin-apps-resize:active {
  background: var(--colors-fg-accent, #0862d1);
  opacity: 0.35;
}
.admin-apps-resize {
  /* It is focusable (arrow keys resize the drawer), and an invisible control
     with focus on it is indistinguishable from focus having gone nowhere — so
     when it is reached by keyboard it shows itself. */
}
.admin-apps-resize:focus-visible {
  background: var(--colors-fg-accent, #0862d1);
  opacity: 1;
  outline: none;
}

/* ── Header toggle ─────────────────────────────────────────────────────────────
   The button lives in templates/header.hbs (inside the admin guard, inside
   .navbar-actions) and is wired by src/adminAppsToggle.js. It takes the bar's
   own foreground and the same aria-pressed colour inversion .navbar-toggle-chat
   uses in styles/_header.scss, so it reads as part of the bar rather than as a
   bolted-on dev affordance.

   `order: 1` is what puts it to the RIGHT of the chat toggle (or the CTA, on a
   brand with no chatbot). Those are appended to .navbar-actions at runtime by
   src/header.js while this button is server-rendered, so DOM order alone would
   put it first — order sidesteps the race instead of trying to win it.

   Square, and sized off the .btn.lg beside it (--size-btn-lg, the same token
   Button's large size uses) so the two line up on the bar's centre line rather
   than one riding high. */
[data-rosetta] [data-navbar] .navbar-actions .navbar-toggle-admin {
  order: 1;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  inline-size: var(--size-btn-lg, 44px);
  block-size: var(--size-btn-lg, 44px);
  flex: none;
  padding: 0;
  border: 0;
  border-radius: var(--radius-box, 3px);
  background: none;
  color: var(--color-base-content, #fff);
  cursor: pointer;
}
[data-rosetta] [data-navbar] .navbar-actions .navbar-toggle-admin .hc-icon,
[data-rosetta] [data-navbar] .navbar-actions .navbar-toggle-admin [class^=icon-] {
  --icon-size: 20px;
}

[data-rosetta] [data-navbar] .navbar-actions .navbar-toggle-admin:hover {
  background: oklch(from var(--color-base-content, #fff) l c h/12%);
}

[data-rosetta] [data-navbar] .navbar-actions .navbar-toggle-admin:focus-visible {
  outline: 2px solid currentcolor;
  outline-offset: 2px;
}

[data-rosetta] [data-navbar] .navbar-actions .navbar-toggle-admin[aria-pressed=true] {
  background: var(--color-base-content, #fff);
  color: var(--color-base-100, #0e0e0e);
}

/* ── Design editor ───────────────────────────────────────────────────────────
   The insides of ONE admin app (src/modules/design-editor): the brand/theme
   scope bar, the token controls, the CSS view and the brand dialogs.

   Everything around it belongs to the drawer that hosts it — the rail, the push
   it applies to the page, the title bar with its back and close controls, and
   the resize handle are all in styles/_admin-apps.scss, and none of them are
   named here. So this file describes the tool and nothing about where it is
   mounted, which is what lets a second admin app land as a sibling partial
   rather than as an edit to this one. */
/* Fills the rail below the drawer's title bar. `min-block-size: 0` is
   load-bearing in a column flex container: without it this refuses to shrink
   below its content and the editor's own footer is pushed off the bottom of the
   viewport. Colour, border and shadow are the drawer's (.admin-apps) — an app
   paints its own contents, not the panel. */
.design-editor {
  display: flex;
  flex: 1;
  min-block-size: 0;
  flex-direction: column;
}

.design-editor-scopes,
.design-editor-modes,
.design-editor-search,
.design-editor-footer {
  padding: 10px 14px;
  border-block-end: 1px solid var(--colors-border-default, #e7e7e7);
}

.design-editor-scopes {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 8px;
}

/* Label, dropdown, "+", and (for a custom brand) the trash — four things in a
   rail that narrows to 280px, so the group takes the free space and the trigger
   is the one item allowed to give some back. Without `min-inline-size: 0` a flex
   item refuses to shrink below its content and the theme toggle on the other end
   of .design-editor-scopes gets pushed out of the panel. */
.design-editor-scope-group {
  display: flex;
  align-items: center;
  flex: 1;
  min-inline-size: 0;
  gap: 6px;
}

/* The scrolling middle. `min-block-size: 0` is load-bearing in a column flex
   container — without it the body refuses to shrink below its content and the
   footer is pushed off the bottom of the viewport. */
.design-editor-body {
  flex: 1;
  min-block-size: 0;
  overflow-y: auto;
  overscroll-behavior: contain;
}

.design-editor-layer {
  padding: 12px 14px 4px;
}

.design-editor-layer-doc {
  margin: 2px 0 8px;
}

.design-editor-section-doc {
  margin: 0 0 8px;
}

.design-editor-footer {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 8px;
  border-block-end: 0;
  border-block-start: 1px solid var(--colors-border-default, #e7e7e7);
}

.design-editor-actions {
  display: flex;
  gap: 6px;
}

/* ── Token rows ────────────────────────────────────────────────────────────── */
.design-editor-token {
  padding: 8px 0;
  border-block-start: 1px solid var(--colors-border-default, #e7e7e7);
}
.design-editor-token:first-of-type {
  border-block-start: 0;
}

/* A modified token gets a leading rule rather than a badge: the list is long and
   scanning for "what have I changed" should not mean reading it. */
.design-editor-token[data-modified] {
  margin-inline-start: -8px;
  padding-inline-start: 6px;
  border-inline-start: 2px solid var(--colors-fg-accent, #0862d1);
}

/* Color tokens put the name and the swatch on one line instead of stacking
   them — there are a lot of these rows, and the label alone rarely needs its
   own line. The swatch is a grid item in its own right (see ColorControl,
   which renders it as a sibling of the panel rather than wrapping both), so
   it stays put in the right-hand column when the panel opens below it
   instead of sliding down to sit under the swatch's old spot. */
.design-editor-token[data-color] {
  display: grid;
  grid-template-columns: 1fr auto;
  align-items: center;
  gap: 4px 8px;
}
.design-editor-token[data-color] .design-editor-control-panel {
  grid-column: 1/-1;
}

.design-editor-token-head {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: 8px;
}

.design-editor-token-name {
  font-family: var(--font-sqsp-mono, monospace);
  font-size: 11px;
  word-break: break-all;
}

.design-editor-token-reset {
  flex: none;
  padding: 0;
  border: 0;
  background: none;
  color: var(--colors-fg-accent, #0862d1);
  font: inherit;
  font-size: 11px;
  cursor: pointer;
  text-decoration: underline;
}

.design-editor-control {
  display: flex;
  flex-direction: column;
  gap: 6px;
}

.design-editor-control-row {
  display: flex;
  align-items: center;
  gap: 6px;
}
.design-editor-control-row > :last-child {
  flex: 1;
  min-inline-size: 0;
}

.design-editor-control-panel {
  display: flex;
  flex-direction: column;
  gap: 8px;
  padding: 8px;
  border: 1px solid var(--colors-border-default, #e7e7e7);
  border-radius: 6px;
}

.design-editor-palette-swatch {
  flex: none;
  padding: 0;
  border: 1px solid var(--colors-border-default, #e7e7e7);
  border-radius: 4px;
  cursor: pointer;
}

.design-editor-palette {
  display: flex;
  flex-direction: column;
  gap: 6px;
  max-block-size: 220px;
  overflow-y: auto;
}

.design-editor-palette-ramp {
  display: flex;
  flex-direction: column;
  gap: 2px;
}

.design-editor-palette-swatches {
  display: flex;
  flex-wrap: wrap;
  gap: 3px;
}

.design-editor-palette-swatch {
  inline-size: 28px;
  block-size: 28px;
  display: flex;
  align-items: center;
  justify-content: center;
}
.design-editor-palette-swatch[aria-pressed=true] {
  outline: 2px solid var(--colors-fg-accent, #0862d1);
  outline-offset: 1px;
}

.design-editor-palette-swatch-label {
  font-size: 8px;
  line-height: 1;
  font-variant-numeric: tabular-nums;
  color: #fff;
  mix-blend-mode: difference;
  pointer-events: none;
}

/* ── CSS mode ──────────────────────────────────────────────────────────────── */
.design-editor-css {
  display: flex;
  flex-direction: column;
  gap: 8px;
  block-size: 100%;
  padding: 12px 14px;
}

.design-editor-css-hint {
  margin: 0;
  font-size: 11px;
}

/* CodeInput mounts a CodeMirror view, which sizes itself to its content unless
   told otherwise. Give it the remaining column height and let it scroll, so the
   editor fills the rail instead of collapsing to two lines when empty. */
.design-editor-code {
  flex: 1;
  min-block-size: 0;
  overflow: auto;
  border: 1px solid var(--colors-border-default, #e7e7e7);
  border-radius: 6px;
}

.design-editor-css-actions {
  display: flex;
  justify-content: flex-end;
}

/* ── Controls mode ─────────────────────────────────────────────────────────── */
/* Sits between the scrolling token list and the footer, always visible rather
   than scrolling away with the list — the same "Apply" gesture as the CSS
   view's, just outside the scroll container since Controls has no single
   flex-filling element to pin it to the bottom of like CodeInput does. */
.design-editor-controls-actions {
  display: flex;
  justify-content: flex-end;
  padding: 10px 14px;
  border-block-end: 1px solid var(--colors-border-default, #e7e7e7);
}

/* ── Brand dialogs ─────────────────────────────────────────────────────────────
   The "New brand" and "Delete brand" popups (src/modules/design-editor/
   BrandDialogs.tsx). They cover the RAIL, not the viewport, and that is not a
   compromise made for lack of a portal — it is the only correct option here.
   The dialogs must live inside the drawer's own
   [data-rosetta][data-admin-app] subtree, because that is the one subtree the
   override stylesheet excludes and the preview's MutationObserver leaves alone;
   anywhere else they would inherit the user's in-progress overrides and could
   paint themselves unreadable. And .admin-apps-root carries a `transform` while
   open, which makes it a containing block for `position: fixed` — so a
   viewport-covering scrim isn't reachable from in here regardless.

   The panel is the modal's world, in other words, and the scrim says so. */
.design-editor-dialog-scrim {
  position: absolute;
  inset: 0;
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 14px;
  /* Above the drawer's resize handle (z-index 1) and every control in the
       panel. */
  z-index: 2;
}

.design-editor-dialog-backdrop {
  position: absolute;
  inset: 0;
  background: oklch(0% 0 0deg / 0.4);
}

.design-editor-dialog {
  position: relative;
  display: flex;
  flex-direction: column;
  gap: 10px;
  inline-size: 100%;
  max-block-size: 100%;
  overflow-y: auto;
  padding: 14px;
  border-radius: 8px;
  /* Same unedited aliases the panel itself uses — see .design-editor. */
  background: var(--colors-bg-base, #fff);
  color: var(--colors-fg-default, #0e0e0e);
  border: 1px solid var(--colors-border-default, #e7e7e7);
  box-shadow: 0 8px 24px oklch(0% 0 0deg / 0.18);
}

.design-editor-dialog-form {
  display: flex;
  flex-direction: column;
  gap: 10px;
}

.design-editor-dialog-hint {
  margin: 0;
  font-size: 11px;
}
.design-editor-dialog-hint code {
  font-family: var(--font-sqsp-mono, monospace);
  word-break: break-all;
}

.design-editor-dialog-actions {
  display: flex;
  justify-content: flex-end;
  gap: 6px;
}

/* ── Dynamic content inspector ────────────────────────────────────────────────
   The insides of one admin app (src/modules/dc-inspector), plus the two things
   it puts on the PAGE while inspecting: the outline over the hovered element
   and the crosshair cursor. The drawer around the panel is
   styles/_admin-apps.scss. */
.dc-inspector {
  display: flex;
  flex: 1;
  min-block-size: 0;
  flex-direction: column;
}

.dc-inspector-toolbar {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 8px;
  padding: 10px 14px;
  border-block-end: 1px solid var(--colors-border-default, #e7e7e7);
}

/* The scrolling middle; `min-block-size: 0` lets it shrink inside the column
   flex container instead of pushing past the bottom of the rail. */
.dc-inspector-body {
  flex: 1;
  min-block-size: 0;
  overflow-y: auto;
  overscroll-behavior: contain;
  padding: 12px 14px;
}

.dc-inspector-selection {
  margin: 0 0 10px;
  overflow-wrap: anywhere;
}

/* Where the text comes from, for an element no dc key renders. */
.dc-inspector-source {
  margin: 0 0 6px;
}

.dc-inspector-matches {
  margin: 0;
  padding: 0;
  list-style: none;
}

.dc-inspector-match {
  padding: 10px 0;
  border-block-start: 1px solid var(--colors-border-default, #e7e7e7);
}

.dc-inspector-match-key {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 6px;
}
.dc-inspector-match-key code {
  min-inline-size: 0;
  font-family: var(--font-sqsp-mono, monospace);
  font-size: 12px;
  overflow-wrap: anywhere;
}

.dc-inspector-match-text {
  margin: 4px 0 6px;
  overflow-wrap: anywhere;
}

.dc-inspector-match-meta {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 10px;
  font-size: 12px;
}

/* The links out of a match row sit in the row's text colour and only
   underline on hover or focus, so the pointer shows which one it is on and
   nothing else competes with the badge. */
.dc-inspector-zendesk-link,
.dc-inspector-cms-link {
  color: inherit;
  text-decoration: none;
}
.dc-inspector-zendesk-link:hover, .dc-inspector-zendesk-link:focus-visible,
.dc-inspector-cms-link:hover,
.dc-inspector-cms-link:focus-visible {
  text-decoration: underline;
}

.dc-inspector-badge {
  padding: 1px 6px;
  border: 1px solid var(--colors-border-default, #e7e7e7);
  border-radius: 999px;
}

.dc-inspector-badge-exact {
  border-color: var(--colors-fg-accent, #0862d1);
  color: var(--colors-fg-accent, #0862d1);
}

/* A URL match: which attribute held the dc value. */
.dc-inspector-badge-url {
  color: var(--colors-fg-muted, #666);
}

/* "Text" and "URL" above their groups of matches. */
.dc-inspector-group-heading {
  margin: 10px 0 4px;
}

/* The outline over the hovered page element. Fixed and measured from the
   element's client rect, so it never affects the page's layout; it ignores the
   pointer so the element under it stays the event target. Just below the
   drawer's rail (z-index 60) and above the sticky header (40). */
.dc-inspector-highlight {
  position: fixed;
  z-index: 59;
  pointer-events: none;
  box-sizing: border-box;
  outline: 2px solid var(--colors-fg-accent, #0862d1);
  background: rgba(8, 98, 209, 0.08);
}

/* Every body child but the drawer, which keeps its own cursors. */
html.dc-inspector-picking body > :not(.admin-apps-root),
html.dc-inspector-picking body > :not(.admin-apps-root) * {
  cursor: crosshair;
}

.request-form,
.ck-body-wrapper {
  --ck-border-radius: var(--radius-sqsp-1, 3px);
  --ck-color-base-background: var(--color-base-100, #fff);
  --ck-color-base-border: var(--colors-border-default, #e0e0e0);
  --ck-color-base-text: var(--colors-fg-default, #0e0e0e);
  --ck-color-text: var(--colors-fg-default, #0e0e0e);
  --ck-color-focus-border: var(--colors-border-accent, #1170ff);
  --ck-color-toolbar-background: var(--color-base-100, #fff);
  --ck-color-toolbar-border: var(--colors-border-default, #e0e0e0);
  --ck-color-button-default-background: transparent;
  --ck-color-button-default-color: var(--colors-fg-default, #0e0e0e);
  --ck-color-button-default-hover-background: var(--color-base-200, #f6f6f6);
  --ck-color-button-default-active-background: var(--color-base-200, #f6f6f6);
  --ck-color-button-on-background: var(--color-base-200, #f6f6f6);
  --ck-color-button-on-hover-background: var(--color-base-200, #f6f6f6);
  --ck-color-button-on-color: var(--colors-fg-accent, #1170ff);
  --ck-color-dropdown-panel-background: var(--color-base-100, #fff);
  --ck-color-dropdown-panel-border: var(--colors-border-default, #e0e0e0);
  --ck-color-list-background: var(--color-base-100, #fff);
}

.request-form .ck.ck-editor {
  width: 100%;
}
.request-form .ck.ck-toolbar,
.request-form .ck-content,
.request-form .ck.ck-editor__editable {
  font-family: var(--font-sqsp-ui);
}
.request-form .ck.ck-editor__editable_inline {
  min-height: 132px;
}

.request-form [data-garden-id="forms.file_upload"] {
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: var(--spacing-sqsp-2, 11px);
  width: 100%;
  padding: var(--spacing-sqsp-4, 22px) var(--spacing-sqsp-4, 22px) 26px;
  border: 1px dashed var(--color-base-500);
  border-radius: 8px;
  background: var(--color-base-100);
  color: var(--color-base-content);
  font-family: var(--font-sqsp-ui);
  font-size: 0.875rem;
  line-height: 22px;
  text-align: center;
}
@media (max-width: 768px) {
  .request-form [data-garden-id="forms.file_upload"] {
    font-size: 1rem;
  }
}
@media (max-width: 1208px) {
  html.chat-drawer-pushed .request-form [data-garden-id="forms.file_upload"] {
    font-size: 1rem;
  }
}
.request-form [data-garden-id="forms.file_upload"]:hover, .request-form [data-garden-id="forms.file_upload"]:active, .request-form [data-garden-id="forms.file_upload"]:focus-visible, .request-form [data-garden-id="forms.file_upload"][data-dragging] {
  border-color: var(--color-base-content-muted);
  background: var(--color-base-200);
  color: var(--color-base-content);
}
.request-form .attachments-dropzone__icon {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 36px;
  height: 36px;
  border-radius: 50%;
  background: var(--color-base-300);
  color: var(--color-base-content);
}
.request-form [data-garden-id="forms.input_label"],
.request-form [data-garden-id="forms.input_hint"] {
  font-family: var(--font-sqsp-ui);
  font-size: 0.75rem;
  line-height: 16px;
}
.request-form [data-garden-id="forms.input_label"] {
  display: block;
  font-weight: 500;
  color: var(--color-base-content);
}
.request-form [data-garden-id="forms.input_hint"] {
  color: var(--color-base-content-muted);
}
.request-form [data-garden-id="forms.file"] {
  border-radius: var(--radius-sqsp-1, 3px);
  border-color: var(--colors-border-default, #e0e0e0);
  font-family: var(--font-sqsp-ui);
}

.search-hero .breadcrumbs {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 6px;
  margin: 0 0 18px;
  padding: 0;
  list-style: none;
  font-family: var(--font-sqsp-ui);
  font-size: 0.75rem;
  font-weight: 500;
  line-height: 16px;
}
.search-hero .breadcrumbs li {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  color: color-mix(in srgb, var(--color-secondary-content) 72%, transparent);
}
.search-hero .breadcrumbs li + li::before {
  content: "/";
  color: color-mix(in srgb, var(--color-secondary-content) 50%, transparent);
}
.search-hero .breadcrumbs a {
  color: var(--color-secondary-content);
  text-decoration: underline;
  text-underline-position: from-font;
}
.search-hero .breadcrumbs a:hover, .search-hero .breadcrumbs a:focus-visible {
  text-decoration: none;
}
.search-hero .breadcrumbs a[aria-current=page] {
  color: color-mix(in srgb, var(--color-secondary-content) 72%, transparent);
  text-decoration: none;
  pointer-events: none;
  cursor: default;
}

.request-page .breadcrumbs,
.category-page .breadcrumbs,
.section-page .breadcrumbs,
.search-results-page .breadcrumbs,
.article-page .breadcrumbs {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 6px;
  margin: 0;
  padding: 0;
  list-style: none;
  font-family: var(--font-sqsp-ui);
  font-size: 0.75rem;
  font-weight: 500;
  line-height: 16px;
}
.request-page .breadcrumbs li,
.category-page .breadcrumbs li,
.section-page .breadcrumbs li,
.search-results-page .breadcrumbs li,
.article-page .breadcrumbs li {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  color: var(--color-base-content-muted);
}
.request-page .breadcrumbs li + li::before,
.category-page .breadcrumbs li + li::before,
.section-page .breadcrumbs li + li::before,
.search-results-page .breadcrumbs li + li::before,
.article-page .breadcrumbs li + li::before {
  content: "/";
  color: var(--color-base-400);
}
.request-page .breadcrumbs a,
.category-page .breadcrumbs a,
.section-page .breadcrumbs a,
.search-results-page .breadcrumbs a,
.article-page .breadcrumbs a {
  color: var(--color-base-content);
  text-decoration: underline;
  text-underline-position: from-font;
}
.request-page .breadcrumbs a:hover, .request-page .breadcrumbs a:focus-visible,
.category-page .breadcrumbs a:hover,
.category-page .breadcrumbs a:focus-visible,
.section-page .breadcrumbs a:hover,
.section-page .breadcrumbs a:focus-visible,
.search-results-page .breadcrumbs a:hover,
.search-results-page .breadcrumbs a:focus-visible,
.article-page .breadcrumbs a:hover,
.article-page .breadcrumbs a:focus-visible {
  text-decoration: none;
}
.request-page .breadcrumbs a[aria-current=page],
.category-page .breadcrumbs a[aria-current=page],
.section-page .breadcrumbs a[aria-current=page],
.search-results-page .breadcrumbs a[aria-current=page],
.article-page .breadcrumbs a[aria-current=page] {
  color: var(--color-base-content-muted);
  text-decoration: none;
  pointer-events: none;
  cursor: default;
}

.section-page .breadcrumbs li:last-child a,
.search-results-page .breadcrumbs li:last-child a {
  color: var(--color-base-content-muted);
  text-decoration: none;
  pointer-events: none;
  cursor: default;
}

:root {
  --hc-nav-secondary-height: 0px;
}

:root:has(.nav-secondary) {
  --hc-nav-secondary-height: 77px;
}

.nav-secondary {
  position: sticky;
  inset-block-start: var(--hc-header-height);
  z-index: 10;
  display: flex;
  align-items: center;
  gap: 10px;
  min-block-size: 77px;
  padding: var(--spacing-sqsp-3) var(--spacing-sqsp-6);
  border-bottom: 1px solid var(--color-base-400);
  background: var(--color-base-100);
}
@media (max-width: 743px) {
  .nav-secondary {
    padding-inline: var(--spacing-sqsp-3);
  }
}

.nav-secondary > :first-child {
  flex: 1;
  min-width: 0;
}

.nav-secondary .breadcrumbs {
  flex-wrap: nowrap;
  min-width: 0;
  overflow: hidden;
}
.nav-secondary .breadcrumbs li {
  min-width: 0;
  padding-block: 8px;
  white-space: nowrap;
}
.nav-secondary .breadcrumbs a {
  overflow: hidden;
  text-overflow: ellipsis;
}
@media (max-width: 1024px) {
  .nav-secondary .breadcrumbs li:last-child:not(:first-child) {
    display: none;
  }
}

.nav-secondary-search {
  flex: 0 0 209px;
  min-width: 0;
}
@media (max-width: 1024px) {
  .nav-secondary-search {
    flex-basis: 212px;
  }
}
.search-results-page .nav-secondary-search {
  flex-basis: 438px;
}
@media (max-width: 1024px) {
  .search-results-page .nav-secondary-search {
    flex-basis: 225px;
  }
}
.nav-secondary-search .search {
  gap: var(--spacing-sqsp-1);
  min-height: 44px;
  padding: 0 var(--spacing-sqsp-2);
  background: var(--color-base-300);
  border-radius: var(--radius-sqsp-1);
}
.nav-secondary-search .search:focus-within {
  outline: 2px solid var(--color-base-content);
  outline-offset: 1px;
}
.nav-secondary-search .input-group {
  flex: 1;
  min-width: 0;
  width: auto;
}
.nav-secondary-search .input-icon {
  inset-inline-start: 0;
  width: 16px;
  height: 16px;
  color: var(--color-base-content);
  --icon-size: 100%;
}
.nav-secondary-search .input {
  min-height: 44px;
  padding-inline: calc(16px + var(--spacing-sqsp-1)) 0;
  border: 0;
  background: transparent;
  font-family: var(--font-sqsp-ui);
  font-size: 14px;
  line-height: 22px;
  color: var(--color-base-content);
}
.nav-secondary-search .input::placeholder {
  color: var(--color-base-content-muted);
}
.nav-secondary-search .input:focus, .nav-secondary-search .input:focus-visible {
  outline: none;
  box-shadow: none;
}
.nav-secondary-search .input::-webkit-search-cancel-button {
  display: none;
  -webkit-appearance: none;
  appearance: none;
}
.nav-secondary-search .clear-button {
  display: none;
  align-items: center;
  justify-content: center;
  align-self: stretch;
  padding: 0;
  border: 0;
  background: none;
  color: var(--color-base-content);
  cursor: pointer;
}
.nav-secondary-search .search-has-value .clear-button {
  display: flex;
}

[data-rosetta][data-brand=scheduling] .nav-secondary-search .search {
  background: color-mix(in oklch, var(--color-secondary) 8%, var(--color-base-100));
}
[data-rosetta][data-brand=scheduling] .nav-secondary-search .input-icon,
[data-rosetta][data-brand=scheduling] .nav-secondary-search .input {
  color: var(--color-secondary);
}

.nav-secondary-search-toggle {
  display: none;
}

@media (max-width: 743px) {
  .nav-secondary[data-search-toggle] .nav-secondary-search-toggle {
    display: inline-flex;
    border-radius: var(--radius-sqsp-1);
  }
  .nav-secondary[data-search-toggle] .nav-secondary-search {
    display: none;
  }
  .nav-secondary[data-search-toggle][data-search-open] > :first-child,
  .nav-secondary[data-search-toggle][data-search-open] .nav-secondary-search-toggle {
    display: none;
  }
  .nav-secondary[data-search-toggle][data-search-open] .nav-secondary-search {
    display: block;
    flex: 1 1 auto;
  }
}
.article-list {
  list-style: none;
  margin: 0;
  padding: 0;
  display: flex;
  flex-direction: column;
  gap: 24px;
}

.article-list-item {
  display: flex;
  align-items: center;
  gap: 8px;
}

.article-list-link {
  font-size: 1rem;
  line-height: 1.375;
  color: inherit;
  text-decoration: none;
}
.article-list-link:hover, .article-list-link:focus-visible {
  text-decoration: underline;
}

.category-page {
  background: var(--color-base-100);
}

.category-page-inner {
  max-width: 1152px;
  margin-inline: auto;
  padding: var(--spacing-sqsp-8, 44px) 0 77px;
}

.category-layout {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: var(--spacing-sqsp-8, 44px);
  align-items: start;
}
@media (max-width: 900px) {
  .category-layout {
    grid-template-columns: minmax(0, 1fr);
    gap: var(--spacing-sqsp-4, 22px);
  }
}
@media (max-width: 1340px) {
  html.chat-drawer-pushed .category-layout {
    grid-template-columns: minmax(0, 1fr);
    gap: var(--spacing-sqsp-4, 22px);
  }
}

.category-heading {
  padding: var(--spacing-sqsp-2, 11px) 0;
  color: var(--color-base-content);
}

.category-title {
  margin: 0;
  font-family: var(--font-sqsp-ui);
  font-size: var(--text-sqsp-9, 40px);
  font-weight: 400;
  line-height: 44px;
  letter-spacing: -0.03em;
}

.category-description {
  display: none;
  max-width: 561px;
  margin: var(--spacing-sqsp-2, 11px) 0 0;
  font-family: var(--font-sqsp-ui);
  font-size: 1rem;
  font-weight: 500;
  line-height: 22px;
  color: var(--color-base-content-muted);
}

.category-sections .accordion-item {
  border-top: 1px solid var(--color-base-400);
}
.category-sections .accordion-item:last-child {
  border-bottom: 1px solid var(--color-base-400);
}
.category-sections .accordion-header {
  gap: 10px;
  padding: var(--spacing-sqsp-4, 22px) 0;
}
.category-sections .accordion-title {
  font-family: var(--font-sqsp-ui);
  font-size: var(--text-sqsp-6, 22px);
  font-weight: 500;
  line-height: 28px;
  letter-spacing: -0.02em;
}
.category-sections .accordion-icon .icon-chevron-large-down {
  position: absolute;
  inset: 0;
  --icon-size: 100%;
}
.category-sections .accordion-header[aria-expanded=true] .accordion-icon {
  transform: rotate(180deg);
}
.category-sections .accordion-body-content {
  padding-bottom: var(--spacing-sqsp-4, 22px);
}
.category-sections .accordion-header[aria-expanded=false] + .accordion-body .accordion-body-content {
  padding-bottom: 0;
}
.category-sections .article-list {
  gap: 0;
}
.category-sections .article-list-item {
  padding: var(--spacing-sqsp-2, 11px) 0;
}
.category-sections .article-list-link {
  font-family: var(--font-sqsp-ui);
  font-size: 14px;
  font-weight: 500;
  line-height: 22px;
  letter-spacing: -0.01em;
}

.category-sections .see-all-articles {
  margin: var(--spacing-sqsp-3, 16px) 0;
  --btn-bg: var(--color-base-300);
  --btn-border-color: var(--btn-bg);
  --btn-fg: var(--color-base-content);
  --btn-bg-hover: var(--color-base-400);
  --btn-border-hover: var(--btn-bg-hover);
  --btn-fg-hover: var(--btn-fg);
}

[data-rosetta][data-brand=scheduling] .category-title,
[data-rosetta][data-brand=scheduling] .category-sections .accordion-header,
[data-rosetta][data-brand=scheduling] .category-sections .article-list-link {
  color: var(--color-secondary);
}
[data-rosetta][data-brand=scheduling] .category-sections .see-all-articles {
  --btn-bg: var(--color-secondary);
  --btn-border-color: var(--btn-bg);
  --btn-fg: var(--color-secondary-content);
  --btn-bg-hover: color-mix(in oklch, var(--color-secondary) 85%, black);
  --btn-border-hover: var(--btn-bg-hover);
  --btn-fg-hover: var(--color-secondary-content);
}

.section-page,
.search-results-page {
  background: var(--color-base-100);
}

.section-page-inner {
  max-width: 1152px;
  margin-inline: auto;
  padding: var(--spacing-sqsp-8, 44px) 0 77px;
}

.section-content {
  color: var(--color-base-content);
}

.section-title {
  margin: 0;
  font-family: var(--font-sqsp-ui);
  font-size: var(--text-sqsp-9, 40px);
  font-weight: 400;
  line-height: 44px;
  letter-spacing: -0.03em;
}

.section-page .section-list {
  list-style: none;
  margin: 33px 0 0;
  padding: 0;
}
.section-page .section-list-item a {
  display: inline-block;
  padding: var(--spacing-sqsp-2, 11px) 0;
  color: inherit;
  text-decoration: none;
}
.section-page .section-list-item a:hover, .section-page .section-list-item a:focus-visible {
  text-decoration: underline;
}
.section-page .article-list {
  gap: 0;
  margin-top: 33px;
}
.section-page .article-list-item {
  padding: var(--spacing-sqsp-2, 11px) 0;
}
.section-page .section-list-item a,
.section-page .article-list-link {
  font-family: var(--font-sqsp-ui);
  font-size: 14px;
  font-weight: 500;
  line-height: 22px;
  letter-spacing: -0.01em;
}

.pagination,
.pagination-list {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 24px;
}

.pagination {
  margin: 32px 0 0;
}

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

.pagination-prev-link,
.pagination-next-link {
  display: inline-flex;
  gap: 4px;
}

.pagination-first,
.pagination-last {
  display: none;
}

.pagination-prev-link,
.pagination-next-link {
  color: inherit;
  font-size: 0.875rem;
  text-decoration: none;
}
.pagination-prev-link:hover, .pagination-prev-link:focus-visible,
.pagination-next-link:hover,
.pagination-next-link:focus-visible {
  text-decoration: underline;
}

[data-rosetta][data-brand=scheduling] .section-title,
[data-rosetta][data-brand=scheduling] .section-content .section-list-item a,
[data-rosetta][data-brand=scheduling] .section-content .article-list-link {
  color: var(--color-secondary);
}

.error-page {
  display: flex;
  justify-content: center;
  padding: 96px 24px 160px;
}
@media (max-width: 800px) {
  .error-page {
    padding: 64px 24px 96px;
  }
}

.error-page-content {
  max-width: 640px;
  text-align: center;
}
.error-page-content > * {
  margin: 0;
}

.error-page-title {
  margin-bottom: 48px;
}
.error-page-title::first-letter {
  text-transform: uppercase;
}

.error-page-content > h2 {
  margin-bottom: 24px;
}

.error-page-message {
  margin-bottom: 32px;
}