{
  "capability": "motion",
  "version": 1,
  "generated_from": "round_zero/site/twopage_src/glee-motion.css",
  "ratified": false,
  "what_are_you": "The canonical GLEE motion vocabulary. Primitives describe MEANING, not transforms: select by interaction intent, never by which transform looks nice.",
  "how_do_i_invoke": {
    "web_site": "<link rel=\"stylesheet\" href=\"/glee-motion.css\">, then add the class",
    "platform_worker": "served automatically by styleBaseCss(); add the class",
    "magnitude_registers": "add \"gm-subtle\" or \"gm-emphatic\" alongside a primitive to change how loudly the meaning is said, never which meaning it is"
  },
  "what_can_i_do": [
    {
      "name": "gm-camera",
      "meaning": "the world moved, you did not",
      "invoke": "add class \"gm-camera\" to the element",
      "documented": true
    },
    {
      "name": "gm-drag-pickup",
      "meaning": "you are now holding it and the surface has let go",
      "invoke": "add class \"gm-drag-pickup\" to the element",
      "documented": true
    },
    {
      "name": "gm-dragging",
      "meaning": "it is following your hand exactly",
      "invoke": "add class \"gm-dragging\" to the element",
      "documented": true
    },
    {
      "name": "gm-drop-settle",
      "meaning": "it has landed and committed",
      "invoke": "add class \"gm-drop-settle\" to the element",
      "documented": true
    },
    {
      "name": "gm-enter",
      "meaning": "this arrived — a new state, not a new position",
      "invoke": "add class \"gm-enter\" to the element",
      "documented": true
    },
    {
      "name": "gm-exit",
      "meaning": "this is gone — and it left faster than it came",
      "invoke": "add class \"gm-exit\" to the element",
      "documented": true
    },
    {
      "name": "gm-expand",
      "meaning": "there is more of this, in place, without leaving",
      "invoke": "add class \"gm-expand\" to the element",
      "documented": true
    },
    {
      "name": "gm-focus-ring",
      "meaning": "the keyboard is here now (position unchanged, on purpose)",
      "invoke": "add class \"gm-focus-ring\" to the element",
      "documented": true
    },
    {
      "name": "gm-hover-lift",
      "meaning": "this surface is interactable and comes toward you",
      "invoke": "add class \"gm-hover-lift\" to the element",
      "documented": true
    },
    {
      "name": "gm-hover-object",
      "meaning": "this is a discrete thing you can pick up and move",
      "invoke": "add class \"gm-hover-object\" to the element",
      "documented": true
    },
    {
      "name": "gm-hover-tint",
      "meaning": "this is interactable but stays put — you are in a list",
      "invoke": "add class \"gm-hover-tint\" to the element",
      "documented": true
    },
    {
      "name": "gm-pending",
      "meaning": "work is happening and the outcome is not known yet",
      "invoke": "add class \"gm-pending\" to the element",
      "documented": true
    },
    {
      "name": "gm-press",
      "meaning": "your input was received, at the instant it was received",
      "invoke": "add class \"gm-press\" to the element",
      "documented": true
    },
    {
      "name": "gm-progress",
      "meaning": "work is happening and this much of it is done",
      "invoke": "add class \"gm-progress\" to the element",
      "documented": true
    },
    {
      "name": "gm-route-in",
      "meaning": "you are somewhere new",
      "invoke": "add class \"gm-route-in\" to the element",
      "documented": true
    },
    {
      "name": "gm-selectable",
      "meaning": "you have chosen this one; it has not moved",
      "invoke": "add class \"gm-selectable\" to the element",
      "documented": true
    }
  ],
  "what_happens": {
    "--gm-instant": "80ms",
    "--gm-quick": "140ms",
    "--gm-standard": "280ms",
    "--gm-slow": "450ms",
    "--gm-ease-precise": "cubic-bezier(0.2, 0, 0.1, 1)",
    "--gm-ease-alive": "cubic-bezier(0.23, 1, 0.32, 1)",
    "--gm-ease-exit": "cubic-bezier(0.4, 0, 1, 1)",
    "--gm-lift-subtle": "-2px",
    "--gm-lift": "-3px",
    "--gm-lift-emphatic": "-6px",
    "--gm-scale-up-subtle": "1.006",
    "--gm-scale-up": "1.015",
    "--gm-scale-up-emphatic": "1.022",
    "--gm-nudge": "2px",
    "--gm-rise": "6px",
    "--gm-scale-down": "0.985",
    "--gm-scale-pickup": "1.02",
    "--gm-shadow-rest": "0 0 0 rgba(0,0,0,0)",
    "--gm-shadow-subtle": "0 4px 12px rgba(0,0,0,0.45)",
    "--gm-shadow-lift": "0 10px 28px rgba(0,0,0,0.55)",
    "--gm-shadow-emphatic": "0 20px 52px rgba(0,0,0,0.6)",
    "--gm-shadow-drag": "0 18px 44px rgba(0,0,0,0.65)"
  },
  "limits": {
    "constraints": [
      "ONE TRANSFORM OWNER. A primitive sets `transform` wholesale. Never put",
      "THE ANCESTOR OWNS THE LIFT. If a card lifts on hover, nothing inside it",
      "HOVER NEVER CHANGES OPACITY. Fading on hover reads as a state change.",
      "FOCUS NEVER MOVES ANYTHING. Keyboard focus draws a ring; it does not",
      "EXITS ARE FASTER THAN ENTRANCES. Entering explains; leaving gets out of"
    ],
    "channels_that_count_as_inventing_motion": [
      "transform: on an interactive state",
      "the standalone scale: / translate: / rotate: properties",
      "transitioning layout geometry (width/height/top/left) to fake a scale",
      "JS assigning style.transform / style.scale / inline transitions at commit time"
    ],
    "reduced_motion": "displacement is removed, not merely shortened; .gm-dragging is exempt so drag carry keeps tracking the pointer",
    "adding_a_primitive": "prototype on /motion/, get it judged, add it here with its contract, then use it"
  },
  "how_do_i_prove_i_used_you_correctly": {
    "specimen": "/motion/",
    "lint": "./glee.sh ship lint  (rule MOTION_PRIMITIVE_CANON) — blocks on a stale descriptor, an undocumented primitive, or a missing evidence pointer",
    "publication": "round_zero/ops/verify_capability_publication.py --base-url <origin> — A1-A7: page reachable, JSON parseable, JSON identical to freshly generated output, staleness fails closed, ratified state public, backup restore-and-rebuild drill, estate lint green"
  }
}
