{
  "schemaVersion": 1,
  "type": "resource",
  "id": "animejs",
  "evaluation": {
    "reviewedOn": "2026-10-19",
    "status": "checked",
    "modes": [
      "http",
      "browser",
      "local-fixture",
      "source-review"
    ],
    "summary": "Anime.js 4.5.0 passed seven local checks covering object and DOM interpolation, sequencing, revert, empty targets and explicit pause. Default animation still ran under reduced motion.",
    "reportUrl": "/design-evaluations/resource-animejs.json",
    "identity": {
      "target": "animejs",
      "version": "4.5.0",
      "integrity": "sha512-NQimYX+lz8WaXonGS9zVVoviCIAjONeJayxacUditaivYLqyXgGjFKjuyl0aUUhFKm5MriX9ty1TGovNzoJQWA=="
    },
    "environment": [
      "Chromium 155.0.8059.82 on Windows; fresh temporary profile and fresh account-free contexts.",
      "Public HTTPS GET/HEAD requests only; telemetry/auth routes and WebSockets blocked. No account storage or credential environment variables.",
      "Synthetic local inputs only. Package/skill source inspected before execution; no install lifecycle scripts run.",
      "Local package/CSS browser fixtures block real network. Variate additionally uses Node filesystem permissions and a no-network preload."
    ],
    "tests": [
      {
        "name": "Public document and DOM",
        "mode": "browser",
        "method": "Fresh Chromium GET, then inspect rendered controls after hydration delay",
        "result": "pass",
        "observation": "HTTP 200; 11 captured button labels; 3 inputs; 6 canvases."
      },
      {
        "name": "Object interpolation",
        "mode": "local-fixture",
        "method": "Seek a paused linear numeric animation at0/500/1000ms",
        "result": "pass",
        "observation": "[0, 50, 100]"
      },
      {
        "name": "Object revert",
        "mode": "local-fixture",
        "method": "Revert the numeric animation and inspect original value",
        "result": "pass",
        "observation": "{\"x\": 0}"
      },
      {
        "name": "Timeline sequencing",
        "mode": "local-fixture",
        "method": "Schedule two100ms animations and seek to150ms",
        "result": "pass",
        "observation": "{\"first\": 100, \"second\": 100}"
      },
      {
        "name": "DOM style interpolation",
        "mode": "local-fixture",
        "method": "Seek a synthetic box to50% of transform/opacity animation",
        "result": "pass",
        "observation": "{\"transform\": \"matrix(1, 0, 0, 1, 50, 0)\", \"opacity\": \"0.625\"}"
      },
      {
        "name": "DOM cleanup",
        "mode": "local-fixture",
        "method": "Revert DOM animation and inspect inline properties",
        "result": "pass",
        "observation": "{\"opacity\": \"0.25\", \"transform\": \"\"}"
      },
      {
        "name": "Empty-target handling",
        "mode": "local-fixture",
        "method": "Construct and revert paused animation with an empty target list",
        "result": "pass",
        "observation": "{\"accepted\": true}"
      },
      {
        "name": "Motion preference and pause",
        "mode": "local-fixture",
        "method": "Start synthetic default animation under reduced motion, then explicitly pause",
        "result": "pass",
        "observation": "{\"prefersReduced\": true, \"value\": 11, \"unchanged\": true}"
      }
    ],
    "security": {
      "scope": "Passive inspection of the public response headers, requested hosts and the named browser sample. Also inspected pinned source and the specified synthetic fixture outputs. No active exploitation, authenticated permissions test or complete security audit.",
      "findings": [
        {
          "level": "caution",
          "basis": "observed",
          "title": "The animation engine does not choose the motion policy",
          "detail": "The synthetic animation advanced while prefers-reduced-motion was reduce. Explicit pause stopped it; consumers must connect motion preferences to their own playback decisions."
        },
        {
          "level": "info",
          "basis": "observed",
          "title": "Inspected package and isolated run",
          "detail": "The pinned package declares no runtime dependencies; registry SHA512 matched. The synthetic browser fixture made zero outbound requests. This does not establish all possible package behavior."
        }
      ],
      "limits": [
        "No authenticated workspace, private content, production backend permissions or data-retention verification.",
        "No full engine audit, draggable/scroll/WebGL adapter test, framework lifecycle suite or physical-device performance measurement."
      ]
    },
    "practicalCaveats": [
      "Use scopes/revert or equivalent lifecycle cleanup, wire reduced motion deliberately, and measure the real page on slower devices.",
      "Pin and recheck the selected version or sample before adoption; the observations apply only to the scope and date shown."
    ],
    "limits": [
      "No full engine audit, draggable/scroll/WebGL adapter test, framework lifecycle suite or physical-device performance measurement.",
      "Fresh-browser restrictions can affect external assets and hydration. Initial failed selectors and limited probes remain in the evidence; they are not blanket product failures."
    ],
    "sources": [
      {
        "label": "Primary public resource",
        "url": "https://animejs.com/"
      },
      {
        "label": "Exact evaluated registry archive",
        "url": "https://registry.npmjs.org/animejs/-/animejs-4.5.0.tgz"
      }
    ]
  }
}
