/* ===================================================================
   נתן נתי קדר — מילים. קול. עריכה.
   Base: direction B1 (dark & bold, clean waveform + yellow playhead)
   Restrained with B2: deeper black, hairline borders, less glow.

   Structure of this file:
     01. Tokens & reset
     02. Layout helpers (container, section, headings)
     03. Buttons
     04. Header
     05. Hero + waveform
     06. Services (4 cards)
     07. Flow (1 episode -> content package)
     08. Portfolio (rendered by js/main.js)
     09. Audio player (shared: portfolio / before-after / narration)
     10. Before / After
     11. Narration
     12. About + experience
     13. Book
     14. Contact
     15. Footer + floating WhatsApp
     16. Focus, motion, responsive
   =================================================================== */

/* ============ 01. TOKENS & RESET ============ */
:root {
  /* brand */
  --purple: #7900FF;
  --purple-soft: #9B4DFF;
  --purple-glow: #B98BFF;
  /* Light end of the .btn-primary gradient only. --purple-soft (#9B4DFF) is
     4.29:1 against white — under AA. #8A33F5 is 5.42:1. Kept as its own token
     so --purple-soft stays untouched for borders / glows / accent-color, where
     it is decorative and no contrast threshold applies. */
  --purple-btn: #8A33F5;
  --yellow: #FFD800;
  /* WhatsApp brand green is kept as-is; the buttons that use it now carry
     --ink text/icons instead of white. White was 1.98:1 on #25D366 (fails AA
     and fails 1.4.11 for the icon); --ink is 10.1:1 on #25D366 and 4.65:1 on
     #128C4B, so the whole gradient passes. */
  --wa: #25D366;
  --wa-deep: #128C4B;

  /* surfaces — deeper floor borrowed from B2 */
  --ink: #08080B;
  --ink-2: #0C0C11;
  --card: #101017;
  --card-2: #15151C;

  /* hairline borders (B2) rather than B1's heavier lines */
  --line: rgba(255, 255, 255, 0.07);
  --line-strong: rgba(255, 255, 255, 0.13);

  /* type */
  --text: #F4F3F8;
  --muted: #A9A8B7;
  --muted-2: #8E8DA3; /* passes AA on --ink and --card */

  --radius: 20px;
  --radius-sm: 14px;
  --maxw: 1120px;
  --ease: cubic-bezier(.22, .61, .36, 1);

  /* hero playhead position, measured from the physical left edge.
     In RTL the "played" part is everything to the RIGHT of it. */
  --play: 62%;

  /* טבעת פוקוס — צהוב על כהה. במצב בהיר מוחלפת לסגול, ובתוך משטחי המדיה
     הכהים מוצהרת מחדש צהובה (ראו סעיף 17). */
  --focus-ring: rgba(255, 216, 0, 0.55);

  color-scheme: dark;
}

*,
*::before,
*::after { box-sizing: border-box; }

/* Both html AND body need overflow-x: clip.
   An overflow value on <body> alone is propagated to the viewport and <body>
   itself is then treated as visible — so the ambient glows would escape and
   create a horizontal scroll. Setting it on <html> makes the viewport use that
   value, which leaves <body>'s own clip to actually contain the glows.
   clip (not hidden) — hidden would make these scroll containers and break the
   sticky header. */
html { -webkit-text-size-adjust: 100%; overflow-x: clip; }

body {
  margin: 0;
  padding: 0;
  background: var(--ink);
  color: var(--text);
  min-height: 100vh;
  width: 100%;
  font-family: 'Heebo', 'Assistant', 'Segoe UI', system-ui, -apple-system, Arial, sans-serif;
  font-size: 17px;
  line-height: 1.62;
  font-weight: 400;
  overflow-x: clip;
  position: relative;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-rendering: optimizeLegibility;
}

/* מעבר עדין בעת החלפת ערכה. רק על אלמנטים ללא transition משלהם, כדי לא
   לדרוס מעברי hover קיימים (כפתורים/כרטיסים מנהלים את המעבר בעצמם). */
body,
.site-header,
.band,
.wave-shell,
.thumb,
.wave-panel,
.exp-card,
.book-band,
.contact-card {
  transition: background-color .22s var(--ease), color .22s var(--ease), border-color .22s var(--ease);
}

h1, h2, h3, h4 { margin: 0; letter-spacing: -.02em; text-wrap: balance; }
p { margin: 0; }
a { color: inherit; text-decoration: none; }
img, svg, iframe { max-width: 100%; }
ul { margin: 0; padding: 0; list-style: none; }

.sr-only {
  position: absolute;
  width: 1px; height: 1px;
  padding: 0; margin: -1px;
  overflow: hidden;
  clip: rect(0, 0, 0, 0);
  white-space: nowrap;
  border: 0;
}

/* Skip link — .sr-only until focused, then a real visible control.
   Specificity (0,2,0) beats .sr-only (0,1,0), so every clipping property
   has to be undone explicitly here. */
.skip-link:focus {
  position: fixed;
  inset-block-start: .6rem;
  inset-inline-start: .6rem;
  width: auto; height: auto;
  margin: 0;
  padding: .75rem 1.15rem;
  overflow: visible;
  clip: auto;
  clip-path: none;
  z-index: 100;
  background: var(--purple);
  color: #fff;
  border-radius: 10px;
  font-weight: 800;
  font-size: .95rem;
}

/* ambient glows — B1's idea, dialled back toward B2 */
/* These scroll behind the blurred sticky header, so every frame used to force
   a re-blur of a 460-560px surface. will-change promotes each one to its own
   composited layer: the blur is rasterized once and then only re-composited.
   The radii already fade to transparent by 62-66%, so 40px of blur reads the
   same as the previous 55-65px while costing noticeably less to raster. */
.glow {
  position: absolute;
  pointer-events: none;
  z-index: 0;
  border-radius: 50%;
  will-change: transform;
}
.glow-1 {
  top: -200px; inset-inline-end: -180px;
  width: 560px; height: 560px;
  background: radial-gradient(circle, rgba(121, 0, 255, 0.26), transparent 64%);
  filter: blur(40px);
}
.glow-2 {
  top: 640px; inset-inline-start: -220px;
  width: 460px; height: 460px;
  background: radial-gradient(circle, rgba(255, 216, 0, 0.06), transparent 63%);
  filter: blur(40px);
}
.glow-3 {
  bottom: 200px; inset-inline-end: -180px;
  width: 480px; height: 480px;
  background: radial-gradient(circle, rgba(121, 0, 255, 0.15), transparent 66%);
  filter: blur(40px);
}

/* ============ 02. LAYOUT HELPERS ============ */
.container {
  position: relative;
  z-index: 1;
  width: 100%;
  max-width: var(--maxw);
  margin-inline: auto;
  padding-inline: clamp(1.15rem, 5vw, 2.25rem);
}

section {
  position: relative;
  z-index: 1;
  padding-block: clamp(3.4rem, 8vw, 6rem);
}

/* offsets for the sticky header when jumping to an anchor */
[id] { scroll-margin-top: 82px; }

.band {
  background: linear-gradient(180deg, var(--ink-2), var(--ink));
  border-top: 1px solid var(--line);
  border-bottom: 1px solid var(--line);
}

.kicker {
  display: inline-flex;
  align-items: center;
  gap: .55rem;
  font-size: .78rem;
  font-weight: 800;
  letter-spacing: .09em;
  color: var(--purple-glow);
  text-transform: uppercase;
}
.kicker::before {
  content: "";
  width: 20px; height: 2px;
  border-radius: 2px;
  background: var(--purple-soft);
  flex: none;
}

.eyebrow {
  display: inline-flex;
  align-items: center;
  gap: .5rem;
  font-size: .78rem;
  font-weight: 800;
  letter-spacing: .02em;
  color: var(--yellow);
  background: rgba(255, 216, 0, 0.06);
  border: 1px solid rgba(255, 216, 0, 0.18);
  padding: .38rem .8rem;
  border-radius: 999px;
}
.eyebrow .pulse {
  width: 6px; height: 6px;
  border-radius: 50%;
  background: var(--yellow);
  box-shadow: 0 0 9px var(--yellow);
  flex: none;
}

.section-head { max-width: 640px; margin-bottom: clamp(2rem, 4.5vw, 3.2rem); }
.section-head h2 {
  font-size: clamp(1.8rem, 5.2vw, 2.75rem);
  font-weight: 900;
  line-height: 1.1;
  margin-top: .85rem;
}
.section-head h2 .hl { color: var(--yellow); }
.section-head p {
  margin-top: .9rem;
  color: var(--muted);
  font-size: 1.05rem;
}

/* ============ 03. BUTTONS ============ */
.btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: .55rem;
  padding: .95rem 1.7rem;
  border-radius: 13px;
  font-family: inherit;
  font-weight: 800;
  font-size: 1rem;
  line-height: 1;
  border: 1.5px solid transparent;
  cursor: pointer;
  white-space: nowrap;
  transition: transform .22s var(--ease), box-shadow .22s var(--ease),
              background .2s var(--ease), color .2s var(--ease), border-color .2s var(--ease);
}
.btn svg { width: 18px; height: 18px; flex: none; }

.btn-primary {
  background: linear-gradient(135deg, var(--purple), var(--purple-btn));
  color: #fff;
  box-shadow: 0 12px 32px -12px rgba(121, 0, 255, 0.8);
}
.btn-primary:hover {
  transform: translateY(-3px);
  box-shadow: 0 18px 42px -12px rgba(121, 0, 255, 0.9);
}

.btn-ghost {
  background: rgba(255, 255, 255, 0.035);
  color: var(--text);
  border-color: var(--line-strong);
}
.btn-ghost:hover {
  transform: translateY(-3px);
  border-color: rgba(255, 216, 0, 0.45);
  background: rgba(255, 216, 0, 0.05);
  color: var(--yellow);
}

.btn-wa {
  background: linear-gradient(135deg, var(--wa), var(--wa-deep));
  color: var(--ink); /* see --wa in :root — white fails AA on this gradient */
  box-shadow: 0 14px 34px -12px rgba(37, 211, 102, 0.7);
}
.btn-wa:hover { transform: translateY(-3px); box-shadow: 0 20px 44px -12px rgba(37, 211, 102, 0.85); }

