/* guide-extras.css — reusable, professional interactive components for the /guides hub.
   Loaded on every guide (after guides.css). All classes prefixed .wsb-. No floating/clipped
   tooltips: interactive detail always renders IN FLOW below the controls, so it works on touch,
   keyboard, and never gets cut off. Motion is restrained + transform-only + reduced-motion-safe. */

/* ---------- figure shell ---------- */
.wsb-fig{margin:26px 0;padding:22px 20px;border:1px solid var(--line);border-radius:16px;
  background:linear-gradient(180deg,#fff,#fcfbf7)}
.wsb-eyebrow{display:inline-block;font-size:11px;font-weight:700;letter-spacing:.07em;text-transform:uppercase;
  color:var(--accent2);background:#efeafe;padding:4px 11px;border-radius:999px;margin-bottom:14px}
.wsb-cap{font-size:13.5px;color:var(--muted);margin:14px auto 0;max-width:52ch;line-height:1.5}
.wsb-hint{font-size:12px;color:var(--hint);margin-top:10px}

/* entrance: transform-only + JS-gated → content is never hidden (no-JS, paused tab, reduced-motion all safe) */
.wsb-js .wsb-fig{animation:wsb-in .5s ease both}
@keyframes wsb-in{from{transform:translateY(12px)}to{transform:none}}

/* ---------- sentence anatomy (interactive word blocks) ---------- */
.wsb-anat-row{display:flex;gap:10px;justify-content:center;flex-wrap:wrap}
.wsb-block{position:relative;font:inherit;cursor:pointer;text-align:center;padding:14px 16px 12px;
  border-radius:13px;background:#fff;border:1px solid var(--line2);min-width:104px;
  transition:transform .15s ease,box-shadow .15s ease,border-color .15s ease}
.wsb-block::before{content:"";position:absolute;left:14px;right:14px;top:8px;height:4px;border-radius:4px;background:var(--_c,#c9c3f5)}
.wsb-block.r1{--_c:#8f88f5}.wsb-block.r2{--_c:#37b89a}.wsb-block.r3{--_c:#f0a24a}
.wsb-block .wsb-jp{display:block;font-size:22px;font-weight:700;color:var(--ink);margin-top:8px;line-height:1.2}
.wsb-block .wsb-role{display:block;font-size:11px;font-weight:600;letter-spacing:.03em;text-transform:uppercase;color:var(--muted);margin-top:6px}
.wsb-block:hover{transform:translateY(-2px);box-shadow:0 10px 22px -14px rgba(60,45,20,.5)}
.wsb-block.on{border-color:var(--accent);box-shadow:0 0 0 3px rgba(91,84,230,.14)}
.wsb-anat-detail{margin:16px auto 0;max-width:440px;background:#fff;border:1px solid var(--line);border-radius:12px;
  padding:14px 16px;text-align:left;min-height:88px}
.wsb-d-role{font-size:11px;font-weight:700;letter-spacing:.05em;text-transform:uppercase;color:var(--accent2)}
.wsb-d-jp{font-size:20px;font-weight:700;margin:4px 0 2px}
.wsb-d-rom{font-size:14px;font-weight:400;color:var(--hint)}
.wsb-d-gloss{font-size:14.5px;color:var(--muted)}

/* ---------- chip explorer (replaces floating tooltips) ---------- */
.wsb-chips{display:flex;gap:9px;justify-content:center;flex-wrap:wrap}
.wsb-chip{font:inherit;cursor:pointer;font-size:19px;font-weight:700;color:var(--ink);
  min-width:52px;padding:11px 14px;border-radius:12px;background:#fff;border:1px solid var(--line2);
  transition:transform .14s ease,border-color .14s ease,background .14s ease,color .14s ease}
.wsb-chip .wsb-sub{display:block;font-size:11px;font-weight:600;color:var(--hint);margin-top:3px}
.wsb-chip:hover{transform:translateY(-2px);border-color:var(--accent)}
.wsb-chip.on{background:linear-gradient(160deg,var(--accent),var(--accent2));color:#fff;border-color:transparent;
  box-shadow:0 10px 22px -12px rgba(91,84,230,.6)}
.wsb-chip.on .wsb-sub{color:rgba(255,255,255,.85)}
.wsb-panel{margin:16px auto 0;max-width:460px;background:#fff;border:1px solid var(--line);border-radius:12px;
  padding:15px 17px;text-align:left;min-height:92px}
.wsb-panel-title{font-size:16.5px;font-weight:700;color:var(--ink)}
.wsb-panel-body{font-size:14.5px;color:var(--muted);margin-top:5px;line-height:1.55}
.wsb-panel-ex{font-size:15px;margin-top:10px;padding-top:10px;border-top:1px dashed var(--line2);color:var(--ink)}
.wsb-panel-ex b{color:var(--accent2)}

/* ---------- flipper (two-state cross-fade, e.g. word order) ---------- */
.wsb-flip{text-align:center}
.wsb-flip-stack{display:grid;min-height:76px;place-items:center}
.wsb-row{grid-area:1/1;display:flex;gap:9px;align-items:center;flex-wrap:wrap;justify-content:center;
  transition:opacity .45s ease,transform .45s ease}
.wsb-row.b{opacity:0;transform:translateY(10px)}
.wsb-flip.flip .wsb-row.a{opacity:0;transform:translateY(-10px)}
.wsb-flip.flip .wsb-row.b{opacity:1;transform:none}
.wsb-tok{padding:10px 13px;border-radius:11px;background:#fff;border:1px solid var(--line2);font-weight:600;font-size:16px;line-height:1.25}
.wsb-tok small{display:block;font-weight:400;color:var(--muted);font-size:11px}
.wsb-tok.hl{background:#efeafe;border-color:#c9c3f5;color:var(--accent2);box-shadow:0 0 0 3px rgba(91,84,230,.12)}
.wsb-sep{color:var(--hint);font-size:17px}

/* ---------- toggle (swap one value, e.g. politeness) ---------- */
.wsb-word{display:inline-block;font-size:30px;font-weight:700;color:var(--accent2);min-width:150px;
  transition:transform .26s ease,opacity .26s ease}
.wsb-word.flipping{transform:rotateX(85deg);opacity:0}

/* ---------- compare cards (e.g. は vs が) ---------- */
.wsb-compare{display:grid;grid-template-columns:1fr 1fr;gap:14px}
.wsb-card{padding:16px;border-radius:14px;border:1px solid var(--line);background:#fff;text-align:left}
.wsb-card.accent{border-color:#d9d3f7;background:linear-gradient(180deg,#faf9ff,#fff)}
.wsb-card h4{margin:8px 0 6px;font-size:16px}
.wsb-card .wsb-jpx{font-size:20px;margin:2px 0}
@media(max-width:560px){.wsb-compare{grid-template-columns:1fr}}

/* ---------- shared button ---------- */
.wsb-btn{margin-top:16px;font:inherit;font-size:14px;font-weight:600;padding:10px 18px;border-radius:999px;
  border:1px solid var(--line2);background:#fff;color:var(--accent2);cursor:pointer;
  transition:transform .15s ease,border-color .15s ease,box-shadow .15s ease}
.wsb-btn:hover{transform:translateY(-1px);border-color:var(--accent);box-shadow:0 8px 18px -10px rgba(91,84,230,.5)}
.wsb-btn:focus-visible,.wsb-block:focus-visible,.wsb-chip:focus-visible{outline:2px solid var(--accent);outline-offset:2px}

/* ---------- neko-sensei sign-off ---------- */
.wsb-sensei{display:flex;gap:14px;align-items:flex-start;margin:28px 0 6px;padding:16px 18px;border-radius:16px;
  background:#efeafe;border:1px solid #d9d3f7}
.wsb-sensei svg{width:56px;height:56px;flex:none}
.wsb-sensei .wsb-bubble{background:#fff;border:1px solid var(--line);border-radius:14px;border-top-left-radius:4px;
  padding:11px 14px;font-size:14.5px;color:var(--ink);line-height:1.55}
.wsb-paw{transform-box:fill-box;transform-origin:bottom center;animation:wsb-wave 1.9s ease-in-out infinite}
@keyframes wsb-wave{0%,100%{transform:rotate(3deg)}50%{transform:rotate(-15deg)}}

/* ---------- 🔊 voice button (reuses the study app's read-aloud idea) ---------- */
.wsb-say{display:inline-flex;align-items:center;justify-content:center;vertical-align:middle;
  width:25px;height:25px;margin-left:7px;padding:0;border-radius:8px;border:1px solid var(--line2);
  background:#fff;color:var(--accent2);cursor:pointer;transition:transform .15s ease,border-color .15s ease,color .15s ease}
.wsb-say:hover{border-color:var(--accent);color:var(--accent);transform:translateY(-1px)}
.wsb-say:focus-visible{outline:2px solid var(--accent);outline-offset:2px}
.wsb-say svg{width:14px;height:14px;fill:currentColor}

/* ---------- interactive check (calm data-driven mini-quiz) ---------- */
.wsb-quiz{text-align:left}
.wsb-q-count{font-size:11px;font-weight:700;letter-spacing:.07em;text-transform:uppercase;color:var(--hint)}
.wsb-q-q{font-size:15px;color:var(--muted);margin:6px 0 0}
.wsb-q-prompt{font-size:26px;font-weight:700;color:var(--ink);margin:7px 0 3px;line-height:1.4}
.wsb-q-blank{display:inline-block;min-width:1.05em;text-align:center;color:var(--hint);
  border-bottom:3px solid var(--line2);margin:0 .05em}
.wsb-q-blank.filled{color:var(--_q,var(--ink));border-bottom-color:var(--_q,var(--ink))}
.wsb-q-rom{font-size:14px;color:var(--muted);margin:2px 0 1px}
.wsb-q-rom b{color:var(--accent);font-weight:700}
.wsb-q-en{font-size:14px;color:var(--muted);margin:0 0 15px}
.wsb-q-reveal{display:flex;align-items:center;gap:8px;font-size:14px;color:var(--muted);margin:14px 0 2px}
.wsb-q-reveal b{color:var(--accent);font-weight:700}
.wsb-q-reveal[hidden]{display:none}
.wsb-q-opts{display:flex;gap:10px;flex-wrap:wrap}
.wsb-q-opt{font:inherit;font-weight:700;font-size:22px;cursor:pointer;min-width:62px;padding:11px 16px;
  border-radius:12px;border:1.5px solid var(--line2);background:#fff;color:var(--ink);
  transition:transform .12s ease,border-color .15s ease,color .15s ease,background .15s ease}
/* particle/answer colour stays in the site palette: indigo accent for options, teal = correct, red = wrong.
   (No second hue per particle — the label は/が/に/で already distinguishes them; keeps the sober format.) */
.wsb-q-opt.p1,.wsb-q-opt.p2{--_q:var(--accent)} .wsb-q-opt.p3{--_q:var(--hint)}
.wsb-q-blank.p1,.wsb-q-blank.p2{--_q:var(--accent)} .wsb-q-blank.p3{--_q:var(--hint)}
.wsb-q-opt:hover:not(:disabled){transform:translateY(-2px);border-color:var(--_q);color:var(--_q)}
.wsb-q-opt:disabled{cursor:default;opacity:.9}
.wsb-q-opt.right{border-color:var(--teal);background:#eaf7f2;color:var(--teal)}
.wsb-q-opt.wrong{border-color:#c1443a;background:#fceceb;color:#c1443a}
.wsb-q-fb{min-height:1.3em;margin:15px 0 2px;font-size:14.5px;color:var(--muted);line-height:1.6}
.wsb-q-fb.good b{color:var(--teal)} .wsb-q-fb.bad b{color:#c1443a}
.wsb-q-nav{margin-top:6px}
.wsb-q-nav .wsb-btn{margin-top:8px}

/* ---------- on-answer concept flourish (owner-requested, ported from the standalone artifact) ----------
   One small ~90×60 inline SVG injected into .wsb-q-anim when a question is answered. Recoloured to the
   site palette (indigo --accent / teal), transform+opacity keyframes only, ≤500ms, never gates the Next
   button. で → a spotlight "stage" blooms; に → a "pin" drops; else a gentle ✓ pulse on a correct answer.
   Each shape's resting look lives here so that with reduced motion (animations off) it renders end-state. */
.wsb-q-anim{margin:12px 0 2px}
.wsb-q-anim:empty{display:none}
.wsb-anim-svg{display:block;width:90px;height:60px}
/* で — indigo spotlight blooms under the subject */
.wsb-anim-stage .beam{fill:var(--accent);opacity:.12}
.wsb-anim-stage .pool{fill:var(--accent);opacity:.22}
.wsb-anim-stage .subj{fill:var(--accent)}
.wsb-anim-stage .beam,.wsb-anim-stage .pool,.wsb-anim-stage .subj{transform-box:fill-box}
.wsb-anim-stage .beam{transform-origin:center top;animation:wsb-beam .42s ease-out both}
.wsb-anim-stage .pool{transform-origin:center;animation:wsb-bloom .46s cubic-bezier(.22,.9,.3,1) both}
.wsb-anim-stage .subj{transform-origin:center;animation:wsb-pop .42s cubic-bezier(.34,1.56,.64,1) .08s both}
@keyframes wsb-beam{from{transform:scaleY(.4);opacity:0}to{transform:scaleY(1);opacity:.12}}
@keyframes wsb-bloom{from{transform:scale(.3);opacity:0}to{transform:scale(1);opacity:.22}}
@keyframes wsb-pop{from{transform:scale(0)}60%{transform:scale(1.18)}to{transform:scale(1)}}
/* に — teal pin drops onto a point with a small squash on impact */
.wsb-anim-pin .spot{fill:var(--teal);opacity:.18}
.wsb-anim-pin .pin path{fill:var(--teal)}
.wsb-anim-pin .spot,.wsb-anim-pin .pin{transform-box:fill-box}
.wsb-anim-pin .pin{transform-origin:center bottom;animation:wsb-drop .5s cubic-bezier(.3,.9,.4,1) both}
.wsb-anim-pin .spot{transform-origin:center;animation:wsb-spot .34s ease-out .16s both}
@keyframes wsb-drop{0%{transform:translateY(-40px)}62%{transform:translateY(0)}76%{transform:translateY(0) scaleY(.84)}100%{transform:translateY(0) scaleY(1)}}
@keyframes wsb-spot{from{transform:scale(.2);opacity:0}to{transform:scale(1);opacity:.18}}
/* other guides — a gentle ✓ pulse when correct */
.wsb-anim-check .ring{fill:none;stroke:var(--teal);stroke-width:2.2;opacity:.4}
.wsb-anim-check .tick{fill:none;stroke:var(--teal);stroke-width:3;stroke-linecap:round;stroke-linejoin:round}
.wsb-anim-check .chk{transform-box:fill-box;transform-origin:center;animation:wsb-checkpulse .44s cubic-bezier(.34,1.56,.64,1) both}
@keyframes wsb-checkpulse{from{transform:scale(.5);opacity:0}70%{transform:scale(1.1);opacity:1}to{transform:scale(1)}}

@media (prefers-reduced-motion:reduce){
  .wsb-fig,.wsb-block,.wsb-chip,.wsb-row,.wsb-word,.wsb-btn,.wsb-paw,.wsb-say,.wsb-q-opt{animation:none!important;transition:none!important}
  .wsb-row.b{opacity:1}
  .wsb-anim-svg *{animation:none!important}   /* jump straight to the drawn end-state */
}
