{
  "$description": "Brand: PyPI (Python Package Index) (pypi@1.0.0)",
  "color": {
    "swatches": {
      "$description": "Source-of-truth color swatches from palette pypi@1.0.0",
      "pypi-blue": {
        "$value": "#3775A9",
        "$type": "color",
        "$description": "Primary brand color — the canonical PyPI/Python-family blue. Source: simple-icons \"PyPI\" entry, matching the PSF logo's upper-snake blue.\n"
      },
      "pypi-blue-dark": {
        "$value": "#1E415E",
        "$type": "color",
        "$description": "Deeper navy for hover states; dark-mode tertiary surface."
      },
      "pypi-yellow": {
        "$value": "#FFD43B",
        "$type": "color",
        "$description": "Secondary brand color — the Python-family yellow inherited from the PSF logo's lower-snake fill.\n"
      },
      "pypi-yellow-dark": {
        "$value": "#FFC331",
        "$type": "color",
        "$description": "Deeper amber used for hover states on the yellow accent."
      },
      "pypi-black": {
        "$value": "#0E1217",
        "$type": "color",
        "$description": "Dark-mode page canvas."
      },
      "pypi-charcoal": {
        "$value": "#1C232C",
        "$type": "color",
        "$description": "Elevated dark surface for cards and panels."
      },
      "pypi-slate": {
        "$value": "#3D4554",
        "$type": "color",
        "$description": "Body text on light canvas; secondary copy."
      },
      "pypi-gray": {
        "$value": "#6B7280",
        "$type": "color",
        "$description": "Tertiary text and quiet UI."
      },
      "pypi-light-gray": {
        "$value": "#D5D9DE",
        "$type": "color",
        "$description": "Hairline borders on light canvas."
      },
      "pypi-off-white": {
        "$value": "#F4F5F7",
        "$type": "color",
        "$description": "Subtle layered surface on light canvas."
      },
      "pypi-white": {
        "$value": "#FFFFFF",
        "$type": "color",
        "$description": "Page canvas in light mode."
      },
      "pypi-error": {
        "$value": "#BD4147",
        "$type": "color",
        "$description": "Status error color used in advisory and yanked-release callouts."
      }
    }
  },
  "font": {
    "$description": "Typography roles mapped to font atoms",
    "heading": {
      "family": {
        "$value": [
          "Inter",
          "-apple-system",
          "BlinkMacSystemFont",
          "Segoe UI",
          "Roboto",
          "Helvetica Neue",
          "Arial",
          "sans-serif"
        ],
        "$type": "fontFamily",
        "$description": "heading role → Inter (inter@1.0.0)"
      },
      "weight": {
        "100": {
          "$value": 100,
          "$type": "fontWeight"
        },
        "200": {
          "$value": 200,
          "$type": "fontWeight"
        },
        "300": {
          "$value": 300,
          "$type": "fontWeight"
        },
        "400": {
          "$value": 400,
          "$type": "fontWeight"
        },
        "500": {
          "$value": 500,
          "$type": "fontWeight"
        },
        "600": {
          "$value": 600,
          "$type": "fontWeight"
        },
        "700": {
          "$value": 700,
          "$type": "fontWeight"
        },
        "800": {
          "$value": 800,
          "$type": "fontWeight"
        },
        "900": {
          "$value": 900,
          "$type": "fontWeight"
        },
        "$description": "Available font weights"
      }
    },
    "body": {
      "family": {
        "$value": [
          "Inter",
          "-apple-system",
          "BlinkMacSystemFont",
          "Segoe UI",
          "Roboto",
          "Helvetica Neue",
          "Arial",
          "sans-serif"
        ],
        "$type": "fontFamily",
        "$description": "body role → Inter (inter@1.0.0)"
      },
      "weight": {
        "100": {
          "$value": 100,
          "$type": "fontWeight"
        },
        "200": {
          "$value": 200,
          "$type": "fontWeight"
        },
        "300": {
          "$value": 300,
          "$type": "fontWeight"
        },
        "400": {
          "$value": 400,
          "$type": "fontWeight"
        },
        "500": {
          "$value": 500,
          "$type": "fontWeight"
        },
        "600": {
          "$value": 600,
          "$type": "fontWeight"
        },
        "700": {
          "$value": 700,
          "$type": "fontWeight"
        },
        "800": {
          "$value": 800,
          "$type": "fontWeight"
        },
        "900": {
          "$value": 900,
          "$type": "fontWeight"
        },
        "$description": "Available font weights"
      }
    },
    "mono": {
      "family": {
        "$value": [
          "Source Code Pro",
          "ui-monospace",
          "SFMono-Regular",
          "Menlo",
          "Consolas",
          "Liberation Mono",
          "monospace"
        ],
        "$type": "fontFamily",
        "$description": "mono role → Source Code Pro (source-code-pro@1.0.0)"
      },
      "weight": {
        "200": {
          "$value": 200,
          "$type": "fontWeight"
        },
        "300": {
          "$value": 300,
          "$type": "fontWeight"
        },
        "400": {
          "$value": 400,
          "$type": "fontWeight"
        },
        "500": {
          "$value": 500,
          "$type": "fontWeight"
        },
        "600": {
          "$value": 600,
          "$type": "fontWeight"
        },
        "700": {
          "$value": 700,
          "$type": "fontWeight"
        },
        "800": {
          "$value": 800,
          "$type": "fontWeight"
        },
        "900": {
          "$value": 900,
          "$type": "fontWeight"
        },
        "$description": "Available font weights"
      }
    }
  },
  "$extensions": {
    "com.brand-atoms.rules": [
      {
        "type": "colorChoice",
        "target": "roles.colors.identity",
        "severity": "error",
        "rationale": "The PyPI blocks-logo mark and the Python-family identity it inherits are anchored on the blue + yellow pairing. Substituting slate, gray, or red for the identity color breaks the registered-mark expression and conflicts with the PSF Trademark Usage Policy's reproduction requirements.\n",
        "allowed": [
          "pypi-blue",
          "pypi-yellow"
        ],
        "forbidden": [
          "pypi-slate",
          "pypi-gray",
          "pypi-error"
        ]
      },
      {
        "type": "contextRestriction",
        "target": "trademark.use",
        "severity": "error",
        "rationale": "Per pypi.org/trademarks/: \"Any other use by any other party is prohibited.\" Use of \"PyPI\" as a generic synonym for a package registry, as a product-name prefix without PSF approval, on paid merchandise without PSF approval, or substituting the PSF two-snake logo for the PyPI blocks logo (or vice versa) all cross policy lines — the two marks have separate registrations and signify different things.\n",
        "forbiddenContexts": [
          "implied-endorsement",
          "generic-name-for-any-package-registry",
          "product-name-prefix-without-approval",
          "paid-merchandise-without-approval",
          "blocks-logo-substituted-for-snakes-logo",
          "snakes-logo-substituted-for-blocks-logo"
        ]
      },
      {
        "type": "forbiddenTreatment",
        "target": "logo",
        "severity": "error",
        "rationale": "The PSF Trademark Usage Policy requires that Foundation logos be reproduced \"with the right colors and fonts\" and that derived versions require PSF approval before use. The PyPI blocks logo is defined by the specific arrangement and color assignment of its blocks; recombining the blocks, mixing the colors across blocks, recoloring, or rotation violates the policy.\n",
        "treatments": [
          "recolored",
          "rotated",
          "skewed",
          "stretched",
          "derived-without-approval",
          "drop-shadow",
          "blocks-recombined",
          "blocks-color-mixed"
        ]
      },
      {
        "type": "contrastRatio",
        "target": "text-primary",
        "severity": "error",
        "rationale": "PyPI Blue Dark (#1E415E) on PyPI White exceeds 9:1 — well above the WCAG AA threshold for body text on the registry's package pages and version histories.\n",
        "against": "background",
        "minRatio": 4.5,
        "standard": "WCAG-AA"
      },
      {
        "type": "contrastRatio",
        "target": "roles.colors.accent",
        "severity": "warning",
        "rationale": "PyPI Yellow (#FFD43B) on White sits around 1.5:1 — does NOT clear WCAG AA or AA-large for text. Reserve the yellow for large surfaces, callout backgrounds with dark text on top, the mark itself, and accent illustration; use PyPI Blue or PyPI Blue Dark for any interactive or text-bearing foreground.\n",
        "against": "background",
        "minRatio": 3,
        "standard": "WCAG-AA-large"
      },
      {
        "type": "fontPairing",
        "target": "typography.heading",
        "severity": "recommendation",
        "rationale": "pypi.org uses a single humanist sans across heading and body. Maintain at least a 1.5× heading-to-body ratio on package detail pages, search results, and release history listings.\n",
        "requires": "body",
        "minSizeRatio": 1.5
      },
      {
        "type": "accessibilityRequirement",
        "target": "*",
        "severity": "error",
        "rationale": "WCAG 2.1 Success Criterion 1.4.3 (Contrast Minimum) — Level AA. PyPI is the registry of record for the Python ecosystem; broad legibility is a load-bearing requirement.\n",
        "standard": "WCAG-AA",
        "criterion": "1.4.3"
      },
      {
        "type": "compositionConstraint",
        "target": "roles.colors.identity",
        "severity": "recommendation",
        "rationale": "PyPI Blue pairs cleanly with the white canvas, the Python-family yellow, and its own deeper navy. Placing it directly adjacent to PyPI Error Red mixes registered-mark identity with status semantics and flattens the brand's institutional voice — reserve error red for advisories and yanked-release callouts.\n",
        "pairsWith": [
          "pypi-white",
          "pypi-off-white",
          "pypi-yellow",
          "pypi-blue-dark"
        ],
        "doesNotPairWith": [
          "pypi-error"
        ]
      }
    ],
    "com.brand-atoms.assets": [],
    "com.brand-atoms.provenance": {
      "source": "https://pypi.org/trademarks/",
      "license": "Proprietary — All Rights Reserved",
      "attribution": "\"PyPI\", \"Python Package Index\", and the blocks logos are registered trademarks of the Python Software Foundation (USPTO #5608450; International #1384149 for \"PyPI\"; USPTO #5764496; International #1382296 for \"Python Package Index\"). Brand-atoms' encoding draws from the PyPI trademarks page (pypi.org/trademarks/), the PSF Trademark Usage Policy that governs the Python language mark, and the canonical PyPI Blue value (#3775A9) carried by the simple-icons project's \"PyPI\" entry.\n",
      "importedDate": "2026-05-19",
      "notes": "PyPI's trademarks page states verbatim: \"'PyPI', 'Python Package Index', and the blocks logos are registered trademarks of the Python Software Foundation referring to products and services associated with pypi.org. Any other use by any other party is prohibited.\" Although PyPI inherits the Python-family blue/yellow palette, the PyPI blocks-logo mark is distinct from the PSF two-snake mark and has its own registration — substituting one for the other crosses the boundary between two distinct registered marks of the Foundation. The Python language brand is encoded separately in the sibling `python@1` atom.\n"
    },
    "com.brand-atoms.references": {
      "palette": "pypi@1.0.0",
      "fonts": {
        "heading": "inter@1.0.0",
        "body": "inter@1.0.0",
        "mono": "source-code-pro@1.0.0"
      }
    }
  }
}