/* ============ 04. HEADER ============ */
.site-header {
  position: sticky;
  top: 0;
  z-index: 40;
  border-bottom: 1px solid var(--line);
  background: rgba(8, 8, 11, 0.74);
  backdrop-filter: blur(14px) saturate(1.3);
  -webkit-backdrop-filter: blur(14px) saturate(1.3);
}
.header-inner {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: .75rem;
  padding-block: .9rem;
}
.brand {
  display: inline-flex;
  align-items: center;
  gap: .65rem;
  font-weight: 800;
  font-size: 1.05rem;
  letter-spacing: -.01em;
  min-width: 0;
  min-height: 44px; /* WCAG 2.5.8 target size — content stays centred */
}
.brand .mark {
  width: 36px; height: 36px;
  border-radius: 11px;
  background: linear-gradient(135deg, var(--purple), var(--purple-soft));
  display: inline-flex;
  align-items: center;
  justify-content: center;
  flex: none;
  box-shadow: 0 0 18px rgba(121, 0, 255, 0.35);
}
.brand .mark svg { width: 19px; height: 19px; display: block; color: #fff; }

.header-link {
  font-weight: 700;
  font-size: .92rem;
  color: var(--muted);
  display: inline-flex;
  align-items: center;
  gap: .45rem;
  padding: .45rem .7rem;
  min-height: 44px; /* WCAG 2.5.8 — the pill just grows, nothing shifts */
  border: 1px solid var(--line);
  border-radius: 999px;
  white-space: nowrap;
  flex: none;
  transition: color .2s var(--ease), border-color .2s var(--ease), background .2s var(--ease);
}
.header-link:hover {
  color: var(--yellow);
  border-color: rgba(255, 216, 0, 0.4);
  background: rgba(255, 216, 0, 0.05);
}
.header-link svg { width: 16px; height: 16px; flex: none; }

/* קבוצת הפעולות בקצה ה-header: מתג הערכה + קישור הוואטסאפ, צמודים זה לזה */
.header-actions {
  display: inline-flex;
  align-items: center;
  gap: .5rem;
  flex: none;
}

/* מתג שמש/ירח נשלף. שני האייקונים גלויים תמיד; הכדור הסגול מחליק לצד הפעיל
   ומאיר את האייקון שמתחתיו. ההחלפה מנוהלת ע"י data-theme על ה-html (main.js),
   וה-CSS מזיז את הכדור. יעד מגע 58×32 (עובר WCAG 2.5.8 AA). */
.theme-toggle {
  position: relative;
  width: 58px; height: 32px;
  flex: none;
  padding: 0;
  border: 1px solid var(--line);
  border-radius: 999px;
  background: rgba(255, 255, 255, 0.05);
  cursor: pointer;
  transition: border-color .2s var(--ease), background .2s var(--ease);
}
.theme-toggle:hover { border-color: rgba(255, 216, 0, 0.4); }
.theme-toggle:focus-visible { outline: 2px solid var(--yellow); outline-offset: 3px; }
.theme-toggle .ts-knob {
  position: absolute; top: 3px; left: 3px; z-index: 0;
  width: 24px; height: 24px; border-radius: 50%;
  background: var(--purple);
  transform: translateX(28px); /* כהה (ברירת מחדל) → כדור בצד הירח */
  transition: transform .3s cubic-bezier(.34, 1.4, .5, 1);
}
.theme-toggle .ic-sun,
.theme-toggle .ic-moon {
  position: absolute; top: 8px; z-index: 1;
  width: 16px; height: 16px; display: block;
  transition: color .2s var(--ease);
}
.theme-toggle .ic-sun  { left: 8px;  color: var(--muted); } /* כהה → שמש עמומה */
.theme-toggle .ic-moon { right: 8px; color: #fff; }        /* כהה → ירח מואר */
/* בהיר → כדור מחליק לשמש; השמש מוארת, הירח עמום */
[data-theme="light"] .theme-toggle { background: rgba(0, 0, 0, 0.04); }
[data-theme="light"] .theme-toggle .ts-knob { transform: translateX(0); }
[data-theme="light"] .theme-toggle .ic-sun  { color: #fff; }
[data-theme="light"] .theme-toggle .ic-moon { color: var(--muted); }
@media (prefers-reduced-motion: reduce) { .theme-toggle .ts-knob { transition: none; } }

/* ============ 05. HERO ============ */
.hero { padding-block: clamp(2.6rem, 6vw, 4.4rem) clamp(2.2rem, 5vw, 3.4rem); }
.hero-inner { max-width: 900px; }

.hero-title {
  font-size: clamp(3rem, 13.5vw, 6.4rem);
  font-weight: 900;
  line-height: .96;
  letter-spacing: -.04em;
  margin-top: 1.35rem;
}
.hero-title span { display: block; }
/* background-clip: text paints the gradient only inside this span's padding
   box. With line-height .96 that box ends above the descender of ק / ן / ך /
   ף / ץ, so the tail of «קול.» was being sliced off. The padding grows the
   paint area; the negative margin cancels it again, so the layout — and the
   line-height .96 look — is byte-for-byte what it was. */
.hero-title .l2 {
  background: linear-gradient(100deg, var(--purple-glow), var(--yellow));
  -webkit-background-clip: text;
  background-clip: text;
  -webkit-text-fill-color: transparent;
  color: transparent;
  padding-block-end: .12em;
  margin-block-end: -.12em;
}
.hero-sub {
  font-size: clamp(1.25rem, 3.6vw, 1.8rem);
  font-weight: 700;
  color: var(--text);
  margin-top: 1.4rem;
  max-width: 620px;
  line-height: 1.32;
}
.hero-lede {
  font-size: clamp(1rem, 2.6vw, 1.1rem);
  color: var(--muted);
  margin-top: 1rem;
  max-width: 560px;
}
.hero-cta {
  display: flex;
  flex-wrap: wrap;
  gap: .8rem;
  margin-top: 2.1rem;
}

/* "זמין עכשיו" — a small studio-style availability pill with a live pulsing
   dot. Sits between the lede and the CTA; reinforces "an open studio, now". */
.availability {
  display: inline-flex;
  align-items: center;
  gap: .55rem;
  margin-top: 1.5rem;
  padding: .42em .95em;
  font-size: .82rem;
  font-weight: 700;
  color: var(--muted);
  background: rgba(255, 255, 255, 0.03);
  border: 1px solid var(--line);
  border-radius: 999px;
}
.live-dot {
  flex: none;
  width: 8px; height: 8px;
  border-radius: 50%;
  background: #3ddc84;
  box-shadow: 0 0 0 0 rgba(61, 220, 132, 0.55);
  animation: livePulse 2.2s ease-out infinite;
}
@keyframes livePulse {
  0%   { box-shadow: 0 0 0 0 rgba(61, 220, 132, 0.5); }
  70%  { box-shadow: 0 0 0 7px rgba(61, 220, 132, 0); }
  100% { box-shadow: 0 0 0 0 rgba(61, 220, 132, 0); }
}

/* ---- hero waveform + yellow playhead ----
   Embedded / borderless: the bars sit directly on the hero background, no card,
   no ruler — a cleaner, more integrated look than a framed "player" box. */
.wave-shell {
  position: relative;
  margin-top: clamp(2.2rem, 6vw, 3.2rem);
}
.wave-meta {
  position: relative;
  z-index: 2;
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: .75rem;
  margin-bottom: .85rem;
  font-size: .74rem;
  font-weight: 700;
  letter-spacing: .04em;
  color: var(--muted-2);
}
.wave-meta .wm-left {
  display: inline-flex;
  align-items: center;
  gap: .5rem;
  min-width: 0;
}
.wave-meta .wm-dot {
  width: 7px; height: 7px;
  border-radius: 50%;
  background: var(--yellow);
  box-shadow: 0 0 9px rgba(255, 216, 0, 0.7);
  flex: none;
}
.wave-meta .wm-name {
  color: var(--muted);
  font-weight: 800;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.wave-meta .wm-time {
  font-variant-numeric: tabular-nums;
  letter-spacing: .06em;
  flex: none;
}

.hero-wave {
  position: relative;
  z-index: 2;
  height: clamp(62px, 12vw, 98px);
  pointer-events: none; /* דקורטיבי — לא לחיץ, גם לא משנה סמן בריחוף */
}
/* ההתמזגות חלה על הברים בלבד (לא על המכולה) — כך הקצוות "נמסים" לרקע,
   אבל המרקר הצהוב חופשי להתארך מעל ומתחת בלי שהמסכה תחתוך אותו. */
.hero-wave .wave-svg {
  position: absolute;
  inset: 0;
  width: 100%; height: 100%;
  display: block;
  -webkit-mask-image: linear-gradient(90deg, transparent 0%, #000 11%, #000 89%, transparent 100%);
  mask-image: linear-gradient(90deg, transparent 0%, #000 11%, #000 89%, transparent 100%);
}
/* un-played (dim) */
.hero-wave .wave-base { color: rgba(155, 77, 255, 0.26); }
/* played (bright) — in RTL playback runs right -> left, so everything
   to the RIGHT of the playhead is already played.
   clip-path inset() is physical: inset(top right bottom left). */
.hero-wave .wave-played {
  color: var(--purple-glow);
  clip-path: inset(0 0 0 var(--play));
  filter: drop-shadow(0 0 6px rgba(155, 77, 255, 0.4));
}
/* מרקר צהוב — עכשיו מבטא עיצובי בלבד (לא סמן נגן): קו דק ועדין בתוך גבולות
   הגל, בלי הכפתור/גראבר שהזמין ללחיצה. */
.hero-wave .playhead {
  position: absolute;
  top: 0; bottom: 0;
  left: var(--play);
  width: 2px;
  background: rgba(255, 216, 0, 0.7);
  border-radius: 2px;
  box-shadow: 0 0 10px rgba(255, 216, 0, 0.35);
  z-index: 3;
}
.wave-ruler {
  position: relative;
  z-index: 2;
  margin-top: .95rem;
  height: 9px;
  border-top: 1px solid var(--line);
  background-image: repeating-linear-gradient(to left, var(--line-strong) 0 1px, transparent 1px 44px);
  background-repeat: no-repeat;
  background-size: 100% 5px;
  background-position: top right;
  opacity: .75;
}

/* ============ 06. SERVICES ============ */
/* NOTE: every fr track below is minmax(0, 1fr), never plain 1fr — plain 1fr
   has an automatic min-content floor, which lets long Hebrew strings blow
   the track past its container instead of wrapping. */
.services-grid {
  display: grid;
  grid-template-columns: minmax(0, 1fr);
  gap: clamp(.9rem, 2vw, 1.25rem);
}
.service-card {
  position: relative;
  background: linear-gradient(180deg, var(--card), var(--card-2));
  border: 1px solid var(--line);
  border-radius: var(--radius);
  padding: 1.7rem 1.5rem;
  display: flex;
  flex-direction: column;
  gap: .8rem;
  transition: transform .25s var(--ease), border-color .25s var(--ease), box-shadow .25s var(--ease);
}
.service-card:hover {
  transform: translateY(-5px);
  border-color: rgba(155, 77, 255, 0.35);
  box-shadow: 0 20px 44px -20px rgba(0, 0, 0, 0.9);
}
.service-card.core { border-color: rgba(121, 0, 255, 0.2); }
.service-ico {
  width: 52px; height: 52px;
  border-radius: 15px;
  background: rgba(121, 0, 255, 0.14);
  border: 1px solid rgba(155, 77, 255, 0.18);
  display: flex;
  align-items: center;
  justify-content: center;
  font-size: 1.6rem;
  line-height: 1;
  flex: none;
}
.service-card.solo .service-ico {
  background: rgba(255, 216, 0, 0.1);
  border-color: rgba(255, 216, 0, 0.2);
}
.service-card h3 {
  font-size: 1.2rem;
  font-weight: 800;
  display: flex;
  align-items: center;
  gap: .5rem;
  flex-wrap: wrap;
}
.service-card p { color: var(--muted); font-size: .98rem; line-height: 1.6; }

.tag {
  font-size: .66rem;
  font-weight: 900;
  letter-spacing: .05em;
  padding: .25em .65em;
  border-radius: 999px;
  line-height: 1;
  white-space: nowrap;
}
/* טקסט כהה מקובע (ולא var(--ink), שמתהפך לבהיר בערכה הבהירה) — כך שנשאר
   כהה-על-צהוב בשתי הערכות. אותו דפוס כמו .btn-wa / .wa-float. */
.tag-core { background: var(--yellow); color: #08080B; }
.tag-solo {
  background: rgba(255, 255, 255, 0.06);
  color: var(--muted);
  border: 1px solid var(--line-strong);
}

/* ============ 07. FLOW ============ */
.flow {
  display: grid;
  grid-template-columns: minmax(0, 1fr);
  gap: 1.2rem;
  align-items: center;
}
.flow-source {
  background: linear-gradient(135deg, var(--purple), #46009a);
  border-radius: var(--radius);
  padding: 1.8rem 1.5rem;
  display: flex;
  flex-direction: column;
  gap: .35rem;
  justify-content: center;
  box-shadow: 0 0 44px -16px rgba(121, 0, 255, 0.6);
  text-align: center;
}
.flow-source .fs-ico { font-size: 2.3rem; line-height: 1.2; }
.flow-source h3 { font-size: 1.4rem; font-weight: 900; color: #fff; }
/* .92 not .8 — at .8 this resolved to ~4.42:1 against the #7900FF end of the
   card gradient, just under AA for 15.2px text. .92 lands at ~6.45:1. */
.flow-source p { color: rgba(255, 255, 255, 0.92); font-size: .95rem; }

.flow-arrow {
  display: flex;
  align-items: center;
  justify-content: center;
  color: var(--yellow);
}
/* stacked (mobile): the left-pointing arrow is rotated to point DOWN */
.flow-arrow svg { width: 34px; height: 34px; display: block; transform: rotate(-90deg); }

.flow-outputs {
  display: grid;
  grid-template-columns: minmax(0, 1fr);
  gap: .8rem;
}
.out-chip {
  background: var(--card);
  border: 1px solid var(--line);
  border-radius: var(--radius-sm);
  padding: 1.05rem 1.15rem;
  display: flex;
  align-items: center;
  gap: .8rem;
  font-weight: 800;
  font-size: 1rem;
  transition: transform .22s var(--ease), border-color .22s var(--ease), background .22s var(--ease);
}
.out-chip:hover {
  transform: translateY(-4px);
  border-color: rgba(255, 216, 0, 0.35);
  background: var(--card-2);
}
.out-chip .oc-ico { font-size: 1.45rem; line-height: 1; flex: none; }
.out-chip .oc-text { min-width: 0; }
.out-chip small {
  display: block;
  font-size: .76rem;
  font-weight: 600;
  color: var(--muted-2);
  letter-spacing: 0;
}

/* ============ 08. PORTFOLIO (rendered by js/main.js) ============ */

/* The portfolio is one section split into labelled groups — one group per
   service offered above, so each claim has its proof directly under it.
   .work-groups is the outer stack; each group carries its own .work-grid. */
/* The groups are an accordion: every heading is visible at a glance, and the
   visitor opens the one area they care about instead of scrolling past all of
   them. Opening one closes the rest. <h3><button aria-expanded aria-controls>
   is the accessible pattern — the heading stays a real heading. */
.work-groups {
  display: flex;
  flex-direction: column;
  gap: .85rem;
}
.work-group {
  border: 1px solid var(--line);
  border-radius: var(--radius);
  background: linear-gradient(180deg, var(--card), var(--card-2));
  overflow: hidden;
  transition: border-color .25s var(--ease);
}
.work-group:has(.work-group-btn[aria-expanded="true"]) { border-color: rgba(155, 77, 255, 0.32); }

.work-group-title { margin: 0; font: inherit; font-weight: 400; }
.work-group-btn {
  width: 100%;
  display: flex;
  align-items: center;
  gap: .85rem;
  padding: clamp(1rem, 2.6vw, 1.25rem) clamp(1.05rem, 3vw, 1.45rem);
  background: none;
  border: 0;
  color: inherit;
  font: inherit;
  text-align: start;
  cursor: pointer;
  transition: background .2s var(--ease);
}
.work-group-btn:hover { background: rgba(255, 255, 255, 0.035); }

/* plain CSS chevron: right+bottom borders rotated 45° point down, -135° up.
   Symmetric, so it needs no RTL handling. */
.wg-chev {
  flex: none;
  width: 9px; height: 9px;
  margin-top: -4px;
  border-right: 2px solid var(--yellow);
  border-bottom: 2px solid var(--yellow);
  transform: rotate(45deg);
  transition: transform .28s var(--ease), margin-top .28s var(--ease);
}
[aria-expanded="true"] .wg-chev { transform: rotate(-135deg); margin-top: 3px; }

.wg-text { flex: 1 1 auto; min-width: 0; }
.wg-name {
  display: block;
  font-size: clamp(1.08rem, 3vw, 1.32rem);
  font-weight: 900;
  letter-spacing: -.02em;
  color: var(--text);
}
.wg-desc {
  display: block;
  margin-top: .3rem;
  color: var(--muted);
  font-size: .92rem;
  font-weight: 400;
  line-height: 1.5;
}
.wg-count {
  flex: none;
  min-width: 27px;
  height: 27px;
  padding-inline: .45rem;
  border-radius: 999px;
  background: rgba(255, 216, 0, 0.1);
  border: 1px solid rgba(255, 216, 0, 0.3);
  color: var(--yellow);
  font-size: .78rem;
  font-weight: 800;
  display: flex;
  align-items: center;
  justify-content: center;
  font-variant-numeric: tabular-nums;
}

.work-group-panel { padding: 0 clamp(1.05rem, 3vw, 1.45rem) clamp(1.2rem, 3vw, 1.5rem); }
/* [hidden] must win over the padding rule above, or a closed panel still shows */
.work-group-panel[hidden] { display: none; }
.work-group-panel:not([hidden]) { animation: panelIn .3s var(--ease) both; }
@keyframes panelIn {
  from { opacity: 0; transform: translateY(-6px); }
  to   { opacity: 1; transform: none; }
}
@media (prefers-reduced-motion: reduce) {
  .work-group-panel:not([hidden]) { animation: none; }
}

.work-grid {
  display: grid;
  grid-template-columns: minmax(0, 1fr);
  gap: clamp(1.1rem, 2.4vw, 1.6rem);
}

/* The container ships empty and is filled by js/main.js after a fetch, so it
   used to enter the page at height 0 and shove everything below it down once
   the cards landed. Reserving roughly one group's worth of height bounds that
   shift. :empty ignores comments, and stops matching the moment the first
   group (or the .notice fallback) is appended — so the reservation releases
   itself and never leaves a gap under real content. */
.work-groups:empty { min-height: 460px; }

.work-card {
  background: var(--card);
  border: 1px solid var(--line);
  border-radius: var(--radius);
  overflow: hidden;
  display: flex;
  flex-direction: column;
  transition: transform .28s var(--ease), box-shadow .28s var(--ease), border-color .28s var(--ease);
}
.work-card:hover {
  transform: translateY(-6px);
  border-color: rgba(155, 77, 255, 0.32);
  box-shadow: 0 26px 54px -26px rgba(0, 0, 0, 0.95);
}

.thumb {
  position: relative;
  aspect-ratio: 16 / 10;
  overflow: hidden;
  display: flex;
  align-items: flex-end;
  padding: 1.1rem 1.15rem;
  border-bottom: 1px solid var(--line);
  background-size: cover;
  background-position: center;
}
/* CSS-only placeholder art — no bitmaps, nothing to fetch.
   Shared by the video thumbs and the audio wave panels. */
.thumb.g1, .wave-panel.g1 { background-color: #1b0b3a; background-image: linear-gradient(145deg, #6a17d6 0%, #2e0f63 55%, #150634 100%); }
.thumb.g2, .wave-panel.g2 { background-color: #2a0a30; background-image: linear-gradient(145deg, #8f1a7d 0%, #410e57 55%, #19062e 100%); }
.thumb.g3, .wave-panel.g3 { background-color: #101637; background-image: linear-gradient(145deg, #212c65 0%, #12183e 55%, #0a0c20 100%); }
.thumb.g4, .wave-panel.g4 { background-color: #2a1e07; background-image: linear-gradient(145deg, #9c7209 0%, #4d3105 55%, #201403 100%); }
.thumb::after {
  content: "";
  position: absolute;
  inset: 0;
  background: linear-gradient(180deg, transparent 42%, rgba(6, 6, 10, 0.75));
  z-index: 1;
}
/* Real project thumbnail, injected by js/main.js when the JSON supplies one.
   An <img> rather than a background-image so it can actually be lazy-loaded.
   It sits at z-index 0 and is injected as the first child, so .thumb-wave
   (also z-index 0, later in the DOM) still paints over it and the .g1-.g4
   gradient stays behind it as the fallback while it loads / if it 404s. */
.thumb-img {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
  z-index: 0;
}

.thumb-wave {
  position: absolute;
  inset-inline: 0;
  bottom: 0;
  height: 60%;
  opacity: .34;
  color: rgba(255, 255, 255, 0.5);
  z-index: 0;
}
.thumb.g4 .thumb-wave { color: rgba(255, 216, 0, 0.5); }
.thumb.g3 .thumb-wave { color: rgba(160, 180, 255, 0.45); }
.thumb-wave svg { width: 100%; height: 100%; display: block; }

/* the audio cards carry the same chip inside .wave-panel, not .thumb —
   both need it, so both are named here */
.thumb .cat,
.wave-panel .cat {
  position: absolute;
  top: 12px;
  inset-inline-end: 12px;
  z-index: 3;
  /* was rgba(8,8,11,.6) + backdrop-filter: blur(6px). Each work card carried
     2-3 backdrop-filter layers on top of the blurred sticky header; a slightly
     more opaque flat fill is visually near-identical over these gradient
     thumbnails and costs nothing to composite. */
  background: rgba(8, 8, 11, 0.78);
  /* yellow on every card, not just the g3/g4 gradients — the tag is a
     consistent label, so it shouldn't change colour with the backdrop */
  border: 1px solid rgba(255, 216, 0, 0.3);
  color: var(--yellow);
  font-size: .7rem;
  font-weight: 800;
  letter-spacing: .02em;
  padding: .32em .72em;
  border-radius: 999px;
  line-height: 1.4;
}
.thumb .work-name {
  position: relative;
  z-index: 3;
  font-size: 1.25rem;
  font-weight: 900;
  letter-spacing: -.02em;
  color: #fff;
  text-shadow: 0 2px 14px rgba(0, 0, 0, 0.7);
}

/* play control — a real <button> when it does something, a <span> otherwise */
.thumb .play {
  position: absolute;
  top: 50%; left: 50%;
  transform: translate(-50%, -50%);
  width: 56px; height: 56px;
  padding: 0;
  border-radius: 50%;
  background: rgba(12, 12, 18, 0.72); /* flat fill instead of backdrop-filter — see .thumb .cat */
  border: 1.5px solid rgba(255, 255, 255, 0.65);
  display: flex;
  align-items: center;
  justify-content: center;
  z-index: 4;
  transition: transform .28s var(--ease), background .25s var(--ease), border-color .25s var(--ease);
}
button.play { cursor: pointer; font: inherit; color: inherit; }
/* :focus-within gives the keyboard user the same affordance change the mouse
   user gets on hover — not just the focus ring. */
.work-card:hover button.play,
.work-card:focus-within button.play {
  transform: translate(-50%, -50%) scale(1.1);
  background: var(--purple);
  border-color: var(--purple-soft);
}
/* the play glyph is a universal LTR media control —
   nudge it physically right to optically centre it */
.thumb .play svg { width: 20px; height: 20px; margin-left: 3px; color: #fff; display: block; }

/* The youtube iframe now lies ON TOP of the facade instead of replacing it, so
   closing an accordion group only has to drop the iframe and the facade comes
   back on its own — nothing to rebuild or re-wire. visibility (not display)
   also pulls the covered play button out of the tab order while it plays. */
.thumb.is-playing { padding: 0; }
.thumb.is-playing::after { display: none; }
.thumb.is-playing > :not(.yt-frame) { visibility: hidden; }
.thumb .yt-frame {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  border: 0;
  z-index: 5;
}

.work-body {
  padding: 1.15rem 1.25rem 1.4rem;
  display: flex;
  flex-direction: column;
  gap: .45rem;
  flex: 1;
}
.work-body .role-label {
  font-size: .7rem;
  font-weight: 900;
  letter-spacing: .06em;
  color: var(--purple-glow);
}
.work-body .role-label .sub { color: var(--muted-2); font-weight: 700; letter-spacing: 0; }
.work-body p { color: var(--muted); font-size: .98rem; line-height: 1.55; }
/* תת-כותרת תיאורית — עדינה: אפור-רך במשקל רגיל, שלוחשת מתחת לכותרת במקום
   להתחרות בה. יושבת מעל "מה עשיתי" (הוו הרגשי, ואז הקרדיט העובדתי). */
.work-body .work-sub {
  color: var(--muted);
  font-size: .95rem;
  font-weight: 400;
  line-height: 1.55;
}

.work-tags {
  display: flex;
  flex-wrap: wrap;
  gap: .4rem;
  margin-top: .35rem;
}
.work-tags li {
  font-size: .7rem;
  font-weight: 700;
  color: var(--muted-2);
  background: rgba(255, 255, 255, 0.04);
  border: 1px solid var(--line);
  border-radius: 999px;
  padding: .2em .7em;
  line-height: 1.5;
}

/* soft "coming soon" chip on a thumbnail */
.soon-chip {
  position: absolute;
  top: 12px;
  inset-inline-start: 12px;
  z-index: 3;
  display: inline-flex;
  align-items: center;
  gap: .4rem;
  font-size: .68rem;
  font-weight: 800;
  color: var(--muted);
  background: rgba(8, 8, 11, 0.78); /* flat fill instead of backdrop-filter — see .thumb .cat */
  border: 1px solid var(--line-strong);
  border-radius: 999px;
  padding: .3em .7em;
  line-height: 1.4;
}
.soon-chip::before {
  content: "";
  width: 5px; height: 5px;
  border-radius: 50%;
  background: var(--muted-2);
  flex: none;
}

/* ============ 08b. AUDIO CARD — the wave panel ============
   Audio has nothing to put in a picture, so instead of an empty 16:10 frame
   these cards get a SHORTER panel built out of the waveform itself. Click
   anywhere on it to play; the bars run while playing and freeze on pause; the
   part already played fills in from the RIGHT — the reading direction here.
   --p (0%-100%) is written onto .wave-panel by js/main.js on every timeupdate. */

.wave-panel {
  position: relative;
  /* deliberately shorter than .thumb's 16:10 — there is no picture to frame */
  height: clamp(122px, 26vw, 150px);
  overflow: hidden;
  display: flex;
  align-items: flex-end;
  padding: 1.05rem 1.15rem;
  border-bottom: 1px solid var(--line);
  /* the whole panel IS the player: tap to play/pause, drag to seek */
  cursor: pointer;
  user-select: none;
  -webkit-user-select: none;
  /* let the browser keep vertical scroll; we own horizontal drags (seek) */
  touch-action: pan-y;
}
.wave-panel[role="slider"]:focus-visible {
  outline: 2px solid var(--focus-ring);
  outline-offset: -3px;
}
.wave-panel.is-scrubbing { cursor: grabbing; }
.wave-panel::after {
  content: "";
  position: absolute;
  inset: 0;
  background: linear-gradient(180deg, transparent 40%, rgba(6, 6, 10, 0.78));
  z-index: 1;
  pointer-events: none;
}

/* full-bleed so the bars, the clip-path and the playhead all measure against
   the same box — any inset here and the three drift out of alignment */
.wave-panel .bars {
  position: absolute;
  inset-inline: 0;
  top: 50%;
  transform: translateY(-62%);
  height: 52%;
  display: flex;
  align-items: center;
  gap: 2px;
  padding-inline: 1.15rem;
  z-index: 0;
}
.wave-panel .bars span {
  flex: 1 1 0;
  min-width: 2px;
  border-radius: 2px;
  background: rgba(255, 255, 255, 0.26);
  transform-origin: center;
}
/* the played part: the same bars again, lit up, revealed from the right by --p */
.wave-panel .bars.played { clip-path: inset(0 0 0 calc(100% - var(--p))); }
.wave-panel .bars.played span {
  background: var(--yellow);
  box-shadow: 0 0 8px rgba(255, 216, 0, 0.4);
}
/* the seam between played and unplayed */
.wave-panel .wave-head {
  position: absolute;
  top: 22%;
  bottom: 22%;
  right: var(--p);
  width: 2px;
  border-radius: 2px;
  background: var(--yellow);
  box-shadow: 0 0 12px rgba(255, 216, 0, 0.75);
  /* always visible — it's the scrubber position marker, not just a "now playing" seam */
  opacity: 1;
  transition: opacity .25s var(--ease);
  z-index: 2;
}

/* the bars only move while something is actually playing */
@keyframes barRun {
  from { transform: scaleY(.4); }
  to   { transform: scaleY(1); }
}
.wave-panel.is-playing .bars span { animation: barRun .9s ease-in-out infinite alternate; }

.wave-panel .work-name {
  position: relative;
  z-index: 3;
  font-size: 1.2rem;
  font-weight: 900;
  letter-spacing: -.02em;
  color: #fff;
  text-shadow: 0 2px 14px rgba(0, 0, 0, 0.75);
}

/* חיווי מצב עדין במרכז — לא כפתור. מסמן "לחצו להשמעה" כשעצור; בזמן ניגון
   הברים המונפשים נושאים את המצב והחיווי דוהה. pointer-events:none כדי שכל
   לחיצה/גרירה תיפול על הפאנל (הפקד האמיתי) ולא על החיווי. */
.wave-state {
  position: absolute;
  top: 50%;
  inset-inline-start: 50%;
  transform: translate(50%, -50%);
  width: 30px; height: 30px;
  display: flex;
  align-items: center;
  justify-content: center;
  color: rgba(255, 255, 255, 0.92);
  opacity: .5;
  pointer-events: none;
  z-index: 4;
  transition: opacity .25s var(--ease);
  filter: drop-shadow(0 2px 10px rgba(0, 0, 0, 0.6));
}
.wave-state svg { width: 100%; height: 100%; display: block; }
.wave-panel:hover .wave-state,
.wave-panel:focus-visible .wave-state { opacity: .9; }
.wave-panel.is-playing .wave-state { opacity: .28; }

.wave-time {
  position: absolute;
  bottom: 1.05rem;
  inset-inline-start: 1.15rem;
  z-index: 3;
  font-size: .72rem;
  font-weight: 700;
  color: rgba(255, 255, 255, 0.75);
  font-variant-numeric: tabular-nums;
  letter-spacing: .04em;
}

/* the <audio> element stays in the DOM to actually play, but it is hidden:
   the wave panel above is now the full player (tap to play, drag to seek),
   so the gray native control bar is gone. */
.audio-card .work-body audio { display: none; }

/* ============ 08c. PORTFOLIO + BEFORE/AFTER LAYOUT ============
   התיק (ראשי) לצד מחוון "לפני/אחרי" (משני). בדסקטופ: תיק מימין (1fr),
   המחוון משמאל בעמודה צרה שנדבקת בגלילה. במובייל: קובייה מתחת לקובייה,
   התיק ראשון (סדר ה-DOM), המחוון אחריו. */
/* תיק העבודות רחב יותר משאר הסקשנים — יש מקום, וזה מאפשר 3 כרטיסים בשורה
   לצד מחוון הלפני/אחרי. נחסם לרוחב המסך במסכים צרים יותר. */
#work .container { max-width: 1400px; }
.work-layout {
  display: grid;
  grid-template-columns: 1fr;
  gap: clamp(1.8rem, 4vw, 2.6rem);
}
.work-main { min-width: 0; }  /* מונע מהגריד לגלוש בגלל תוכן רחב */
/* 2 עמודות (תיק + מחוון לפני/אחרי לצדו) רק ממסך רחב מספיק (≥1100), אחרת התיק
   נדחק. מתחת ל-1100: הכל בעמודה אחת, התיק ברוחב מלא (2–3 כרטיסים בנוחות). */
@media (min-width: 1100px) {
  .work-layout {
    grid-template-columns: minmax(0, 1fr) clamp(300px, 27vw, 360px);
    align-items: start;
  }
  /* הוידאו ממלא את העמודה הרחבה (בלי תקרת ה-360 של מובייל) — כך הוא גדל
     בפרופורציה מלאה (9:16), בלי מתיחה, חיתוך או איבוד פריים. בלי מסגרת/רקע;
     מתחתיו רק טקסט לבן. */
  .ba-frame .ba-compare { max-width: none; width: 100%; }
}
.work-side .ba-head { margin-top: 1rem; text-align: center; }
.ba-head-title { color: #fff; }
.ba-head-kicker {
  display: block;
  font-size: .72rem;
  font-weight: 800;
  letter-spacing: .1em;
  color: var(--purple-glow);
}
.ba-head-title {
  font-size: 1.3rem;
  font-weight: 900;
  letter-spacing: -.02em;
  margin-top: .3rem;
}
.ba-head-sub {
  color: var(--muted);
  font-size: .92rem;
  margin-top: .35rem;
}

/* ============ 08d. BEFORE / AFTER (video color + sound) ============
   שני סרטונים זהים על אותו טיימליין; גוררים את הידית וגם התמונה וגם הקול
   מתחלפים. משטח מדיה — נשאר כהה בשתי הערכות. */
.ba-compare {
  position: relative;
  width: 100%;
  max-width: 360px;
  margin-inline: auto;
  aspect-ratio: 9 / 16;
  border-radius: 20px;
  overflow: hidden;
  background: #000;
  border: 1px solid var(--line-strong);
  box-shadow: 0 34px 64px -34px rgba(0, 0, 0, 0.95);
  cursor: pointer;           /* tap the video to play/pause */
  user-select: none;
  -webkit-user-select: none;
  touch-action: pan-y;       /* page still scrolls vertically; the handle owns horizontal */
}
.ba-vid {
  position: absolute;
  inset: 0;
  width: 100%; height: 100%;
  object-fit: cover;
  display: block;
}
/* before = the top layer, revealed on the RIGHT (from --split to the edge) */
.ba-before { clip-path: inset(0 0 0 var(--split)); }
/* הקול מגיע מנגני אודיו נפרדים ומסונכרנים — מוסתרים לגמרי */
.ba-audio { display: none; }

.ba-tag {
  position: absolute;
  top: .7rem;
  z-index: 4;
  font-size: .66rem;
  font-weight: 800;
  letter-spacing: .05em;
  padding: .3em .75em;
  border-radius: 999px;
  background: rgba(8, 8, 11, 0.72);
  border: 1px solid rgba(255, 255, 255, 0.22);
  color: #fff;
  pointer-events: none;
}
.ba-tag-after  { inset-inline-end: .7rem; }   /* אחרי נראה בצד שמאל */
.ba-tag-before { inset-inline-start: .7rem; } /* לפני נראה בצד ימין */

/* the drag handle: a full-height divider with a grip set low, clear of the play button */
.ba-handle {
  position: absolute;
  top: 0; bottom: 0;
  left: var(--split);
  transform: translateX(-50%);
  width: 44px;
  z-index: 5;
  cursor: ew-resize;
  touch-action: none;        /* the horizontal drag belongs to the handle, not the page */
}
.ba-handle::before {
  content: "";
  position: absolute;
  top: 0; bottom: 0; left: 50%;
  transform: translateX(-50%);
  width: 2px;
  background: rgba(255, 255, 255, 0.92);
  box-shadow: 0 0 12px rgba(0, 0, 0, 0.55);
}
.ba-grip {
  position: absolute;
  left: 50%; top: 74%;
  transform: translate(-50%, -50%);
  width: 42px; height: 42px;
  border-radius: 50%;
  background: rgba(12, 12, 18, 0.72);
  border: 2px solid #fff;
  color: #fff;
  display: flex;
  align-items: center;
  justify-content: center;
}
.ba-grip svg { width: 22px; height: 22px; display: block; }
.ba-handle:focus-visible { outline: none; }
.ba-handle:focus-visible .ba-grip { box-shadow: 0 0 0 3px var(--focus-ring); }

/* center play / pause — hidden while playing (tap the video to pause) */
.ba-play {
  position: absolute;
  top: 50%; left: 50%;
  transform: translate(-50%, -50%);
  z-index: 6;
  width: 64px; height: 64px;
  padding: 0;
  border-radius: 50%;
  background: rgba(12, 12, 18, 0.55);
  border: 2px solid rgba(255, 255, 255, 0.75);
  color: #fff;
  cursor: pointer;
  display: flex;
  align-items: center;
  justify-content: center;
  transition: opacity .25s var(--ease), transform .2s var(--ease);
}
.ba-play svg { width: 24px; height: 24px; margin-inline-start: 2px; }
.ba-compare:hover .ba-play { transform: translate(-50%, -50%) scale(1.06); }
.ba-compare.is-playing .ba-play { opacity: 0; pointer-events: none; }
.ba-compare.is-playing:hover .ba-play,
.ba-compare.is-playing:focus-within .ba-play { opacity: 1; pointer-events: auto; }

@media (prefers-reduced-motion: reduce) {
  .wave-panel.is-playing .bars span { animation: none; }
}

/* fetch failed / empty state */
.notice {
  border: 1px dashed var(--line-strong);
  border-radius: var(--radius-sm);
  padding: 1.2rem 1.3rem;
  color: var(--muted);
  font-size: .95rem;
  background: rgba(255, 255, 255, 0.015);
}

/* ============ 09. AUDIO PLAYER (shared) ============ */
/* The player always lives inside a card that already provides the frame,
   so it stays frameless — no double borders. */
.audio-shell {
  display: flex;
  flex-direction: column;
  gap: .55rem;
  min-width: 0;
  margin-top: .35rem;
}
.audio-shell .a-head {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: .6rem;
  min-width: 0;
}
.audio-shell .a-label {
  font-size: .8rem;
  font-weight: 800;
  letter-spacing: .04em;
  color: var(--purple-glow);
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.audio-shell .a-note { font-size: .74rem; font-weight: 700; color: var(--muted-2); flex: none; }

/* native controls, themed via color-scheme + a purple accent */
.audio-shell audio {
  width: 100%;
  height: 40px;
  display: block;
  accent-color: var(--purple-soft);
  border-radius: 999px;
}
/* צהוב 0.5 מקובע — שמירה על זהות מול הבסיס הכהה. בבהיר מוחלף לסגול (סעיף 17). */
.audio-shell audio:focus-visible { outline: 3px solid rgba(255, 216, 0, 0.5); outline-offset: 3px; }

/* graceful "coming soon" — never a broken player */
.a-soon {
  display: flex;
  align-items: center;
  gap: .55rem;
  min-height: 40px;
  padding: .5rem .85rem;
  border: 1px dashed var(--line-strong);
  border-radius: 999px;
  color: var(--muted-2);
  font-size: .88rem;
  font-weight: 600;
}
.a-soon::before {
  content: "";
  width: 6px; height: 6px;
  border-radius: 50%;
  background: rgba(255, 216, 0, 0.55);
  flex: none;
}

/* ============ 10. BEFORE / AFTER ============ */
.ba-grid {
  display: grid;
  grid-template-columns: minmax(0, 1fr);
  gap: clamp(.9rem, 2vw, 1.25rem);
}
.ba-card {
  position: relative;
  background: linear-gradient(180deg, var(--card), var(--card-2));
  border: 1px solid var(--line);
  border-radius: var(--radius);
  padding: 1.4rem 1.35rem 1.5rem;
  display: flex;
  flex-direction: column;
  gap: .85rem;
  min-width: 0;
}
.ba-card.after { border-color: rgba(121, 0, 255, 0.22); }
.ba-card h3 {
  font-size: 1.05rem;
  font-weight: 800;
  display: flex;
  align-items: center;
  gap: .55rem;
  flex-wrap: wrap;
}
.ba-card .ba-badge {
  font-size: .64rem;
  font-weight: 900;
  letter-spacing: .06em;
  padding: .25em .6em;
  border-radius: 999px;
  line-height: 1.4;
  background: rgba(255, 255, 255, 0.06);
  border: 1px solid var(--line-strong);
  color: var(--muted);
}
.ba-card.after .ba-badge {
  background: rgba(121, 0, 255, 0.16);
  border-color: rgba(155, 77, 255, 0.32);
  color: var(--purple-glow);
}
.ba-card .ba-wave {
  height: 46px;
  color: rgba(155, 77, 255, 0.24);
  opacity: .9;
}
.ba-card.after .ba-wave { color: rgba(155, 77, 255, 0.5); }
.ba-card .ba-wave svg { width: 100%; height: 100%; display: block; }

/* ============ 11. NARRATION ============ */
.voice-grid {
  display: grid;
  grid-template-columns: minmax(0, 1fr);
  gap: clamp(.9rem, 2vw, 1.25rem);
}
.voice-card {
  background: linear-gradient(180deg, var(--card), var(--card-2));
  border: 1px solid var(--line);
  border-radius: var(--radius);
  padding: 1.4rem 1.35rem 1.5rem;
  display: flex;
  flex-direction: column;
  gap: .7rem;
  min-width: 0;
  transition: border-color .25s var(--ease);
}
.voice-card:hover { border-color: var(--line-strong); }
.voice-card h3 { font-size: 1.1rem; font-weight: 800; }
.voice-card .v-meta { font-size: .84rem; color: var(--muted-2); font-weight: 600; }

/* ============ 12. ABOUT + EXPERIENCE ============ */
.about-grid {
  display: grid;
  grid-template-columns: minmax(0, 1fr);
  gap: clamp(1.6rem, 4vw, 2.6rem);
  align-items: start;
}

/* The portrait was shot against a bright wall, so on this near-black page it
   would read as a cut-out pasted on top. The hairline border and the
   purple-tinted shadow tie it back into the page instead of fighting it.
   width/height on the <img> reserve the box before it loads — no layout shift. */
.about-photo { display: flex; justify-content: center; }
.about-img {
  width: 100%;
  max-width: 320px;
  height: auto;
  display: block;
  border-radius: var(--radius);
  border: 1px solid var(--line);
  box-shadow: 0 30px 60px -30px rgba(121, 0, 255, 0.55), 0 2px 10px rgba(0, 0, 0, 0.5);
}
.about-text p {
  color: var(--muted);
  font-size: 1.05rem;
  margin-top: 1rem;
  max-width: 560px;
}
.about-text h2 {
  font-size: clamp(1.8rem, 5.2vw, 2.6rem);
  font-weight: 900;
  line-height: 1.1;
  margin-top: .85rem;
}

.exp-card {
  background: linear-gradient(180deg, var(--card), var(--card-2));
  border: 1px solid var(--line);
  border-radius: var(--radius);
  padding: clamp(1.4rem, 3vw, 1.8rem) clamp(1.3rem, 2.6vw, 1.7rem);
  display: flex;
  flex-direction: column;
  gap: .9rem;
  min-width: 0;
}
.exp-card .exp-role {
  font-size: 1.12rem;
  font-weight: 900;
  line-height: 1.3;
  color: var(--text);
}
.exp-card .exp-place {
  font-size: .92rem;
  color: var(--muted);
  font-weight: 600;
}

/* .exp-link / .book-link were 24.8px and 28.9px tall — well under the 44px
   target minimum. min-height here would push the border-bottom away from the
   text it underlines, so instead each link gets an invisible 44px-tall hit
   area centred on it. Layout, underline position and spacing are unchanged;
   only the tap target grows. The overhang (~10px per side) stays well inside
   the surrounding flex gaps, so no neighbouring element loses clicks. */
.exp-link,
.book-link { position: relative; }
.exp-link::after,
.book-link::after {
  content: "";
  position: absolute;
  inset-inline: 0;
  top: 50%;
  transform: translateY(-50%);
  height: 44px;
}

.exp-link {
  display: inline-flex;
  align-items: center;
  gap: .4rem;
  font-size: .88rem;
  font-weight: 800;
  color: var(--yellow);
  border-bottom: 1px solid rgba(255, 216, 0, 0.3);
  padding-bottom: 1px;
  align-self: flex-start;
  transition: border-color .2s var(--ease), color .2s var(--ease);
}
.exp-link:hover { border-color: var(--yellow); }
.exp-link svg { width: 13px; height: 13px; flex: none; }

.exp-list {
  display: flex;
  flex-direction: column;
  gap: .75rem;
  margin-top: .2rem;
  padding-top: 1rem;
  border-top: 1px solid var(--line);
}
.exp-list li {
  position: relative;
  padding-inline-start: 1.35rem;
  color: var(--muted);
  font-size: .96rem;
  line-height: 1.6;
}
.exp-list li::before {
  content: "";
  position: absolute;
  inset-inline-start: 0;
  top: .62em;
  width: 7px; height: 7px;
  border-radius: 50%;
  background: var(--purple-soft);
  box-shadow: 0 0 8px rgba(155, 77, 255, 0.5);
}

/* ============ 13. BOOK ============ */
.book-band {
  background:
    radial-gradient(90% 120% at 85% 10%, rgba(121, 0, 255, 0.13), transparent 62%),
    linear-gradient(135deg, rgba(121, 0, 255, 0.06), rgba(255, 216, 0, 0.03));
  border: 1px solid var(--line);
  border-radius: 24px;
  padding: clamp(1.8rem, 4vw, 2.8rem) clamp(1.35rem, 4vw, 2.6rem);
  display: grid;
  grid-template-columns: minmax(0, 1fr);
  gap: clamp(1.8rem, 4vw, 3rem);
  align-items: center;
}
.book-visual { display: flex; justify-content: center; }
/* The real cover photo. Hebrew book: spine on the RIGHT, so the tighter corners
   and the spine shadow sit on the right edge, as if the book faces the reader.
   width/height are on the <img> itself, so the box is reserved before it loads
   (no layout shift). */
.book-cover-img {
  width: min(210px, 62vw);
  height: auto;
  display: block;
  border-radius: 14px 6px 6px 14px;
  border: 1px solid var(--line);
  box-shadow: 0 34px 60px -28px rgba(92, 0, 196, 0.7), 6px 0 0 0 rgba(0, 0, 0, 0.25);
  transition: transform .3s var(--ease), box-shadow .3s var(--ease);
}
.book-cover-img:hover {
  transform: translateY(-5px) rotate(-1.2deg);
  box-shadow: 0 44px 74px -28px rgba(92, 0, 196, 0.8), 6px 0 0 0 rgba(0, 0, 0, 0.25);
}

.book-text h2 {
  font-size: clamp(1.6rem, 4.4vw, 2.4rem);
  font-weight: 900;
  line-height: 1.12;
  margin-top: .85rem;
}
.book-text p { color: var(--muted); font-size: 1.05rem; margin-top: 1rem; max-width: 520px; }
.book-link {
  display: inline-flex;
  align-items: center;
  gap: .45rem;
  margin-top: 1.4rem;
  font-weight: 800;
  font-size: 1rem;
  color: var(--yellow);
  border-bottom: 1px solid rgba(255, 216, 0, 0.35);
  padding-bottom: 2px;
  transition: border-color .2s var(--ease), gap .2s var(--ease);
}
.book-link:hover { border-color: var(--yellow); gap: .7rem; }

/* ============ 14. CONTACT ============ */
.contact-card {
  text-align: center;
  background:
    radial-gradient(90% 130% at 50% 0%, rgba(121, 0, 255, 0.24), transparent 62%),
    var(--ink-2);
  border: 1px solid rgba(121, 0, 255, 0.22);
  border-radius: 26px;
  padding: clamp(2.4rem, 6vw, 3.6rem) clamp(1.3rem, 4vw, 2.6rem);
  box-shadow: 0 0 70px -26px rgba(121, 0, 255, 0.45);
}
.contact-card h2 {
  font-size: clamp(1.7rem, 5vw, 2.7rem);
  font-weight: 900;
  line-height: 1.16;
  max-width: 680px;
  margin-inline: auto;
  margin-top: 1rem;
}
.contact-card .contact-audience {
  margin-top: 1.2rem;
  margin-inline: auto;
  max-width: 620px;
  color: var(--muted);
  font-size: 1.02rem;
}
/* Longhand, not `padding: 1.05rem 2rem` — the narrow-screen override needs to
   touch padding-inline without also resetting padding-block. Note the override
   at the bottom of this file has to repeat this selector: the responsive rule
   is (0,1,0) and would lose to this (0,2,0) no matter where it sits.
   max-width: 100% was dropped — .btn is white-space: nowrap, so a max-width
   can never make it wrap and did nothing at all. */
.contact-card .btn {
  margin-top: 2rem;
  font-size: 1.05rem;
  padding-block: 1.05rem;
  padding-inline: 2rem;
}
.contact-note { margin-top: 1rem; font-size: .85rem; color: var(--muted-2); }

/* ============ 15. FOOTER + FLOATING WHATSAPP ============ */
.site-footer {
  border-top: 1px solid var(--line);
  /* extra bottom space so the floating WhatsApp button never covers the text */
  padding-block: 2rem 5.5rem;
}
.footer-inner {
  display: flex;
  justify-content: center;
  align-items: center;
  text-align: center;
  gap: .7rem;
  color: var(--muted-2);
  font-size: .88rem;
}
.footer-inner strong { color: var(--text); font-weight: 800; }
/* On a phone: three centred lines — name / services / tagline. .foot-lead
   stacks its name and services onto separate lines and the middle dot hides.
   On desktop .foot-lead stays a single "name · services" line (unchanged). */
@media (max-width: 640px) {
  .footer-inner {
    flex-direction: column;
    justify-content: center;
    align-items: center;
    text-align: center;
    gap: .4rem;
  }
  .foot-lead {
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: .4rem;
  }
  .foot-dot { display: none; }
}

/* Moved from inset-inline-start (bottom-right in RTL) to inset-inline-end
   (bottom-left). At bottom-right this z-index: 60 button sat on top of the
   right-hand edge of .book-link (33% of it unclickable), .exp-link (23%) and
   the hero CTAs, all of which hug the inline-start edge of their card in RTL.
   Nothing interactive lives at the bottom-left. The one element it still
   clips either way is the centred .contact-card .btn, symmetrically (~3%),
   so this is a straight improvement — and inset-inline-end is also the
   logical mirror of the LTR bottom-right FAB convention. */
.wa-float {
  position: fixed;
  bottom: clamp(16px, 4vw, 26px);
  inset-inline-end: clamp(16px, 4vw, 26px); /* RTL -> bottom-left */
  z-index: 60;
  width: 58px; height: 58px;
  border-radius: 50%;
  background: linear-gradient(135deg, var(--wa), var(--wa-deep));
  display: flex;
  align-items: center;
  justify-content: center;
  box-shadow: 0 12px 30px -8px rgba(37, 211, 102, 0.55), 0 4px 12px rgba(0, 0, 0, 0.45);
  transition: transform .22s var(--ease), box-shadow .22s var(--ease);
  animation: wa-pop 3.4s ease-in-out infinite;
}
.wa-float:hover { transform: scale(1.08); box-shadow: 0 18px 38px -10px rgba(37, 211, 102, 0.75); }
.wa-float svg { width: 30px; height: 30px; color: var(--ink); } /* see --wa in :root */
@keyframes wa-pop {
  0%, 92%, 100% { transform: scale(1); }
  96% { transform: scale(1.08); }
}

/* ============ 16. FOCUS, MOTION, RESPONSIVE ============ */
a:focus-visible,
button:focus-visible,
.btn:focus-visible {
  outline: 3px solid var(--focus-ring);
  outline-offset: 3px;
  border-radius: 8px;
}

@keyframes riseIn {
  from { opacity: 0; transform: translateY(16px); }
  to { opacity: 1; transform: none; }
}
.rise { animation: riseIn .7s var(--ease) both; }
.d1 { animation-delay: .04s; }
.d2 { animation-delay: .12s; }
.d3 { animation-delay: .2s; }
.d4 { animation-delay: .28s; }
.d5 { animation-delay: .36s; }
.d6 { animation-delay: .46s; }

@media (min-width: 560px) {
  .flow-outputs { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  /* 3 chips in 2 columns: the last one spans full width instead of orphaning */
  .flow-outputs .out-chip:last-child { grid-column: 1 / -1; }
}

@media (min-width: 640px) {
  .services-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  /* 2 כרטיסים גדולים בשורה (Nati בחר A) — עם הבלוק הרחב הם יוצאים גדולים
     ובעלי נוכחות. במובייל (מתחת ל-640) נשאר 1 בשורה. */
  .work-grid,
  .voice-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .ba-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}

/* כרטיסי תיק גדולים (2 בשורה, בלוק רחב) → מגדילים גם את הטקסט וגם את כפתור
   הנגן, לנוכחות (אופציה A). חל רק בדסקטופ; במובייל הכרטיסים נשארים כמו שהם. */
@media (min-width: 900px) {
  #work .thumb .work-name,
  #work .wave-panel .work-name { font-size: 1.45rem; }
  #work .thumb .play { width: 66px; height: 66px; }
  #work .thumb .play svg { width: 24px; height: 24px; }
  #work .work-body .work-sub { font-size: 1.08rem; }
  #work .work-body p { font-size: 1.05rem; }
  #work .work-body .role-label { font-size: .76rem; }
  #work .work-tags li { font-size: .76rem; }
}

@media (min-width: 900px) {
  .flow { grid-template-columns: 290px 56px minmax(0, 1fr); }
  .flow-source { text-align: start; } /* start, not right — dir is fixed to rtl in the
                                         HTML so they resolve the same, but every other
                                         non-deliberate offset in this file is logical */
  /* side-by-side (RTL): source on the right, arrow points left to the outputs */
  .flow-arrow svg { transform: none; }
  .book-band { grid-template-columns: 210px minmax(0, 1fr); }
  /* Desktop: portrait beside the text on row 1, the experience card spans the
     full width on row 2 — its three bullets need the room to breathe. */
  .about-grid { grid-template-columns: 300px minmax(0, 1fr); }
  .about-grid .exp-card { grid-column: 1 / -1; }
}

/* .flow going side-by-side at 900px and .flow-outputs going to 3 columns used
   to happen at the same breakpoint. 290px + 56px of fixed track plus the gaps
   left only ~430px for three chips, which squeezed each text column down to
   32-52px and wrapped every <small> onto four lines. Between 900 and 1100 the
   chips therefore stay on the 560px rule (2 columns, last one spanning), which
   gives them ~205px each; three across only unlocks once there is room for it. */
@media (min-width: 1100px) {
  .flow-outputs { grid-template-columns: repeat(3, minmax(0, 1fr)); }
  .flow-outputs .out-chip:last-child { grid-column: auto; }
}

@media (max-width: 420px) {
  .hero-cta .btn { flex: 1 1 100%; }
  /* .contact-card .btn is repeated explicitly: it sets padding-inline at
     (0,2,0), so a bare .btn here would never win however late it appears. */
  .btn,
  .contact-card .btn { padding-inline: 1.2rem; }
}

/* ============ 17. LIGHT THEME (ערכה בהירה) ============
   ברירת המחדל של האתר כהה. הבלוק הזה נכנס לפעולה רק כש-data-theme="light"
   על אלמנט ה-html (נשמר ב-localStorage, מוחל ב-<head> לפני הציור).

   העיקרון — "מדיה מול כרום":
   • כרום (רקע, כותרות, גוף, כרטיסי שירות/אקורדיון, "עליי", פוטר) מתהפך לבהיר
     דרך המשתנים, ואקסנטים צהובים/סגולים בהירים מוכהים כדי לעבור ניגודיות.
   • משטחי מדיה עשירים (גל ה-Hero, ה-thumbnails, פאנלי האודיו, כרטיס הקשר)
     נשארים כהים — בתוכם מוצהרים מחדש הערכים הכהים כדי לשמור על הזוהר. */

:root[data-theme="light"] {
  /* משטחים בהירים (נייר חם) */
  --ink:   #FAF7F1;
  --ink-2: #FFFFFF;
  --card:  #FFFFFF;
  --card-2:#F7F4EE;

  /* טקסט כהה */
  --text:    #17131F;
  --muted:   #56525F;
  --muted-2: #6C6878;

  /* קווי שיער כהים במקום בהירים */
  --line:        rgba(0, 0, 0, 0.10);
  --line-strong: rgba(0, 0, 0, 0.16);

  /* סגול-בהיר מוכהה לניגודיות על רקע בהיר (kicker, role-label, a-label).
     על משטחי המדיה הוא מוצהר מחדש בהיר בהמשך. */
  --purple-glow: #6E1FD6;

  /* טבעת פוקוס סגולה — הצהוב אינו נראה על כרום בהיר */
  --focus-ring: rgba(121, 0, 255, 0.7);

  color-scheme: light;
}

/* ---- כרום: אקסנטים צהובים שאינם נראים על בהיר → סגול קריא ---- */
[data-theme="light"] .section-head h2 .hl { color: #7900FF; }

[data-theme="light"] .eyebrow {
  color: #6E1FD6;
  background: rgba(121, 0, 255, 0.06);
  border-color: rgba(121, 0, 255, 0.22);
}
[data-theme="light"] .eyebrow .pulse {
  background: #7900FF;
  box-shadow: 0 0 9px rgba(121, 0, 255, 0.5);
}

/* כותרת ה-Hero — גרדיאנט סגול→צהוב הופך לסגול מלא (הצהוב נכשל על בהיר) */
/* background-image, NOT the `background` shorthand — the shorthand resets
   background-clip back to border-box, which un-clips the gradient from the
   text and paints "קול." as a solid purple block. Re-declaring the clip too,
   belt-and-suspenders. */
[data-theme="light"] .hero-title .l2 {
  background-image: linear-gradient(100deg, #7900FF, #8A33F5);
  -webkit-background-clip: text;
  background-clip: text;
}

[data-theme="light"] .btn-ghost { background: rgba(0, 0, 0, 0.02); }
[data-theme="light"] .btn-ghost:hover {
  color: #7900FF;
  border-color: rgba(121, 0, 255, 0.45);
  background: rgba(121, 0, 255, 0.06);
}

[data-theme="light"] .header-link:hover {
  color: #7900FF;
  border-color: rgba(121, 0, 255, 0.4);
  background: rgba(121, 0, 255, 0.06);
}
[data-theme="light"] .theme-toggle:hover { border-color: rgba(121, 0, 255, 0.4); }
[data-theme="light"] .theme-toggle:focus-visible { outline-color: #7900FF; }

[data-theme="light"] .wg-chev { border-right-color: #7900FF; border-bottom-color: #7900FF; }
[data-theme="light"] .wg-count {
  color: #7900FF;
  background: rgba(121, 0, 255, 0.1);
  border-color: rgba(121, 0, 255, 0.3);
}

[data-theme="light"] .exp-link {
  color: #7900FF;
  border-bottom-color: rgba(121, 0, 255, 0.4);
}
[data-theme="light"] .exp-link:hover { border-bottom-color: #7900FF; }

[data-theme="light"] .book-link {
  color: #7900FF;
  border-bottom-color: rgba(121, 0, 255, 0.45);
}
[data-theme="light"] .book-link:hover { border-bottom-color: #7900FF; }

/* ---- אקסנטים צהובים/לבנים במקטעים שמרונדרים בתנאי (flow / before-after /
   narration): על כרום בהיר הם כמעט בלתי נראים → סגול/כהה קריא. תואם לאופן
   שבו שאר האקסנטים הצהובים מוכהים בבהיר. ---- */
[data-theme="light"] .flow-arrow { color: #7900FF; }
[data-theme="light"] .out-chip:hover { border-color: rgba(121, 0, 255, 0.35); }
[data-theme="light"] .ba-card .ba-badge { background: rgba(0, 0, 0, 0.04); }

/* נקודת ה"בקרוב" של נגן האודיו — צהובה נעלמת על כרטיס בהיר, סגולה בבהיר */
[data-theme="light"] .a-soon::before { background: rgba(121, 0, 255, 0.55); }

/* טבעת הפוקוס של נגן האודיו: בכהה נשארת צהובה (ליטרל בבסיס, סעיף 09),
   בבהיר עוברת לסגול/מודעת-משטח דרך var(--focus-ring) */
[data-theme="light"] .audio-shell audio:focus-visible { outline-color: var(--focus-ring); }

/* ---- כרום: רקעים/צללים שכוונו לכהה ---- */
[data-theme="light"] .site-header { background: rgba(250, 247, 241, 0.72); }
[data-theme="light"] .work-group-btn:hover { background: rgba(0, 0, 0, 0.03); }
[data-theme="light"] .work-tags li { background: rgba(0, 0, 0, 0.04); }
[data-theme="light"] .availability { background: rgba(0, 0, 0, 0.03); }

/* צללים שחורים כבדים → צל סגול רך שמתאים לנייר הבהיר */
[data-theme="light"] .service-card:hover { box-shadow: 0 20px 44px -20px rgba(60, 30, 120, 0.28); }
[data-theme="light"] .work-card:hover    { box-shadow: 0 26px 54px -26px rgba(60, 30, 120, 0.3); }
[data-theme="light"] .about-img {
  box-shadow: 0 30px 60px -30px rgba(121, 0, 255, 0.4), 0 2px 10px rgba(0, 0, 0, 0.12);
}

/* אורות הרקע — עדינים יותר על נייר בהיר */
[data-theme="light"] .glow-1 { background: radial-gradient(circle, rgba(121, 0, 255, 0.14), transparent 64%); }
[data-theme="light"] .glow-2 { background: radial-gradient(circle, rgba(255, 216, 0, 0.10), transparent 63%); }
[data-theme="light"] .glow-3 { background: radial-gradient(circle, rgba(121, 0, 255, 0.10), transparent 66%); }

/* כפתורי הוואטסאפ: הירוק נשאר, אך var(--ink) התהפך לבהיר — לבן/בהיר על
   ירוק נכשל בניגודיות, אז מקבעים טקסט/אייקון כהים */
[data-theme="light"] .btn-wa { color: #08080B; }
[data-theme="light"] .wa-float svg { color: #08080B; }

/* ---- מדיה: משטחים שנשארים עשירים (כהים) גם בבהיר ----
   מצהירים מחדש בתוך המשטח את הערכים הכהים, כך שכל הטקסט/הקווים/האקסנט
   שבתוכו נשארים תקינים על הרקע הכהה. */
[data-theme="light"] .thumb,
[data-theme="light"] .wave-panel,
[data-theme="light"] .contact-card {
  --text: #F4F3F8;
  --muted: #A9A8B7;
  --muted-2: #8E8DA3;
  --line: rgba(255, 255, 255, 0.07);
  --line-strong: rgba(255, 255, 255, 0.13);
  --purple-glow: #B98BFF;
  --focus-ring: rgba(255, 216, 0, 0.6);
}

/* גל ה-Hero המוטמע יושב עכשיו על רקע העמוד (בלי קופסה). בבהיר, על הקרם,
   מכהים מעט את הברים ומחליפים את המרקר הצהוב לסגול (צהוב על קרם חלש מדי).
   במצב הכהה — ברירת המחדל — הכל נשאר כמו שהיה. */
[data-theme="light"] .hero-wave .wave-base { color: rgba(121, 0, 255, 0.24); }
[data-theme="light"] .hero-wave .playhead {
  background: rgba(121, 0, 255, 0.7);
  box-shadow: 0 0 10px rgba(121, 0, 255, 0.3);
}
[data-theme="light"] .wm-dot {
  background: var(--purple);
  box-shadow: 0 0 9px rgba(121, 0, 255, 0.5);
}

/* רקעים של משטחי מדיה שהשתמשו במשתנה שהתהפך — מקבעים בסיס כהה */
[data-theme="light"] .contact-card {
  background:
    radial-gradient(90% 130% at 50% 0%, rgba(121, 0, 255, 0.24), transparent 62%),
    #0C0C11;
}
/* כותרת כרטיס הקשר יורשת color (לא var), אז המשתנה המוצהר-מחדש לא מגיע
   אליה מעצמו — מחזירים אותה במפורש לטקסט הבהיר */
[data-theme="light"] .contact-card h2 { color: var(--text); }

@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after {
    animation-duration: .001ms !important;
    animation-delay: 0ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: .001ms !important;
    scroll-behavior: auto !important;
  }
}

/* ============ 17. נגישות — כפתור צף, פאנל, ומצבי נגישות ============ */
.a11y { position: fixed; z-index: 70; bottom: 1.6rem; inset-inline-start: 1.4rem; }
.a11y-btn {
  width: 52px; height: 52px; border-radius: 50%; padding: 0;
  display: flex; align-items: center; justify-content: center;
  background: linear-gradient(135deg, var(--purple), var(--purple-soft));
  color: #fff; border: none; cursor: pointer;
  box-shadow: 0 6px 22px rgba(121, 0, 255, 0.45);
  transition: transform .15s var(--ease), box-shadow .2s var(--ease);
}
.a11y-btn:hover { transform: translateY(-2px); box-shadow: 0 10px 26px rgba(121, 0, 255, 0.55); }
.a11y-btn:focus-visible { outline: 3px solid var(--yellow); outline-offset: 3px; }
.a11y-btn svg { width: 27px; height: 27px; display: block; }
.a11y-panel {
  position: absolute; bottom: calc(100% + 12px); inset-inline-start: 0;
  width: 254px; padding: 14px;
  background: var(--card); color: var(--text);
  border: 1px solid var(--line); border-radius: 16px;
  box-shadow: 0 18px 50px -12px rgba(0, 0, 0, 0.6);
  display: flex; flex-direction: column; gap: 8px;
}
.a11y-panel[hidden] { display: none; }
.a11y-head { display: flex; align-items: center; justify-content: space-between; margin-bottom: 2px; }
.a11y-head strong { font-size: 1.05rem; }
.a11y-x { width: 34px; height: 34px; border: none; background: none; color: var(--muted); cursor: pointer; border-radius: 8px; display: flex; align-items: center; justify-content: center; }
.a11y-x:hover { background: rgba(127, 127, 127, .14); color: var(--text); }
.a11y-x svg { width: 18px; height: 18px; }
.a11y-size { display: flex; align-items: center; justify-content: space-between; gap: 8px; padding: 2px 2px 4px; }
.a11y-lbl { font-size: .92rem; color: var(--muted); }
.a11y-size-btns { display: inline-flex; gap: 5px; }
.a11y-size-btns button { min-width: 42px; height: 38px; border: 1px solid var(--line); background: none; color: var(--text); border-radius: 9px; cursor: pointer; font-weight: 700; font-size: .95rem; }
.a11y-size-btns button:hover { border-color: var(--purple-soft); }
.a11y-opt {
  display: flex; align-items: center; justify-content: space-between;
  width: 100%; padding: 10px 12px; min-height: 44px;
  border: 1px solid var(--line); background: none; color: var(--text);
  border-radius: 10px; cursor: pointer; font: inherit; font-size: .95rem; text-align: start;
}
.a11y-opt::after { content: ""; width: 18px; height: 18px; border-radius: 5px; border: 2px solid var(--muted); flex: none; transition: background .15s var(--ease), border-color .15s var(--ease); }
.a11y-opt:hover { border-color: var(--purple-soft); }
.a11y-opt[aria-pressed="true"] { border-color: var(--purple-soft); background: rgba(121, 0, 255, .08); }
.a11y-opt[aria-pressed="true"]::after { border-color: var(--purple); background: var(--purple); box-shadow: inset 0 0 0 3px var(--card); }
.a11y-reset { margin-top: 2px; padding: 9px; border: 1px solid var(--line); background: none; color: var(--muted); border-radius: 10px; cursor: pointer; font: inherit; font-size: .88rem; min-height: 40px; }
.a11y-reset:hover { color: var(--text); border-color: var(--muted); }
.a11y-statement { text-align: center; font-size: .92rem; color: var(--purple-soft); text-decoration: none; padding: 6px; font-weight: 700; }
.a11y-statement:hover { text-decoration: underline; }

/* מצב: הדגשת קישורים */
html.a11y-links a:not(.btn):not(.a11y-btn):not(.a11y-statement):not(.wa-float):not(.brand) { text-decoration: underline !important; text-underline-offset: 3px; }
/* מצב: עצירת אנימציות */
html.a11y-motion *, html.a11y-motion *::before, html.a11y-motion *::after {
  animation-duration: .001ms !important; animation-iteration-count: 1 !important;
  transition-duration: .001ms !important; scroll-behavior: auto !important;
}
/* מצב: גופן קריא */
html.a11y-readable, html.a11y-readable body, html.a11y-readable button, html.a11y-readable input, html.a11y-readable a {
  font-family: Arial, Helvetica, "Segoe UI", sans-serif !important; letter-spacing: .01em !important;
}
html.a11y-readable p, html.a11y-readable li, html.a11y-readable .work-body p { line-height: 1.85 !important; }
/* מצב: ניגודיות גבוהה */
html.a11y-contrast body { background: #000 !important; color: #fff !important; }
html.a11y-contrast .site-header, html.a11y-contrast .site-footer,
html.a11y-contrast .service-card, html.a11y-contrast .work-card,
html.a11y-contrast .contact-card, html.a11y-contrast .a11y-panel,
html.a11y-contrast .work-group, html.a11y-contrast .thumb,
html.a11y-contrast .wave-panel, html.a11y-contrast .band { background: #000 !important; color: #fff !important; border-color: #fff !important; }
html.a11y-contrast h1, html.a11y-contrast h2, html.a11y-contrast h3,
html.a11y-contrast h4, html.a11y-contrast p, html.a11y-contrast span,
html.a11y-contrast strong, html.a11y-contrast li, html.a11y-contrast .name b { color: #fff !important; -webkit-text-fill-color: #fff !important; }
html.a11y-contrast a:not(.btn), html.a11y-contrast .header-link { color: #ff0 !important; }
html.a11y-contrast .btn, html.a11y-contrast .work-tags li, html.a11y-contrast .out-chip { border: 1px solid #fff !important; }
html.a11y-contrast .btn-primary, html.a11y-contrast .a11y-btn { background: #ff0 !important; color: #000 !important; }
html.a11y-contrast .glow, html.a11y-contrast .hero-wave, html.a11y-contrast .band-track { opacity: .18 !important; }

/* שורת תחתית: זכויות יוצרים + הצהרת נגישות */
.foot-legal { margin-top: .55rem; display: flex; flex-direction: column; align-items: center; gap: .35rem; }
.foot-legal span { color: var(--muted-2); font-size: .82rem; }
.foot-legal a { color: var(--muted); font-size: .82rem; text-decoration: none; border-bottom: 1px solid transparent; transition: color .2s var(--ease); }
.foot-legal a:hover { color: var(--text); border-bottom-color: currentColor; }
html.a11y-contrast .foot-legal span { color: #fff !important; }
html.a11y-contrast .foot-legal a { color: #ff0 !important; }

/* ============ 18. פס עוגיות ============
   כרטיס קטן ממורכז למטה, מעל שני הכפתורים הצפים (וואטסאפ + נגישות) —
   לא נצמד לפינה כדי שלא יתנגש בהם. נעלם לצמיתות אחרי לחיצה (localStorage). */
.cookie-notice {
  position: fixed;
  z-index: 65;
  left: 50%;
  bottom: calc(clamp(16px, 4vw, 26px) + 68px);
  transform: translateX(-50%);
  width: min(94vw, 460px);
  background: var(--card);
  border: 1px solid var(--line);
  border-radius: 16px;
  padding: 1rem 1.15rem;
  box-shadow: 0 18px 50px -12px rgba(0, 0, 0, 0.6);
  display: flex;
  flex-direction: column;
  gap: .8rem;
}
.cookie-notice[hidden] { display: none; }
/* דהיית יציאה כשההודעה נעלמת מעצמה (או בלחיצה). ה-JS מסיר אותה מה-DOM
   אחרי המעבר, ובמצב "עצירת אנימציות" מדלג על הדהייה לגמרי. */
.cookie-notice.is-leaving {
  opacity: 0;
  transform: translate(-50%, 8px);
  transition: opacity .4s var(--ease), transform .4s var(--ease);
  pointer-events: none;
}
.cookie-notice p { color: var(--muted); font-size: .87rem; line-height: 1.6; }
.cookie-notice p a { color: var(--purple-glow); text-decoration: underline; text-underline-offset: 2px; }
.cookie-notice .cookie-ok {
  align-self: flex-end;
  padding: .6rem 1.5rem;
  font-size: .92rem;
  min-height: 40px;
}
@media (min-width: 560px) {
  .cookie-notice { flex-direction: row; align-items: center; }
  .cookie-notice .cookie-ok { align-self: center; flex: none; }
}
/* מרוחב הזה הכפתורים הצפים כבר צמודים לשוליים, אז הפס יכול לשבת בתחתית
   עצמה בלי להתנגש בהם — וכך הוא מסתיר פחות מהתוכן. */
@media (min-width: 760px) {
  .cookie-notice { bottom: clamp(16px, 4vw, 26px); width: min(90vw, 620px); }
}
html.a11y-contrast .cookie-notice { background: #000 !important; color: #fff !important; border-color: #fff !important; }
html.a11y-contrast .cookie-notice p { color: #fff !important; }
html.a11y-contrast .cookie-notice p a { color: #ff0 !important; }
