{
 "$meta": {
  "name": "chaotic-pendulums",
  "version": "1.4.3",
  "note": "Semantic tokens for screen work. Assets bake literal hex on purpose; tokens are for UI chrome, not for rewiring the SVGs."
 },
 "color": {
  "brand": {
   "ink": {
    "value": "#15181C",
    "use": "the fork; primary text on light"
   },
   "light": {
    "value": "#E3E6EA",
    "use": "the fork on dark; primary text on dark"
   },
   "bronze": {
    "value": "#A87A3C",
    "use": "the blade. Grounds, large display type, rules, chart fills, foil. NEVER an interface state -- not hover, focus, success or error"
   },
   "bronze-deep": {
    "value": "#8D6732",
    "on": "#F2F3F5",
    "contrast": 4.59,
    "requires": 4.5,
    "use": "bronze where it must carry text on paper: links, body, small labels"
   },
   "bronze-lift": {
    "value": "#AD7D3E",
    "on": "#15181C",
    "contrast": 4.9,
    "requires": 4.5,
    "use": "the same, reversed on ink. On the RAISED ground it measures 3.98 -- there it is the 3:1 large-text class only"
   },
   "paper": {
    "value": "#F2F3F5",
    "use": "the light page ground"
   }
  },
  "light": {
   "surface": {
    "page": {
     "value": "#F2F3F5",
     "use": "page background"
    },
    "card": {
     "value": "#FFFFFF",
     "use": "raised: cards, figures, tables"
    },
    "recessed": {
     "value": "#E7E9EC",
     "use": "sunken: code, pre, wells"
    },
    "dark-block": {
     "value": "#15181C",
     "use": "demo blocks that carry dark-ground assets"
    }
   },
   "text": {
    "primary": {
     "value": "#15181C",
     "on": "#F2F3F5",
     "contrast": 16.04,
     "requires": 7.0,
     "use": "headings, emphasis"
    },
    "body": {
     "value": "#39404A",
     "on": "#F2F3F5",
     "contrast": 9.43,
     "requires": 7.0,
     "use": "running text"
    },
    "secondary": {
     "value": "#5D6673",
     "on": "#F2F3F5",
     "contrast": 5.23,
     "requires": 4.5,
     "use": "captions, secondary, any text size"
    },
    "muted-large": {
     "value": "#6E7783",
     "on": "#F2F3F5",
     "contrast": 4.09,
     "requires": 3.0,
     "use": "3:1 class ONLY: >=24 px, or >=18.7 px bold, and the drawn .COM"
    }
   },
   "border": {
    "hairline": {
     "value": "#D3D7DC",
     "use": "rules, card edges; no contrast requirement"
    },
    "strong": {
     "value": "#848C97",
     "on": "#F2F3F5",
     "contrast": 3.06,
     "requires": 3.0,
     "use": "input boundaries, meaningful edges"
    }
   },
   "interactive": {
    "link": {
     "value": "#335993",
     "on": "#F2F3F5",
     "contrast": 6.32,
     "requires": 4.5,
     "use": "link text (blueprint blue)"
    },
    "link-hover": {
     "value": "#2A4B7C",
     "on": "#F2F3F5",
     "contrast": 7.89,
     "requires": 4.5,
     "use": "hover/active link text"
    },
    "focus-ring": {
     "value": "#3660A1",
     "on": "#F2F3F5",
     "contrast": 5.66,
     "requires": 3.0,
     "use": "2px ring, 2px offset"
    },
    "selection": {
     "value": "#D7DEEA",
     "use": "text selection (accent 20% over paper)"
    },
    "disabled": {
     "value": "#6E7783",
     "opacity": 0.55,
     "use": "disabled text/controls; exempt from AA"
    }
   },
   "state": {
    "success": {
     "value": "#437165",
     "on": "#F2F3F5",
     "contrast": 4.99,
     "requires": 4.5,
     "use": "success text; icon may use #4A7E70. Verdigris kept its jobs through the repaint -- it means MOTION and LIVE, which is physical, not an interface state"
    },
    "error": {
     "value": "#642B30",
     "on": "#F2F3F5",
     "contrast": 9.8,
     "requires": 4.5,
     "use": "error text and icons. Chosen on luminance: a red-brown at bronze's own lightness sits 8.6 dE from it under deuteranopia, this one 25.9"
    },
    "live": {
     "value": "#4A7E70",
     "use": "live/in-motion indicator (verdigris)"
    }
   }
  },
  "dark": {
   "surface": {
    "page": {
     "value": "#15181C",
     "use": "page background; dark assets are drawn for this"
    },
    "card": {
     "value": "#242A32",
     "use": "raised (the tile-raised ground)"
    }
   },
   "text": {
    "primary": {
     "value": "#E3E6EA",
     "on": "#15181C",
     "contrast": 14.22,
     "requires": 7.0,
     "use": "headings"
    },
    "body": {
     "value": "#AEB6C0",
     "on": "#15181C",
     "contrast": 8.69,
     "requires": 7.0,
     "use": "running text"
    },
    "secondary": {
     "value": "#8B94A0",
     "on": "#15181C",
     "contrast": 5.8,
     "requires": 4.5,
     "use": "captions, secondary"
    }
   },
   "border": {
    "hairline": {
     "value": "#39414B",
     "use": "rules, card edges"
    },
    "strong": {
     "value": "#6D7683",
     "on": "#15181C",
     "contrast": 3.87,
     "requires": 3.0,
     "use": "input boundaries"
    }
   },
   "interactive": {
    "link": {
     "value": "#8FB2E6",
     "on": "#15181C",
     "contrast": 8.21,
     "requires": 4.5,
     "use": "blueprint blue, lifted for ink"
    },
    "link-hover": {
     "value": "#A9C4EC",
     "on": "#15181C",
     "contrast": 10.0,
     "requires": 4.5,
     "use": "hover/active"
    },
    "focus-ring": {
     "value": "#8FB2E6",
     "on": "#15181C",
     "contrast": 8.21,
     "requires": 3.0,
     "use": "2px ring, 2px offset"
    },
    "selection": {
     "value": "#22303F",
     "use": "text selection (accent 30% over the dark page)"
    },
    "disabled": {
     "value": "#8B94A0",
     "opacity": 0.55,
     "use": "disabled; exempt from AA"
    }
   },
   "state": {
    "success": {
     "value": "#5C9D8B",
     "on": "#15181C",
     "contrast": 5.64,
     "requires": 4.5,
     "use": "success text -- verdigris lifted, because the dark page is #15181C and not black: plain #4A7E70 measures 3.82 there and 3.44 on the raised card"
    },
    "error": {
     "value": "#DDA398",
     "on": "#15181C",
     "contrast": 8.28,
     "requires": 4.5,
     "use": "error text on ink. The palette proposal had #BA6D74 here, which measures contrast 1.00 against bronze and dE 2.9 under tritanopia -- indistinguishable from the blade. This one is 1.77 and 15.1, and clears 4.5 on the raised card too"
    },
    "live": {
     "value": "#5C9D8B",
     "use": "live/in-motion indicator"
    }
   }
  }
 },
 "font": {
  "family": {
   "display": {
    "value": "'CPText','TeX Gyre Heros','Nimbus Sans',ui-sans-serif,system-ui,sans-serif"
   },
   "condensed": {
    "value": "'CPCond','TeX Gyre Heros Cn','Nimbus Sans Narrow','Arial Narrow',sans-serif"
   }
  },
  "weight": {
   "regular": {
    "value": 400
   },
   "bold": {
    "value": 700
   },
   "$note": "the family ships two weights; 'Medium' does not exist and CSS 500 silently renders 400"
  },
  "figures": {
   "$note": "all four cuts carry fully tabular figures (one advance for all ten digits: 456/1000 cn, 556/1000 display, measured). No mono is needed for numeric columns."
  },
  "scale": {
   "display": {
    "size": 34,
    "line": 39,
    "tracking": "-0.012em",
    "family": "display",
    "weight": 400
   },
   "heading": {
    "size": 21,
    "line": 26,
    "tracking": "-0.01em",
    "family": "display",
    "weight": 400
   },
   "body": {
    "size": 16,
    "line": 26,
    "tracking": "0",
    "family": "display",
    "weight": 400
   },
   "caption": {
    "size": 13.5,
    "line": 21,
    "tracking": "0",
    "family": "display",
    "weight": 400
   },
   "label": {
    "size": 12,
    "line": 17,
    "tracking": "+0.20em",
    "family": "condensed",
    "weight": 700,
    "transform": "uppercase"
   },
   "$fluid": "display may fluid-scale: clamp(28px, 24px + 1.2vw, 34px); body and below stay fixed"
  },
  "measure": {
   "value": "74ch",
   "use": "max paragraph width (the pack's own .lead/.note measure)"
  }
 },
 "space": {
  "1": 4,
  "2": 8,
  "3": 12,
  "4": 16,
  "5": 24,
  "6": 32,
  "7": 48,
  "8": 64,
  "9": 96,
  "$unit": "px",
  "$note": "4px base; the page uses 12/16/18/28 gutters -- snap to this scale"
 },
 "radius": {
  "control": 3,
  "card": 5,
  "block": 6,
  "tile": "22%",
  "$note": "22% is the tile's own corner (SPEC s4); small radii echo the R3 corner break"
 },
 "border-width": {
  "hairline": 1,
  "focus": 2
 },
 "elevation": {
  "$policy": "NO SHADOWS. A machined part reads by edge, not by blur: elevation is a ground shift (page->card) plus a hairline border. The whole pack ships zero box-shadow today; keep it that way."
 },
 "motion": {
  "duration": {
   "hover": "120ms",
   "state": "200ms",
   "layout": "320ms",
   "brand-unfold": "4.6s"
  },
  "easing": {
   "smooth": "cubic-bezier(0.33, 0, 0.67, 1)",
   "$note": "smoothstep equivalent -- what unfold_poses() uses. No bounce, no overshoot: only real physics (the JS assets) is allowed to swing past its target."
  },
  "$rules": [
   "prefers-reduced-motion: replace cp-live/cp-scroll with the static mark; SMIL loops may keep running only if they are decorative and small",
   "joined motion must match velocity at the join (Hermite), never ease from a standstill mid-sequence"
  ]
 },
 "breakpoint": {
  "narrow": 640,
  "content": 1020,
  "rail": 1340,
  "$note": "1020 is the content max-width; the scroll rail appears above 1340"
 }
}