/* ============================================================
   know'dz bots (kzb) — shared lane library, v1.0
   Extracted from bots/prototype.html (owner-approved 2026-08-28).
   Namespaces: .kzb-* / [data-kzb]. No frameworks. Inline SVG +
   CSS keyframes + vanilla JS. Respects prefers-reduced-motion.
   Bots are decorative: without JS, mounts render nothing and
   layout is unaffected. Hidden on print (investor deck).
   ============================================================ */

.kzb{position:relative;display:inline-block;line-height:0}
.kzb svg{display:block;overflow:visible}
.kzb .kz-body{fill:rgba(16,21,19,.92);stroke:rgba(255,255,255,.16);stroke-width:2}
.kzb .kz-screen{fill:#060b09;stroke:rgba(255,255,255,.12);stroke-width:1.5}
.kzb .kz-eye{fill:#0a1410}
.kzb .kz-pupil{fill:#57ff9a;transition:transform .07s linear}
.kzb .kz-ant{stroke:#9fb0a4;stroke-width:3;stroke-linecap:round}
.kzb .kz-tip{fill:#57ff9a}
.kzb .kz-foot{fill:#9fb0a4;opacity:.5}
.kzb .kz-mouth{fill:none;stroke:#e8efe9;stroke-width:2.5;stroke-linecap:round}
.kzb .kz-face{animation:kzb-blink 5.5s infinite;transform-origin:center;transform-box:fill-box}
@keyframes kzb-blink{0%,92%,100%{transform:scaleY(1)}95%{transform:scaleY(.08)}}
.kzb .kz-ping{fill:none;stroke:#57ff9a;stroke-width:2;opacity:0;pointer-events:none}
@keyframes kzb-ping{0%{r:4;opacity:.9}100%{r:40;opacity:0}}
.kzb .kz-pinging .kz-ping{animation:kzb-ping 1.6s ease-out infinite}
.kzb .kz-wide .kz-pupil{transform:scale(1.45) !important}
@keyframes kzb-squash{0%{transform:scale(1,1)}35%{transform:scale(1.08,.86)}70%{transform:scale(.96,1.05)}100%{transform:scale(1,1)}}
.kzb .kz-squashed{animation:kzb-squash .45s cubic-bezier(.2,1.4,.4,1)}
.kzb-cap{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:11.5px;color:#9fb0a4;letter-spacing:.08em;margin-top:8px;min-height:1.4em;text-align:center;transition:color .3s;line-height:1.4}
.kzb-cap.hot{color:#57ff9a}

/* ---------- ping (ambient node) ---------- */
.kzb-ping .kz-stage{position:relative}

/* ---------- pair (LOAM + PLANN -> DUO) ---------- */
.kzb-pair .kz-stage{position:relative;display:flex;justify-content:center;gap:56px;padding-top:46px}
.kzb-pair .kz-lane{transition:transform 1.1s cubic-bezier(.6,0,.2,1),opacity .8s}
.kzb-pair .kz-holo{position:absolute;top:0;left:50%;transform:translateX(-50%);background:rgba(107,208,255,.07);border:1px solid rgba(107,208,255,.35);border-radius:10px;padding:9px 13px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:10.5px;line-height:1.7;color:#6bd0ff;min-width:185px;box-shadow:0 0 24px rgba(107,208,255,.12);animation:kzb-holo-float 4s ease-in-out infinite;white-space:nowrap}
@keyframes kzb-holo-float{0%,100%{transform:translateX(-50%) translateY(0)}50%{transform:translateX(-50%) translateY(-5px)}}
.kzb-pair .kz-holo .kz-hrow{display:flex;gap:8px;justify-content:space-between}
.kzb-pair .kz-holo .kz-hrow b{color:#e8efe9;font-weight:500}
@keyframes kzb-rescramble{0%{opacity:0;transform:translateY(3px)}100%{opacity:1;transform:none}}
.kzb-pair .kz-hrow.swap{animation:kzb-rescramble .35s ease}
.kzb-pair .kz-holo.off{animation:none;opacity:.45;border-style:dashed}
.kzb-pair .kz-duo{position:absolute;left:50%;top:52%;transform:translate(-50%,-50%);opacity:0;pointer-events:none;transition:opacity .7s .25s}
.kzb-pair.combined .kz-lane{opacity:0;pointer-events:none}
.kzb-pair.combined .kz-lane.left{transform:translateX(90px)}
.kzb-pair.combined .kz-lane.right{transform:translateX(-90px)}
.kzb-pair.combined .kz-duo{opacity:1}
@keyframes kzb-poof{0%{opacity:0;transform:scale(.4)}40%{opacity:1}100%{opacity:0;transform:scale(1.6)}}
.kzb-pair.combined .kz-poof{animation:kzb-poof 1s ease-out .15s both}
.kzb-pair .kz-poof{position:absolute;color:#57ff9a;font-size:20px;opacity:0}
.kzb-pair .kz-planbang{font-family:ui-monospace,monospace;font-size:20px;font-weight:700;fill:#ffc46b;opacity:0}

/* ---------- seed (excellence mascot + scroll plant) ---------- */
.kzb-seed .kz-seedwrap{position:relative;width:340px;height:330px;margin:0 auto}
.kzb-seed .kz-plant{position:absolute;bottom:26px;left:50%;transform:translateX(-50%);width:300px;height:290px;overflow:visible}
.kzb-seed .kz-stem{stroke:#2e8f58;stroke-width:7;fill:none;stroke-linecap:round}
.kzb-seed .kz-leaf{transform-box:fill-box;transform:scale(0);transition:transform .7s cubic-bezier(.2,1.4,.4,1)}
.kzb-seed .kz-leaf.on{transform:scale(1)}
.kzb-seed .kz-fruit{transform-box:fill-box;transform-origin:center;transform:scale(0);transition:transform .6s cubic-bezier(.2,1.8,.4,1)}
.kzb-seed .kz-fruit.on{transform:scale(1)}
.kzb-seed .kz-fruit circle{fill:#ffc46b}
.kzb-seed .kz-fruit text{font-family:ui-monospace,monospace;font-size:11px;fill:#e8efe9}
.kzb-seed .kz-fruit.star circle{fill:#57ff9a}
.kzb-seed .kz-fruit.star text{fill:#0c1210}
@keyframes kzb-ripe{0%,100%{transform:scale(1)}50%{transform:scale(1.15)}}
.kzb-seed .kz-fruit.ripe{animation:kzb-ripe 1.6s ease-in-out infinite}
.kzb-seed .kz-walker{position:absolute;bottom:0;left:6%;width:80px;animation:kzb-waddle .8s ease-in-out infinite}
@keyframes kzb-waddle{0%,100%{transform:rotate(0deg)}25%{transform:translateX(3px) rotate(2deg)}75%{transform:translateX(-3px) rotate(-2deg)}}
.kzb-seed .kz-seeddrop{position:absolute;bottom:22px;left:50%;width:9px;height:9px;border-radius:50%;background:#ffc46b;transform:translateX(-50%);opacity:0}
@keyframes kzb-drop{0%{opacity:0;transform:translateX(-50%) translateY(-8px)}100%{opacity:1;transform:translateX(-50%)}}
.kzb-seed .kz-seeddrop.dropped{animation:kzb-drop .4s ease both}
.kzb-seed .kz-cap{position:absolute;bottom:0;left:0;right:0;text-align:center}

/* ---------- hum (the chorus — one dot per node) ---------- */
.kzb-hum .kz-grid{display:grid;grid-template-columns:repeat(12,1fr);gap:8px;width:300px;margin:14px auto 0}
.kzb-hum .kz-dot{width:100%;aspect-ratio:1;border-radius:50%;background:rgba(255,255,255,.04);border:1px solid rgba(255,255,255,.14);transition:background .3s,transform .3s,border-color .3s,box-shadow .3s;cursor:pointer}
.kzb-hum .kz-dot.blip{background:#57ff9a;transform:scale(1.25);border-color:#57ff9a;box-shadow:0 0 14px rgba(87,255,154,.5)}
.kzb-hum .kz-dot.lost{background:transparent;border-style:dashed;opacity:.5}
.kzb-hum .kz-dot.heal{background:#ffc46b;border-color:#ffc46b}
.kzb-hum .kz-stats{margin-top:12px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:11px;color:#9fb0a4;letter-spacing:.12em;display:flex;gap:18px;justify-content:center;flex-wrap:wrap;line-height:1.6}
.kzb-hum .kz-stats b{color:#e8efe9;font-weight:500}

/* compact hero variant (floating corner bot) */
.kzb-mini{position:absolute;opacity:.96;pointer-events:auto}
.kzb-mini .kz-cap{display:none}

/* quiet hero sprite (ambient scenes, e.g. landing background) */
.kzb-sprite{pointer-events:none;display:inline-block;line-height:0}
.kzb-sprite svg{display:block;overflow:visible}

@media (prefers-reduced-motion:reduce){
  .kzb *,.kzb *::before,.kzb *::after{animation:none !important;transition:none !important}
  .kzb-seed .kz-stem{stroke-dashoffset:0 !important}
  .kzb-seed .kz-leaf,.kzb-seed .kz-fruit{transform:scale(1)}
}
@media print{
  .kzb{display:none !important}
}
@media (max-width:640px){
  .kzb-pair .kz-stage{gap:24px;padding-top:40px}
  .kzb-pair .kz-holo{min-width:150px;font-size:9.5px}
  .kzb-seed .kz-seedwrap{width:280px;height:300px}
  .kzb-hum .kz-grid{width:240px}
}
