From 9a3d60a09da978c1b42686e1581c890fed4e044d Mon Sep 17 00:00:00 2001 From: Benoit TRAVERS Date: Sat, 8 Aug 2026 20:32:01 +0200 Subject: [PATCH] feat(website): add @btravstack/entity to the stack MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit entity is published (0.3.0) with its docs live, so it joins the landing as the fourth panel. It sits second, after unthrown and before the two contract packages: the row now reads as the stack does — errors, the domain built on them, then the transports that carry it. Its mark is entity's own docs logo, copied under logos/entity-{light,dark}.svg, which is the same convention the other three follow (verified: the unthrown pair is byte-identical to unthrown/docs/public/logo-*.svg). New --pkg-entity token, amber #C8871F: amber encases and preserves — a thing suspended intact, permanently — which is sealed construction and immutable data. 6.32 on the dark card, 5.61 as darkened text on white (AA). It replaces --bt-pink-soft, the org accent, which entity's docs were borrowing; btravstack/entity#47 moves that half. The hero count and the footer link lists derive from the array, so only the section heading and lead needed the three-to-four edit. --- .changeset/entity-accent-token.md | 10 ++++++++++ apps/website/.vitepress/theme/Landing.vue | 18 +++++++++++++----- apps/website/public/logos/entity-dark.svg | 4 ++-- apps/website/public/logos/entity-light.svg | 4 ++-- design.md | 4 +++- packages/theme/src/tokens.css | 3 ++- 6 files changed, 32 insertions(+), 11 deletions(-) create mode 100644 .changeset/entity-accent-token.md diff --git a/.changeset/entity-accent-token.md b/.changeset/entity-accent-token.md new file mode 100644 index 0000000..cfecab1 --- /dev/null +++ b/.changeset/entity-accent-token.md @@ -0,0 +1,10 @@ +--- +"@btravstack/theme": minor +--- + +Add `--pkg-entity`, amber `#C8871F`, for `@btravstack/entity`. + +Amber encases and preserves — a thing suspended intact, permanently — which is +sealed construction and immutable data. entity's docs previously used +`--bt-pink-soft`, the org accent, which the multi-accent rule reserves for org +chrome. diff --git a/apps/website/.vitepress/theme/Landing.vue b/apps/website/.vitepress/theme/Landing.vue index 4897fac..9994b12 100644 --- a/apps/website/.vitepress/theme/Landing.vue +++ b/apps/website/.vitepress/theme/Landing.vue @@ -44,8 +44,8 @@ interface Project { docs: string; } -// unthrown leads: it's the base the two contract packages build on, and the -// most versatile of the three. +// Ordered as the stack reads — errors, the domain built on them, then the +// transports that carry it. unthrown leads: the other three build on it. const projects: Project[] = [ { key: "unthrown", tag: "Errors", name: "unthrown", pkg: "unthrown", npm: "unthrown", @@ -55,6 +55,14 @@ const projects: Project[] = [ install: "pnpm add unthrown", repo: "https://github.com/btravstack/unthrown", docs: "https://btravstack.github.io/unthrown/", }, + { + key: "entity", tag: "Domain", name: "entity", pkg: "@btravstack/entity", npm: "@btravstack/entity", + logo: "/logos/entity", repoFull: "btravstack/entity", stars0: 3, + blurb: "Domain entities declared once. One field map gives you a type, four request/response schemas, behaviour, and a class that is itself a zod schema — so entities nest inside each other without losing what makes them entities.", + points: ["Branded fields and immutable data", "Sealed construction, enforced invariants", "Result instead of throws"], + install: "pnpm add @btravstack/entity", + repo: "https://github.com/btravstack/entity", docs: "https://btravstack.github.io/entity/", + }, { key: "amqp", tag: "Messaging", name: "amqp-contract", pkg: "@amqp-contract/contract", npm: "@amqp-contract/contract", logo: "/logos/amqp-contract", repoFull: "btravstack/amqp-contract", stars0: 18, @@ -73,7 +81,7 @@ const projects: Project[] = [ }, ]; -/** Every repo shown on the page — the three published packages. */ +/** Every repo shown on the page — the published packages. */ const allRepos = projects; const stars = reactive>( @@ -178,8 +186,8 @@ onMounted(() => {
-

