/* Crystal Clear Skin & Body Spa — post-export repairs.
 *
 * Deploy gotcha: Cloudflare fronts this host and caches per full URL,
 * INCLUDING the ?v= query — and it caches 404s for 4 hours. Requesting a
 * freshly stamped asset URL before Hostinger finishes syncing poisons that
 * URL for every visitor. After a push, verify with a throwaway query param
 * (?check=<timestamp>) first; only hit the real ?v= URL once that serves
 * the new content. (This header exists because v=104861ed was 404-poisoned
 * exactly that way; the resulting restamp is what shipped this comment.)
 *
 * Duda's runtime is deliberately dead in this static export. These rules
 * replace layout that the runtime used to compute, rather than reviving it.
 *
 * Specificity note: Duda's own rules are "#dm .dmPhotoGallery .dmPhotoGalleryHolder
 * .photoGalleryThumbs" (1 id + 3 classes) and many carry !important, so the
 * layout-critical properties below need !important to win. Scoped as tightly as
 * possible so nothing leaks past the gallery.
 */

/* ---- Photo gallery ------------------------------------------------------
 * The gallery is a "pinterest" masonry whose column widths were set inline by
 * the runtime. Without it, Duda's fallback
 *     #dm .dmPhotoGallery .dmPhotoGalleryHolder .photoGalleryThumbs
 *         { float:left; width:100% }
 * makes every tile full-width, and since each <img> carried only data-src it
 * had no intrinsic height either -- so all nine photos collapsed into single
 * lines of alt text. (fix_ccspa.py promotes data-src to a real src; these rules
 * lay the tiles out.)
 *
 * TARGET THE REAL STRUCTURE. .dmPhotoGalleryHolder is an EMPTY sibling div --
 * it has zero children and measures 1200x0, so rules hung off it match nothing
 * and silently do nothing. Verified in the browser, the actual chain is:
 *
 *   .layout-container.pinterest
 *     └ .photogallery-row          x2   (note: class has a TRAILING SPACE)
 *         └ .photogallery-column   x3   (2 thumbs in row 1, 1 in row 2)
 *             └ .photoGalleryThumbs
 *
 * So each row becomes a flex row and each column an equal flex item, which is
 * precisely the 3-up masonry the markup was built for.
 */
#dmRoot .dmPhotoGallery .layout-container.pinterest {
  width: auto !important;
  height: auto !important;
}

#dmRoot .dmPhotoGallery .photogallery-row {
  display: flex !important;
  align-items: flex-start;
  gap: 10px;
  width: auto !important;
  height: auto !important;
}

#dmRoot .dmPhotoGallery .photogallery-column {
  flex: 1 1 0;
  min-width: 0;
  /* without this a tall image refuses to shrink */
  width: auto !important;
  height: auto !important;
  float: none !important;
}

#dmRoot .dmPhotoGallery .photoGalleryThumbs {
  width: auto !important;
  float: none !important;
  display: block !important;
  visibility: visible !important;
  margin: 0 0 10px !important;
  padding: 0 !important;
  /* Duda paints a loading spinner behind every tile; it never stops spinning
     without the runtime, so it would show through any transparent edge. */
  background-image: none !important;
  background-color: transparent !important;
}

#dmRoot .dmPhotoGallery .photoGalleryThumbs .thumbnailInnerWrapper,
#dmRoot .dmPhotoGallery .photoGalleryThumbs .image-container {
  height: auto !important;
  width: auto !important;
  opacity: 1 !important;
}

#dmRoot .dmPhotoGallery .photoGalleryThumbs .image-container a {
  display: block !important;
  width: auto !important;
  height: auto !important;
  background-size: cover !important;
  background-position: center !important;
  line-height: 0;
}

#dmRoot .dmPhotoGallery .photoGalleryThumbs .image-container a img {
  display: block !important;
  width: 100% !important;
  height: auto !important;
  max-width: 100% !important;
}

/* The widget reserves 45-80vh while it waits for a class the runtime adds. It
   is laid out now, so the reservation is just a gap. */
#dmRoot .dmPhotoGallery.newPhotoGallery:not(.photo-gallery-done) {
  min-height: 0 !important;
}

/* One column on a phone: three 400px-wide tiles side by side is unreadable. */
@media (max-width: 767px) {
  #dmRoot .dmPhotoGallery .photogallery-row {
    display: block !important;
  }
}

