Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 | /**
* Generic Storybook story factory helpers for blong model pages.
*
* These helpers are domain-agnostic — any realm that uses the blong model
* system can import them to create stories with minimal boilerplate.
*
* Usage in a realm's story file:
*
* import {page, portal} from '@feasibleone/blong-browser/storyHelper.js';
*
* export const CoralBrowse = page('marine.coral.browse');
* export const CoralOpen = page('marine.coral.open', 1);
* export const CoralNew = page('marine.coral.new');
* export const CoralNewHard = page('marine.coral.new', {value: {coral: {coralType: 'hard'}}});
* export const CoralOpenThumb = page('marine.coral.open', 1, {layout: 'editThumbIndex'});
*
* Rules:
* - `idOrParams` number → becomes `{<object>Id: idOrParams}`.
* - `idOrParams` object → merged with `extraParams` as component params.
* - `extraParams` → always merged last (highest precedence).
*/
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore — resolved via Vite's dev export condition; tsc sees no dist yet
import {Model, Portal, useAppStore} from '@feasibleone/blong-browser';
import type {StoryObj} from '@storybook/react-vite';
import React from 'react';
/**
* Create a Storybook story that renders a model page.
*
* @param componentName - The model component name, e.g. `'marine.coral.browse'`
* @param idOrParams - Record ID (for `.open`) or initial params object
* @param extraParams - Additional params merged on top (highest precedence)
*/
export function page(
componentName: string,
idOrParams?: number | Record<string, unknown>,
extraParams?: Record<string, unknown>,
): StoryObj {
const object = componentName.split('.')[1]; // e.g. 'coral', 'family', 'species'
let params: Record<string, unknown> | undefined;
if (typeof idOrParams === 'number') {
params = {[`${object}Id`]: idOrParams, ...extraParams};
} else if (idOrParams != null || extraParams != null) {
params = {...idOrParams, ...extraParams};
}
return {
render: () => (
<Model
componentName={componentName}
params={params}
/>
),
};
}
/**
* Create a Storybook story that renders the full portal shell.
*
* Useful for full end-to-end portal stories that exercise navigation,
* tabs, and multiple realm pages together.
*/
export function portal(): StoryObj {
return {
render: () => {
useAppStore.getState().setToken('storybook');
return <Portal />;
},
};
}
|