From 8b0a5853bab2e71dd0030dcddb8c3be8a31d9e4e Mon Sep 17 00:00:00 2001 From: Graham Barber Date: Mon, 17 Aug 2026 21:34:13 -0700 Subject: [PATCH] =?UTF-8?q?style(web):=20tag=20chips=20=E2=80=94=20cluster?= =?UTF-8?q?,=20cadence,=20and=20stated=20bindings?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The Impeccable layout pass on the tag display: stream tags become one wrapping cluster instead of a tower of bordered boxes, set off from the facts (date, refs) by a wider interval — facts then claims, two registers in one rail; on mobile the row's own gaps do the separating. The release page drops its negative-margin correction for the stated relationship — a tagged title binds tight to its chips and the cluster hands off to the prose. Chip padding evens out against the inline-code register. Co-Authored-By: Claude Fable 5 Claude-Session: https://claude.ai/code/session_01PWXFcuaRLZycYVAF7senMK --- .../lib/components/ChangelogStreamPage.svelte | 29 +++++++++++++++---- web/src/lib/components/ReleasePage.svelte | 14 +++++---- 2 files changed, 33 insertions(+), 10 deletions(-) diff --git a/web/src/lib/components/ChangelogStreamPage.svelte b/web/src/lib/components/ChangelogStreamPage.svelte index 18b2efd..042dc68 100644 --- a/web/src/lib/components/ChangelogStreamPage.svelte +++ b/web/src/lib/components/ChangelogStreamPage.svelte @@ -59,9 +59,13 @@ >{projectPath(ref.project)}@{ref.version} {/each} - {#each subjectTags(doc) as tag (tag)} - {tag} - {/each} + {#if subjectTags(doc).length > 0} + + {#each subjectTags(doc) as tag (tag)} + {tag} + {/each} + + {/if}

{/each} @@ -104,11 +108,20 @@ font-weight: 700; } /* tag chips: publisher claims in the ordinary ink register — never - the semantic colors, never a filter control */ + the semantic colors, never a filter control. One wrapping cluster, + set off from the facts (date, refs) by a wider interval: facts + then claims, two registers in one rail. */ + .tags { + display: flex; + flex-wrap: wrap; + justify-content: flex-end; + gap: 0.3rem; + margin-top: 0.45rem; + } .tag { color: var(--ink); border: 1px solid var(--rule); - padding: 0.05rem 0.45rem; + padding: 0.1rem 0.5rem; font-size: 0.8125rem; } .meta { @@ -133,5 +146,11 @@ gap: 0.9rem; margin-top: 0.75rem; } + /* in the single-row rail the wider 0.9rem column gap already + separates the clusters; the tags need no extra offset */ + .tags { + justify-content: flex-start; + margin-top: 0; + } } diff --git a/web/src/lib/components/ReleasePage.svelte b/web/src/lib/components/ReleasePage.svelte index 9ca477a..489685f 100644 --- a/web/src/lib/components/ReleasePage.svelte +++ b/web/src/lib/components/ReleasePage.svelte @@ -79,7 +79,7 @@
{#if changelog}
-

{changelog.title}

+

0}>{changelog.title}

{#if changelogTags.length > 0}

{#each changelogTags as tag (tag)} @@ -229,16 +229,20 @@ margin-bottom: 1.25rem; } /* tag chips: publisher claims in the ordinary ink register — never - the semantic colors */ + the semantic colors. The tags bind to the title they describe + (tight above, generous below), and the prose follows the cluster. */ + .changelog h2.tagged { + margin-bottom: 0.5rem; + } .changelog .tags { display: flex; flex-wrap: wrap; - gap: 0.4rem; - margin: -0.75rem 0 1.25rem; + gap: 0.3rem; + margin-bottom: 1.25rem; } .changelog .tag { border: 1px solid var(--rule); - padding: 0.05rem 0.45rem; + padding: 0.1rem 0.5rem; font-size: 0.8125rem; } .artifacts-section { -- 2.51.2