/* ---- Hamburger drawer ---------------------------------------------------
 * Scroll lock only. The open/closed animation is Duda's own exported CSS
 * (.layout-drawer[data-origin][open] { transform: translate(0) }), which
 * vg-fixes.js drives by toggling attributes -- no transforms are restated
 * here, so the animation keeps following the stylesheet.
 */
html.vg-drawer-open,
html.vg-drawer-open body {
  overflow: hidden !important;
  touch-action: none;
}

/* ---- Screen-reader-only heading ----------------------------------------
 * /about, /contact and /gallery have no <h1> and no text that serves as one.
 * This gives them a real heading for search engines and screen readers without
 * altering a single pixel of the client's design.
 */
#dmRoot .vg-sr-only {
  position: absolute !important;
  width: 1px;
  height: 1px;
  margin: -1px;
  padding: 0;
  border: 0;
  overflow: hidden;
  clip: rect(0 0 0 0);
  clip-path: inset(50%);
  white-space: nowrap;
}

/* ---- "More Info" accordions --------------------------------------------
 * vg-fixes.js supplies the open/close behaviour the dead runtime used to
 * provide. Only the arrow needs styling: Duda's exported CSS animates the panel
 * itself (max-height transition) but rotated the chevron from JavaScript.
 * Targeted by data-grab, not by the styled-components hash class.
 */
#dmRoot [data-grab="accordion-item-arrow"] {
  transition: transform 0.3s ease-out;
}

#dmRoot .vg-acc-open [data-grab="accordion-item-arrow"] {
  transform: rotate(180deg);
}

/* The heading is a real control now, so it needs a visible focus ring --
   Duda sets outline:none sitewide. */
#dmRoot [data-grab="accordion-item-title-wrapper"]:focus-visible {
  outline: 2px solid currentColor;
  outline-offset: 2px;
}

/* Title and chevron sit together, centered (Chase, 2026-09-12). Duda
 * exported the title right-aligned with the chevron pinned to the far edge.
 * The exported rule (#dm#dm#dm .dVcFLZ.dVcFLZ { flex:1; text-align:right })
 * is inline in every card's styled-components block, so !important is needed.
 * The h5 shrinks to its text and the wrapper centers the title+chevron pair
 * as a unit; the wrapper's own 8px gap spaces the chevron after the text. */
#dmRoot [data-grab="accordion-item-title-wrapper"] {
  justify-content: center !important;
}
#dmRoot [data-grab="accordion-item-title"] {
  flex: 0 0 auto !important;
  text-align: center !important;
}

/* The chevron must not shrink. The title wrapper carries 20px side padding,
 * so on the tablet build below about 830px a grid card's box is narrower
 * than "More Info" plus chevron and flex squashed the 20px chevron to zero
 * (pre-existing in Duda's export). Kept at 20px the pair overflows the
 * padding box symmetrically but stays inside the wrapper's border. */
#dmRoot [data-grab="accordion-item-arrow-wrapper"] {
  flex-shrink: 0 !important;
}

/* ---- Service-card icons (mobile) ----------------------------------------
 * On the one-per-row mobile layout each service icon sits in a circular frame
 * above the service name. Duda exported most of those frames with a responsive
 * "margin: -40px auto 10px" rule, which centres them at any card width. Seven
 * widgets were exported with hard-coded pixel margins instead
 * (e.g. "margin: -40px 130px 10px 129.688px"), which only centre at the exact
 * card width Duda measured at export time -- so on a real phone those icons
 * sit visibly off-centre. Normalise them to the same auto rule the rest use.
 * Scoped to mobile widths only; desktop/tablet layouts are untouched.
 */
@media (max-width: 767px) {

  #dmRoot #dm .dmBody div.u_1184292999,
  #dmRoot #dm .dmBody div.u_1502643225,
  #dmRoot #dm .dmBody div.u_1358997005,
  #dmRoot #dm .dmBody div.u_1894462195,
  #dmRoot #dm .dmBody div.u_1469895597,
  #dmRoot #dm .dmBody div.u_1138496380,
  #dmRoot #dm .dmBody div.u_1053671223 {
    margin: -40px auto 10px !important;
  }
}

