docs(design): prioritized component inventory from ADRs + stories #11

Merged
bjoern merged 1 commit from docs/design-system-inventory into main 2026-07-09 18:51:26 +02:00
Member

Follow-up to #8 (design-system foundation). No production code changes — this is the plan for what Kagura.UI grows into next.

What this does

Walks the ADRs and all 18 story docs in docs/stories/, extracts every reusable component the app actually asks for, and replaces the flat inventory list in docs/design-system.md with a prioritized one.

Each entry carries a uses count: the number of distinct stories waiting on it. That turned out to be a much better build-order signal than "which is easiest", and it reorders the work sharply:

Component Uses Why
Modal + ConfirmDialog 12 every delete confirm, project-create, add-link, relationship, parent-location, queue cancel, history revert
DocumentHistoryPanel 7 "a shared component (like Connections)" — on every record type
LabeledEntriesTable 7 character ×4, lore ×2, chapter beats
Table 6 projects, characters, locations, lore, chapters, queue
ConnectionsPanel 6 every record type
SaveIndicator 6 there is no explicit save button anywhere in the app

Current state: 8 of 48 built.

Two decisions worth reviewing

Both are recorded under a new Open decisions section rather than silently baked in.

1. disabled-with-reason has no home. ADR 0018 says the UI renders affordances — including why an action is denied — straight from capability-annotated read models. Button has Disabled but no reason. Proposal: add a DisabledReason parameter to Button that renders a Tooltip, rather than introducing a separate CapabilityButton. Consequence: Tooltip becomes a dependency of the entire action surface, well above where it would otherwise sit in priority.

2. LabeledEntriesTable was misfiled. It sat under domain-shared, but it is a generic (label, text) list that knows nothing about characters or lore. With seven call sites it is the most-reused non-primitive in the app, and keeping it in Kagura.UI is what lets the character and lore editors stay genuinely identical. Moved to Data display. Easy to revert if you disagree.

Also worth noting: the token layer already reserves --z-dropdown/sticky/drawer/modal/toast and --shadow-3, and nothing consumes them yet. ADR 0023 anticipated the overlay family; it is the single biggest hole. They all want one shared overlay root (focus trap, Esc-to-close, scroll lock) — built once, deliberately.

/design