Three libraries, one stack.

-

Errors, messaging and workflows — three focused packages that compose into one coherent backend.

+

Four libraries, one stack.

+

Errors, domain, messaging and workflows — four focused packages that compose into one coherent backend.

diff --git a/apps/website/public/logos/entity-dark.svg b/apps/website/public/logos/entity-dark.svg index 19c8343..804ac95 100644 --- a/apps/website/public/logos/entity-dark.svg +++ b/apps/website/public/logos/entity-dark.svg @@ -25,9 +25,9 @@ - + - \ No newline at end of file + diff --git a/apps/website/public/logos/entity-light.svg b/apps/website/public/logos/entity-light.svg index 9b5391e..30972be 100644 --- a/apps/website/public/logos/entity-light.svg +++ b/apps/website/public/logos/entity-light.svg @@ -25,9 +25,9 @@ - + - \ No newline at end of file + diff --git a/design.md b/design.md index afbce04..6d39a7e 100644 --- a/design.md +++ b/design.md @@ -9,7 +9,7 @@ grow. *colorful stack of distinct tools* on a near-neutral black canvas: the beetroot pink is the ORG accent (wordmark, links, CTAs, mascot), while each package glows in **its own accent** — amqp orange, temporal indigo, unthrown -teal. Weight-contrast typography (one grotesque at 400 vs +teal, entity amber. Weight-contrast typography (one grotesque at 400 vs 800), elevation through surface lightness, real numbers in the hero, and the gradient beetroot mascot as the one character moment. @@ -55,6 +55,7 @@ atmospheric (studied register — dark, quiet, confident; no blooms). | `--pkg-amqp` | `#FF6600` | darken 30% at point of use | | `--pkg-temporal` | `#6B76F2` | darken 30% at point of use | | `--pkg-unthrown` | `#3FB0A5` | darken 30% at point of use | +| `--pkg-entity` | `#C8871F` | darken 30% at point of use | **The multi-accent rule (the studied signature).** The canvas and chrome are near-neutral; color belongs to the *products*. Package names, category dots @@ -149,6 +150,7 @@ The canonical export lives at `packages/theme/src/tokens.css` (published as --pkg-amqp: #FF6600; --pkg-temporal: #6B76F2; --pkg-unthrown: #3FB0A5; + --pkg-entity: #C8871F; --font-display: "Geist", sans-serif; /* 800 for display */ --font-body: "Geist", sans-serif; --font-mono: "JetBrains Mono", monospace; diff --git a/packages/theme/src/tokens.css b/packages/theme/src/tokens.css index 0d0cc9e..714e7c1 100644 --- a/packages/theme/src/tokens.css +++ b/packages/theme/src/tokens.css @@ -14,7 +14,7 @@ * glows in ITS OWN accent — the org reads as a colorful stack of distinct * tools, not a monochrome brand. The beetroot pink is the ORG accent * (wordmark, links, org CTAs); the per-package accents (amqp orange, - * temporal indigo, unthrown teal) carry the packages. + * temporal indigo, unthrown teal, entity amber) carry the packages. * Elevation through lightness, weight-contrast typography, real numbers. * * DARK is the canonical default. The light scheme overrides the semantic @@ -43,6 +43,7 @@ --pkg-amqp: #FF6600; /* RabbitMQ's orange */ --pkg-temporal: #6B76F2; /* Temporal's indigo */ --pkg-unthrown: #3FB0A5; /* outside the signal register: not a signal, a value */ + --pkg-entity: #C8871F; /* amber encases and preserves: sealed, immutable */ /* ── Surfaces (DARK scheme — canonical: near-neutral black) ──── */ --bg: oklch(13% 0.006 310); /* ≈ #080709 — the canvas */