/* ============================================================
   紫光美容室 by shikou - 神戸・布引町
   Quiet violet theme. VARIANCE 4 / MOTION 2 / DENSITY 3.

   This practice works with trichotillomania (抜毛症) and hair loss.
   Restraint IS the design: deliberately the calmest site in the
   project. No reveal animations at all (MOTION 2 means hover and
   focus only), so there is no .rv class here and therefore no
   blank-page-without-JS risk to guard against.

   Theme lock: light, whole page.
   Accent lock: muted violet, taken from the 紫 in the shop's own name.
   Radius lock: 8px everywhere.

   Contrast, computed not guessed (WCAG AA needs 4.5:1 for body text):
     ink    #2b2733 on bg #f4f3f6 ........ 13.19:1
     muted  #5c5668 on bg ............... 6.36:1
     accent #6b5b95 on bg ............... 5.34:1
     accent #6b5b95 on bg-2 #eceaf1 ..... 4.95:1
     ink    on bg-2 .................... 12.22:1
     muted  on bg-2 .................... 5.89:1
     white  on accent surface .......... 5.90:1
     white  on accent hover #574a7d .... 7.83:1
     muted  placeholder on white input . 7.03:1
     warn   #8c3a3a on bg-2 ............ 6.33:1
   ============================================================ */

:root {
  --bg: #f4f3f6;
  --bg-2: #eceaf1;
  --bg-3: #e3e0ea;
  --line: #d8d4e0;
  --text: #2b2733;
  --muted: #5c5668;
  --accent: #6b5b95;
  --accent-hover: #574a7d;
  --accent-ink: #ffffff;
  --warn: #8c3a3a;
  /* BIZ UDPMincho is a Japanese Universal Design face, drawn for
     legibility rather than style. Chosen deliberately: people reading
     this page may be doing so quietly and carefully, and UD faces are
     easier on readers with low vision or dyslexia. It is also unused
     elsewhere in this project, so this site reads as its own. */
  --font-display: "BIZ UDPMincho", "Hiragino Mincho ProN", serif;
  /* BIZ UDPGothic for body, pairing with the BIZ UDPMincho display face.
     Both are Universal Design faces drawn for legibility rather than style.
     That is the right choice here specifically: this is a practice for
     trichotillomania and hair loss, and someone reading about a condition they
     may have hidden for years should not also be fighting the typography.
     The family ships 400 and 700 only, which is exactly what this site uses. */
  --font-body: "BIZ UDPGothic", "Hiragino Kaku Gothic ProN", sans-serif;
  --nav-h: 66px;
  --r: 8px;
}

* { margin: 0; padding: 0; box-sizing: border-box; }

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

body {
  background: var(--bg);
  color: var(--text);
  font-family: var(--font-body);
  font-size: 1rem;
  line-height: 2;
  -webkit-font-smoothing: antialiased;
}

img { max-width: 100%; display: block; }
a { color: inherit; text-decoration: none; }

:focus-visible {
  outline: 2px solid var(--accent);
  outline-offset: 3px;
}

.wrap {
  max-width: 980px;
  margin: 0 auto;
  padding: 0 clamp(1.25rem, 5vw, 2.5rem);
}

/* ---------- Navigation: minimal by intent ---------- */

.nav {
  position: sticky;
  top: 0;
  z-index: 30;
  height: var(--nav-h);
  display: flex;
  align-items: center;
  background: rgba(244, 243, 246, 0.94);
  backdrop-filter: blur(8px);
  -webkit-backdrop-filter: blur(8px);
  border-bottom: 1px solid var(--line);
}

.nav .wrap { width: 100%; display: flex; align-items: center; gap: 1.5rem; }

.brand {
  font-family: var(--font-display);
  font-size: 1.15rem;
  letter-spacing: 0.06em;
}

.nav-links { display: flex; gap: 1.4rem; margin-left: auto; font-size: 0.9rem; }
.nav-links a { color: var(--muted); }
.nav-links a:hover { color: var(--text); }

.lang { display: flex; gap: 0.3rem; font-size: 0.78rem; font-weight: 700; }
.lang a {
  padding: 0.3rem 0.5rem;
  color: var(--muted);
  border: 1px solid transparent;
  border-radius: var(--r);
}
.lang a:hover { color: var(--text); }
.lang a[aria-current="true"] { color: var(--accent); border-color: var(--line); }

.btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 0.5rem;
  min-height: 46px;
  padding: 0.7rem 1.6rem;
  font-family: var(--font-body);
  font-size: 0.98rem;
  font-weight: 700;
  white-space: nowrap;
  cursor: pointer;
  border: 1px solid transparent;
  border-radius: var(--r);
  transition: background 0.2s, border-color 0.2s, color 0.2s;
}
.btn:active { transform: translateY(1px); }

.btn-primary { background: var(--accent); color: var(--accent-ink); }
.btn-primary:hover { background: var(--accent-hover); }

.btn-ghost { border-color: var(--line); color: var(--text); background: none; }
.btn-ghost:hover { border-color: var(--accent); color: var(--accent); }

/* ---------- Hero: a quiet opening statement, text only ----------
   Every other site in this project opens with a photograph beside or
   behind the headline. This one opens with words and space, and the
   image comes later as a calm band. That is the point. */

.hero {
  padding: clamp(4rem, 12vh, 7.5rem) 0 clamp(2.5rem, 6vh, 4rem);
}

.eyebrow {
  font-size: 0.78rem;
  font-weight: 700;
  letter-spacing: 0.2em;
  color: var(--accent);
  margin-bottom: 1.6rem;
}

.hero h1 {
  font-family: var(--font-display);
  font-weight: 400;
  font-size: clamp(1.9rem, 4.4vw, 3rem);
  line-height: 1.7;
  letter-spacing: 0.03em;
  margin-bottom: 1.8rem;
}

.hero-sub {
  color: var(--muted);
  max-width: 42em;
  margin-bottom: 2.4rem;
}

.hero-ctas { display: flex; gap: 0.9rem; flex-wrap: wrap; }

.rule {
  height: 1px;
  background: var(--line);
  margin: 0 auto;
  max-width: 980px;
}

/* ---------- Calm image band ---------- */

.band { padding: 0; }
.band img {
  width: 100%;
  height: clamp(220px, 34vh, 360px);
  object-fit: cover;
  filter: saturate(0.5) brightness(1.02);
}
.band figcaption {
  color: var(--muted);
  font-size: 0.82rem;
  padding: 0.9rem clamp(1.25rem, 5vw, 2.5rem);
  max-width: 980px;
  margin: 0 auto;
}

/* ---------- Sections ---------- */

section { padding: clamp(3.5rem, 8vw, 5.5rem) 0; }

.sec-head { margin-bottom: clamp(2rem, 4vw, 3rem); }
.sec-head h2 {
  font-family: var(--font-display);
  font-weight: 400;
  font-size: clamp(1.4rem, 2.6vw, 1.9rem);
  line-height: 1.7;
  letter-spacing: 0.03em;
}
.sec-head p { color: var(--muted); max-width: 44em; margin-top: 0.8rem; }

/* ---------- Offer: stacked hairline rows, not cards ---------- */

.offer { border-top: 1px solid var(--line); }
.offer-row {
  display: grid;
  grid-template-columns: 13rem 1fr;
  gap: 1.5rem;
  padding: 1.9rem 0;
  border-bottom: 1px solid var(--line);
}
.offer-row dt {
  font-family: var(--font-display);
  font-size: 1.08rem;
  color: var(--accent);
}
.offer-row dd { color: var(--muted); }

.offer-note {
  margin-top: 1.6rem;
  color: var(--muted);
  font-size: 0.88rem;
}

/* ---------- First visit: a single quiet panel ---------- */

.panel {
  background: var(--bg-2);
  border: 1px solid var(--line);
  border-radius: var(--r);
  padding: clamp(1.8rem, 4vw, 3rem);
  max-width: 46em;
}
.panel h2 {
  font-family: var(--font-display);
  font-weight: 400;
  font-size: clamp(1.3rem, 2.4vw, 1.7rem);
  margin-bottom: 1.4rem;
  letter-spacing: 0.03em;
}
.panel ul { list-style: none; }
.panel li {
  position: relative;
  padding-left: 1.6rem;
  margin-bottom: 1rem;
  color: var(--muted);
}
.panel li::before {
  content: "";
  position: absolute;
  left: 0; top: 0.95em;
  width: 0.6rem; height: 1px;
  background: var(--accent);
}
.panel li:last-child { margin-bottom: 0; }

.attrs {
  display: flex;
  flex-wrap: wrap;
  gap: 0.6rem;
  margin-top: 1.8rem;
}
.attr {
  font-size: 0.82rem;
  color: var(--accent);
  border: 1px solid var(--line);
  border-radius: var(--r);
  padding: 0.3rem 0.8rem;
  background: var(--bg);
}

