/* Same fonts the app itself uses: LINE Seed JP for headings/emphasis
   (fonts.bold in app/native/src/features/onboarding/ui/components.tsx),
   Noto Sans JP for body text (fonts.body). Both are OFL-licensed. */
@font-face {
  font-family: "LINE Seed JP";
  src: url("./assets/fonts/LINESeedJP-Regular.ttf") format("truetype");
  font-weight: 400;
  font-style: normal;
  font-display: swap;
}

@font-face {
  font-family: "LINE Seed JP";
  src: url("./assets/fonts/LINESeedJP-Bold.ttf") format("truetype");
  font-weight: 700;
  font-style: normal;
  font-display: swap;
}

@font-face {
  font-family: "Noto Sans JP";
  src: url("./assets/fonts/NotoSansJP-Regular.otf") format("opentype");
  font-weight: 400;
  font-style: normal;
  font-display: swap;
}

:root {
  --text: #18181b;
  --muted: #6b6b70;
  --border: #e4e4e7;
  --bg: #ffffff;
  --bg-soft: #fafafa;
  --accent: #ff4d8d;
  --shadow-warm: 176, 150, 118;
  --font-body: "Noto Sans JP", -apple-system, BlinkMacSystemFont, "Hiragino Sans", "Hiragino Kaku Gothic ProN", "Yu Gothic", sans-serif;
  --font-bold: "LINE Seed JP", "Noto Sans JP", -apple-system, BlinkMacSystemFont, "Hiragino Sans", "Hiragino Kaku Gothic ProN", "Yu Gothic", sans-serif;
}

* {
  box-sizing: border-box;
}

body {
  margin: 0;
  color: var(--text);
  background: var(--bg);
  font-family: var(--font-body);
  line-height: 1.8;
}

h1, h2, h3, strong, button {
  font-family: var(--font-bold);
}

a {
  color: var(--accent);
}

.site-header {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 16px;
  padding: 20px 24px;
  border-bottom: 1px solid var(--border);
}

.site-title {
  display: inline-flex;
  align-items: center;
  font-weight: 700;
  font-size: 20px;
  color: var(--text);
  text-decoration: none;
}

.site-title img {
  display: block;
  width: auto;
  height: 40px;
}

.site-nav {
  display: flex;
  gap: 20px;
  flex-wrap: wrap;
}

.site-nav a {
  color: var(--text);
  text-decoration: none;
  font-size: 14px;
}

.site-nav a:hover {
  color: var(--accent);
}

main {
  max-width: 720px;
  margin: 0 auto;
  padding: 48px 24px 96px;
}

h1 {
  font-size: 30px;
  margin: 0 0 8px;
}

h2 {
  font-size: 22px;
  margin: 48px 0 16px;
}

h3 {
  font-size: 17px;
  margin: 0 0 8px;
}

.subtitle {
  color: var(--muted);
  font-size: 14px;
  margin: 0 0 4px;
}

.lead {
  font-size: 16px;
  color: var(--muted);
}

/* Landing page: single no-scroll view with a phone mockup + app card, framed by
   the onboarding screen's own background/character/logo assets. */

body.landing-page {
  height: 100%;
  overflow: hidden;
  /* The LP uses LINE Seed JP for every piece of text, not just headings. */
  font-family: var(--font-bold);
}

.landing {
  position: relative;
  width: 100%;
  max-width: none;
  height: 100vh;
  height: 100dvh;
  margin: 0;
  display: flex;
  flex-direction: column;
  align-items: center;
  padding: 24px;
  overflow: hidden;
  background: #fffaf3;
}

/* Subtle film-grain so the flat vector colors don't look too digital. */
.landing::after {
  content: "";
  position: absolute;
  inset: 0;
  z-index: 4;
  pointer-events: none;
  opacity: 0.05;
  mix-blend-mode: overlay;
  background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='160' height='160'><filter id='n'><feTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='2' stitchTiles='stitch'/></filter><rect width='100%25' height='100%25' filter='url(%23n)'/></svg>");
  background-size: 160px 160px;
}

.landing-decor {
  position: absolute;
  inset: 0;
  z-index: 0;
  overflow: hidden;
  pointer-events: none;
}

