
*{box-sizing:border-box}
html{scroll-behavior:smooth}

/* ============================================================
   DESIGN TOKENS — new light/elegant customer-facing theme.
   Scoped for use by body.d6-theme (every customer page) and by
   the shared components (.avail-*, .menu-table, .article-book)
   that only ever render on those pages. Defined on :root so they
   are available everywhere, but admin.html deliberately never
   references these variables (its own admin-* rules keep their
   original hardcoded literals untouched) so this addition cannot
   change admin.html's appearance.
   ============================================================ */
:root{
  --color-bg:#FAF7F3;
  --color-surface:#FFFFFF;
  --color-ink:#1E2B2B;
  --color-text-muted:#6e655f;
  --color-text-faint:#81766f;
  --color-primary:#0F9FB4;
  --color-primary-dark:#0C7E90;
  --color-primary-tint:#E4F4F6;
  --color-pink:#D8AFA0;
  --color-pink-dark:#C98E7D;
  --color-border:#E7DFD6;
  --color-border-soft:#F0E9E1;
  --color-success:#2e7d32;
  --color-success-tint:#E7F3E8;
  --color-danger:#b03a3a;
  --color-danger-tint:#F7E9E9;
  --radius-card:16px;
  --radius-pill:999px;
  --shadow-card:0 2px 16px rgba(30,43,43,.06);
  --shadow-card-hover:0 8px 28px rgba(30,43,43,.10);
  --font-display:Georgia,"Times New Roman",serif;
  --font-body:"Noto Sans JP",Arial,sans-serif;

  /* ---- Unified button sizing system --------------------------------
     ONE source of truth for every form/action button on the site
     (submit, cancel, save, back, next, confirm, delete-account-style
     actions, etc.): height, horizontal padding, corner radius and font
     size all come from these four custom properties. Every button rule
     below consumes them instead of hardcoding its own px values, so a
     Cancel button and a Save button — or any two buttons anywhere on
     the site — always render at the exact same height, padding rhythm,
     corner rounding and text size, regardless of their label length,
     which page they're on, or whether they're a <button> or an <a>.
     Colors/borders still vary per variant (primary/secondary/danger) —
     only the *shape* is standardized here. Responsive tiers for
     tablet/mobile/very-narrow phones are defined further down, reusing
     the same breakpoints (900px/720px/340px) already used elsewhere in
     this file, so button sizing changes land on the same width steps
     as everything else instead of introducing new in-between states. */
  --btn-height:48px;
  --btn-padding-x:28px;
  --btn-radius:999px;
  --btn-font-size:15px;
}

@media(max-width:900px){
  :root{ --btn-height:46px; --btn-padding-x:24px; --btn-font-size:14.5px; }
}
@media(max-width:720px){
  :root{ --btn-height:44px; --btn-padding-x:20px; --btn-font-size:14px; }
}
@media(max-width:340px){
  :root{ --btn-height:42px; --btn-padding-x:16px; --btn-font-size:13px; }
}

/* ---- Customer-site "3D depth" pass ---------------------------------
   Requested: give the customer-facing pages a subtle, "3D-ish" sense of
   depth using CSS only (no new images/models/libraries) — layered
   shadows (a tight contact shadow + a soft, wider ambient shadow, which
   reads as more three-dimensional than the single flat blur it
   replaces) plus a small hover-lift/press feel on interactive elements.

   --shadow-card/--shadow-card-hover are redefined here on body.d6-theme
   instead of edited at :root, on purpose: every existing card across
   the site already consumes var(--shadow-card)/var(--shadow-card-hover)
   (.box, .favorite-card, .review-card, .avail-wrap,
   .booking-reservation-card, .change-type-btn, .mypage-content,
   .handfoot-box, .addon-option, .salon-info-card, .page-menu-panel,
   etc.), so this one redefinition upgrades all of them automatically —
   zero HTML/JS changes anywhere. Admin pages (admin.html) never carry
   the d6-theme class, so they keep the original, flatter :root values
   completely untouched; a CSS custom property redefined on a more
   specific selector only takes effect inside that selector's own scope. */
body.d6-theme{
  --shadow-card:0 1px 2px rgba(30,43,43,.05),0 10px 26px -8px rgba(30,43,43,.16);
  --shadow-card-hover:0 2px 5px rgba(30,43,43,.07),0 20px 42px -10px rgba(30,43,43,.24);
}
/* Sticky header: a soft shadow reads as "the header floats above the
   page" (a classic, subtle 3D cue) — pairs with the border-bottom that
   was removed from the teal header override further down (it was
   showing as a stray light line against the teal; a shadow gives the
   same sense of separation without that seam). .site-header only exists
   on customer pages (admin.html uses its own .admin-topbar instead), so
   no d6-theme scoping is needed here for safety. */
.site-header{box-shadow:0 4px 18px rgba(30,43,43,.12)}
/* Buttons: a resting shadow + a small lift-on-hover/press-on-active,
   applied at the base .btn level so any button that doesn't already
   define its own hover/active feedback (there are several more specific
   overrides elsewhere — register/login, header book button, etc. — all
   of which still win over this plain, single-class rule) gets a
   consistent, tactile "pressable" feel for free. */
body.d6-theme .btn{box-shadow:0 4px 10px rgba(30,43,43,.14);transition:transform .15s ease,box-shadow .15s ease}
body.d6-theme .btn:hover{transform:translateY(-2px);box-shadow:0 10px 20px rgba(30,43,43,.20)}
body.d6-theme .btn:active{transform:translateY(0);box-shadow:0 2px 6px rgba(30,43,43,.16)}
/* Menu card grid (menu.html) + the teal "選択する" select buttons used
   across menu.html/booking.html: same lift-on-hover treatment as above,
   added on top of (not replacing) their existing color/background
   rules. */
body.d6-theme .hp-menu-card{transition:transform .2s ease,box-shadow .2s ease}
body.d6-theme .hp-menu-card:hover{transform:translateY(-4px);box-shadow:0 2px 6px rgba(30,43,43,.08),0 22px 40px -12px rgba(30,43,43,.22)}
body.d6-theme .article-book,
body.d6-theme .handfoot-book{box-shadow:0 4px 12px rgba(30,43,43,.16);transition:transform .15s ease,box-shadow .15s ease}
body.d6-theme .article-book:hover,
body.d6-theme .handfoot-book:hover{transform:translateY(-2px);box-shadow:0 10px 22px rgba(30,43,43,.22)}