/* ---- Manicures & Pedicures service cards ---------------------------------
 * These two cards were added after the export (tools/add_manicure_pedicure.py)
 * as the 3rd and 4th columns of the last service-menu row. The script cloned
 * the Massage Therapy card's markup, but every Duda element is styled by
 * per-element u_<id> rules in the exported desktop/tablet/mobile.css -- and
 * the new ids (u_18653001xx) appear in none of them, so the cards rendered
 * bare: no white panel, no circular icon frame, full-width black SVGs.
 *
 * The rules below are the Massage Therapy card's own rules
 * (col u_1580099220 / icon u_1138496380 / svg / para u_1708074849), re-keyed
 * to the new ids. Base = desktop+tablet (identical in both exports); the
 * max-width:767px block carries mobile.css's differing values. The icon
 * frames use "margin: -50px auto" rather than Duda's measured pixel margins,
 * same as the mobile normalisation above. Specificity/!important match the
 * exported rules they mirror.
 */
#dm .dmBody div.u_1865300111,
#dm .dmBody div.u_1865300117 {
  background-color: #fff !important;
  border: 2px solid var(--color_2) !important;
  border-radius: 10px !important;
  padding: 0 10px 20px !important;
  margin: 0 10px !important;
}

#dm .dmBody div.u_1865300112,
#dm .dmBody div.u_1865300118 {
  background-color: #fff !important;
  border: 2px double var(--color_2) !important;
  border-radius: 50% !important;
  padding: 10px !important;
  width: 100px !important;
  height: 100px !important;
  display: block !important;
  float: none !important;
  top: 0 !important;
  left: 0 !important;
  position: relative !important;
  max-width: 100% !important;
  min-width: 0 !important;
  min-height: auto !important;
  text-align: center !important;
  margin: -50px auto 10px !important;
}

#dm .dmBody div.u_1865300112 .svg,
#dm .dmBody div.u_1865300118 .svg {
  width: 75% !important;
  color: var(--color_2) !important;
  fill: var(--color_2) !important;
}

#dm .dmBody div.u_1865300115,
#dm .dmBody div.u_1865300121 {
  float: none !important;
  top: 0 !important;
  left: 0 !important;
  width: calc(100% - 0px) !important;
  position: relative !important;
  height: auto !important;
  max-width: 100% !important;
  margin: 8px 0 !important;
  padding: 2px 0 !important;
  min-width: 25px !important;
}

@media (max-width: 767px) {

  #dm .dmBody div.u_1865300111,
  #dm .dmBody div.u_1865300117 {
    padding: 0 20px 20px !important;
    margin: 0 0 50px !important;
  }

  #dm .dmBody div.u_1865300112,
  #dm .dmBody div.u_1865300118 {
    width: 80px !important;
    height: 80px !important;
    padding: 0 !important;
    margin: -40px auto 10px !important;
  }

  #dm .dmBody div.u_1865300115,
  #dm .dmBody div.u_1865300121 {
    margin: 16px auto 8px !important;
  }
}

/* ---- "Find Us" Google Map embed ------------------------------------------
 * The Duda mapbox widget (.inlineMap > .mapContainer) rendered nothing in this
 * static export, so it was replaced with a plain Google Maps <iframe> in the
 * right-hand column (.u_1072635467) of the "Find Us" section. These rules give
 * the map a solid height and make the iframe fill it at every breakpoint.
 */
#dmRoot .u_1072635467 .vg-google-map {
  width: 50%;
  height: 400px;
  margin-right: auto;
  margin-left: 0;
  border-radius: 10px;
  overflow: hidden;
}

#dmRoot .u_1072635467 .vg-google-map iframe {
  display: block;
  width: 100%;
  height: 100%;
  min-height: 350px;
  border: 0;
}

@media (max-width: 767px) {
  #dmRoot .u_1072635467 .vg-google-map {
    width: 100%;
    height: 350px;
    margin-top: 20px;
  }
}
/* ---- "Our Service Menu" heading on tablets ---------------------------------
 * Duda exported the heading paragraph as `.u_Services { width: calc(100% -
 * 492px); max-width: 432.871px }` (Style/tablet.css, Style/desktop.css). On an
 * iPad in portrait (768px) that leaves a sliver and the heading wraps one
 * letter per line. Let it use the whole column at tablet widths. The element's
 * own id (data-anchor "Services") outranks Duda's `#dm .dmBody div.u_Services`.
 */
@media (max-width: 1024px) {
  #dm .dmBody div#Services.u_Services {
    width: 100% !important;
    max-width: none !important;
  }
}