.cursor-shape-field {
  position: absolute;
  inset: 0;
  z-index: 0;
  display: block;
  width: 100%;
  height: 100%;
  pointer-events: none;
}

/* Soft warm shading pooled in the corners for a bit of depth. */
.landing-decor::before {
  content: "";
  position: absolute;
  inset: 0;
  z-index: 3;
  pointer-events: none;
  mix-blend-mode: multiply;
  background:
    radial-gradient(ellipse 320px 260px at 0% 0%, rgba(var(--shadow-warm), 0.09), transparent 70%),
    radial-gradient(ellipse 300px 240px at 100% 0%, rgba(var(--shadow-warm), 0.09), transparent 70%),
    radial-gradient(ellipse 320px 260px at 0% 100%, rgba(var(--shadow-warm), 0.09), transparent 70%),
    radial-gradient(ellipse 340px 280px at 100% 100%, rgba(var(--shadow-warm), 0.09), transparent 70%);
}

.decor-corner {
  position: absolute;
  z-index: 2;
  width: clamp(130px, 22vw, 260px);
  height: auto;
  display: block;
}

.decor-corner,
.decor-peek {
  pointer-events: none;
  transform: scale(var(--corner-scale, 1));
  filter:
    saturate(var(--corner-saturation, 1))
    brightness(var(--corner-brightness, 1));
  transition: transform 0.08s ease-out, filter 0.08s ease-out;
}

.decor-art {
  position: relative;
  z-index: 1;
  display: block;
  width: 100%;
  height: auto;
}

.decor-texture-copy {
  position: absolute;
  inset: 0;
  z-index: 3;
  display: block;
  width: 100%;
  height: 100%;
  object-fit: contain;
  pointer-events: none;
  opacity: var(--corner-noise, 0);
  mix-blend-mode: normal;
  transition: opacity 0.16s ease-in-out;
}

.decor-corner::before,
.decor-peek::before {
  content: "";
  position: absolute;
  inset: 0;
  pointer-events: none;
  -webkit-mask: var(--corner-mask) center / 100% 100% no-repeat;
  mask: var(--corner-mask) center / 100% 100% no-repeat;
  -webkit-mask-mode: alpha;
  mask-mode: alpha;
  transition: opacity 0.08s ease-out;
}

.decor-corner::before,
.decor-peek::before {
  z-index: 2;
  opacity: var(--corner-gradient, 0);
  background-image:
    radial-gradient(circle at 32% 24%, rgba(255, 255, 255, 0.94), transparent 42%),
    linear-gradient(145deg, rgba(106, 232, 245, 0.72), transparent 46%, rgba(255, 120, 184, 0.68));
  background-size: 100% 100%;
  background-blend-mode: screen, soft-light;
  mix-blend-mode: screen;
}

.decor-corner--tl {
  top: 0;
  left: 0;
  transform-origin: top left;
  --corner-mask: url("./assets/decor/corner-top-left.svg");
}

.decor-corner--tr {
  top: 0;
  right: 0;
  width: clamp(120px, 20vw, 240px);
  transform-origin: top right;
  --corner-mask: url("./assets/decor/corner-top-right.svg");
}

.decor-corner--bl {
  bottom: 0;
  left: 0;
  width: clamp(135px, 22vw, 250px);
  transform-origin: bottom left;
  --corner-mask: url("./assets/decor/corner-bottom-left.svg");
}

.decor-corner--br {
  bottom: 0;
  right: 0;
  width: clamp(145px, 24vw, 275px);
  transform-origin: bottom right;
  --corner-mask: url("./assets/decor/corner-bottom-right.svg");
}

/* Shapes with a flat edge of their own (Vector-3/6/7/8 from the design handoff)
   sit flush against the same edge, layered behind their corner so they read as
   a second shape peeking out from underneath it. */
.decor-peek {
  position: absolute;
  z-index: 1;
  display: block;
  height: auto;
}

.decor-peek--bl {
  bottom: 0;
  left: 0;
  width: clamp(220px, 36vw, 380px);
  transform-origin: bottom left;
  --corner-mask: url("./assets/decor/scatter-3.svg");
}

.landing-nav {
  position: absolute;
  top: 24px;
  left: 28px;
  z-index: 3;
}