body{margin:0;background:#faf8f5;color:#302a27;font-family:Arial,"Noto Sans JP",sans-serif}
a{color:inherit}
.site-header{height:88px;display:flex;align-items:center;justify-content:space-between;padding:0 4.5%;border-bottom:1px solid #e6ded7;position:sticky;top:0;background:rgba(250,248,245,.97);backdrop-filter:blur(10px);z-index:1000}
.logo{text-decoration:none;color:var(--color-ink);font-family:Georgia,"Times New Roman",serif;font-size:30px;line-height:1.05;white-space:nowrap;display:inline-flex;align-items:center;gap:12px}
.logo-img{height:48px;width:auto;display:block}
.logo small{display:block;font-family:Arial,"Noto Sans JP",sans-serif;font-size:12px;letter-spacing:2px;color:#ffffff;margin-top:6px}
.header-actions{display:flex;align-items:center;gap:12px}
.language-btn,.booking-btn,.menu-btn{height:54px;display:flex;align-items:center;justify-content:center;white-space:nowrap;cursor:pointer;font-size:17px}
.language-btn{min-width:120px;padding:0 24px;border:1px solid var(--color-border);border-radius:30px;background:transparent;color:var(--color-ink);transition:background-color .28s ease,border-color .28s ease,color .28s ease}
.language-btn:hover,.language-btn:focus-visible,.language-btn:active{background:var(--color-primary);border-color:var(--color-primary);color:#fff}
.booking-btn{min-width:130px;padding:0 24px;border:0;border-radius:30px;background:#302a27;color:#fff;text-decoration:none;font-weight:600}
.menu-btn{width:54px;border-radius:50%;border:1px solid var(--color-border);background:transparent;color:var(--color-ink);font-size:27px;transition:background-color .28s ease,border-color .28s ease,color .28s ease}
.menu-btn:hover,.menu-btn:focus-visible,.menu-btn:active{background:var(--color-primary);border-color:var(--color-primary);color:#fff}

/* NEW: persistent horizontal header nav + reservation button, matching
   the reference design. Always-bilingual (EN primary bold + JA caption
   below), NOT tied to the lang-ja/lang-en toggle — the reference shows
   both languages simultaneously in the header nav, unlike the toggle-
   based bilingual pattern used elsewhere on the site. Active-page
   underline is applied via .is-active, added by js/main.js comparing
   location.pathname — not a per-page hand-authored class, so this exact
   markup can be identical on all 10 customer pages. */
.header-nav{display:flex;align-items:center;gap:22px;margin:0 18px}
.header-nav-link{display:flex;flex-direction:column;align-items:center;gap:2px;text-decoration:none;padding:6px 2px;position:relative;white-space:nowrap;font:700 13px/1.2 var(--font-body);letter-spacing:1px;text-align:center!important}
.header-nav-link .subtext{font-size:11px;letter-spacing:.5px;font-weight:400;display:block!important}
.header-nav-link::after{content:"";position:absolute;left:0;right:0;bottom:-3px;height:2px;border-radius:1px;background:transparent;transition:background-color .2s ease}
.header-nav-link.is-active::after{background:var(--color-primary)}
.header-book-btn{display:inline-flex;align-items:center;gap:6px;height:46px;padding:0 20px;border-radius:var(--radius-pill);background:var(--color-primary);color:#fff !important;text-decoration:none;font:700 14px/1 var(--font-body);letter-spacing:.3px;white-space:nowrap;transition:background-color .2s ease,transform .15s ease}
.header-book-btn:hover,.header-book-btn:focus-visible{background:var(--color-primary-dark);transform:translateY(-1px)}

/* NOTE: header ABOUT/MENU dropdown panels (previously here) have been
   removed — every main header nav item now opens its own page directly
   again, per request. The equivalent "jump to a section" navigation
   moved to live inside each destination page instead (.page-subnav,
   below), rather than hanging off the header. */

/* Page-level "on this page" navigation — a small, page-owned nav bar
   that lives inside a single page's own content (top-left, right under
   the page title) and lets visitors jump to that page's existing
   sections/pages. This is NOT a sitewide sidebar: it only appears on
   the handful of pages that use it, styled with the same tokens as
   everything else on the site (pill shape, primary color, existing
   fonts) so it doesn't read as a redesign. Still used as-is (always-
   visible pill row) on about.html and mypage.html. On menu.html and
   booking.html it was replaced by the compact, collapsed-by-default
   .page-menu-toggle below, per request. */
.page-subnav{display:flex;flex-wrap:wrap;justify-content:flex-start;gap:10px;margin:0 0 36px}
.page-subnav a{display:inline-flex;align-items:center;height:40px;padding:0 18px;border-radius:var(--radius-pill);border:1px solid var(--color-border);background:var(--color-surface);color:var(--color-ink);text-decoration:none;font:600 13px/1 var(--font-body);letter-spacing:.3px;white-space:nowrap;transition:background-color .2s ease,border-color .2s ease,color .2s ease}
.page-subnav a:hover,.page-subnav a:focus-visible{background:var(--color-primary);border-color:var(--color-primary);color:#fff}
@media(max-width:480px){
  .page-subnav{flex-wrap:nowrap;overflow-x:auto;-webkit-overflow-scrolling:touch;padding-bottom:4px}
  .page-subnav a{flex:0 0 auto}
}

/* Compact "MENU" mark + dropdown panel — menu.html, booking.html
   (Reservation / Book Now), and mypage.html (My Page). Collapsed by
   default (the category/section links are hidden until the button is
   clicked/tapped — see the .page-menu-toggle handler in js/main.js), sits
   at the same top-left spot the old always-visible .page-subnav pill row
   used to occupy on these pages. Explicitly NOT a sitewide/permanent
   sidebar and NOT full-screen — a small anchored dropdown, same card
   language (rounded corners, subtle border, soft shadow, teal accent) as
   the rest of the site. Reused as-is (same classes/markup shape) on all
   three pages so there's exactly one component to maintain. */
.page-menu-toggle{position:relative;display:inline-block;margin:0 0 36px}
.page-menu-btn{display:inline-flex;align-items:center;gap:8px;height:40px;padding:0 18px;border-radius:var(--radius-pill);border:1px solid var(--color-border);background:var(--color-surface);color:var(--color-ink);font:600 13px/1 var(--font-body);letter-spacing:.3px;cursor:pointer;transition:background-color .2s ease,border-color .2s ease,color .2s ease}
.page-menu-btn:hover,.page-menu-btn:focus-visible{background:var(--color-primary);border-color:var(--color-primary);color:#fff}
.page-menu-btn[aria-expanded="true"]{background:var(--color-primary);border-color:var(--color-primary);color:#fff}
.page-menu-btn-caret{display:inline-block;font-size:10px;line-height:1;transition:transform .2s ease}
.page-menu-btn[aria-expanded="true"] .page-menu-btn-caret{transform:rotate(180deg)}
.page-menu-panel{position:absolute;top:calc(100% + 8px);left:0;z-index:20;min-width:220px;max-width:90vw;background:var(--color-surface);border:1px solid var(--color-border);border-radius:var(--radius-card);box-shadow:var(--shadow-card);padding:8px;display:flex;flex-direction:column;gap:2px}
.page-menu-panel a{display:block;padding:11px 14px;border-radius:calc(var(--radius-card) - 8px);color:var(--color-ink);text-decoration:none;font:600 13px/1.3 var(--font-body);letter-spacing:.2px;white-space:nowrap;transition:background-color .15s ease,color .15s ease}
.page-menu-panel a:hover,.page-menu-panel a:focus-visible{background:var(--color-primary-tint);color:var(--color-primary-dark)}
/* Clear "currently selected" state (My Page explicitly asks for this;
   applied the same way on all 3 pages using this component for
   consistency) — set/moved by js/main.js whenever a category/section link
   in the panel is clicked, defaulting to the first link on page load
   since that's the section actually shown/at the top by default. Same
   tint used by the hover state above, just persistent. */
.page-menu-panel a.is-active{background:var(--color-primary-tint);color:var(--color-primary-dark);font-weight:700}

/* Header MY PAGE / LOGIN icon — the desktop replacement for "reach my
   account" now that the hamburger is hidden at desktop widths (below).
   Exactly one of the two is ever shown at a time; js/nav-auth.js
   toggles the [hidden] attribute on each based on Supabase auth state,
   the same pattern already used for the drawer's #nav-mypage/#nav-login. */
.header-mypage-btn{width:44px;height:44px;border-radius:50%;border:1px solid var(--color-border);background:transparent;color:var(--color-ink);display:flex;align-items:center;justify-content:center;text-decoration:none;transition:background-color .28s ease,border-color .28s ease,color .28s ease}
.header-mypage-btn:hover,.header-mypage-btn:focus-visible{background:var(--color-primary);border-color:var(--color-primary);color:#fff}
.header-mypage-btn.is-active{background:var(--color-primary);border-color:var(--color-primary);color:#fff}

/* The full logo + persistent nav row + reservation button + language
   toggle + hamburger only fit comfortably from ~1300px of viewport width
   up (measured against the actual rendered header, not guessed) — below
   that (which covers most "laptop"-class 1024-1280px screens, not just
   phones/tablets) the nav row hides and the hamburger drawer becomes the
   primary navigation, same as on mobile. This avoids the header overflowing
   sideways on any viewport width where the full row doesn't actually fit. */
@media(max-width:1300px){
  .header-nav{display:none}
}
/* Desktop hamburger removal (requested): once the persistent .header-nav
   row is showing (>1300px), the hamburger/drawer becomes redundant, so
   it's hidden — not replaced by any other icon. Scoped with :has() to
   headers that actually contain .header-nav, so email-confirmed.html
   (a minimal transactional page whose header never had the nav row or
   drawer parity with the rest of the site) keeps its hamburger as its
   only nav, unaffected. Below 1300px this rule doesn't apply, so the
   hamburger + drawer remain exactly as before — the existing responsive
   nav behavior is untouched on mobile/tablet/narrow-laptop widths. */
@media(min-width:1301px){
  .site-header:has(.header-nav) .menu-btn{display:none}
}
/* Hero: photo background. 2026-09-03: swapped to the real salon-interior
   photo (images/hero-salon-photo.jpg) in place of the previous
   images/hero-bg.jpg — same gradient-wash technique, same spot, nothing
   else about .hero restructured. images/hero-bg.jpg itself is left on
   disk and untouched in css/style.css's other two references (the
   .hp-menu-hero page-top banner and .auth-glass on login/register) —
   only the homepage hero's own image changed. Heading/subtext stay white
   with a soft text-shadow for contrast against the photo. color:#fff
   here is the default for anything inside .hero without its own
   explicit color.
   Overlay history: started at .65 (tuned for the old, moodier photo),
   dropped to a flat .5 — still read as too dark against this brighter
   photo, because a flat wash darkens the whole image uniformly even
   though the only text left in the hero (the 3 quick-link boxes +
   subtext) now all sits at the very bottom (.hero-bottom is
   margin-top:auto — see below), ever since the heading itself was
   removed. Switched to a bottom-to-top gradient instead of a flat wash:
   strong right behind the text at the bottom, fading to fully clear by
   the upper ~2/3 of the photo — so the room shows at its real, bright
   colors where there's no text over it, and stays legible only where it
   actually needs to. */
.hero{padding:120px 9%;min-height:620px;background:linear-gradient(to top,rgba(48,42,39,.72) 0%,rgba(48,42,39,.38) 28%,rgba(48,42,39,.08) 55%,rgba(48,42,39,0) 78%),url(../images/hero-salon-photo.jpg) center/cover;color:#fff;display:flex;flex-direction:column}
.hero h1{color:#fff;text-shadow:0 2px 8px rgba(0,0,0,.4)}
.hero p{color:#fff;text-shadow:0 1px 4px rgba(0,0,0,.6)}
.hero small,.page>small,.intro small,#title-small{color:#b87568;letter-spacing:5px}
.hero small,.intro small{font-size:26px}
.page>small,#title-small{display:block;text-align:center;font-size:26px}
/* English page heading — originally added for Menu/Reservation/About/
   Review/My Page (the small eyebrow label MENU/BOOKING/ABOUT SALON/
   REVIEWS/MY PAGE that was briefly each page's only heading after their
   large H1 was removed): bold + shifted 2cm up, same technique as the
   existing .hero h1{transform:translateX(-2cm)} nudge above (a pure
   visual offset — doesn't reflow anything). All five pages have since
   had this eyebrow label deleted outright in favor of their own content
   (Menu/Reservation/About/My Page: the page's navigation/category tabs
   now sit in that spot instead; Review: nothing replaces it, since
   Review never had a nav/tabs section to move up there — its content
   just starts where the tabs would). None of the five selectors below
   match any element on the live site any more — left in place as
   harmless, unused rules rather than deleted, consistent with this
   file's existing dead-code convention (see .page-menu-toggle in
   js/main.js). Scoped per-page so every other <small> heading (Access/
   Policy/Login/Register/Favorites/etc., which share the bare
   .page>small rule above) was never affected either way. */
.menu-page>small,
.about-page>small,
.review-page>small,
.mypage-page>small,
#title-small{font-weight:700;transform:translateY(-2cm)}
.page>h1{text-align:center}
.hero h1{font:500 65px/1.3 Georgia,"Times New Roman",serif;margin:65px 0 25px;letter-spacing:.02em}
/* 2026-09-03: nudge flipped from 2cm left to 2cm right + 1cm up (still a
   pure transform offset — font/size/weight/color/line-height/
   letter-spacing/margin untouched, nothing reflows). Reset back to none
   below 1100px (same guard as the .hero-quick/.hero-subtext shifts
   further down) since the heading's left padding shrinks a lot on
   narrower screens (9% down to 7% at 720px) and a 2cm shift would push
   it toward/past the edge there — this keeps the shift to the widths
   where there's actually room for it, leaving mobile/tablet untouched. */
.hero h1{transform:translate(4cm,-1cm)}
.hero p{font-size:18px;font-weight:500;max-width:700px}
/* .btn / .booking-submit — the two base "action button" classes used
   everywhere on the site. Both share this exact box shape (height,
   padding, radius, font) via the tokens above; only background/color
   differ per variant (see .secondary-btn, .cancel-btn, the d6-theme
   overrides, etc.). display:inline-flex + a fixed height (not just
   vertical padding) means the button's height can never change with
   its text length or its tag (<button> vs <a>, which otherwise use
   different default fonts) — the label is always centered inside a
   box of the exact same size. */
.btn{display:inline-flex;align-items:center;justify-content:center;box-sizing:border-box;height:var(--btn-height);margin:0;padding:0 var(--btn-padding-x);background:#302a27;color:#fff;border:0;border-radius:var(--btn-radius);font:600 var(--btn-font-size)/1 var(--font-body);white-space:nowrap;text-decoration:none;cursor:pointer;vertical-align:middle}
.intro{display:block;max-width:700px;margin:auto;padding:100px 7%;text-align:center}
.intro h2{font:500 45px/1.4 Georgia,"Times New Roman",serif}
.box,.quick a{margin:18px 0;border:1px solid var(--color-border);background:var(--color-surface);border-radius:var(--radius-card);padding:28px 30px;position:relative;box-shadow:var(--shadow-card)}
.box{line-height:2;color:#675e58}
.page .box{max-width:700px;margin:20px auto 0;text-align:left}
.intro .box{margin:20px auto 0;text-align:left}
.quick{max-width:1050px;margin:auto;padding:0 7% 100px;display:grid;grid-template-columns:repeat(3,1fr);gap:24px}
/* Same three boxes, now living inside .hero (near the bottom, below the
   headline/subtitle) instead of their own section below ABOUT D6. Only
   the outer spacing changes here — .hero already supplies its own 9%
   side padding, so this removes the box's own side/bottom padding to
   avoid doubling it, and adds top spacing to clear the hero text. */
.hero-quick{padding:0;margin:56px auto 0}
.quick a{color:#302a27;text-decoration:none;display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;gap:14px;min-height:190px;padding:40px 26px;transition:border-color .3s ease}
.quick b{display:block;font-size:26px;font-weight:700;letter-spacing:.5px}
.quick-icon{display:flex;align-items:center;justify-content:center;width:42px;height:42px;color:inherit;transition:color .3s ease}
.quick-icon svg{width:100%;height:100%}
.quick-sub{display:block;font-size:13px;letter-spacing:1.5px;opacity:.65}
/* Bottom row of the hero: the 3 shortcut cards on the left and the
   subtext paragraph on the right, bottom-aligned together, sitting below
   the large heading (which stays untouched, top-left, outside this row).
   Row layout needs real width to work — the 3 cards plus the one-line
   subtext measure to ~1080px+ of usable content width — so it's only
   safe above roughly that width. The @media(max-width:1100px) block
   further below (placed after the base .hero-bottom/.hero-subtext rules
   so it can actually win the cascade — a same-specificity override has
   to come later in source order, media query or not) stacks it into a
   column on tablet, and the existing 720px mobile block layers its own
   tighter spacing on top of that same stacked column for phones. */
/* 2026-09-03: margin-top:auto (was a fixed 40px) — with the hero heading
   deleted, a fixed top margin left this row sitting right under the
   header instead of near the bottom of the hero like it did when the
   tall heading above it pushed it down. margin-top:auto in this
   flex-column .hero pins it back to the bottom edge (minus .hero's own
   120px/9% padding), restoring roughly where it used to sit. */
.hero .hero-bottom{display:flex;flex-direction:row;align-items:flex-end;justify-content:space-between;gap:24px;width:100%;margin-top:auto}
/* Shrink the hero copy of the three nav boxes to ~50% size. Sized to its
   own content rather than stretched, so it sits naturally on the left of
   .hero-bottom next to the subtext on the right. Higher specificity than
   the mobile .quick a/.quick b/.quick-icon rules below so it wins at all
   widths. */
/* Requested nudge: 2cm left + 2cm down from the row-layout position above,
   via transform so it's a pure visual offset — box size/border/gap/etc.
   are all untouched, and it doesn't disturb .hero-bottom's own layout
   (no reflow of the subtext next to it). Row-layout only (see the
   @media(max-width:1100px) reset below) since the desktop reference image
   this was measured against only applies to that layout — the stacked
   mobile/tablet column is intentionally left unshifted. */
.hero .hero-quick{margin:0;gap:12px;transform:translate(-2cm,2cm)}
.hero .hero-quick a{min-height:95px;padding:20px 13px;gap:7px;min-width:140px}
.hero .hero-quick b{font-size:15px}
.hero .hero-quick .quick-icon{width:21px;height:21px}
.hero .hero-quick .quick-sub{font-size:10px;letter-spacing:1px}
/* Subtext, repositioned to the bottom-right of .hero-bottom next to the
   cards. margin:0 cancels the browser's default <p> margin, which would
   otherwise throw off .hero-bottom's align-items:flex-end (the bottom
   edges of the cards and the subtext wouldn't actually line up). White-
   space:nowrap keeps it on one line on wide screens where there's room
   beside the cards; the media query right below relaxes that back to
   normal left-aligned wrapping once the row stacks into a column, so the
   long Japanese line can never force horizontal overflow. */
/* Requested nudges, combined: 2cm down (from an earlier request) + 2cm
   right (this request), via a single transform: translate(x,y) — a
   second `transform` declaration replaces the first rather than adding
   to it, so both offsets have to live in one value. Pure visual offset
   either way (doesn't affect the text's own size/color/alignment or
   reflow anything else). Row-layout only, same reasoning as .hero-quick's
   transform above and .hero h1's transform further up. */
.hero-subtext{margin:0;text-align:right;white-space:nowrap;padding-bottom:8px;transform:translate(2cm,2cm)}
@media(max-width:1100px){
  .hero .hero-bottom{flex-direction:column;align-items:stretch;gap:16px}
  .hero-subtext{text-align:left;white-space:normal;padding-bottom:0}
  .hero h1,
  .hero .hero-quick,
  .hero-subtext{transform:none}
}
/* The 3 hero shortcut boxes (メニュー一覧/予約をする/アクセス): fully
   transparent — no background tint at all, so the hero photo shows
   through — with just a thin white outline to define their shape, and a
   subtle white wash on hover (background only — nothing else changes).
   Fully specified here (not inherited from the generic body.d6-theme
   .quick a rules) since this treatment is unique to these 3 cards.
   box-shadow:none cancels the generic .box,.quick a{box-shadow:var(
   --shadow-card)} rule (line 137). The hover/focus rule pins border-
   color/box-shadow/transform/icon-color back to their resting values too
   — without that, the generic body.d6-theme .quick a:hover rules (teal
   border, shadow, lift, teal icon) would still apply underneath, since
   this override only touched background before. */
/* 2026-09-03: tried teal text here, decided against it (didn't look good
   against the photo) — reverted back to the original white text/icon,
   transparent background, no extra text-shadow (white already reads
   fine here without one). */
body.d6-theme .hero .hero-quick a{background:transparent;border-color:rgba(255,255,255,.4);color:#fff;box-shadow:none;transition:background-color .3s ease}
body.d6-theme .hero .hero-quick a:hover,
body.d6-theme .hero .hero-quick a:focus-visible{background:rgba(255,255,255,.1);border-color:rgba(255,255,255,.4);box-shadow:none;transform:none}
body.d6-theme .hero .hero-quick a:hover .quick-icon,
body.d6-theme .hero .hero-quick a:focus-visible .quick-icon{color:#fff}
.page{max-width:1050px;margin:auto;padding:70px 6% 100px}
.page>h1{font:500 58px Georgia,"Times New Roman",serif;margin:20px 0 60px}

/* Full-width content area — Menu & Price page (menu.html's
   <main class="page menu-page">), Reservation / Book Now (booking.html's
   <main class="page booking-page">), and My Page (mypage.html's
   <main class="page mypage-page">), which all now share the same design
   system on request. Every other page keeps the shared .page{max-width:
   1050px} rule above completely untouched; this override just widens the
   usable area here so the left-side photo column added to .menu-table
   below has room without cramping 内容/所要時間/料金 or causing text to
   wrap (menu.html/booking.html), and so My Page's own content column
   (.mypage-content below) has more room to expand into. Percentage side
   padding (not a fixed px value) keeps it responsive at any screen width;
   the max-width ceiling only matters on very large desktop monitors, so
   rows don't stretch to an unreasonable line length. Below 720px the
   existing .page mobile rule (media query further down) already wins the
   cascade (same specificity, later in source order) and reverts to the
   standard mobile padding, so no separate mobile override is needed here. */
.menu-page,
.booking-page,
.mypage-page{max-width:1700px;padding:70px 4% 100px}

/* Navigation section spacing — MENU/RESERVATION/ABOUT/MY PAGE only (the
   .menu-category-tabs bar each of these 4 pages already has as the very
   first thing inside <main>, since Task 25/26 moved it to the top of the
   page). Written as calc(<existing top padding> - <requested cm>) rather
   than a pre-computed pixel number, so the exact amount being removed —
   1.5cm off the page's own top padding (moves the nav up, closer to the
   header) and 1cm off the nav bar's own bottom margin (tightens the gap
   before the content below it) — stays self-evident. REVIEW is
   deliberately excluded (:not(.review-page); it shares .booking-page with
   booking.html above only for its unrelated width-widening) because it
   has no navigation/tabs section of its own to move — same scope decision
   already made for it in the earlier task that removed its page title.
   The nav's own size, buttons, typography, colors, and borders are
   completely untouched — nothing here changes .tabs/.menu-category-tabs'
   own rules above, only the blank space around it. */
.menu-page,
.about-page,
.mypage-page,
.booking-page:not(.review-page){padding-top:calc(70px - 1.5cm)}
/* Per request: review.html was deliberately excluded from the shared
   reduction just above (see the comment on it) because, at the time,
   it had no nav/tabs bar to tighten against — so it kept the full 70px
   top padding from .menu-page,.booking-page,.mypage-page{padding:70px
   4% 100px} above, unlike every other content page, leaving a visibly
   larger gap between the header and the "Submit a Review" card here.
   This applies that exact same reduction directly to .review-page now,
   closing that gap the same way the other pages already got. Same
   specificity (one class) as the shared padding:70px 4% 100px rule
   above; placed after it so it wins by source order and overrides only
   padding-top, leaving that rule's max-width/side/bottom padding for
   review.html untouched. The :not(.review-page) rule above is itself
   completely unchanged — review.html still never matches it. */
.review-page{padding-top:calc(70px - 1.5cm)}

/* On booking.html specifically, the running "Selected Menu" cart shown
   under the menu-selection table (.selected-summary) stays capped to a
   comfortable, centered reading width — it's part of the menu-selection
   step, not one of the three reservation-flow screens widened below, so
   it's left exactly as it was. Only margin-left/right are set here (not
   the shorthand margin already declared above), so the existing vertical
   spacing on this element is untouched. */
.booking-page .selected-summary{max-width:900px;margin-left:auto;margin-right:auto}
/* Per request: on booking.html's menu-selection step, the "選択したメニ
   ュー" / Selected Menu card (#selected-summary, rendered by js/menu.js's
   renderSummary() — both its empty "まだメニューが選択されていません。"
   state and its populated state share this same id) is now forced to the
   full content width instead of the 900px cap set just above, matching
   how .selected-menu/.booking-box were already widened further down the
   booking flow. Scoped to the ID rather than editing the .booking-page
   .selected-summary rule above, because that class is also shared by
   review.html's own review list card (.selected-summary.review-list-wrap
   — review.html's <main> also carries .booking-page for an unrelated
   width reason) which must keep its existing 900px-capped, centered
   width untouched. The id "selected-summary" is only ever assigned here
   by js/menu.js, and only on booking.html, so this can't match anything
   on review.html; an ID selector also already outguns the class-based
   rule above on specificity, so this wins regardless of source order. */
#selected-summary{max-width:none;margin-left:0;margin-right:0}
/* Per request: center only the "選択したメニュー" section title text
   itself (not the outer card, which stays full-width per above, and not
   the inner rows, which keep their existing label-left/value-right flex
   layout). Scoped to #selected-summary's own heading — .menu-section-
   title is a shared class also used by the ハンドネイル/フットネイル/
   ハンド＋フット/追加オプション category headings elsewhere in #menu-root,
   and by review.html's own heading — this descendant selector only
   matches the one h2 that's actually inside #selected-summary. */
#selected-summary .menu-section-title{text-align:center !important}

/* 予約をする (.selected-menu/.booking-box inside #booking-form-step) and
   予約内容の確認 / ありがとうございました！(#booking-confirm-step, which
   carries the .booking-box class and is shared by both the confirmation
   and success states) used to share the same 900px cap above — that's
   what was producing the unwanted blank space on either side, since
   their parent .booking-page is already widened to max-width:1700px
   (see above). Removing the cap here (rather than raising it) lets them
   size to the full .booking-page content width instead, exactly like
   the menu-selection step's own table already does. Width only: this
   doesn't touch height, padding, font-size, or any vertical spacing —
   all of that still comes from the untouched rules elsewhere in this
   file (the customer-info form's inputs already stretch to 100% of
   their parent per #booking-form input/textarea below, so they simply
   follow this wider parent automatically). */
.booking-page .selected-menu,
.booking-page .booking-box{max-width:none}
.tabs{display:grid;grid-template-columns:repeat(3,1fr);border-bottom:2px solid #ddd4cd;margin-bottom:55px}
.tabs button,.tabs a{display:block;border:0;background:none;padding:15px 8px;color:#706761;font-size:21px;cursor:pointer;line-height:1.35;text-decoration:none;text-align:center}
.tabs button small,.tabs a small{font-size:18px}
.tabs .active{color:#8a3d4d;border-bottom:4px solid #8a3d4d}
/* Selected/touched state for the MENU/RESERVATION/ABOUT/MY PAGE category
   nav (.menu-category-tabs) only — mypage.html's own #change-tabs
   (the booking-change panel's separate nested tab bar, plain .tabs with
   no .menu-category-tabs) intentionally keeps the original maroon-
   underline .active style above, untouched. Footer-color fill + a white
   ring drawn with outline (outline never participates in the box model,
   unlike border, so it can never change the element's size or push the
   nav's height/padding/margin/position — even inactive vs. active items
   stay pixel-identical in size). border-bottom:0 cancels the shared rule
   above's underline so the two treatments don't double up. See the
   matching body.d6-theme rule further down for the text-color override
   (d6-theme's own .tabs .active rule is more specific and would
   otherwise win over the color set here). */
.menu-category-tabs .active{
  color:#fff;
  background-color:var(--color-primary);
  border-bottom:0;
  outline:2px solid #fff;
  outline-offset:-4px;
  border-radius:6px;
}
/* Bottom-of-nav spacing reduction (1cm off the shared 55px .tabs
   margin-bottom above), scoped to just .menu-category-tabs — the
   MENU/RESERVATION/ABOUT/MY PAGE nav bar — so mypage.html's #change-tabs
   (which uses plain .tabs with no .menu-category-tabs, an unrelated
   nested tab bar inside the booking-change panel) keeps its original
   55px untouched. Placed after the shared rule above (same specificity;
   source order decides) so it actually wins the cascade. */
.menu-category-tabs{margin-bottom:calc(55px - 1cm)}

/* Category tab icons (Hand Nail / Foot Nail / Hand+Foot / Add-ons) —
   menu.html AND booking.html's menu-selection step (Reservation/Book Now
   share this one page). .menu-category-tabs is an additive class placed
   alongside the existing shared .tabs class on just these two tab bars,
   so mypage.html's #change-tabs (which still uses plain .tabs) is
   completely unaffected by this rule. Simple emoji glyphs act as each
   category's icon/mark; sized relative to the button's own font-size so
   they scale with the existing responsive .tabs button font-size rules
   above/below instead of needing their own breakpoints. */
.menu-category-tabs .tab-icon{display:inline-block;margin-right:6px;font-size:.9em;vertical-align:-1px}

/* Per request: give every sub-tab/category button on the site (Menu &
   Booking's Hand Nail/Foot Nail/Hand+Foot/Add-ons, About's own About/
   Access/Cancellation Policy tabs, and My Page's Profile/Upcoming
   Reservation/Booking History/Favorites tabs) the exact same look as
   the main header nav links — all 3 tab bars share this one
   .menu-category-tabs class already (confirmed: about.html's #about-
   page-tabs and mypage.html's #mypage-tabs both carry it too, and
   mypage.html's OWN nested #change-tabs — the booking-change panel's
   separate date/step sub-tabs — uses plain .tabs with no .menu-
   category-tabs, so it's naturally excluded here), so one rule covers
   all 11 buttons without touching any other page.
   Values below are copied verbatim from the header nav's own "Cyber
   Cyan" button rule (header nav a, ... — see the Header Navigation
   Items Button-style Transformation block further down this file) and
   its :hover glow rule right after it — that block itself is left
   completely untouched; this only reads its values and reapplies them
   here under a new selector.
   Structural sizing (font/letter-spacing/padding/border-radius) is
   applied to EVERY tab, active or not, so all tabs in a row stay the
   same size — a size mismatch between the active and inactive tabs
   would look broken. The translucent cyan background/border/inset-glow
   "glass" look and the hover glow are scoped to :not(.active) only, so
   the existing .menu-category-tabs .active rule (the solid teal
   selected-tab highlight built and tested in earlier tasks) is left
   completely alone in both its default and hovered state.
   Font-size/letter-spacing/padding are wrapped in a min-width:721px
   query (the exact breakpoint where .header-nav itself is hidden and a
   hamburger menu takes over — see .header-nav{display:none} in that
   same mobile query) so this can't collide with the carefully-tuned
   compact mobile sizing these tab bars already have (padding:12px 2px;
   font-size:12px etc.) — matching header-nav text size only makes
   sense at the widths where the header nav itself is actually visible
   to compare against. The background/border/box-shadow/hover-glow
   "skin", which carries no overflow risk at any width, still applies
   everywhere, including mobile. */
/* --- Follow-up request: sub-tab background/text-color redesign ---
   All 11 sub-tab/category buttons above (Menu & Booking's 4, About's 3,
   My Page's 4) now use a permanent gradient background built from the
   footer's own real color (footer{background:#0F9FB4} — solid teal)
   blended toward the existing --color-primary-dark token (#0C7E90) and
   a lighter teal tint, applied IDENTICALLY in every state (default /
   hover / active — the previous :not(.active) scoping is removed so
   nothing distinguishes active from inactive here anymore), with the
   tab text AND its Japanese <small> subtext forced solid white in every
   state via !important. This safely overrides body.d6-theme's
   muted-gray tab-text rule and the plain .menu-category-tabs
   .active{background-color:...} rule further above WITHOUT editing
   either of them: an !important background here beats that
   non-important background-color regardless of selector specificity.
   The active tab's white outline ring (2px solid #fff, see
   .menu-category-tabs .active above) is left completely untouched and
   is now the sole visual "currently selected" indicator, since the
   background itself is intentionally identical across active/inactive/
   hovered states per this request.
   This replaces the earlier "Cyber Cyan" glass background/border/glow
   look (header-nav-matching request) with this new footer-themed look;
   the sizing values that request set — border-radius, font-weight, and
   the >=721px font/letter-spacing/padding block right below — are left
   exactly as they were, since only background gradient and text color
   were asked to change this time. */
/* Follow-up: border color on these same 11 sub-tabs changed to Cyber
   Cyan (#00F0FF), 2px, in every state (default/hover/active — same
   uniform-across-states approach as the gradient/white-text change
   above). Edited directly on the two rules below (rather than adding a
   new competing rule) since that's the only way to actually change the
   border color everywhere it's set today: the base rule below sets the
   default border, and the :hover rule below it re-sets border-color on
   hover, so both need the same cyan value or hovering would revert it.
   Only the border's color/width changed on both rules — every other
   property (background gradient, radius, box-shadow, white text) is
   exactly as it was. */
.menu-category-tabs button,
.menu-category-tabs a{
  border-radius:6px!important;
  font-weight:700!important;
  color:#fff!important;
  background:linear-gradient(135deg,#12B4CC,#0F9FB4,#0C7E90)!important;
  border:2px solid #00F0FF!important;
  box-shadow:inset 0 0 8px rgba(0,0,0,0.15)!important;
  transition:all .3s ease-in-out!important;
}
.menu-category-tabs button small,
.menu-category-tabs a small{color:#fff!important}
.menu-category-tabs button:hover,
.menu-category-tabs a:hover{
  background:linear-gradient(135deg,#17C6E0,#12B4CC,#0F9FB4)!important;
  border-color:#00F0FF!important;
  box-shadow:0 0 15px rgba(15,159,180,0.65),inset 0 0 10px rgba(0,0,0,0.12)!important;
  transform:translateY(-2px)!important;
  filter:brightness(1.1)!important;
}
@media(min-width:721px){
  .menu-category-tabs button,
  .menu-category-tabs a{font:700 13px/1.2 var(--font-body)!important;letter-spacing:1px!important;padding:8px 16px!important}
  .menu-category-tabs button small,
  .menu-category-tabs a small{font-size:11px!important;letter-spacing:.5px!important;font-weight:400!important}
}

.menu-section-title{font-size:34px;margin:0 0 25px}

/* Per request: remove the black category title text (ハンドネイル／
   フットネイル／ハンド＋フット／追加オプション) that used to sit directly
   under the 4 category tabs on menu.html and booking.html, so the menu
   table shifts up and sits snugly beneath the tabs instead. Scoped to
   ONLY the h2 that's a direct child of .menu-section — the <section
   class="menu-section" id="section-hand/foot/handfoot/addons"> wrapper
   js/menu.js's renderMainSection()/renderHandFootSection()/
   renderAddonSection() generate for exactly these 4 category headings —
   so this can never match #selected-summary's own "選択したメニュー"
   heading (wrapped in .selected-summary, a different class, and already
   deliberately kept visible/centered per an earlier request) or
   review.html's "お客様の声" heading (wrapped in .review-list-wrap).
   display:none removes the h2 from layout entirely (not just visually
   hidden), so .menu-table-wrap's own margin-top:18px below becomes the
   only space between the tabs and the table — no leftover blank gap
   where the title used to be. About.html/My Page's own tab systems never
   render a .menu-section at all, so they're unaffected regardless. */
.menu-section > .menu-section-title{display:none}

/* Menu/price table — shared by BOTH the standalone menu.html page and the
   booking.html selection step, so the two pages use one identical table
   design (structure, column widths, row height, borders, spacing,
   typography, background, alignment, responsive behavior). On menu.html
   there's no select button (selectButton() returns '' there); on
   booking.html the existing 選択する button renders inside the price
   cell, stacked directly under the price — see .menu-table-price below. */
.menu-table-wrap{margin:18px 0;overflow-x:auto}
.menu-table{width:100%;min-width:640px;border-collapse:collapse}
.menu-table thead th{background:#0F9FB4;color:#fff;font-weight:700;font-size:15px;letter-spacing:.5px;text-align:left;padding:16px 20px;white-space:nowrap}
.menu-table tbody td{padding:20px;border-bottom:1px solid #e5ddd7;vertical-align:top;font-size:15px;line-height:1.8;color:#6e655f}
.menu-table tbody tr:last-child td{border-bottom:none}
.menu-table .menu-name{display:block;font-weight:700;color:#302a27;white-space:nowrap}
.menu-table .menu-name.lang-en{font-weight:400;font-size:13px;color:#81766f;margin-top:3px;white-space:normal}
/* Left-side menu/service photo column — same design on menu.html AND
   booking.html's menu-selection step (menuTable() in js/menu.js always
   emits this <th>/<td> now). Fixed pixel width (not a %) here so the
   thumbnail stays a consistent size no matter how wide the table itself
   is, and doesn't eat into the percentage-based columns beside it. The
   Menu page is this table's single source of truth for size/layout —
   booking.html's table intentionally has NO width/size overrides of its
   own any more (see the .menu-table--booking comment further down), so
   this same rule applies identically on both pages. Same rounded,
   soft-gradient placeholder treatment as .favorite-card-media
   (js/favorites.js) for items with no image_url yet, so an item without a
   photo still looks intentional rather than broken. */
.menu-table-image{width:148px}
.menu-table-image img,
.menu-table-image-placeholder{display:block;width:106px;height:106px;border-radius:var(--radius-card);object-fit:cover;background:linear-gradient(135deg,#f2ece6,#e7ddd3)}
.menu-table-name{width:22%}
.menu-table-duration{width:16%;text-align:center;font-size:13px;line-height:1.6;color:#81766f;white-space:normal}
.menu-table-price{width:16%;text-align:center;font-weight:700;color:#8a3d4d;white-space:nowrap}
.menu-table thead th:nth-last-child(-n+2){text-align:center}

/* Price + 選択する button, stacked vertically (price on top, button
   directly below, centered) inside the price cell on booking.html. On
   menu.html this cell only ever contains the price span (no button), so
   the extra flex rules are inert there. The button itself keeps its
   existing markup/class/text/behavior — these rules only override its
   old card-layout position:absolute so it sits naturally in the cell. */
.menu-table-price-inner{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:10px}
.menu-table-price-value{display:block;white-space:nowrap}
.menu-table-price-inner .article-book,
.menu-table-price-inner .select-btn{position:static !important;top:auto !important;right:auto !important;left:auto !important;grid-column:auto !important;grid-row:auto !important;align-self:center !important;justify-self:center !important;margin:0 !important}

/* Favorites — heart toggle button (js/favorites.js), appended into the
   price cell on menu.html (menu-table-price-inner) next to the price;
   on menu.html there's no 選択する button in that cell, so the heart is
   the only thing appended there. 🩵 = not favorited, ❤️ = favorited.
   Both states are already full-color emoji, so (unlike the old 🤍/🩷
   pair) no grayscale filter is used — the two icons are told apart by
   their own natural colors, with a small opacity lift on the favorited
   state so it reads as "on" at a glance. */
.fav-heart-btn{border:0;background:none;padding:2px;margin:0;font-size:22px;line-height:1;cursor:pointer;transition:transform .15s ease,opacity .15s ease;opacity:.82}
.fav-heart-btn:hover,.fav-heart-btn:focus-visible{transform:scale(1.15)}
.fav-heart-btn.is-favorited{opacity:1}
.fav-heart-btn:disabled{cursor:default;opacity:.5}
/* Click "pop" animation — toggled on/off via .is-animating from
   js/favorites.js (playHeartPop()) so a tap reads as a deliberate,
   subtle confirmation without altering the icon's resting size/position. */
.fav-heart-btn.is-animating{animation:fav-heart-pop .32s ease}
@keyframes fav-heart-pop{
  0%{transform:scale(1)}
  40%{transform:scale(1.35)}
  65%{transform:scale(.94)}
  100%{transform:scale(1)}
}

/* Favorites list — used on both My Page's #favorites-list card and the
   standalone favorites.html page. Same white rounded card language as
   the rest of the light theme. */
.favorites-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(240px,1fr));gap:16px}
.favorite-card{position:relative;background:var(--color-surface);border:1px solid var(--color-border);border-radius:var(--radius-card);box-shadow:var(--shadow-card);padding:20px 20px 18px;display:flex;flex-direction:column;gap:12px}
/* Menu image — item[6]/menu_items.image_url when present; a plain soft
   gradient placeholder (no schema change needed) for static-fallback
   items that have no image at all. Fixed 106x106 — same exact size as
   the Menu page's own photo column (.item-thumb/.menu-table-image img)
   per explicit request, replacing the previous full-width 4:3 banner so
   every menu/service photo on the site is now visually consistent. */
.favorite-card-media{width:106px;height:106px;border-radius:var(--radius-card);overflow:hidden;background:linear-gradient(135deg,#f2ece6,#e7ddd3)}
.favorite-card-media img{display:block;width:100%;height:100%;object-fit:cover}
.favorite-card .fav-heart-btn{position:absolute;top:14px;right:14px;font-size:20px;width:32px;height:32px;display:flex;align-items:center;justify-content:center;background:rgba(255,255,255,.88);border-radius:50%;box-shadow:0 2px 6px rgba(0,0,0,.12)}
.favorite-card-body{padding-right:26px}
.favorite-card-body .menu-name.lang-en{display:block;margin-top:3px}
.favorite-card-meta{display:flex;justify-content:space-between;align-items:center;margin-top:10px;padding-top:10px;border-top:1px solid var(--color-border-soft);font-size:13px;color:var(--color-text-muted)}
.favorite-card-meta strong{color:var(--color-primary-dark);font-size:16px}
.favorite-book-btn{width:100%;text-align:center;margin-top:0}

/* gallery.html — same white rounded card language as .favorite-card above,
   one square photo/video per card instead of a menu row. Photos link out
   to the full-res file in a new tab; videos use native <video controls>. */
.gallery-page{max-width:1180px;margin:0 auto;padding:0 20px 40px}
.gallery-filter-switch{max-width:520px;margin:0 auto 24px}
.gallery-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(240px,1fr));gap:18px}
.gallery-card{margin:0;border:1px solid var(--color-border);background:var(--color-surface);border-radius:var(--radius-card);overflow:hidden;box-shadow:var(--shadow-card)}
.gallery-card-media{width:100%;aspect-ratio:1/1;object-fit:cover;display:block;background:#f2ece6}
.gallery-card-caption{margin:0;padding:10px 12px;font-size:13px;color:var(--color-text-muted)}

/* Booking page (.menu-table--booking, set in js/menu.js when isCartMode)
   now renders with EXACTLY the same table design as the standalone
   menu.html page — same column widths/proportions, same auto table
   layout, same 148px photo column / 106px photo, same min-width — per
   explicit request that the Menu page is the single source of truth for
   this table's visual design everywhere it's used. This modifier class
   used to carry its own width overrides (table-layout:fixed + tuned
   percentages) to make room for the price cell's extra 選択する button;
   those are removed now, since plain auto table-layout already gives
   that button all the room it needs (the browser grows the price column
   to fit its content) without narrowing any other column — verified by
   screenshot at desktop and mobile widths, no clipping/overflow. The
   class itself is left in place on the <table> (js/menu.js still adds
   it) purely as a hook for anything that might target it in future; it
   carries no rules of its own any more. */

@media(max-width:720px){
  .menu-table{min-width:640px}
  .menu-table thead th,.menu-table tbody td{padding:13px 14px;font-size:13px}
  .menu-table .menu-name{font-size:14px}
  .menu-table-duration{font-size:12px}
  .menu-table-image{width:92px}
  .menu-table-image img,
  .menu-table-image-placeholder{width:64px;height:64px}
}

.menu-note{background:var(--color-primary-tint);border-radius:var(--radius-card);padding:28px 30px;margin-top:30px;color:#6e655f;line-height:1.9}
footer{text-align:center;background:#0F9FB4;color:#E8F7F8;padding:45px 7%;line-height:2}
footer::first-line{color:#fff;font-family:Georgia,"Times New Roman",serif;font-size:22px;font-weight:500}
footer a{color:#E8F7F8;text-decoration:none;transition:color .2s ease}
footer a:hover{color:#D8AFA0}
/* Multi-column Footer layout: Nail Salon D6 + address on the LEFT,
   お支払い方法 CENTER, Contact Us (+ Phone/Instagram/LINE) on the RIGHT —
   a single 3-column row. Same footer background/colors/line-height as
   before — only the horizontal arrangement changes (grid-area placement
   below, independent of source order, so no HTML/content changes were
   needed). footer::first-line (above) no longer reaches "Nail Salon D6"
   now that it's nested inside footer-grid, so .footer-salon-name below
   explicitly repeats that exact same color/font/size/weight instead. */
.footer-grid{display:grid;grid-template-columns:1fr 1fr 1fr;grid-template-areas:"salon payment contact";column-gap:60px;max-width:1050px;margin:0 auto;text-align:center;align-items:start}
.footer-col-contact{grid-area:contact}
.footer-col-payment{grid-area:payment}
.footer-col-salon{grid-area:salon}
.footer-col-title{display:block;color:#fff;font-family:Georgia,"Times New Roman",serif;font-size:18px;font-weight:500;margin-bottom:6px}
.footer-payment-list{margin:0}
/* Footer branding — logo stays exactly as-is (same file, size, and still
   the first/lead element), with the salon name + Japanese name now
   stacked directly underneath it (instead of beside it) and center-
   aligned, per this request. Same fonts/sizes/colors as before — only
   the arrangement (row → column) and text-align (left → center) change. */
.footer-brand{display:flex;flex-direction:column;align-items:center;gap:10px;width:fit-content;margin:0 auto 12px}
.footer-brand-text{text-align:center}
.footer-salon-name{display:block;color:#fff;font-family:Georgia,"Times New Roman",serif;font-size:30px;line-height:1.05;font-weight:400;white-space:nowrap}
.footer-salon-jp{display:block;font-family:Arial,"Noto Sans JP",sans-serif;font-size:12px;letter-spacing:2px;color:#fff;margin-top:6px}
.footer-logo-img{height:48px;width:auto;display:block}
.footer-salon-address{margin:0}
/* Bottom-right copyright line — a new, purely additive strip below the
   existing 3-column footer grid. Doesn't touch .footer-grid or any of
   its columns/links/icons/logo/spacing; own top margin only, so it just
   adds a line beneath what's already there. max-width+margin:0 auto
   matches .footer-grid's own box so its right edge lines up with the
   grid's right edge instead of the full (7% padded) footer width;
   text-align:right + white-space:nowrap keep it a single line, bottom-
   right within that box, on every viewport (see mobile override below). */
.footer-copyright{max-width:1050px;margin:36px auto 0;text-align:right;white-space:nowrap;font-size:13px;font-weight:400;letter-spacing:.3px;color:rgba(255,255,255,.7)}
@media(max-width:720px){
  .footer-grid{grid-template-columns:1fr;grid-template-areas:"salon" "payment" "contact";row-gap:32px}
  .footer-salon-name{font-size:23px}
  .footer-copyright{font-size:11px;margin-top:28px}
}
/* "Contact Us" button — sits centered above the Phone/Instagram/LINE
   block and smooth-scrolls to it (see #footer-contact-btn in js/main.js).
   Colors reuse the site's existing teal accent (#0F9FB4, the same accent
   used for the header, table headers, etc.) plus the footer's own coral
   hover color (#D8AFA0, already used by footer a:hover) so it fits the
   footer's established palette instead of introducing a new one. */
.footer-contact-btn{display:flex;align-items:center;justify-content:center;box-sizing:border-box;height:var(--btn-height);width:180px;margin:0 auto 26px;padding:0 var(--btn-padding-x);border:0;border-radius:var(--btn-radius);background:#fff;color:#0F9FB4;font-size:var(--btn-font-size);font-family:var(--font-body);font-weight:600;line-height:1;letter-spacing:.5px;white-space:nowrap;cursor:pointer;transition:background-color .25s ease,color .25s ease,transform .15s ease}
.footer-contact-btn:hover,.footer-contact-btn:focus-visible{background:#D8AFA0;color:#fff;transform:translateY(-2px)}

/* Footer contact section (Phone / Instagram / LINE) — three rows, same
   alignment/icon size/text size, evenly spaced, using the exact same
   color/hover/typography as every other footer link (footer a / footer
   a:hover above); this just adds icon+text row layout on top of that
   shared styling. */
.footer-contact{display:flex;flex-direction:column;align-items:center;gap:12px;margin:22px 0;line-height:1.4}
.footer-contact-row{display:inline-flex;align-items:center;gap:8px}
.footer-contact-row svg{flex:none}
.side{position:fixed;right:-390px;top:0;width:360px;height:100vh;background:var(--color-ink);z-index:1100;padding:75px 35px 30px;transition:right .3s ease;box-shadow:-10px 0 30px #0002;overflow:auto}
.side.show{right:0}
.side-close{position:absolute;right:18px;top:12px;border:0;background:none;font-size:35px;cursor:pointer;color:#fff}
.side-title{font:26px Georgia,"Times New Roman",serif;display:block;margin-bottom:25px;color:#fff}
.side a{display:block;padding:15px 12px;margin:0 -12px;border-bottom:1px solid rgba(255,255,255,.12);text-decoration:none;color:#fff;border-radius:6px;transition:background-color .28s ease}
.side a:hover,.side a:focus-visible,.side a:active{background:var(--color-primary)}
.side-sub{display:flex;flex-direction:column}
.side-sub a{padding:12px 12px 12px 22px;font-size:14px;color:#fff}
.side-sub a::before{content:"– ";color:var(--color-pink)}
.shade{display:none;position:fixed;inset:0;background:#0006;z-index:1050}
.shade.show{display:block}
.notice{margin-top:35px;background:var(--color-primary-tint);border-radius:var(--radius-card);padding:28px 30px;line-height:1.9;color:#6e655f}
.map-wrap{margin-top:30px;border:1px solid var(--color-border);background:#fff;padding:10px;border-radius:var(--radius-card)}
.map-wrap iframe{width:100%;height:420px;border:0}
/* access.html only — map (left) + address box (right), each exactly half
   width and the same height as each other (no forced 1:1 square ratio —
   that made the long address text require internal scrolling, which is
   exactly what this isn't supposed to do). Both columns stretch to
   whatever height the address text naturally needs to show in full, with
   no scrollbar, right when the page opens. The overall layout is wider
   than a plain content column so both boxes read as large/roomy, not
   just "tall and narrow". The "Google Mapsを開く" link sits centered
   above the map at its normal small pill size (single-line text, same
   sizing every other .btn on the site uses — not stretched full-width).
   Scoped entirely under .access-layout (a wrapper that exists only on
   access.html) so the shared .map-wrap/.box/.btn rules every other page
   relies on are untouched. */
/* .page's own shared max-width:1050px (used by every page, see the
   .page{...} rule above) would otherwise cap this layout to ~430px per
   column regardless of the max-width set below. Widening it, scoped via
   :has() to only the instance that actually contains .access-layout,
   makes access.html's boxes bigger without touching about.html/
   policy.html/review.html's normal (narrower) content width. */
.salon-info-detail-page:has(.access-layout){max-width:1300px}
.access-layout{display:grid;grid-template-columns:1fr 1fr;gap:24px;align-items:stretch;max-width:1200px;margin:20px auto 0}
.access-map-col{display:flex;flex-direction:column;gap:14px}
.access-map-col .map-wrap{margin-top:0;flex:1;display:flex;min-height:0}
.access-map-col .map-wrap iframe{height:100%}
.access-layout .access-maps-btn{align-self:center;flex:none}
/* The site-wide unified-button rule (:root{--action-btn-width:180px} and
   its selector list further down) fixes every .btn to a 180px pill with
   white-space:normal, which wraps "Google Mapsを開く" onto 2 lines. This
   button needs to stay on 1 line, so it gets its own width (sized to its
   text, not the fixed 180px) and white-space:nowrap — everything else
   (height/padding/font/radius/colors) still comes from that shared rule.
   Needs .page ancestor-scoping to out-specificity `.page .btn` itself. */
.page .access-layout .access-maps-btn{width:auto!important;min-width:0!important;white-space:nowrap!important}
.access-layout .box{margin:0;max-width:none}
@media(max-width:900px){
  .access-layout{grid-template-columns:1fr;max-width:700px}
  .access-map-col .map-wrap iframe{height:420px}
}
.lang-en{display:none}
body.english .lang-ja{display:none}
body.english .lang-en{display:block}
body.english .inline-ja{display:none}
body.english .inline-en{display:inline}
.inline-en{display:none}

@media(max-width:720px){
  .site-header{height:82px;padding:0 16px}
  /* Logo + header-actions (language toggle + hamburger) must both fit on
     one row next to each other at phone widths — .header-nav/.header-
     book-btn are already hidden below (960px/720px), but the logo text +
     language button + hamburger alone were still wide enough to overflow
     a ~360-390px viewport, causing horizontal scroll. Shrinking all three
     further here (vs. the previous mobile sizing) keeps everything on
     one line with room to spare, without hiding any element/text. */
  .logo{font-size:17px;gap:8px}
  .logo-img{height:34px}
  .logo small{font-size:7px;letter-spacing:.8px}
  .header-actions{gap:6px}
  .language-btn,.booking-btn{height:42px;min-width:68px;padding:0 8px;font-size:12px}
  .menu-btn{width:40px;height:40px;font-size:19px}
  /* The persistent header reservation button is redundant with (and would
     overflow next to) the language + hamburger buttons on narrow phones —
     the hamburger drawer already has its own 予約をする link, so the pill
     CTA here is reserved for tablet/desktop widths only. */
  .header-book-btn{display:none}
  /* Same reasoning as .header-book-btn above: the drawer (opened via the
     hamburger, which is always present at these widths) already has its
     own マイページ/ログイン links, so the redundant circular icon is
     dropped here to keep the phone-width header from getting crowded. */
  .header-mypage-btn{display:none}
  .hero{padding:80px 7%;min-height:560px}
  .hero h1{font-size:45px}
  .hero-quick{margin-top:38px}
  /* .hero-bottom is already a stacked column below 1100px (see the
     @media(max-width:1100px) block above, which also covers this
     narrower range) — this just tightens the top spacing further for
     phone-width screens. */
  .hero .hero-bottom{margin-top:32px}
  .intro{grid-template-columns:1fr;padding:70px 7%}
  .intro h2{font-size:38px}
  .quick{grid-template-columns:1fr;gap:16px}
  .quick a{min-height:150px;padding:32px 22px;gap:12px}
  .quick b{font-size:22px;white-space:normal}
  .quick-icon{width:36px;height:36px}
  .page{padding:55px 5% 80px}
  /* Same 1.5cm nav-spacing reduction as the desktop rule above, reapplied
     here against THIS breakpoint's own (smaller) 55px top padding rather
     than the desktop 70px one — needed because .page's own mobile rule
     just above this comment resets padding-top back to 55px at this
     width, which would otherwise silently undo the desktop-only override
     above. 55px is already less than 1.5cm (~56.7px), so this correctly
     lands at 0 (calc() clamps a negative padding to 0) rather than a
     negative gap — the nav sits flush under the header here, which is the
     mathematically correct result of removing "1.5cm of blank space" from
     a gap that was never quite 1.5cm tall to begin with. */
  .menu-page,
  .about-page,
  .mypage-page,
  .booking-page:not(.review-page){padding-top:calc(55px - 1.5cm)}
  /* Mobile counterpart of the .review-page{padding-top:calc(70px - 1.5cm)}
     override above, against this breakpoint's own smaller 55px base —
     same reasoning, just re-applied at the width where .page's top
     padding itself shrinks from 70px to 55px. */
  .review-page{padding-top:calc(55px - 1.5cm)}
  /* Same guard as .hero h1/.hero-quick/.hero-subtext's transform:none
     reset above: .page's own top padding shrinks here (70px -> 55px, and
     the header itself is shorter too — see .site-header above), so the
     English-heading 2cm upward shift below 720px would push the heading
     up into/behind the header instead of landing in the padding above the
     content, same problem as those other 2cm nudges at their own narrow
     breakpoint. Resetting to none here keeps it fully visible on phones;
     font-weight:700 (bold) has no such overlap risk, so it stays applied
     at every width. */
  .menu-page>small,
  .about-page>small,
  .review-page>small,
  .mypage-page>small,
  #title-small{transform:none}
  .page>h1{font-size:43px;margin-bottom:45px}
  .tabs button,.tabs a{font-size:16px}
  .tabs button small,.tabs a small{font-size:14px}
  .side{width:86%;right:-90%}
}

/* Very narrow phones (e.g. 320px-wide devices) — one more notch down on
   just the header row, so it never overflows even at that width. */
@media(max-width:340px){
  .site-header{padding:0 12px}
  .logo{font-size:15px;gap:6px}
  .logo-img{height:30px}
  .header-actions{gap:4px}
  .language-btn{min-width:56px;padding:0 6px;font-size:11px}
  .menu-btn{width:36px;height:36px;font-size:17px}
}

/* BOOKING FLOW - added only for the reservation page */
.booking-page .selected-menu,
.booking-page .booking-box {
  margin: 18px 0;
  border: 1px solid #ded6cf;
  background: #fff;
  padding: 28px 30px;
}
.selected-menu {
  display: block;
}
/* Full-width Selected Menu card: .selected-menu and its parent form
   (.booking-box/#booking-form) share the exact same horizontal padding
   (28px/30px above, 22px/18px in the 720px media query below) plus the
   form's own 1px border — negative margins matching padding+border
   exactly let this one card's own border/background bleed out to the
   form's own outer edge (which itself already spans the full
   .booking-page width via the max-width:none rule above), instead of
   sitting inset within the form's padding like the surrounding labels.
   Since the margins are equal on both sides, the card stays perfectly
   centered/flush with its container — "filling up the left and right
   margins cleanly" as requested. Width-only: the card's own padding,
   border, and every child rule below is untouched, so the label-left/
   value-right row layout keeps working exactly as before. */
.booking-page .selected-menu{margin-left:-31px;margin-right:-31px;text-align:center}
/* Per request: unify this card's design with the confirmation screen's
   own white summary card (#booking-confirm-step / #confirm-summary),
   whose .summary-row/.summary-total rows stretch to the full padded
   width of their card with no inner cap. This card previously kept its
   rows capped to a centered 900px reading width (an earlier, now
   superseded decision) — removed here so #selected-items/.selected-
   total-line instead stretch to 100% of the card's own padding, exactly
   like the confirmation screen's rows do. The item description's own
   left alignment is unaffected (.selected-item-row > span keeps its own
   explicit text-align:left below, which still wins over the inherited
   center on the "選択メニュー" label). */
.selected-menu #selected-items,
.selected-menu .selected-total-line{width:100%}
.selected-total-line { display:flex; justify-content:space-between !important; align-items:center; border-top:1px solid #ddd4cd; margin-top:18px; padding-top:18px; font-size:18px; }
.selected-total-line strong { color:#8a3d4d; font:600 30px/1 Arial,Helvetica,"Noto Sans JP",sans-serif; white-space:nowrap; }
.selected-label { color:#b87568; letter-spacing:2px; font-size:13px; }
/* 選択メニュー / Selected Menu section title: solid black, bold. Scoped
   to .selected-menu specifically (3 classes) so it wins over the site's
   own "body.d6-theme .summary-group-title, body.d6-theme
   .selected-label{color:var(--color-primary)}" theme rule further down
   (2 classes) regardless of source order, without touching that shared
   rule itself — .summary-group-title (an unrelated element elsewhere)
   keeps its existing teal color untouched. */
body.d6-theme .selected-menu .selected-label{color:#000000;font-weight:700}
.selected-menu h2 { margin:8px 0 2px; font-size:28px; }
.selected-menu p { margin:0; color:#81766f; font:italic 18px Georgia,"Times New Roman",serif; }
.selected-menu > strong { color:#8a3d4d; font:600 30px/1 Arial,Helvetica,"Noto Sans JP",sans-serif; white-space:nowrap; }
.booking-box h2 { margin:0 0 10px; font-size:25px; }
/* Customer Information heading only (now the first element on the
   booking form step) — centered top, scoped to #booking-form's own h2
   so #booking-confirm-step's heading (which shares .booking-box h2)
   isn't affected by this rule (it now gets its own centering rule
   directly below, per a later request). */
#booking-form > h2 { text-align:center; }
/* 予約内容の確認 heading only, per request. Scoped to the id (unique to
   booking.html) rather than editing the shared .booking-box h2 rule
   above, since that class/element combo is also used by admin.html,
   review.html and mypage.html's own headings, which must stay exactly
   as they are. !important per the request, to guarantee this wins
   regardless of any other rule. */
#confirm-title { text-align:center !important; }
.booking-help { color:#6e655f; margin-top:0; }
.addon-list { display:grid; gap:10px; }
.addon-option { display:grid; grid-template-columns:auto 1fr auto; gap:12px; align-items:center; padding:13px 14px; border:1px solid #e5ddd7; background:#faf8f5; cursor:pointer; }
.addon-option input { width:18px; height:18px; accent-color:#8a3d4d; }
.addon-text b { display:block; font-size:15px; }
.addon-text small { display:block; margin-top:3px; color:#81766f; }
.addon-option strong { color:#8a3d4d; white-space:nowrap; }
.total-line { display:flex; justify-content:space-between; align-items:center; border-top:1px solid #ddd4cd; margin-top:22px; padding-top:20px; font-size:18px; }
.total-line strong { color:#8a3d4d; font:600 30px/1 Arial,Helvetica,"Noto Sans JP",sans-serif; }
.booking-box form, .booking-box label { display:block; }
#booking-form label { margin:18px 0; }
#booking-form label > span { display:block; margin-bottom:7px; font-weight:600; }
#booking-form input, #booking-form textarea { width:100%; padding:13px 14px; border:1px solid #d8d0ca; background:#fff; border-radius:3px; font:inherit; color:#302a27; }
/* Customer Information fields (name/phone/email/note) nudged in from the
   left edge for better visual balance — scoped to just those 4 labels via
   :has() so the date/time picker label (which wraps the full-width
   availability calendar, not a text field) is left untouched. */
#booking-form label:has(> input[type="text"]),
#booking-form label:has(> input[type="tel"]),
#booking-form label:has(> input[type="email"]),
#booking-form label:has(> textarea) { margin-left:28px; }
#booking-form input:focus, #booking-form textarea:focus { outline:2px solid #ead0d5; border-color:#8a3d4d; }
.booking-submit { display:inline-flex; align-items:center; justify-content:center; box-sizing:border-box; height:var(--btn-height); margin:0; padding:0 var(--btn-padding-x); border:0; border-radius:var(--btn-radius); background:#302a27; color:#fff; font:600 var(--btn-font-size)/1 var(--font-body); white-space:nowrap; text-decoration:none; cursor:pointer; vertical-align:middle; }
#booking-form .booking-submit { width:100%; margin-top:8px; }
/* Selected/booked menu item photo — shown next to the item throughout the
   booking flow (Selected Menu summary on the menu-selection step, the
   Booking Form's 選択メニュー sidebar, 予約内容の確認 and the final
   ありがとうございました success screen — see js/menu.js's addItem()/
   summaryGroup(), js/booking.js's refreshSelectionData()/buildSummary())
   and My Page's 次回の予約/予約履歴 booking cards (js/mypage.js's
   bookingCard()). Exact same width/height as the Menu page's own photo
   column (.menu-table-image img, 106px) per explicit request, and the
   same radius/object-fit/placeholder treatment, so the thumbnail never
   changes size or style as it follows the item from page to page. A
   Hand+Foot combo is two separate services, so it shows two thumbnails
   side by side (.item-thumb-wrap) instead of picking just one. */
.item-thumb-wrap{display:flex;gap:6px;flex-shrink:0}
.item-thumb,
.item-thumb-placeholder{display:block;width:106px;height:106px;border-radius:var(--radius-card);object-fit:cover;background:linear-gradient(135deg,#f2ece6,#e7ddd3);flex-shrink:0}

/* Picture on the left; name, design/details and est. duration stacked to
   its right (in that order), price on the far right — the photo and
   price both span all 3 text rows so they stay vertically centered next
   to the whole block, however many rows of text there are. */
.summary-menu { display:grid; grid-template-columns:auto 1fr auto; gap:4px 20px; padding:18px 0; border-bottom:1px solid #ddd4cd; }
.summary-menu b { font-size:21px; }
.summary-menu span { color:#81766f; }
.summary-menu-details { display:block; color:#81766f; font:italic 14px Georgia,"Times New Roman",serif; }
.summary-menu .item-thumb,
.summary-menu .item-thumb-placeholder,
.summary-menu .item-thumb-wrap{grid-column:1; grid-row:1 / span 3;}
.summary-menu strong { grid-column:3; grid-row:1 / span 3; color:#8a3d4d; font:600 24px/1 Arial,Helvetica,"Noto Sans JP",sans-serif; }
@media(max-width:720px){
  /* Stack picture above the menu name/details/duration on mobile —
     single column, everything falls back into DOM order: picture, name,
     details, duration, price. */
  .summary-menu { grid-template-columns:1fr; }
  .summary-menu .item-thumb,
  .summary-menu .item-thumb-placeholder,
  .summary-menu .item-thumb-wrap,
  .summary-menu strong { grid-column:1; grid-row:auto; }
}
.summary-row { display:flex; justify-content:space-between; gap:20px; padding:14px 0; border-bottom:1px solid #eee8e3; }
.summary-row span { color:#6e655f; }
.summary-row b { text-align:right; }
.summary-total { display:flex; justify-content:space-between; padding-top:20px; font-size:20px; }
.summary-total strong { color:#8a3d4d; font:600 30px/1 Arial,Helvetica,"Noto Sans JP",sans-serif; }
.confirm-actions { display:flex; flex-wrap:wrap; align-items:center; justify-content:center; gap:12px; margin-top:25px; }
/* Color-only variants — sizing (height/padding/radius/font) always
   comes from the shared .btn/.booking-submit base above, never
   redeclared here, so a variant can never drift out of sync with the
   rest of the button system. */
.secondary-btn { border:1px solid #302a27; background:#fff; color:#302a27; cursor:pointer; }
/* Admin > 予約を編集 (#booking-edit-panel) and Admin > カレンダー >
   ＋予定あり を追加 (#day-panel's #block-form): 「保存する」(.booking-submit)
   and its sibling 「キャンセル」(.btn.secondary-btn) now share the exact
   same height/padding/radius/font from the unified button token system
   above (see .btn / .booking-submit), so no per-panel patch is needed
   any more to make them match — the old hardcoded override that used to
   live here has been removed as a now-redundant duplicate. */
/* 「予約を送信する」 (#save-booking) reuses the exact same .booking-submit
   styling as 「予約内容を確認する」 (background, border, radius, color,
   font, height — all from the shared token system). It only needs its
   own width:100%. */
#save-booking { width:100%; }
/* Booking confirmation step only: 予約を送信する centered on top, 入力に
   戻る stacked directly underneath at the exact same full-width size.
   Scoped to #booking-confirm-step (not the bare .confirm-actions class,
   which admin.html/admin.js and mypage.html's own unrelated button rows
   also use, and must stay untouched) and to the two IDs, which only ever
   exist on this one page. flex-direction:column here doesn't touch the
   shared .confirm-actions rule's own row/wrap layout used elsewhere —
   only overrides it, more specifically, for this one instance. order
   controls stacking regardless of the buttons' HTML order (入力に戻る
   comes first in the markup); width/height/padding/font-size/radius for
   入力に戻る already come from the same shared .btn/--btn-* tokens as
   .booking-submit (see above), so only width and order need setting —
   its color is untouched, still from the existing .secondary-btn /
   body.d6-theme .secondary-btn rules. */
#booking-confirm-step .confirm-actions{flex-direction:column}
#save-booking{order:1}
#back-to-form{order:2;width:100%}
.email-note { color:#81766f; font-size:13px; line-height:1.7; margin-top:18px; }
[hidden] { display:none !important; }
@media(max-width:720px){
  .booking-page .selected-menu, .booking-page .booking-box { padding:22px 18px; }
  /* Keep the negative margin matched to the padding (+1px border) above
     so the card stays flush with the form's outer edge at this
     breakpoint too. */
  .booking-page .selected-menu { margin-left:-19px; margin-right:-19px; }
  .selected-menu { align-items:flex-start; }
  .selected-menu h2 { font-size:22px; }
  .selected-menu > strong { font-size:24px; }
  .addon-option { grid-template-columns:auto minmax(0,1fr) auto; padding:11px 9px; gap:8px; }
  .addon-text b { font-size:14px; }
  .addon-option strong { font-size:14px; }
  .confirm-actions { flex-direction:column; }
  .confirm-actions .btn, .confirm-actions .booking-submit { width:100%; text-align:center; }
}


/* HAND + FOOT selector - uses the existing salon styling */
.tabs{grid-template-columns:repeat(4,1fr)}
/* About/Access/Cancellation Policy nav: 3 items, not 4 — overrides the
   4-col rule just above (same specificity, later in source order) at
   every width, not just the ≤720px case handled separately below. */
.about-page-tabs{grid-template-columns:repeat(3,1fr)}
/* Per request: in-page tab switching for about.html (About/Access/
   Cancellation Policy) — the 3 buttons in .about-page-tabs above stay
   fixed in place; only the content panel below fades smoothly when the
   inline <script> at the bottom of about.html toggles which panel's
   [hidden] attribute is cleared. Scoped to .about-tab-panel, a class
   used only by that page's own markup, so this can't affect any other
   page. [hidden]{display:none!important} (declared elsewhere in this
   file) makes the inactive panels fully removed from layout; the moment
   a panel's hidden attribute is cleared it re-enters the render tree
   and this animation plays from the start automatically (CSS animations
   don't run on display:none elements), giving the "smooth" toggle
   requested without any JS-driven opacity/timing code. */
.about-tab-panel{animation:about-tab-fade .25s ease}
@keyframes about-tab-fade{from{opacity:0}to{opacity:1}}
.handfoot-box{margin:18px 0;border:1px solid #ded6cf;background:#fff;padding:30px}
.handfoot-choice{margin-bottom:22px}
.handfoot-heading{font-weight:700;margin-bottom:9px}
.handfoot-choice select{width:100%;padding:14px;border:1px solid #d8d0ca;background:#fff;color:#302a27;font:inherit}
.handfoot-summary{border-top:1px solid #ddd4cd;margin-top:28px;padding-top:18px}
.handfoot-summary>div{display:flex;justify-content:space-between;align-items:center;gap:16px;padding:10px 0}
.handfoot-summary strong{color:#8a3d4d;font-family:Arial,Helvetica,"Noto Sans JP",sans-serif;font-variant-numeric:normal;font-stretch:normal}
.handfoot-summary .handfoot-total{border-top:1px solid #eee8e3;margin-top:8px;padding-top:18px;font-size:20px}
.handfoot-summary .handfoot-total strong{font-size:28px}
/* Per-menu 所要時間（目安） estimate shown alongside each Hand/Foot price
   line, plus the combined total on the Total row — see menuDuration()/
   the handfoot select handler in js/menu.js for how each value is
   calculated (each menu's own individual estimate, summed for Total). */
.handfoot-label{white-space:nowrap}
.handfoot-duration{color:#81766f;font-size:13px;white-space:nowrap}
.handfoot-total .handfoot-duration{font-size:14px;white-space:normal}
.handfoot-book{display:flex;align-items:center;justify-content:center;box-sizing:border-box;height:var(--btn-height);width:fit-content;min-width:160px;margin:20px auto 0;padding:0 var(--btn-padding-x);border-radius:var(--btn-radius);background:#302a27;color:#fff;text-decoration:none;font-size:var(--btn-font-size);font-family:var(--font-body);font-weight:600;line-height:1;white-space:nowrap}
@media(max-width:720px){
  .tabs{grid-template-columns:repeat(2,1fr)}
  .handfoot-box{padding:22px 18px}
  .handfoot-heading{font-size:16px}
  /* menu.html's, booking.html's, about.html/access.html/policy.html's, and
     mypage.html's category bars: stay 4-in-a-row (or 3, for the About-family
     pages — see .about-page-tabs below) even on narrow phones per explicit
     request ("arranged horizontally in one row"), instead of the shared
     2x2 fallback above — .menu-category-tabs wins here because it comes
     after the plain .tabs rule at equal specificity. Tighter padding/
     font-size (scoped to this class, not the shared .tabs button/a rules —
     mypage.html's #change-tabs is untouched) keep 4 columns from feeling
     cramped at phone widths; wrapping the icon+label onto its own line is
     fine since the row itself still stays a single row. */
  .menu-category-tabs{grid-template-columns:repeat(4,1fr)}
  .menu-category-tabs button,.menu-category-tabs a{padding:12px 2px;font-size:12px;line-height:1.3}
  .menu-category-tabs button small,.menu-category-tabs a small{font-size:10.5px}
  .menu-category-tabs .tab-icon{display:block;margin:0 0 3px;font-size:1.2em}
  /* About/Access/Cancellation Policy: 3 items, not 4 — overrides the 4-col
     rule just above (same specificity, later in source order). */
  .about-page-tabs{grid-template-columns:repeat(3,1fr)}
}
/* Very narrow phones (e.g. 320px-wide devices, same breakpoint the header
   already has its own extra-narrow tweak for above): one more notch down
   so "ハンド＋フット" (the longest label) still fits its column on one
   line instead of wrapping mid-word. Placed after the 720px block above
   so it wins at 320px, where both media queries are simultaneously true. */
@media(max-width:340px){
  .menu-category-tabs button,.menu-category-tabs a{padding:10px 1px;font-size:10.5px}
  .menu-category-tabs button small,.menu-category-tabs a small{font-size:9.5px}
}

/* Booking success view */
.success-title{font-size:51px;margin:0 0 8px}
.success-lead{font-size:16px;color:#666;margin:0 0 24px}
.success-subtitle{font-size:18px;margin:0 0 12px}

/* Cart-style menu selection (Hand / Foot / Hand+Foot / Add-ons).
   選択済み (selected) state: dark-ink fill (so it reads clearly as
   "chosen" against the light theme) + white text, still clickable
   (clicking it again removes the item — see js/menu.js) so no
   disabled/dimmed styling here. Same position/size/padding/radius as
   the unselected 選択する button — only fill, border and cursor differ.
   No !important here (unlike the old dark theme) — nothing else in
   the cascade needs to be beaten now that the dead legacy article/
   .card layout, which used to force competing !important colors on
   these same classes, has been removed. */
.select-btn.is-selected,
.handfoot-book.is-selected { background:var(--color-ink); border:1px solid #000000; color:#fff; cursor:pointer; opacity:1; }
.section-total { display:flex; justify-content:space-between; align-items:center; border-top:1px solid #ddd4cd; margin-top:8px; padding-top:20px; font-size:18px; }
.section-total strong { color:#8a3d4d; font:600 26px/1 Arial,Helvetica,"Noto Sans JP",sans-serif; }
/* NOTE: an .addon-toggle-btn rule previously lived here. It matches no
   element in any current HTML/JS file — confirmed dead/unused CSS,
   removed as a duplicate carrying its own conflicting hardcoded
   padding/radius/font values instead of the shared button tokens. */
.selected-summary { margin-top:45px; border:1px solid #ded6cf; background:#faf8f5; padding:30px; }
.summary-group { margin-bottom:22px; }
.summary-group-title { display:block; color:#b87568; letter-spacing:2px; font-size:13px; margin-bottom:10px; }
.summary-item { display:grid; grid-template-columns:auto 1fr auto auto; gap:14px; align-items:center; padding:10px 0; border-bottom:1px solid #eee8e3; }
.summary-item span small { display:block; color:#81766f; font:italic 14px Georgia,"Times New Roman",serif; }
.summary-item strong { color:#8a3d4d; white-space:nowrap; }
.remove-btn { border:1px solid #cbb; background:#fff; color:#8a3d4d; border-radius:16px; padding:6px 14px; font-size:13px; cursor:pointer; white-space:nowrap; }

/* My Page 次回の予約 / 予約履歴 booking cards (js/mypage.js's
   bookingCard()): the existing .summary-group/.summary-row detail lines
   are wrapped in .booking-card-details so the item photo (.item-thumb,
   same 106px size as everywhere else) can sit beside them without
   changing how those rows themselves look — action buttons (予約変更 /
   予約キャンセル / 同じ内容でもう一度予約) stay outside this row,
   spanning the full card width below, exactly as before. */
.booking-card-media-row{display:flex;gap:16px;align-items:flex-start;margin-bottom:14px}
.booking-card-details{flex:1;min-width:0}
.booking-card-details .summary-row:first-child{padding-top:0}
.grand-total { display:flex; justify-content:space-between; align-items:center; border-top:2px solid #ddd4cd; margin-top:15px; padding-top:20px; font-size:20px; }
.grand-total strong { color:#8a3d4d; font:600 30px/1 Arial,Helvetica,"Noto Sans JP",sans-serif; }
/* Combined 所要時間（目安） across every selected menu (each item's own
   individually-estimated duration, summed — see grandDuration() in
   js/menu.js). Recalculates automatically whenever a menu is added or
   removed, same as .grand-total does for price. */
.grand-duration { text-align:right; color:#81766f; font-size:14px; margin-top:6px; }
.next-btn { width:100%; margin-top:22px; }
.empty-note { color:#81766f; padding:20px 0; }

/* Booking page: itemized selected menu + page title states */
.selected-item-row { display:flex; align-items:center; justify-content:space-between; gap:16px; padding:6px 0; }
/* The name/subtext/duration <span> sits between the thumbnail and the
   price as its own flex item, so space-between above was free to float it
   toward the middle of the row instead of flush against the thumbnail.
   An auto right-margin absorbs that leftover space instead, keeping the
   text block left-aligned right after the thumbnail while the price stays
   pinned to the right — without changing the row's own flex settings. */
.selected-item-row > span { text-align:left; margin-right:auto; }
.selected-item-row small { display:block; color:#81766f; font:italic 14px Georgia,"Times New Roman",serif; }
.selected-duration-line strong { font-size:20px; }
@media(max-width:720px){
  /* Stack picture above the menu name/details/duration on mobile. */
  .selected-item-row { flex-direction:column; align-items:flex-start; gap:8px; }
}

.booking-page>small,
.booking-page>h1 { text-align:center; display:block; }
@media(max-width:720px){
  /* Stack picture above the menu name/details/duration on mobile
     (instead of side by side) — single column, DOM order top to bottom:
     picture, then name/details/duration, then price, then 削除. */
  .summary-item { grid-template-columns:1fr; }
  .remove-btn { grid-column:1 / -1; justify-self:start; }
}

/* Booking page title states (form / confirm / success) */
#page-title-form,
#page-title-confirm,
#page-title-success { text-align:center; }
#page-title-form h1 { font:500 58px Georgia,"Times New Roman",serif; margin:20px 0 60px; }
@media(max-width:720px){
  #page-title-form h1 { font-size:43px; margin-bottom:45px; }
}

/* Per request: polite "not yet submitted" reminder, shown only on the
   booking confirmation screen — it lives inside #page-title-confirm,
   which js/booking.js's showTitle('confirm') only ever unhides for that
   one step (not the booking-form step, not the success/thank-you
   screen) — positioned directly below the キャンセルポリシー toggle row
   and, in visual stacking order, right above #booking-confirm-step's
   予約内容の確認 heading. Note: this codebase no longer has a literal
   animated header color rotation (that JS-driven color-cycling was
   removed from js/main.js in an earlier redesign, replaced by a fixed
   header); var(--color-primary) is the current header/brand's own theme
   color (used by the header's nav-link underline, 予約する button, hover
   states, etc.), so it's used here as the closest match to "the header
   theme color" requested. */
.confirm-not-submitted-note{margin:0 0 36px;font-weight:700;font-size:16px;line-height:1.8;color:var(--color-primary);text-align:center !important}
.policy-toggle-row { display:inline-flex; align-items:center; gap:10px; margin:20px 0 60px; }
.policy-link { color:#b03a3a; font-size:14px; letter-spacing:1px; }
.policy-plus-btn { width:28px; height:28px; border-radius:50%; border:1px solid #b03a3a; background:#fff; color:#b03a3a; font-size:18px; line-height:1; cursor:pointer; display:inline-flex; align-items:center; justify-content:center; padding:0; }
.policy-panel { position:relative; text-align:left; max-width:640px; margin:0 auto 60px; border:1px solid #ded6cf; background:#faf8f5; padding:36px 30px 30px; }
.policy-close-x { position:absolute; top:14px; right:16px; border:0; background:none; font-size:22px; line-height:1; color:#6e655f; cursor:pointer; }
.policy-panel-content { color:#6e655f; line-height:1.9; margin-bottom:22px; }
.policy-close-btn { display:flex; align-items:center; justify-content:center; box-sizing:border-box; height:var(--btn-height); width:fit-content; margin:0 auto; padding:0 var(--btn-padding-x); border:1px solid #302a27; background:#fff; color:#302a27; border-radius:var(--btn-radius); cursor:pointer; font-size:var(--btn-font-size); font-family:var(--font-body); font-weight:600; line-height:1; white-space:nowrap; }

.thanks-title { font-size:40px; margin:20px 0 20px; }
.received-badge { display:inline-block; background:#302a27; color:#fff; border-radius:24px; padding:10px 26px; font-size:14px; font-weight:600; margin-bottom:60px; }

/* Auth pages (register/login) */
.auth-page{max-width:520px}
.auth-box label{display:block;margin-bottom:18px}
.auth-box label span{display:block;margin-bottom:6px;font-size:14px;color:#6e655f}
.auth-box input{width:100%;padding:12px 14px;border:1px solid #ded6cf;border-radius:4px;font-size:16px;box-sizing:border-box}
.auth-error{color:#b03a3a;font-size:14px;margin:0 0 16px}
.auth-success{color:#2e7d32;margin-bottom:20px}
.auth-switch{text-align:center;margin-top:18px;color:#6e655f;font-size:14px}
.auth-switch a{color:#8a3d4d;text-decoration:underline}

/* Create Account page: 「アカウントを作成」 and Login sit side by side,
   styled to match the footer's "Contact Us" button colors (white/teal)
   instead of .booking-submit's usual teal/white. Sizing (height,
   padding, radius, font) now comes entirely from the shared
   .booking-submit base rule — this block only overrides color/border
   and adds flex:1 so the two buttons split the row evenly, matching
   each other's width regardless of their (different, Japanese/English)
   label lengths. */
.auth-actions-row{display:flex;gap:14px;align-items:center;margin-top:8px}
/* "body.d6-theme .auth-actions-row .booking-submit" (not just
   ".auth-actions-row .booking-submit") is needed here to out-specificity
   the site-wide "body.d6-theme .booking-submit{background:#0F9FB4;...}"
   dark-theme rule (every customer page, including this one, carries the
   d6-theme class) — otherwise that rule's extra body-class selector wins
   and silently keeps the old teal/white look instead of Contact Us's
   white/teal one. */
body.d6-theme .auth-actions-row .booking-submit{
  flex:1;
  background:#fff;
  color:#0F9FB4;
  letter-spacing:.5px;
  transition:background-color .25s ease,color .25s ease,transform .15s ease;
}
body.d6-theme .auth-actions-row .booking-submit:hover,
body.d6-theme .auth-actions-row .booking-submit:focus-visible{
  background:#D8AFA0;
  color:#fff;
  transform:translateY(-2px);
}
@media(max-width:480px){
  .auth-actions-row{flex-direction:column}
}

/* ------------------------------------------------------------
   GLASSMORPHISM LOGIN / CREATE ACCOUNT CARD (login.html,
   register.html only — added via a new .auth-glass class kept
   separate from the plain .auth-page/.auth-box/.auth-error/
   .auth-success/.auth-switch rules above, which stay exactly as
   they were so email-confirmed.html — which also uses .auth-page
   but was not asked for this redesign — is completely unaffected.
   Visual reference: user-supplied glassmorphism template (frosted
   card, soft white border, blur, rounded corners, floating title
   tab). Re-themed with the site's own teal brand color and the
   existing images/hero-bg.jpg (same image/technique the homepage
   .hero already uses) instead of a new background asset. Header,
   footer and nav markup/CSS are completely untouched — this only
   restyles the .page content area between them on these two pages. */
.auth-glass{
  max-width:none;
  width:100%;
  margin:0;
  padding:70px 20px;
  min-height:75vh;
  display:flex;
  flex-direction:column;
  align-items:center;
  justify-content:center;
  background:
    linear-gradient(rgba(15,159,180,.55),rgba(9,48,58,.82)),
    url(../images/hero-bg.jpg) center/cover no-repeat;
}
.auth-glass>small{display:none}
.auth-card{
  position:relative;
  width:100%;
  max-width:420px;
  padding:48px 36px 36px;
  background:rgba(255,255,255,.15);
  border:1px solid #fff;
  border-radius:26px;
  backdrop-filter:blur(18px);
  -webkit-backdrop-filter:blur(18px);
  box-shadow:0 10px 40px rgba(0,0,0,.25),inset 0 0 20px rgba(255,255,255,.08);
  color:#fff;
  /* Card + its floating title tab (a child of this element, so it moves
     as one unit) shifted up exactly 0.5cm. transform doesn't affect the
     box's own size or the layout/spacing of anything around it. */
  transform:translateY(-0.5cm);
}
.auth-title{
  position:relative;
  z-index:2;
  display:block;
  width:fit-content;
  min-width:160px;
  margin:-74px auto 32px;
  padding:15px 32px;
  text-align:center;
  background:rgba(255,255,255,.95);
  color:var(--color-ink);
  border-radius:0 0 20px 20px;
  font:700 26px/1.2 var(--font-body);
  letter-spacing:.5px;
  box-shadow:0 6px 18px rgba(0,0,0,.18);
}
.auth-card .auth-box label{margin-bottom:8px;font-size:15px;color:#fff;font-weight:700;letter-spacing:.2px}
/* Two pre-existing rules target this <span> text directly — ".auth-box
   label span{color:#6e655f}" further up, and the higher-specificity
   "body.d6-theme .auth-box label span{color:var(--color-text-muted)}"
   further down — both beat a color merely inherited from the label above
   (explicit styles always win over inheritance), so every field label's
   actual visible text was still rendering muted gray despite the white
   label rule. The body.d6-theme prefix here matches that second rule's
   specificity class-for-class while adding the .auth-card/.auth-box
   scope, so this wins and applies only inside the auth card. */
body.d6-theme .auth-card .auth-box label span{color:#fff}
/* The pre-existing ".auth-box label span{display:block}" rule (further
   up, unchanged, still needed by its single-span JA-only original use)
   is more specific than the sitewide ".lang-en{display:none}" toggle
   rule, so without this override BOTH languages would show at once for
   any bilingual <span class="lang-ja">/<span class="lang-en"> pair
   placed inside a label here (field labels, the Remember-me checkbox
   label) — these three rules restore the normal toggle behavior. */
.auth-card .auth-box label .lang-en{display:none}
body.english .auth-card .auth-box label .lang-en{display:block}
body.english .auth-card .auth-box label .lang-ja{display:none}
.auth-card .input-box{position:relative;margin-bottom:22px}
.auth-card .input-box input,
.auth-card .password-field input{
  width:100%;
  height:48px;
  padding:0 44px 0 18px;
  color:#fff;
  font-size:15px;
  background:rgba(255,255,255,.1);
  border:1px solid #fff;
  border-radius:26px;
  outline:none;
  box-sizing:border-box;
  transition:border-color .2s ease,background-color .2s ease;
}
.auth-card .input-box input:focus,
.auth-card .password-field input:focus{border-color:#fff;background:rgba(255,255,255,.18)}
/* Decorative field-type icon (envelope/user/phone) — inline SVG, same
   viewBox/stroke convention already used sitewide (header account icon,
   footer contact icons) rather than pulling in an icon-font library, so
   there's no external-CDN dependency that could silently fail to load. */
.auth-card .input-box .icon{position:absolute;right:17px;bottom:14px;color:#fff;opacity:.9;pointer-events:none}
/* .password-field nests INSIDE .input-box here (label + password-field
   wrapper, mirroring the plain-input case's label + input) — no extra
   margin-bottom needed on .password-field itself, .input-box's own
   margin-bottom above already provides the gap to the next field. */
.auth-card .password-toggle{color:#fff;opacity:.9}
.auth-card .password-toggle:hover{opacity:1}
.auth-card .options{display:flex;flex-wrap:wrap;justify-content:space-between;align-items:center;gap:10px;margin:-6px 0 24px;font-size:14px}
.auth-card .remember{display:flex;align-items:center;gap:8px;color:#fff;font-weight:600;cursor:pointer}
/* Custom checkbox — the native control renders as a tiny, hard-to-see
   square against the glass card, so it's redrawn (appearance:none) as a
   rounded box with a CSS-only checkmark (clip-path), matching the
   reference template's clearly visible checked state. Purely visual —
   the underlying <input type="checkbox" name="remember"> keeps its
   normal checked/unchecked state and form behavior unchanged. */
.auth-card .remember input{
  appearance:none;-webkit-appearance:none;
  width:19px;height:19px;
  margin:0;
  border:1.5px solid #fff;
  border-radius:5px;
  background:rgba(255,255,255,.12);
  display:inline-grid;
  place-content:center;
  cursor:pointer;
  transition:background-color .15s ease,border-color .15s ease;
}
.auth-card .remember input::before{
  content:"";
  width:11px;height:11px;
  transform:scale(0);
  transition:transform .12s ease-in-out;
  box-shadow:inset 1em 1em #fff;
  clip-path:polygon(14% 44%,0 65%,50% 100%,100% 16%,80% 0%,43% 62%);
}
.auth-card .remember input:checked{background:rgba(255,255,255,.25);border-color:#fff}
.auth-card .remember input:checked::before{transform:scale(1)}
.auth-card .options a{color:#fff;font-weight:600;text-decoration:none}
.auth-card .options a:hover{text-decoration:underline}
body.d6-theme .auth-card .auth-error{
  color:#fff;
  background:rgba(176,58,58,.4);
  border:1px solid #fff;
  border-radius:10px;
  padding:10px 14px;
}
.auth-card .auth-success{
  color:#fff;
  background:rgba(46,125,50,.35);
  border:1px solid #fff;
  border-radius:10px;
  padding:14px 16px;
  text-align:center;
}
/* Account-created success state (register.js) replaces the form with the
   message above plus a 「ログインへ」 link styled as a .btn. .btn is
   inline-flex, which centers its own label text but still follows normal
   left-aligned inline flow inside the form — so without this override the
   button sits flush left under the centered success message above it. */
.auth-card .auth-success + .btn{display:flex;width:fit-content;margin:0 auto}
body.d6-theme .auth-card .auth-switch{color:#fff;font-size:14.5px}
/* The sitewide bilingual toggle (css line ~630) shows English text as
   display:block by default — right for stacked JA-main/EN-caption pairs
   elsewhere on the site, but wrong here: this paragraph's JA and EN spans
   need to flow inline on one line. Without this override, "Create Account"
   (and, on login.html, the new "Don't have an account?" span below) would
   each force their own line no matter what white-space says. */
body.english .auth-card .auth-switch .lang-en{display:inline}
/* Login page only: the "Don't have an account? Create Account" line (added
   below) is right at the edge of the card's content width in English —
   nowrap keeps it on one line as requested instead of letting it wrap.
   Scoped to #login-form's sibling so register.html's shorter switch line
   (a different page, not asked for here) is completely unaffected. */
#login-form ~ .auth-switch{white-space:nowrap}
body.d6-theme .auth-card .auth-switch a{color:#8fe9dd;font-weight:700;text-decoration:none}
body.d6-theme .auth-card .auth-switch a:hover{text-decoration:underline}
body.d6-theme .auth-card .booking-submit{
  width:100%;
  height:50px;
  background:rgba(255,255,255,.92);
  color:var(--color-ink);
  font-weight:700;
  transition:background-color .25s ease,transform .15s ease;
}
body.d6-theme .auth-card .booking-submit:hover,
body.d6-theme .auth-card .booking-submit:focus-visible{
  background:#fff;
  transform:translateY(-1px);
}
@media(max-width:480px){
  .auth-glass{padding:50px 16px}
  .auth-card{padding:38px 22px 26px}
  .auth-title{font-size:19px;padding:12px 22px;margin-top:-64px}
}

/* My Page */
.mypage-page .booking-box{margin-bottom:24px}
.profile-row{display:flex;justify-content:space-between;gap:16px;padding:10px 0;border-bottom:1px solid #f2efec}
.profile-form label{display:block;margin:14px 0 0}
.profile-form label span{display:block;margin-bottom:6px;font-size:14px;color:#6e655f}
.profile-form input{width:100%;padding:10px 12px;border:1px solid #ded6cf;border-radius:4px;box-sizing:border-box}
#edit-profile-btn{margin-top:18px}
#logout-btn{margin-top:10px}
.mypage-logout-btn{width:100%}

/* My Page: single-column content — the left sidebar (avatar + name +
   anchor-link nav) has been removed per the requested redesign, and the
   content column expands to fill the freed-up width naturally rather
   than leaving an empty layout column. All the functions the sidebar
   used to link to (profile top, reservations, favorites, edit profile,
   logout) stay reachable exactly as before — they're just the visible
   sections of this single flowing column now, plus the header's own
   MY PAGE nav item/icon and the top-left MENU dropdown (.page-menu-toggle)
   for getting back here from anywhere on the site / jumping between
   sections. No id/attribute changes anywhere — js/mypage.js's guarded
   sidebar-only hooks (sidebarNameEl/sidebarEditLink/sidebarLogoutLink)
   simply find nothing and no-op, exactly as designed. Widened from the
   original 820px now that .mypage-page itself is full-width (see
   .menu-page,.booking-page,.mypage-page above), so the extra page width
   translates into a genuinely wider content column instead of just more
   blank space on either side — .favorites-grid below already reflows into
   more columns on its own as this grows, no changes needed there. Still a
   single flowing column of cards (content/structure unchanged), just
   roomier — not restructured into a multi-column dashboard grid. */
.mypage-content{max-width:1200px;margin:8px auto 0;display:flex;flex-direction:column;gap:24px}
/* Per request: wrap whichever tab panel is currently active (Profile /
   Upcoming Reservation / Booking History / Favorites — .mypage-content
   is the one shared container the inline tab-switcher script above
   shows/hides them inside of) in its own solid white card, so the
   section sits inside one clean white boundary instead of floating
   loose on the page's cream background (most visible today on the
   "ご予約一覧" group title on the Upcoming Reservation tab, which
   currently sits directly on the cream page background above its own
   card). Purely additive — background/radius/shadow/padding only, on
   the OUTER wrapper alone; every element inside (.booking-box cards,
   profile rows, labels, buttons) keeps its own existing margin/padding/
   alignment rules completely untouched, so nothing inside shifts
   position relative to anything else, it just now all sits within extra
   outer white padding. Values reuse the site's own existing card tokens
   (--radius-card/--shadow-card, the same ones .booking-box itself
   already uses) so this new outer card matches the site's established
   card look exactly. !important guarantees this applies regardless of
   any other rule, per the request. */
.mypage-content{background:#ffffff!important;border-radius:var(--radius-card)!important;box-shadow:var(--shadow-card)!important;padding:28px 30px!important}
.mypage-content>.booking-box{margin-bottom:0}
.mypage-group-title{margin:0 0 14px;font-size:15px;letter-spacing:1px;color:var(--color-text-faint);text-transform:uppercase}
/* Per request: in-page tab switching for mypage.html (Profile/Upcoming
   Reservation/Booking History/Favorites) — the 4 buttons in #mypage-tabs
   stay fixed in place; only the panel below fades smoothly when the
   inline <script> at the bottom of mypage.html toggles which one's
   [hidden] is cleared. [data-tab-panel] is only ever set on the 4 direct
   children of .mypage-content that own a tab (#mypage-top, the new
   Upcoming/History wrapper divs, #mypage-favorites), so this can't
   affect anything elsewhere on the site. Same technique as about.html's
   equivalent tab system: [hidden]{display:none!important} (declared
   elsewhere in this file) removes the inactive panels from layout
   entirely, and CSS animations don't run on display:none elements, so
   the fade plays fresh every time a panel's hidden attribute is cleared
   — no JS-driven opacity/timing code needed. */
.mypage-content [data-tab-panel]{animation:mypage-tab-fade .25s ease}
@keyframes mypage-tab-fade{from{opacity:0}to{opacity:1}}

/* Admin */
/* ------------------------------------------------------------
   Admin shell: left sidebar navigation + main content area.
   Replaces the old horizontal pill-tab row (.site-header
   admin-header logo/logout bar + .admin-tabs row) with a
   fixed-height left sidebar, per an explicit request to match a
   reference dashboard layout. The nav buttons keep their original
   `admin-tab` class and `data-tab` attribute completely unchanged
   — js/admin.js's existing tab-switch logic only does
   document.querySelectorAll('.admin-tab') and toggles
   .active/[hidden], so nothing there needed to change. Scoped
   under new admin-shell/admin-sidebar/admin-topbar/admin-content
   classes, intentionally using the shared :root design tokens
   (teal accent, card radius/shadow) the same deliberate,
   documented way the cm-* Customer Management block above already
   does on this page — everything below this point (booking/
   calendar/customer/menu section content, forms, cards) is
   completely untouched. ------------------------------------------------------------ */
.admin-shell{display:flex;align-items:flex-start;min-height:100vh;background:var(--color-bg)}

.admin-sidebar{flex:0 0 260px;width:260px;position:sticky;top:0;height:100vh;overflow-y:auto;background:var(--color-surface);border-right:1px solid var(--color-border);display:flex;flex-direction:column;z-index:30}
.admin-sidebar-brand{padding:26px 24px 20px;border-bottom:1px solid var(--color-border-soft)}
.admin-sidebar-brand-name{display:block;font:700 19px var(--font-body);color:var(--color-ink)}
.admin-sidebar-brand-sub{display:block;margin-top:3px;font-size:12.5px;color:var(--color-text-faint);letter-spacing:.5px}

.admin-nav-list{display:flex;flex-direction:column;gap:4px;padding:18px 14px;flex:1}
.admin-sidebar .admin-tab{display:flex;align-items:center;gap:12px;width:100%;padding:12px 14px;border:0;border-radius:12px;background:none;color:var(--color-text-muted);font:600 14.5px var(--font-body);text-align:left;cursor:pointer;transition:background-color .15s ease,color .15s ease}
.admin-sidebar .admin-tab:hover{background:var(--color-border-soft);color:var(--color-ink)}
.admin-sidebar .admin-tab.active{background:var(--color-primary-tint);color:var(--color-primary-dark)}
.admin-nav-icon{flex:none;font-size:18px;line-height:1;width:22px;text-align:center}
.admin-nav-label{flex:1;min-width:0}

.admin-main{flex:1;min-width:0}
.admin-topbar{display:flex;align-items:center;justify-content:space-between;gap:16px;padding:18px 32px;border-bottom:1px solid var(--color-border-soft);background:var(--color-surface);position:sticky;top:0;z-index:20}
/* flex:1 + justify-content:center (not text-align, which has no effect on
   flex children) lets 管理画面 sit centered in the leftover space to the
   left of ログアウト — the same fix pattern used for the 手動予約作成/
   顧客詳細 headers earlier. ログアウト itself and its own text are
   untouched, still pinned at the bar's right edge exactly as before. */
.admin-topbar-left{display:flex;align-items:center;justify-content:center;gap:14px;flex:1}
.admin-topbar-title{font:700 17px var(--font-body);color:var(--color-ink)}
.admin-sidebar-toggle{display:none;align-items:center;justify-content:center;flex:none;width:38px;height:38px;border:1px solid var(--color-border);border-radius:10px;background:#fff;color:var(--color-ink);cursor:pointer}

.admin-content{max-width:1600px;margin:0 auto;padding:32px 32px 70px}

.admin-sidebar-backdrop{position:fixed;inset:0;background:rgba(30,43,43,.4);z-index:29;display:none}

@media(max-width:1080px){
  .admin-sidebar{flex-basis:208px;width:208px}
  .admin-sidebar-brand{padding:22px 18px 16px}
  .admin-nav-list{padding:16px 10px}
  .admin-sidebar .admin-tab{padding:11px 10px;font-size:14px}
  .admin-content{padding:26px 22px 60px}
  .admin-topbar{padding:16px 22px}
}

@media(max-width:760px){
  .admin-shell{display:block;min-height:auto}
  .admin-sidebar{position:fixed;top:0;left:0;bottom:0;height:100vh;width:min(280px,82vw);flex-basis:auto;transform:translateX(-100%);transition:transform .25s ease;box-shadow:var(--shadow-card-hover);z-index:60}
  .admin-sidebar.is-open{transform:translateX(0)}
  .admin-sidebar-backdrop:not([hidden]){display:block}
  .admin-sidebar-toggle{display:inline-flex}
  .admin-topbar{padding:14px 16px}
  .admin-content{padding:20px 16px 50px}
}

.admin-section{display:grid;gap:16px}
.admin-card{border:1px solid #ded6cf;background:#fff;padding:20px 24px}
.admin-card-row{display:flex;justify-content:space-between;gap:16px;padding:6px 0;border-bottom:1px solid #f2efec}
.admin-add-btn{max-width:280px;margin-bottom:20px}
#menu-item-form label{display:block;margin:14px 0}
#menu-item-form label span{display:block;margin-bottom:6px;font-size:14px;color:#6e655f}
#menu-item-form input[type=text],#menu-item-form input[type=number],#menu-item-form select,#menu-item-form textarea{width:100%;padding:10px 12px;border:1px solid #ded6cf;border-radius:4px;box-sizing:border-box;font-size:15px}
/* #gallery-item-form (ギャラリー管理's upload form) needs this same
   block-label + full-width-input treatment as #menu-item-form above —
   without it, labels/inputs fall back to inline browser defaults instead
   of the site's usual stacked field layout. */
#gallery-item-form label{display:block;margin:14px 0}
#gallery-item-form label span{display:block;margin-bottom:6px;font-size:14px;color:#6e655f}
#gallery-item-form input[type=text]{width:100%;padding:10px 12px;border:1px solid #ded6cf;border-radius:4px;box-sizing:border-box;font-size:15px}
.checkbox-label{display:flex !important;align-items:center;gap:8px}
.checkbox-label input{width:auto !important}

/* 手動予約作成 (#admin-new-booking): styled as a professional printed-form
   page — a centered, fixed-width "sheet" (roughly A4 proportions at
   on-screen scale) sitting on the admin's cream background, with a
   document-style header, grouped sections and an aligned field grid,
   rather than the plain top-to-bottom label stack used elsewhere.
   Scoped selectors (.admin-a4-page ancestor) are used throughout so these
   rules reliably out-specificity the generic ".booking-box label{display:
   block}" / ".booking-box form,.booking-box label{display:block}" base
   rules (0,1,1) that would otherwise win over a bare ".admin-a4-field"
   class alone (0,1,0). manualForm.date/.duration/.time/etc. (js/admin.js)
   are all read via the form's own named-element API and FormData, which
   don't care about this extra markup/wrapping at all — zero JS changes
   needed. */
.admin-a4-page{max-width:1100px;margin:0 auto;background:#fff;border:1px solid var(--color-border);border-radius:6px;box-shadow:0 10px 34px rgba(40,32,26,.09);padding:24px 48px 18px}
.admin-a4-page-header{display:flex;align-items:flex-end;justify-content:space-between;gap:16px;padding-bottom:12px;margin-bottom:18px;border-bottom:2px solid var(--color-ink);background:#fff !important}
.admin-a4-page-header h2{margin:0;font:700 25px/1.3 var(--font-body);color:var(--color-ink)}
.admin-a4-page-subtitle{margin:6px 0 0;font-size:13px;color:var(--color-text-muted)}
.admin-a4-page-brand{font:700 13px/1 var(--font-body);color:var(--color-primary);letter-spacing:1.5px;white-space:nowrap}
.admin-a4-section{margin-bottom:20px}
.admin-a4-section:last-of-type{margin-bottom:14px}
.admin-a4-section-title{margin:0 0 10px;font:700 13px/1 var(--font-body);color:var(--color-primary-dark);letter-spacing:1px;padding-bottom:8px;border-bottom:1px solid var(--color-border)}
.admin-a4-page .admin-a4-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:14px 18px}
.admin-a4-page .admin-a4-field{display:flex;flex-direction:column;gap:4px;margin:0}
.admin-a4-page .admin-a4-field span{display:block;font:600 12px/1 var(--font-body);color:var(--color-text-muted);letter-spacing:.3px}
.admin-a4-page .admin-a4-field input,
.admin-a4-page .admin-a4-field select,
.admin-a4-page .admin-a4-field textarea{height:40px;padding:0 14px;border:1px solid var(--color-border);border-radius:8px;background:var(--color-surface);color:var(--color-ink);font:15px/1 var(--font-body);box-sizing:border-box}
.admin-a4-page .admin-a4-field textarea{height:auto;padding:12px 14px;line-height:1.7;resize:vertical}
.admin-a4-page .admin-a4-field input:focus,
.admin-a4-page .admin-a4-field select:focus,
.admin-a4-page .admin-a4-field textarea:focus{outline:none;border-color:var(--color-primary);box-shadow:0 0 0 3px rgba(15,159,180,.15)}
.admin-a4-page .admin-a4-field select:disabled{opacity:.5;cursor:not-allowed}
/* お客様情報's メールアドレス was the only field actually using this "wide"
   span inside a real grid (the ご要望・備考 textarea below uses the class
   too, but isn't inside a .admin-a4-grid at all, so grid-column has never
   affected it) — now that the grid is 3 columns instead of 2, お名前 /
   電話番号 / メールアドレス fit on one row on their own without forcing this
   span, which is what actually shortens the form enough to fit a laptop
   screen without scrolling. */
.admin-a4-field-wide{grid-column:auto}
.admin-a4-actions{display:flex;justify-content:center;padding-top:14px;border-top:1px solid var(--color-border)}
/* This section's own bottom padding (.admin-content has a large 70px
   bottom padding shared by every admin tab) was adding dead space below
   the form specifically here — scoped via :has() to only this section's
   tab so no other admin page's spacing changes. Combined with the
   tightened spacing above, this is what actually gets the whole form to
   fit inside one laptop screen without scrolling. */
.admin-content:has(#admin-new-booking:not([hidden])){padding-bottom:14px}
@media(max-width:760px){
  .admin-a4-page{padding:28px 20px 30px}
  .admin-a4-page-header{flex-direction:column;align-items:flex-start;gap:2px}
  .admin-a4-page .admin-a4-grid{grid-template-columns:1fr}
}

/* Password field with show/hide toggle */
.password-field{position:relative}
.password-field input{padding-right:46px !important}
.password-toggle{position:absolute;right:8px;top:50%;transform:translateY(-50%);border:0;background:none;font-size:18px;cursor:pointer;line-height:1;padding:6px}

/* Email confirmed page */
.email-confirmed-page{text-align:center}
.email-confirmed-page .thanks-title{font-size:34px;margin:20px 0 24px}
.confirmed-message{color:#6e655f;line-height:1.9;margin-bottom:30px}
.confirmed-login-btn{max-width:280px;margin:0 auto}
/* Invalid/expired/already-used confirmation link state (#confirm-error) —
   same page, same layout, just the existing .auth-error red used for the
   heading/message and two existing button styles (.booking-submit primary,
   .secondary-btn outline) placed side by side instead of the single Login
   button in the success state. */
#confirm-error .thanks-title{color:#b03a3a}
.confirmed-message-error{color:#b03a3a}
.confirm-error-actions{display:flex;justify-content:center;gap:14px;flex-wrap:wrap}
.confirm-error-actions .confirmed-login-btn{margin:0}
@media(max-width:480px){
  .confirm-error-actions{flex-direction:column;align-items:center}
}

/* NOTE: a "Homepage hero: matching button pair" rule (.hero .btn /
   .hero-book-btn) previously lived here. Neither selector matches any
   element in any current HTML file (the hero section only contains the
   .quick nav cards, no button) — confirmed dead/unused CSS, removed as
   a duplicate that could otherwise silently reintroduce a conflicting
   200px-fixed-width button if a .btn were ever added inside .hero.

   Booking form bottom actions: 戻る (back) + キャンセルをする (cancel) —
   .form-bottom-actions .btn used to redeclare its own padding/radius/
   font-size (a duplicate of .btn's sizing, and already superseded on
   every real customer page by the body.d6-theme combined selector
   below that sets its color). Removed; sizing now comes from the one
   shared .btn rule and color comes from the single d6-theme rule. */
/* Per request: an exact, neat 15px gap between 次へ (the last thing inside
   #booking-form) and 戻る directly below it, plus new margin-bottom:1cm so
   戻る sits with a full extra 1cm of clear cream space above the footer,
   on top of .booking-page's own existing bottom page padding (that shared
   padding is untouched, so every other page/step keeps its own bottom
   spacing exactly as before) — pulling this whole button stack further up
   and away from the footer, exactly as asked.
   Getting the gap to exactly 15px takes three coordinated numbers, not
   just this one: #booking-form (the white card 次へ sits inside) has its
   own 28px bottom padding, an 18px margin-bottom (both from the shared
   .booking-page .selected-menu,.booking-page .booking-box rule further
   up), AND a 1px bottom border — margin-top here only controls ONE side
   of an adjoining margin pair (adjacent block margins collapse to
   whichever is LARGER, so setting this alone to 15px was silently doing
   nothing while the form's own 18px margin was still bigger), and that
   border sits between the padding and the margin regardless of either
   value. The #booking-form override just below zeroes that card's own
   bottom padding/margin for this one card ONLY (ID-scoped, so no other
   .booking-box card anywhere else is touched); this margin-top is then
   the sole remaining contributor besides that 1px border, so 14px here
   plus the 1px border together make the true, exact, final 15px gap. */
.form-bottom-actions{display:flex;justify-content:center;align-items:center;gap:14px;margin-top:14px;margin-bottom:1cm;padding:0 31px}
#booking-form{padding-bottom:0;margin-bottom:0}
/* 戻る (#back-to-menu-select-btn): stacked directly underneath 次へ
   (予約内容を確認する) at the exact same width. .form-bottom-actions
   itself already spans the same outer width as #booking-form (the
   .booking-box card), so the 31px left/right padding above exactly
   mirrors the form's own 30px padding + 1px border inset — the same
   31px figure already used to align the full-width Selected Menu card
   with the form's edges — so this button's own edges land exactly under
   次へ's edges once it goes full width below. Height, padding, font-size
   and border-radius already come from the same shared --btn-* tokens as
   .booking-submit (see the .btn rule above), so only width needs setting
   here — color is untouched, still coming from the existing
   body.d6-theme .form-bottom-actions .btn rule further down. */
.form-bottom-actions .btn{width:100%}
/* Match the reduced 18px padding + 1px border form inset at the same
   720px breakpoint the form's own padding changes at (mirrors the
   .selected-menu card's own -19px adjustment). Placed after the base
   rule above (not inside the earlier @media(max-width:720px) block
   further up the file) so it actually wins the cascade at this width —
   same specificity, later source order. */
@media(max-width:720px){
  .form-bottom-actions{padding:0 19px}
}

/* "Add more options" button above 次へ in the selected-menu summary —
   width/spacing only; height/padding/radius/font come from .btn (this
   is always rendered as class="btn secondary-btn add-more-btn"). */
.add-more-btn{width:100%;margin-top:22px;margin-bottom:0}


/* Admin: menu image upload + thumbnails */
.admin-card-thumb{width:100%;max-height:160px;object-fit:cover;border-radius:6px;margin-bottom:14px;display:block;background:#f2efec}
.menu-image-preview{margin-bottom:10px}
.menu-image-preview-img{max-width:220px;max-height:160px;object-fit:cover;border-radius:6px;display:block}

/* Admin: メニュー管理 — same card look as booking.html/menu.html's own
   menu display (.hp-menu-list/.hp-menu-card/.hp-card-* above, unscoped
   so they already apply here unchanged), grouped into the 3 real
   categories with one identical header treatment for all three ("top
   bata footer samma same style" — no per-category variation). */
.admin-menu-group{margin-bottom:36px}
.admin-menu-group:last-child{margin-bottom:0}
.admin-menu-group-head{margin-bottom:16px;padding-bottom:10px;border-bottom:2px solid var(--color-ink)}
.admin-menu-group-head h2{margin:0;font:700 22px/1.3 var(--font-body);color:var(--color-ink)}
.admin-menu-group-head p{margin:4px 0 0;font-size:13px;color:var(--color-text-muted)}
.admin-menu-card-en{margin:0;font-size:13px;color:var(--color-text-muted)}
/* .hp-card-actions actually renders as a flex row (display:flex!important
   from the site's "unified action buttons" rule further down overrides
   its own display:grid), with every .hp-card-primary/.hp-card-secondary
   forced to a fixed 180px!important width by that same rule — sized for
   the 2-button case customer pages use (詳細/選択する). 3 admin actions
   (編集/公開・非公開/削除) at 180px each don't fit one row at that width,
   so they wrapped. Scoping through .admin-menu-card (specificity high
   enough to beat those same-specificity !important rules) lets these 3
   buttons stretch to fill the row evenly instead of using the fixed
   180px, so they always fit on a single line regardless of card width. */
.admin-menu-card .hp-card-actions{flex-wrap:nowrap!important}
.admin-menu-card .hp-card-actions .hp-card-primary,
.admin-menu-card .hp-card-actions .hp-card-secondary{
  width:auto!important;
  min-width:0!important;
  flex:1 1 0!important;
}
@media(max-width:640px){
  .admin-menu-card .hp-card-actions{flex-wrap:wrap!important}
  .admin-menu-card .hp-card-actions .hp-card-primary,
  .admin-menu-card .hp-card-actions .hp-card-secondary{flex:1 1 100%!important}
}
/* メニュー管理 category switcher — reuses .hp-menu-switch's existing visual
   style (3-column pill bar, dark #5e514d "black" active state) verbatim,
   just giving the 2-line emoji+EN / JP label enough room to breathe.
   #admin-menu-category-switch (ID) guarantees this wins over the plain
   .hp-menu-switch button rule regardless of source order. */
/* ＋新しいメニューを追加 — .admin-add-btn (shared with 2 other admin "add"
   buttons that must stay exactly as they are) only caps max-width and adds
   a bottom margin; it's still a plain inline-flex box sitting at the
   default left edge. Scoped by ID so only this one button centers. */
#add-menu-item-btn{display:flex;width:max-content;margin:0 auto 20px}
#admin-menu-category-switch{margin:0 auto 24px;max-width:720px}
#admin-menu-category-switch button{min-height:64px;line-height:1.3;padding:10px 8px}
#admin-menu-category-switch button small{display:block;margin-top:3px;font-size:11px;opacity:.85}

/* Admin: ギャラリー管理 (gallery photo/video upload) — same admin-add-btn
   centering treatment as メニュー管理's ＋新しいメニューを追加 above, plus a
   new .gm-* prefixed card grid (its own prefix, not reusing .hp-menu-card,
   since a gallery item is media-first — one big square thumbnail + a
   short caption + publish/delete actions — not a priced menu item). */
#add-gallery-item-btn{display:flex;width:max-content;margin:0 auto 20px}
.gm-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(220px,1fr));gap:16px}
.gm-card{border:1px solid var(--color-border,#ded6cf);background:var(--color-surface,#fff);border-radius:var(--radius-card,16px);overflow:hidden;box-shadow:var(--shadow-card)}
.gm-card-media-wrap{position:relative;aspect-ratio:1/1;background:#f2ece6}
.gm-card-media{width:100%;height:100%;object-fit:cover;display:block}
.gm-video-badge{position:absolute;bottom:8px;right:8px;background:rgba(0,0,0,.6);color:#fff;font-size:11px;font-weight:700;padding:3px 8px;border-radius:999px}
.gm-card-body{padding:12px 14px 4px}
.gm-card-caption{margin:0 0 8px;font-size:13px;color:var(--color-ink)}
.gm-card-actions{display:flex;gap:8px;padding:0 14px 14px;flex-wrap:nowrap}
/* Same override .admin-menu-card .hp-card-actions uses above: the site-wide
   "unified action buttons" rule (~line 3639) forces every .hp-card-secondary
   to a fixed 180px!important width, which is right for the 2-button
   customer-facing case but makes these 2 admin actions wrap onto separate
   lines in a narrow gallery card. !important here is required to win over
   that rule (an !important declaration always beats a more-specific
   non-important one), not just for specificity. */
.gm-card-actions .hp-card-secondary{
  width:auto!important;
  min-width:0!important;
  flex:1 1 0!important;
}
@media(max-width:480px){
  .gm-card-actions{flex-wrap:wrap!important}
  .gm-card-actions .hp-card-secondary{flex:1 1 100%!important}
}
.gm-preview{margin-bottom:10px}
.gm-preview-media{max-width:220px;max-height:160px;object-fit:cover;border-radius:6px;display:block}

/* 予約管理 の 予約中／キャンセル履歴 — the shared .tabs base rule always
   divides into 3 equal grid columns (it's written for the 3-button bars
   elsewhere: 月/週/日, 今日/今週/今月), so with only these 2 real buttons
   they were packed into the left 2 of 3 columns, leaving a dead empty
   column on the right and reading as pushed to the left instead of
   centered. Scoped to just this bar (#admin-bookings, an ID ancestor, so
   it wins regardless of source order) so every other .admin-subtabs bar
   elsewhere keeps its original 3-column layout untouched. */
#admin-bookings .admin-subtabs{grid-template-columns:repeat(2,1fr)}

/* Admin: dashboard summary cards */
.dashboard-summary{display:grid;grid-template-columns:repeat(auto-fit,minmax(160px,1fr));gap:16px}
.dashboard-card{border:1px solid #ded6cf;background:#fff;padding:24px;text-align:center}
.dashboard-card span{display:block;color:#6e655f;font-size:14px;margin-bottom:10px}
.dashboard-card strong{font:500 36px Georgia,"Times New Roman",serif;color:#8a3d4d}
.dashboard-card-cancelled strong{color:#b03a3a}
/* 次の予約 shows a name+time string, not a number — the 36px Georgia
   numeral style above would make it oversized/awkward, so this modifier
   (applied only to that one card) keeps it readable text instead. */
.dashboard-card-text strong{font:600 16px Arial,"Noto Sans JP",sans-serif;color:#8a3d4d;line-height:1.4}

/* Admin Dashboard upgrade — quick actions, today's schedule/availability,
   sales/stats period tabs, menu/customer breakdowns, upcoming bookings,
   recent activity. All scoped to elements js/admin.js only ever renders
   inside #admin-dashboard, so none of this can reach a customer page.
   Every color/radius/spacing below reuses an existing rule elsewhere in
   this file — see the comments on each block. */
.dashboard-quick-actions{display:flex;gap:12px;flex-wrap:wrap;margin-bottom:24px}
.dashboard-two-col{display:grid;grid-template-columns:repeat(auto-fit,minmax(340px,1fr));gap:24px;margin-top:16px}

/* Status badges — same 12px-pill sizing as .week-edit-time-btn, same
   colors already used elsewhere for the same meanings (teal = customer
   booking, maroon = in-progress/active, red = cancelled, and the site's
   one existing green — .auth-success — for completed, so no new hue is
   introduced). */
.status-badge{display:inline-block;padding:3px 10px;border-radius:12px;font-size:11px;font-weight:700;line-height:1.6;white-space:nowrap}
.status-badge-upcoming{background:#0F9FB4;color:#E8F7F8}
.status-badge-active{background:#8a3d4d;color:#fff}
.status-badge-completed{background:#2e7d32;color:#fff}
.status-badge-cancelled{background:#b03a3a;color:#fff}

/* Emphasis accents for dashboard .admin-card rows — same maroon/red
   "this one matters" convention as .calendar-cell.is-today / .week-hour-schedule. */
.admin-card-next{border-left:3px solid #8a3d4d}
.admin-card-block{border-left:3px solid #b03a3a}
.dashboard-note{margin-top:4px}

/* Today's Availability — a horizontal version of the exact
   .week-hour-booked/.week-hour-schedule/.week-hour-empty teal/red/white
   triad used by the Weekly Calendar, plus a plain-text list underneath
   that's the real, always-legible source (the bar is glance-only and
   hides its own time label on very short segments). */
.availability-bar{display:flex;width:100%;height:40px;border:1px solid #ded6cf;border-radius:4px;overflow:hidden}
.availability-segment{display:flex;align-items:center;justify-content:center;font-size:11px;overflow:hidden;white-space:nowrap;padding:0 2px;box-sizing:border-box}
.availability-segment-booking{background:#0F9FB4;color:#E8F7F8}
.availability-segment-block{background:#b03a3a;color:#fff}
.availability-segment-free{background:#fff;color:#6e655f}
.availability-list{margin-top:10px;font-size:13px;color:#6e655f}
.availability-list-row{padding:3px 0;border-bottom:1px solid #f2efec}
.availability-list-row:last-child{border-bottom:0}

@media(max-width:720px){
  .dashboard-quick-actions{flex-direction:column}
  .dashboard-quick-actions .btn,.dashboard-quick-actions .secondary-btn{width:100%;text-align:center}
  .availability-bar{height:32px}
  .availability-segment{font-size:9px}
}

/* Admin: calendar */
.calendar-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:20px}
.calendar-header h2{font-size:20px;margin:0}
.calendar-weekdays{display:grid;grid-template-columns:repeat(7,1fr);text-align:center;color:#6e655f;font-size:13px;margin-bottom:6px}
.calendar-days{display:grid;grid-template-columns:repeat(7,1fr);gap:6px}
.calendar-cell{border:1px solid #ded6cf;background:#fff;padding:10px 6px;min-height:70px;text-align:left;cursor:pointer;font:inherit;border-radius:4px;display:flex;flex-direction:column;gap:4px}
.calendar-cell.empty{border:0;background:none;cursor:default}
.calendar-cell.is-today{border-color:#8a3d4d;border-width:2px}
.cal-day-num{font-size:14px;color:#302a27}
/* Admin calendar only: today's number turns red (iPhone-Calendar-style)
   when it isn't selected, and clicking a date puts a black border around
   that date's ENTIRE cell (not a ring around just the number) — the
   number itself just turns plain black, no border/circle of its own,
   and the cell's own background never changes. #calendar-grid/.calendar-
   cell only exist in the Admin 予約カレンダー tab (js/admin.js); the
   customer-facing date picker is a completely separate component
   (.cal-day, styled below), so nothing here can reach a customer page.
   Both rules are placed after .is-today above so a selected today (both
   classes present) correctly ends up black text with a black box
   border, overriding is-today's red text / maroon border rather than
   the other way around. */
#calendar-grid .calendar-cell.is-today .cal-day-num{color:#b03a3a}
#calendar-grid .calendar-cell.is-selected .cal-day-num{color:#302a27}
#calendar-grid .calendar-cell.is-selected{border-color:#302a27;border-width:2px}
.cal-count{font-size:12px;color:#8a3d4d;font-weight:600}
.cal-block-dot{font-size:11px;color:#b03a3a}
.admin-subtabs{margin-bottom:20px}
.admin-subtab{padding:10px 18px;border:1px solid #ded6cf;background:#fff;border-radius:20px;cursor:pointer;font-size:13px;margin-right:8px}
.admin-subtab.active{background:#302a27;color:#fff;border-color:#302a27}

/* Admin: day timeline */
.timeline-item{display:flex;gap:16px;padding:14px 0;border-bottom:1px solid #f2efec}
.timeline-time{flex:0 0 110px;font-weight:600;color:#8a3d4d}
.timeline-body{flex:1}
.timeline-status{color:#6e655f;font-size:13px}
.timeline-block .timeline-time{color:#b03a3a}
.timeline-block .timeline-body{display:flex;align-items:center;justify-content:space-between}
.timeline-block-actions{display:flex;gap:8px}
.admin-block-form-heading{margin:0 0 14px;font-size:16px;text-align:center}

.cancel-btn{border:1px solid #e3b3b3;background:#fff;color:#b03a3a}

/* Admin: Phase 2 additions */
.admin-section-title{font-size:18px;margin:36px 0 16px}
.popularity-list{list-style:none;margin:0;padding:0}
.popularity-list li{display:flex;justify-content:space-between;padding:10px 16px;border:1px solid #ded6cf;background:#fff;margin-bottom:8px}
.popularity-list li b{color:#8a3d4d}

.week-view{display:grid;grid-template-columns:repeat(7,1fr);gap:8px}
.week-day-col{display:flex;flex-direction:column;border:1px solid #ded6cf;background:#fff;padding:10px;min-height:160px}
.week-day-head{font-weight:600;margin-bottom:8px;padding-bottom:6px;border-bottom:1px solid #f2efec}
.week-day-head.is-today{color:#8a3d4d}
.week-item{font-size:12px;padding:6px 0;border-bottom:1px solid #f2efec}
.week-item b{display:block}
.week-block{color:#b03a3a}
.week-empty{color:#b9afa7}
/* Admin weekly calendar — hourly schedule (10:00–21:00) per day.
   .week-hour-booked = the site footer's own colors (#0F9FB4/#E8F7F8,
   same pair as the <footer> element), .week-hour-schedule = red for the
   admin's own 予定あり blocks, .week-hour-empty = white, .week-hour-closed
   = muted gray for hours outside that day's business hours. All scoped
   to .week-view/.week-day-col, which js/admin.js only ever renders
   inside Admin > カレンダー > 週 — this cannot reach any customer page,
   and .week-day-col's own white card background above is unchanged. */
.week-hours{display:flex;flex-direction:column;flex:1}
.week-hour-row{display:flex;align-items:stretch;border-bottom:1px solid #f2efec}
.week-hour-row:last-child{border-bottom:0}
.week-hour-label{flex:0 0 40px;padding:4px 4px 4px 0;font-size:11px;color:#6e655f;line-height:1.3}
.week-hour-slot{flex:1;min-height:28px;padding:3px 5px;font-size:11px;line-height:1.35;word-break:break-word}
.week-hour-slot b{display:block;font-size:11px}
.week-hour-empty .week-hour-slot{background:#fff}
.week-hour-booked .week-hour-slot{background:#0F9FB4;color:#E8F7F8}
.week-hour-schedule .week-hour-slot{background:#b03a3a;color:#fff}
.week-hour-closed .week-hour-slot{background:#f2efec}
.week-hour-closed .week-hour-label{color:#c9c0b8}
/* Full-day holiday column (schedule_blocks row titled 休み covering the
   whole day) — same black-background / vertical red "休業日" text
   treatment as the customer-facing booking calendar's holiday column
   (see .avail-cell.avail-holiday-cell / .avail-holiday-label further
   down), applied here to the admin's own Weekly Calendar. Bleeds past
   .week-day-col's own 10px padding on the left/right/bottom so the
   black fill reaches the card's edges, same as the customer grid's
   flush black cell — only the day-of-week/date header above stays on
   the card's normal white padding. */
.week-day-col.is-holiday-day .week-hours{margin:0 -10px -10px;background:#000;align-items:center;justify-content:center;border:0}
.week-holiday-label{writing-mode:vertical-rl;text-orientation:upright;color:#ff3b30;font-weight:700;font-size:30px;letter-spacing:4px;display:inline-block}

/* Weekly Calendar > per-booking actual-time editor (js/admin.js,
   loadCalendarWeek()/wireWeekBookingEditors()). Scoped entirely inside
   .week-hour-booked's ~28px-tall slot, so it deliberately does NOT reuse
   .btn/.secondary-btn (sized for full-page buttons) — these are small,
   self-contained styles that only ever render inside #week-view, which
   only exists on admin.html, so this cannot reach any customer page. */
.week-edit-time-btn{
  display:inline-block;margin-top:3px;padding:1px 8px;
  font-size:10px;line-height:1.6;border:1px solid #E8F7F8;border-radius:12px;
  background:transparent;color:#E8F7F8;cursor:pointer;
}
.week-edit-time-btn:hover{background:rgba(255,255,255,.18)}
.week-booking-edit-form{margin-top:2px}
.week-booking-edit-form label{display:block;font-size:10px;margin-top:3px;color:#E8F7F8}
.week-booking-edit-form input[type="time"]{
  width:100%;box-sizing:border-box;margin-top:1px;padding:2px 4px;
  font-size:11px;border:1px solid #d9eef1;border-radius:4px;background:#fff;color:#222222;
}
.week-edit-actions{display:flex;gap:6px;margin-top:4px}
.week-edit-save-btn,.week-edit-cancel-btn{
  flex:1;padding:3px 0;font-size:10px;border-radius:10px;cursor:pointer;
}
.week-edit-save-btn{border:1px solid #fff;background:#fff;color:#0F9FB4}
.week-edit-cancel-btn{border:1px solid #E8F7F8;background:transparent;color:#E8F7F8}
.week-edit-error{margin:4px 0 0;padding:3px 6px;font-size:10px;line-height:1.4;background:#fff;color:#b03a3a;border-radius:4px}

@media(max-width:720px){
  .week-edit-time-btn,.week-booking-edit-form label,.week-booking-edit-form input[type="time"],
  .week-edit-save-btn,.week-edit-cancel-btn,.week-edit-error{font-size:12px}
}

.timeline-booking{position:relative}
.timeline-edit-btn{align-self:center;font-size:12px;padding:8px 14px}

@media(max-width:720px){
  .week-view{grid-template-columns:1fr}
  .week-hour-label{flex-basis:48px;font-size:12px}
  .week-hour-slot{font-size:12px;min-height:32px;padding:5px 8px}
  .week-hour-slot b{font-size:12px}
}

/* ============================================================
   SITE-WIDE THEME — scoped to body.d6-theme, applied to every
   customer-facing page (index, menu, booking, about, access,
   policy, login, register, mypage, email-confirmed). Light,
   elegant palette — cream page background, white rounded cards
   with soft shadows, teal primary accent, blush/pink secondary —
   built from the :root tokens defined at the top of this file.
   admin.html intentionally does NOT get this class/theme — it is
   not part of the customer navigation and keeps its own styling.
   ============================================================ */
body.d6-theme{background:var(--color-bg);color:var(--color-ink)}

/* Eyebrow label + main title */
body.d6-theme .page>small,body.d6-theme #title-small{color:var(--color-primary)}
body.d6-theme .page>h1{color:var(--color-ink);display:table;margin-left:auto;margin-right:auto;padding-bottom:22px;position:relative}
body.d6-theme .page>h1::after{content:"";position:absolute;left:0;right:0;bottom:0;height:2px;background:var(--color-primary);border-radius:1px}

/* Category tabs (Hand Nail / Foot Nail / Hand + Foot / Add-ons; also the
   About/Access/Policy and My Page nav bars, which reuse this same .tabs
   styling with <a> instead of <button>) */
body.d6-theme .tabs{border-bottom-color:var(--color-border)}
body.d6-theme .tabs button,body.d6-theme .tabs a{color:var(--color-text-muted)}
body.d6-theme .tabs button small,body.d6-theme .tabs a small{color:var(--color-text-muted)}
body.d6-theme .tabs .active{color:var(--color-ink);border-bottom-color:var(--color-primary)}
/* Higher-specificity re-override for the new footer-color .active chip
   above — d6-theme's own .tabs .active rule (just above) is more
   specific than the plain .menu-category-tabs .active rule and would
   otherwise win, leaving the text dark instead of white. #change-tabs
   isn't .menu-category-tabs, so it's unaffected and keeps the dark-ink
   text from the rule above. */
body.d6-theme .menu-category-tabs .active{color:#fff}

/* Section headings */
body.d6-theme .menu-section-title{color:var(--color-ink)}
body.d6-theme .booking-help{color:var(--color-text-muted)}

/* Menu/price table (menu.html/booking.html) — the base .menu-table
   rules above are already light (white header text on teal, dark row
   text), so no override is needed here. Only the 選択する select
   button needs an explicit color, since it has no rule outside this
   theme block. Border is a plain 1px solid black on every state
   (unselected and 選択済み/is-selected alike) per explicit request —
   only the border color/style changed here, nothing else about the
   button (fill, text, radius, padding, position, hover) was touched. */
body.d6-theme .article-book{background:var(--color-primary);border:1px solid #000000;color:#fff}
body.d6-theme .select-btn.is-selected,
body.d6-theme .handfoot-book.is-selected{background:var(--color-ink);border:1px solid #000000;color:#fff;cursor:pointer;opacity:1}

/* Hand + Foot combined box */
body.d6-theme .handfoot-box{background:var(--color-surface);border-color:var(--color-border);border-radius:var(--radius-card);box-shadow:var(--shadow-card)}
body.d6-theme .handfoot-heading{color:var(--color-ink)}
body.d6-theme .handfoot-choice select{background:#fff;color:var(--color-ink);border-color:var(--color-border)}
body.d6-theme .handfoot-summary{border-top-color:var(--color-border)}
body.d6-theme .handfoot-summary strong{color:var(--color-ink)}
body.d6-theme .handfoot-duration{color:var(--color-text-faint)}
body.d6-theme .handfoot-book{background:var(--color-primary);border:1px solid #000000;color:#fff}

/* Notes / notices */
body.d6-theme .menu-note,
body.d6-theme .notice{background:var(--color-primary-tint);border:0;color:var(--color-ink);border-radius:var(--radius-card)}

/* ------------------------------------------------------------
   Rest of the site: headings, boxes/cards and buttons shared
   by index, about, access, policy, booking, login, register,
   mypage and email-confirmed.
   ------------------------------------------------------------ */

/* Headings (h1 already covered for size/spacing by existing
   per-page rules — only color + the title/underline treatment
   are added here) */
body.d6-theme h1,
body.d6-theme h2{color:var(--color-ink)}
/* The hero heading sits on the dark photo overlay again (see .hero
   above), so it needs to stay white — without this override, the rule
   just above (body.d6-theme h1{color:var(--color-ink)}, specificity
   0,1,2) silently outranks the plain .hero h1{color:#fff} rule (0,1,1)
   regardless of source order, which would render the heading dark-on-dark
   and invisible. body.d6-theme .hero h1 (0,2,2) correctly wins instead. */
body.d6-theme .hero h1{color:#fff}
body.d6-theme .page>small,
body.d6-theme .intro small,
body.d6-theme #title-small{color:var(--color-primary)}
body.d6-theme .page>h1,
body.d6-theme #page-title-form>h1{display:table;margin-left:auto;margin-right:auto;padding-bottom:22px;position:relative}
body.d6-theme .page>h1::after,
body.d6-theme #page-title-form>h1::after{content:"";position:absolute;left:0;right:0;bottom:0;height:2px;background:var(--color-primary);border-radius:1px}
body.d6-theme .thanks-title,
body.d6-theme .success-title{color:var(--color-ink)}
body.d6-theme .intro a{color:var(--color-primary)}

/* Boxes / cards: soft white surface, subtle border + shadow, rounded
   corners — the signature card treatment across the redesign. */
body.d6-theme .box,
body.d6-theme .quick a,
body.d6-theme .booking-box,
body.d6-theme .selected-menu,
body.d6-theme .selected-summary,
body.d6-theme .map-wrap,
body.d6-theme .policy-panel,
body.d6-theme .addon-option{background:var(--color-surface);border-color:var(--color-border);border-radius:var(--radius-card);box-shadow:var(--shadow-card)}
body.d6-theme .box,
body.d6-theme .quick a{color:var(--color-ink)}

/* Home page nav boxes: on hover/focus the border + icon shift to the
   teal accent and the card lifts slightly. */
body.d6-theme .quick a{transition:border-color .25s ease,box-shadow .25s ease,transform .15s ease}
body.d6-theme .quick a:hover,
body.d6-theme .quick a:focus-visible{border-color:var(--color-primary);box-shadow:var(--shadow-card-hover);transform:translateY(-2px)}
body.d6-theme .quick a:hover .quick-icon,
body.d6-theme .quick a:focus-visible .quick-icon{color:var(--color-primary)}

/* Buttons: teal = primary action, blush/pink outline = secondary,
   matching the reference design's button pairing. */
body.d6-theme .booking-submit,
body.d6-theme .received-badge{background:var(--color-primary);border-color:var(--color-primary);color:#fff}
body.d6-theme .page .btn:not(.secondary-btn):not(.cancel-btn){background:var(--color-primary);border-color:var(--color-primary);color:#fff}
body.d6-theme .secondary-btn,
body.d6-theme .add-more-btn,
body.d6-theme .form-bottom-actions .btn,
body.d6-theme .policy-close-btn,
body.d6-theme .remove-btn{background:#fff;border-color:var(--color-pink);color:var(--color-pink-dark);transition:background-color .2s ease,color .2s ease}
body.d6-theme .secondary-btn:hover,
body.d6-theme .add-more-btn:hover,
body.d6-theme .form-bottom-actions .btn:hover,
body.d6-theme .policy-close-btn:hover,
body.d6-theme .remove-btn:hover{background:var(--color-pink);color:#fff}
body.d6-theme .cancel-btn{background:var(--color-danger-tint);border-color:var(--color-danger);color:var(--color-danger)}

/* Forms: inputs/selects/textareas across booking, login,
   register, mypage and the Hand+Foot dropdowns */
body.d6-theme input,
body.d6-theme select,
body.d6-theme textarea{background:#fff;color:var(--color-ink);border-color:var(--color-border)}
body.d6-theme input:focus,
body.d6-theme select:focus,
body.d6-theme textarea:focus,
body.d6-theme #booking-form input:focus,
body.d6-theme #booking-form textarea:focus{outline-color:var(--color-primary);border-color:var(--color-primary)}
/* #booking-form input/textarea carry an ID selector, which beats a
   plain class override on specificity — matched here explicitly */
body.d6-theme #booking-form input,
body.d6-theme #booking-form textarea{background:#fff;color:var(--color-ink);border-color:var(--color-border)}
body.d6-theme .addon-option input{accent-color:var(--color-primary)}
body.d6-theme input:disabled,
body.d6-theme select:disabled,
body.d6-theme textarea:disabled{opacity:.5;cursor:not-allowed;border-color:var(--color-border)}
body.d6-theme .auth-box label span,
body.d6-theme .profile-form label span{color:var(--color-text-muted)}
body.d6-theme .auth-error{color:var(--color-danger)}
body.d6-theme .auth-switch{color:var(--color-text-muted)}
body.d6-theme .auth-switch a{color:var(--color-primary)}
body.d6-theme #confirm-error .thanks-title,
body.d6-theme .confirmed-message-error{color:var(--color-danger)}
body.d6-theme .policy-link,
body.d6-theme .policy-plus-btn{color:var(--color-danger);border-color:var(--color-danger);background:transparent}
body.d6-theme .policy-close-x{color:var(--color-text-muted)}
body.d6-theme .policy-panel-content{color:var(--color-text-muted)}

/* Summaries / totals used on the booking flow and My Page */
body.d6-theme .summary-menu,
body.d6-theme .summary-row,
body.d6-theme .grand-total,
body.d6-theme .section-total,
body.d6-theme .total-line,
body.d6-theme .selected-total-line,
body.d6-theme .profile-row,
body.d6-theme .summary-item{border-color:var(--color-border)}
body.d6-theme .summary-menu span,
body.d6-theme .summary-menu-details,
body.d6-theme .summary-row span,
body.d6-theme .selected-item-row small,
body.d6-theme .selected-menu p,
body.d6-theme .addon-text small,
body.d6-theme .summary-item span small,
body.d6-theme .email-note,
body.d6-theme .confirmed-message,
body.d6-theme .empty-note,
body.d6-theme .booking-help{color:var(--color-text-muted)}
body.d6-theme .grand-duration{color:var(--color-text-faint)}
body.d6-theme .summary-menu strong,
body.d6-theme .summary-total strong,
body.d6-theme .selected-menu>strong,
body.d6-theme .selected-total-line strong,
body.d6-theme .summary-item strong,
body.d6-theme .grand-total strong,
body.d6-theme .section-total strong,
body.d6-theme .total-line strong,
body.d6-theme .addon-option strong{color:var(--color-ink)}
body.d6-theme .summary-group-title,
body.d6-theme .selected-label{color:var(--color-primary)}

/* ------------------------------------------------------------
   BOOKING AVAILABILITY GRID (js/availability-grid.js)
   Hot-Pepper-Beauty-style date × time table. Shared verbatim by
   booking.html and mypage.html's change-booking panel — restyled
   once here so both stay in sync automatically. Light card style,
   built from the :root tokens above.
   ------------------------------------------------------------ */
.avail-wrap{background:var(--color-surface);border:1px solid var(--color-border);padding:14px;border-radius:var(--radius-card);box-shadow:var(--shadow-card)}
.avail-nav-row{display:flex;align-items:center;justify-content:space-between;gap:10px;margin-bottom:12px}
.avail-nav{width:34px;height:34px;flex:0 0 auto;border:1px solid var(--color-border);background:transparent;color:var(--color-ink);border-radius:50%;cursor:pointer;font-size:15px;line-height:1;transition:background-color .25s ease,border-color .25s ease,color .25s ease,opacity .25s ease}
.avail-nav:hover:not(:disabled){background:var(--color-primary);border-color:var(--color-primary);color:#fff}
.avail-nav:disabled{opacity:.3;cursor:not-allowed}
.avail-range{color:var(--color-ink);font-size:13px;font-weight:600;text-align:center;flex:1 1 auto}
.avail-scroll{overflow-x:auto;-webkit-overflow-scrolling:touch}
/* table-layout:fixed so column widths are set once from the header row
   (time column gets an explicit, slightly-narrower fixed width; the 7
   date columns have no width set, so fixed layout splits the remaining
   width EQUALLY between them — including any extra width beyond
   min-width once the table is wider than its container, e.g. on
   desktop) instead of the previous auto layout, where unconstrained
   space collapsed onto the time column and squeezed/cut off the dates. */
.avail-table{border-collapse:collapse;width:100%;min-width:560px;table-layout:fixed}
.avail-table th,.avail-table td{text-align:center;padding:0;border:1px solid var(--color-border-soft)}
.avail-time-col-head{background:var(--color-surface);width:56px;position:sticky;left:0;z-index:3}
.avail-date-col{background:var(--color-surface);color:var(--color-ink);font-weight:600;font-size:12px;padding:8px 4px;position:sticky;top:0;z-index:2}
.avail-date-col .avail-wd{display:block;color:var(--color-text-faint);font-size:11px}
.avail-date-col .avail-dt{display:block;font-size:13px;margin-top:2px}
.avail-date-col.is-selected-col{background:var(--color-primary-tint)}
.avail-date-col.is-selected-col .avail-wd{color:var(--color-primary-dark)}
.avail-time-label{background:var(--color-surface);color:var(--color-ink);font-size:12px;font-weight:600;padding:7px 10px;white-space:nowrap;width:56px;position:sticky;left:0;z-index:1}
.avail-cell{height:34px;font-size:21px;cursor:default;color:var(--color-border);transition:background-color .2s ease,color .2s ease,box-shadow .2s ease,border-color .2s ease}
.avail-cell.is-available{color:var(--color-primary);cursor:pointer;font-weight:600}
/* Available slot hover — same Cyber Cyan glow used on the header nav
   button hover effect (background/border/box-shadow/brightness). */
.avail-cell.is-available:hover{background:rgba(0,240,255,.25);border-color:#00F0FF;box-shadow:0 0 15px rgba(0,240,255,.7),inset 0 0 10px rgba(0,240,255,.4);filter:brightness(1.3)}
/* Already-selected slots: hovering should look like the normal selected
   state, not the Cyber Cyan glow above. Selected cells carry BOTH
   is-available and is-selected, so this equal-specificity rule is placed
   after .avail-cell.is-available:hover to win via source order and
   cancel the glow (background/border/box-shadow/filter reset). */
.avail-cell.is-selected:hover{background:var(--color-primary);color:#fff;font-weight:700;box-shadow:none;border-color:var(--color-border-soft);filter:none}
/* Unavailable slots: no hover effect at all — fully inert/unclickable,
   matching the original template behavior (not-allowed cursor,
   pointer-events disabled so no hover state can trigger). */
.avail-cell.is-unavailable{color:#ff3b30;cursor:not-allowed;pointer-events:none}
.avail-cell.is-selected{background:var(--color-primary);color:#fff;font-weight:700}
/* Full-day 休み (holiday) column: one rowspan-ed cell replaces the whole
   day's × grid. Solid black fill edge-to-edge (no inner bordered badge/box
   around the label — same red as the existing ×/予約不可 elsewhere in this
   grid) with the label written top-to-bottom, as on a real Japanese salon
   signage board. */
.avail-cell.avail-holiday-cell{background:#000;cursor:not-allowed;pointer-events:none;vertical-align:middle;padding:10px 0}
.avail-holiday-label{writing-mode:vertical-rl;text-orientation:upright;color:#ff3b30;font-weight:700;font-size:30px;letter-spacing:4px;display:inline-block}
.avail-loading{padding:24px 10px;color:var(--color-text-muted);font-size:13px}
.avail-legend{display:flex;align-items:center;gap:8px;margin-top:12px;font-size:18px;color:var(--color-text-muted)}
.avail-legend-ok{color:var(--color-primary);font-weight:700}
.avail-legend-ng{color:#ff3b30;font-weight:700;margin-left:14px}
.avail-selected{margin-top:8px;font-size:13px;color:var(--color-primary-dark);font-weight:600;min-height:1.2em}
@media(max-width:480px){
  .avail-table{min-width:520px}
  .avail-time-col-head,.avail-time-label{width:48px}
}
/* ご希望日・お時間 label heading — centered horizontally, with a bold
   red inline instruction note next to it. Scoped to the one label that
   directly wraps #avail-wrap (via :has()) so the other #booking-form
   label headings (お名前/電話番号/メールアドレス) are unaffected. The
   note's font-size is inherited (not hardcoded), so it always matches
   the heading text exactly. */
#booking-form label:has(> #avail-wrap) > span{text-align:center}
.avail-required-note{font-size:inherit;color:#ff3b30;font-weight:700;margin-left:8px}

/* ------------------------------------------------------------
   REVIEW PAGE (review.html / js/review.js)
   Deliberately reuses existing components as-is — .booking-box (form
   card), .btn (Login button), .booking-submit (submit button),
   .selected-summary (review list card), .menu-section-title (section
   heading), .empty-note — so only the star rating and individual
   review cards below are new, built from the same tokens/card style
   used throughout the light d6-theme.
   ------------------------------------------------------------ */
/* Per request: center every box on this page horizontally and center all
   of its text. review.html's <main> carries .booking-page too (see the
   comment on .booking-page .selected-menu,.booking-page .booking-box
   above — added only to widen those elements on booking.html), which
   was making #review-form-wrap/#review-guest (both .booking-box)
   stretch edge-to-edge across the full page instead of sitting in a
   compact centered card like .review-list-wrap already does (that one
   is capped via the separate .booking-page .selected-summary{max-width:
   900px;margin:auto} rule further up, since it's a .selected-summary,
   not a .booking-box). Capping these two IDs to the exact same 900px
   column keeps the "Submit a Review" card, the guest-login card and the
   "Customer Reviews" list all visually aligned to one centered column.
   ID selectors so this can only ever match these two elements — it
   can't affect booking.html's own .booking-box cards (a different
   page, no matching id), and it beats the class-based max-width:none
   rule regardless of source order. */
#review-form-wrap,
#review-guest{max-width:900px;margin-left:auto;margin-right:auto}
/* Center every piece of text on the page — headings, labels, textarea
   content, buttons' own text, error/success messages, and each review
   card's stars/name/comment/date. Scoped to descendants of .review-page
   (review.html's own <main> class, unique to this page) so it can never
   reach the header, off-canvas drawer, or footer above/below <main>, or
   any other page. !important per the request, so it wins regardless of
   any more specific rule elsewhere (e.g. .review-card-comment, which
   otherwise inherits normal left-to-right text flow). This only ever
   sets text-align — it doesn't change any element's display, width, or
   flex/grid layout, so .star-rating's own row (centered via
   justify-content below, since text-align has no effect on flex-item
   position) and every button's internal layout are unaffected. */
.review-page,
.review-page *{text-align:center!important}
/* Follow-up fix: the centering rule directly above (.review-page *)
   also caught the comment <textarea id="review-comment">, which made
   typed text and the placeholder start from the middle instead of the
   left — the normal, expected way to type into a text box. Scoped to
   the #review-comment ID (specificity beats the .review-page * class
   selector above even though both carry !important, so this safely
   wins without touching that rule or anything else it centers). Only
   text-align changes here; nothing else about the textarea's size,
   border, or styling is touched. */
#review-comment,
#review-comment::placeholder{text-align:left!important}
/* Intro paragraph: uses #review-intro (an ID selector) so it overrides
   the shared .box's border/background/padding for THIS element only —
   .box itself, and every other page that uses it (e.g. about.html), is
   untouched. Font family, size and color still come from .box/.page —
   only the border, background, padding, alignment and position change.
   Centered horizontally, no border/background box, and nudged up
   ~2 grid units (16px) from its original spot; the negative bottom
   margin pulls the sections below it up by another ~2 grid units too. */
#review-intro{
  border:0;
  background:transparent;
  padding:0;
  max-width:700px;
  margin:4px auto -12px;
  text-align:center;
}
/* 「お客様の声」 — centered within its own card, review page only
   (.menu-section-title elsewhere, e.g. the booking menu sections,
   stays left-aligned as before). */
.review-list-wrap .menu-section-title{text-align:center}
.review-guest-note{text-align:center;padding:6px 4px}
.review-guest-note p{margin:0 0 20px;line-height:1.8;color:var(--color-text-muted)}
.review-form label{display:block;margin:18px 0}
.review-form label>span{display:block;margin-bottom:7px;font-weight:600;color:var(--color-ink)}
.review-form textarea{width:100%;padding:13px 14px;border:1px solid var(--color-border);background:#fff;color:var(--color-ink);border-radius:8px;font:inherit;resize:vertical;box-sizing:border-box}
.review-form textarea:focus{outline:2px solid var(--color-primary-tint);border-color:var(--color-primary)}
.review-form .booking-submit{width:100%;margin-top:8px}
.review-error{color:var(--color-danger);font-size:14px;margin:4px 0 0}
.review-success{color:var(--color-success);font-size:14px;margin:4px 0 0}

/* justify-content:center per request — the star row is a flex container,
   so the text-align:center!important rule above (which only affects
   text/inline content, not flex-item placement) can't center these 5
   buttons on its own; this is the one extra rule needed to actually
   center the row itself. */
.star-rating{display:flex;gap:8px;justify-content:center}
.star-btn{background:none;border:0;padding:0;margin:0;font-size:34px;line-height:1;color:var(--color-border);cursor:pointer;transition:color .2s ease,transform .15s ease}
.star-btn:hover,.star-btn:focus-visible{transform:scale(1.12)}
.star-btn.is-filled{color:var(--color-primary)}
.star-rating-value{display:block;margin-top:8px;color:var(--color-text-muted);font-size:14px}

/* ============================================================
   ADMIN — Customer Management (顧客管理) page redesign.
   Deliberately opts INTO the shared :root design tokens above
   (unlike the rest of admin.html, which intentionally keeps its
   original hardcoded literals — see the note at the top of this
   file) so this one page can carry the site's light/teal visual
   language, per an explicit request to match it. Scoped entirely
   under new cm-* classes inside #admin-customers — nothing here
   touches any other admin-* rule or any other admin tab/section,
   and nothing on any customer-facing page reads a cm-* class.
   ============================================================ */
.cm-shell{display:flex;align-items:flex-start;gap:24px}
/* container-type (not a viewport media query) so the summary-card grid and
   table columns respond to cm-main's OWN rendered width. This matters
   because opening the 360px detail panel (.cm-detail-panel, flex:none)
   shrinks cm-main well below the outer viewport width on desktop — a
   viewport-based breakpoint would never fire in that case and the name
   column would get squeezed down to a few px with the panel open, even on
   a wide monitor. */
.cm-main{flex:1;min-width:0;container-type:inline-size;container-name:cm-main}

.cm-page-head{margin-bottom:22px}
/* justify-content:center (not just text-align:center) is needed here
   because this heading is a flex row (顧客管理 + Customer Management as two
   separate flex items with a gap) — text-align has no effect on how flex
   items are positioned along the row, so without this the two spans just
   pack at the flex-start (left) edge regardless of text-align. */
.cm-page-title{display:flex;align-items:baseline;justify-content:center;gap:10px;margin:0 0 6px;font:700 26px/1.2 var(--font-body);color:var(--color-ink)}
.cm-page-title-en{font-size:13px;font-weight:500;color:var(--color-text-faint)}
.cm-page-subtitle{margin:0;color:var(--color-text-muted);font-size:14px}

.cm-summary-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:14px;margin-bottom:22px}
.cm-summary-card{background:var(--color-surface);border:1px solid var(--color-border);border-radius:var(--radius-card);box-shadow:var(--shadow-card);padding:18px 20px}
.cm-summary-card-label{display:block;color:var(--color-text-muted);font-size:12.5px;margin-bottom:8px}
.cm-summary-card-value{display:block;font:700 26px/1.1 var(--font-body);color:var(--color-ink)}
.cm-summary-card-value small{display:block;margin-top:6px;font:500 12px/1.3 var(--font-body);color:var(--color-text-faint)}
.cm-summary-card.cm-accent .cm-summary-card-value{color:var(--color-primary-dark)}

.cm-toolbar{display:flex;align-items:center;gap:12px;margin-bottom:18px;flex-wrap:wrap}
.cm-search-wrap{position:relative;flex:1;min-width:220px}
.cm-search-icon{position:absolute;left:14px;top:50%;transform:translateY(-50%);color:var(--color-text-faint);pointer-events:none}
.cm-search-input{width:100%;box-sizing:border-box;height:44px;padding:0 14px 0 40px;border:1px solid var(--color-border);border-radius:10px;background:var(--color-surface);color:var(--color-ink);font-size:14px;font-family:var(--font-body)}
.cm-search-input:focus{outline:none;border-color:var(--color-primary)}
.cm-filter-select{height:44px;padding:0 14px;border:1px solid var(--color-border);border-radius:10px;background:var(--color-surface);color:var(--color-ink);font-size:14px;font-family:var(--font-body);cursor:pointer}
.cm-export-btn{display:inline-flex;align-items:center;gap:8px;height:44px;padding:0 18px;border:1px solid var(--color-border);border-radius:10px;background:var(--color-surface);color:var(--color-ink);font-size:14px;font-family:var(--font-body);font-weight:600;cursor:pointer;white-space:nowrap;transition:border-color .2s ease,color .2s ease}
.cm-export-btn:hover{border-color:var(--color-primary);color:var(--color-primary-dark)}

.cm-table-wrap{background:var(--color-surface);border:1px solid var(--color-border);border-radius:var(--radius-card);box-shadow:var(--shadow-card);overflow:hidden}
.cm-table-head{display:grid;grid-template-columns:1fr 160px 120px 140px;gap:12px;align-items:center;padding:14px 22px;background:var(--color-primary);color:#fff;font-size:13px;font-weight:600}
.cm-col-sort{display:inline-flex;align-items:center;gap:5px;background:none;border:0;padding:0;color:#fff;font:inherit;cursor:pointer}
.cm-col-status{text-align:left}
.cm-col-action{text-align:right}
.cm-row{display:grid;grid-template-columns:1fr 160px 120px 140px;gap:12px;align-items:center;padding:16px 22px;border-top:1px solid var(--color-border-soft)}
.cm-row-name{display:flex;align-items:center;gap:10px;min-width:0;color:var(--color-ink);font-weight:600;font-size:14.5px}
.cm-row-name svg{flex:none;color:var(--color-text-faint)}
.cm-row-name span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.cm-row-date{color:var(--color-text-muted);font-size:13.5px}
.cm-badge{display:inline-flex;align-items:center;justify-self:start;padding:4px 12px;border-radius:var(--radius-pill);font-size:12px;font-weight:600;white-space:nowrap}
.cm-badge-active{background:var(--color-success-tint);color:var(--color-success)}
.cm-badge-new{background:var(--color-primary-tint);color:var(--color-primary-dark)}
.cm-row-action{text-align:right}
.cm-view-btn{display:inline-flex;align-items:center;gap:6px;height:36px;padding:0 16px;border:1px solid var(--color-primary);border-radius:var(--radius-pill);background:#fff;color:var(--color-primary-dark);font-size:13px;font-weight:600;font-family:var(--font-body);cursor:pointer;transition:background-color .2s ease,color .2s ease}
.cm-view-btn:hover{background:var(--color-primary);color:#fff}

.cm-empty{padding:60px 24px;text-align:center;color:var(--color-text-muted)}
.cm-empty-title{font-weight:700;color:var(--color-ink);margin:0 0 6px;font-size:15px}
.cm-empty-body{margin:0;font-size:13.5px}

.cm-detail-backdrop{position:fixed;inset:0;background:rgba(30,43,43,.35);z-index:40;display:none}
@media(max-width:820px){ .cm-detail-backdrop:not([hidden]){display:block} }

.cm-detail-panel{width:360px;flex:none;background:var(--color-surface);border:1px solid var(--color-border);border-radius:var(--radius-card);box-shadow:var(--shadow-card-hover);max-height:calc(100vh - 40px);overflow-y:auto;position:sticky;top:20px}
.cm-detail-head{display:flex;align-items:center;justify-content:space-between;padding:18px 22px;border-bottom:1px solid var(--color-border-soft);position:sticky;top:0;background:var(--color-surface);border-radius:var(--radius-card) var(--radius-card) 0 0;z-index:1}
.cm-detail-head h2{margin:0;font-size:16px;color:var(--color-ink)}
.cm-detail-close{border:0;background:none;font-size:22px;line-height:1;color:var(--color-text-muted);cursor:pointer;padding:4px}
.cm-detail-body{padding:20px 22px 28px}

.cm-detail-identity{display:flex;align-items:center;gap:14px;margin-bottom:22px}
.cm-avatar{width:52px;height:52px;border-radius:50%;background:var(--color-primary-tint);color:var(--color-primary-dark);display:flex;align-items:center;justify-content:center;flex:none}
.cm-detail-name{font-weight:700;font-size:17px;color:var(--color-ink)}
.cm-detail-id{font-size:12px;color:var(--color-text-faint);margin-top:2px}

.cm-section-label{display:flex;align-items:center;justify-content:space-between;gap:10px;font-size:13px;font-weight:700;color:var(--color-ink);letter-spacing:.3px;margin:24px 0 10px;padding-top:18px;border-top:1px solid var(--color-border-soft)}
.cm-detail-identity + .cm-section-label{margin-top:0;padding-top:0;border-top:0}
.cm-section-label-note{font-size:11px;font-weight:500;color:var(--color-text-faint)}
.cm-see-all{border:0;background:none;color:var(--color-primary-dark);font-size:12.5px;font-weight:600;cursor:pointer;padding:0}

.cm-info-list{display:flex;flex-direction:column;gap:2px}
.cm-info-row{display:flex;align-items:flex-start;gap:10px;padding:8px 0}
.cm-info-row svg{flex:none;color:var(--color-primary-dark);margin-top:2px}
.cm-info-row-label{display:block;color:var(--color-text-faint);font-size:11.5px;margin-bottom:2px}
.cm-info-row-value{display:block;color:var(--color-ink);font-size:14px;font-weight:600}

.cm-history-item{padding:10px 0;border-bottom:1px solid var(--color-border-soft)}
.cm-history-item:last-child{border-bottom:0}
.cm-history-top{display:flex;justify-content:space-between;align-items:center;gap:8px}
.cm-history-date{font-size:12.5px;color:var(--color-text-muted)}
.cm-history-menu{font-size:13.5px;color:var(--color-ink);font-weight:600;margin-top:2px}
.cm-status-pill{display:inline-flex;align-items:center;padding:3px 10px;border-radius:var(--radius-pill);font-size:11px;font-weight:600;white-space:nowrap;flex:none}
.cm-status-completed{background:var(--color-success-tint);color:var(--color-success)}
.cm-status-confirmed{background:var(--color-primary-tint);color:var(--color-primary-dark)}
.cm-status-cancelled,.cm-status-no_show{background:var(--color-danger-tint);color:var(--color-danger)}
.cm-status-other{background:var(--color-border-soft);color:var(--color-text-muted)}

.cm-fav-grid{display:grid;grid-template-columns:1fr 1fr;gap:10px}
.cm-fav-card{display:block;border:1px solid var(--color-border-soft);border-radius:12px;overflow:hidden;text-decoration:none}
.cm-fav-thumb{width:100%;aspect-ratio:4/3;background:linear-gradient(135deg,#f2ece6,#e7ddd3);object-fit:cover;display:block}
.cm-fav-name{font-size:12.5px;font-weight:600;color:var(--color-ink);padding:8px 10px 2px}
.cm-fav-price{font-size:12px;color:var(--color-primary-dark);font-weight:700;padding:0 10px 10px}

.cm-memo-textarea{width:100%;box-sizing:border-box;padding:12px 14px;border:1px solid var(--color-border);border-radius:10px;font:14px/1.6 var(--font-body);color:var(--color-ink);resize:vertical}
.cm-memo-textarea:focus{outline:none;border-color:var(--color-primary)}
.cm-memo-actions{display:flex;align-items:center;gap:12px;margin-top:10px}
.cm-memo-save-btn{height:38px;padding:0 20px;font-size:13px}
.cm-memo-status{font-size:12.5px;color:var(--color-text-muted)}

.cm-delete-btn{display:block;width:100%;margin-top:28px;height:44px;border:1px solid var(--color-danger);border-radius:10px;background:#fff;color:var(--color-danger);font-size:14px;font-weight:600;font-family:var(--font-body);cursor:pointer;transition:background-color .2s ease,color .2s ease}
.cm-delete-btn:hover{background:var(--color-danger);color:#fff}

/* cm-main's own rendered width drives these (container queries), so the
   list/table/cards degrade gracefully whenever cm-main is narrow — whether
   that's because the whole viewport is narrow OR because the detail panel
   is open and eating 360px+gap out of a wide viewport. */
@container cm-main (max-width:1100px){
  .cm-summary-grid{grid-template-columns:repeat(2,1fr)}
}
@container cm-main (max-width:900px){
  .cm-table-head .cm-col-status,.cm-row .cm-badge{display:none}
  .cm-table-head{grid-template-columns:1fr 130px 120px}
  .cm-row{grid-template-columns:1fr 130px 120px}
}
@container cm-main (max-width:640px){
  .cm-summary-grid{grid-template-columns:repeat(2,1fr)}
  .cm-table-head{display:none}
  .cm-row{grid-template-columns:1fr auto;row-gap:8px}
  .cm-row-date{order:3}
  .cm-badge{order:2;justify-self:end}
  .cm-row-action{order:4;grid-column:1/-1;text-align:left}
  .cm-view-btn{width:100%;justify-content:center}
  .cm-fav-grid{grid-template-columns:1fr}
}
@container cm-main (max-width:420px){
  .cm-summary-grid{grid-template-columns:1fr}
  .cm-toolbar{flex-direction:column;align-items:stretch}
  .cm-export-btn{justify-content:center}
}

/* .cm-shell/.cm-detail-panel switch to a viewport media query (not a
   container query): this decides whether the detail panel is an
   in-flow sticky sidebar or a fixed full-screen overlay, which is a
   whole-page layout decision, not something cm-main's own width can
   answer (cm-main isn't a container for its own flex sibling/parent). */
@media(max-width:820px){
  .cm-shell{display:block}
  .cm-detail-panel{position:fixed;top:0;right:0;bottom:0;width:min(400px,100%);max-height:none;border-radius:0;z-index:50}
  .cm-detail-head{border-radius:0}
}

.review-list-wrap{margin-top:36px}
.review-list{margin-top:18px}
.review-card{background:var(--color-surface);border:1px solid var(--color-border);border-radius:var(--radius-card);box-shadow:var(--shadow-card);padding:22px 24px;margin-bottom:16px}
.review-card:last-child{margin-bottom:0}
.review-card-stars{color:var(--color-primary);font-size:18px;letter-spacing:2px;margin-bottom:8px}
.review-card-name{font-weight:700;color:var(--color-ink);margin-bottom:6px}
.review-card-comment{color:var(--color-text-muted);line-height:1.8;margin:0 0 10px;white-space:pre-line}
.review-card-date{color:var(--color-text-faint);font-size:13px}
@media(max-width:720px){
  .star-btn{font-size:28px}
  .review-card{padding:18px 16px}
}

/* Animated Button Styles for Login and Register Forms */
#register-form button[type="submit"],
#register-form .auth-btn,
.auth-page button[type="submit"],
.auth-page .auth-btn,
.auth-card button,
#login-form button {
    background: linear-gradient(270deg, #FF007F, #7F00FF, #00F0FF, #FF007F) !important;
    background-size: 300% 300% !important;
    color: #ffffff !important;
    text-shadow: 0 1px 3px rgba(0,0,0,0.3) !important;
    border: none !important;
    cursor: pointer !important;
    font-weight: bold !important;
    transition: all 0.4s ease !important;
    animation: gradientMove 4s linear infinite !important;
}
/* Hover / Light Up Effect */
#register-form button[type="submit"]:hover,
#register-form .auth-btn:hover,
.auth-page button[type="submit"]:hover,
.auth-page .auth-btn:hover,
.auth-card button:hover,
#login-form button:hover {
    transform: scale(1.02) translateY(-2px) !important;
    box-shadow: 0 0 20px rgba(0, 240, 255, 0.6), 0 0 35px rgba(255, 0, 127, 0.5) !important;
    filter: brightness(1.25) !important;
}
/* Continuous Left-to-Right Flow Loop */
@keyframes gradientMove {
    0% { background-position: 0% 50%; }
    50% { background-position: 100% 50%; }
    100% { background-position: 0% 50%; }
}

.auth-title {
    display: none !important;
}

#register-form .auth-box-link,
#register-form button + a,
#register-form .btn-secondary {
    display: none !important;
}
#register-form button[type="submit"],
#register-form .auth-btn {
    width: 100% !important;
    display: block !important;
    margin-top: 15px !important;
    text-align: center !important;
}

#register-form, .auth-page:has(#register-form) .auth-card {
    padding-top: 15px !important;
}

/* Header Navigation Items Button-style Transformation */
header nav a,
.header-menu a,
.nav-links a,
.header .book-now-btn,
.header .user-profile-mark,
header .profile-icon {
    background: rgba(0, 240, 255, 0.1) !important;
    color: #ffffff !important;
    border: 1px solid rgba(0, 240, 255, 0.4) !important;
    padding: 8px 16px !important;
    border-radius: 6px !important;
    text-decoration: none !important;
    font-weight: bold !important;
    display: inline-block !important;
    transition: all 0.3s ease-in-out !important;
    box-shadow: inset 0 0 8px rgba(0, 240, 255, 0.2) !important;
    margin: 0 4px !important;
}
/* Specific styling modifier for Book Now and Profile mark if needed to keep text centered */
header nav a:hover,
.header-menu a:hover,
.nav-links a:hover,
header .book-now-btn:hover,
header .user-profile-mark:hover {
    background: rgba(0, 240, 255, 0.25) !important;
    border-color: #00F0FF !important;
    box-shadow: 0 0 15px rgba(0, 240, 255, 0.7), inset 0 0 10px rgba(0, 240, 255, 0.4) !important;
    transform: translateY(-2px) !important;
    filter: brightness(1.3) !important;
}

/* Header background matched to the footer's background color */
header,
.site-header,
.main-header {
    background: #0F9FB4 !important;
    /* .site-header's own border-bottom (css/style.css line 73) is a pale
       #e6ded7 line, drawn for its ORIGINAL light/cream background — sitting
       directly on top of the solid teal forced here, that same pale line
       reads as a bright, out-of-place light seam (most visible on index.html,
       where the hero photo sits right below the header). Removing it here,
       scoped to this exact teal-background decision, is the fix: a flat
       teal header already has enough contrast against anything below it
       (dark hero photo or light page content) that it needs no divider line. */
    border-bottom: none !important;
}
@keyframes headerMoveLeftToRight {
    0% { background-position: 0% 50%; }
    50% { background-position: 100% 50%; }
    100% { background-position: 0% 50%; }
}

/* Language toggle button — matched to the same neon button design as the
   other header nav links (background/border/padding/hover glow), kept
   single-line (no stacked English/Japanese subtext) since it displays
   only one word at a time (English / 日本語), toggled by js/main.js. */
.language-btn {
    background: rgba(0, 240, 255, 0.1) !important;
    color: #ffffff !important;
    border: 1px solid rgba(0, 240, 255, 0.4) !important;
    padding: 8px 16px !important;
    border-radius: 6px !important;
    font-weight: bold !important;
    transition: all 0.3s ease-in-out !important;
    box-shadow: inset 0 0 8px rgba(0, 240, 255, 0.2) !important;
}
.language-btn:hover,
.language-btn:focus-visible {
    background: rgba(0, 240, 255, 0.25) !important;
    border-color: #00F0FF !important;
    box-shadow: 0 0 15px rgba(0, 240, 255, 0.7), inset 0 0 10px rgba(0, 240, 255, 0.4) !important;
    transform: translateY(-2px) !important;
    filter: brightness(1.3) !important;
}

/* Logout Button Silver and Cyber Cyan Animation
   Per request: recolored from the earlier 3-color pink/purple/cyan
   scheme to exactly 2 colors — Silver (#C0C0C0) and Cyber Cyan
   (#00F0FF) — on mypage.html's own logout button, keeping the same
   opposite (right-to-left, 90deg) flow direction as before. The
   requested selectors (.auth-page .logout-btn, #mypage-content
   .logout-btn, .logout-button, button[class*="logout"]) still don't
   match this site's real markup — the button is <button id="logout-btn"
   class="btn secondary-btn mypage-logout-btn"> in mypage.html — so this
   updates the existing #logout-btn rule below in place (the same one
   from the earlier 3-color request) rather than adding a second,
   competing rule. !important on every property here safely overrides
   the .btn/.secondary-btn button styling that would otherwise apply.
   Text color follow-up: changed to solid black so it reads clearly
   against the light silver/cyan gradient (white text had gone low-
   contrast once the palette moved away from the darker pink/purple
   scheme). Set once here on the base rule only — the :hover rule below
   never sets its own color and the animation only ever moves
   background-position, never color, so this one change already covers
   every state (normal, hovered, and mid-animation) without needing a
   separate :hover override. */
#logout-btn {
    background: linear-gradient(90deg, #C0C0C0, #00F0FF, #C0C0C0) !important;
    background-size: 200% 100% !important;
    color: #000000 !important;
    font-weight: bold !important;
    border: none !important;
    cursor: pointer !important;
    transition: all 0.4s ease !important;
    animation: logoutSilverCyan 4s linear infinite !important;
}
/* Hover Effect to light up beautifully */
#logout-btn:hover {
    transform: scale(1.02) translateY(-2px) !important;
    box-shadow: 0 0 20px rgba(0, 240, 255, 0.6), 0 0 35px rgba(192, 192, 192, 0.4) !important;
    filter: brightness(1.2) !important;
}
/* Timeline framework moving from right to left */
@keyframes logoutSilverCyan {
    0% {
        background-position: 100% 0%;
    }
    100% {
        background-position: 0% 0%;
    }
}

/* Exact layout fix for menu page bottom notes
   Per request: center the disclaimer block (全メニュー税込表示。/
   遅刻の場合は.../ 当日キャンセル...) horizontally, keep each line
   left-aligned inside it so the ・ dots stay flush on the left, and
   turn the text red. The requested selectors (.menu-notes-container,
   [class*="notes"], [class*="disclaimer"]) don't match this site's
   real markup — the block is <div class="notice"> in menu.html (its
   two bilingual <span class="lang-ja">/<span class="lang-en"> children
   carry the actual text, toggled by js/main.js), so .notice is used
   here instead, scoped to .menu-page so it can only ever affect this
   one block (confirmed via grep: .notice appears nowhere else on the
   site). display:table shrinks the box to its own content width so
   margin:auto has something to actually center — .notice previously
   spanned the full content width, which would make horizontal
   centering invisible. Only display/margin/text-align/color change
   here; the card's own background/padding/border-radius/line-height
   (set elsewhere) are left completely untouched, and color cascades
   naturally to the lang-ja/lang-en spans inside since neither sets its
   own color. */
.menu-page .notice {
    display: table !important;
    margin: 30px auto !important;
    text-align: left !important;
    color: #ff3b30 !important;
}

/* Booking page: 1.5x size on the 選択する (Select) buttons and the
   Favorites heart icons inside the menu table, per request.
   Measured the real current rendered sizes first rather than guessing
   (both come from plain browser <button> defaults today, since no
   font-size/padding rule existed for either): the select button was
   font-size:13.3333px / padding:1px 6px (identical in both its
   unselected "選択する" and selected "選択済み" states, since both share
   the one .article-book.select-btn class — is-selected only changes
   background/text, never size), and the heart was font-size:22px /
   padding:2px. Both are multiplied by exactly 1.5 below (20px/1.5px 9px
   and 33px/3px). Scoped to .booking-page so menu.html's own copies of
   these same shared classes (.article-book.select-btn only ever
   renders on booking.html to begin with — menu.html omits the button
   entirely; .fav-heart-btn IS also shared with menu.html, so the
   .booking-page prefix is what keeps this change from also resizing
   menu.html's hearts) stay completely untouched. Border color changed
   to solid white per the request — clearly visible against both the
   unselected teal and selected dark-ink button backgrounds set by the
   existing body.d6-theme .article-book / .select-btn.is-selected rules
   elsewhere, which are otherwise left alone. */
.booking-page .article-book.select-btn {
    font-size: 20px !important;
    padding: 1.5px 9px !important;
    border: 2px solid #ffffff !important;
}
.booking-page .fav-heart-btn {
    font-size: 33px !important;
    padding: 3px !important;
}

/* Menu page: 1.5x size on the Favorites heart icon marks inside each
   menu item, per request. The only real per-item icon/mark on
   menu.html is the .fav-heart-btn heart (js/favorites.js) — no star
   icons exist anywhere on this page (confirmed via grep), so that's
   the one element this applies to. Same math as the earlier booking.html
   sizing request: the heart's real base size is font-size:22px /
   padding:2px (set once, unscoped, in the shared .fav-heart-btn rule
   above), so 1.5x is font-size:33px / padding:3px — identical numbers
   to booking.html's own heart, just scoped to .menu-page here instead
   so it only ever affects this page. .fav-heart-btn.is-favorited (the
   clicked/active ❤️ state) only ever changes opacity, never size, so
   this one rule already applies identically to both the favorited and
   not-yet-favorited states without needing a separate override. */
.menu-page .fav-heart-btn {
    font-size: 33px !important;
    padding: 3px !important;
}

/* Menu price numbers (¥6,500 etc.), 1.5x size + solid black, on both
   menu.html and booking.html, per request. The requested example
   classes (.menu-price, .price-amount) don't exist in this codebase —
   the real element is <span class="menu-table-price-value"> (set by
   the shared menuTable() in js/menu.js, used identically by both
   pages' menu-selection tables). Deliberately targets that inner span
   rather than its parent .menu-table-price cell: that parent class is
   ALSO reused on the table's <th> header ("料金（税込）"/"Price (tax
   incl.)"), which must NOT get this styling — scoping to the
   .menu-table-price-value span (present only in the price <td>, never
   the header) keeps the header untouched automatically. Measured the
   real current size first (15px) rather than guessing, so 1.5x is an
   exact 22.5px. Scoped to .menu-page/.booking-page so mypage.html's own
   separate change-booking flow — which reuses this exact same span
   class (js/mypage.js) but carries neither page class — is provably
   unaffected. */
.menu-page .menu-table-price-value,
.booking-page .menu-table-price-value {
    font-size: 22.5px !important;
    color: #000000 !important;
}

/* My Page > Favorites > "予約する" auto-scroll-to-calendar feature
   (booking.html#calendar-section, see js/booking.js and js/favorites.js).
   .site-header is position:sticky/top:0/height:88px, so scrolling the
   #calendar-section label (block:'start') without an offset would land
   the "ご希望日・お時間" heading right under/behind that sticky bar.
   scroll-margin-top tells the native scrollIntoView() to stop short by
   this much, so the heading clears the header with a small visual
   buffer. Purely additive; does not change #calendar-section's layout,
   only where a scroll-into-view lands. */
#calendar-section {
    scroll-margin-top: 108px;
}

/* Menu page: Hot Pepper-style direct availability / booking CTA */
.menu-page .quick-book-btn{
  width:100%;
  min-width:142px;
  min-height:42px;
  padding:10px 14px !important;
  border-radius:8px !important;
  font-size:13px;
  font-weight:700;
  line-height:1.35;
  white-space:normal;
  box-shadow:0 2px 8px rgba(0,0,0,.08);
}
.menu-page .quick-book-btn:hover{filter:brightness(.94)}
.menu-page #handfoot-quick-book-btn{
  display:flex;
  align-items:center;
  justify-content:center;
  width:min(340px,100%);
  margin:22px auto 0;
}
@media(max-width:720px){
  .menu-page .quick-book-btn{min-width:128px;min-height:40px;padding:8px 10px !important;font-size:12px}
}

/* Booking-account gate notice shown on register.html when a guest starts a reservation. */
.auth-booking-note{
  max-width:680px;
  margin:0 auto 22px;
  padding:18px 20px;
  border:1px solid var(--color-border);
  border-radius:var(--radius-card);
  background:var(--color-primary-tint);
  color:var(--color-ink);
  font:400 13px/1.8 var(--font-body);
  text-align:center;
}
.auth-booking-note strong{display:block;margin-bottom:6px;color:var(--color-primary-dark);font-size:15px}

/* ============================================================
   Final auth/footer consistency pass
   - Create Account uses the exact same sizing/alignment as Login.
   - Copyright is centered and safely sized on mobile on every page.
   ============================================================ */
#register-form button[type="submit"],
#login-form button[type="submit"],
#reset-request-form button[type="submit"],
#reset-password-form button[type="submit"]{
  width:100% !important;
  height:50px !important;
  min-height:50px !important;
  display:inline-flex !important;
  align-items:center !important;
  justify-content:center !important;
  box-sizing:border-box !important;
  margin:15px 0 0 !important;
  padding:0 var(--btn-padding-x) !important;
  border-radius:var(--btn-radius) !important;
  font-family:var(--font-body) !important;
  font-size:var(--btn-font-size) !important;
  font-weight:700 !important;
  line-height:1 !important;
  text-align:center !important;
  white-space:nowrap !important;
}

@media(max-width:720px){
  .footer-copyright{
    width:100% !important;
    max-width:none !important;
    margin:28px auto 0 !important;
    padding:0 10px !important;
    box-sizing:border-box !important;
    text-align:center !important;
    white-space:normal !important;
    font-size:11px !important;
    line-height:1.5 !important;
    letter-spacing:.15px !important;
  }
}


/* ============================================================
   HOT-PEPPER-INSPIRED MENU / BOOKING CARDS
   Uses Nail Salon D6 branding and existing menu/booking logic.
   ============================================================ */
.hp-menu-hero{max-width:980px;margin:0 auto 28px}.hp-menu-hero-title{text-align:center;font-weight:800;font-size:26px;margin-bottom:18px}.hp-availability-main{display:flex;align-items:center;justify-content:center;min-height:58px;padding:12px 22px;border-radius:14px;background:var(--color-primary);color:#fff;text-decoration:none;font-weight:800;font-size:18px;box-shadow:0 8px 22px rgba(15,159,180,.18);margin-bottom:18px}.hp-menu-switch{display:grid;grid-template-columns:repeat(3,1fr);border:1px solid #cfc5bd;border-radius:14px;overflow:hidden;background:#fff;margin-bottom:18px}.hp-menu-switch button{min-height:52px;display:flex;align-items:center;justify-content:center;text-align:center;padding:8px;border:0;border-right:1px solid #cfc5bd;background:#fff;font-weight:600;color:#6f625c;cursor:pointer}.hp-menu-switch>button:last-child{border-right:0}.hp-menu-switch>button.active{background:#5e514d;color:#fff}.hp-tools-row{display:grid;grid-template-columns:minmax(0,1fr) minmax(220px,300px);gap:12px;align-items:stretch}.hp-filter-row{width:100%;display:flex;align-items:center;gap:12px;border:1px solid #ded5ce;border-radius:14px;background:#fff;padding:15px 18px;font-size:17px;cursor:pointer;text-align:left;color:inherit}.hp-filter-row>span:first-child{color:var(--color-primary);font-size:22px}.hp-filter-summary{margin-left:auto;color:var(--color-primary-dark);font-size:12px}.hp-sort-wrap{display:grid;grid-template-columns:auto 1fr;align-items:center;gap:8px;border:1px solid #ded5ce;border-radius:14px;background:#fff;padding:8px 12px;font-size:13px;font-weight:700}.hp-sort-wrap select{width:100%;min-width:0;border:0;background:transparent;font:600 13px/1.3 var(--font-body);color:var(--color-ink);outline:none}.hp-filter-panel{margin-top:12px;padding:18px;border:1px solid #ded5ce;border-radius:14px;background:#fff;box-shadow:var(--shadow-card)}.hp-filter-group+ .hp-filter-group{margin-top:16px}.hp-filter-group>strong{display:block;margin-bottom:9px;font-size:13px}.hp-filter-options{display:flex;flex-wrap:wrap;gap:8px}.hp-filter-options button,.hp-filter-clear{min-height:38px;border:1px solid #d8cec7;border-radius:999px;background:#fff;padding:7px 14px;font:600 12px/1.2 var(--font-body);cursor:pointer;color:#625853}.hp-filter-options button.active{background:var(--color-primary);border-color:var(--color-primary);color:#fff}.hp-filter-clear{margin-top:16px;color:var(--color-primary-dark)}.hp-no-results{padding:30px 18px;border:1px dashed #d8cec7;border-radius:14px;background:#fff;text-align:center;color:var(--color-text-muted);line-height:1.7}.hp-section-heading{display:flex;align-items:end;justify-content:space-between;gap:12px;margin:22px 0 14px}.hp-section-heading h2{font-size:24px;margin:0}.hp-result-count{font-size:13px;color:var(--color-text-muted)}.hp-menu-list{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:18px}.hp-menu-card{background:#fff;border:1px solid #e3ddd7;border-radius:18px;padding:18px;box-shadow:0 3px 14px rgba(30,43,43,.045);position:relative}.hp-card-top{display:flex;align-items:center;justify-content:space-between;min-height:36px}.hp-card-badges{display:flex;gap:7px;flex-wrap:wrap}.hp-badge{display:inline-flex;align-items:center;justify-content:center;min-height:26px;padding:3px 10px;background:#e6f5f7;color:#0c7e90;border-radius:4px;font-size:12px;font-weight:800}.hp-badge-accent{background:#f6e6e0;color:#a85d4d}.hp-detail-btn,.hp-card-top .fav-heart-btn{border:0;background:none;font-size:28px;line-height:1;color:#a99790;padding:3px;cursor:pointer}.hp-card-top .fav-heart-btn{margin-left:auto}.hp-card-title-row h3{font-size:18px;margin:12px 0 5px;color:#2f2926}.hp-price{font-size:24px;font-weight:800;color:#b24157;margin-bottom:12px}.hp-card-body{display:grid;grid-template-columns:128px 1fr;gap:16px}.hp-card-image img,.hp-menu-image-placeholder{width:128px;height:128px;object-fit:cover;border-radius:12px;border:1px solid #e8e1db;background:linear-gradient(135deg,#f4efea,#e9dfd7)}.hp-menu-image-placeholder{display:flex;align-items:center;justify-content:center;text-align:center;color:#b5a8a0;font-family:Georgia,serif;font-size:13px;line-height:1.2}.hp-card-copy p{font-size:14px;line-height:1.7;color:#625853;margin:0 0 8px;display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden}.hp-more-btn{border:0;background:none;padding:2px 0;color:var(--color-primary-dark);text-decoration:underline;font-weight:700;cursor:pointer}.hp-meta{display:flex;align-items:flex-start;gap:6px;margin-top:9px;color:#81766f;font-size:12px;line-height:1.5}.hp-card-actions{display:grid;grid-template-columns:1fr 1fr;gap:12px;margin-top:16px}.hp-card-primary,.hp-card-secondary{min-height:48px;border-radius:12px;padding:10px 12px;display:flex;align-items:center;justify-content:center;text-align:center;font-weight:800;font-size:14px;text-decoration:none;cursor:pointer}.hp-card-primary{border:1px solid var(--color-primary);background:var(--color-primary);color:#fff}.hp-card-primary:hover{background:var(--color-primary-dark)}.hp-card-primary.is-selected{background:#5e514d;border-color:#5e514d}.hp-card-secondary{border:1px solid #d3c9c3;background:#fff;color:var(--color-primary-dark)}.hp-menu-modal{position:fixed;inset:0;z-index:5000;display:none}.hp-menu-modal.is-open{display:flex;align-items:center;justify-content:center;padding:16px;box-sizing:border-box}.hp-modal-backdrop{position:absolute;inset:0;background:rgba(22,18,17,.62)}.hp-modal-dialog{position:relative;width:min(620px,calc(100% - 32px));max-height:88vh;overflow:auto;margin:0;background:#fff;border-radius:20px;padding:28px;box-shadow:0 22px 60px rgba(0,0,0,.25)}.hp-modal-close{position:absolute;right:18px;top:14px;border:0;background:none;font-size:34px;line-height:1;color:#7a6e68;cursor:pointer}.hp-modal-dialog h2{margin:15px 0 5px;font-size:24px;padding-right:42px}.hp-modal-price{font-size:26px;font-weight:800;color:#b24157;margin:8px 0 18px}.hp-modal-content img,.hp-modal-placeholder{width:100%;max-height:260px;object-fit:cover;border-radius:14px;background:#f4efea;margin-bottom:16px}.hp-modal-placeholder{height:160px;display:flex;align-items:center;justify-content:center;color:#a99b93;font-family:Georgia,serif}.hp-modal-content p{line-height:1.9;color:#514945}.hp-modal-meta{padding:14px 16px;border-radius:12px;background:#f7f5f3;color:#675d58;font-size:13px}.hp-modal-actions{display:grid;grid-template-columns:1fr 1fr;gap:12px;margin-top:20px}.hp-modal-open{overflow:hidden}
@media(max-width:760px){.hp-tools-row{grid-template-columns:1fr}.hp-menu-list{grid-template-columns:1fr}.hp-menu-card{padding:14px;border-radius:14px}.hp-card-body{grid-template-columns:108px 1fr;gap:12px}.hp-card-image img,.hp-menu-image-placeholder{width:108px;height:108px}.hp-card-title-row h3{font-size:17px}.hp-price{font-size:22px}.hp-card-actions{gap:8px}.hp-card-primary,.hp-card-secondary{min-height:46px;font-size:13px;padding:8px}.hp-menu-hero-title{font-size:22px}.hp-availability-main{min-height:54px;font-size:17px}.hp-menu-switch button{font-size:13px;min-height:48px}.hp-section-heading h2{font-size:21px}.hp-modal-dialog{width:calc(100% - 24px);margin:0;padding:22px 18px}.hp-modal-actions{grid-template-columns:1fr 1fr}}
@media(max-width:390px){.hp-card-body{grid-template-columns:92px 1fr}.hp-card-image img,.hp-menu-image-placeholder{width:92px;height:92px}.hp-card-actions{grid-template-columns:1fr}.hp-modal-actions{grid-template-columns:1fr}.hp-menu-switch button{font-size:12px}}

/* Menu & Prices is view-only: detail modal has only a Close button. */
.hp-modal-actions--single{grid-template-columns:1fr}
.hp-modal-actions--single .hp-card-secondary{width:100%}


/* Booking step: date/time first, then customer information. */
#booking-form > h2:first-child{text-align:center;margin-bottom:12px}
.avail-required-heading{margin:0 0 22px;text-align:center;color:#ff3b30;font-weight:700;font-size:14px;line-height:1.6}
.calendar-only-label{display:block}
.calendar-only-label > .avail-wrap{margin-top:0}
.customer-info-heading{text-align:center;margin-top:42px!important;margin-bottom:24px!important;padding-top:30px;border-top:1px solid var(--color-border-soft)}
@media(max-width:720px){
  .avail-required-heading{font-size:13px;margin-bottom:18px}
  .customer-info-heading{margin-top:34px!important;padding-top:26px}
}

/* Salon Info navigation / landing */
.salon-info-tabs{grid-template-columns:repeat(4,1fr)!important}
.salon-info-intro{text-align:center;margin-bottom:24px}
.salon-info-intro h1{margin:0 0 12px;font-size:30px}
.salon-info-intro p{margin:0;color:var(--color-text-muted);line-height:1.8}
.salon-info-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:18px}
.salon-info-card{display:flex!important;flex-direction:column;gap:8px;text-decoration:none;color:var(--color-ink);transition:transform .2s ease,box-shadow .2s ease,border-color .2s ease}
.salon-info-card:hover,.salon-info-card:focus-visible{transform:translateY(-2px);box-shadow:var(--shadow-card-hover);border-color:var(--color-primary)}
.salon-info-card strong{font-size:18px}
.salon-info-card small{font-size:13px;color:var(--color-text-muted);line-height:1.6}
@media(max-width:720px){
  .salon-info-tabs{grid-template-columns:repeat(4,minmax(0,1fr))!important}
  .salon-info-tabs a{padding:10px 2px!important;font-size:10.5px!important;line-height:1.25!important;min-width:0}
  .salon-info-tabs a small{font-size:9px!important;letter-spacing:0!important;white-space:normal}
  .salon-info-tabs .tab-icon{display:block;margin:0 0 3px;font-size:1.15em}
  .salon-info-grid{grid-template-columns:1fr}
  .salon-info-intro h1{font-size:25px}
}


/* Footer copyright: compact two-line signature at the very bottom */
.footer-copyright{
  display:block;
  width:100%;
  clear:both;
  margin:28px auto 0!important;
  padding:14px 16px 4px!important;
  text-align:center!important;
  font-size:14px!important;
  line-height:1.55!important;
  letter-spacing:.25px!important;
  opacity:.82;
}
@media(min-width:1024px){
  .footer-copyright{
    font-size:16px!important;
    line-height:1.6!important;
    white-space:nowrap!important;
  }
  .footer-copyright br{display:none!important}
}
@media(max-width:720px){
  .footer-copyright{
    margin-top:24px!important;
    padding:12px 10px 2px!important;
    font-size:9px!important;
    line-height:1.5!important;
  }
}

/* Keep Access and Cancellation Policy salon-info tabs at the exact same
   vertical position as Review/About so switching tabs does not make the
   navigation row jump downward. */
.salon-info-detail-page{padding-top:calc(70px - 1.5cm)}
@media(max-width:900px){
  .salon-info-detail-page{padding-top:calc(55px - 1.5cm)}
}

/* Selected sub-navigation state: black background for Menu & Price,
   Booking category tabs, and Salon Info sub-navigation. */
.menu-page .menu-category-tabs .active,
.booking-page .menu-category-tabs .active,
.mypage-page .menu-category-tabs .active,
.salon-info-tabs .active{
  background:#111111!important;
  background-color:#111111!important;
  border-color:#111111!important;
  color:#ffffff!important;
  box-shadow:none!important;
  filter:none!important;
  transform:none!important;
}
.menu-page .menu-category-tabs .active small,
.booking-page .menu-category-tabs .active small,
.mypage-page .menu-category-tabs .active small,
.salon-info-tabs .active small{
  color:#ffffff!important;
}
.menu-page .menu-category-tabs .active:hover,
.booking-page .menu-category-tabs .active:hover,
.mypage-page .menu-category-tabs .active:hover,
.salon-info-tabs .active:hover{
  background:#111111!important;
  background-color:#111111!important;
  border-color:#111111!important;
  color:#ffffff!important;
  box-shadow:none!important;
  filter:none!important;
  transform:none!important;
}

/* Touch/pressed state: selected sub-navigation turns black immediately. */
.menu-page .menu-category-tabs button:active,
.menu-page .menu-category-tabs a:active,
.booking-page .menu-category-tabs button:active,
.booking-page .menu-category-tabs a:active,
.mypage-page .menu-category-tabs button:active,
.mypage-page .menu-category-tabs a:active,
.salon-info-tabs button:active,
.salon-info-tabs a:active{
  background:#111111!important;
  background-color:#111111!important;
  border-color:#111111!important;
  color:#ffffff!important;
  box-shadow:none!important;
  filter:none!important;
  transform:none!important;
}
.menu-page .menu-category-tabs button:active small,
.menu-page .menu-category-tabs a:active small,
.booking-page .menu-category-tabs button:active small,
.booking-page .menu-category-tabs a:active small,
.mypage-page .menu-category-tabs button:active small,
.mypage-page .menu-category-tabs a:active small,
.salon-info-tabs button:active small,
.salon-info-tabs a:active small{
  color:#ffffff!important;
}

/* ============================================================
   My Page profile polish
   - Keep labels such as メール on one line
   - Give label column enough width
   - Make Edit Profile and Logout buttons the same size
   - Slightly widen/space the profile card for a cleaner mobile layout
   ============================================================ */
#mypage-top{
  width:100%;
  max-width:820px;
  margin-left:auto;
  margin-right:auto;
}

#mypage-top .profile-row{
  align-items:center;
  gap:20px;
}

#mypage-top .profile-row > span{
  flex:0 0 92px;
  min-width:92px;
  white-space:nowrap;
  word-break:keep-all;
  line-break:strict;
}

#mypage-top .profile-row > strong{
  flex:1 1 auto;
  min-width:0;
  text-align:right;
  overflow-wrap:anywhere;
}

#edit-profile-btn,
#mypage-top .mypage-logout-btn{
  width:100% !important;
  min-height:48px !important;
  padding:0 24px !important;
  border-radius:var(--btn-radius) !important;
  font-size:var(--btn-font-size) !important;
  display:flex !important;
  align-items:center !important;
  justify-content:center !important;
  box-sizing:border-box !important;
}

#edit-profile-btn{margin-top:20px !important}
#mypage-top .mypage-logout-btn{margin-top:12px !important}

@media(max-width:720px){
  .mypage-content{
    padding-left:20px !important;
    padding-right:20px !important;
  }
  #mypage-top{
    max-width:none;
  }
  #mypage-top .profile-row{
    gap:14px;
    padding:14px 0;
  }
  #mypage-top .profile-row > span{
    flex-basis:78px;
    min-width:78px;
  }
  #mypage-top .profile-row > strong{
    font-size:14px;
  }
}

@media(max-width:360px){
  #mypage-top .profile-row > span{
    flex-basis:72px;
    min-width:72px;
    font-size:13px;
  }
  #mypage-top .profile-row > strong{
    font-size:13px;
  }
}

/* My Page reservation card: image + date on top, remaining details full width below */
.booking-reservation-card{padding:18px;border:1px solid var(--color-border);border-radius:18px;background:var(--color-surface);box-shadow:var(--shadow-card)}
.booking-reservation-card .booking-card-media-row{display:grid;grid-template-columns:auto minmax(0,1fr);gap:18px;align-items:center;margin-bottom:14px}
.booking-card-date-side{min-width:0;padding:12px 14px;border-radius:14px;background:#f7f5f3}
.booking-card-date-side span{display:block;font-size:12px;color:var(--color-text-muted);margin-bottom:5px}
.booking-card-date-side b{display:block;font-size:18px;line-height:1.5;color:var(--color-ink)}
.booking-card-full-details{width:100%;border-top:1px solid var(--color-border-soft);padding-top:6px}
.booking-card-full-details .summary-row{width:100%}

/* Reservation-change chooser */
.change-type-options{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:12px;margin:18px 0 10px}
.change-type-btn{min-height:96px;border:1px solid var(--color-border);border-radius:16px;background:#fff;padding:16px 12px;cursor:pointer;color:var(--color-ink);box-shadow:var(--shadow-card);transition:.2s ease}
.change-type-btn strong,.change-type-btn small{display:block}
.change-type-btn strong{font-size:15px;margin-bottom:7px}
.change-type-btn small{font-size:11px;color:var(--color-text-muted)}
.change-type-btn:hover,.change-type-btn:focus-visible{background:var(--color-primary);border-color:var(--color-primary);color:#fff;transform:translateY(-1px)}
.change-type-btn:hover small,.change-type-btn:focus-visible small{color:#fff}

/* Change-menu step reuses the current Hot Pepper-style menu cards */
.change-hp-menu-list{margin-top:18px}
.change-hp-menu-card .hp-card-title-row h3 small{display:block;margin-top:4px;font-size:12px;font-weight:500;color:var(--color-text-muted)}
.change-card-actions{grid-template-columns:1fr}
.change-card-actions .hp-card-primary{width:100%}

@media(max-width:720px){
  .booking-reservation-card{padding:14px}
  .booking-reservation-card .booking-card-media-row{grid-template-columns:106px minmax(0,1fr);gap:12px}
  .booking-card-date-side{padding:10px 12px}
  .booking-card-date-side b{font-size:16px}
  .change-type-options{grid-template-columns:1fr}
  .change-type-btn{min-height:72px}
}

/* Booking selected summary: keep preferred date/time values flush-right,
   matching duration and total rows on mobile and desktop. */
#selected-date-row,
#selected-time-row{
  display:flex;
  width:100%;
  justify-content:space-between !important;
  align-items:center;
}
#selected-date-row[hidden],
#selected-time-row[hidden]{display:none !important;}
#selected-date-value,
#selected-time-value{
  margin-left:auto;
  text-align:right !important;
  flex:0 0 auto;
  white-space:nowrap;
}

/* Menu card cleanup: category GEL/FOOT/OPTION badge and info icon removed; titles start at the top of each card. */
.hp-menu-card > .hp-card-title-row h3{margin-top:0!important;}
.change-hp-menu-card > .hp-card-title-row h3{margin-top:0!important;}


/* My Page dynamic action panels: keep revealed content clear of the sticky header. */
#cancel-confirm-panel,#change-booking-panel,#change-step-choice,#change-step-menu,#change-step-datetime,#change-step-confirm{scroll-margin-top:110px}
@media(max-width:720px){#cancel-confirm-panel,#change-booking-panel,#change-step-choice,#change-step-menu,#change-step-datetime,#change-step-confirm{scroll-margin-top:100px}}

/* Compact mobile booking summary + auto-growing one-line notes field. */
@media(max-width:720px){
  #booking-form .selected-menu .selected-total-line{
    display:flex!important;
    flex-direction:column!important;
    align-items:flex-start!important;
    justify-content:flex-start!important;
    gap:5px!important;
    padding:13px 0!important;
    margin-top:0!important;
    font-size:15px!important;
    line-height:1.4!important;
    text-align:left!important;
  }
  #booking-form .selected-menu .selected-total-line strong{
    display:block!important;
    width:100%!important;
    margin:0!important;
    text-align:left!important;
    font-size:21px!important;
    line-height:1.25!important;
    white-space:nowrap!important;
  }
  #booking-form .selected-menu .selected-duration-line strong{
    font-size:20px!important;
  }
  #booking-form label:has(> textarea){
    margin-left:0!important;
    margin-top:12px!important;
  }
  #booking-form label:has(> textarea) > span{
    font-size:15px!important;
    margin-bottom:6px!important;
  }
  #booking-form textarea[name="note"]{
    min-height:46px!important;
    height:46px;
    padding:11px 13px!important;
    line-height:22px!important;
    resize:none!important;
    overflow:hidden!important;
    font-size:14px!important;
  }
}


/* Access / Cancellation Policy: remove the extra Japanese page subtitle/eyebrow
   and teal underline, then tighten the title spacing so content starts higher. */
.salon-info-detail-page > .salon-detail-title{
  display:block!important;
  width:100%!important;
  margin:8px 0 22px!important;
  padding:0!important;
  text-align:left!important;
  font:700 34px/1.2 var(--font-body)!important;
  color:var(--color-ink)!important;
}
.salon-info-detail-page > .salon-detail-title::after{content:none!important;display:none!important}
@media(max-width:720px){
  .salon-info-detail-page > .salon-detail-title{
    margin:6px 0 16px!important;
    font-size:27px!important;
  }
}

/* Booking form mobile summary: compact horizontal label/value rows. */
@media(max-width:720px){
  #booking-form .selected-menu .selected-total-line{
    display:grid!important;
    grid-template-columns:minmax(0,1fr) auto!important;
    align-items:center!important;
    justify-content:initial!important;
    column-gap:12px!important;
    padding:8px 0!important;
    font-size:14px!important;
    line-height:1.25!important;
  }
  #booking-form .selected-menu .selected-total-line > span{
    min-width:0!important;
    margin:0!important;
    white-space:nowrap!important;
  }
  #booking-form .selected-menu .selected-total-line strong,
  #booking-form .selected-menu .selected-duration-line strong,
  #selected-date-value,#selected-time-value{
    display:block!important;
    width:auto!important;
    min-width:0!important;
    margin:0!important;
    justify-self:end!important;
    text-align:right!important;
    font-size:17px!important;
    line-height:1.2!important;
    white-space:nowrap!important;
  }
  #selected-date-row,#selected-time-row{
    display:grid!important;
    width:100%!important;
    grid-template-columns:minmax(0,1fr) auto!important;
  }
  #selected-date-row[hidden],#selected-time-row[hidden]{display:none!important}
  #booking-form label:has(> textarea){margin-top:8px!important}
}


/* salon info detail heading removed: keep content close to tabs */
.salon-info-detail-page .salon-info-tabs{margin-bottom:12px;}
.salon-info-detail-page .salon-info-tabs + .map-wrap,
.salon-info-detail-page .salon-info-tabs + .box{margin-top:0;}
@media(max-width:700px){.salon-info-detail-page .salon-info-tabs{margin-bottom:8px;}}


/* Favorites heart restored to the current Hot Pepper-style menu cards.
   GEL/info badges were removed from .hp-card-top, so the heart now lives
   in the title row and stays at the upper-right without shifting the menu
   name/price. Applies identically on Menu & Price and Booking. */
.hp-card-title-row{display:flex;align-items:flex-start;justify-content:space-between;gap:12px}
.hp-card-title-row>div:first-child{min-width:0;flex:1 1 auto}
.hp-card-title-row .fav-heart-btn{flex:0 0 auto;margin:0 0 0 10px;align-self:flex-start}
@media(max-width:720px){
  .hp-card-title-row .fav-heart-btn{margin-left:6px}
}


/* Booking form: compact note disclosure + one-screen mobile action area. */
.booking-note-collapsible{display:flex;flex-direction:column;align-items:center;margin:8px 0 10px}
.booking-note-toggle{width:auto!important;min-width:190px;max-width:100%;margin:0 auto!important}
.booking-note-panel{width:100%;margin-top:8px}
.booking-note-panel[hidden]{display:none!important}
.booking-note-panel label{margin:0!important}
.booking-note-panel label>span{display:block;margin:0 0 5px;font-size:13px;color:var(--color-text-muted)}
#booking-form .booking-note-panel textarea[name="note"]{width:100%;min-height:42px;height:42px;padding:9px 12px;line-height:22px;resize:none;overflow:hidden;font-size:14px}

@media(max-width:720px){
  /* Keep the Selected Menu → Next → Back area short enough to be usable
     without repeated scrolling on a phone. The detailed service copy is
     already available on the menu card/detail modal, so this checkout
     summary intentionally shows only the essentials. */
  #booking-form .selected-menu{padding:12px 14px!important;margin-top:8px!important;margin-bottom:8px!important}
  #booking-form .selected-label{font-size:13px!important;margin-bottom:4px!important}
  #booking-form #selected-items{margin:0!important}
  #booking-form .selected-item-row{display:grid!important;grid-template-columns:44px minmax(0,1fr) auto!important;align-items:center!important;gap:8px!important;padding:5px 0!important;min-height:0!important}
  #booking-form .selected-item-row .item-thumb,
  #booking-form .selected-item-row .item-thumb-placeholder{width:44px!important;height:44px!important;border-radius:9px!important}
  #booking-form .selected-item-row .item-thumb-wrap{display:flex!important;gap:3px!important;width:44px!important;overflow:hidden!important}
  #booking-form .selected-item-row .item-thumb-wrap .item-thumb,
  #booking-form .selected-item-row .item-thumb-wrap .item-thumb-placeholder{width:21px!important;height:44px!important;border-radius:7px!important}
  #booking-form .selected-item-row>span{font-size:13px!important;line-height:1.25!important;margin:0!important;min-width:0!important}
  #booking-form .selected-item-row>span>small:not(.selected-item-details):not(.selected-item-duration){font-size:10px!important;line-height:1.2!important;margin-top:2px!important}
  #booking-form .selected-item-details,
  #booking-form .selected-item-duration{display:none!important}
  #booking-form .selected-item-row>strong{font-size:14px!important;line-height:1.2!important;white-space:nowrap!important}

  #booking-form .selected-menu .selected-total-line{padding:5px 0!important;min-height:28px!important;font-size:12px!important;line-height:1.15!important;border-top:1px solid var(--color-border-soft)!important}
  #booking-form .selected-menu .selected-total-line strong,
  #booking-form .selected-menu .selected-duration-line strong,
  #selected-date-value,#selected-time-value{font-size:14px!important;line-height:1.15!important}

  .booking-note-collapsible{margin:5px 0 7px!important}
  .booking-note-toggle{height:38px!important;min-height:38px!important;min-width:172px!important;padding:0 16px!important;font-size:12px!important}
  .booking-note-panel{margin-top:6px!important}
  #booking-form .booking-note-panel textarea[name="note"]{min-height:40px!important;height:40px;padding:8px 10px!important;font-size:13px!important}

  #booking-form>.booking-submit{height:42px!important;min-height:42px!important;margin-top:4px!important;margin-bottom:0!important;font-size:13px!important}
  #booking-form-step .form-bottom-actions{margin-top:6px!important;margin-bottom:8px!important;padding:0 18px!important}
  #booking-form-step .form-bottom-actions .btn{height:40px!important;min-height:40px!important;font-size:13px!important}
}

/* 2026-08-28: Header menu control — use the exact visual language of the
   language toggle, but keep a square footprint so the hamburger remains
   compact and predictable on every customer-facing page. */
.menu-btn {
    width: 54px !important;
    min-width: 54px !important;
    height: 54px !important;
    padding: 0 !important;
    border-radius: 6px !important;
    background: rgba(0, 240, 255, 0.1) !important;
    color: #ffffff !important;
    border: 1px solid rgba(0, 240, 255, 0.4) !important;
    font-weight: bold !important;
    box-shadow: inset 0 0 8px rgba(0, 240, 255, 0.2) !important;
    transition: all 0.3s ease-in-out !important;
}
.menu-btn:hover,
.menu-btn:focus-visible,
.menu-btn:active {
    background: rgba(0, 240, 255, 0.25) !important;
    border-color: #00F0FF !important;
    color: #ffffff !important;
    box-shadow: 0 0 15px rgba(0, 240, 255, 0.7), inset 0 0 10px rgba(0, 240, 255, 0.4) !important;
    transform: translateY(-2px) !important;
    filter: brightness(1.3) !important;
}
@media (max-width: 760px) {
    .menu-btn { width: 42px !important; min-width: 42px !important; height: 42px !important; }
}
@media (max-width: 390px) {
    .menu-btn { width: 36px !important; min-width: 36px !important; height: 36px !important; }
}

/* Homepage salon info link below hero photo */
.home-salon-info{max-width:1180px;margin:18px auto 28px;padding:0 20px;}
.home-salon-info-link{display:flex;align-items:center;justify-content:center;gap:12px;width:100%;min-height:54px;border:1px solid rgba(20,20,20,.18);background:#fff;color:#111;text-decoration:none;font-weight:600;letter-spacing:.04em;}
.home-salon-info-arrow{font-size:18px;line-height:1;}
@media(max-width:720px){.home-salon-info{margin:12px auto 20px;padding:0 14px}.home-salon-info-link{min-height:48px;font-size:14px;}}

/* Homepage salon info: show the actual About content below the hero, not a link button.
   2026-09-03: no fixed max-width any more (was 980px, then 1180px —
   still read as too narrow) — now scales with the viewport the same way
   .hero itself does (9% side padding, full width), so on a wide screen
   this block stretches out nearly as wide as the hero above it instead
   of staying capped at a fixed pixel width. */
.home-salon-info-content{max-width:none;margin:24px auto 34px;padding:0 9%;}
.home-salon-info-content h2{margin:0 0 12px;font-size:22px;font-weight:600;}
.home-salon-info-box{margin:0;line-height:1.85;}
@media(max-width:720px){.home-salon-info-content{margin:16px auto 24px;padding:0 14px}.home-salon-info-content h2{font-size:18px;margin-bottom:8px}.home-salon-info-box{font-size:13px;line-height:1.7;padding:16px}}

/* Homepage gallery teaser (links out to the new gallery.html). Same
   "full-width bordered white link row with an arrow" shape as the dead,
   unused .home-salon-info-link/.home-salon-info-arrow rule pair above —
   that shape is this site's own established convention for a homepage
   teaser-to-subpage link card, just given its own correctly-scoped class
   names here rather than reusing/renaming the old (unrelated-content)
   ones. */
/* 2026-09-03: same fix/same reasoning as .home-salon-info-content just
   above — no fixed max-width, scales with the viewport via 9% side
   padding like .hero does. */
.home-gallery-teaser{max-width:none;margin:24px auto 34px;padding:0 9%;}
.home-gallery-teaser h2{margin:0 0 12px;font-size:22px;font-weight:600;}
.home-gallery-teaser-box{margin:0 0 16px;line-height:1.85;}
.home-gallery-link{display:flex;align-items:center;justify-content:center;gap:12px;width:100%;min-height:54px;border:1px solid rgba(20,20,20,.18);background:#fff;color:#111;text-decoration:none;font-weight:600;letter-spacing:.04em;}
.home-gallery-arrow{font-size:18px;line-height:1;}
@media(max-width:720px){.home-gallery-teaser{margin:16px auto 24px;padding:0 14px}.home-gallery-teaser h2{font-size:18px;margin-bottom:8px}.home-gallery-teaser-box{font-size:13px;line-height:1.7}.home-gallery-link{min-height:48px;font-size:14px;}}

/* Homepage 今月の人気メニュー (this month's popular menu) — same
   .hp-menu-list/.hp-menu-card layout menu.html/booking.html already use
   (unscoped in this file, so it applies here unchanged), just with the
   rank/count shown via the existing .hp-card-top/.hp-badge pill instead
   of a select-menu button. Hidden by default in the HTML (only unhidden
   by js/popular-menu.js once there's at least one qualifying item), so no
   extra CSS is needed for the empty state. */
.home-popular-menu{max-width:980px;margin:24px auto 0;padding:0 20px;}
.home-popular-menu h2{margin:0 0 16px;font-size:22px;font-weight:600;}
@media(max-width:720px){.home-popular-menu{margin:16px auto 0;padding:0 14px}.home-popular-menu h2{font-size:18px;margin-bottom:10px}}

/* ============================================================
   Admin calendar — Hot Pepper-style full-day salon holiday
   ============================================================ */
.admin-day-actions{display:flex;flex-wrap:wrap;gap:10px;align-items:center;margin:0 0 14px}
.admin-day-actions .admin-add-btn{margin-bottom:0}
.admin-holiday-btn{background:#302a27!important;color:#fff!important;border-color:#302a27!important;max-width:280px}
.admin-holiday-btn:hover,.admin-holiday-btn:focus-visible{background:#171312!important;border-color:#171312!important}
.admin-holiday-btn.is-holiday-active{background:#b03a3a!important;border-color:#b03a3a!important}
.admin-holiday-btn:disabled{opacity:.45;cursor:not-allowed}
.admin-holiday-note{margin:0 0 16px;padding:10px 14px;border-radius:10px;background:#f7e9e9;color:#8b2d2d;font-size:13px;line-height:1.6}
.cal-holiday-dot{font-size:11px;font-weight:700;color:#fff;background:#302a27;border-radius:999px;padding:2px 7px;align-self:flex-start}
.timeline-holiday{background:#f3efeb;border-color:#302a27!important}
.timeline-holiday .timeline-time{color:#302a27!important;font-weight:700}
.week-hour-holiday{background:#eee8e2!important;color:#302a27!important}
.week-hour-holiday .week-hour-slot{border-left-color:#302a27!important}
@media(max-width:720px){
  .admin-day-actions{display:grid;grid-template-columns:1fr 1fr;gap:8px}
  .admin-day-actions #add-booking-here-btn{grid-column:1/-1}
  .admin-day-actions .btn{width:100%;max-width:none}
}

/* Email confirmed: keep thank-you heading on one line */
.email-confirmed-page #confirm-success .thanks-title{white-space:nowrap;}
@media(max-width:420px){.email-confirmed-page #confirm-success .thanks-title{font-size:clamp(25px,8vw,34px);}}

/* Email confirmed: the page currently only has min-height (so the footer
   stays below the fold) but no vertical centering, so the thank-you text
   sits pinned at the top with a large empty gap underneath. Flex-center it
   within that same min-height box so it reads roughly mid-page instead —
   scoped to .email-confirmed-page only, no other .page/.auth-page affected. */
body.d6-theme > main.page.email-confirmed-page{
  display:flex;
  flex-direction:column;
  justify-content:center;
}

/* 2026-08-28: Booking confirmation selection — improve mobile readability
   while keeping the selected-menu card comfortably visible on one screen. */
@media(max-width:720px){
  #booking-form .selected-menu{padding:16px 16px 18px!important;margin-top:10px!important;margin-bottom:10px!important;border-radius:0 0 28px 28px!important}
  #booking-form .selected-label{display:block!important;font-size:17px!important;line-height:1.25!important;margin-bottom:9px!important;font-weight:700!important}
  #booking-form .selected-item-row{grid-template-columns:58px minmax(0,1fr) auto!important;gap:11px!important;padding:8px 0!important}
  #booking-form .selected-item-row .item-thumb,
  #booking-form .selected-item-row .item-thumb-placeholder{width:58px!important;height:58px!important;border-radius:12px!important}
  #booking-form .selected-item-row .item-thumb-wrap{width:58px!important;gap:4px!important}
  #booking-form .selected-item-row .item-thumb-wrap .item-thumb,
  #booking-form .selected-item-row .item-thumb-wrap .item-thumb-placeholder{width:27px!important;height:58px!important;border-radius:9px!important}
  #booking-form .selected-item-row>span{font-size:16px!important;line-height:1.3!important;font-weight:500!important}
  #booking-form .selected-item-row>span>small:not(.selected-item-details):not(.selected-item-duration){font-size:12px!important;line-height:1.25!important;margin-top:3px!important}
  #booking-form .selected-item-row>strong{font-size:17px!important;line-height:1.2!important}
  #booking-form .selected-menu .selected-total-line{padding:8px 0!important;min-height:36px!important;font-size:15px!important;line-height:1.2!important}
  #booking-form .selected-menu .selected-total-line strong,
  #booking-form .selected-menu .selected-duration-line strong,
  #booking-form #selected-date-value,
  #booking-form #selected-time-value{font-size:17px!important;line-height:1.2!important}
}

/* 2026-08-28: Unified customer/admin action buttons.
   Master reference: footer Contact Us / お支払い方法 buttons. */
:root{--action-btn-width:180px}
.page .btn,
.page .booking-submit,
.auth-card .booking-submit,
.footer-contact-btn,
.handfoot-book,
.hp-card-primary,
.hp-card-secondary,
.article-book,
.hp-more-btn,
.policy-close-btn,
.remove-btn,
.change-type-btn,
.admin-shell .btn,
.admin-shell .booking-submit,
.week-edit-time-btn,
.week-edit-save-btn,
.week-edit-cancel-btn,
.admin-page .btn,
.admin-page .booking-submit,
.admin-add-btn,
.admin-holiday-btn,
.cm-export-btn,
.cm-view-btn,
.cm-memo-save-btn,
.cm-delete-btn{
  width:var(--action-btn-width)!important;
  min-width:var(--action-btn-width)!important;
  max-width:100%!important;
  height:var(--btn-height)!important;
  min-height:var(--btn-height)!important;
  padding:0 var(--btn-padding-x)!important;
  border-radius:var(--btn-radius)!important;
  font-size:var(--btn-font-size)!important;
  font-family:var(--font-body)!important;
  font-weight:700!important;
  line-height:1.15!important;
  display:inline-flex!important;
  align-items:center!important;
  justify-content:center!important;
  text-align:center!important;
  white-space:normal!important;
  box-sizing:border-box!important;
}
.confirm-actions,
.form-bottom-actions,
.selected-summary-actions,
.auth-actions-row,
.confirm-error-actions,
.hp-card-actions,
.hp-modal-actions,
.dashboard-quick-actions,
.admin-day-actions,
.cm-memo-actions,
.week-edit-actions{
  display:flex!important;
  align-items:center!important;
  flex-wrap:wrap!important;
  gap:12px!important;
  width:100%!important;
}
.confirm-actions,
.form-bottom-actions,
.selected-summary-actions,
.auth-actions-row,
.confirm-error-actions,
.hp-card-actions,
.hp-modal-actions{
  justify-content:center!important;
}
.confirm-actions:has(> :nth-child(2)),
.form-bottom-actions:has(> :nth-child(2)),
.selected-summary-actions:has(> :nth-child(2)),
.auth-actions-row:has(> :nth-child(2)),
.hp-card-actions:has(> :nth-child(2)),
.hp-modal-actions:has(> :nth-child(2)){
  justify-content:space-between!important;
}
/* .confirm-error-actions (リンクが無効です page: ログイン/新規登録) is
   deliberately left out of the space-between group above. Unlike the other
   members of that family (e.g. booking confirm step's 戻る/次へ, meant to
   sit at opposite edges), this one only ever has two stacked buttons that
   should stay together in the middle of the page — space-between just
   pinned each one to the left edge of its own wrapped line once they no
   longer fit side by side. The earlier .confirm-error-actions{justify-
   content:center!important} rule keeps winning instead. */
#booking-confirm-step .confirm-actions{
  flex-direction:row!important;
}
#back-to-form{order:1!important}
#save-booking{order:2!important}
.selected-summary-actions{
  margin-top:22px!important;
}
.selected-summary-actions .add-more-btn,
.selected-summary-actions .next-btn{
  margin:0!important;
}
#booking-form .form-bottom-actions{
  margin-top:14px!important;
  margin-bottom:1cm!important;
  padding:0 31px!important;
}
#booking-form > .booking-submit{
  margin-left:auto!important;
  margin-right:auto!important;
}
.review-form .booking-submit,
.auth-card .booking-submit,
.admin-shell form > .booking-submit,
.policy-close-btn,
.handfoot-book,
.booking-note-toggle{
  margin-left:auto!important;
  margin-right:auto!important;
}
#mypage-top .mypage-logout-btn{
  margin-left:auto!important;
  margin-right:auto!important;
}
#edit-profile-btn{
  margin-left:auto!important;
  margin-right:0!important;
}
.change-type-btn{
  flex-direction:column!important;
  gap:2px!important;
}
.change-type-options{
  justify-items:center!important;
}
.week-edit-cancel-btn{order:1!important}
.week-edit-save-btn{order:2!important}
#mypage-favorites h2{
  text-align:center!important;
}
.footer-copyright{
  color:#ffffff!important;
  opacity:1!important;
}
#edit-profile-btn,
#mypage-top .mypage-logout-btn{
  width:var(--action-btn-width)!important;
  min-width:var(--action-btn-width)!important;
  max-width:100%!important;
  height:var(--btn-height)!important;
  min-height:var(--btn-height)!important;
  padding:0 var(--btn-padding-x)!important;
  border-radius:var(--btn-radius)!important;
  font-size:var(--btn-font-size)!important;
  font-family:var(--font-body)!important;
  font-weight:700!important;
  line-height:1.15!important;
  display:inline-flex!important;
  align-items:center!important;
  justify-content:center!important;
  text-align:center!important;
  box-sizing:border-box!important;
}
#edit-profile-btn{
  margin-left:auto!important;
  margin-right:0!important;
}
#mypage-top .mypage-logout-btn{
  margin-left:auto!important;
  margin-right:auto!important;
}
/* Short customer pages: keep the footer below the first screen.
   Existing footer-less pages are untouched because this only targets
   pages that already have customer-facing content before a footer. */
body.d6-theme > main.page.about-page,
body.d6-theme > main.page.salon-info-detail-page,
body.d6-theme > main.page.email-confirmed-page,
body.d6-theme > main.page.auth-glass,
body.d6-theme > main.page.review-page,
body.d6-theme > main.page.mypage-page,
body.d6-theme > main.page:not([class*=" "]){
  min-height:calc(100svh - 88px)!important;
}
body.d6-theme > main:not(.page) > .hero:first-child{
  min-height:calc(100svh - 88px)!important;
}
@media(max-width:900px){
  body.d6-theme > main.page.about-page,
  body.d6-theme > main.page.salon-info-detail-page,
  body.d6-theme > main.page.email-confirmed-page,
  body.d6-theme > main.page.auth-glass,
  body.d6-theme > main.page.review-page,
  body.d6-theme > main.page.mypage-page,
  body.d6-theme > main.page:not([class*=" "]){
    min-height:calc(100svh - 82px)!important;
  }
  body.d6-theme > main:not(.page) > .hero:first-child{
    min-height:calc(100svh - 82px)!important;
  }
}
main.auth-page:has(#register-form) .auth-card{
  transform:translateY(-0.9cm)!important;
}
@media(max-width:480px){
  .confirm-actions,
  .form-bottom-actions,
  .selected-summary-actions,
  .auth-actions-row,
  .confirm-error-actions,
  .hp-card-actions,
  .hp-modal-actions{
    justify-content:center!important;
  }
}

/* 2026-08-28: Center page headings and sub-headings only. */
.page > h1,
.page > small,
.page .auth-title,
.page .reset-lead,
.page .thanks-title,
.page .thanks-message,
.page .success-title,
.page #confirm-title,
.page .hp-menu-hero-title,
.page .hp-section-heading,
.page .hp-section-heading h2,
.page .hp-result-count,
.page .avail-required-heading,
.page .customer-info-heading,
.page .menu-section-title,
.page .selected-menu h2,
.page .booking-box h2,
.page .booking-box h3,
.page .mypage-group-title,
.page .salon-info-intro,
.page .salon-info-intro h1,
.page .salon-info-intro p,
.page .salon-detail-title,
.review-list-wrap > h2,
.home-salon-info-content h2,
.home-gallery-teaser h2,
.home-popular-menu h2,
.admin-shell .admin-topbar-title,
.admin-shell .admin-section-title,
.admin-shell .cm-page-title,
.admin-shell .cm-page-subtitle,
.admin-shell #cal-month-label,
.admin-shell #day-panel-title,
.admin-shell #menu-editor-title,
.admin-shell #gallery-editor-title,
.admin-shell .cm-section-label{
  text-align:center!important;
}
/* 管理画面 H1/H2 centering, part 2 — the headings above were already
   centered by the rule directly above (pre-existing). These are the
   remaining admin H2s that weren't: a bare <h2>予約を編集</h2> and the new
   .admin-menu-group-head h2 (メニュー管理 redesign) sit in plain block
   containers, so text-align alone is enough. .admin-a4-page-header h2
   (手動予約作成) and .cm-detail-head h2 (顧客詳細) each share a flex row
   with another element (a brand label / a close button) pinned to the
   far right via justify-content:space-between — giving the heading's own
   flex item flex:1 lets it claim the leftover width so text-align:center
   actually centers it, while the sibling stays exactly where it already
   was at the row's right edge (untouched, not repositioned). */
.admin-shell #booking-edit-panel h2,
.admin-shell .admin-menu-group-head h2,
.admin-shell .admin-a4-page-header h2,
.admin-shell .cm-detail-head h2{
  text-align:center!important;
}
.admin-shell .admin-a4-page-header > div,
.admin-shell .cm-detail-head h2{
  flex:1;
}
.page .hp-section-heading{
  align-items:center!important;
  justify-content:center!important;
}

/* Menu & Price / Booking card redesign (the "hp-" prefixed classes) —
   carry the earlier "menu prices in solid black" request over to the new
   card layout. The old rule targeted .menu-table-price-value (the price
   cell in the previous <table>-based menu), which this redesign no
   longer renders — the price is now .hp-price (menu/booking cards) and
   .hp-modal-price (the "このメニューの詳細" popup). Color only: the new
   24px/26px sizing already reads as prominent within these cards, so
   deliberately left as-is rather than mechanically re-applying the old
   1.5x number, which was sized for the old, much smaller 15px base and
   would overflow this card design. */
.hp-price,
.hp-modal-price{
  color:#000000!important;
}

/* mypage.html Profile tab — プロフィールを編集 / ログアウト buttons:
   arrange left-right in one row (function order: edit/stay on the left,
   logout/leave on the right), keep them the same size as each other, and
   keep each label on one line. They now share the .mypage-profile-actions
   wrapper (mypage.html), which reuses the existing .confirm-actions row
   (same flex/gap/space-between/mobile-centering already used by the
   キャンセル/保存する pair right above it) rather than introducing a new
   layout pattern.
   - The site-wide "unified action buttons" rule (.page .btn, ~line 3312)
     sets white-space:normal!important so long labels wrap instead of
     overflowing a 180px pill — correct for most buttons, but it's what
     was wrapping "プロフィールを編集" onto 2 lines. Overridden back to
     nowrap for just these two buttons (left as-is everywhere else).
   - Widened just these two buttons from the shared 180px
     (--action-btn-width) to 210px, the minimum that reliably fits
     "プロフィールを編集" (the longer of the two labels) on one line at the
     site's normal button padding/font — still identical width for both,
     still the same height/padding/font/radius as every other button. */
#mypage-top .mypage-profile-actions{
  margin-top:20px!important;
}
#edit-profile-btn,
#mypage-top .mypage-logout-btn{
  width:210px!important;
  min-width:210px!important;
  white-space:nowrap!important;
}
#mypage-top .mypage-profile-actions > #edit-profile-btn,
#mypage-top .mypage-profile-actions > .mypage-logout-btn{
  margin-top:0!important;
}
/* Below 210px+210px+gap fitting comfortably (~480px, same breakpoint the
   .confirm-actions family already centers at, above), the row just wraps
   the two buttons onto their own centered lines like every other button
   pair on this page already does — no separate full-width mobile
   treatment introduced just for these two. */

/* js/mypage.js now toggles #edit-profile-btn's native `hidden` attribute
   directly (moving it out of #profile-view meant #profile-view's own
   hidden state no longer hid it — see mypage.html/js/mypage.js comments).
   The site-wide unified action-button rule (.page .btn, ~line 3312) sets
   display:inline-flex!important, which otherwise beats the browser's
   default [hidden]{display:none} and would keep the button visibly
   rendered even while hidden. This restores the native hidden behavior
   for just this one button, without touching that shared rule. */
#edit-profile-btn[hidden]{
  display:none!important;
}

/* "このメニューを選択"/"View menu details" (.hp-card-primary.select-btn /
   .hp-more-btn) — used on menu.html, booking.html's menu step, and My
   Page's 予約を変更する (change booking) > menu step alike, since all three
   render the same menuCards() markup (js/menu.js, reused by js/mypage.js).
   Same root cause as the mypage.html profile buttons above: the site-wide
   unified action-button rule (~line 3312) forces a 180px pill width with
   white-space:normal, which wraps these longer Japanese labels onto 2
   lines. Fixed the same way, scoped to just these two:
   - .hp-more-btn is really an underlined text link, not a button (no
     border/background) — restored to its natural auto width instead of
     forcing it into a 180px box.
   - .hp-card-primary.select-btn widened to 210px, same as the profile
     buttons. Its row (.hp-card-actions) only ever renders this one
     button in every real usage (see js/menu.js's isCartMode action
     button, and js/mypage.js's change-menu card) and that row is
     display:flex + centered per the shared "unified action row" rule
     below .hp-card-actions's own definition — so widening it doesn't
     compete with a grid-column width anywhere it's actually used. */
.hp-more-btn{
  width:auto!important;
  min-width:0!important;
  max-width:none!important;
  padding:2px 0!important;
  white-space:nowrap!important;
}
.hp-card-primary.select-btn{
  width:210px!important;
  min-width:210px!important;
  white-space:nowrap!important;
}

/* .change-type-btn ("日時を変更"/"メニューを変更"/"日時・メニューを変更" tiles
   in My Page > ご予約一覧 > 予約を変更する) — same unified action-button rule
   (~line 3312, .change-type-btn is in its selector list) shrank these
   from their original 96px-tall card design (border-radius:16px, 16px/
   12px padding — see the real .change-type-btn definition near line
   3000) down to a 48px-tall pill with almost no vertical padding,
   squeezing the bold title + small English subtitle into a cramped box.
   Restored the original tile proportions here, scoped to just this
   class so every other button in that shared list keeps its unified
   pill size. min-height (not height) is enough to win over the master
   rule's height:48px!important — CSS always lets min-height raise the
   used height above a smaller explicit height, regardless of which rule
   "wins" the height property itself. */
.change-type-btn{
  width:100%!important;
  min-width:0!important;
  min-height:96px!important;
  padding:16px 12px!important;
  border-radius:16px!important;
  white-space:normal!important;
}
/* The original design already shortened this tile a bit on narrow
   screens (single-column layout, see @media(max-width:720px) near line
   3013) — restoring that mobile value too so the fix above (unscoped,
   so it would otherwise win over that earlier, narrower rule at every
   width) doesn't flatten it back to the wider desktop height on mobile. */
@media(max-width:720px){
  .change-type-btn{
    min-height:72px!important;
  }
}

/* Header nav (HOME/MENU/RESERVATION/SALON INFO/MY PAGE) — highlight
   whichever one is the current page. js/main.js's markActiveNavLink()
   already adds .is-active to the matching link on load; visually it only
   drew a thin teal underline (.header-nav-link.is-active::after below),
   easy to miss against these chips' existing near-white neon-cyan
   background (header nav a, ~line 2460 — the site's existing "neon
   header button" styling, left as-is for every other state). Give the
   active one an actual solid fill instead. Two classes beat that
   existing rule's two-element selector regardless of !important vs
   !important, so no change needed there. */
.header-nav-link.is-active{
  background:#45ad74!important;
  border-color:#45ad74!important;
}
.header-nav-link.is-active:hover{
  background:#45ad74!important;
  border-color:#45ad74!important;
}

/* ○予約可能 ×予約不可 legend (booking.html / mypage.html's change-date-time
   step) — was left-aligned since .avail-legend never set justify-content
   on its flex row (defaults to flex-start). Centered, no other change. */
.avail-legend{
  justify-content:center;
}

/* Account Settings card (mypage.html Profile tab, #mypage-account-settings)
   — password change / notification preference / account deletion request.
   Reuses existing components (.profile-form for the password inputs,
   .auth-error/.auth-success for messages, .btn/.cancel-btn/.secondary-btn
   for buttons) — only the block layout/spacing below is new. */
.account-settings-block{
  padding-top:22px;
  margin-top:22px;
  border-top:1px solid #f2efec;
}
.account-settings-block:first-of-type{
  padding-top:0;
  margin-top:0;
  border-top:0;
}
.account-settings-block h3{
  margin:0 0 14px;
  font-size:17px;
}
.settings-toggle-row{
  display:flex;
  align-items:center;
  justify-content:space-between;
  gap:16px;
  cursor:pointer;
  font-size:15px;
  color:var(--color-ink);
}
.settings-toggle-row input[type="checkbox"]{
  width:20px;
  height:20px;
  flex:0 0 auto;
  accent-color:var(--color-primary);
  cursor:pointer;
}
.account-settings-note{
  font-size:14px;
  line-height:1.7;
  color:var(--color-text-muted);
  margin:0 0 16px;
}
.account-settings-danger{
  background:var(--color-danger-tint);
  border-top-color:transparent;
  border-radius:12px;
  padding:20px;
  margin-top:22px;
}
.account-settings-danger h3{
  color:var(--color-danger);
}
#delete-account-confirm{
  margin-top:16px;
}
#delete-account-status.auth-error{
  margin-top:16px;
}
#delete-account-status.auth-success{
  margin-top:16px;
}
/* Same fix, same 210px value, as the mypage.html profile buttons and
   hp-card-primary/select-btn earlier in this file: these two labels
   don't fit the site-wide unified action-button system's 180px pill
   width on one line. #password-change-form's own submit button
   ("更新する") was shortened instead, since it's short enough at 4
   characters to match 保存する's existing width-free convention — these
   two ("削除をリクエスト"/"リクエストする") stay full-length since they're a
   destructive-adjacent action where clarity matters more than brevity. */
#delete-account-btn,
#delete-account-confirm-btn{
  width:210px!important;
  min-width:210px!important;
  white-space:nowrap!important;
}
/* js/mypage.js toggles #delete-account-btn's native `hidden` attribute
   when the confirm step opens/closes — same fix as #edit-profile-btn
   earlier in this file, and for the same reason: .page .btn's
   display:inline-flex!important otherwise beats the browser's default
   [hidden]{display:none} and would keep the button visibly rendered
   even while "hidden". */
#delete-account-btn[hidden]{
  display:none!important;
}

/* ============================================================
   2026-09-03: Sitewide scroll-reveal + motion polish.
   .reveal-init/.is-visible are added purely by js/main.js's
   IntersectionObserver — see that file's comment for the full
   rationale (progressive enhancement: without the JS, nothing here
   ever applies and every page looks exactly as before).
   ============================================================ */
.reveal-init{opacity:0;transform:translateY(18px);transition:opacity .5s ease,transform .5s ease}
.reveal-init.is-visible{opacity:1;transform:none}

/* Gentle cascade for grid/card rows so a whole row doesn't pop in as one
   flat block — matches the row's natural reading order. Capped at the
   5th item; anything past that reveals together with the 5th (a longer
   built-in stagger reads as sluggish rather than elegant). */
.hp-menu-card.reveal-init:nth-child(2),.gallery-card.reveal-init:nth-child(2),.review-card.reveal-init:nth-child(2),.favorites-grid>.reveal-init:nth-child(2){transition-delay:.06s}
.hp-menu-card.reveal-init:nth-child(3),.gallery-card.reveal-init:nth-child(3),.review-card.reveal-init:nth-child(3),.favorites-grid>.reveal-init:nth-child(3){transition-delay:.12s}
.hp-menu-card.reveal-init:nth-child(4),.gallery-card.reveal-init:nth-child(4),.review-card.reveal-init:nth-child(4),.favorites-grid>.reveal-init:nth-child(4){transition-delay:.18s}
.hp-menu-card.reveal-init:nth-child(n+5),.gallery-card.reveal-init:nth-child(n+5),.review-card.reveal-init:nth-child(n+5),.favorites-grid>.reveal-init:nth-child(n+5){transition-delay:.24s}

/* .gallery-card (customer-facing gallery grid, added this session) never
   got the hover-lift treatment its sibling components already have
   (.hp-menu-card, .salon-info-card, .footer-contact-btn, etc.) — same
   var(--shadow-card-hover) token those already use, so it matches. */
.gallery-card{transition:transform .25s ease,box-shadow .25s ease}
.gallery-card:hover,.gallery-card:focus-within{transform:translateY(-4px);box-shadow:var(--shadow-card-hover)}

/* Respects the OS-level "reduce motion" accessibility setting sitewide —
   not just for the reveal effect above, but for every existing
   transition/animation already in this file (card hover-lifts, the
   smooth-scroll on html, modal transitions, etc.). Purely additive: only
   engages for visitors who have this OS setting on, and never changes
   final state — content ends up exactly where/how it would anyway, just
   without the motion getting there. */
@media (prefers-reduced-motion: reduce){
  *,*::before,*::after{
    animation-duration:.01ms!important;
    animation-iteration-count:1!important;
    transition-duration:.01ms!important;
    scroll-behavior:auto!important;
  }
  .reveal-init{opacity:1;transform:none}
}