/* article-motion.css — Techindo article micro-motion v1 (20260930)
 *
 * TUJUAN: motion kecil yang bikin artikel enak diikutin (UX), BUKAN animasi pamer.
 * ATURAN KERAS:
 *   1. Cuma `transform` + `opacity` -> nggak menggeser layout (CLS aman), ringan di HP.
 *   2. Elemen disamarkan HANYA kalau class `js-motion` ada di <html> (dipasang oleh
 *      article-motion.js). Kalau JS gagal dimuat / dimatikan -> konten tetap kelihatan.
 *   3. `prefers-reduced-motion: reduce` = TIDAK ADA gerakan sama sekali (konten normal).
 *   4. Sekali jalan per elemen (JS unobserve), bukan ngulang tiap scroll.
 */

/* ---- state awal: hanya saat engine-nya aktif, dan hanya kalau BELUM di-reveal ----
   `:not(.is-in)` WAJIB: tanpa itu, selector 3-kelas (mis. .js-motion .art-steps .art-step
   atau .js-motion .article-body-content h2) mengalahkan rule reveal `.js-motion .is-in`
   (2 kelas) -> elemen dapat class is-in TAPI tetap opacity 0 alias invisible permanen. */
.js-motion .answer-box:not(.is-in),
.js-motion .article-body-content h2:not(.is-in),
.js-motion .art-steps .art-step:not(.is-in),
.js-motion .art-card-item:not(.is-in),
.js-motion .art-stat-item:not(.is-in),
.js-motion .art-warn-box:not(.is-in),
.js-motion .art-highlight-box:not(.is-in),
.js-motion .art-tip-box:not(.is-in),
.js-motion .founder-note:not(.is-in),
.js-motion .table-responsive:not(.is-in),
.js-motion .art-chart-wrap:not(.is-in),
.js-motion .art-source-card:not(.is-in),
.js-motion .art-prompt-list:not(.is-in) {
  opacity: 0;
  transform: translateY(10px);
}

/* ---- state muncul ---- */
.js-motion .is-in {
  opacity: 1;
  transform: none;
  transition: opacity 480ms ease, transform 480ms cubic-bezier(.2, .7, .2, 1);
}

/* garis penghubung `art-steps` "digambar" halus (kalau ada elemen garisnya) */
.js-motion .art-steps .art-step-line:not(.is-in),
.js-motion .art-step-line:not(.is-in) {
  transform: scaleY(0);
  transform-origin: top center;
}
.js-motion .art-step-line.is-in {
  transform: scaleY(1);
  transition: transform 520ms ease;
}

/* ---- SVG inline di dalam artikel (contoh: docs/contoh-svg-animasi.html) ----
   KENAPA di sini, bukan di dalam SVG: satu sumber untuk semua artikel, bisa di-gate,
   dan SVG konten tetap bersih dari <style> yang bikin HTML bengkak. SVG cukup bawa
   kelas: .art-svg-anim (penanda) + .svg-node/.svg-node-lbl/.svg-line + var --d. */
.js-motion .art-svg-anim:not(.is-in) .svg-node,
.js-motion .art-svg-anim:not(.is-in) .svg-node-lbl {
  opacity: 0;
  transform: translateY(8px);
}
.js-motion .art-svg-anim.is-in .svg-node {
  animation: svgNodeIn 520ms cubic-bezier(.2, .7, .2, 1) both;
  animation-delay: var(--d, 0s);
}
.js-motion .art-svg-anim.is-in .svg-node-lbl {
  animation: svgNodeIn 420ms ease both;
  animation-delay: var(--d, 0s);
}
.js-motion .art-svg-anim:not(.is-in) .svg-line {
  stroke-dasharray: 240;
  stroke-dashoffset: 240;
}
.js-motion .art-svg-anim.is-in .svg-line {
  animation: svgLineDraw 520ms ease forwards;
  animation-delay: var(--d, 0s);
}
@keyframes svgNodeIn {
  from { opacity: 0; transform: translateY(8px); }
  to   { opacity: 1; transform: none; }
}
@keyframes svgLineDraw {
  to { stroke-dashoffset: 0; }
}

/* ---- MASKOT TECHINDO "Robot Kotak" (lihat docs/maskot-techindo.html) ----
   MODE DIKUNCI 30 Sep 2026 = "loop jarang": gerak 1x tiap ~7 detik (delay 6s + durasi 0,8s),
   jadi kerasa hidup tanpa nemenin pembaca terus. Poses statis (netral/nunjuk) tetap diam.
   Semua tetap MATI TOTAL saat prefers-reduced-motion (engine-nya nggak jalan). */
.js-motion .art-svg-anim .m-body,
.js-motion .art-svg-anim .m-arm-l,
.js-motion .art-svg-anim .m-arm-r,
.js-motion .art-svg-anim .m-leg-l,
.js-motion .art-svg-anim .m-leg-r {
  transform-box: fill-box;
  transform-origin: 50% 6%;
}
.js-motion .art-svg-anim.is-in svg.pose-lambai .m-arm-r {
  animation: mShake 800ms ease-in-out 6s infinite;
}
.js-motion .art-svg-anim.is-in svg.pose-lambai .m-body,
.js-motion .art-svg-anim.is-in svg.pose-jalan .m-body {
  animation: mBob 800ms ease-in-out 6s infinite;
}
.js-motion .art-svg-anim.is-in svg.pose-jalan .m-leg-l,
.js-motion .art-svg-anim.is-in svg.pose-jalan .m-leg-r {
  animation: mStep 800ms ease-in-out 6s infinite;
  transform-origin: 50% 2%;
}
@keyframes mShake {
  0%, 100% { transform: rotate(2deg); }
  50%      { transform: rotate(-26deg); }
}
@keyframes mStep {
  0%, 100% { transform: rotate(9deg); }
  50%      { transform: rotate(-9deg); }
}
@keyframes mBob {
  0%, 100% { transform: translateY(0); }
  50%      { transform: translateY(-4px); }
}

/* ---- micro-interaction desktop (hover cuma di perangkat yang punya hover) ---- */
@media (hover: hover) and (pointer: fine) {
  .art-card-item,
  .art-stat-item,
  .related-card {
    transition: transform 180ms ease, box-shadow 180ms ease;
  }
  .js-motion .art-card-item.is-in:hover,
  .js-motion .art-stat-item.is-in:hover {
    transform: translateY(-2px);
  }
}

/* ---- aksesibilitas: matikan semuanya kalau user minta gerakan minimal ---- */
@media (prefers-reduced-motion: reduce) {
  .js-motion .answer-box,
  .js-motion .article-body-content h2,
  .js-motion .art-steps .art-step,
  .js-motion .art-card-item,
  .js-motion .art-stat-item,
  .js-motion .art-warn-box,
  .js-motion .art-highlight-box,
  .js-motion .art-tip-box,
  .js-motion .founder-note,
  .js-motion .table-responsive,
  .js-motion .art-chart-wrap,
  .js-motion .art-source-card,
  .js-motion .art-prompt-list {
    opacity: 1;
    transform: none;
    transition: none;
  }
  .js-motion .art-step-line { transform: none; }
  /* SVG inline: tanpa engine, SVG tampil utuh (nggak ada node tersembunyi) */
  .js-motion .art-svg-anim .svg-node,
  .js-motion .art-svg-anim .svg-node-lbl { opacity: 1; transform: none; animation: none; }
  .js-motion .art-svg-anim .svg-line { stroke-dashoffset: 0; animation: none; }
}