.landing-wordmark {
  display: block;
  padding: 0;
  border: none;
  background: none;
  cursor: pointer;
}

.landing-wordmark .logo-swap {
  height: 32px;
}

.landing-wordmark .logo-swap-hover {
  transform-origin: left center;
}

/* Logo swap: the flat SVG mark crossfades to the glossy 3D render on hover,
   both sized to the same box as the original SVG. */
.logo-swap {
  position: relative;
  display: inline-block;
}

.logo-swap-base,
.logo-swap-hover {
  display: block;
  height: 100%;
  width: auto;
  transform: scale(1) rotate(0deg);
  transition: opacity 0.2s ease, transform 0.3s ease;
}

.logo-swap-hover {
  position: absolute;
  inset: 0;
  height: 100%;
  width: 100%;
  object-fit: contain;
  object-position: left center;
  opacity: 0;
  filter: drop-shadow(0 0 0 rgba(24, 24, 27, 0));
  /* Keep the return calm; the short "pikon" overshoot is applied on entry. */
  transition: opacity 0.16s ease, transform 0.2s ease-out, filter 0.2s ease;
}

.landing-wordmark:hover .logo-swap-base,
.landing-wordmark.is-menu-active .logo-swap-base,
.phone-frame:hover .phone-logo .logo-swap-base {
  opacity: 0;
  transform: scale(0.94) rotate(-6deg);
}

.landing-wordmark:hover .logo-swap-hover,
.landing-wordmark.is-menu-active .logo-swap-hover,
.phone-frame:hover .phone-logo .logo-swap-hover {
  opacity: 1;
  /* lift it slightly toward the viewer, not just bigger */
  transform: scale(1.22) rotate(1.5deg) translateY(-4%);
  filter: drop-shadow(0 6px 8px rgba(24, 24, 27, 0.22));
  transition:
    opacity 0.15s ease,
    filter 0.28s ease;
  animation: logo-pop-phone 0.4s cubic-bezier(0.2, 0.7, 0.2, 1) both;
}

@keyframes logo-pop-phone {
  0%   { transform: scale(1) rotate(0deg) translateY(0); }
  45%  { transform: scale(1.25) rotate(2.1deg) translateY(-4.7%); }
  68%  { transform: scale(1.2) rotate(1.1deg) translateY(-3.4%); }
  84%  { transform: scale(1.23) rotate(1.65deg) translateY(-4.15%); }
  100% { transform: scale(1.22) rotate(1.5deg) translateY(-4%); }
}

/* The 3D PNG has a small transparent left gutter, and its enlarged scale would
   otherwise move the visible centre to the right. Keep this correction scoped
   to the header; the phone logo intentionally keeps the shared transform. */
.landing-wordmark:hover .logo-swap-hover,
.landing-wordmark.is-menu-active .logo-swap-hover {
  transform: scale(1.22) rotate(1.5deg) translate(-9.2%, -4%);
  animation-name: logo-pop-header;
  filter:
    drop-shadow(0 6px 8px rgba(255, 77, 141, 0.3))
    drop-shadow(0 3px 4px rgba(145, 31, 88, 0.14));
}

@keyframes logo-pop-header {
  0%   { transform: scale(1) rotate(0deg) translate(0, 0); }
  45%  { transform: scale(1.25) rotate(2.1deg) translate(-9.6%, -4.7%); }
  68%  { transform: scale(1.2) rotate(1.1deg) translate(-8.4%, -3.4%); }
  84%  { transform: scale(1.23) rotate(1.65deg) translate(-9.4%, -4.15%); }
  100% { transform: scale(1.22) rotate(1.5deg) translate(-9.2%, -4%); }
}

.phone-frame:hover .phone-logo .logo-swap-hover {
  filter:
    drop-shadow(0 6px 8px rgba(232, 128, 42, 0.28))
    drop-shadow(0 3px 4px rgba(149, 88, 38, 0.16));
}

.landing-menu[hidden] {
  display: none;
}

.landing-menu {
  position: absolute;
  top: calc(100% + 14px);
  /* Align with the enlarged 3D logo's visible left edge. */
  left: -7px;
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  gap: 0;
  min-width: 220px;
  background: #ff4d8d;
  border-radius: 18px;
  padding: 14px 20px;
  box-shadow: 0 20px 44px rgba(108, 24, 65, 0.26);
  transform-origin: top left;
  /* springy "pon" when it opens (restarts each time it becomes visible) */
  animation: menu-pop 0.18s cubic-bezier(0.34, 1.56, 0.64, 1);
}