/* ---------- Hours and access ---------- */

.info-grid {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: clamp(2rem, 5vw, 4rem);
}

.hours dt {
  font-size: 0.82rem;
  font-weight: 700;
  letter-spacing: 0.08em;
  color: var(--accent);
  margin-top: 1.3rem;
}
.hours dt:first-child { margin-top: 0; }
.hours dd { font-size: 1.1rem; }

.info-list { list-style: none; }
.info-list li { padding: 1rem 0; border-bottom: 1px solid var(--line); }
.info-list li:first-child { padding-top: 0; }
.info-list .label {
  display: block;
  font-size: 0.78rem;
  font-weight: 700;
  letter-spacing: 0.1em;
  color: var(--muted);
  margin-bottom: 0.15rem;
}
.info-list a.link { color: var(--accent); font-weight: 700; text-decoration: underline; }

.tbc { color: var(--muted); }
.tbc .dash {
  display: inline-block;
  min-width: 5rem;
  border-bottom: 1px dashed var(--line);
  margin-right: 0.6rem;
}

.info-actions { margin-top: 1.6rem; }

/* ---------- Reservation ---------- */

.reserve {
  background: var(--bg-2);
  border-top: 1px solid var(--line);
  border-bottom: 1px solid var(--line);
}

.reserve-grid {
  display: grid;
  grid-template-columns: 1fr 1.1fr;
  gap: clamp(2rem, 5vw, 4rem);
  align-items: start;
}

.reserve-copy h2 {
  font-family: var(--font-display);
  font-weight: 400;
  font-size: clamp(1.4rem, 2.6vw, 1.9rem);
  margin-bottom: 1rem;
  letter-spacing: 0.03em;
}
.reserve-copy p { color: var(--muted); }

.closed-note {
  margin-top: 1.4rem;
  padding: 0.8rem 1rem;
  border: 1px solid var(--line);
  border-radius: var(--r);
  background: var(--bg);
  color: var(--text);
  font-size: 0.9rem;
}

.reserve-alt {
  margin-top: 1.6rem;
  padding-top: 1.4rem;
  border-top: 1px solid var(--line);
  font-size: 0.92rem;
  color: var(--muted);
}
.reserve-alt a { color: var(--accent); font-weight: 700; text-decoration: underline; }

.form { display: grid; grid-template-columns: 1fr 1fr; gap: 1.2rem; }

.field { display: flex; flex-direction: column; gap: 0.45rem; }
.field.full { grid-column: 1 / -1; }
.field label { font-size: 0.85rem; font-weight: 700; }

.field input,
.field select {
  background: #ffffff;
  border: 1px solid var(--line);
  border-radius: var(--r);
  color: var(--text);
  font-family: var(--font-body);
  font-size: 1rem;
  padding: 0.8rem 0.9rem;
  appearance: none;
  -webkit-appearance: none;
}
.field select {
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='8' fill='none'%3E%3Cpath d='M1 1l5 5 5-5' stroke='%235c5668' stroke-width='2'/%3E%3C/svg%3E");
  background-repeat: no-repeat;
  background-position: right 0.9rem center;
}
.field input:focus,
.field select:focus {
  outline: 2px solid var(--accent);
  outline-offset: 0;
  border-color: var(--accent);
}
/* Solid muted, not a tint: any alpha wash fell under 4.5:1 on white. */
.field input::placeholder { color: var(--muted); opacity: 1; }

.form-error {
  grid-column: 1 / -1;
  display: none;
  color: var(--warn);
  font-size: 0.9rem;
  font-weight: 700;
}
.form-error.show { display: block; }

.form-ok {
  grid-column: 1 / -1;
  display: none;
  background: var(--bg);
  border: 1px solid var(--line);
  border-radius: var(--r);
  padding: 0.9rem 1.1rem;
  font-size: 0.94rem;
}
.form-ok.show { display: block; }

.form .btn { grid-column: 1 / -1; justify-self: start; }

/* ---------- Footer ---------- */

footer {
  padding: 2.8rem 0 3.2rem;
  color: var(--muted);
  font-size: 0.87rem;
}
.foot-grid { display: flex; justify-content: space-between; gap: 1.5rem; flex-wrap: wrap; }
.foot-brand { font-family: var(--font-display); color: var(--text); margin-bottom: 0.3rem; }
.foot-links { display: flex; gap: 1.2rem; align-items: center; }
.foot-links a:hover { color: var(--text); }
.demo-note { margin-top: 1.4rem; font-size: 0.8rem; }

