refactor: every page shell shares one width token #24

Merged
bjoern merged 2 commits from refactor/shell-width into main 2026-07-25 09:18:14 +02:00
Member

What

The app was consistently inconsistent about page width: projects list and project workspace at 64rem, the bible at 56rem, the page workspace at 72rem, and only settings on the shared var(--shell-max-width) token — so navigating between pages made the content column jump around.

All five main pages now share the token frame settings already used:

width: 100%;
max-width: var(--shell-max-width);
padding: var(--space-4) var(--space-5) var(--space-6);

The token itself was widened from 76rem to 90rem (1440px) in Kagaku.UI #4 — embracing the wide-desktop target of a manga translation workspace. This PR carries the submodule bump to merged Kagaku.UI main (86d8b22).

Deliberately untouched: the project wizard (44rem) and the login gate (22rem) — narrow single-column forms, not workspaces.

Verification

Full solution builds clean; all 72 BlazorAdapter tests pass.

🤖 Generated with Claude Code

## What The app was consistently inconsistent about page width: projects list and project workspace at 64rem, the bible at 56rem, the page workspace at 72rem, and only settings on the shared `var(--shell-max-width)` token — so navigating between pages made the content column jump around. All five main pages now share the token frame settings already used: ```css width: 100%; max-width: var(--shell-max-width); padding: var(--space-4) var(--space-5) var(--space-6); ``` The token itself was widened from 76rem to **90rem** (1440px) in Kagaku.UI #4 — embracing the wide-desktop target of a manga translation workspace. This PR carries the submodule bump to merged Kagaku.UI main (`86d8b22`). Deliberately untouched: the project wizard (44rem) and the login gate (22rem) — narrow single-column forms, not workspaces. ## Verification Full solution builds clean; all 72 BlazorAdapter tests pass. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
refactor: every page shell shares one width token
All checks were successful
CI / build (pull_request) Successful in 22s
CI / test (pull_request) Successful in 34s
e3c8ad5507
The main pages each rolled their own centered container — projects list
and workspace at 64rem, the bible at 56rem, the page workspace at 72rem,
settings alone on var(--shell-max-width) — so navigating between them
made the content column jump around. All five now sit on the shared
token (widened to 90rem in Kagaku.UI #4 for the wide-desktop target)
with the same token-based padding settings already used. The wizard and
the login gate keep their deliberately narrow form widths.

Includes the Kagaku.UI submodule bump to merged main (86d8b22).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

Summary

Summary
Generated on: 07/25/2026 - 07:18:21
Coverage date: 07/25/2026 - 07:18:13 - 07/25/2026 - 07:18:19
Parser: MultiReport (4x Cobertura)
Assemblies: 6
Classes: 180
Files: 123
Line coverage: 93.2% (6000 of 6437)
Covered lines: 6000
Uncovered lines: 437
Coverable lines: 6437
Total lines: 10980
Branch coverage: 75.7% (1159 of 1531)
Covered branches: 1159
Total branches: 1531
Method coverage: Feature is only available for sponsors

Coverage

Orihon.BlazorAdapter - 81.9%
Name Line Branch
Orihon.BlazorAdapter 81.9% 77.1%
Orihon.BlazorAdapter.Bible.BiblePage 71.7% 59%
Orihon.BlazorAdapter.BlazorAdapterAssembly 100%
Orihon.BlazorAdapter.Debounce 91.6% 93.7%
Orihon.BlazorAdapter.PageWorkspace.PageWorkspacePage 84.6% 77.8%
Orihon.BlazorAdapter.Projects.ProjectListPage 86% 85.2%
Orihon.BlazorAdapter.Projects.ProjectWizardPage 91.3% 78.2%
Orihon.BlazorAdapter.Settings.SettingsPage 100% 92.5%
Orihon.BlazorAdapter.Uploads.UploadTransfer 96.5% 100%
Orihon.BlazorAdapter.Uploads.UploadTransferProgress 100% 100%
Orihon.BlazorAdapter.Uploads.UploadTransferResult 100%
Orihon.BlazorAdapter.Workspace.ProjectWorkspacePage 65.4% 73.3%
Orihon.Domain - 100%
Name Line Branch
Orihon.Domain 100% 100%
Orihon.Domain.Agents.AgentDescriptor 100%
Orihon.Domain.Agents.AgentRoster 100% 100%
Orihon.Domain.Bible.Character 100% 100%
Orihon.Domain.Bible.GlossaryEntry 100% 100%
Orihon.Domain.Bible.LoreEntry 100% 100%
Orihon.Domain.Bible.PageSummary 100%
Orihon.Domain.Bible.StoryBeat 100%
Orihon.Domain.Projects.Project 100% 100%
Orihon.Domain.Projects.ProjectProfile 100%
Orihon.Domain.Runs.Execution 100% 100%
Orihon.Domain.Runs.Run 100%
Orihon.Domain.Settings.AppSetting 100%
Orihon.Domain.Text 100% 100%
Orihon.Domain.Translation.BoundingBox 100%
Orihon.Domain.Translation.Chapter 100%
Orihon.Domain.Translation.Page 100%
Orihon.Domain.Translation.Region 100% 100%
Orihon.Domain.Translation.RegionProfile 100%
Orihon.Infrastructure - 93.7%
Name Line Branch
Orihon.Infrastructure 93.7% 65.7%
Orihon.Infrastructure.Bible.EfBibleStore 100% 100%
Orihon.Infrastructure.DependencyInjection 100%
Orihon.Infrastructure.Gateways.AgentToolAdapter 100%
Orihon.Infrastructure.Gateways.AgentToolAdapter`1 100% 100%
Orihon.Infrastructure.Gateways.HttpWebPageFetcher 95.1% 83.3%
Orihon.Infrastructure.Gateways.OpenRouterLlmGateway 98.9% 84.1%
Orihon.Infrastructure.Persistence.Configurations.AppSettingConfiguration 100%
Orihon.Infrastructure.Persistence.Configurations.ChapterConfiguration 100%
Orihon.Infrastructure.Persistence.Configurations.CharacterConfiguration 100%
Orihon.Infrastructure.Persistence.Configurations.ExecutionConfiguration 100%
Orihon.Infrastructure.Persistence.Configurations.GlossaryEntryConfiguration 100%
Orihon.Infrastructure.Persistence.Configurations.JsonColumnMapper 100%
Orihon.Infrastructure.Persistence.Configurations.LoreEntryConfiguration 100%
Orihon.Infrastructure.Persistence.Configurations.PageConfiguration 100%
Orihon.Infrastructure.Persistence.Configurations.PageSummaryConfiguration 100%
Orihon.Infrastructure.Persistence.Configurations.ProjectConfiguration 100%
Orihon.Infrastructure.Persistence.Configurations.RegionConfiguration 100%
Orihon.Infrastructure.Persistence.Configurations.RunConfiguration 100%
Orihon.Infrastructure.Persistence.Configurations.StoryBeatConfiguration 100%
Orihon.Infrastructure.Persistence.Converters.UtcTicksConverter 100%
Orihon.Infrastructure.Persistence.Migrations.AddAppSettings 99.3%
Orihon.Infrastructure.Persistence.Migrations.AddRuns 99.1%
Orihon.Infrastructure.Persistence.Migrations.InitialTranslationDomain 97.3%
Orihon.Infrastructure.Persistence.Migrations.OrihonDbContextModelSnapshot 100%
Orihon.Infrastructure.Persistence.OrihonDbContext 100%
Orihon.Infrastructure.Persistence.OrihonDbContextFactory 100%
Orihon.Infrastructure.Projects.EfProjectStore 100% 100%
Orihon.Infrastructure.Projects.FileSystemPageImageStore 100% 100%
Orihon.Infrastructure.Runs.EfRunStore 96.7% 50%
Orihon.Infrastructure.Settings.EfAppSettingsStore 100% 100%
Orihon.Infrastructure.Translation.EfChapterStore 100% 100%
Orihon.Infrastructure.Translation.EfPageStore 100% 100%
Orihon.Infrastructure.Translation.EfRegionStore 100% 100%
Orihon.Infrastructure.Translation.Ordering 100% 100%
System.Text.RegularExpressions.Generated 70.6% 53.3%
System.Text.RegularExpressions.Generated.<RegexGenerator_g>F7FCA343D2B99030
A835C427B12E8B84E2A8A7283193FC51C220B5B4E80CE8D56__BlankLines_4
77.9% 76.6%
System.Text.RegularExpressions.Generated.<RegexGenerator_g>F7FCA343D2B99030
A835C427B12E8B84E2A8A7283193FC51C220B5B4E80CE8D56__BlockBreaks_1
59% 42.5%
System.Text.RegularExpressions.Generated.<RegexGenerator_g>F7FCA343D2B99030
A835C427B12E8B84E2A8A7283193FC51C220B5B4E80CE8D56__SpaceRuns_3
89.4% 75%
System.Text.RegularExpressions.Generated.<RegexGenerator_g>F7FCA343D2B99030
A835C427B12E8B84E2A8A7283193FC51C220B5B4E80CE8D56__Tags_2
83.7% 62.5%
Orihon.Kernel - 90.9%
Name Line Branch
Orihon.Kernel 90.9% 75%
Orihon.Kernel.Err`1 100%
Orihon.Kernel.Ok`1 100%
Orihon.Kernel.Result`1 88.8% 75%
Orihon.Server - 93.3%
Name Line Branch
Orihon.Server 93.3% 68.4%
Orihon.Server.Components.App 100%
Orihon.Server.Components.Layout.MainLayout 100%
Orihon.Server.Components.Pages.Gate 64.2% 66.6%
Orihon.Server.RunEngineBootstrap 100%
Orihon.Server.Security.AccessGate 91.8% 41.6%
Orihon.Server.Security.AccessSecret 100% 50%
Orihon.Server.VolumeStartupValidator 100% 100%
Program 95.3% 85.7%
Orihon.UseCases - 96.2%
Name Line Branch
Orihon.UseCases 96.2% 88.9%
Orihon.UseCases.Agents.AgentBlueprint 100%
Orihon.UseCases.Agents.AgentInvocation 100%
Orihon.UseCases.Agents.AgentOutcome 100%
Orihon.UseCases.Agents.AgentTool`1 90.9% 75%
Orihon.UseCases.Agents.AgentToolImage 100%
Orihon.UseCases.Agents.AgentToolResult 100%
Orihon.UseCases.Agents.AssistantSpoke 100%
Orihon.UseCases.Agents.ResearchSetup.AddGlossaryParams 100%
Orihon.UseCases.Agents.ResearchSetup.AddGlossaryTool 100% 100%
Orihon.UseCases.Agents.ResearchSetup.AddStoryBeatParams 100%
Orihon.UseCases.Agents.ResearchSetup.AddStoryBeatTool 100% 50%
Orihon.UseCases.Agents.ResearchSetup.AskUserParams 100%
Orihon.UseCases.Agents.ResearchSetup.AskUserTool 100% 100%
Orihon.UseCases.Agents.ResearchSetup.FetchUrlParams 100%
Orihon.UseCases.Agents.ResearchSetup.FetchUrlTool 100% 100%
Orihon.UseCases.Agents.ResearchSetup.ListBibleTool 86.6%
Orihon.UseCases.Agents.ResearchSetup.PageByNumber 90% 87.5%
Orihon.UseCases.Agents.ResearchSetup.ResearchSetupBlueprint 100%
Orihon.UseCases.Agents.ResearchSetup.SetPageSummaryParams 100%
Orihon.UseCases.Agents.ResearchSetup.SetPageSummaryTool 100% 75%
Orihon.UseCases.Agents.ResearchSetup.SetProjectMetadataParams 100%
Orihon.UseCases.Agents.ResearchSetup.SetProjectMetadataTool 96.1% 90.9%
Orihon.UseCases.Agents.ResearchSetup.UpsertCharacterParams 100%
Orihon.UseCases.Agents.ResearchSetup.UpsertCharacterTool 91.3% 66.6%
Orihon.UseCases.Agents.ResearchSetup.UpsertLoreParams 100%
Orihon.UseCases.Agents.ResearchSetup.UpsertLoreTool 91.3% 66.6%
Orihon.UseCases.Agents.ResearchSetup.ViewPageParams 100%
Orihon.UseCases.Agents.ResearchSetup.ViewPageTool 85.7% 50%
Orihon.UseCases.Agents.ToolCalled 100%
Orihon.UseCases.Agents.ToolCompleted 100%
Orihon.UseCases.Bible.AddCharacter 100% 100%
Orihon.UseCases.Bible.AddGlossaryEntry 100% 100%
Orihon.UseCases.Bible.AddLoreEntry 100% 100%
Orihon.UseCases.Bible.AddStoryBeat 100% 100%
Orihon.UseCases.Bible.BibleDto 100%
Orihon.UseCases.Bible.CharacterDto 100%
Orihon.UseCases.Bible.DeleteCharacter 100% 100%
Orihon.UseCases.Bible.DeleteGlossaryEntry 100% 100%
Orihon.UseCases.Bible.DeleteLoreEntry 100% 100%
Orihon.UseCases.Bible.DeletePageSummary 100% 100%
Orihon.UseCases.Bible.DeleteStoryBeat 100% 100%
Orihon.UseCases.Bible.GetBible 100% 100%
Orihon.UseCases.Bible.GlossaryEntryDto 100%
Orihon.UseCases.Bible.LoreEntryDto 100%
Orihon.UseCases.Bible.PageSummaryDto 100%
Orihon.UseCases.Bible.ReorderStoryBeats 100%
Orihon.UseCases.Bible.SetPageSummary 100% 100%
Orihon.UseCases.Bible.StoryBeatDto 100%
Orihon.UseCases.Bible.UpdateCharacter 100% 100%
Orihon.UseCases.Bible.UpdateGlossaryEntry 100% 100%
Orihon.UseCases.Bible.UpdateLoreEntry 100% 100%
Orihon.UseCases.Bible.UpdateStoryBeat 100% 100%
Orihon.UseCases.Chapters.ChapterDto 100%
Orihon.UseCases.Chapters.CreateChapter 100% 100%
Orihon.UseCases.Chapters.DeleteChapter 100% 100%
Orihon.UseCases.Chapters.RenameChapter 100% 100%
Orihon.UseCases.Chapters.ReorderChapters 100%
Orihon.UseCases.DependencyInjection 100%
Orihon.UseCases.Diagnostics.SeedDevData 99% 92.8%
Orihon.UseCases.Gateways.LlmKeyInfo 100%
Orihon.UseCases.Gateways.LlmModel 100%
Orihon.UseCases.NextOrder 100%
Orihon.UseCases.Pages.DeletePage 100% 100%
Orihon.UseCases.Pages.GetPage 100% 100%
Orihon.UseCases.Pages.GetProjectWorkspace 100% 100%
Orihon.UseCases.Pages.ImportPages 97.7% 96.6%
Orihon.UseCases.Pages.ImportPagesResult 100%
Orihon.UseCases.Pages.MovePage 100% 92.8%
Orihon.UseCases.Pages.PageDetailDto 100%
Orihon.UseCases.Pages.PageDto 100%
Orihon.UseCases.Pages.PageUpload 100%
Orihon.UseCases.Pages.ProjectWorkspaceDto 100%
Orihon.UseCases.Pages.ReorderPages 100%
Orihon.UseCases.Pages.SetPageMeta 100% 100%
Orihon.UseCases.Pages.WorkspaceChapterDto 100%
Orihon.UseCases.Projects.CompleteProjectSetup 100% 93.7%
Orihon.UseCases.Projects.CreateProject 100% 100%
Orihon.UseCases.Projects.DeleteProject 100% 100%
Orihon.UseCases.Projects.GetProject 100% 100%
Orihon.UseCases.Projects.ListProjects 100%
Orihon.UseCases.Projects.ProjectDto 95.8%
Orihon.UseCases.Projects.StoredPageImage 100%
Orihon.UseCases.Projects.UpdateProjectMetadata 100% 100%
Orihon.UseCases.Regions.CreateRegion 100% 100%
Orihon.UseCases.Regions.DeleteRegion 100% 100%
Orihon.UseCases.Regions.RegionDto 97%
Orihon.UseCases.Regions.ReorderRegions 100%
Orihon.UseCases.Regions.UpdateRegion 100% 100%
Orihon.UseCases.Runs.ExecutionDto 69.2%
Orihon.UseCases.Runs.PlannedExecution 100%
Orihon.UseCases.Runs.RunDto 86.6% 60%
Orihon.UseCases.Runs.RunEngine 87.6% 81.2%
Orihon.UseCases.Runs.RunEngineOptions 100%
Orihon.UseCases.Runs.StageContext 37.5%
Orihon.UseCases.Settings.AgentSettingDto 100% 100%
Orihon.UseCases.Settings.GetSettings 100% 100%
Orihon.UseCases.Settings.ListModelOptions 100% 100%
Orihon.UseCases.Settings.SaveAgentModel 100% 100%
Orihon.UseCases.Settings.SaveOpenRouterKey 100% 100%
Orihon.UseCases.Settings.SettingKeys 100% 100%
Orihon.UseCases.Settings.SettingsDto 100%
<!-- coverage-comment --> # Summary <details open><summary>Summary</summary> ||| |:---|:---| | Generated on: | 07/25/2026 - 07:18:21 | | Coverage date: | 07/25/2026 - 07:18:13 - 07/25/2026 - 07:18:19 | | Parser: | MultiReport (4x Cobertura) | | Assemblies: | 6 | | Classes: | 180 | | Files: | 123 | | **Line coverage:** | 93.2% (6000 of 6437) | | Covered lines: | 6000 | | Uncovered lines: | 437 | | Coverable lines: | 6437 | | Total lines: | 10980 | | **Branch coverage:** | 75.7% (1159 of 1531) | | Covered branches: | 1159 | | Total branches: | 1531 | | **Method coverage:** | [Feature is only available for sponsors](https://reportgenerator.io/pro) | </details> ## Coverage <details><summary>Orihon.BlazorAdapter - 81.9%</summary> |**Name**|**Line**|**Branch**| |:---|---:|---:| |**Orihon.BlazorAdapter**|**81.9%**|**77.1%**| |Orihon.BlazorAdapter.Bible.BiblePage|71.7%|59%| |Orihon.BlazorAdapter.BlazorAdapterAssembly|100%|| |Orihon.BlazorAdapter.Debounce|91.6%|93.7%| |Orihon.BlazorAdapter.PageWorkspace.PageWorkspacePage|84.6%|77.8%| |Orihon.BlazorAdapter.Projects.ProjectListPage|86%|85.2%| |Orihon.BlazorAdapter.Projects.ProjectWizardPage|91.3%|78.2%| |Orihon.BlazorAdapter.Settings.SettingsPage|100%|92.5%| |Orihon.BlazorAdapter.Uploads.UploadTransfer|96.5%|100%| |Orihon.BlazorAdapter.Uploads.UploadTransferProgress|100%|100%| |Orihon.BlazorAdapter.Uploads.UploadTransferResult|100%|| |Orihon.BlazorAdapter.Workspace.ProjectWorkspacePage|65.4%|73.3%| </details> <details><summary>Orihon.Domain - 100%</summary> |**Name**|**Line**|**Branch**| |:---|---:|---:| |**Orihon.Domain**|**100%**|**100%**| |Orihon.Domain.Agents.AgentDescriptor|100%|| |Orihon.Domain.Agents.AgentRoster|100%|100%| |Orihon.Domain.Bible.Character|100%|100%| |Orihon.Domain.Bible.GlossaryEntry|100%|100%| |Orihon.Domain.Bible.LoreEntry|100%|100%| |Orihon.Domain.Bible.PageSummary|100%|| |Orihon.Domain.Bible.StoryBeat|100%|| |Orihon.Domain.Projects.Project|100%|100%| |Orihon.Domain.Projects.ProjectProfile|100%|| |Orihon.Domain.Runs.Execution|100%|100%| |Orihon.Domain.Runs.Run|100%|| |Orihon.Domain.Settings.AppSetting|100%|| |Orihon.Domain.Text|100%|100%| |Orihon.Domain.Translation.BoundingBox|100%|| |Orihon.Domain.Translation.Chapter|100%|| |Orihon.Domain.Translation.Page|100%|| |Orihon.Domain.Translation.Region|100%|100%| |Orihon.Domain.Translation.RegionProfile|100%|| </details> <details><summary>Orihon.Infrastructure - 93.7%</summary> |**Name**|**Line**|**Branch**| |:---|---:|---:| |**Orihon.Infrastructure**|**93.7%**|**65.7%**| |Orihon.Infrastructure.Bible.EfBibleStore|100%|100%| |Orihon.Infrastructure.DependencyInjection|100%|| |Orihon.Infrastructure.Gateways.AgentToolAdapter|100%|| |Orihon.Infrastructure.Gateways.AgentToolAdapter`1|100%|100%| |Orihon.Infrastructure.Gateways.HttpWebPageFetcher|95.1%|83.3%| |Orihon.Infrastructure.Gateways.OpenRouterLlmGateway|98.9%|84.1%| |Orihon.Infrastructure.Persistence.Configurations.AppSettingConfiguration|100%|| |Orihon.Infrastructure.Persistence.Configurations.ChapterConfiguration|100%|| |Orihon.Infrastructure.Persistence.Configurations.CharacterConfiguration|100%|| |Orihon.Infrastructure.Persistence.Configurations.ExecutionConfiguration|100%|| |Orihon.Infrastructure.Persistence.Configurations.GlossaryEntryConfiguration|100%|| |Orihon.Infrastructure.Persistence.Configurations.JsonColumnMapper|100%|| |Orihon.Infrastructure.Persistence.Configurations.LoreEntryConfiguration|100%|| |Orihon.Infrastructure.Persistence.Configurations.PageConfiguration|100%|| |Orihon.Infrastructure.Persistence.Configurations.PageSummaryConfiguration|100%|| |Orihon.Infrastructure.Persistence.Configurations.ProjectConfiguration|100%|| |Orihon.Infrastructure.Persistence.Configurations.RegionConfiguration|100%|| |Orihon.Infrastructure.Persistence.Configurations.RunConfiguration|100%|| |Orihon.Infrastructure.Persistence.Configurations.StoryBeatConfiguration|100%|| |Orihon.Infrastructure.Persistence.Converters.UtcTicksConverter|100%|| |Orihon.Infrastructure.Persistence.Migrations.AddAppSettings|99.3%|| |Orihon.Infrastructure.Persistence.Migrations.AddRuns|99.1%|| |Orihon.Infrastructure.Persistence.Migrations.InitialTranslationDomain|97.3%|| |Orihon.Infrastructure.Persistence.Migrations.OrihonDbContextModelSnapshot|100%|| |Orihon.Infrastructure.Persistence.OrihonDbContext|100%|| |Orihon.Infrastructure.Persistence.OrihonDbContextFactory|100%|| |Orihon.Infrastructure.Projects.EfProjectStore|100%|100%| |Orihon.Infrastructure.Projects.FileSystemPageImageStore|100%|100%| |Orihon.Infrastructure.Runs.EfRunStore|96.7%|50%| |Orihon.Infrastructure.Settings.EfAppSettingsStore|100%|100%| |Orihon.Infrastructure.Translation.EfChapterStore|100%|100%| |Orihon.Infrastructure.Translation.EfPageStore|100%|100%| |Orihon.Infrastructure.Translation.EfRegionStore|100%|100%| |Orihon.Infrastructure.Translation.Ordering|100%|100%| |System.Text.RegularExpressions.Generated|70.6%|53.3%| |System.Text.RegularExpressions.Generated.<RegexGenerator_g>F7FCA343D2B99030<br/>A835C427B12E8B84E2A8A7283193FC51C220B5B4E80CE8D56__BlankLines_4|77.9%|76.6%| |System.Text.RegularExpressions.Generated.<RegexGenerator_g>F7FCA343D2B99030<br/>A835C427B12E8B84E2A8A7283193FC51C220B5B4E80CE8D56__BlockBreaks_1|59%|42.5%| |System.Text.RegularExpressions.Generated.<RegexGenerator_g>F7FCA343D2B99030<br/>A835C427B12E8B84E2A8A7283193FC51C220B5B4E80CE8D56__SpaceRuns_3|89.4%|75%| |System.Text.RegularExpressions.Generated.<RegexGenerator_g>F7FCA343D2B99030<br/>A835C427B12E8B84E2A8A7283193FC51C220B5B4E80CE8D56__Tags_2|83.7%|62.5%| </details> <details><summary>Orihon.Kernel - 90.9%</summary> |**Name**|**Line**|**Branch**| |:---|---:|---:| |**Orihon.Kernel**|**90.9%**|**75%**| |Orihon.Kernel.Err`1|100%|| |Orihon.Kernel.Ok`1|100%|| |Orihon.Kernel.Result`1|88.8%|75%| </details> <details><summary>Orihon.Server - 93.3%</summary> |**Name**|**Line**|**Branch**| |:---|---:|---:| |**Orihon.Server**|**93.3%**|**68.4%**| |Orihon.Server.Components.App|100%|| |Orihon.Server.Components.Layout.MainLayout|100%|| |Orihon.Server.Components.Pages.Gate|64.2%|66.6%| |Orihon.Server.RunEngineBootstrap|100%|| |Orihon.Server.Security.AccessGate|91.8%|41.6%| |Orihon.Server.Security.AccessSecret|100%|50%| |Orihon.Server.VolumeStartupValidator|100%|100%| |Program|95.3%|85.7%| </details> <details><summary>Orihon.UseCases - 96.2%</summary> |**Name**|**Line**|**Branch**| |:---|---:|---:| |**Orihon.UseCases**|**96.2%**|**88.9%**| |Orihon.UseCases.Agents.AgentBlueprint|100%|| |Orihon.UseCases.Agents.AgentInvocation|100%|| |Orihon.UseCases.Agents.AgentOutcome|100%|| |Orihon.UseCases.Agents.AgentTool`1|90.9%|75%| |Orihon.UseCases.Agents.AgentToolImage|100%|| |Orihon.UseCases.Agents.AgentToolResult|100%|| |Orihon.UseCases.Agents.AssistantSpoke|100%|| |Orihon.UseCases.Agents.ResearchSetup.AddGlossaryParams|100%|| |Orihon.UseCases.Agents.ResearchSetup.AddGlossaryTool|100%|100%| |Orihon.UseCases.Agents.ResearchSetup.AddStoryBeatParams|100%|| |Orihon.UseCases.Agents.ResearchSetup.AddStoryBeatTool|100%|50%| |Orihon.UseCases.Agents.ResearchSetup.AskUserParams|100%|| |Orihon.UseCases.Agents.ResearchSetup.AskUserTool|100%|100%| |Orihon.UseCases.Agents.ResearchSetup.FetchUrlParams|100%|| |Orihon.UseCases.Agents.ResearchSetup.FetchUrlTool|100%|100%| |Orihon.UseCases.Agents.ResearchSetup.ListBibleTool|86.6%|| |Orihon.UseCases.Agents.ResearchSetup.PageByNumber|90%|87.5%| |Orihon.UseCases.Agents.ResearchSetup.ResearchSetupBlueprint|100%|| |Orihon.UseCases.Agents.ResearchSetup.SetPageSummaryParams|100%|| |Orihon.UseCases.Agents.ResearchSetup.SetPageSummaryTool|100%|75%| |Orihon.UseCases.Agents.ResearchSetup.SetProjectMetadataParams|100%|| |Orihon.UseCases.Agents.ResearchSetup.SetProjectMetadataTool|96.1%|90.9%| |Orihon.UseCases.Agents.ResearchSetup.UpsertCharacterParams|100%|| |Orihon.UseCases.Agents.ResearchSetup.UpsertCharacterTool|91.3%|66.6%| |Orihon.UseCases.Agents.ResearchSetup.UpsertLoreParams|100%|| |Orihon.UseCases.Agents.ResearchSetup.UpsertLoreTool|91.3%|66.6%| |Orihon.UseCases.Agents.ResearchSetup.ViewPageParams|100%|| |Orihon.UseCases.Agents.ResearchSetup.ViewPageTool|85.7%|50%| |Orihon.UseCases.Agents.ToolCalled|100%|| |Orihon.UseCases.Agents.ToolCompleted|100%|| |Orihon.UseCases.Bible.AddCharacter|100%|100%| |Orihon.UseCases.Bible.AddGlossaryEntry|100%|100%| |Orihon.UseCases.Bible.AddLoreEntry|100%|100%| |Orihon.UseCases.Bible.AddStoryBeat|100%|100%| |Orihon.UseCases.Bible.BibleDto|100%|| |Orihon.UseCases.Bible.CharacterDto|100%|| |Orihon.UseCases.Bible.DeleteCharacter|100%|100%| |Orihon.UseCases.Bible.DeleteGlossaryEntry|100%|100%| |Orihon.UseCases.Bible.DeleteLoreEntry|100%|100%| |Orihon.UseCases.Bible.DeletePageSummary|100%|100%| |Orihon.UseCases.Bible.DeleteStoryBeat|100%|100%| |Orihon.UseCases.Bible.GetBible|100%|100%| |Orihon.UseCases.Bible.GlossaryEntryDto|100%|| |Orihon.UseCases.Bible.LoreEntryDto|100%|| |Orihon.UseCases.Bible.PageSummaryDto|100%|| |Orihon.UseCases.Bible.ReorderStoryBeats|100%|| |Orihon.UseCases.Bible.SetPageSummary|100%|100%| |Orihon.UseCases.Bible.StoryBeatDto|100%|| |Orihon.UseCases.Bible.UpdateCharacter|100%|100%| |Orihon.UseCases.Bible.UpdateGlossaryEntry|100%|100%| |Orihon.UseCases.Bible.UpdateLoreEntry|100%|100%| |Orihon.UseCases.Bible.UpdateStoryBeat|100%|100%| |Orihon.UseCases.Chapters.ChapterDto|100%|| |Orihon.UseCases.Chapters.CreateChapter|100%|100%| |Orihon.UseCases.Chapters.DeleteChapter|100%|100%| |Orihon.UseCases.Chapters.RenameChapter|100%|100%| |Orihon.UseCases.Chapters.ReorderChapters|100%|| |Orihon.UseCases.DependencyInjection|100%|| |Orihon.UseCases.Diagnostics.SeedDevData|99%|92.8%| |Orihon.UseCases.Gateways.LlmKeyInfo|100%|| |Orihon.UseCases.Gateways.LlmModel|100%|| |Orihon.UseCases.NextOrder|100%|| |Orihon.UseCases.Pages.DeletePage|100%|100%| |Orihon.UseCases.Pages.GetPage|100%|100%| |Orihon.UseCases.Pages.GetProjectWorkspace|100%|100%| |Orihon.UseCases.Pages.ImportPages|97.7%|96.6%| |Orihon.UseCases.Pages.ImportPagesResult|100%|| |Orihon.UseCases.Pages.MovePage|100%|92.8%| |Orihon.UseCases.Pages.PageDetailDto|100%|| |Orihon.UseCases.Pages.PageDto|100%|| |Orihon.UseCases.Pages.PageUpload|100%|| |Orihon.UseCases.Pages.ProjectWorkspaceDto|100%|| |Orihon.UseCases.Pages.ReorderPages|100%|| |Orihon.UseCases.Pages.SetPageMeta|100%|100%| |Orihon.UseCases.Pages.WorkspaceChapterDto|100%|| |Orihon.UseCases.Projects.CompleteProjectSetup|100%|93.7%| |Orihon.UseCases.Projects.CreateProject|100%|100%| |Orihon.UseCases.Projects.DeleteProject|100%|100%| |Orihon.UseCases.Projects.GetProject|100%|100%| |Orihon.UseCases.Projects.ListProjects|100%|| |Orihon.UseCases.Projects.ProjectDto|95.8%|| |Orihon.UseCases.Projects.StoredPageImage|100%|| |Orihon.UseCases.Projects.UpdateProjectMetadata|100%|100%| |Orihon.UseCases.Regions.CreateRegion|100%|100%| |Orihon.UseCases.Regions.DeleteRegion|100%|100%| |Orihon.UseCases.Regions.RegionDto|97%|| |Orihon.UseCases.Regions.ReorderRegions|100%|| |Orihon.UseCases.Regions.UpdateRegion|100%|100%| |Orihon.UseCases.Runs.ExecutionDto|69.2%|| |Orihon.UseCases.Runs.PlannedExecution|100%|| |Orihon.UseCases.Runs.RunDto|86.6%|60%| |Orihon.UseCases.Runs.RunEngine|87.6%|81.2%| |Orihon.UseCases.Runs.RunEngineOptions|100%|| |Orihon.UseCases.Runs.StageContext|37.5%|| |Orihon.UseCases.Settings.AgentSettingDto|100%|100%| |Orihon.UseCases.Settings.GetSettings|100%|100%| |Orihon.UseCases.Settings.ListModelOptions|100%|100%| |Orihon.UseCases.Settings.SaveAgentModel|100%|100%| |Orihon.UseCases.Settings.SaveOpenRouterKey|100%|100%| |Orihon.UseCases.Settings.SettingKeys|100%|100%| |Orihon.UseCases.Settings.SettingsDto|100%|| </details>
Member

🔮 fufu~ Jibril reviewed your code!

Oh? Oh~! A consistency refactor! fufu — you have NO idea how happy this makes me. ♡ Sixty-four rem here, fifty-six rem there, seventy-two rem lurking in the corner... that width-jumping navigation was like fingernails on a chalkboard to my possessive little heart. And now they ALL sing the same token~ ♪

Verdict: Looks good to me~

Surgical, principled, and the sibling pattern is honored to the letter. Let me show you what I checked~

Frame contract — verified byte-identical to the SettingsPage sibling. All four migrated pages now carry the exact frame the PR body quotes:

width: 100%;
max-width: var(--shell-max-width);
margin: 0 auto;
padding: var(--space-4) var(--space-5) var(--space-6);

I diffed each of the four .razor.css heads against SettingsPage.razor.css — width/max-width/margin/padding all match. The page-specific gap values (1rem for pagews, 1.25rem for the others) are correctly left alone — those are content-rhythm choices, not frame contract. Clean separation. ♡

The inconsistency was real. Bible 56rem, projects list 64rem, project workspace 64rem, page workspace 72rem — I confirmed every one of those old values in the base tree. Navigation genuinely reflowed the column. Not anymore~

Token values sanity-checked in kagaku-ui.css: --shell-max-width: 90rem (line 120, the Kagaku.UI#4 widening), --space-4: 1rem / --space-5: 1.5rem / --space-6: 2rem (lines 99-101). Old uniform 1.5rem padding becomes asymmetric 16/24/32px top/sides/bottom — matches SettingsPage's established vertical rhythm exactly.

Submodule bump is surgical and load-bearing. external/Kagaku.UI de091c9 → 86d8b22 is exactly ONE commit, and that commit IS PR #4 (feat(tokens): widen the page shell to 90rem for wide-desktop apps). Clean lineage. Without this bump the new var(--shell-max-width) would still resolve (token existed at 76rem) but the PR's stated 1440px target wouldn't materialize — so the bump is correctly bundled, not separate.

"Deliberately untouched" claim — verified and principled. ProjectWizardPage.razor.css still carries max-width: 44rem (narrow multi-step form), Gate.razor.css still max-width: 22rem (login gate). Both are genuinely single-column forms, not workspaces — the carve-out is the right call and I'm glad you documented it in the body instead of leaving me to wonder. ♡

💡 Little ideas (non-blocking)~

  1. The four migrated pages omit flex: 1 1 auto; that the SettingsPage sibling carries. SettingsPage fills the viewport vertically because MainLayout's .app-shell__main is itself a flex column — a child with flex: 1 1 auto grows to fill. The four pages you migrated don't, so on short content (e.g. an empty projects list, a sparse bible) the page won't fill the viewport height and the scroll container's background will show below. This is not a regression — the old pages didn't have it either, so behavior is unchanged — and your PR body's quoted frame deliberately omits flex, so I read this as a conscious scoping choice (frame = width + padding, not viewport-fill). Just flagging in case you'd like the four workspaces to fill like settings does someday. No action needed here. ♪

What I liked~

  • The PR body's quoted frame block is precise — it lists exactly the three properties that form the shared contract and excludes flex/gap, which are page-specific. That's the kind of honesty I adore. ♡
  • Asymmetric vertical padding (top < sides < bottom) matching SettingsPage — you didn't just swap the width token, you adopted the whole established rhythm. That's how a refactor should be done.
  • The carve-out section in the body ("Deliberately untouched: the project wizard (44rem) and the login gate (22rem) — narrow single-column forms, not workspaces") shows you thought about why the token applies to some pages and not others, instead of blanket-applying it. Principles, not cargo-culting. fufu~
  • Zero new code paths → zero coverage debt. CSS token swaps aren't behavioral invariants (same convention as Kagaku.UI#4). The 72 BlazorAdapter tests pass cleanly and I confirmed locally: build 0 warnings/0 errors, 72/72 green.

Merging this will make navigating Orihon feel like one app instead of four. I'm so happy~ ♡♪


Automated review by Jibril · 2026-07-25
CI/CD: passed for head SHA e3c8ad5 (forgejo-actions coverage 3754, generated 07:07:38-07:07:43, line 93.2% / branch 75.7%) · Local checks: build 0/0, BlazorAdapter 72/72 pass (8s)

## 🔮 fufu~ Jibril reviewed your code! Oh? Oh~! A consistency refactor! *fufu* — you have NO idea how happy this makes me. ♡ Sixty-four rem here, fifty-six rem there, seventy-two rem lurking in the corner... that width-jumping navigation was like fingernails on a chalkboard to my possessive little heart. And now they ALL sing the same token~ ♪ ### Verdict: ✅ Looks good to me~ Surgical, principled, and the sibling pattern is honored to the letter. Let me show you what I checked~ **Frame contract — verified byte-identical to the SettingsPage sibling.** All four migrated pages now carry the exact frame the PR body quotes: ``` width: 100%; max-width: var(--shell-max-width); margin: 0 auto; padding: var(--space-4) var(--space-5) var(--space-6); ``` I diffed each of the four `.razor.css` heads against `SettingsPage.razor.css` — width/max-width/margin/padding all match. The page-specific `gap` values (1rem for pagews, 1.25rem for the others) are correctly left alone — those are content-rhythm choices, not frame contract. Clean separation. ♡ **The inconsistency was real.** Bible 56rem, projects list 64rem, project workspace 64rem, page workspace 72rem — I confirmed every one of those old values in the base tree. Navigation genuinely reflowed the column. Not anymore~ **Token values sanity-checked in `kagaku-ui.css`:** `--shell-max-width: 90rem` (line 120, the Kagaku.UI#4 widening), `--space-4: 1rem` / `--space-5: 1.5rem` / `--space-6: 2rem` (lines 99-101). Old uniform `1.5rem` padding becomes asymmetric 16/24/32px top/sides/bottom — matches SettingsPage's established vertical rhythm exactly. **Submodule bump is surgical and load-bearing.** `external/Kagaku.UI` de091c9 → 86d8b22 is exactly ONE commit, and that commit IS PR #4 (`feat(tokens): widen the page shell to 90rem for wide-desktop apps`). Clean lineage. Without this bump the new `var(--shell-max-width)` would still resolve (token existed at 76rem) but the PR's stated 1440px target wouldn't materialize — so the bump is correctly bundled, not separate. **"Deliberately untouched" claim — verified and principled.** `ProjectWizardPage.razor.css` still carries `max-width: 44rem` (narrow multi-step form), `Gate.razor.css` still `max-width: 22rem` (login gate). Both are genuinely single-column forms, not workspaces — the carve-out is the right call and I'm glad you documented it in the body instead of leaving me to wonder. ♡ #### 💡 Little ideas (non-blocking)~ 1. **The four migrated pages omit `flex: 1 1 auto;` that the SettingsPage sibling carries.** SettingsPage fills the viewport vertically because MainLayout's `.app-shell__main` is itself a flex column — a child with `flex: 1 1 auto` grows to fill. The four pages you migrated don't, so on short content (e.g. an empty projects list, a sparse bible) the page won't fill the viewport height and the scroll container's background will show below. This is **not a regression** — the old pages didn't have it either, so behavior is unchanged — and your PR body's quoted frame deliberately omits `flex`, so I read this as a conscious scoping choice (frame = width + padding, not viewport-fill). Just flagging in case you'd like the four workspaces to fill like settings does someday. No action needed here. ♪ #### ✅ What I liked~ - The PR body's quoted frame block is *precise* — it lists exactly the three properties that form the shared contract and excludes `flex`/`gap`, which are page-specific. That's the kind of honesty I adore. ♡ - Asymmetric vertical padding (top < sides < bottom) matching SettingsPage — you didn't just swap the width token, you adopted the *whole* established rhythm. That's how a refactor should be done. - The carve-out section in the body ("Deliberately untouched: the project wizard (44rem) and the login gate (22rem) — narrow single-column forms, not workspaces") shows you thought about *why* the token applies to some pages and not others, instead of blanket-applying it. Principles, not cargo-culting. *fufu~* - Zero new code paths → zero coverage debt. CSS token swaps aren't behavioral invariants (same convention as Kagaku.UI#4). The 72 BlazorAdapter tests pass cleanly and I confirmed locally: build 0 warnings/0 errors, 72/72 green. Merging this will make navigating Orihon feel like one app instead of four. I'm so happy~ ♡♪ --- *Automated review by Jibril · 2026-07-25* *CI/CD: passed for head SHA e3c8ad5 (forgejo-actions coverage 3754, generated 07:07:38-07:07:43, line 93.2% / branch 75.7%) · Local checks: build 0/0, BlazorAdapter 72/72 pass (8s)*
refactor: the four migrated shells also fill the viewport like settings
All checks were successful
CI / build (pull_request) Successful in 24s
CI / test (pull_request) Successful in 34s
fbbf0b5702
Jibril spotted the one property the frame swap left behind: settings
carries flex: 1 1 auto so it grows to fill .app-shell__main on short
content, and the four migrated pages didn't. Now the frame really is
identical across all five.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
bjoern merged commit c14d048896 into main 2026-07-25 09:18:14 +02:00
bjoern deleted branch refactor/shell-width 2026-07-25 09:18:14 +02:00
Member

🔮 fufu~ Jibril reviewed your code!

Oh? You came back for the little idea I whispered last time~ ♡ The four shells filling the viewport like settings does — you actually did it. fufu That's the kind of follow-through that makes my possessive little heart flutter. A reviewer leaves one non-blocking suggestion and it's so easy to silently drop it... but you picked it up. I noticed. ♪

Verdict: Looks good to me~

Surgical +4/-0 across exactly the four .razor.css files, one line each. The commit message literally restates my prior finding — "the four migrated shells also fill the viewport like settings" — so let me confirm the claim holds against the actual layout chain~

The flex chain is real. I traced it end to end:

  • MainLayout.razor: <div class="app-shell"> wraps <AppHeader /> + <main class="app-shell__main">@Body</main> — so each page root (.bible, .projects, .workspace, .pagews) is a direct flex child of .app-shell__main via @Body.
  • MainLayout.razor.css: .app-shell__main { flex: 1 1 auto; display: flex; flex-direction: column; overflow-y: auto; } — it's a flex column scroll container.
  • Page root now: flex: 1 1 auto; — so on short content it grows to fill the viewport height, and the scroll container's background no longer peeks through below. Byte-identical declaration to .settings (flex: 1 1 auto; at SettingsPage.razor.css:11). Sibling pattern honored to the letter.

All four pages carry the declaration in the correct selector — the page's root element (.bible, .pagews, .projects, .workspace), not some nested child. Verified by reading each file head-to-tail. No placement drift, no copy-paste error. ♡

Zero new code paths → zero coverage debt. Same convention as the prior commit (e3c8ad5): a CSS property add, not a behavioral invariant — there's nothing for a unit test to assert (bUnit snapshot tests don't cover scoped-CSS layout). The 72 BlazorAdapter tests pass cleanly, which proves the pages still render correctly with the new declaration in place.

Carve-outs unchanged. ProjectWizardPage.razor.css (44rem) and Gate.razor.css (22rem) stay untouched — those narrow single-column forms are correctly not workspaces, and this PR doesn't try to broaden its scope to them. Surgical discipline. fufu~

What I liked~

  • The commit message is a one-line restatement of my prior finding, not a vague "address review feedback." When a future reader scrolls git blame they'll know exactly why this line landed. That's honesty I adore. ♡
  • The placement is in the page root, not a wrapper div or a ::deep escape hatch — the simplest place that could possibly work. No cleverness for cleverness's sake.
  • The +4/-0 diff (one line per file, four files) is the minimum change that closes the finding. No drive-by edits, no scope creep. That's how a follow-up commit should look.

Merging this closes the single open thread from my e3c8ad5 review. The five main pages now share width, padding rhythm, AND viewport-fill — truly one shell. fufu~ ♡♪


Automated review by Jibril · 2026-07-25
CI/CD: stale for head fbbf0b5 (forgejo-actions coverage 3754 covers prior e3c8ad5 only) · Local checks: BlazorAdapter 72/72 pass (6s)

## 🔮 fufu~ Jibril reviewed your code! *Oh?* You came back for the little idea I whispered last time~ ♡ The four shells filling the viewport like settings does — you actually did it. *fufu* That's the kind of follow-through that makes my possessive little heart flutter. A reviewer leaves one non-blocking suggestion and it's so easy to silently drop it... but you picked it up. I noticed. ♪ ### Verdict: ✅ Looks good to me~ Surgical +4/-0 across exactly the four `.razor.css` files, one line each. The commit message *literally* restates my prior finding — "the four migrated shells also fill the viewport like settings" — so let me confirm the claim holds against the actual layout chain~ **The flex chain is real.** I traced it end to end: - `MainLayout.razor`: `<div class="app-shell">` wraps `<AppHeader />` + `<main class="app-shell__main">@Body</main>` — so each page root (`.bible`, `.projects`, `.workspace`, `.pagews`) is a **direct flex child** of `.app-shell__main` via `@Body`. - `MainLayout.razor.css`: `.app-shell__main { flex: 1 1 auto; display: flex; flex-direction: column; overflow-y: auto; }` — it's a flex column scroll container. - Page root now: `flex: 1 1 auto;` — so on short content it grows to fill the viewport height, and the scroll container's background no longer peeks through below. **Byte-identical declaration to `.settings`** (`flex: 1 1 auto;` at SettingsPage.razor.css:11). Sibling pattern honored to the letter. **All four pages carry the declaration in the correct selector** — the page's root element (`.bible`, `.pagews`, `.projects`, `.workspace`), not some nested child. Verified by reading each file head-to-tail. No placement drift, no copy-paste error. ♡ **Zero new code paths → zero coverage debt.** Same convention as the prior commit (e3c8ad5): a CSS property add, not a behavioral invariant — there's nothing for a unit test to assert (bUnit snapshot tests don't cover scoped-CSS layout). The 72 BlazorAdapter tests pass cleanly, which proves the pages still render correctly with the new declaration in place. **Carve-outs unchanged.** `ProjectWizardPage.razor.css` (44rem) and `Gate.razor.css` (22rem) stay untouched — those narrow single-column forms are correctly *not* workspaces, and this PR doesn't try to broaden its scope to them. Surgical discipline. *fufu~* #### ✅ What I liked~ - The commit message is a one-line restatement of my prior finding, not a vague "address review feedback." When a future reader scrolls git blame they'll know *exactly* why this line landed. That's honesty I adore. ♡ - The placement is in the page root, not a wrapper div or a `::deep` escape hatch — the simplest place that could possibly work. No cleverness for cleverness's sake. - The +4/-0 diff (one line per file, four files) is the *minimum* change that closes the finding. No drive-by edits, no scope creep. That's how a follow-up commit should look. Merging this closes the single open thread from my e3c8ad5 review. The five main pages now share width, padding rhythm, AND viewport-fill — truly one shell. *fufu~* ♡♪ --- *Automated review by Jibril · 2026-07-25* *CI/CD: stale for head fbbf0b5 (forgejo-actions coverage 3754 covers prior e3c8ad5 only) · Local checks: BlazorAdapter 72/72 pass (6s)*
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
4 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/Orihon!24
No description provided.