@keyframes menu-pop {
  from {
    opacity: 0;
    transform: scale(0.6) translateY(-8px);
  }
  to {
    opacity: 1;
    transform: scale(1) translateY(0);
  }
}

/* Closing: the script adds .is-closing, waits this long, then hides the menu
   (CLOSE_MS in index.html must match the duration). */
.landing-menu.is-closing {
  animation: menu-out 0.1s cubic-bezier(0.4, 0, 1, 1) forwards;
  pointer-events: none;
}

/* "Shun": pulled back toward the logo (top-left origin) and fully transparent
   by the time it has only shrunk to 0.8. */
@keyframes menu-out {
  from {
    opacity: 1;
    transform: scale(1) translate(0, 0);
  }
  to {
    opacity: 0;
    transform: scale(0.8) translate(-6px, -8px);
  }
}

.landing-menu a {
  padding: 6px 2px;
  color: var(--text);
  font-size: 16px;
  font-weight: 700;
  letter-spacing: 0.01em;
  text-decoration: none;
  white-space: nowrap;
  transition: color 0.14s ease;
}

.landing-menu a:hover,
.landing-menu a:focus-visible {
  color: #fff;
}

.landing-menu a:focus-visible {
  outline: 2px solid var(--text);
  outline-offset: 3px;
}

.landing-stage {
  position: relative;
  z-index: 1;
  flex: 1;
  min-height: 0;
  width: 100%;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: clamp(16px, 4vh, 28px);
}

.phone-frame {
  position: relative;
  height: clamp(360px, 70vh, 650px);
  aspect-ratio: 9 / 19.5;
  width: auto;
  max-width: 84vw;
  border-radius: 42px;
  overflow: visible;
  background: transparent;
  perspective: 2100px;
  cursor: pointer;
  /* JS drives `transform` (scale + tilt) on pointer move. A short transform
     transition smooths the very first move so the tilt doesn't pop in; it's
     lengthened via .is-resetting when the pointer leaves. */
  transition: transform 0.15s ease-out;
  will-change: transform;
}

.phone-frame.is-resetting {
  transition: transform 0.4s ease;
}

.phone-flipper {
  position: relative;
  width: 100%;
  height: 100%;
  transform-style: preserve-3d;
}

.phone-face {
  position: absolute;
  inset: 0;
  overflow: hidden;
  border: 6px solid #fff;
  border-radius: 42px;
  box-shadow: 0 24px 60px rgba(var(--shadow-warm), 0.28);
  opacity: 0;
  backface-visibility: hidden;
  -webkit-backface-visibility: hidden;
  transform: rotateY(180deg);
  transition:
    transform 0.64s cubic-bezier(0.22, 0.74, 0.22, 1),
    opacity 0.18s ease;
  will-change: transform;
}

/* Once a face is fully hidden, reset it to the back without animating an
   invisible -180deg to +180deg turn. Becoming active restores the rule above. */
.phone-face:not(.is-active):not(.is-exiting) {
  transition: none;
}

.phone-face.is-active {
  z-index: 2;
  opacity: 1;
  transform: rotateY(0deg);
}

.phone-face.is-exiting {
  z-index: 1;
  opacity: 0;
  transform: rotateY(-180deg);
}

.app-screen {
  display: block;
  width: 100%;
  height: 100%;
  object-fit: cover;
  object-position: top center;
}

.detail-layer,
.detail-texture-loop {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  pointer-events: none;
}

.detail-layer {
  display: block;
  object-fit: cover;
  object-position: top center;
}

.detail-call-base {
  z-index: 0;
}

.detail-texture-loop {
  z-index: 1;
  overflow: hidden;
}

.detail-texture-track {
  position: relative;
  left: -20%;
  width: 140%;
  line-height: 0;
  animation: detail-texture-scroll 12s linear infinite paused;
  will-change: transform;
}

.detail-texture-track img {
  display: block;
  width: 100%;
  height: auto;
}

.phone-face.is-active .detail-texture-track {
  animation-play-state: running;
}

