{"_id":"@bounded-systems/brand","_rev":"3-0f1ec95c6a09072e3fde4511332e1449","name":"@bounded-systems/brand","dist-tags":{"latest":"2.0.0"},"versions":{"1.3.0":{"name":"@bounded-systems/brand","version":"1.3.0","keywords":["design-tokens","brand","css","fonts","bounded-systems"],"license":"MIT","_id":"@bounded-systems/brand@1.3.0","maintainers":[{"name":"bdelanghe","email":"bdelanghe@gmail.com"}],"homepage":"https://bounded.tools","bugs":{"url":"https://github.com/bounded-systems/brand/issues"},"dist":{"shasum":"279cc4f263151c71a2d70f5d623ec849a00358cc","tarball":"https://registry.npmjs.org/@bounded-systems/brand/-/brand-1.3.0.tgz","fileCount":16,"integrity":"sha512-V5gDdaN67duwJC8UzNNbhVYUX5xTIyU5ycjeNooiX6NVAMaRhzzBIu2mNFK+ln4Bt2HFmDONST6qh34zKoevFg==","signatures":[{"sig":"MEUCIFrKqssbHuplbPvNlcZiO81vayrUpsODiwMfxhZ6cFQpAiEA7Vv97vCy0Iw39kiyOtJZSjAYQD+PyiNPqoqz5SaJpsU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":119225},"type":"module","engines":{"node":">=18"},"exports":{".":"./tokens/tokens.json","./tokens.ts":"./tokens/tokens.ts","./tokens.css":"./tokens/tokens.css","./tokens.json":"./tokens/tokens.json","./css/base.css":"./css/base.css","./package.json":"./package.json","./css/fonts.css":"./css/fonts.css"},"gitHead":"773b2f6614c51ff0ccf9a38bb999a0f8a5128599","scripts":{"a11y":"node tools/a11y.mjs","meta":"node tools/meta.mjs","build":"npm run build:css && npm run build:sd && npm run build:headers","check":"node tokens/build-tokens.mjs --check","content":"node tools/content.mjs","palette":"node tools/palette.mjs","prepack":"npm run build:css && npm run build:ts","build:sd":"style-dictionary build --config style-dictionary.config.mjs","build:ts":"node tools/build-tokens-ts.mjs","coverage":"node tools/coverage.mjs css design","build:css":"node tokens/build-tokens.mjs","tokens:ts":"node tools/build-tokens-ts.mjs","a11y:check":"node tools/a11y.mjs --check","resume:pdf":"node tools/render-resume.mjs","token-a11y":"node tools/token-a11y.mjs","tokens:dist":"node tools/build-tokens-dist.mjs","resume:build":"node tools/build-resume.mjs","resume:check":"node tools/build-resume.mjs --check && node tools/resume-check.mjs --check","build:headers":"node tools/generate-headers.mjs","check:headers":"node tools/generate-headers.mjs --check dist/github-headers","content:check":"node tools/content.mjs --check","palette:check":"npm run build:css && node tools/palette.mjs","coverage:check":"node tools/coverage.mjs --check css","palette:verify":"node tools/palette.mjs --verify","coverage:colors":"node tools/coverage.mjs --colors --check css","tokens:ts:check":"node tools/build-tokens-ts.mjs --check","verify:versions":"node tools/verify-versions.mjs","token-a11y:check":"npm run build:css && node tools/token-a11y.mjs","token-a11y:verify":"node tools/token-a11y.mjs --verify","tokens:dist:check":"node tools/build-tokens-dist.mjs --check"},"_npmUser":{"name":"bdelanghe","email":"bdelanghe@gmail.com"},"repository":{"url":"git+https://github.com/bounded-systems/brand.git","type":"git"},"_npmVersion":"11.13.0","description":"Design tokens (colors, type, spacing) for Bounded Systems — MIT. Brand identity artwork is proprietary and not included.","directories":{},"_nodeVersion":"24.16.0","publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"style-dictionary":"^4.3.0"},"_npmOperationalInternal":{"tmp":"tmp/brand_1.3.0_1782708923953_0.8686971263605328","host":"s3://npm-registry-packages-npm-production"}},"1.4.0":{"name":"@bounded-systems/brand","version":"1.4.0","keywords":["design-tokens","brand","css","fonts","bounded-systems"],"license":"MIT","_id":"@bounded-systems/brand@1.4.0","maintainers":[{"name":"bdelanghe","email":"bdelanghe@gmail.com"}],"homepage":"https://bounded.tools","bugs":{"url":"https://github.com/bounded-systems/brand/issues"},"dist":{"shasum":"eb6df715be70abf4a24f41aa6fdea6c9969745eb","tarball":"https://registry.npmjs.org/@bounded-systems/brand/-/brand-1.4.0.tgz","fileCount":34,"integrity":"sha512-lxxucwd5830XpHKeyuIutOux2G6YEG5hPNM0yCCRDLOCiA6AFPpbLzLyExjQe9ASyZNg9lOBnWN0Fsoi7sGc6w==","signatures":[{"sig":"MEYCIQD3k9UENFdnC5ZXV0Mu3pBXp7NW2b8gCnx8prLor1hKpQIhAPtD6gmZLk6+F718Htv58mwH1cyrJU5wFZFe8i4slDMD","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@bounded-systems%2fbrand@1.4.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":361329},"type":"module","engines":{"node":">=18"},"exports":{".":"./tokens/tokens.json","./mark/*":"./mark/*","./avatar/*":"./avatar/*","./lockup/*":"./lockup/*","./tokens.ts":"./tokens/tokens.ts","./tokens.css":"./tokens/tokens.css","./tokens.json":"./tokens/tokens.json","./css/base.css":"./css/base.css","./package.json":"./package.json","./css/fonts.css":"./css/fonts.css","./favicon-32.png":"./favicon-32.png","./content/strings.json":"./content/strings.json"},"gitHead":"bdf826001dc587c55746e8bce5dc8299a8471f61","scripts":{"a11y":"node tools/a11y.mjs","meta":"node tools/meta.mjs","build":"npm run build:css && npm run build:sd && npm run build:headers","check":"node tokens/build-tokens.mjs --check","content":"node tools/content.mjs","palette":"node tools/palette.mjs","prepack":"npm run build:css && npm run build:ts","build:sd":"style-dictionary build --config style-dictionary.config.mjs","build:ts":"node tools/build-tokens-ts.mjs","coverage":"node tools/coverage.mjs css design","build:css":"node tokens/build-tokens.mjs","tokens:ts":"node tools/build-tokens-ts.mjs","a11y:check":"node tools/a11y.mjs --check","resume:pdf":"node tools/render-resume.mjs","token-a11y":"node tools/token-a11y.mjs","tokens:dist":"node tools/build-tokens-dist.mjs","resume:build":"node tools/build-resume.mjs","resume:check":"node tools/build-resume.mjs --check && node tools/resume-check.mjs --check","build:headers":"node tools/generate-headers.mjs","check:headers":"node tools/generate-headers.mjs --check dist/github-headers","content:check":"node tools/content.mjs --check","palette:check":"npm run build:css && node tools/palette.mjs","coverage:check":"node tools/coverage.mjs --check css","palette:verify":"node tools/palette.mjs --verify","coverage:colors":"node tools/coverage.mjs --colors --check css","tokens:ts:check":"node tools/build-tokens-ts.mjs --check","verify:versions":"node tools/verify-versions.mjs","token-a11y:check":"npm run build:css && node tools/token-a11y.mjs","token-a11y:verify":"node tools/token-a11y.mjs --verify","tokens:dist:check":"node tools/build-tokens-dist.mjs --check"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:4a6b921e-5a09-433a-9102-dec8a3a8167c"}},"repository":{"url":"git+https://github.com/bounded-systems/brand.git","type":"git"},"_npmVersion":"11.18.0","description":"Design system for Bounded Systems — tokens/CSS (MIT) plus brand identity artwork (proprietary, all rights reserved, see LICENSE).","directories":{},"_nodeVersion":"22.23.1","publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"style-dictionary":"^4.3.0"},"_npmOperationalInternal":{"tmp":"tmp/brand_1.4.0_1783021798237_0.6943550758058974","host":"s3://npm-registry-packages-npm-production"}},"2.0.0":{"name":"@bounded-systems/brand","version":"2.0.0","description":"Design system for Bounded Systems — tokens/CSS (MIT) plus brand identity artwork (proprietary, all rights reserved, see LICENSE).","type":"module","license":"MIT","homepage":"https://bounded.tools","repository":{"type":"git","url":"git+https://github.com/bounded-systems/brand.git"},"bugs":{"url":"https://github.com/bounded-systems/brand/issues"},"keywords":["design-tokens","brand","css","fonts","bounded-systems"],"engines":{"node":">=18"},"publishConfig":{"access":"public","provenance":true},"exports":{".":"./tokens/tokens.json","./tokens.json":"./tokens/tokens.json","./tokens.ts":"./tokens/tokens.ts","./tokens.css":"./tokens/tokens.css","./css/base.css":"./css/base.css","./css/fonts.css":"./css/fonts.css","./content/strings.json":"./content/strings.json","./mark/*":"./mark/*","./avatar/*":"./avatar/*","./lockup/*":"./lockup/*","./favicon-32.png":"./favicon-32.png","./package.json":"./package.json"},"scripts":{"prepack":"npm run build:css && npm run build:ts","build:css":"node tokens/build-tokens.mjs","build:ts":"node tools/build-tokens-ts.mjs","build:headers":"node tools/generate-headers.mjs","check":"node tokens/build-tokens.mjs --check","check:headers":"node tools/generate-headers.mjs --check dist/github-headers","build:sd":"style-dictionary build --config style-dictionary.config.mjs","tokens:ts":"node tools/build-tokens-ts.mjs","tokens:ts:check":"node tools/build-tokens-ts.mjs --check","tokens:dist":"node tools/build-tokens-dist.mjs","tokens:dist:check":"node tools/build-tokens-dist.mjs --check","verify:versions":"node tools/verify-versions.mjs","build":"npm run build:css && npm run build:sd && npm run build:headers","coverage":"node tools/coverage.mjs css design","coverage:check":"node tools/coverage.mjs --check css","coverage:colors":"node tools/coverage.mjs --colors --check css","content":"node tools/content.mjs","content:check":"node tools/content.mjs --check","resume:build":"node tools/build-resume.mjs","resume:pdf":"node tools/render-resume.mjs","resume:check":"node tools/build-resume.mjs --check && node tools/resume-check.mjs --check","meta":"node tools/meta.mjs","a11y":"node tools/a11y.mjs","a11y:check":"node tools/a11y.mjs --check","palette":"node tools/palette.mjs","palette:check":"npm run build:css && node tools/palette.mjs","palette:verify":"node tools/palette.mjs --verify","token-a11y":"node tools/token-a11y.mjs","token-a11y:check":"npm run build:css && node tools/token-a11y.mjs","token-a11y:verify":"node tools/token-a11y.mjs --verify"},"devDependencies":{"style-dictionary":"^5.5.0"},"gitHead":"f2c5173966c2fc15710ce7a6083da8d25b50b87b","_id":"@bounded-systems/brand@2.0.0","_nodeVersion":"22.23.2","_npmVersion":"12.0.2","dist":{"integrity":"sha512-jpiNYSQQ8W/e/SVSudxXXR10j9D26yi08mgXAoBJhZvGBot/SccBskaRqVZ1O+gIWdtYoCKXTsU0/LOLMIUHxQ==","shasum":"091a88e95e0601990328d74b8468c150e9716daa","tarball":"https://registry.npmjs.org/@bounded-systems/brand/-/brand-2.0.0.tgz","fileCount":34,"unpackedSize":361671,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@bounded-systems%2fbrand@2.0.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQCALSDQW0mTSSpnMnbJYbNJW7qe97clQfjsSx8ywz5NVwIhAOsuKmLaR+hMlyIxVvu3Lmv7I5pXaLsnenfBmwQahcm9"}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:4a6b921e-5a09-433a-9102-dec8a3a8167c"}},"directories":{},"maintainers":[{"name":"bdelanghe","email":"bdelanghe@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/brand_2.0.0_1787359122695_0.6884792482112143"},"_hasShrinkwrap":false}},"time":{"created":"2026-06-29T04:55:23.779Z","modified":"2026-08-22T00:38:43.149Z","1.3.0":"2026-06-29T04:55:24.110Z","1.4.0":"2026-07-02T19:49:58.417Z","2.0.0":"2026-08-22T00:38:42.843Z"},"bugs":{"url":"https://github.com/bounded-systems/brand/issues"},"license":"MIT","homepage":"https://bounded.tools","keywords":["design-tokens","brand","css","fonts","bounded-systems"],"repository":{"type":"git","url":"git+https://github.com/bounded-systems/brand.git"},"description":"Design system for Bounded Systems — tokens/CSS (MIT) plus brand identity artwork (proprietary, all rights reserved, see LICENSE).","maintainers":[{"name":"bdelanghe","email":"bdelanghe@gmail.com"}],"readme":"# Bounded Systems — Brand\n\nIdentity assets and design tokens for **Bounded Systems**.\n*Bounded authority for AI agents — drawn at the door, not the process or container.*\n\nThe mark is the capability model made physical: a **room** (the boundary), a\n**door** (the gap — one sanctioned unit of authority), and an **agent** (the\nguest, sitting low near the door).\n\n```\nbrand/\n├── tokens/\n│   ├── tokens.json        ← SOURCE OF TRUTH (W3C design tokens)\n│   ├── tokens.css         ← generated CSS variables + text styles (do not hand-edit)\n│   └── build-tokens.mjs   ← generator; `--check` fails CI on drift\n├── css/                   ← ready-to-link stylesheets for web consumers\n│   ├── fonts.css          ← @font-face Space Grotesk + IBM Plex Mono (self-hosted)\n│   ├── fonts/             ← the woff2 files (OFL, latin subset) — no external CDN\n│   └── base.css           ← resets + element defaults on the tokens\n├── mark/                  ← logo only, transparent\n│   ├── mark-white.svg     ← on forest / dark\n│   ├── mark-forest.svg    ← on light\n│   └── *-1024.png\n├── avatar/                ← square masters (surfaces mask to rounded/circle)\n│   ├── avatar-forest.svg  ← recommended\n│   ├── avatar-light.svg\n│   └── avatar-{forest,light}-{200,280,420,460,1024}.png\n├── lockup/                ← wide link-card lockup (OG 1.91:1, 1200×630)\n│   ├── lockup-forest.svg  ← repo social preview\n│   └── lockup-light.svg\n├── favicon-32.png\n├── style-dictionary.config.mjs  ← native / Figma outputs → dist/ (gitignored)\n└── package.json           ← build:css · check · build:sd\n```\n\n## Tokens\n\n`tokens.json` is the only file you edit. Everything else is generated.\n\n```bash\nnode tokens/build-tokens.mjs          # regenerate tokens.css\nnode tokens/build-tokens.mjs --check  # exit 1 if tokens.css is stale (CI)\n```\n\nWire the check into the pipeline so the CSS can never drift from the JSON:\n\n```yaml\n# .github/workflows/tokens.yml (sketch)\n- run: node brand/tokens/build-tokens.mjs --check\n```\n\n### Layers\n\n| Layer | What | Example |\n| --- | --- | --- |\n| **Primitive token** | one named value | `color.forest` = `#0C5A42` |\n| **Text style** (composite) | a recipe bundling primitives | `text.label` → mono + 11px + `0.14em` + uppercase |\n| **Component** | the mark, built from tokens | `mark/*.svg` |\n\nThe **slug / eyebrow** (\"AVATAR SYSTEM · v1\") is the `text.label` style — *not*\na single token, but a composite that references `font.mono`, `size.text-label`,\netc. Consume it as the `.bnd-text-label` class or read its parts from JSON.\n\n## Consuming\n\n**CSS / web** — import the generated variables and styles:\n\n```css\n@import \"brand/tokens/tokens.css\";\n.eyebrow { } /* or just add class=\"bnd-text-label\" */\nh1        { color: var(--bnd-color-ink); }\n```\n\n**Anything that can't read CSS** (native iOS/Android, email, Figma, print) reads\n`tokens.json` directly, or builds a platform output from it via Style Dictionary:\n\n```bash\nnpm install\nnpm run build:sd   # → dist/{tokens.scss,tokens.js,tokens.flat.json,Tokens.swift,tokens.xml}\n```\n\n`tokens.css` stays the curated **web** artifact (it carries the composite\n`.bnd-text-*` classes); Style Dictionary covers everything else. `dist/` is\ngitignored — it's generated, never committed. JSON is the source; every CSS,\nSCSS, JS, Swift, and XML file is a derived artifact.\n\n**As a package** — depend on `@bounded-systems/brand` (npm) and import by path:\n\n```js\nimport tokens from \"@bounded-systems/brand/tokens.json\" with { type: \"json\" };\n```\n```css\n@import \"@bounded-systems/brand/tokens.css\";\n```\n\n### Deployed token bundle (a contract, not a dump)\n\n`npm run tokens:dist` assembles `dist/tokens-site/` and `deploy-tokens.yml`\npublishes it to a stable URL on every release. The bundle is a **versioned,\ncontent-addressed contract**:\n\n```\ntokens-site/\n├── manifest.json     ← the contract — validates against tokens/manifest.schema.json\n├── tokens.json       ← canonical DTCG source  (application/design-tokens+json)\n├── tokens.css        ← CSS variables           (text/css)\n├── tokens.scss · tokens.js · tokens.flat.json · Tokens.swift · tokens.xml\n```\n\n`manifest.json` declares every projection with its IANA **media type** and\n**SHA-256**, plus the package `version` and (in CI) the source `commit`. A\nconsumer fetches the manifest, picks a format, and **verifies the bytes by hash**\n— integrity over freshness. `node tools/build-tokens-dist.mjs --check` gates\n[DTCG] conformance and the contract shape in CI, so the deployed surface can't\ndrift from the spec.\n\nFonts: [Space Grotesk] + [IBM Plex Mono] (Google Fonts).\n\n## Palette\n\n| Token | Hex | Use |\n| --- | --- | --- |\n| `forest` | `#0C5A42` | primary fill, mark on light |\n| `forest-deep` | `#073D2C` | pressed / deep |\n| `forest-tint` | `#E2EBE6` | subtle tinted surface |\n| `forest-soft` | `#D2E0D8` | fills / borders on tinted surfaces |\n| `paper` | `#EDEAE1` | app background, warm |\n| `card` | `#FFFFFF` | card surface (aliases `white`) |\n| `card-alt` | `#F4F1EA` | light avatar fill |\n| `ink` | `#16221C` | primary text |\n| `ink-soft` | `#5C6B63` | secondary text |\n| `ink-mono` | `#5E6B62` | mono label / slug text (WCAG-AA on paper) |\n| `line` | `#E4E0D4` | hairline borders |\n| `white` | `#FFFFFF` | mark on forest |\n| `clay` | `#A6432F` | accent / negative |\n| `clay-tint` | `#F2DED8` | negative surface |\n| `amber` | `#B5762A` | caution / highlight |\n| `amber-tint` | `#F3E8D6` | caution surface |\n\n### Grade colors\n\nStatus colors for graded claims (*Enforced* · *Partial* · *Aspirational*). Only\nthe **base** is authored in `tokens.json`; `build-tokens.mjs` derives the `-bg`\n(light surface), `-fg` (readable text), and `-on-dark` ramps deterministically,\nso consumers get the full set as `--bnd-grade-*` variables.\n\n| Token | Hex | Use |\n| --- | --- | --- |\n| `grade-enforced` | `#3FB984` | proven / enforced in running code |\n| `grade-partial` | `#C8902F` | partially enforced |\n| `grade-aspirational` | `#7E8C83` | aspirational / not yet enforced |\n\n## Token accessibility\n\nToken-level accessibility is a gated contract, not a vibe. The brand vendors the\n**Token Accessibility suite** from [`bounded-systems/conformance-kit`](https://github.com/bounded-systems/conformance-kit)\n(hash-pinned in `vendor/conformance-kit/`, PR #25), and one config —\n`tokens/token-a11y.json` — drives every member over the generated `tokens.css`:\n\n| Member | Checks | WCAG |\n| --- | --- | --- |\n| **palette** | CVD-safe contrast (deutan/protan/tritan), APCA, non-text | 1.4.3 / 1.4.11 |\n| **pairing** | derives fg×bg pairings from the brand CSS ∪ declared set (report-only superset) | — |\n| **typography** | body line-height ≥1.5, overridable spacing, min size, weight×size | 1.4.12 / 1.4.4 / 1.4.8 |\n| **target-size** | interactive-target tokens ≥24×24; ≥44 status | 2.5.8 AA / 2.5.5 AAA |\n| **opacity** | EFFECTIVE composited contrast of any translucent foreground | 1.4.3 / 1.4.11 |\n| **likeness** | near-duplicate hygiene + categorical distinctness (normal + CVD) | 1.4.1 |\n\n```bash\nnpm run token-a11y         # verify the vendor hash-pin, then run the whole suite\nnpm run token-a11y:check   # rebuild tokens.css first, then run (the CI entrypoint)\nnpm run token-a11y:verify  # only verify the vendored suite against its hash-pin\n```\n\nFail-closed (`exit 1`) on any gated-member failure. **No exemptions** — hairlines,\ndividers, and separators are declared `ui` and must clear 3:1; accessible for\neveryone. CI: `.github/workflows/token-a11y.yml`.\n\n### Interactive-target (control) tokens\n\nSo every surface has an accessible pointer-target token to reach for (WCAG 2.5.8):\n\n| Token | Value | Use |\n| --- | --- | --- |\n| `control-min-tap-target` | `24px` | SC 2.5.8 (AA) floor — apply as `min-width`/`min-height` on any control |\n| `control-sm` | `36px` | compact control (chips, dense toolbars) |\n| `control-md` | `44px` | default control — also meets 2.5.5 (AAA, 44px) |\n| `control-lg` | `52px` | prominent / primary control |\n\n## Avatar usage\n\n- Upload **`avatar/avatar-forest-460.png`** as the GitHub org avatar (or the SVG\n  master). GitHub masks to rounded-square / circle itself — the mark sits inside\n  a ~16% safe area so the door never clips.\n- Forest is the hero treatment. Light is for placing on dark/photographic backgrounds.\n- Don't recolor the mark, rotate it, add effects, or close the door gap.\n- Below 20px, prefer `favicon-32.png`.\n\n## Link cards / social preview\n\nThe square avatar center-crops badly on wide (~1.91:1) social/link cards and\nclips the door. Use the dedicated wide lockup instead:\n\n- Set **`lockup/lockup-forest-1200.png`** as the repo's social preview\n  (Settings → Social preview). `lockup-light-*` is for light/photographic contexts.\n- 1200×630 (OG), mark + wordmark + slug + tagline, with safe margins.\n- SVG masters carry live text; the `*-1200.png` rasters (Space Grotesk + IBM Plex\n  Mono baked in) are what social/link cards should point at — most platforms\n  (Slack, X, iMessage) won't render an SVG OG image.\n\n[Space Grotesk]: https://fonts.google.com/specimen/Space+Grotesk\n[IBM Plex Mono]: https://fonts.google.com/specimen/IBM+Plex+Mono\n[DTCG]: https://tr.designtokens.org/format/\n","readmeFilename":"README.md"}