{
  "$description": "Lifty brand tokens (W3C DTCG 2025.10). Source: brand/tokens/ in the Lifty repo.",
  "color": {
    "$type": "color",
    "primary": {
      "$description": "The four primary colours. The logo may only be coloured in these, or black / white where colour is impossible.",
      "mountain-teal": {
        "$value": {
          "colorSpace": "srgb",
          "components": [
            0.0784,
            0.1725,
            0.1882
          ],
          "hex": "#142C30"
        },
        "$description": "Confidence, clarity and structure. Dark panels, ink on light grounds.",
        "$extensions": {
          "ski.lifty": {
            "name": "Mountain Teal",
            "rgb": "20, 44, 48",
            "cmyk": "89, 62, 61, 62",
            "share": 30,
            "status": "final",
            "code": {
              "ios": "Brand.alpine",
              "android": "LiftyBrand.alpine"
            }
          }
        }
      },
      "electric-orange": {
        "$value": {
          "colorSpace": "srgb",
          "components": [
            1,
            0.3294,
            0.1216
          ],
          "hex": "#FF541F"
        },
        "$description": "Energy, excitement and personality. Fills, CTAs, the mark. Never small text on a light ground (use extension.orange-ink).",
        "$extensions": {
          "ski.lifty": {
            "name": "Electric Orange",
            "rgb": "255, 84, 31",
            "cmyk": "0, 87, 100, 0",
            "share": 30,
            "status": "final",
            "code": {
              "ios": "Brand.orange",
              "android": "LiftyBrand.sunset"
            }
          }
        }
      },
      "icy-mint": {
        "$value": {
          "colorSpace": "srgb",
          "components": [
            0.6431,
            0.9098,
            0.8706
          ],
          "hex": "#A4E8DE"
        },
        "$description": "Fresh, playful contrast. Accents on teal and burgundy; teal or burgundy text on it.",
        "$extensions": {
          "ski.lifty": {
            "name": "Icy Mint",
            "rgb": "164, 232, 222",
            "cmyk": "38, 0, 19, 0",
            "share": 15,
            "status": "final",
            "code": {
              "ios": "Brand.iceMint",
              "android": "LiftyBrand.mint"
            }
          }
        }
      },
      "deep-burgundy": {
        "$value": {
          "colorSpace": "srgb",
          "components": [
            0.298,
            0.098,
            0.1647
          ],
          "hex": "#4C192A"
        },
        "$description": "Grounded depth. Hero panels; off-white, mint or orange display text on it.",
        "$extensions": {
          "ski.lifty": {
            "name": "Deep Burgundy",
            "rgb": "76, 25, 42",
            "cmyk": "45, 91, 59, 57",
            "share": 15,
            "status": "final",
            "code": {
              "ios": "Brand.plum",
              "android": "LiftyBrand.plum"
            }
          }
        }
      }
    },
    "secondary": {
      "off-white": {
        "$value": {
          "colorSpace": "srgb",
          "components": [
            0.9765,
            0.9765,
            0.9686
          ],
          "hex": "#F9F9F7"
        },
        "$description": "Breathing room. Light grounds and text on dark panels.",
        "$extensions": {
          "ski.lifty": {
            "name": "Off White",
            "rgb": "249, 249, 247",
            "cmyk": "2, 1, 2, 0",
            "share": 10,
            "status": "final",
            "code": {
              "ios": "Brand.cream (#F7F5EC, to be replaced)",
              "android": "LiftyBrand.cream (#F7F5EC, to be replaced)"
            }
          }
        }
      }
    },
    "extension": {
      "$description": "Digital extensions (decided 2026-10-27): screen-only shades that keep the palette readable. Each has one job; never use them in print or as a brand colour in their own right. Hexes await designer confirmation.",
      "orange-ink": {
        "$value": {
          "colorSpace": "srgb",
          "components": [
            0.749,
            0.2275,
            0.0431
          ],
          "hex": "#BF3A0B"
        },
        "$description": "Orange text, links and small icons on light grounds (white, off-white). Electric Orange there is 3.2:1 and fails body-text contrast.",
        "$extensions": {
          "ski.lifty": {
            "name": "Orange Ink",
            "status": "proposed",
            "code": {
              "ios": "Brand.accentInk (light)",
              "android": "LiftyTheme.colors.sunsetInk"
            }
          }
        }
      },
      "teal-lifted": {
        "$value": {
          "colorSpace": "srgb",
          "components": [
            0.1647,
            0.3176,
            0.3412
          ],
          "hex": "#2A5157"
        },
        "$description": "Mountain Teal in dark mode. #142C30 vanishes on a dark ground (#1C1C1E).",
        "$extensions": {
          "ski.lifty": {
            "name": "Lifted Teal",
            "status": "proposed",
            "code": {
              "ios": "SettingsTileGroup.alpineTile (dark)"
            }
          }
        }
      },
      "burgundy-lifted": {
        "$value": {
          "colorSpace": "srgb",
          "components": [
            0.4784,
            0.1804,
            0.2745
          ],
          "hex": "#7A2E46"
        },
        "$description": "Deep Burgundy in dark mode. #4C192A reads as a hole on a dark ground.",
        "$extensions": {
          "ski.lifty": {
            "name": "Lifted Burgundy",
            "status": "proposed",
            "code": {
              "ios": "SettingsTileGroup.plumTile (dark)"
            }
          }
        }
      },
      "contour": {
        "$value": {
          "colorSpace": "srgb",
          "components": [
            0.1176,
            0.2549,
            0.2784
          ],
          "hex": "#1E4147"
        },
        "$description": "Topographic contour lines drawn over Mountain Teal.",
        "$extensions": {
          "ski.lifty": {
            "name": "Contour",
            "status": "proposed",
            "code": {
              "ios": "Brand.contour",
              "android": "LiftyBrand.contour"
            }
          }
        }
      },
      "snow-blue": {
        "$value": {
          "colorSpace": "srgb",
          "components": [
            0.2392,
            0.498,
            0.8784
          ],
          "hex": "#3D7FE0"
        },
        "$description": "New snow, forecasts and alerts in the app.",
        "$extensions": {
          "ski.lifty": {
            "name": "Snow Blue",
            "status": "proposed",
            "code": {
              "ios": "Brand.snowBlue"
            }
          }
        }
      }
    },
    "piste": {
      "$description": "Slope difficulty. Follow each resort's or region's classification; always pair with a label or icon.",
      "easy": {
        "$value": {
          "colorSpace": "srgb",
          "components": [
            0.6471,
            0.8275,
            0.4745
          ],
          "hex": "#A5D379"
        },
        "$extensions": {
          "ski.lifty": {
            "name": "Easy Green",
            "rgb": "165, 211, 121",
            "cmyk": "43, 0, 76, 0",
            "status": "final"
          }
        }
      },
      "moderate": {
        "$value": {
          "colorSpace": "srgb",
          "components": [
            0.3647,
            0.5608,
            0.9098
          ],
          "hex": "#5D8FE8"
        },
        "$extensions": {
          "ski.lifty": {
            "name": "Moderate Blue",
            "rgb": "93, 143, 232",
            "cmyk": "66, 39, 0, 0",
            "status": "final"
          }
        }
      },
      "difficult": {
        "$value": {
          "colorSpace": "srgb",
          "components": [
            0.8667,
            0.149,
            0.149
          ],
          "hex": "#DD2626"
        },
        "$extensions": {
          "ski.lifty": {
            "name": "Moderate - Difficult Red",
            "rgb": "221, 38, 38",
            "cmyk": "0, 100, 100, 0",
            "status": "final"
          }
        }
      },
      "expert": {
        "$value": {
          "colorSpace": "srgb",
          "components": [
            0.098,
            0.098,
            0.098
          ],
          "hex": "#191919"
        },
        "$extensions": {
          "ski.lifty": {
            "name": "Difficult Black",
            "rgb": "25, 25, 25",
            "cmyk": "73, 67, 65, 79",
            "status": "final"
          }
        }
      }
    },
    "signal": {
      "$description": "Warnings and information. Never colour alone: always with an icon or words.",
      "danger": {
        "$value": "{color.piste.difficult}",
        "$extensions": {
          "ski.lifty": {
            "name": "Danger",
            "rgb": "221, 38, 38",
            "cmyk": "0, 100, 100, 0",
            "status": "final"
          }
        }
      },
      "warning": {
        "$value": {
          "colorSpace": "srgb",
          "components": [
            1,
            0.6078,
            0.3412
          ],
          "hex": "#FF9B57"
        },
        "$extensions": {
          "ski.lifty": {
            "name": "Warning",
            "rgb": "255, 155, 87",
            "cmyk": "0, 52, 77, 0",
            "status": "final"
          }
        }
      },
      "caution": {
        "$value": {
          "colorSpace": "srgb",
          "components": [
            0.9882,
            0.8745,
            0.3961
          ],
          "hex": "#FCDF65"
        },
        "$extensions": {
          "ski.lifty": {
            "name": "Caution",
            "rgb": "252, 223, 101",
            "cmyk": "0, 10, 82, 0",
            "status": "final"
          }
        }
      },
      "safe": {
        "$value": "{color.piste.easy}",
        "$extensions": {
          "ski.lifty": {
            "name": "Safe / first aid",
            "rgb": "165, 211, 121",
            "cmyk": "43, 0, 76, 0",
            "status": "final"
          }
        }
      },
      "mandatory": {
        "$value": "{color.piste.moderate}",
        "$extensions": {
          "ski.lifty": {
            "name": "Mandatory instructions",
            "rgb": "93, 143, 232",
            "cmyk": "66, 39, 0, 0",
            "status": "final"
          }
        }
      }
    },
    "neutral": {
      "$description": "Only where the logo cannot be printed in brand colour, or for accessibility in digital use.",
      "black": {
        "$value": {
          "colorSpace": "srgb",
          "components": [
            0,
            0,
            0
          ],
          "hex": "#000000"
        },
        "$extensions": {
          "ski.lifty": {
            "name": "Black",
            "status": "final"
          }
        }
      },
      "white": {
        "$value": {
          "colorSpace": "srgb",
          "components": [
            1,
            1,
            1
          ],
          "hex": "#FFFFFF"
        },
        "$extensions": {
          "ski.lifty": {
            "name": "White",
            "status": "final"
          }
        }
      }
    }
  },
  "gradient": {
    "$type": "gradient",
    "mixed": {
      "$value": [
        {
          "color": "#C8FFF9",
          "position": 0
        },
        {
          "color": "#0E3A44",
          "position": 0.35
        },
        {
          "color": "{color.primary.deep-burgundy}",
          "position": 0.65
        },
        {
          "color": "{color.primary.electric-orange}",
          "position": 1
        }
      ],
      "$description": "Mixed Gradient: icy cyan through teal and burgundy to orange, diagonal. Stops are read off the PDF swatch; the designer to confirm.",
      "$extensions": {
        "ski.lifty": {
          "name": "Mixed Gradient",
          "angle": 150,
          "status": "proposed"
        }
      }
    }
  },
  "font": {
    "family": {
      "$type": "fontFamily",
      "display": {
        "$value": [
          "Coolvetica",
          "Poppins",
          "system-ui",
          "sans-serif"
        ],
        "$description": "Primary typeface. Display and headlines only: short lines, never body copy.",
        "$extensions": {
          "ski.lifty": {
            "name": "Coolvetica",
            "role": "Display, headings",
            "licence": "Typodermic free desktop licence: static use only. Webfont and app licences not bought yet."
          }
        }
      },
      "decorative": {
        "$value": [
          "Jorude",
          "Poppins",
          "system-ui",
          "sans-serif"
        ],
        "$description": "Decorative typeface. Expressive headlines, stickers and playful moments; always uppercase.",
        "$extensions": {
          "ski.lifty": {
            "name": "Jorude",
            "role": "Expressive headlines",
            "licence": "Unknown: delivered without a licence file."
          }
        }
      },
      "body": {
        "$value": [
          "Poppins",
          "system-ui",
          "sans-serif"
        ],
        "$description": "Supporting typeface. Body copy, app navigation, labels, information.",
        "$extensions": {
          "ski.lifty": {
            "name": "Poppins",
            "role": "Body, info, paragraphs, labels",
            "licence": "SIL Open Font License 1.1"
          }
        }
      }
    },
    "weight": {
      "$type": "fontWeight",
      "light": {
        "$value": 300,
        "$description": "Poppins Light: large body, quiet captions."
      },
      "regular": {
        "$value": 400,
        "$description": "Poppins Regular: body copy."
      },
      "medium": {
        "$value": 500,
        "$description": "Poppins Medium: emphasis, labels."
      },
      "bold": {
        "$value": 700,
        "$description": "Poppins Bold: buttons, subheads."
      }
    }
  },
  "type": {
    "ratio": {
      "$type": "number",
      "subhead-to-headline": {
        "$value": 0.33,
        "$description": "A subheadline is no larger than 33% of the headline's ascender height."
      },
      "body-to-subhead": {
        "$value": 0.5,
        "$description": "Body copy is no larger than 50% of the subheadline's cap height."
      }
    }
  }
}