.detail-call-ui {
  z-index: 2;
}

@keyframes detail-texture-scroll {
  from {
    transform: translateY(0);
  }
  to {
    transform: translateY(-33.333333%);
  }
}

.detail-users {
  position: absolute;
  top: 40.6%;
  left: 50%;
  z-index: 3;
  width: 72.27%;
  display: grid;
  grid-template-columns: repeat(2, 48.43%);
  column-gap: 0.25%;
  row-gap: 11.32%;
  justify-content: center;
  transform: translateX(-50%);
  container-type: inline-size;
  pointer-events: none;
}

.detail-participant {
  width: 100%;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 2.77cqw;
}

.detail-avatar-shell {
  position: relative;
  display: block;
  width: 27.67cqw;
  height: 27.67cqw;
}

.detail-avatar-clip {
  position: relative;
  z-index: 2;
  display: block;
  width: 100%;
  height: 100%;
  border-radius: 30%;
  overflow: hidden;
}

.detail-avatar-clip img {
  display: block;
  width: 100%;
  height: 100%;
  object-fit: cover;
  object-position: center;
  transform: scale(1.025);
  transform-origin: center;
}

.is-speaking .detail-avatar-clip {
  transform-origin: center;
  animation: detail-speaker-bounce 1.62s ease-in-out infinite;
}

.is-speaking--offset .detail-avatar-clip {
  animation-delay: 0.58s;
}

.is-speaking--occasional .detail-avatar-clip {
  animation-name: detail-speaker-bounce-occasional;
  animation-duration: 8s;
  animation-delay: 2.35s;
}

.detail-user-name {
  position: relative;
  z-index: 3;
  color: #18181b;
  font-size: 4.5cqw;
  font-weight: 700;
  line-height: 1.2;
  text-align: center;
  white-space: nowrap;
  text-shadow: 0 1.1px 2.2px rgba(0, 0, 0, 0.05);
}

.detail-speaking-pulse {
  position: absolute;
  inset: 4%;
  z-index: 1;
  border: none;
  border-radius: 30%;
  background: rgba(255, 247, 251, 0.6);
  opacity: 0;
  transform: scale(0.54);
  transform-origin: center;
  animation: detail-speaking-pulse 1.62s cubic-bezier(0.18, 0.62, 0.3, 1) infinite;
}

.detail-speaking-pulse--2 {
  animation-delay: 0.38s;
}

.detail-speaking-pulse--3 {
  animation-delay: 0.76s;
}

.is-speaking--offset .detail-speaking-pulse--1 {
  animation-delay: 0.58s;
}

.is-speaking--offset .detail-speaking-pulse--2 {
  animation-delay: 0.96s;
}

.is-speaking--offset .detail-speaking-pulse--3 {
  animation-delay: 1.34s;
}

.is-speaking--occasional .detail-speaking-pulse {
  animation-name: detail-speaking-pulse-occasional;
  animation-duration: 8s;
}

.is-speaking--occasional .detail-speaking-pulse--1 {
  animation-delay: 2.35s;
}

.is-speaking--occasional .detail-speaking-pulse--2 {
  animation-delay: 2.77s;
}

.is-speaking--occasional .detail-speaking-pulse--3 {
  animation-delay: 3.19s;
}

.phone-face:not(.is-active) .detail-speaking-pulse,
.phone-face:not(.is-active) .is-speaking .detail-avatar-clip {
  animation-play-state: paused;
}

@keyframes detail-speaker-bounce {
  0%, 12%, 23.5%, 35.5%, 46.9%, 58.9%, 100% {
    transform: scale(1);
  }
  6%, 29.5%, 52.9% {
    transform: scale(1.03);
  }
}

@keyframes detail-speaker-bounce-occasional {
  0%, 4%, 5.25%, 9.25%, 10.5%, 14.5%, 100% {
    transform: scale(1);
  }
  2%, 7.25%, 12.5% {
    transform: scale(1.03);
  }
}

@keyframes detail-speaking-pulse {
  0% {
    opacity: 0;
    transform: scale(0.54);
  }
  12% {
    opacity: 0.72;
  }
  48% {
    opacity: 0.46;
  }
  82% {
    opacity: 0;
    transform: scale(1.72);
  }
  100% {
    opacity: 0;
    transform: scale(1.72);
  }
}

