- Status: decided specification before implementation; not a running-service or browser-verification receipt.
- Decision context: 10-topology-options. Source inventory: 20-fleet-evidence. Deployment contract: 40-runtime-and-hosting.
Instances
fleet:- Identity: root Storybook instance at
stbk.loca.zone/; native Svelte renderer through@storybook/svelte-vite. - Styling: Tailwind 4.3.3 and daisyUI 5.7.38; built-in daisyUI themes disabled.
- Source themes:
sflw-lightandsflw-darkfromsflw/src/app.css:7-73; customlightanddarkfromsvelte-chat/src/app.css:16-84. The latter names do not mean stock daisyUI palettes. - Preview stylesheet: stbk-authored, with the four attributed theme blocks replicated from source. Theme values will remain source-derived; explicit per-story theme selection will avoid depending on competing source default/system-preference rules.
- Canvas base: one neutral stbk-authored base for spacing, document sizing, typography, focus visibility, and reduced motion. The two complete project stylesheets will not be concatenated.
- Fidelity sacrifice: the neutral base deliberately replaces project-level resets and application chrome. This is a disclosed divergence, not a claim of pixel-identical application rendering. Source component markup and native palette definitions remain the reference. Theme replication covers semantic colors, radii, sizes, borders, depth/noise and color-scheme, not the complete source skin.
- Retained/replaced baseline ledger: Record which source font, preflight/base, focus, selection and reduced-motion rules are retained or replaced.
- Custom properties: reproduce the Svelte Flow token sets from
sflw/src/app.css:75-143under their named theme selectors, without an unqualified project-wide root reset. Preserve the effective token set for each native theme, including shared declarations inherited from the original unqualified root. In particular,--xy-connectionline-stroke-width: 2must apply under bothsflw-lightandsflw-dark; copying only the dark override block would change the connection preview to XYFlow’s default width of 1. For cross-project theme experiments, stbk will supply explicit aliases from--surface,--surface-2,--ink,--muted,--line,--accent,--accent-soft, and--focusto the selected daisyUI semantic colors. Those aliases and corresponding Flow colors will be labelled integration styling, not copied source tokens. - Theme controls: all four themes switchable per story. Svelte Flow stories default to
sflw-light; chat adaptations default to the source chatlighttheme. Native theme pairs will be the fidelity baseline; cross-project combinations will be labelled exploration.
- Identity: root Storybook instance at
bits:- Identity: separately built native Svelte instance at
stbk.loca.zone/bits/, federated throughrefsin the root instance’smain.ts. - Styling: direct use of
bits/src/app.css, including its Tailwind ink/brand tokens, custom utilities, dark base, and focus rules. No daisyUI stylesheet or fleet reset will enter this preview. - Isolation: its own preview document, renderer initialization, story index, and build output. Composition will unify browsing, not merge preview bundles, renderers, theme state, or CSS.
- Identity: separately built native Svelte instance at
- Import resolution:
- stbk will own the Storybook configuration, dependency installation, stories, decorators, and fixtures.
- Direct imports will resolve to the cited sibling source files, without editing those projects or importing their application Vite configurations.
- The fleet preview will resolve StudioNode’s type-only
$lib/flow/graphimport tosflw/src/lib/flow/graph.ts. Chat helper imports will use their explicit source locations rather than repurposing that alias. - Each preview will resolve shared runtime packages consistently from stbk: one Svelte runtime, and one XYFlow or Bits UI runtime where used. External source paths will be included explicitly in Tailwind class discovery.
flowchart LR S["sflw component sources"] --> F["fleet Svelte preview"] C["svelte-chat private room snippets"] --> A["Attributed stbk adaptations"] A --> F B["bits demo sources and ink stylesheet"] --> P["bits Svelte preview"] M["fleet manager at /"] --> F M -->|"refs and separate iframe"| P
Stories
- Scope: nine story groups, with the state cases below; not nine isolated screenshots.
- Common presentation: source path, framework, relationship, fixture dependencies, fidelity differences, and non-claims will be visible beside the working canvas.
- Naming rule:
MessageBubble,AttachmentList, andToastStackwill be new stbk component names. No files with those component identities are being claimed upstream; the room page keeps the source snippets private.
Icon
- Source:
sflw/src/lib/components/Icon.svelte:1-59. - Framework: Svelte 5.
- Relationship: imported directly; no runtime dependencies. The story is authored in stbk.
- Public args and states:
name: string; known names arearrow,external,code,copy,check,sun,moon,input,transform,branch,sink,note,nodes,edges,layout,interaction,scale,craft,undo,redo,plus,share,trash,book, andclose.size?: number, source default20; exercise small, default, and enlarged sizes.stroke?: number, source default1.8; exercise thin, default, and heavier strokes.- A separately labelled unrecognized-name case will exercise the existing fallback glyph, not invent an additional named icon.
- Accessibility design:
- Preserve
aria-hidden="true"; the component is decorative and is not itself a keyboard target. - Give the specimen a visible name; verify keyboard-operable Storybook controls and
currentColorcontrast in the chosen themes and a narrow canvas.
- Preserve
- Does not prove: an accessible name for a consuming button, a click action, or semantics supplied by the icon alone.
SourcePanel
- Source:
sflw/src/lib/components/SourcePanel.svelte:1-41; its only component import is./Icon.svelte. - Framework: Svelte 5.
- Relationship: imported directly; source-text and clipboard scenarios authored in stbk.
- Public args and states:
source: string;filename?: string, source default+page.svelte.- Default content will be the actual raw text of
sflw/src/routes/demo/basic/+page.svelte, loaded with Vite’s?rawhandling. This will not execute that route. - Exercise collapsed/open disclosure, multiline content, long lines, a long filename, and empty source. Input experiments will be labelled as such: the component’s inherited note about actual route source is not evidence that arbitrary control values came from a route.
- Copy states will be reached by clicking the real button: initial, successful-copy feedback, and rejected-access fallback.
- Accessibility design:
- Keyboard-open the native summary, reach the copy button and read-only textarea, and inspect visible focus and the filename-derived textarea label.
- Verify that long code scrolls within the source field at narrow width rather than widening the page.
- Does not prove: operating-system clipboard access from a stub, syntax highlighting, route execution, or behavior of the application whose source text is displayed.
StudioNode
- Source:
sflw/src/lib/components/StudioNode.svelte:1-46; node contract insflw/src/lib/flow/graph.ts:3-20; registration precedent insflw/src/routes/demo/nodes/+page.svelte:10-16,161-176. - Framework: Svelte 5 with
@xyflow/svelte. - Relationship: component imported directly; real SvelteFlow fixture authored in stbk. This is not a standalone-context-free component.
- Public states and fixture controls:
- Source node kinds:
input,transform,branch,sink,note. - Source data:
data.title, optionaldata.subtitle; fixture data also supplies the requiredparamsobject fromNodeData. - Source presentation:
selected,isConnectable,sourcePosition, andtargetPositionare supplied through Flow’s node rendering contract. - stbk controls will translate kind/title/subtitle into the fixture node, selection into node state, connectability into Flow’s
nodesConnectablesetting, and direction into right/left or bottom/top positions. - Exercise ordinary and long text, selected/unselected appearance, both handle orientations, connectability on/off, and the note branch without handles.
- Source node kinds:
- Accessibility design:
- Give the graph a name and a real viewport; inspect keyboard focus and selection behavior, the title-derived handle labels, visible selection/focus distinction, contrast, and narrow-width usability.
- Exercise actual selection and movement in Flow rather than changing only a static class or screenshot.
- Does not prove: custom-edge behavior, graph validation, automatic layout, craft-page persistence, assistant integration, or large-graph performance.
Dialog BasicDemo
- Source:
bits/src/lib/demos/dialog/BasicDemo.svelte:1-59. - Framework: Svelte 5 with
bits-uiand@lucide/svelte. - Relationship: existing demo imported directly; no invented wrapper-prop API.
- Public states and interactions:
- The demo exports no props;
open,projectName,owner, andsavedProjectare internal state. - Open through
Create project; edit the existing project-name and owner fields; save and observe the local saved-name result. - Exercise required-field rejection, Cancel, the labelled close button, and Escape dismissal.
- The demo exports no props;
- Accessibility design:
- Inspect dialog title/description association, initial focus, modal Tab containment, Escape, return focus, required-input labels, and the narrow-width modal.
- Query the preview document body for portalled content, not only the story-root subtree.
- Does not prove: backend project creation, persistence, authorization, or accessibility of every Bits UI composition.
Combobox MultipleDemo
- Source:
bits/src/lib/demos/combobox/MultipleDemo.svelte:1-96. - Framework: Svelte 5 with
bits-uiand@lucide/svelte. - Relationship: existing demo imported directly.
- Public states and interactions:
- No exported props. Selection and query are internal; the source initially selects
accessibilityandsvelte. - Search the actual options, select another option, remove a named selected chip, reach zero selections, and enter a query with no matches.
- Close and reopen the list to exercise the source’s query reset. Do not advertise nonexistent
options,value, or disabled story props as this component’s public API.
- No exported props. Selection and query are internal; the source initially selects
- Accessibility design:
- Exercise the named search input and trigger, arrow navigation, Enter selection, dismissal, named removal buttons, focus visibility, selected-state semantics, and wrapping chips at narrow width.
- Inspect the portalled list in its owning preview document.
- Does not prove: remote search, asynchronous loading, server filtering, or a generally configurable combobox wrapper.
Checkbox IndeterminateDemo
- Source:
bits/src/lib/demos/checkbox/IndeterminateDemo.svelte:1-39. - Framework: Svelte 5 with
bits-uiand@lucide/svelte. - Relationship: existing demo imported directly.
- Public states and interactions:
- No exported props.
checkedandindeterminateare internal; the initial state is indeterminate. - Use the source’s
Unchecked,Indeterminate, andCheckedbuttons, then toggle the actual checkbox by its label and keyboard. - Observe both the control’s state and the source’s textual state chip.
- No exported props.
- Accessibility design:
- Inspect
Review statuslabel association, mixed/checked/unchecked ARIA state, Space activation, focus, and contrast. - Mount only one instance in a preview document because the source uses the fixed ID
tri-state.
- Inspect
- Does not prove: a parent-child selection model, server review status, form submission, or a public tri-state prop API.
MessageBubble
- Source:
svelte-chat/src/routes/r/[room]/+page.svelte:1079-1143. The complete upstream snippet is1079-1200; its footer at1144-1197is excluded. This is not full-bubble coverage. - Framework: Svelte 5.
- Relationship: adapted with provenance into a new stbk component, with new stbk closure/state glue. The extracted body includes the system-message branch, avatar/header, message body, inline edit form, deleted-message branch, empty-streaming typing indicator, and attachment rendering. The footer at
1144-1197is excluded. - New stbk public contract:
message: Messagesupplies upstream metadata and content. The adaptation additionally takesbody: { mode: 'sanitized-fixture'; blocks: readonly { id: string; html: string }[] } | { mode: 'text' }.- Upstream
Messagetype:svelte-chat/src/lib/types.ts:22-53.
- Upstream
mine: boolean,continued: boolean,mentionsMe: boolean, andediting: booleanmake previously captured route state explicit.onSave(content: string): voidandonCancel(): voidreplace route-bound edit effects. These are new adaptation callbacks, not upstream component props.- The local fixture will own the message and editing state. Saving edited content updates
message.content, selects text mode, and displays the new value using Svelte text interpolation with newlines preserved. The canvas labels this as local plain-text editing, not Markdown re-rendering. Saving leaves edit mode; cancellation will preserve content and return focus to a labelled fixture control. Neither callback will call a room API.
- States to exercise:
- Incoming/outgoing user, assistant, and system messages; continued grouping and mention highlighting.
statusvaluesstreaming,done, anderror; empty streaming content for the typing indicator;deletedAtfor deletion rather than an invented deleted status.- Long prose, code content, attached media, and an editable completed user message. Enter saves, Shift+Enter inserts a newline, Escape cancels, and empty edits cannot save; composition input will not be mistaken for Enter submission.
- Markdown boundary: Sanitized-fixture blocks come only from an stbk-owned fixture module recording the corresponding Markdown and upstream source digests; no arbitrary HTML control is exposed. Selecting a formatted fixture resets its content and blocks together. stbk will not import the upstream pipeline (
splitBlocksinsvelte-chat/src/lib/blocks.ts:46,renderBlockandsanitizeinsvelte-chat/src/lib/render.ts:19-31) and will not installmarked,isomorphic-dompurifyor a DOM shim. Fixtures will not require the room’s participant-directory mention decoration or composer shortcode conversion.
- Accessibility design:
- The fixture will supply a named list around the source-derived list item. Preserve the message’s accessible name and the retained body/header cues. The body-only extraction omits the footer’s edited marker, nonempty-streaming and interrupted-reply text, and continued-message timestamp at
svelte-chat/src/routes/r/[room]/+page.svelte:1165-1173, as well as reaction/thread/action controls. These omissions will be visible in provenance; complete message-status presentation is not claimed. - Verify edit focus, keyboard save/cancel, long-content reflow, code overflow containment, and contrast in both native chat themes.
- The fixture will supply a named list around the source-derived list item. Preserve the message’s accessible name and the retained body/header cues. The body-only extraction omits the footer’s edited marker, nonempty-streaming and interrupted-reply text, and continued-message timestamp at
- Does not prove: Markdown conversion, sanitizer posture, SSE streaming, complete message-status presentation, participant identity, reaction/thread behavior, persistent edits, full room Markdown decoration, inherited application CSP, or the whole private bubble snippet. The source range and the removed footer will be visible in provenance.
AttachmentList
- Source:
svelte-chat/src/routes/r/[room]/+page.svelte:1054-1077; attachment data contract insvelte-chat/src/lib/types.ts:6-20. - Framework: Svelte 5.
- Relationship: adapted with provenance from the private
attachmentssnippet into a new stbk component. - New stbk public contract and states:
list: Attachment[]; preserve the realimage,audio, andfilekind values and fieldsid,name,size,type,kind,url, and optionalduration.- Exercise empty, individual-kind, mixed, and long-filename lists using genuine local media/document fixtures.
- Preserve image links, native audio controls, file-download presentation, size/duration text, and the
Attachmentslist label. Attribute any extracted icon and formatting helpers to the room source.
- Accessibility design:
- Inspect image alternatives, named links, keyboard-reachable native audio controls, download-link focus, and narrow-width containment.
- Open the local image and download the fixture document; for audio, verify metadata/playback state without claiming audible output when the verification environment cannot provide it.
- Does not prove: uploads, room-file authorization, server-side MIME validation, recording, or production download handling.
ToastStack
- Source:
svelte-chat/src/routes/r/[room]/+page.svelte:1564-1575; state and dismissal logic at1025-1035. - Framework: Svelte 5.
- Relationship: adapted with provenance into a new stbk component; upstream markup and state are private to the room route.
- New stbk public contract and states:
toasts: { id: number; text: string; kind: 'error' | 'info' }[]andonDismiss(id: number): void.- Exercise empty, info, error, stacked, long-text, manual-dismiss, and automatic-dismiss cases.
- Preserve
toast toast-end toast-bottom,alert alert-soft, the info/error variants,role="alert", and the button labelledDismiss. - The fixture will own additions, list mutation, and the source’s seven-second automatic dismissal. Static inspection states may pause time only when visibly labelled; a timed interaction must still exercise expiry. Pending timers will be cleared when that fixture unmounts.
- Accessibility design:
- Reach and activate dismiss buttons by keyboard; inspect alert announcements, focus behavior when an item disappears, narrow-width stacking, and semantic-color contrast.
- Does not prove: server errors, notification delivery, the room’s complete timer lifecycle, or a guarantee that every transient alert is read by assistive technology.
Fixtures
- Flow stage:
- Author a sized stage in stbk, with a 560px reference height and responsive width; it must retain a nonzero viewport in narrow layouts.
- Load
@xyflow/svelte/dist/style.cssand the fleet preview stylesheet. - Register exactly
nodeTypes = { input: StudioNode, transform: StudioNode, branch: StudioNode, sink: StudioNode, note: StudioNode }. - Supply actual nodes with
id,type,position, anddata: { title, subtitle, params: {} }; bind the fixture’s node/edge arrays to SvelteFlow and use its real selection/movement behavior. - Use
Position.Right/Position.Leftfor horizontal handles andPosition.Bottom/Position.Topfor vertical handles. A source handle needs its real node identity; a generic provider or a bare SVG/container is insufficient.
- Theme decorator:
- Set
data-themeon the preview document’s document element, not the Storybook manager document or only an inner component wrapper. - Apply the selected theme before presenting the story; restore or replace owned theme state on story changes.
- Do not import either application layout, write
chat:theme, or initialize the Svelte Flow application’s storage/media listeners. - Keep source-native Svelte Flow tokens separate from stbk’s cross-theme aliases. Verify all four selections actually change the relevant semantic colors; an unchanged canvas is not a successful theme control.
- Set
- Clipboard:
- SourcePanel success requires an allowed browser clipboard operation or an explicitly labelled stub.
- A native-success probe must verify the copied bytes. A stub-success probe must verify the supplied text and report only the component’s success UI contract.
- Force a rejected write and observe the existing
Select and copy belowpath; do not add a fake success fallback. - Restore permission/stub state after the story. The source textarea remains the real manual-copy surface.
- Bits UI document isolation:
- Preserve the actual primitives and portals; no overlay replicas.
- Mount the fixed-ID demos in isolated canvases rather than duplicate inline Docs examples. Dialog field IDs and
tri-statemust not collide within one document.
- Chat isolation:
- Use fixed timestamps and a fixed locale/timezone for presentation evidence; disclose that determinism differs from the room’s browser-locale formatting.
- Supply stbk-owned identifiers, local media bytes, and local callback state. Never use production message IDs, room-file URLs, EventSource, uploads, microphone access, or live mutation APIs.
- Formatted display cases use recorded, pre-sanitized block fixtures; local edit results use escaped Svelte text rendering. The preview will not claim to inherit the SvelteKit application’s CSP; fixture content and URLs must remain controlled.
- Provenance:
- Every adapted source file will carry an attribution header with the exact source path/range, new stbk name, and stated omissions.
- Copied chat helpers will be attributed separately: rendering shape
171-183, date formatting199-200, initials/formatting239-247, edit behavior888-930, and icon snippet1048-1052insvelte-chat/src/routes/r/[room]/+page.svelte, selecting only the helpers actually retained. Network-bound behavior will be replaced by stated local fixture behavior, not copied wholesale. - Every direct-import story will identify the imported component separately from its stbk-authored fixture and stylesheet integration.
- Record source digests before realization and compare them afterward; line citations alone are not an unchanged-source proof.
Coverage and deferral ledger
Covered scope below is a delivery commitment, not a claim that these stories already run.
| Project | First-delivery components | Relationship | Instance |
|---|---|---|---|
| sflw | Icon; SourcePanel; StudioNode through a real Flow fixture | Three direct component imports | fleet |
| bits | dialog/BasicDemo.svelte; combobox/MultipleDemo.svelte; checkbox/IndeterminateDemo.svelte under bits/src/lib/demos/ | Three direct demo imports, real Bits UI primitives, no public demo props | bits |
| svelte-chat | MessageBubble; AttachmentList; ToastStack | Three newly named stbk adaptations of the cited private room surfaces | fleet |
| stbk | Flow stage; theme decorator; clipboard scenarios; local chat state/media fixtures | Newly authored exploration and isolation infrastructure, not additional fleet coverage | Respective owning preview |
| Deferred project or component | Concrete reason | First step that would lift the deferral |
|---|---|---|
sflw/src/lib/components/TypedEdge.svelte | Its generated label reaches XYFlow edge/store/portal context; it is not a pure SVG function | Register it through edgeTypes in a real graph and exercise labelled edge variants |
sflw/src/lib/components/FlowViewport.svelte | Revision-driven fitView, tick, and animation-frame behavior has no useful standalone canvas | Add a graph interaction fixture with real revision changes and observed viewport movement |
sflw/src/lib/components/ShowcaseHeader.svelte and DemoShell.svelte | Theme context, snippets, application navigation, and document metadata exceed the leaf subset; a missing optional provider can leave a visible toggle inert | Supply an isolated reactive theme provider, contained navigation, and real shell snippets |
sflw/src/lib/components/assistant/AssistantBubble.svelte | Assistant requests, local fallback, native dialog/focus behavior, and graph callbacks | Isolate graph state and transport; demonstrate server and fallback paths separately without live requests |
sflw/src/routes/craft/+page.svelte | URL/hash state, global shortcuts, clipboard, history, and assistant integration | Build a contained application-level fixture before claiming route coverage |
| Other sflw demonstration routes | Route compositions are not covered by importing three leaves; the scale route includes a large workload and browser timing | Select one composed route and isolate its environment; treat scale measurements as a separate performance exercise |
bits builder editor shell, including bits/src/routes/builder/+page.svelte and bits/src/lib/builder/Render.svelte | Registry/store coupling, SvelteKit dependencies, persistent sessions, localStorage, and relay integration | Introduce an isolated store/transport/storage fixture; never connect the story to operator sessions |
| Remaining bits demos and builder blocks | The large source inventory is not a uniform props API; block data, dates, image responses, and editor mode differ | Select the next source composition and document its own contract; use BuilderNode fixtures where required |
| svelte-chat room, lobby, layout, and error routes | Route data/forms/page state and automatic room-entry SSE, requests, timers, and browser state are outside component adaptation | Define an explicit contained route harness covering all active transports and storage before importing a route |
svelte-chat bubble footer, room source 1144-1197 | Reactions, thread navigation, picker, edit/delete launch controls, network-bound closures, and the edited marker, nonempty-streaming and interrupted-reply text, and continued-message timestamp at 1165-1173 are outside the selected body range | Extract the footer with explicit state/callback contracts and local interaction outcomes |
svelte-chat pending-upload display, room source 1352-1381 | Identified progress/skeleton/error candidate deliberately omitted; this range is a display segment, not the complete upload list | Extract a local-state presentation fixture; include the remaining retry/remove controls and closing structure through 1390 if claiming the complete list |
svelte-chat offline alert, room source 1249-1253 | Identified presentational candidate deliberately left outside the first nine story groups | Adapt the alert with explicit online/offline fixture state and verify its announcement/reflow |
| airi | Vue 3 requires @storybook/vue3-vite; UnoCSS is not Tailwind; its pnpm 11.24.0 workspace uses catalogs/patches and a pnpm-invoking postinstall, while the 2026-09-15 scout recorded pnpm absent from PATH; Histoire stories already exist | Establish a separate minimal Vue/UnoCSS preview and either resolve the pinned workspace bootstrap or explicitly bound a leaf-only dependency path; evaluate the existing Histoire coverage before duplicating it |
| iconmania | React 19 requires @storybook/react-vite; src/styles.css is its own global regime; gallery art uses /api/gallery/... SVG/PNG responses | Establish the React preview with its stylesheet and controlled leaves, then supply real local artwork responses before claiming gallery fidelity |
| click2punch current prototypes | Standalone HTML documents with inline controllers, relative assets, and floating-major daisyUI 5/Tailwind-browser 4 CDN dependencies; no importable widget seam | Use @storybook/html-vite whole-page iframe embeds with preserved assets and a documented dependency snapshot; do not call them native components |
| wrdp PHP templates | WordPress/PHP execution and application state; no root package manifest provides a browser component build | Rewrite an explicitly selected presentation boundary if native Storybook coverage is approved; do not import PHP as a browser component |
| wrdp vanilla player exception | wrdp/wp/wp-content/plugins/quizwizz/assets/js/qwizz-player-renderer.js exposes DOM factories through window.QuizWizzPlayerRenderer, but no HTML preview is included yet | Add an HTML fixture loading the real renderer and player/token CSS; begin with status, failure, and progress, which do not require a PHP rewrite |
Acceptance criteria
- Rendering:
- All nine story groups will render their cited direct imports or attributed adaptations in a real browser from the built output.
- StudioNode will appear through a real Flow node renderer; Bits UI demos will use the real upstream primitives.
- Both the root story index and referenced bits index/preview assets will load without missing modules, source-path serving mistakes, or cross-preview CSS leakage.
- Maintain a manifest of every required story/state case with expected and executed counts; missing, skipped or zero-assertion cases fail.
- Verify component identity and resulting interaction state inside the active owning preview, including portalled content.
- Interaction:
- Controls will change the actual Icon SVG and node fixture states.
- SourcePanel will disclose content and demonstrate both copy-result paths with the clipboard evidence boundary stated.
- Dialog save/cancel, combobox search/select/remove/empty, and checkbox state transitions will produce visible local outcomes.
- Chat edit save/cancel, local attachment actions, and manual/timed toast dismissal will execute real local behavior, not screenshot substitutions or inert buttons.
- Require visible post-save content, not merely a closed editor.
- Accessibility and presentation:
- Keyboard paths, focus movement, labels, portal ownership, and a 320px-wide preview will be exercised on the relevant stories.
- Native light/dark fleet palettes, cross-theme experiments, the bits ink skin, and reduced-motion presentation will be inspected. Contrast and any source limitations will be recorded rather than inferred from library choice.
- Compare effective native theme tokens and representative rendered component states with source; intentional neutral-base differences remain explicit, while accidental token or interaction regressions fail acceptance. Cross-project theme experiments are not native-fidelity evidence.
- Fixed IDs will not collide in Docs, and changing stories will not leave theme overrides, stubs, or fixture timers behind.
- Transparency:
- Visible provenance will distinguish imported, adapted, and stbk-authored fixture code.
- The neutral canvas divergence, partial bubble extraction, and complete deferral ledger will be reachable from the Storybook surface; no implied whole-fleet coverage.
- Hosting:
stbk.loca.zonewill serve the built Storybook, including direct browsing at/bits/and root composition.- Cold-load and refresh local and referenced composed deep links, browse bits directly, and use root search to reach one local and one referenced story.
- Exercise both same-instance changes and fleet → bits → fleet transitions.
wiki.stbk.loca.zonewill serve the published plan through the bounded hosting contract in 40-runtime-and-hosting. Pending TLS or broken composition will remain explicit incomplete states, not a completed-deployment claim.
- Preservation:
- Every existing fleet project will remain byte-unchanged against the recorded baseline, including manifests, lockfiles, source, and application configuration.
- No interaction will reach live fleet mutation APIs or operator-owned storage. Build success alone will not satisfy this browser contract.
Justification for a Svelte-only first subset
- Renderer boundary:
- Svelte, Vue 3, and React require separate native renderers. Sharing Vite does not remove that boundary; composition is the future expansion mechanism.
- The first subset already pays for a second native Svelte instance because CSS regimes are also an isolation boundary. It is not pretending that a common language makes incompatible global styles safe.
- Existing component density:
- sflw offers genuine source components with small, inspectable contracts and a real graph-context fixture pattern.
- bits contains 93 existing demonstrations within the scout’s 158-file reusable Svelte inventory. The chosen three already compose real primitives and local interaction state; inventing replacement controls would discard stronger evidence.
- svelte-chat supplies a distinct application surface but no reusable component files. Its three adaptations are included only with the private-snippet asymmetry and fidelity sacrifices exposed.
- Additional renderer costs:
- airi has worthwhile Vue leaves and existing Histoire stories, but broad reuse adds UnoCSS, workspace/catalog/patch handling, and package-manager lifecycle work. A leaf-only Vue path may avoid the whole workspace; it still needs a deliberate additional renderer and style build, not one more Svelte story file.
- iconmania has ordinary npm dependencies and cheaper controlled React leaves; it is not blocked by pnpm. Its React renderer and global skin remain separate work, and representative gallery stories require actual SVG/PNG fixture responses rather than generic network stubs.
- Decision:
- Svelte-only is the honest first deliverable because it maximizes directly evidenced component behavior while keeping renderer, CSS, and live-state boundaries explicit. It is not a verdict against Vue or React, a claim of universal hosting, or permission to hide deferred projects.