/* ---- Featured row: Skin Analysis -------------------------------------------
 * Added 2026-09-09 (tools/update_service_menu.py). The Skin Analysis card
 * moved out of the 4-across grid into a full-width row under the "Our Service
 * Menu" heading so the Retinol Peel card could take its slot and the grid stays
 * six rows of four. Custom classes on purpose: the exported per-element rules
 * (u_<id>) are all `#dm .dmBody ... !important`, so these match that
 * specificity rather than fight it. Tablet lays the icon and text out in a
 * row; desktop (1025px+) and mobile (under 768px) stack and centre like the
 * cards.
 *
 * 2026-09-12 (tools/skin_analysis_more_info.py): the description moved into
 * the same "More Info" accordion every grid card uses (Crystal's ask), so the
 * row no longer has a .vg-featured-copy paragraph. The icon is top-aligned so
 * it stays beside the title when the accordion opens and the text column
 * grows; on mobile the text column is full width so the accordion spans the
 * card.
 *
 * Spacing: every exported menu row zeroes Duda's default row padding
 * (`padding:80px 15px` on .dmLargeBody) with a per-id rule; this row needs the
 * same. The column's bottom margin is the grid's own rhythm (about 35px from a
 * card's bottom border to the next row's icons) plus the 50px the row-1 icons
 * overhang their cards (40px on mobile).
 */
#dm .dmBody div.vg-featured {
  padding: 0 !important;
  width: auto !important;
}
#dm .dmBody .vg-featured .dmRespColsWrapper {
  display: block !important;
}
#dm .dmBody div.vg-featured-col {
  float: none !important;
  position: relative !important;
  width: 100% !important;
  max-width: 100% !important;
  height: auto !important;
  padding: 0 !important;
  margin: 0 0 85px !important;
}
#dm .dmBody .vg-featured-card {
  display: flex !important;
  align-items: flex-start !important;
  gap: 28px !important;
  background-color: #fff !important;
  border: 2px solid var(--color_2) !important;
  border-radius: 10px !important;
  padding: 24px 32px !important;
  text-align: left !important;
}
#dm .dmBody .vg-featured-icon {
  flex: 0 0 100px !important;
  width: 100px !important;
  height: 100px !important;
  box-sizing: border-box !important;
  padding: 10px !important;
  background-color: #fff !important;
  border: 2px double var(--color_2) !important;
  border-radius: 50% !important;
  display: flex !important;
  align-items: center !important;
  justify-content: center !important;
}
#dm .dmBody .vg-featured-icon svg {
  width: 75% !important;
  height: 75% !important;
  display: block !important;
  color: var(--color_2) !important;
  fill: var(--color_2) !important;
}
#dm .dmBody .vg-featured-text {
  flex: 1 1 auto !important;
  min-width: 0 !important;
}
#dm .dmBody .vg-featured-text h3 {
  margin: 0 0 8px !important;
  padding: 0 !important;
  text-align: left !important;
  line-height: 1.1 !important;
}
/* Desktop: the featured card spans two grid slots (two 25% columns plus the
 * 10px gap between them, i.e. half the wrapper less 5px) and sits centered
 * under the heading, laid out like a larger grid card: icon on top, title
 * and More Info centered (Chase, 2026-09-12). These stacking declarations
 * mirror the mobile block below on purpose. Tablet keeps the full-width row:
 * at 768px a half-width card is too tight beside the 100px icon. */
@media (min-width: 1025px) {
  #dm .dmBody div.vg-featured-col {
    width: calc(50% - 5px) !important;
    max-width: calc(50% - 5px) !important;
    margin: 0 auto 85px !important;
  }
  #dm .dmBody .vg-featured-card {
    flex-direction: column !important;
    align-items: center !important;
    text-align: center !important;
    gap: 16px !important;
  }
  #dm .dmBody .vg-featured-text {
    width: 100% !important;
  }
  #dm .dmBody .vg-featured-text h3 {
    text-align: center !important;
  }
}
@media (max-width: 767px) {
  #dm .dmBody div.vg-featured-col {
    margin: 20px 0 75px !important;
  }
  #dm .dmBody .vg-featured-card {
    flex-direction: column !important;
    align-items: center !important;
    text-align: center !important;
    gap: 16px !important;
    padding: 24px 20px !important;
  }
  #dm .dmBody .vg-featured-text {
    width: 100% !important;
  }
  #dm .dmBody .vg-featured-text h3 {
    text-align: center !important;
  }
}