Grows an Inventory section rendering the same data, so the gallery and the doc can't drift. It's data-driven from a local array rather than referencing the pending components (which don't exist yet), so it compiles today and each entry earns a real section when it lands.

Verification

  • dotnet build on Kagura.BlazorAdapter — clean, 0 warnings.
  • Ran the server, authenticated through the access gate, and fetched /design: 200, section header renders Inventory · 8/48 built, all 48 rows present (8 Built / 40 Pending badges) across the 7 categories.

🤖 Generated with Claude Code

Follow-up to #8 (design-system foundation). No production code changes — this is the *plan* for what `Kagura.UI` grows into next. ## What this does Walks the ADRs and all 18 story docs in `docs/stories/`, extracts every reusable component the app actually asks for, and replaces the flat inventory list in `docs/design-system.md` with a prioritized one. Each entry carries a **uses** count: the number of distinct stories waiting on it. That turned out to be a much better build-order signal than "which is easiest", and it reorders the work sharply: | Component | Uses | Why | |---|---|---| | Modal + ConfirmDialog | 12 | every delete confirm, project-create, add-link, relationship, parent-location, queue cancel, history revert | | DocumentHistoryPanel | 7 | "a shared component (like Connections)" — on every record type | | LabeledEntriesTable | 7 | character ×4, lore ×2, chapter beats | | Table | 6 | projects, characters, locations, lore, chapters, queue | | ConnectionsPanel | 6 | every record type | | SaveIndicator | 6 | there is no explicit save button anywhere in the app | Current state: **8 of 48 built.** ## Two decisions worth reviewing Both are recorded under a new **Open decisions** section rather than silently baked in. **1. `disabled-with-reason` has no home.** ADR 0018 says the UI renders affordances — including *why* an action is denied — straight from capability-annotated read models. `Button` has `Disabled` but no reason. Proposal: add a `DisabledReason` parameter to `Button` that renders a Tooltip, rather than introducing a separate `CapabilityButton`. Consequence: **Tooltip becomes a dependency of the entire action surface**, well above where it would otherwise sit in priority. **2. `LabeledEntriesTable` was misfiled.** It sat under *domain-shared*, but it is a generic `(label, text)` list that knows nothing about characters or lore. With seven call sites it is the most-reused non-primitive in the app, and keeping it in `Kagura.UI` is what lets the character and lore editors stay genuinely identical. Moved to Data display. Easy to revert if you disagree. Also worth noting: the token layer already reserves `--z-dropdown/sticky/drawer/modal/toast` and `--shadow-3`, and **nothing consumes them yet**. ADR 0023 anticipated the overlay family; it is the single biggest hole. They all want one shared overlay root (focus trap, Esc-to-close, scroll lock) — built once, deliberately. ## `/design` Grows an **Inventory** section rendering the same data, so the gallery and the doc can't drift. It's data-driven from a local array rather than referencing the pending components (which don't exist yet), so it compiles today and each entry earns a real section when it lands. ## Verification - `dotnet build` on `Kagura.BlazorAdapter` — clean, 0 warnings. - Ran the server, authenticated through the access gate, and fetched `/design`: **200**, section header renders `Inventory · 8/48 built`, all 48 rows present (8 Built / 40 Pending badges) across the 7 categories. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
docs(design): prioritized component inventory from ADRs + stories
All checks were successful
CI / build (pull_request) Successful in 12s
CI / test (pull_request) Successful in 18s
4505a00c4f
Walk the ADRs and the 18 story docs and extract the components the app
actually asks for, replacing the flat inventory list in design-system.md.

Each entry carries a "uses" count -- the number of distinct stories waiting
on it -- which is the build-order signal. It reorders the work sharply:
Modal/ConfirmDialog (12 stories), DocumentHistoryPanel and
LabeledEntriesTable (7 each), and SaveIndicator (6, since no editor has an
explicit save button) all outrank things a generic component checklist
would have surfaced first.

Two decisions worth reviewing, recorded under "Open decisions":

- ADR 0018 has the UI render disabled-with-reason affordances from
  capability-annotated read models, but Button has Disabled and no reason.
  Proposal: a DisabledReason parameter on Button rendering a Tooltip,
  rather than a separate CapabilityButton. That makes Tooltip a dependency
  of the whole action surface.
- LabeledEntriesTable was filed as domain-shared, but it is a generic
  (label, text) list with seven call sites and no domain knowledge. Moved
  to Kagura.UI so the character and lore editors stay identical.

/design grows an Inventory section rendering the same data, so the gallery
and the doc cannot drift. It is data-driven rather than referencing the
pending components, which do not exist yet.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

Summary

Summary
Generated on: 07/09/2026 - 16:38:33
Coverage date: 07/09/2026 - 16:38:29 - 07/09/2026 - 16:38:31
Parser: MultiReport (3x Cobertura)
Assemblies: 7
Classes: 65
Files: 63
Line coverage: 91.3% (1838 of 2011)
Covered lines: 1838
Uncovered lines: 173
Coverable lines: 2011
Total lines: 3741
Branch coverage: 83.6% (251 of 300)
Covered branches: 251
Total branches: 300
Method coverage: Feature is only available for sponsors

Coverage

Kagura.BlazorAdapter - 0%
Name Line Branch
Kagura.BlazorAdapter 0% 0%
Kagura.BlazorAdapter.Design 0% 0%
Kagura.Domain - 96.4%
Name Line Branch
Kagura.Domain 96.4% 82.6%
Kagura.Domain.Graph.Entry 100% 100%
Kagura.Domain.Graph.Link 100% 100%
Kagura.Domain.Graph.LinkRole 100% 100%
Kagura.Domain.Graph.LinkRoles 92.3%
Kagura.Domain.Journal.ChangeLogEntry 100%
Kagura.Domain.Projects.Project 100%
Kagura.Domain.Projects.Slug 100% 100%
System.Text.RegularExpressions.Generated 90.2% 72.2%
System.Text.RegularExpressions.Generated.<RegexGenerator_g>FE06CC341D340484
D04ADFED3A21D401C2764A1D17367E35BEB556CBB3B4B0B74__NonSlugChars_0
89.4% 75%
Kagura.Infrastructure - 95.1%
Name Line Branch
Kagura.Infrastructure 95.1% 87.5%
Kagura.Infrastructure.DependencyInjection 100%
Kagura.Infrastructure.Graph.EfGraphStore 95.5% 66.6%
Kagura.Infrastructure.Journal.EfChangeJournal 100%
Kagura.Infrastructure.Journal.EfUndoStore 97.5% 90.6%
Kagura.Infrastructure.Journal.OperationContext 100% 100%
Kagura.Infrastructure.Persistence.Configurations.ChangeLogEntryConfiguratio
n
100%
Kagura.Infrastructure.Persistence.Configurations.EntryConfiguration 100%
Kagura.Infrastructure.Persistence.Configurations.LinkConfiguration 100%
Kagura.Infrastructure.Persistence.Configurations.ProjectConfiguration 100%
Kagura.Infrastructure.Persistence.Converters.UtcTicksConverter 100%
Kagura.Infrastructure.Persistence.KaguraDbContext 85.2% 85.2%
Kagura.Infrastructure.Persistence.KaguraDbContextFactory 0%
Kagura.Infrastructure.Persistence.Migrations.AddChangeLogUndoFlag 96.8%
Kagura.Infrastructure.Persistence.Migrations.AddGraphEntryAndLink 97.7%
Kagura.Infrastructure.Persistence.Migrations.AddSoftDeleteAndChangeLog 90.3%
Kagura.Infrastructure.Persistence.Migrations.InitialCreate 94.4%
Kagura.Infrastructure.Persistence.Migrations.KaguraDbContextModelSnapshot 100%
Kagura.Infrastructure.Projects.EfProjectStore 100%
Kagura.Kernel - 90%
Name Line Branch
Kagura.Kernel 90% 75%
Kagura.Kernel.Err`1 100%
Kagura.Kernel.Ok`1 100%
Kagura.Kernel.Result`1 87.5% 75%
Kagura.Server - 94.8%
Name Line Branch
Kagura.Server 94.8% 70.5%
Kagura.Server.Components.Layout.MainLayout 100%
Kagura.Server.Components.Pages.Error 0% 0%
Kagura.Server.Components.Pages.Gate 100% 100%
Kagura.Server.Security.AccessGate 100% 100%
Kagura.Server.Security.AccessSecret 100% 100%
Program 100% 80%
Kagura.UI - 98.3%
Name Line Branch
Kagura.UI 98.3% 95.9%
Kagura.UI.Badge 100% 100%
Kagura.UI.Button 100% 100%
Kagura.UI.Card 100% 100%
Kagura.UI.CssClassExtensions 100%
Kagura.UI.EmptyState 100% 100%
Kagura.UI.Icon 100% 100%
Kagura.UI.IconCatalog 100%
Kagura.UI.StatusDot 100%
Kagura.UI.TextField 95% 91.6%
Kagura.UseCases - 95.2%
Name Line Branch
Kagura.UseCases 95.2% 95.2%
Kagura.UseCases.DependencyInjection 100%
Kagura.UseCases.Graph.EdgeGroup 100%
Kagura.UseCases.Graph.GetNodeGraph 96.4% 83.3%
Kagura.UseCases.Graph.GraphEdgeView 85.7%
Kagura.UseCases.Graph.LinkNodes 100% 100%
Kagura.UseCases.Graph.NodeGraphView 100%
Kagura.UseCases.Graph.NodeSummary 100%
Kagura.UseCases.Graph.RemoveLink 100% 100%
Kagura.UseCases.Graph.RestoreLink 100% 100%
Kagura.UseCases.Journal.ChangeRecordView 42.8%
Kagura.UseCases.Journal.GetEntityHistory 100%
Kagura.UseCases.Journal.GetUndoStatus 100%
Kagura.UseCases.Journal.Redo 100% 100%
Kagura.UseCases.Journal.Undo 100% 100%
Kagura.UseCases.Journal.UndoOutcome 100%
Kagura.UseCases.Journal.UndoStatus 100%
Kagura.UseCases.Projects.CreateProject 100% 100%
Kagura.UseCases.Projects.ListProjects 100%
Kagura.UseCases.Projects.ProjectDto 100%
<!-- coverage-comment --> # Summary <details open><summary>Summary</summary> ||| |:---|:---| | Generated on: | 07/09/2026 - 16:38:33 | | Coverage date: | 07/09/2026 - 16:38:29 - 07/09/2026 - 16:38:31 | | Parser: | MultiReport (3x Cobertura) | | Assemblies: | 7 | | Classes: | 65 | | Files: | 63 | | **Line coverage:** | 91.3% (1838 of 2011) | | Covered lines: | 1838 | | Uncovered lines: | 173 | | Coverable lines: | 2011 | | Total lines: | 3741 | | **Branch coverage:** | 83.6% (251 of 300) | | Covered branches: | 251 | | Total branches: | 300 | | **Method coverage:** | [Feature is only available for sponsors](https://reportgenerator.io/pro) | </details> ## Coverage <details><summary>Kagura.BlazorAdapter - 0%</summary> |**Name**|**Line**|**Branch**| |:---|---:|---:| |**Kagura.BlazorAdapter**|**0%**|**0%**| |Kagura.BlazorAdapter.Design|0%|0%| </details> <details><summary>Kagura.Domain - 96.4%</summary> |**Name**|**Line**|**Branch**| |:---|---:|---:| |**Kagura.Domain**|**96.4%**|**82.6%**| |Kagura.Domain.Graph.Entry|100%|100%| |Kagura.Domain.Graph.Link|100%|100%| |Kagura.Domain.Graph.LinkRole|100%|100%| |Kagura.Domain.Graph.LinkRoles|92.3%|| |Kagura.Domain.Journal.ChangeLogEntry|100%|| |Kagura.Domain.Projects.Project|100%|| |Kagura.Domain.Projects.Slug|100%|100%| |System.Text.RegularExpressions.Generated|90.2%|72.2%| |System.Text.RegularExpressions.Generated.<RegexGenerator_g>FE06CC341D340484<br/>D04ADFED3A21D401C2764A1D17367E35BEB556CBB3B4B0B74__NonSlugChars_0|89.4%|75%| </details> <details><summary>Kagura.Infrastructure - 95.1%</summary> |**Name**|**Line**|**Branch**| |:---|---:|---:| |**Kagura.Infrastructure**|**95.1%**|**87.5%**| |Kagura.Infrastructure.DependencyInjection|100%|| |Kagura.Infrastructure.Graph.EfGraphStore|95.5%|66.6%| |Kagura.Infrastructure.Journal.EfChangeJournal|100%|| |Kagura.Infrastructure.Journal.EfUndoStore|97.5%|90.6%| |Kagura.Infrastructure.Journal.OperationContext|100%|100%| |Kagura.Infrastructure.Persistence.Configurations.ChangeLogEntryConfiguratio<br/>n|100%|| |Kagura.Infrastructure.Persistence.Configurations.EntryConfiguration|100%|| |Kagura.Infrastructure.Persistence.Configurations.LinkConfiguration|100%|| |Kagura.Infrastructure.Persistence.Configurations.ProjectConfiguration|100%|| |Kagura.Infrastructure.Persistence.Converters.UtcTicksConverter|100%|| |Kagura.Infrastructure.Persistence.KaguraDbContext|85.2%|85.2%| |Kagura.Infrastructure.Persistence.KaguraDbContextFactory|0%|| |Kagura.Infrastructure.Persistence.Migrations.AddChangeLogUndoFlag|96.8%|| |Kagura.Infrastructure.Persistence.Migrations.AddGraphEntryAndLink|97.7%|| |Kagura.Infrastructure.Persistence.Migrations.AddSoftDeleteAndChangeLog|90.3%|| |Kagura.Infrastructure.Persistence.Migrations.InitialCreate|94.4%|| |Kagura.Infrastructure.Persistence.Migrations.KaguraDbContextModelSnapshot|100%|| |Kagura.Infrastructure.Projects.EfProjectStore|100%|| </details> <details><summary>Kagura.Kernel - 90%</summary> |**Name**|**Line**|**Branch**| |:---|---:|---:| |**Kagura.Kernel**|**90%**|**75%**| |Kagura.Kernel.Err`1|100%|| |Kagura.Kernel.Ok`1|100%|| |Kagura.Kernel.Result`1|87.5%|75%| </details> <details><summary>Kagura.Server - 94.8%</summary> |**Name**|**Line**|**Branch**| |:---|---:|---:| |**Kagura.Server**|**94.8%**|**70.5%**| |Kagura.Server.Components.Layout.MainLayout|100%|| |Kagura.Server.Components.Pages.Error|0%|0%| |Kagura.Server.Components.Pages.Gate|100%|100%| |Kagura.Server.Security.AccessGate|100%|100%| |Kagura.Server.Security.AccessSecret|100%|100%| |Program|100%|80%| </details> <details><summary>Kagura.UI - 98.3%</summary> |**Name**|**Line**|**Branch**| |:---|---:|---:| |**Kagura.UI**|**98.3%**|**95.9%**| |Kagura.UI.Badge|100%|100%| |Kagura.UI.Button|100%|100%| |Kagura.UI.Card|100%|100%| |Kagura.UI.CssClassExtensions|100%|| |Kagura.UI.EmptyState|100%|100%| |Kagura.UI.Icon|100%|100%| |Kagura.UI.IconCatalog|100%|| |Kagura.UI.StatusDot|100%|| |Kagura.UI.TextField|95%|91.6%| </details> <details><summary>Kagura.UseCases - 95.2%</summary> |**Name**|**Line**|**Branch**| |:---|---:|---:| |**Kagura.UseCases**|**95.2%**|**95.2%**| |Kagura.UseCases.DependencyInjection|100%|| |Kagura.UseCases.Graph.EdgeGroup|100%|| |Kagura.UseCases.Graph.GetNodeGraph|96.4%|83.3%| |Kagura.UseCases.Graph.GraphEdgeView|85.7%|| |Kagura.UseCases.Graph.LinkNodes|100%|100%| |Kagura.UseCases.Graph.NodeGraphView|100%|| |Kagura.UseCases.Graph.NodeSummary|100%|| |Kagura.UseCases.Graph.RemoveLink|100%|100%| |Kagura.UseCases.Graph.RestoreLink|100%|100%| |Kagura.UseCases.Journal.ChangeRecordView|42.8%|| |Kagura.UseCases.Journal.GetEntityHistory|100%|| |Kagura.UseCases.Journal.GetUndoStatus|100%|| |Kagura.UseCases.Journal.Redo|100%|100%| |Kagura.UseCases.Journal.Undo|100%|100%| |Kagura.UseCases.Journal.UndoOutcome|100%|| |Kagura.UseCases.Journal.UndoStatus|100%|| |Kagura.UseCases.Projects.CreateProject|100%|100%| |Kagura.UseCases.Projects.ListProjects|100%|| |Kagura.UseCases.Projects.ProjectDto|100%|| </details>
Member

🔮 fufu~ Jibril reviewed your code!

A planning PR with no production code — and you still wired the /design gallery to render the same data so the doc and the UI can't drift? Oh, that's elegant~ ♡ Knowledge that lives in two places is knowledge that rots in two places, and you refused to let that happen. Fufu~

I read the full design-system.md rewrite, the new Design.razor inventory section, the CSS, and then cross-checked the markdown tables against the _inventory array programmatically.

Verdict: Looks good to me~

I verified the 8/48 header is real: the array has exactly 48 entries, exactly 8 with Built: true (Button, TextField, Stack/Row/Cluster, Card, Badge, EmptyState, StatusDot, Icon). The _inventory.Count(c => c.Built)/@_inventory.Length binding will always agree with reality — good, no magic number to go stale.

The uses counts are consistent between the markdown doc and the C# array. I extracted every | N row from the doc and every new("...", "...", N) from the array and diffed them — they match. Modal+ConfirmDialog=12, TextArea=8, DocumentHistoryPanel/LabeledEntriesTable=7, Table/ConnectionsPanel/SaveIndicator=6, etc. The build-order signal is the same in both places. ♪

The InventoryItem record is private static readonly, data-only, no logic to test. The grouping/ordering (GroupByOrderByDescending(Built)ThenByDescending(Uses)) is correct and deterministic. The @(item.Uses > 0 ? $"{item.Uses} uses" : "—") display correctly shows for built/zero-use components (matching the doc's convention). The Badge Tone="Tone.Success" Icon="check" for "Built" vs untoned <Badge> for "Pending" matches the established pattern in the existing Badges section of the gallery.

The <a href> to design-system.md points at the main branch web view — correct, that's the default branch and the file exists there.

💡 Little ideas (non-blocking)~

  1. Design.razor — the <a> link is hardcoded to main. When this PR's branch is checked out locally, the link still points at main (where the old flat list lives until merge). Harmless — the gallery is for the merged state — but if you ever want it accurate pre-merge, it could read the current ref. Truly a nit; ignore me~ ♡
  2. The two "Open decisions" are the most valuable part of this PR and I want to make sure they don't get lost. Consider opening tracked issues for them (disabled-with-reason / Tooltip priority; LabeledEntriesTable placement) so the decision gets made before someone starts building Button v2 or the entries table. The PR body flags them well; an issue makes them unmissable.

What I liked~

  • Uses-count as build-order signal instead of "what's easiest." That's a genuinely better heuristic and the reordering it forces (Modal at 12 before Table at 6) is correct — overlays are blocking more stories.
  • The Field wrapper callout ("extract before TextArea/Select/Slider, or five inputs each re-implement it and drift"). That is the kind of note that prevents a future DRY violation epidemic. Fufu~ you're thinking ahead like someone who's been burned before. ♡
  • LabeledEntriesTable refiled from domain-shared to Data display, with reasoning recorded openly rather than silently moved. Seven call sites, knows nothing about characters/lore — the reclassification is right, and flagging it as a reversible decision is the honest way to do it.
  • The overlay-root note (focus trap / Esc / scroll lock, built once). Calling out that --z-dropdown/drawer/modal/toast and --shadow-3 are reserved-but-unconsumed is exactly the kind of "biggest hole" signal that keeps a design system from accumulating half-built overlays.

Automated review by Jibril · 2026-07-09
CI/CD: passed for head SHA 4505a00 (forgejo-actions coverage comment, today 16:38 UTC — 91.3% line / 83.6% branch; Kagura.BlazorAdapter.Design shows 0% because the gallery page has no tests, which is expected for a presentational design reference) · Local checks: skipped (CI current and green; no production logic added)

## 🔮 fufu~ Jibril reviewed your code! A *planning* PR with no production code — and you still wired the `/design` gallery to render the same data so the doc and the UI can't drift? Oh, that's elegant~ ♡ Knowledge that lives in two places is knowledge that rots in two places, and you refused to let that happen. Fufu~ I read the full `design-system.md` rewrite, the new `Design.razor` inventory section, the CSS, and then cross-checked the markdown tables against the `_inventory` array programmatically. ### Verdict: ✅ Looks good to me~ I verified the **8/48** header is real: the array has exactly 48 entries, exactly 8 with `Built: true` (Button, TextField, Stack/Row/Cluster, Card, Badge, EmptyState, StatusDot, Icon). The `_inventory.Count(c => c.Built)/@_inventory.Length` binding will always agree with reality — good, no magic number to go stale. The **uses counts are consistent** between the markdown doc and the C# array. I extracted every `| N` row from the doc and every `new("...", "...", N)` from the array and diffed them — they match. Modal+ConfirmDialog=12, TextArea=8, DocumentHistoryPanel/LabeledEntriesTable=7, Table/ConnectionsPanel/SaveIndicator=6, etc. The build-order signal is the same in both places. ♪ The `InventoryItem` record is `private static readonly`, data-only, no logic to test. The grouping/ordering (`GroupBy` → `OrderByDescending(Built)` → `ThenByDescending(Uses)`) is correct and deterministic. The `@(item.Uses > 0 ? $"{item.Uses} uses" : "—")` display correctly shows `—` for built/zero-use components (matching the doc's `—` convention). The `Badge Tone="Tone.Success" Icon="check"` for "Built" vs untoned `<Badge>` for "Pending" matches the established pattern in the existing Badges section of the gallery. The `<a href>` to `design-system.md` points at the `main` branch web view — correct, that's the default branch and the file exists there. #### 💡 Little ideas (non-blocking)~ 1. **`Design.razor` — the `<a>` link is hardcoded to `main`.** When this PR's branch is checked out locally, the link still points at `main` (where the old flat list lives until merge). Harmless — the gallery is for the merged state — but if you ever want it accurate pre-merge, it could read the current ref. Truly a nit; ignore me~ ♡ 2. **The two "Open decisions" are the most valuable part of this PR** and I want to make sure they don't get lost. Consider opening tracked issues for them (disabled-with-reason / Tooltip priority; LabeledEntriesTable placement) so the decision gets made *before* someone starts building Button v2 or the entries table. The PR body flags them well; an issue makes them unmissable. #### ✅ What I liked~ - **Uses-count as build-order signal** instead of "what's easiest." That's a genuinely better heuristic and the reordering it forces (Modal at 12 before Table at 6) is correct — overlays are blocking more stories. - **The `Field` wrapper callout** ("extract before TextArea/Select/Slider, or five inputs each re-implement it and drift"). *That* is the kind of note that prevents a future DRY violation epidemic. Fufu~ you're thinking ahead like someone who's been burned before. ♡ - **LabeledEntriesTable refiled from domain-shared to Data display**, with reasoning recorded openly rather than silently moved. Seven call sites, knows nothing about characters/lore — the reclassification is right, and flagging it as a reversible decision is the honest way to do it. - **The overlay-root note** (focus trap / Esc / scroll lock, built once). Calling out that `--z-dropdown/drawer/modal/toast` and `--shadow-3` are reserved-but-unconsumed is exactly the kind of "biggest hole" signal that keeps a design system from accumulating half-built overlays. --- *Automated review by Jibril · 2026-07-09* *CI/CD: passed for head SHA `4505a00` (forgejo-actions coverage comment, today 16:38 UTC — 91.3% line / 83.6% branch; `Kagura.BlazorAdapter.Design` shows 0% because the gallery page has no tests, which is expected for a presentational design reference) · Local checks: skipped (CI current and green; no production logic added)*
bjoern merged commit a999ccb263 into main 2026-07-09 18:51:26 +02:00
bjoern deleted branch docs/design-system-inventory 2026-07-09 18:51:26 +02:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
3 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
TeamAI/Kagura!11
No description provided.