{
  "about": "An entry of UpFork's ledger. Check it by hand as https://upfork.dev/docs/ledger says, or at https://upfork.dev/verify/E-27",
  "entry": {
    "seq": 27,
    "kind": "lesson-version",
    "record": "{\"ai\":{\"apps\":[\"Claude\"],\"models\":[\"Claude Opus 5.5\"]},\"article\":\"how-to-build-a-live-logistics-dashboard-a-simulated-fleet-maplibre-and-one-s\",\"articleRevision\":1,\"assumed\":\"a short entrance animation (opacity plus `translateY`) on a cluster marker's element was harmless.\",\"author\":{\"account\":\"a_9d470b566acab5f65bdc\",\"handle\":\"ramin-valadan\"},\"evidence\":\"Wayline commit 4a8798c (\\\"Animate the inside only\\\" in app/globals.css, clusters keyed by members in components/map/fleet-map.tsx).\",\"fix\":\"never animate the marker's own element; animate a child (`.wl-cluster span`). And key clusters by their members, so a stable group keeps its marker instead of being rebuilt — and re-animated — twice a second.\",\"happened\":\"every cluster sat in the map's top-left corner instead of over its vehicles. Its style attribute still said `transform: translate(-50%, -50%) translate(805px, 368px)`, but it was drawn at 0,0. A pulsing \\\"next stop\\\" ring that animated `transform: scale()` did the same.\",\"kind\":\"not-in-docs\",\"learnedBy\":\"ai\",\"lesson\":\"L-W26C\",\"packages\":\"maplibre-gl@6.15\",\"product\":\"nextjs-logistics-fleet-management-template\",\"productRevision\":null,\"publishedAt\":\"2026-10-26T08:10:31.656Z\",\"site\":\"https://upfork.dev\",\"title\":\"A CSS animation on a MapLibre marker's element pins the marker to the map's top-left corner\",\"type\":\"lesson-version\",\"url\":\"https://upfork.dev/lessons/L-W26C\",\"version\":1,\"why\":\"MapLibre positions a marker by writing `transform` on the element you give it. An animation that animates `transform` (with fill mode `both`) overrides it for as long as it applies.\"}",
    "recordHash": "09952566f038bb87778dceba876e6ff8304b1e7babcbc691c5666f376c70fd2a",
    "prevHash": "5aa8bdce43e0a1e3986aa6a833a164ce644e82e5588e3ad3aafe196367193822",
    "entryHash": "67a6edfd3df053ac393563569abf6d3cd40afb6b8cc9c37ac0203644e6343a55",
    "keyId": "k1",
    "signature": "cArmVu9ub2WS2nYwUYPmWMh/K9OSDfsWmZ1gLFZjzkOSXHJ0ur1YjQ8qbhsVjfPQq9/m8W1hMUeu/4zLnJZgBQ==",
    "recordedAt": "2026-10-26T08:11:08.867326+00:00",
    "publicKey": "VuHuHXAtO3XAqgnwvMenp0f/3vTV061hnAIizYvwh40=",
    "algorithm": "Ed25519"
  },
  "path": [],
  "checkpoint": null,
  "keys": "https://upfork.dev/ledger/keys.json"
}