/* ---- Service-card spacing after the 2026-09-09 re-flow ----------------------
 * Duda exported each card column's margins for the grid slot it occupied at
 * export time (slot 1 `margin:0`, slot 2 `margin:0 10px`, slot 3
 * `margin:0 10px 0 0`, slot 4 `margin:0`, and the first mobile row
 * `margin:30px 0 0`). tools/update_service_menu.py moved cards to new slots,
 * so pairs of `margin:0` cards ended up touching. Restate Duda's intent
 * slot-independently: outer cards flush with the wrapper, 10px between cards,
 * and on the one-per-row mobile layout 50px below each card (40px icon
 * overhang plus the same 10px gap). Same idea as the Manicures/Pedicures
 * block above, for all 24 cards.
 */
#dm .dmBody div.u_1380147408,
#dm .dmBody div.u_1376995161,
#dm .dmBody div.u_1537064035,
#dm .dmBody div.u_1037527212,
#dm .dmBody div.u_1929402755,
#dm .dmBody div.u_1151648683,
#dm .dmBody div.u_1787970259,
#dm .dmBody div.u_1395598800,
#dm .dmBody div.u_1634491446,
#dm .dmBody div.u_1613350776,
#dm .dmBody div.u_1274753368,
#dm .dmBody div.u_1253194793,
#dm .dmBody div.u_1262165305,
#dm .dmBody div.u_1865300211,
#dm .dmBody div.u_1933946185,
#dm .dmBody div.u_1909153107,
#dm .dmBody div.u_1129809524,
#dm .dmBody div.u_1438391013,
#dm .dmBody div.u_1090129529,
#dm .dmBody div.u_1104562406,
#dm .dmBody div.u_1416020899,
#dm .dmBody div.u_1580099220,
#dm .dmBody div.u_1865300111,
#dm .dmBody div.u_1865300117 {
  margin: 0 !important;
  padding: 0 10px 20px !important;
}
#dm .dmBody div.u_1251737272 .dmRespColsWrapper > .dmRespCol + .dmRespCol,
#dm .dmBody div.u_1946810036 .dmRespColsWrapper > .dmRespCol + .dmRespCol,
#dm .dmBody div.u_1400993535 .dmRespColsWrapper > .dmRespCol + .dmRespCol,
#dm .dmBody div.u_1396938027 .dmRespColsWrapper > .dmRespCol + .dmRespCol,
#dm .dmBody div.u_1699127396 .dmRespColsWrapper > .dmRespCol + .dmRespCol,
#dm .dmBody div.u_1041628760 .dmRespColsWrapper > .dmRespCol + .dmRespCol {
  margin-left: 10px !important;
}
@media (max-width: 767px) {
  #dm .dmBody div.u_1380147408,
  #dm .dmBody div.u_1376995161,
  #dm .dmBody div.u_1537064035,
  #dm .dmBody div.u_1037527212,
  #dm .dmBody div.u_1929402755,
  #dm .dmBody div.u_1151648683,
  #dm .dmBody div.u_1787970259,
  #dm .dmBody div.u_1395598800,
  #dm .dmBody div.u_1634491446,
  #dm .dmBody div.u_1613350776,
  #dm .dmBody div.u_1274753368,
  #dm .dmBody div.u_1253194793,
  #dm .dmBody div.u_1262165305,
  #dm .dmBody div.u_1865300211,
  #dm .dmBody div.u_1933946185,
  #dm .dmBody div.u_1909153107,
  #dm .dmBody div.u_1129809524,
  #dm .dmBody div.u_1438391013,
  #dm .dmBody div.u_1090129529,
  #dm .dmBody div.u_1104562406,
  #dm .dmBody div.u_1416020899,
  #dm .dmBody div.u_1580099220,
  #dm .dmBody div.u_1865300111,
  #dm .dmBody div.u_1865300117 {
    margin: 0 0 50px !important;
    padding: 0 20px 20px !important;
  }
  #dm .dmBody div.u_1251737272 .dmRespColsWrapper > .dmRespCol + .dmRespCol,
  #dm .dmBody div.u_1946810036 .dmRespColsWrapper > .dmRespCol + .dmRespCol,
  #dm .dmBody div.u_1400993535 .dmRespColsWrapper > .dmRespCol + .dmRespCol,
  #dm .dmBody div.u_1396938027 .dmRespColsWrapper > .dmRespCol + .dmRespCol,
  #dm .dmBody div.u_1699127396 .dmRespColsWrapper > .dmRespCol + .dmRespCol,
  #dm .dmBody div.u_1041628760 .dmRespColsWrapper > .dmRespCol + .dmRespCol {
    margin-left: 0 !important;
  }
}