/* ---------- Mobile ---------- */

@media (max-width: 860px) {
  .nav-links { display: none; }
  .offer-row { grid-template-columns: 1fr; gap: 0.4rem; }
  .info-grid, .reserve-grid, .form { grid-template-columns: 1fr; }
}

@media (max-width: 520px) {
  .hero-ctas .btn { width: 100%; }
  .nav .wrap { gap: 0.8rem; }
}

/* ============================================================
   Chrome variant. Combination NAV-C / RES-A / FOOT-A, which no
   other site in the project uses.

   Only the nav is varied, deliberately. Restraint is this site's
   design (VARIANCE 4 / MOTION 2), and the minimal rail is the
   quietest of the three navs: no filled button, no second row.
   The split booking block and two-column footer stay plain.
   Layout only: no colour token changes, so every measured
   contrast pairing is unchanged. The sticky (not fixed) nav and
   the 980px wrap, the narrowest in the project, are preserved.
   ============================================================ */

/* Chrome variant NAV-C: minimal rail. Brand is divided off by a rule, links sit
   left, language sits right. Heavier bottom border.
   Note: this site's nav carries no CTA button by design, so the
   .btn.btn-primary rule below is inert here and kept only so the variant
   stays recognisable if a CTA is ever added. */
.nav { border-bottom-width: 2px; }
.nav .wrap { display: flex; align-items: center; gap: 1.5rem; }
.nav .brand { margin-right: 1.4rem; padding-right: 1.4rem; border-right: 1px solid var(--line); }
.nav-links { margin-left: 0; margin-right: auto; font-size: 0.86rem; letter-spacing: 0.07em; }
.nav .lang { order: 8; }
.nav .btn.btn-primary {
  background: none; color: var(--text); border: none; border-radius: 0;
  border-bottom: 2px solid var(--accent);
  padding-left: 0; padding-right: 0; order: 9;
}
.nav .btn.btn-primary:hover { background: none; color: var(--accent); }
@media (max-width: 860px) {
  .nav .brand { margin-right: auto; padding-right: 0; border-right: none; }
}

/* ---------- Media layer overrides ----------
   This practice has ONE photograph and restraint is the design, so
   there is no gallery grid here. .m-gallery is used purely as the
   behaviour hook that lets a first-time visitor open the room photo
   larger before deciding to come, which matters more than usual for
   a service people are private about. display:block keeps the figure
   exactly as designed; media.css loads later and would otherwise
   impose its grid. */
.band.m-gallery { display: block; }

/* The photo IS the control. No hover effect, nothing that reads as
   an advertisement. */
.m-shot {
  display: block; width: 100%;
  padding: 0; border: none; background: none;
  cursor: pointer; min-height: 44px;
}
.m-shot:focus-visible { outline: 2px solid var(--accent); outline-offset: 3px; }


/* ============================================================
   MOBILE HEADER REPAIR (2026-09-13)
   Found by rendering this site at a TRUE 390px viewport. Every
   code-level check passed: JSON-LD parsed, contrast computed,
   node --check clean. None of them can see that the shop's own
   name was breaking character by character in its own header
   (シ/ャ/ル/メ) and that 日本語 was stacking vertically in the
   language switcher.

   Appended last so it wins on source order without raising
   specificity, and uses no colour values, so nothing can regress.
   ============================================================ */

/* A shop's name must never break mid-word in its own header. */
.brand { white-space: nowrap; }

/* 日本語 is one word to a reader; it must not become 日/本/語. */
.lang a { white-space: nowrap; }

@media (max-width: 430px) {
  /* THE BOOKING BUTTON WAS RUNNING OFF THE SCREEN.
     Measured at a 358px viewport, the nav CTA's right edge sat between
     366px and 466px on eleven of fifteen sites. The nav is fixed and
     does not scroll, so the document reported no overflow and every
     automated check passed while the primary conversion control was
     partly invisible on a small phone.
     The header keeps brand, languages and the booking button; they just
     stop competing for room. */
  .nav .wrap { gap: 0.5rem; }
  .nav .btn {
    padding: 0.45rem 0.7rem;
    font-size: 0.78rem;
    min-width: 0;
  }
  .lang { gap: 0.1rem; }
  .lang a { padding: 0.3rem 0.35rem; font-size: 0.68rem; }
  .brand { font-size: 1.05rem; letter-spacing: 0.04em; }
}
