{
 "$description": "Lansy brand tokens. The single source of values for agents and code. Format follows W3C Design Tokens (DTCG): every token has $value and $type. Rules for using them are in brand.md.",
 "$version": "2026-10-15",
 "color": {
  "brand": {
   "primary-light": {
    "$type": "color",
    "$value": "#9CDE45",
    "$description": "Lime. Fills: buttons, highlight plates, a live dot in the interface (never in the dotted pictures). Text on it: color.neutral.ink.",
    "on": "#201F1D"
   },
   "primary-dark": {
    "$type": "color",
    "$value": "#33694F",
    "$description": "Dark green. Accent text on white, dark plates. Text on it: #FFFFFF.",
    "on": "#FFFFFF"
   }
  },
  "neutral": {
   "$description": "Warm greys of one temperature: OKLCH hue 85°, chroma 0.0086 (taken from sand and paper), slightly less chroma in the darks. Never use cool or pure greys.",
   "ink": {
    "$type": "color",
    "$value": "#201F1D",
    "$description": "Text, dark buttons, the logo on light backgrounds."
   },
   "dark": {
    "$type": "color",
    "$value": "#2A2926",
    "$description": "Dark surfaces."
   },
   "text-2": {
    "$type": "color",
    "$value": "#75736F",
    "$description": "Leads and secondary text. 4.7:1 on white."
   },
   "grey": {
    "$type": "color",
    "$value": "#8D8A86",
    "$description": "Mono labels only. 3.4:1 on white: never for body text."
   },
   "line": {
    "$type": "color",
    "$value": "#E9E6E0",
    "$description": "Rules and outlines."
   },
   "sand": {
    "$type": "color",
    "$value": "#F2EFE9",
    "$description": "Cards, plates, the warm end of every surface gradient."
   },
   "paper": {
    "$type": "color",
    "$value": "#FCF9F3",
    "$description": "Light surfaces."
   },
   "white": {
    "$type": "color",
    "$value": "#FFFFFF",
    "$description": "Page background."
   }
  }
 },
 "gradient": {
  "floor": {
   "$type": "gradient",
   "$value": "linear-gradient(180deg, #F2EFE9 0%, #FCF9F3 60%, #FFFFFF 100%)",
   "$description": "A whole section (hero, roles): sand at the top, through paper, into white."
  },
  "card": {
   "$type": "gradient",
   "$value": "linear-gradient(180deg, #F2EFE9 0%, #FCF9F3 100%)",
   "$description": "A card. If the card holds a picture, the sand end sits next to it."
  }
 },
 "font": {
  "family": {
   "sans": {
    "$type": "fontFamily",
    "$value": "Struve",
    "$description": "Everything: headings, body, buttons. Three weights only: 400, 500, 600. No bold, no italic. Files: fonts/Struve-{Regular,Medium,Semibold}.woff2."
   },
   "mono": {
    "$type": "fontFamily",
    "$value": "JetBrains Mono",
    "$description": "Labels only: weight 500, uppercase, letter-spacing 0.06em, 11–12px. Google Fonts."
   },
   "arabic": {
    "$type": "fontFamily",
    "$value": "IBM Plex Sans Arabic",
    "$description": "Arabic text only (Struve has no Arabic); Latin inside stays Struve. Weights 400–600. Google Fonts."
   },
   "marker": {
    "$type": "fontFamily",
    "$value": "Supermarker",
    "$description": "The marker phrase only, italic only: Struve 400 takes Italic, 500 Medium Italic, 600 Bold Italic. Never alone, never scaled, English only. Files: fonts/Supermarker-*.woff2. See brand.md → Marker."
   }
  }
 },
 "typography": {
  "$description": "Sizes in px. Each style gives desktop and phone (≤ 900px) sizes. Letter-spacing in em.",
  "h1": {
   "size": {
    "desktop": 72,
    "phone": 40
   },
   "weight": 500,
   "lineHeight": 1.04,
   "letterSpacing": -0.025,
   "use": "The hero headline only, one per page."
  },
  "h2": {
   "size": {
    "desktop": 56,
    "phone": 34
   },
   "weight": {
    "desktop": 400,
    "phone": 600
   },
   "lineHeight": 1.08,
   "letterSpacing": -0.015,
   "use": "Section headings."
  },
  "manifesto": {
   "size": {
    "desktop": 46,
    "phone": 24
   },
   "weight": 400,
   "lineHeight": 1.18,
   "letterSpacing": -0.015,
   "use": "Large statement text."
  },
  "title": {
   "size": {
    "desktop": 24,
    "phone": 24
   },
   "weight": 600,
   "lineHeight": 1.25,
   "letterSpacing": -0.01,
   "use": "Card titles, CTA headings."
  },
  "lead": {
   "size": {
    "desktop": 18,
    "phone": 17
   },
   "weight": 400,
   "lineHeight": 1.5,
   "color": "#75736F",
   "use": "The lead under a heading."
  },
  "body": {
   "size": {
    "desktop": 17,
    "phone": 17
   },
   "weight": [
    400,
    500,
    600
   ],
   "lineHeight": 1.5,
   "use": "Body text, buttons."
  },
  "small": {
   "size": {
    "desktop": 15,
    "phone": 15
   },
   "weight": [
    400,
    500
   ],
   "lineHeight": 1.45,
   "use": "Captions, badges, legal."
  },
  "label": {
   "size": {
    "desktop": 12,
    "phone": 12
   },
   "weight": 500,
   "family": "mono",
   "case": "uppercase",
   "letterSpacing": 0.06,
   "lineHeight": 1.6,
   "color": "#8D8A86",
   "use": "Labels."
  }
 },
 "radius": {
  "card": {
   "$type": "dimension",
   "$value": "24px"
  },
  "swatch": {
   "$type": "dimension",
   "$value": "20px"
  },
  "pill": {
   "$type": "dimension",
   "$value": "999px",
   "$description": "Buttons, chips, the top bar."
  }
 },
 "logo": {
  "minHeight": {
   "$type": "dimension",
   "$value": "24px",
   "$description": "Measured on the mark: the mark is at least 24px tall, alone or inside the full logo. The full logo's box is then at least 27.2px tall (the mark is 120 of its 136 units; the y descends below it)."
  },
  "clearSpace": {
   "$value": "0.5 × mark height on every side",
   "$description": "Proposal, not yet approved."
  },
  "markShareOfLogoHeight": {
   "$value": 0.8823529411764706,
   "$description": "The mark's height divided by the full logo's height."
  }
 },
 "pen": {
  "$description": "The broad-nib pen that draws every blob and the marker's line. Shares are of the drawn shape's height unless said otherwise.",
  "width": {
   "$value": 0.27,
   "$description": "Nib width, share of the shape's height."
  },
  "thickness": {
   "$value": 0.12,
   "$description": "Nib thickness, share of its width."
  },
  "roundness": {
   "$value": 8,
   "$description": "Superellipse exponent of the nib outline."
  },
  "angle": {
   "$value": "35deg"
  },
  "endLean": {
   "$value": "45deg",
   "$description": "How far an end cut may lean from square toward the pen angle."
  },
  "smoothing": {
   "$value": 0.5
  }
 },
 "marker": {
  "$description": "Supermarker Italic phrase inside Struve; see brand.md → Marker.",
  "lineThickness": {
   "$value": [
    0.55,
    0.7
   ],
   "$description": "Share of the type size."
  },
  "lineCentre": {
   "$value": "0.14em",
   "$description": "Above the baseline."
  },
  "lineOverhang": {
   "$value": "0.1em"
  },
  "lineColour": {
   "onLight": "#9CDE45",
   "onLime": "#FFFFFF",
   "onDark": null
  }
 },
 "dots": {
  "$description": "The dotted pictures; see brand.md → Dots. Pixels at 1×: scale them with the layout.",
  "size": {
   "$value": "2.4px",
   "$description": "Dot diameter, the same in every picture."
  },
  "pitchLine": {
   "$value": "7px",
   "$description": "Between dots along a line."
  },
  "pitchSurface": {
   "$value": "9px",
   "$description": "Between dots across a surface."
  },
  "colour": {
   "onLight": "#201F1D",
   "onDark": "#FFFFFF",
   "onLime": "#33694F",
   "$description": "One colour per picture; depth by alpha only."
  }
 },
 "3d": {
  "$description": "The 3D renders; see brand.md → 3D.",
  "glassTransmission": {
   "$value": 0.8
  },
  "limeTarget": {
   "$value": "#9CDE45",
   "$description": "A lime render is measured to land on it."
  },
  "brushing": {
   "$value": 0.4,
   "$description": "Anisotropy of the brushed aluminium."
  },
  "iconStroke": {
   "$value": 2.4,
   "$description": "Hugeicons stroke on the 24 grid, for the 3D tubes. A flat icon next to text takes a stroke as heavy as the letters beside it."
  },
  "turn": {
   "$value": "5s",
   "$description": "The Lansy turn at 30 fps; curve in 3d/lansy_spin_curve.json."
  },
  "swirl": {
   "$value": "6s",
   "$description": "The coin-ring swirl: the Lansy turn, coin after coin; seamless loop at 30 fps."
  }
 },
 "post": {
  "$description": "The square post; see brand.md → Square post. Shares are of the square's side.",
  "margin": {
   "$value": 0.06
  },
  "headline": {
   "large": {
    "$value": 0.15,
    "$description": "When every line fits between the margins."
   },
   "regular": {
    "$value": 0.11,
    "$description": "Otherwise, or on purpose when the picture leads."
   },
   "weight": 500,
   "lineHeight": 1.0,
   "letterSpacing": -0.025
  },
  "logoBox": {
   "$value": 0.05,
   "$description": "Logo box height, on the edge opposite the headline."
  },
  "site": {
   "$value": 0.03,
   "$description": "lansy.ai, Struve 500, on the logo's baseline."
  }
 }
}