@keyframes detail-speaking-pulse-occasional {
  0%, 100% {
    opacity: 0;
    transform: scale(0.54);
  }
  2% {
    opacity: 0.72;
  }
  8% {
    opacity: 0.46;
  }
  17% {
    opacity: 0;
    transform: scale(1.72);
  }
  17.01% {
    opacity: 0;
    transform: scale(0.54);
  }
}

.phone-bg {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
}

.phone-inner {
  position: relative;
  height: 100%;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: 14px;
  padding: 24px;
  text-align: center;
}

.phone-character.logo-swap {
  width: 46%;
  height: auto;
}

.phone-character .logo-swap-base {
  display: block;
  width: 100%;
  height: auto;
}

/* Both artworks are 320x320 with the same pose/framing, so the hover image
   simply fills the same box as the base. */
.phone-character .logo-swap-hover {
  width: 100%;
  height: 100%;
  object-position: center;
}

/* Simple expression swap on hover: the smile fades in ON TOP of the base
   pose, which stays fully opaque underneath. Fading both at once made the
   middle of the crossfade see-through (both at ~50%), which showed up as a
   brief white flicker. Both artworks share the same canvas and pose, so no
   corrective scale is needed here (unlike the logo swap). */
.phone-frame:hover .phone-character .logo-swap-hover {
  opacity: 1;
}

.phone-logo.logo-swap {
  width: 64%;
  height: auto;
}

.phone-logo .logo-swap-base {
  display: block;
  width: 100%;
  height: auto;
}

.phone-logo .logo-swap-hover {
  width: 100%;
  height: 100%;
}

.phone-tagline {
  margin: -4px 0 0;
  font-size: 13px;
  font-weight: 700;
  color: var(--text);
  line-height: 1.6;
}

.phone-flip-cta {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 8px;
  min-height: 44px;
  margin-top: 6px;
  padding: 10px 18px;
  border-radius: 999px;
  background: var(--text);
  color: #fff;
  font-size: 14px;
  font-weight: 700;
  line-height: 1;
  box-shadow: 0 8px 18px rgba(24, 24, 27, 0.2);
  transform-origin: center;
  transition: transform 0.14s ease-out;
}

.phone-frame:hover .phone-flip-cta,
.phone-frame:focus-visible .phone-flip-cta {
  transform: scale(1.04);
}

/* The phone stays centered on the page (the reference point); the QR column
   hangs off its right side, vertically centered on the phone. It lives outside
   the phone element so the phone's tilt/scale doesn't move it. */
.phone-wrap {
  position: relative;
}

.store-group {
  position: absolute;
  right: calc(100% + 56px);
  top: 50%;
  display: flex;
  align-items: center;
  justify-content: center;
  transform: translateY(-50%);
}

/* Only the QR card is in flow here, so it sits at the phone's vertical center.
   The icon + name chip is absolutely placed above it. */
.qr-group {
  position: absolute;
  left: calc(100% + 56px);
  top: 50%;
  transform: translateY(-50%);
}

.phone-qr {
  padding: 10px;
  background: #fff;
  border-radius: 16px;
  box-shadow: 0 10px 24px rgba(var(--shadow-warm), 0.28);
}

.phone-qr img {
  display: block;
  width: clamp(88px, 16vh, 128px);
  height: auto;
}

/* Icon + service name chip, sitting above the QR card with a small gap. */
.app-card {
  position: absolute;
  bottom: calc(100% + 14px);
  left: 50%;
  transform: translateX(-50%);
  white-space: nowrap;
  z-index: 1;
  display: flex;
  flex-direction: row;
  align-items: center;
  justify-content: center;
  gap: 10px;
}

.app-icon {
  display: flex;
  flex-shrink: 0;
  align-items: center;
  justify-content: center;
  width: 48px;
  height: 48px;
  border-radius: 14px;
  background: #fff7ec;
  overflow: hidden;
}

.app-icon img {
  width: 100%;
  height: 100%;
  object-fit: cover;
}

.app-card-text {
  margin: 0;
  font-size: 16px;
  font-weight: 700;
  line-height: 1.2;
  white-space: nowrap;
  text-align: center;
}

