From 8eef9e7845c7d01b58c4ff00da61e68ca0b8b5ab Mon Sep 17 00:00:00 2001 From: Bryan Van Deusen Date: Fri, 31 Jul 2026 08:29:37 -0400 Subject: [PATCH] fix(design-systems): the empty state's create button did nothing, and one surface MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Two reports, one root cause each. **The dead button.** "Create the first one" set `showCreate = true`, but the create form lived inside `
` — the sibling branch of the empty state. The two are mutually exclusive, so on a fresh install the flag flipped and nothing rendered. The first action a new install can take was the one that didn't work, which is a poor way to honour "an install with zero design systems is the ordinary state". The first system now gets its own form outside the list layout, and it drops the parent picker entirely: there is nothing to inherit from yet, so it says so instead of offering an empty select. **Two surfaces, the wrong one first.** /design and /design-systems are halves of one thing — the record that decides the styling, and what the browser renders from it — and I had added them as two separate nav entries with the read-only diagnostic listed first. Backwards: the record is what you work with; the live view is the check on it. Now one nav entry pointing at the record, with a shared tab bar joining the two. The explorer is renamed "Live tokens", which is what it actually shows. The tab bar is a component rather than the same markup in both views. Two copies diverge the moment a third tab appears — and a design surface that ships duplicated markup would be arguing against itself. --- frontend/src/components/AppHeader.vue | 12 +++--- frontend/src/components/DesignTabs.vue | 51 ++++++++++++++++++++++++ frontend/src/views/DesignSystemsView.vue | 40 +++++++++++++++++-- frontend/src/views/DesignView.vue | 10 ++--- 4 files changed, 99 insertions(+), 14 deletions(-) create mode 100644 frontend/src/components/DesignTabs.vue diff --git a/frontend/src/components/AppHeader.vue b/frontend/src/components/AppHeader.vue index 9afa991..ac3ef6e 100644 --- a/frontend/src/components/AppHeader.vue +++ b/frontend/src/components/AppHeader.vue @@ -64,10 +64,13 @@ router.afterEach(() => { - - + defeat the point of having somewhere the design system is visible. + Points at the RECORD, not the live-token view — the record is what + you work with; the live view is the check on it, and it's a tab + away. --> + @@ -105,8 +108,7 @@ router.afterEach(() => { Rulebooks Shared
- Design - Design systems + Design Trash Settings
diff --git a/frontend/src/components/DesignTabs.vue b/frontend/src/components/DesignTabs.vue new file mode 100644 index 0000000..b00e14d --- /dev/null +++ b/frontend/src/components/DesignTabs.vue @@ -0,0 +1,51 @@ + + + + + diff --git a/frontend/src/views/DesignSystemsView.vue b/frontend/src/views/DesignSystemsView.vue index 12725c1..81c85f3 100644 --- a/frontend/src/views/DesignSystemsView.vue +++ b/frontend/src/views/DesignSystemsView.vue @@ -42,6 +42,7 @@ import { type StylesheetResult, } from "@/api/designSystems"; import { listRulebooks, type Rulebook } from "@/api/rulebooks"; +import DesignTabs from "@/components/DesignTabs.vue"; import { ApiError } from "@/api/client"; import { useToastStore } from "@/stores/toast"; @@ -528,14 +529,14 @@ function isColourish(value: string): boolean {