feat(ui): storybook 10 over the real pages + screenshot harness

Preview imports the mock transport statically and wraps every story in
a fresh RegistryProvider seeded with mock mode + the story's scenario
parameter (dark default, light via toolbar). One story file per page
(Default + FirstRun/Syncing/Errors where meaningful) plus the whole
shell. tools/screenshots.mjs mirrors the console's harness: headless
Chromium over storybook-static, every Pages/* + Shell/* story.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
2026-07-20 19:41:59 +02:00
parent f3e80f10ec
commit e9a4d3a996
9 changed files with 308 additions and 0 deletions
+14
View File
@@ -0,0 +1,14 @@
import type { Meta, StoryObj } from "@storybook/react-vite";
import { App } from "./App";
const meta = {
title: "Shell/App",
component: App,
parameters: { layout: "fullscreen" },
} satisfies Meta<typeof App>;
export default meta;
type Story = StoryObj<typeof meta>;
export const Default: Story = {};
export const FirstRun: Story = { parameters: { scenario: "firstRun" } };
+14
View File
@@ -0,0 +1,14 @@
import type { Meta, StoryObj } from "@storybook/react-vite";
import { EmulatorsPage } from "./emulators";
const meta = {
title: "Pages/Emulators",
component: EmulatorsPage,
args: { navigate: () => {} },
} satisfies Meta<typeof EmulatorsPage>;
export default meta;
type Story = StoryObj<typeof meta>;
export const Default: Story = {};
export const FirstRun: Story = { parameters: { scenario: "firstRun" } };
+16
View File
@@ -0,0 +1,16 @@
import type { Meta, StoryObj } from "@storybook/react-vite";
import { LibraryPage } from "./library";
const meta = {
title: "Pages/Library",
component: LibraryPage,
args: { navigate: () => {} },
} satisfies Meta<typeof LibraryPage>;
export default meta;
type Story = StoryObj<typeof meta>;
export const Default: Story = {};
export const FirstRun: Story = { parameters: { scenario: "firstRun" } };
/** The preview endpoint fails (ScanFailed 500) — exercises the error gate. */
export const Errors: Story = { parameters: { scenario: "errors" } };
+16
View File
@@ -0,0 +1,16 @@
import type { Meta, StoryObj } from "@storybook/react-vite";
import { OverviewPage } from "./overview";
const meta = {
title: "Pages/Overview",
component: OverviewPage,
args: { navigate: () => {} },
} satisfies Meta<typeof OverviewPage>;
export default meta;
type Story = StoryObj<typeof meta>;
export const Default: Story = {};
export const FirstRun: Story = { parameters: { scenario: "firstRun" } };
export const Syncing: Story = { parameters: { scenario: "syncing" } };
export const Errors: Story = { parameters: { scenario: "errors" } };
+13
View File
@@ -0,0 +1,13 @@
import type { Meta, StoryObj } from "@storybook/react-vite";
import { SettingsPage } from "./settings";
const meta = {
title: "Pages/Settings",
component: SettingsPage,
args: { navigate: () => {} },
} satisfies Meta<typeof SettingsPage>;
export default meta;
type Story = StoryObj<typeof meta>;
export const Default: Story = {};
+14
View File
@@ -0,0 +1,14 @@
import type { Meta, StoryObj } from "@storybook/react-vite";
import { SourcesPage } from "./sources";
const meta = {
title: "Pages/Sources",
component: SourcesPage,
args: { navigate: () => {} },
} satisfies Meta<typeof SourcesPage>;
export default meta;
type Story = StoryObj<typeof meta>;
export const Default: Story = {};
export const FirstRun: Story = { parameters: { scenario: "firstRun" } };