.store-badge {
  flex-shrink: 0;
  height: 56px;
  width: auto;
}

/* The QR column sits outside the phone, so drop it on narrow screens (mobile
   layout is handled separately later). */
@media (max-width: 760px) {
  .phone-wrap {
    display: flex;
    flex-direction: column;
    align-items: center;
  }

  .phone-frame {
    order: 1;
    height: min(62vh, max(0px, calc(100vh - 210px)), 560px);
    height: min(62vh, max(0px, calc(100dvh - 210px)), 560px);
  }

  .store-group {
    position: static;
    order: 2;
    display: flex;
    margin-top: 18px;
    transform: none;
  }

  .store-badge {
    height: 59px;
  }

  .qr-group {
    display: none;
  }

  .phone-frame:hover .phone-logo .logo-swap-base {
    opacity: 1;
    transform: scale(1) rotate(0deg);
    transition: none;
  }

  .phone-frame:hover .phone-logo .logo-swap-hover {
    opacity: 0;
    transform: scale(1) rotate(0deg);
    filter: none;
    animation: none;
    transition: none;
  }

  .phone-frame:hover .phone-flip-cta,
  .phone-frame:focus-visible .phone-flip-cta {
    transform: none;
    transition: none;
  }
}

.landing-footer {
  position: relative;
  z-index: 2;
  flex-shrink: 0;
  width: 100%;
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 16px;
  flex-wrap: wrap;
  padding-top: 16px;
  font-size: 12px;
  color: var(--muted);
}

.landing-footer-links {
  display: flex;
  gap: 20px;
  flex-wrap: wrap;
}

.landing-footer a {
  color: var(--muted);
  text-decoration: none;
}

.landing-footer a:hover {
  color: var(--accent);
}

@media (max-height: 640px) {
  body.landing-page {
    overflow-y: auto;
  }
}

@media (prefers-reduced-motion: reduce) {
  .logo-swap-base,
  .logo-swap-hover,
  .landing-wordmark:hover .logo-swap-hover,
  .landing-wordmark.is-menu-active .logo-swap-hover,
  .phone-frame:hover .phone-logo .logo-swap-hover {
    animation: none;
    transition: none;
  }

  .phone-frame {
    transition: none;
    will-change: auto;
  }

  .phone-flip-cta {
    transition: none;
  }

  .detail-speaking-pulse,
  .is-speaking .detail-avatar-clip {
    animation: none;
  }

  .detail-texture-track {
    animation: none;
    transform: translateY(0);
  }

  .detail-speaking-pulse {
    opacity: 0;
  }

  .decor-corner,
  .decor-corner::before,
  .decor-peek,
  .decor-peek::before,
  .decor-texture-copy {
    transition: none;
  }

  .decor-corner,
  .decor-peek {
    --corner-scale: 1 !important;
    --corner-saturation: 1 !important;
    --corner-brightness: 1 !important;
    --corner-gradient: 0 !important;
    --corner-noise: 0 !important;
  }

  .phone-face {
    transition: none;
    will-change: auto;
  }
}

table {
  width: 100%;
  border-collapse: collapse;
  margin: 16px 0;
  font-size: 14px;
}

th, td {
  border: 1px solid var(--border);
  padding: 8px 12px;
  text-align: left;
  vertical-align: top;
}

th {
  background: var(--bg-soft);
}

ul, ol {
  padding-left: 22px;
}

li {
  margin-bottom: 6px;
}

hr {
  border: none;
  border-top: 1px solid var(--border);
  margin: 40px 0;
}

.site-footer {
  border-top: 1px solid var(--border);
}

.site-footer-inner {
  max-width: 720px;
  margin: 0 auto;
  padding: 24px;
  display: flex;
  flex-wrap: wrap;
  gap: 12px 20px;
  align-items: center;
  justify-content: space-between;
  color: var(--muted);
  font-size: 13px;
}

.footer-links {
  list-style: none;
  display: flex;
  gap: 16px;
  flex-wrap: wrap;
  margin: 0;
  padding: 0;
}

.footer-links a {
  color: var(--muted);
  text-decoration: none;
}

.footer-links a:hover {
  color: var(--accent);
}

@media (max-width: 560px) {
  h1 {
    font-size: 26px;
  }
}
