{
  "$schema": "https://design-tokens.github.io/community-group/format/",
  "metadata": {
    "name": "Paydot Active Dot",
    "version": "0.8.0",
    "status": "pre-release-artwork-validation",
    "updated": "2026-08-11",
    "notes": "Every foreground/background pair in color.feedback and color.action is contrast-verified. Light content clears 4.5:1 on its own surface and accents clear the 3:1 non-text floor. Do not edit a value without re-running the palette check."
  },
  "color": {
    "brand": {
      "electricBlue": { "$type": "color", "$value": "#2C43E6" },
      "electricBlueStrong": { "$type": "color", "$value": "#1C31B8" },
      "electricBlueSoft": { "$type": "color", "$value": "#E7EAFF" },
      "electricBlueOnDark": {
        "$type": "color",
        "$value": "#8794FF",
        "$description": "Action, focus and selection on Ink and other dark surfaces. Base Electric Blue is 2.69:1 on Ink and must never be used there."
      },
      "coral": { "$type": "color", "$value": "#FD4631" },
      "coralStrong": { "$type": "color", "$value": "#C5281B" },
      "coralSoft": { "$type": "color", "$value": "#FFE5E1" }
    },
    "neutral": {
      "ink": { "$type": "color", "$value": "#12131A" },
      "inkRaised": {
        "$type": "color",
        "$value": "#1A1B24",
        "$description": "Raised surface on an Ink page. The only elevation step in the system."
      },
      "mutedInk": { "$type": "color", "$value": "#625B57" },
      "divider": { "$type": "color", "$value": "#E4DDD6" },
      "soft": { "$type": "color", "$value": "#F3EEE9" },
      "canvas": { "$type": "color", "$value": "#FBF8F4" },
      "white": { "$type": "color", "$value": "#FFFFFF" }
    },
    "action": {
      "primary": { "$type": "color", "$value": "{color.brand.electricBlue}" },
      "onPrimary": { "$type": "color", "$value": "{color.neutral.white}" },
      "primaryHover": { "$type": "color", "$value": "{color.brand.electricBlueStrong}" },
      "primaryOnDark": { "$type": "color", "$value": "{color.brand.electricBlueOnDark}" },
      "onPrimaryOnDark": { "$type": "color", "$value": "{color.neutral.ink}" },
      "primaryOnBrand": {
        "$type": "color",
        "$value": "{color.brand.coral}",
        "$description": "The one place Coral is an action: a primary button sitting on an Electric Blue surface, where a blue button cannot exist. Ink label, 5.38:1."
      },
      "onPrimaryOnBrand": { "$type": "color", "$value": "{color.neutral.ink}" }
    },
    "focus": {
      "onLight": {
        "$type": "color",
        "$value": "{color.brand.electricBlue}",
        "$description": "6.50:1 on Canvas. Focus is always blue — never Coral."
      },
      "onDark": { "$type": "color", "$value": "{color.brand.electricBlueOnDark}" },
      "ringWidth": { "$type": "dimension", "$value": { "value": 3, "unit": "px" } },
      "ringOffset": { "$type": "dimension", "$value": { "value": 3, "unit": "px" } }
    },
    "feedback": {
      "light": {
        "success": {
          "surface": { "$type": "color", "$value": "#C9F6D8" },
          "content": { "$type": "color", "$value": "#075D32" },
          "accent": { "$type": "color", "$value": "#0E8F4E" }
        },
        "warning": {
          "surface": { "$type": "color", "$value": "#FFE8A3" },
          "content": { "$type": "color", "$value": "#5E3A00" },
          "accent": { "$type": "color", "$value": "#A66A00" }
        },
        "error": {
          "surface": { "$type": "color", "$value": "#FFDAD6" },
          "content": { "$type": "color", "$value": "#7A1220" },
          "accent": { "$type": "color", "$value": "#C0182B" }
        },
        "info": {
          "surface": { "$type": "color", "$value": "#DCE2FF" },
          "content": { "$type": "color", "$value": "#1B2A8F" },
          "accent": { "$type": "color", "$value": "#2C43E6" }
        },
        "neutral": {
          "surface": { "$type": "color", "$value": "#F3EEE9" },
          "content": { "$type": "color", "$value": "#4A443F" },
          "accent": { "$type": "color", "$value": "#625B57" }
        }
      },
      "dark": {
        "success": {
          "surface": { "$type": "color", "$value": "#12482C" },
          "content": { "$type": "color", "$value": "#A8E9C2" },
          "accent": { "$type": "color", "$value": "#4FC98A" }
        },
        "warning": {
          "surface": { "$type": "color", "$value": "#4A3200" },
          "content": { "$type": "color", "$value": "#FFDE94" },
          "accent": { "$type": "color", "$value": "#E0A32E" }
        },
        "error": {
          "surface": { "$type": "color", "$value": "#5C1219" },
          "content": { "$type": "color", "$value": "#FFB9B3" },
          "accent": { "$type": "color", "$value": "#FF6B6B" }
        },
        "info": {
          "surface": { "$type": "color", "$value": "#212C6B" },
          "content": { "$type": "color", "$value": "#C3CBFF" },
          "accent": { "$type": "color", "$value": "#8794FF" }
        },
        "neutral": {
          "surface": { "$type": "color", "$value": "#2A2823" },
          "content": { "$type": "color", "$value": "#D7D1CA" },
          "accent": { "$type": "color", "$value": "#A9A19A" }
        }
      }
    },
    "status": {
      "$description": "Transaction status maps onto the feedback families. Colour is never the only signal: every status renders an accent dot and a written label.",
      "paid": { "$type": "string", "$value": "feedback.success" },
      "pending": { "$type": "string", "$value": "feedback.warning" },
      "failed": { "$type": "string", "$value": "feedback.error" },
      "refunded": { "$type": "string", "$value": "feedback.info" }
    }
  },
  "typography": {
    "productFamily": { "$type": "fontFamily", "$value": "Satoshi" },
    "fallbackFamily": { "$type": "fontFamily", "$value": ["Inter", "system-ui", "sans-serif"] },
    "logoTreatment": { "$type": "string", "$value": "Outlined vector artwork; do not typeset" },
    "weights": {
      "$description": "Satoshi ships to Paydot as three static faces. 600, 700 and 800 are NOT registered: CSS Fonts 4 resolves a request above 500 upward, so 700 renders Black in Compose and must render Black on the web too. Declare 400, 500 or 900 and nothing else.",
      "regular": { "$type": "number", "$value": 400 },
      "medium": { "$type": "number", "$value": 500 },
      "black": { "$type": "number", "$value": 900 }
    },
    "marketing": {
      "$description": "Editorial scale for paydot.eu and campaign surfaces only. Product screens use the Compose type scale in design-system/theme/Typography.kt.",
      "display1": { "$type": "string", "$value": "clamp(3.6rem, 8vw, 7.5rem)" },
      "display2": { "$type": "string", "$value": "clamp(2.6rem, 5.2vw, 4.75rem)" },
      "display3": { "$type": "string", "$value": "clamp(2.1rem, 3.6vw, 3.1rem)" },
      "lead": { "$type": "string", "$value": "clamp(1.15rem, 1.5vw, 1.4rem)" },
      "heading1": { "$type": "string", "$value": "1.7rem" },
      "heading2": { "$type": "string", "$value": "1.35rem" },
      "bodyLarge": { "$type": "string", "$value": "1.15rem" },
      "body": { "$type": "string", "$value": "1rem" },
      "small": { "$type": "string", "$value": "0.875rem" },
      "eyebrow": { "$type": "string", "$value": "0.78rem" }
    }
  },
  "geometry": {
    "radius": {
      "$description": "Product geometry is structured, not pill-led. Reserve `full` for inherently circular elements: avatars, indicators, and the Active Dot.",
      "chip": { "$type": "dimension", "$value": { "value": 8, "unit": "px" } },
      "field": { "$type": "dimension", "$value": { "value": 12, "unit": "px" } },
      "card": { "$type": "dimension", "$value": { "value": 16, "unit": "px" } },
      "action": { "$type": "dimension", "$value": { "value": 16, "unit": "px" } },
      "dialog": { "$type": "dimension", "$value": { "value": 20, "unit": "px" } },
      "sheet": { "$type": "dimension", "$value": { "value": 24, "unit": "px" } },
      "panel": { "$type": "dimension", "$value": { "value": 32, "unit": "px" } },
      "full": { "$type": "dimension", "$value": { "value": 9999, "unit": "px" } }
    },
    "spacing": {
      "$description": "8px grid with a 4px half-step. Every gap and block padding is one of these.",
      "3xs": { "$type": "dimension", "$value": { "value": 4, "unit": "px" } },
      "2xs": { "$type": "dimension", "$value": { "value": 8, "unit": "px" } },
      "xs": { "$type": "dimension", "$value": { "value": 12, "unit": "px" } },
      "sm": { "$type": "dimension", "$value": { "value": 16, "unit": "px" } },
      "md": { "$type": "dimension", "$value": { "value": 24, "unit": "px" } },
      "lg": { "$type": "dimension", "$value": { "value": 32, "unit": "px" } },
      "xl": { "$type": "dimension", "$value": { "value": 48, "unit": "px" } },
      "2xl": { "$type": "dimension", "$value": { "value": 64, "unit": "px" } },
      "3xl": { "$type": "dimension", "$value": { "value": 96, "unit": "px" } },
      "4xl": { "$type": "dimension", "$value": { "value": 128, "unit": "px" } }
    },
    "motion": {
      "$description": "Interaction feedback stays under 300ms. Entrance and ambient motion may run longer but must respect prefers-reduced-motion.",
      "feedback": { "$type": "duration", "$value": { "value": 160, "unit": "ms" } },
      "transition": { "$type": "duration", "$value": { "value": 240, "unit": "ms" } },
      "entrance": { "$type": "duration", "$value": { "value": 700, "unit": "ms" } },
      "easing": { "$type": "cubicBezier", "$value": [0.2, 0.7, 0.2, 1] }
    }
  },
  "brandGeometry": {
    "appIconCornerRatio": { "$type": "number", "$value": 0.22 },
    "wordmarkAspectRatio": { "$type": "number", "$value": 3.58 },
    "wordmarkClearSpaceUnit": { "$type": "string", "$value": "0.5 × active-dot diameter" },
    "partnerLockupMinimumGap": { "$type": "string", "$value": "1 × active-dot diameter" },
    "wordmarkMinimumScreenWidth": { "$type": "dimension", "$value": { "value": 120, "unit": "px" } },
    "markMinimumScreenSize": { "$type": "dimension", "$value": { "value": 16, "unit": "px" } }
  }
}
