@gtkx/storybook 2.0.0-beta.11 → 2.0.0-beta.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"explorer-preview.js","sourceRoot":"","sources":["../src/explorer-preview.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,KAAK,GAAG,MAAM,cAAc,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC5F,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AACrE,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AACxD,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAGlE,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AACxD,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAiBzC,MAAM,eAAgB,SAAQ,SAAuC;IACjE,MAAM,CAAC,wBAAwB,CAAC,KAAoB,EAAE,KAAoB;QACtE,OAAO,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC;IAChF,CAAC;IAED,MAAM,CAAC,wBAAwB,CAAC,KAAc;QAC1C,OAAO,EAAE,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;IAChF,CAAC;IAEQ,KAAK,GAAkB,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;IAE9D,MAAM;QACX,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,KAAK,IAAI;YAC5B,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ;YACrB,CAAC,CAAC,CACM,KAAC,aAAa,IACV,IAAI,EAAC,yBAAyB,EAC9B,KAAK,EAAC,gBAAgB,EACtB,QAAQ,EAAC,uBAAuB,EAChC,WAAW,EAAE,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;oBACrE,8EAA8E,GACpF,CACL,CAAC;IACd,CAAC;CACJ;AAED,MAAM,WAAW,GAAG,CAAC,KAAoB,EAAmC,EAAE;IAC1E,MAAM,IAAI,GAAG,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC;IACnC,MAAM,IAAI,GAAG,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,IAAI,SAAS,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;IAEvG,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC/D,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;IAC3D,CAAC;IAED,OAAO,IAAI,CAAC;AAChB,CAAC,CAAC;AAEF,MAAM,cAAc,GAAG,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAwC,EAAa,EAAE;IAC/F,MAAM,IAAI,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;IAEhC,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACrB,OAAO,CACH,8BACI,KAAC,aAAa,IACV,KAAK,EAAE,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,gBAAgB,EAC9D,QAAQ,EAAC,qBAAqB,EAC9B,WAAW,EAAC,0DAA0D,GACxE,EACD,YAAY,CAAC,KAAC,KAAK,OAAK,IAAI,GAAI,EAAE,WAAW,CAAC,IAChD,CACN,CAAC;IACN,CAAC;IAED,MAAM,MAAM,GAAG,KAAK,CAAC,UAAU,CAAC,MAAM,KAAK,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACjE,MAAM,KAAK,GAAG,KAAK,CAAC,UAAU,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC;IAEzF,OAAO,CACH,KAAC,MAAM,IACH,IAAI,EAAC,kBAAkB,EACvB,WAAW,EAAE,GAAG,CAAC,WAAW,CAAC,QAAQ,EACrC,OAAO,QACP,OAAO,QACP,MAAM,EAAE,KAAK,EACb,MAAM,EAAE,KAAK,EACb,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,EACpB,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,YAEjB,KAAC,KAAK,OAAK,IAAI,GAAI,GACd,CACZ,CAAC;AACN,CAAC,CAAC;AAEF,MAAM,eAAe,GAAG,CAAC,EAAE,KAAK,EAAgB,EAAE,EAAE;IAChD,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAe,GAAG,EAAE,CAAC,CAAC;QACpD,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,IAAI,EAAE,EAAE,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE;QAC7B,UAAU,EAAE,CAAC;QACb,KAAK,EAAE,IAAI;QACX,OAAO,EAAE,IAAI,WAAW,EAAE;KAC7B,CAAC,CAAC,CAAC;IACJ,MAAM,OAAO,GAAG,WAAW,CAAC,CAAC,KAAY,EAAE,EAAE;QACzC,QAAQ,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,KAAK,KAAK,CAAC,KAAK,IAAI,OAAO,CAAC,UAAU,KAAK,KAAK,CAAC,UAAU;YAC1F,CAAC,CAAC,EAAE,GAAG,OAAO,EAAE,KAAK,EAAE;YACvB,CAAC,CAAC,OAAO,CAAC,CAAC;IACnB,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC;IACpC,MAAM,SAAS,GAAG,OAAO,CACrB,GAAG,EAAE,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,EAC3E,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAC7D,CAAC;IAEF,IAAI,KAAK,CAAC,KAAK,KAAK,KAAK,CAAC,KAAK,EAAE,CAAC;QAC9B,QAAQ,CAAC;YACL,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,IAAI,EAAE,EAAE,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE;YAC7B,UAAU,EAAE,KAAK,CAAC,UAAU,GAAG,CAAC;YAChC,KAAK,EAAE,IAAI;YACX,OAAO,EAAE,IAAI,WAAW,EAAE;SAC7B,CAAC,CAAC;IACP,CAAC;IAED,MAAM,KAAK,GAAG,GAAS,EAAE;QACrB,QAAQ,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;YACnB,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,IAAI,EAAE,EAAE,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE;YAC7B,UAAU,EAAE,OAAO,CAAC,UAAU,GAAG,CAAC;YAClC,KAAK,EAAE,IAAI;YACX,OAAO,EAAE,IAAI,WAAW,EAAE;SAC7B,CAAC,CAAC,CAAC;IACR,CAAC,CAAC;IAEF,MAAM,QAAQ,GAAG,CAAC,IAAU,EAAQ,EAAE;QAClC,QAAQ,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,OAAO,EAAE,IAAI,EAAE,EAAE,GAAG,OAAO,CAAC,IAAI,EAAE,GAAG,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC;IAChF,CAAC,CAAC;IAEF,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;AACjD,CAAC,CAAC;AAIF,MAAM,cAAc,GAAG,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAkB,EAAa,EAAE,CAAC,CACtF,KAAC,iBAAiB,IACd,IAAI,EAAC,qBAAqB,EAC1B,YAAY,EAAE,GAAG,EACjB,gBAAgB,EAAE,GAAG,CAAC,UAAU,CAAC,KAAK,EACtC,OAAO,kBAEP,MAAC,MAAM,IACH,WAAW,EAAE,GAAG,CAAC,WAAW,CAAC,QAAQ,EACrC,OAAO,EAAE,EAAE,EACX,SAAS,EAAE,EAAE,EACb,YAAY,EAAE,EAAE,EAChB,WAAW,EAAE,EAAE,EACf,SAAS,EAAE,EAAE,aAEb,KAAC,QAAQ,IAAC,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,GAAI,EACtE,KAAC,YAAY,IAAC,KAAK,EAAE,OAAO,GAAI,IAC3B,GACO,CACvB,CAAC;AAEF,MAAM,gBAAgB,GAAG,CAAC,EAAE,KAAK,EAAgB,EAAa,EAAE;IAC5D,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,eAAe,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;IAEzE,OAAO,CACH,KAAC,cAAc,IACX,OAAO,QACP,OAAO,QACP,MAAM,EAAE,CACJ,KAAC,YAAY,IACT,WAAW,EAAE,KAAC,cAAc,IAAC,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,CAAC,KAAK,GAAI,EACzE,GAAG,EAAE,KAAC,SAAS,IAAC,KAAK,EAAC,aAAa,EAAC,SAAS,EAAE,KAAK,GAAI,GAC1D,CACL,YAED,MAAC,MAAM,eACH,KAAC,MAAM,IAAC,WAAW,EAAE,GAAG,CAAC,WAAW,CAAC,QAAQ,EAAE,OAAO,QAAC,OAAO,kBAC1D,KAAC,eAAe,IAAwB,IAAI,EAAE,KAAK,CAAC,IAAI,YACnD,KAAK,CAAC,KAAK,KAAK,IAAI;4BACjB,CAAC,CAAC,KAAC,cAAc,IAAC,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE,SAAS,GAAI;4BACzD,CAAC,CAAC,CACM,KAAC,aAAa,IACV,IAAI,EAAC,yBAAyB,EAC9B,KAAK,EAAC,qBAAqB,EAC3B,QAAQ,EAAC,uBAAuB,EAChC,WAAW,EAAE,gBAAgB,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;oCAChE,4DAA4D,GAClE,CACL,IAXS,KAAK,CAAC,UAAU,CAYpB,GACb,EACT,KAAC,cAAc,IAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,QAAQ,EAAE,QAAQ,GAAI,IACzF,GACI,CACpB,CAAC;AACN,CAAC,CAAC;AAEF,OAAO,EAAE,gBAAgB,EAAE,CAAC","sourcesContent":["import type { ReactNode } from \"react\";\nimport { markupEscapeText } from \"@gtkx/gi/glib\";\nimport * as Gtk from \"@gtkx/gi/gtk\";\nimport { AdwHeaderBar, AdwStatusPage, AdwToolbarView, AdwWindowTitle } from \"@gtkx/jsx/adw\";\nimport { GtkBox, GtkButton, GtkScrolledWindow } from \"@gtkx/jsx/gtk\";\nimport { createPortal, rootElement } from \"@gtkx/react\";\nimport { Component, useCallback, useMemo, useState } from \"react\";\nimport type { StoryEntry } from \"./catalog.js\";\nimport type { Args, ComposedStory } from \"./types.js\";\nimport { ActionsPanel } from \"./actions-panel.js\";\nimport { ActionStore, bindActions } from \"./actions.js\";\nimport { Controls } from \"./controls.js\";\n\ntype PreviewProps = {\n entry: StoryEntry;\n};\n\ntype PreviewState = {\n story: ComposedStory;\n args: Args;\n generation: number;\n error: Error | null;\n actions: ActionStore;\n};\n\ntype BoundaryProps = { children: ReactNode; args: Args };\ntype BoundaryState = { error: Error | null; args: Args };\n\nclass PreviewBoundary extends Component<BoundaryProps, BoundaryState> {\n static getDerivedStateFromProps(props: BoundaryProps, state: BoundaryState): BoundaryState | null {\n return props.args === state.args ? null : { error: null, args: props.args };\n }\n\n static getDerivedStateFromError(error: unknown): Pick<BoundaryState, \"error\"> {\n return { error: error instanceof Error ? error : new Error(String(error)) };\n }\n\n override state: BoundaryState = { error: null, args: this.props.args };\n\n override render(): ReactNode {\n return this.state.error === null\n ? this.props.children\n : (\n <AdwStatusPage\n name=\"storybook-preview-error\"\n title=\"Preview failed\"\n iconName=\"dialog-error-symbolic\"\n description={markupEscapeText(this.state.error.message.slice(0, 500), -1) +\n \"\\n\\nAdjust controls, reset the preview, or select another story to continue.\"}\n />\n );\n }\n}\n\nconst previewMode = (story: ComposedStory): \"content\" | \"window\" | \"dialog\" => {\n const gtkx = story.parameters.gtkx;\n const mode = typeof gtkx === \"object\" && gtkx !== null && \"preview\" in gtkx ? gtkx.preview : \"content\";\n\n if (mode !== \"content\" && mode !== \"window\" && mode !== \"dialog\") {\n throw new Error(\"Unsupported GTKX story preview mode\");\n }\n\n return mode;\n};\n\nconst PreviewContent = ({ story: Story, args }: { story: ComposedStory; args: Args }): ReactNode => {\n const mode = previewMode(Story);\n\n if (mode !== \"content\") {\n return (\n <>\n <AdwStatusPage\n title={mode === \"window\" ? \"Window preview\" : \"Dialog preview\"}\n iconName=\"window-new-symbolic\"\n description=\"The story owns its presentation. Reset to open it again.\"\n />\n {createPortal(<Story {...args} />, rootElement)}\n </>\n );\n }\n\n const margin = Story.parameters.layout === \"fullscreen\" ? 0 : 24;\n const align = Story.parameters.layout === \"centered\" ? Gtk.Align.CENTER : Gtk.Align.FILL;\n\n return (\n <GtkBox\n name=\"storybook-canvas\"\n orientation={Gtk.Orientation.VERTICAL}\n hexpand\n vexpand\n halign={align}\n valign={align}\n marginTop={margin}\n marginBottom={margin}\n marginStart={margin}\n marginEnd={margin}\n >\n <Story {...args} />\n </GtkBox>\n );\n};\n\nconst usePreviewState = ({ entry }: PreviewProps) => {\n const [state, setState] = useState<PreviewState>(() => ({\n story: entry.story,\n args: { ...entry.story.args },\n generation: 0,\n error: null,\n actions: new ActionStore(),\n }));\n const onError = useCallback((error: Error) => {\n setState((current) => current.story === state.story && current.generation === state.generation\n ? { ...current, error }\n : current);\n }, [state.story, state.generation]);\n const boundArgs = useMemo(\n () => bindActions(state.args, state.story.argTypes, state.actions, onError),\n [state.args, state.story.argTypes, state.actions, onError],\n );\n\n if (state.story !== entry.story) {\n setState({\n story: entry.story,\n args: { ...entry.story.args },\n generation: state.generation + 1,\n error: null,\n actions: new ActionStore(),\n });\n }\n\n const reset = (): void => {\n setState((current) => ({\n story: entry.story,\n args: { ...entry.story.args },\n generation: current.generation + 1,\n error: null,\n actions: new ActionStore(),\n }));\n };\n\n const onChange = (args: Args): void => {\n setState((current) => ({ ...current, args: { ...current.args, ...args } }));\n };\n\n return { state, boundArgs, reset, onChange };\n};\n\ntype InspectorProps = PreviewProps & { actions: ActionStore; args: Args; onChange: (args: Args) => void };\n\nconst StoryInspector = ({ entry, actions, args, onChange }: InspectorProps): ReactNode => (\n <GtkScrolledWindow\n name=\"storybook-inspector\"\n widthRequest={280}\n hscrollbarPolicy={Gtk.PolicyType.NEVER}\n vexpand\n >\n <GtkBox\n orientation={Gtk.Orientation.VERTICAL}\n spacing={24}\n marginTop={18}\n marginBottom={18}\n marginStart={12}\n marginEnd={12}\n >\n <Controls argTypes={entry.controls} args={args} onChange={onChange} />\n <ActionsPanel store={actions} />\n </GtkBox>\n </GtkScrolledWindow>\n);\n\nconst StorybookPreview = ({ entry }: PreviewProps): ReactNode => {\n const { state, boundArgs, reset, onChange } = usePreviewState({ entry });\n\n return (\n <AdwToolbarView\n hexpand\n vexpand\n topBar={(\n <AdwHeaderBar\n titleWidget={<AdwWindowTitle title={entry.name} subtitle={entry.title} />}\n end={<GtkButton label=\"Reset story\" onClicked={reset} />}\n />\n )}\n >\n <GtkBox>\n <GtkBox orientation={Gtk.Orientation.VERTICAL} hexpand vexpand>\n <PreviewBoundary key={state.generation} args={state.args}>\n {state.error === null\n ? <PreviewContent story={entry.story} args={boundArgs} />\n : (\n <AdwStatusPage\n name=\"storybook-preview-error\"\n title=\"Story action failed\"\n iconName=\"dialog-error-symbolic\"\n description={markupEscapeText(state.error.message.slice(0, 500), -1) +\n \"\\n\\nReset the preview or select another story to continue.\"}\n />\n )}\n </PreviewBoundary>\n </GtkBox>\n <StoryInspector entry={entry} actions={state.actions} args={state.args} onChange={onChange} />\n </GtkBox>\n </AdwToolbarView>\n );\n};\n\nexport { StorybookPreview };\n"]}
1
+ {"version":3,"file":"explorer-preview.js","sourceRoot":"","sources":["../src/explorer-preview.tsx"],"names":[],"mappings":"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","sourcesContent":["import type { ReactNode } from \"react\";\nimport { markupEscapeText } from \"@gtkx/gi/glib\";\nimport * as Gtk from \"@gtkx/gi/gtk\";\nimport { AdwHeaderBar, AdwStatusPage, AdwToolbarView, AdwWindowTitle } from \"@gtkx/jsx/adw\";\nimport { GtkBox, GtkButton, GtkScrolledWindow } from \"@gtkx/jsx/gtk\";\nimport { createPortal, rootElement } from \"@gtkx/react\";\nimport { normalizeError } from \"@gtkx/utils\";\nimport { Component, useCallback, useMemo, useState } from \"react\";\nimport type { StoryEntry } from \"./catalog.js\";\nimport type { Args, ComposedStory } from \"./types.js\";\nimport { ActionsPanel } from \"./actions-panel.js\";\nimport { ActionStore, bindActions } from \"./actions.js\";\nimport { Controls } from \"./controls.js\";\n\ntype PreviewProps = {\n entry: StoryEntry;\n};\n\ntype PreviewState = {\n story: ComposedStory;\n args: Args;\n generation: number;\n error: Error | null;\n actions: ActionStore;\n};\n\ntype BoundaryProps = { children: ReactNode; args: Args };\ntype BoundaryState = { error: Error | null; args: Args };\n\nclass PreviewBoundary extends Component<BoundaryProps, BoundaryState> {\n static getDerivedStateFromProps(props: BoundaryProps, state: BoundaryState): BoundaryState | null {\n return props.args === state.args ? null : { error: null, args: props.args };\n }\n\n static getDerivedStateFromError(error: unknown): Pick<BoundaryState, \"error\"> {\n return { error: normalizeError(error) };\n }\n\n override state: BoundaryState = { error: null, args: this.props.args };\n\n override render(): ReactNode {\n return this.state.error === null ? (\n this.props.children\n ) : (\n <AdwStatusPage\n name=\"storybook-preview-error\"\n title=\"Preview failed\"\n iconName=\"dialog-error-symbolic\"\n description={\n markupEscapeText(this.state.error.message.slice(0, 500), -1) +\n \"\\n\\nAdjust controls, reset the preview, or select another story to continue.\"\n }\n />\n );\n }\n}\n\nconst previewMode = (story: ComposedStory): \"content\" | \"window\" | \"dialog\" => {\n const gtkx = story.parameters.gtkx;\n const mode = typeof gtkx === \"object\" && gtkx !== null && \"preview\" in gtkx ? gtkx.preview : \"content\";\n\n if (mode !== \"content\" && mode !== \"window\" && mode !== \"dialog\") {\n throw new Error(\"Unsupported GTKX story preview mode\");\n }\n\n return mode;\n};\n\nconst PreviewContent = ({ story: Story, args }: { story: ComposedStory; args: Args }): ReactNode => {\n const mode = previewMode(Story);\n\n if (mode !== \"content\") {\n return (\n <>\n <AdwStatusPage\n title={mode === \"window\" ? \"Window preview\" : \"Dialog preview\"}\n iconName=\"window-new-symbolic\"\n description=\"The story owns its presentation. Reset to open it again.\"\n />\n {createPortal(<Story {...args} />, rootElement)}\n </>\n );\n }\n\n const margin = Story.parameters.layout === \"fullscreen\" ? 0 : 24;\n const align = Story.parameters.layout === \"centered\" ? Gtk.Align.CENTER : Gtk.Align.FILL;\n\n return (\n <GtkBox\n name=\"storybook-canvas\"\n orientation={Gtk.Orientation.VERTICAL}\n hexpand\n vexpand\n halign={align}\n valign={align}\n marginTop={margin}\n marginBottom={margin}\n marginStart={margin}\n marginEnd={margin}\n >\n <Story {...args} />\n </GtkBox>\n );\n};\n\nconst usePreviewState = ({ entry }: PreviewProps) => {\n const [state, setState] = useState<PreviewState>(() => ({\n story: entry.story,\n args: { ...entry.story.args },\n generation: 0,\n error: null,\n actions: new ActionStore(),\n }));\n const onError = useCallback(\n (error: Error) => {\n setState((current) =>\n current.story === state.story && current.generation === state.generation\n ? { ...current, error }\n : current,\n );\n },\n [state.story, state.generation],\n );\n const boundArgs = useMemo(\n () => bindActions(state.args, state.story.argTypes, state.actions, onError),\n [state.args, state.story.argTypes, state.actions, onError],\n );\n\n if (state.story !== entry.story) {\n setState({\n story: entry.story,\n args: { ...entry.story.args },\n generation: state.generation + 1,\n error: null,\n actions: new ActionStore(),\n });\n }\n\n const reset = (): void => {\n setState((current) => ({\n story: entry.story,\n args: { ...entry.story.args },\n generation: current.generation + 1,\n error: null,\n actions: new ActionStore(),\n }));\n };\n\n const onChange = (args: Args): void => {\n setState((current) => ({ ...current, args: { ...current.args, ...args } }));\n };\n\n return { state, boundArgs, reset, onChange };\n};\n\ntype InspectorProps = PreviewProps & { actions: ActionStore; args: Args; onChange: (args: Args) => void };\n\nconst StoryInspector = ({ entry, actions, args, onChange }: InspectorProps): ReactNode => (\n <GtkScrolledWindow name=\"storybook-inspector\" widthRequest={280} hscrollbarPolicy={Gtk.PolicyType.NEVER} vexpand>\n <GtkBox\n orientation={Gtk.Orientation.VERTICAL}\n spacing={24}\n marginTop={18}\n marginBottom={18}\n marginStart={12}\n marginEnd={12}\n >\n <Controls argTypes={entry.controls} args={args} onChange={onChange} />\n <ActionsPanel store={actions} />\n </GtkBox>\n </GtkScrolledWindow>\n);\n\nconst StorybookPreview = ({ entry }: PreviewProps): ReactNode => {\n const { state, boundArgs, reset, onChange } = usePreviewState({ entry });\n\n return (\n <AdwToolbarView\n hexpand\n vexpand\n topBar={\n <AdwHeaderBar\n titleWidget={<AdwWindowTitle title={entry.name} subtitle={entry.title} />}\n end={<GtkButton label=\"Reset story\" onClicked={reset} />}\n />\n }\n >\n <GtkBox>\n <GtkBox orientation={Gtk.Orientation.VERTICAL} hexpand vexpand>\n <PreviewBoundary key={state.generation} args={state.args}>\n {state.error === null ? (\n <PreviewContent story={entry.story} args={boundArgs} />\n ) : (\n <AdwStatusPage\n name=\"storybook-preview-error\"\n title=\"Story action failed\"\n iconName=\"dialog-error-symbolic\"\n description={\n markupEscapeText(state.error.message.slice(0, 500), -1) +\n \"\\n\\nReset the preview or select another story to continue.\"\n }\n />\n )}\n </PreviewBoundary>\n </GtkBox>\n <StoryInspector entry={entry} actions={state.actions} args={state.args} onChange={onChange} />\n </GtkBox>\n </AdwToolbarView>\n );\n};\n\nexport { StorybookPreview };\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"explorer-view.d.ts","sourceRoot":"","sources":["../src/explorer-view.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAavC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAIjD,gEAAgE;AAChE,KAAK,cAAc,GAAG;IAClB,8EAA8E;IAC9E,OAAO,EAAE,YAAY,CAAC;IACtB,kEAAkE;IAClE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,qEAAqE;IACrE,KAAK,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAsDF,uGAAuG;AACvG,QAAA,MAAM,SAAS,GAAI,oCAIhB,cAAc,KAAG,SAMnB,CAAC;AAEF,OAAO,EAAE,SAAS,EAAE,CAAC"}
1
+ {"version":3,"file":"explorer-view.d.ts","sourceRoot":"","sources":["../src/explorer-view.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAavC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAIjD,gEAAgE;AAChE,KAAK,cAAc,GAAG;IAClB,8EAA8E;IAC9E,OAAO,EAAE,YAAY,CAAC;IACtB,kEAAkE;IAClE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,qEAAqE;IACrE,KAAK,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAsDF,uGAAuG;AACvG,QAAA,MAAM,SAAS,uCAIZ,cAAc,KAAG,SAMnB,CAAC;AAEF,OAAO,EAAE,SAAS,EAAE,CAAC"}
@@ -14,9 +14,7 @@ const StorybookView = ({ catalog, title = "GTKX Storybook" }) => {
14
14
  if (selectedId !== selected?.id) {
15
15
  setSelectedId(selected?.id);
16
16
  }
17
- return (_jsx(AdwOverlaySplitView, { minSidebarWidth: 220, maxSidebarWidth: 300, sidebar: (_jsx(AdwToolbarView, { topBar: (_jsx(AdwHeaderBar, { titleWidget: (_jsx(AdwWindowTitle, { title: title, subtitle: `${String(snapshot.stories.length)} stories` })) })), children: _jsx(StoryNavigator, { stories: snapshot.stories, errors: snapshot.errors, selectedId: selected?.id, onSelect: setSelectedId }) })), children: selected
18
- ? _jsx(StorybookPreview, { entry: selected }, selected.id)
19
- : (_jsx(AdwToolbarView, { topBar: _jsx(AdwHeaderBar, {}), children: _jsx(AdwStatusPage, { name: "storybook-empty", title: snapshot.isLoading ? "Loading stories" : "Choose a story", iconName: "applications-development-symbolic", description: "Stories from your project appear in the sidebar." }) })) }));
17
+ return (_jsx(AdwOverlaySplitView, { minSidebarWidth: 220, maxSidebarWidth: 300, sidebar: _jsx(AdwToolbarView, { topBar: _jsx(AdwHeaderBar, { titleWidget: _jsx(AdwWindowTitle, { title: title, subtitle: `${String(snapshot.stories.length)} stories` }) }), children: _jsx(StoryNavigator, { stories: snapshot.stories, errors: snapshot.errors, selectedId: selected?.id, onSelect: setSelectedId }) }), children: selected ? (_jsx(StorybookPreview, { entry: selected }, selected.id)) : (_jsx(AdwToolbarView, { topBar: _jsx(AdwHeaderBar, {}), children: _jsx(AdwStatusPage, { name: "storybook-empty", title: snapshot.isLoading ? "Loading stories" : "Choose a story", iconName: "applications-development-symbolic", description: "Stories from your project appear in the sidebar." }) })) }));
20
18
  };
21
19
  /** Renders the Adwaita explorer application with navigation, story previews, controls, and actions. */
22
20
  const Storybook = ({ catalog, applicationId = "org.gtkx.Storybook", title = "GTKX Storybook", }) => (_jsx(AdwApplication, { applicationId: applicationId, flags: Gio.ApplicationFlags.NON_UNIQUE, children: _jsx(AdwApplicationWindow, { title: title, defaultWidth: 1200, defaultHeight: 800, onCloseRequest: quit, children: _jsx(StorybookView, { catalog: catalog, title: title }) }) }));
@@ -1 +1 @@
1
- {"version":3,"file":"explorer-view.js","sourceRoot":"","sources":["../src/explorer-view.tsx"],"names":[],"mappings":";AACA,OAAO,KAAK,GAAG,MAAM,cAAc,CAAC;AACpC,OAAO,EACH,cAAc,EACd,oBAAoB,EACpB,YAAY,EACZ,mBAAmB,EACnB,aAAa,EACb,cAAc,EACd,cAAc,GACjB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AACnC,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,oBAAoB,EAAE,MAAM,OAAO,CAAC;AAEpE,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAczD,MAAM,aAAa,GAAG,CAAC,EAAE,OAAO,EAAE,KAAK,GAAG,gBAAgB,EAAsB,EAAa,EAAE;IAC3F,MAAM,SAAS,GAAG,WAAW,CAAC,CAAC,QAAoB,EAAE,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IAChG,MAAM,WAAW,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IACxE,MAAM,QAAQ,GAAG,oBAAoB,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;IAC9D,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,EAAU,CAAC;IACvD,MAAM,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,UAAU,CAAC,IAAI,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAElG,IAAI,UAAU,KAAK,QAAQ,EAAE,EAAE,EAAE,CAAC;QAC9B,aAAa,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;IAChC,CAAC;IAED,OAAO,CACH,KAAC,mBAAmB,IAChB,eAAe,EAAE,GAAG,EACpB,eAAe,EAAE,GAAG,EACpB,OAAO,EAAE,CACL,KAAC,cAAc,IACX,MAAM,EAAE,CACJ,KAAC,YAAY,IACT,WAAW,EAAE,CACT,KAAC,cAAc,IAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,GAAI,CAC3F,GACH,CACL,YAED,KAAC,cAAc,IACX,OAAO,EAAE,QAAQ,CAAC,OAAO,EACzB,MAAM,EAAE,QAAQ,CAAC,MAAM,EACvB,UAAU,EAAE,QAAQ,EAAE,EAAE,EACxB,QAAQ,EAAE,aAAa,GACzB,GACW,CACpB,YAEA,QAAQ;YACL,CAAC,CAAC,KAAC,gBAAgB,IAAmB,KAAK,EAAE,QAAQ,IAA5B,QAAQ,CAAC,EAAE,CAAqB;YACzD,CAAC,CAAC,CACM,KAAC,cAAc,IAAC,MAAM,EAAE,KAAC,YAAY,KAAG,YACpC,KAAC,aAAa,IACV,IAAI,EAAC,iBAAiB,EACtB,KAAK,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,gBAAgB,EAChE,QAAQ,EAAC,mCAAmC,EAC5C,WAAW,EAAC,kDAAkD,GAChE,GACW,CACpB,GACS,CACzB,CAAC;AACN,CAAC,CAAC;AAEF,uGAAuG;AACvG,MAAM,SAAS,GAAG,CAAC,EACf,OAAO,EACP,aAAa,GAAG,oBAAoB,EACpC,KAAK,GAAG,gBAAgB,GACX,EAAa,EAAE,CAAC,CAC7B,KAAC,cAAc,IAAC,aAAa,EAAE,aAAa,EAAE,KAAK,EAAE,GAAG,CAAC,gBAAgB,CAAC,UAAU,YAChF,KAAC,oBAAoB,IAAC,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,aAAa,EAAE,GAAG,EAAE,cAAc,EAAE,IAAI,YAC5F,KAAC,aAAa,IAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,GAAI,GAC9B,GACV,CACpB,CAAC;AAEF,OAAO,EAAE,SAAS,EAAE,CAAC","sourcesContent":["import type { ReactNode } from \"react\";\nimport * as Gio from \"@gtkx/gi/gio\";\nimport {\n AdwApplication,\n AdwApplicationWindow,\n AdwHeaderBar,\n AdwOverlaySplitView,\n AdwStatusPage,\n AdwToolbarView,\n AdwWindowTitle,\n} from \"@gtkx/jsx/adw\";\nimport { quit } from \"@gtkx/react\";\nimport { useCallback, useState, useSyncExternalStore } from \"react\";\nimport type { StoryCatalog } from \"./catalog.js\";\nimport { StoryNavigator } from \"./explorer-navigator.js\";\nimport { StorybookPreview } from \"./explorer-preview.js\";\n\n/** Configuration for the native Storybook application shell. */\ntype StorybookProps = {\n /** Source catalog whose stories and loading errors appear in the explorer. */\n catalog: StoryCatalog;\n /** Gio application identifier; defaults to org.gtkx.Storybook. */\n applicationId?: string;\n /** Explorer window and sidebar title; defaults to GTKX Storybook. */\n title?: string;\n};\n\ntype StorybookViewProps = Pick<StorybookProps, \"catalog\" | \"title\">;\n\nconst StorybookView = ({ catalog, title = \"GTKX Storybook\" }: StorybookViewProps): ReactNode => {\n const subscribe = useCallback((listener: () => void) => catalog.subscribe(listener), [catalog]);\n const getSnapshot = useCallback(() => catalog.getSnapshot(), [catalog]);\n const snapshot = useSyncExternalStore(subscribe, getSnapshot);\n const [selectedId, setSelectedId] = useState<string>();\n const selected = snapshot.stories.find((entry) => entry.id === selectedId) ?? snapshot.stories[0];\n\n if (selectedId !== selected?.id) {\n setSelectedId(selected?.id);\n }\n\n return (\n <AdwOverlaySplitView\n minSidebarWidth={220}\n maxSidebarWidth={300}\n sidebar={(\n <AdwToolbarView\n topBar={(\n <AdwHeaderBar\n titleWidget={(\n <AdwWindowTitle title={title} subtitle={`${String(snapshot.stories.length)} stories`} />\n )}\n />\n )}\n >\n <StoryNavigator\n stories={snapshot.stories}\n errors={snapshot.errors}\n selectedId={selected?.id}\n onSelect={setSelectedId}\n />\n </AdwToolbarView>\n )}\n >\n {selected\n ? <StorybookPreview key={selected.id} entry={selected} />\n : (\n <AdwToolbarView topBar={<AdwHeaderBar />}>\n <AdwStatusPage\n name=\"storybook-empty\"\n title={snapshot.isLoading ? \"Loading stories\" : \"Choose a story\"}\n iconName=\"applications-development-symbolic\"\n description=\"Stories from your project appear in the sidebar.\"\n />\n </AdwToolbarView>\n )}\n </AdwOverlaySplitView>\n );\n};\n\n/** Renders the Adwaita explorer application with navigation, story previews, controls, and actions. */\nconst Storybook = ({\n catalog,\n applicationId = \"org.gtkx.Storybook\",\n title = \"GTKX Storybook\",\n}: StorybookProps): ReactNode => (\n <AdwApplication applicationId={applicationId} flags={Gio.ApplicationFlags.NON_UNIQUE}>\n <AdwApplicationWindow title={title} defaultWidth={1200} defaultHeight={800} onCloseRequest={quit}>\n <StorybookView catalog={catalog} title={title} />\n </AdwApplicationWindow>\n </AdwApplication>\n);\n\nexport { Storybook };\n"]}
1
+ {"version":3,"file":"explorer-view.js","sourceRoot":"","sources":["../src/explorer-view.tsx"],"names":[],"mappings":";AACA,OAAO,KAAK,GAAG,MAAM,cAAc,CAAC;AACpC,OAAO,EACH,cAAc,EACd,oBAAoB,EACpB,YAAY,EACZ,mBAAmB,EACnB,aAAa,EACb,cAAc,EACd,cAAc,GACjB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AACnC,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,oBAAoB,EAAE,MAAM,OAAO,CAAC;AAEpE,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAczD,MAAM,aAAa,GAAG,CAAC,EAAE,OAAO,EAAE,KAAK,GAAG,gBAAgB,EAAsB,EAAa,EAAE;IAC3F,MAAM,SAAS,GAAG,WAAW,CAAC,CAAC,QAAoB,EAAE,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IAChG,MAAM,WAAW,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IACxE,MAAM,QAAQ,GAAG,oBAAoB,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;IAC9D,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,EAAU,CAAC;IACvD,MAAM,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,UAAU,CAAC,IAAI,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAElG,IAAI,UAAU,KAAK,QAAQ,EAAE,EAAE,EAAE,CAAC;QAC9B,aAAa,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;IAChC,CAAC;IAED,OAAO,CACH,KAAC,mBAAmB,IAChB,eAAe,EAAE,GAAG,EACpB,eAAe,EAAE,GAAG,EACpB,OAAO,EACH,KAAC,cAAc,IACX,MAAM,EACF,KAAC,YAAY,IACT,WAAW,EACP,KAAC,cAAc,IAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,GAAI,GAE9F,YAGN,KAAC,cAAc,IACX,OAAO,EAAE,QAAQ,CAAC,OAAO,EACzB,MAAM,EAAE,QAAQ,CAAC,MAAM,EACvB,UAAU,EAAE,QAAQ,EAAE,EAAE,EACxB,QAAQ,EAAE,aAAa,GACzB,GACW,YAGpB,QAAQ,CAAC,CAAC,CAAC,CACR,KAAC,gBAAgB,IAAmB,KAAK,EAAE,QAAQ,IAA5B,QAAQ,CAAC,EAAE,CAAqB,CAC1D,CAAC,CAAC,CAAC,CACA,KAAC,cAAc,IAAC,MAAM,EAAE,KAAC,YAAY,KAAG,YACpC,KAAC,aAAa,IACV,IAAI,EAAC,iBAAiB,EACtB,KAAK,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,gBAAgB,EAChE,QAAQ,EAAC,mCAAmC,EAC5C,WAAW,EAAC,kDAAkD,GAChE,GACW,CACpB,GACiB,CACzB,CAAC;AACN,CAAC,CAAC;AAEF,uGAAuG;AACvG,MAAM,SAAS,GAAG,CAAC,EACf,OAAO,EACP,aAAa,GAAG,oBAAoB,EACpC,KAAK,GAAG,gBAAgB,GACX,EAAa,EAAE,CAAC,CAC7B,KAAC,cAAc,IAAC,aAAa,EAAE,aAAa,EAAE,KAAK,EAAE,GAAG,CAAC,gBAAgB,CAAC,UAAU,YAChF,KAAC,oBAAoB,IAAC,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,aAAa,EAAE,GAAG,EAAE,cAAc,EAAE,IAAI,YAC5F,KAAC,aAAa,IAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,GAAI,GAC9B,GACV,CACpB,CAAC;AAEF,OAAO,EAAE,SAAS,EAAE,CAAC","sourcesContent":["import type { ReactNode } from \"react\";\nimport * as Gio from \"@gtkx/gi/gio\";\nimport {\n AdwApplication,\n AdwApplicationWindow,\n AdwHeaderBar,\n AdwOverlaySplitView,\n AdwStatusPage,\n AdwToolbarView,\n AdwWindowTitle,\n} from \"@gtkx/jsx/adw\";\nimport { quit } from \"@gtkx/react\";\nimport { useCallback, useState, useSyncExternalStore } from \"react\";\nimport type { StoryCatalog } from \"./catalog.js\";\nimport { StoryNavigator } from \"./explorer-navigator.js\";\nimport { StorybookPreview } from \"./explorer-preview.js\";\n\n/** Configuration for the native Storybook application shell. */\ntype StorybookProps = {\n /** Source catalog whose stories and loading errors appear in the explorer. */\n catalog: StoryCatalog;\n /** Gio application identifier; defaults to org.gtkx.Storybook. */\n applicationId?: string;\n /** Explorer window and sidebar title; defaults to GTKX Storybook. */\n title?: string;\n};\n\ntype StorybookViewProps = Pick<StorybookProps, \"catalog\" | \"title\">;\n\nconst StorybookView = ({ catalog, title = \"GTKX Storybook\" }: StorybookViewProps): ReactNode => {\n const subscribe = useCallback((listener: () => void) => catalog.subscribe(listener), [catalog]);\n const getSnapshot = useCallback(() => catalog.getSnapshot(), [catalog]);\n const snapshot = useSyncExternalStore(subscribe, getSnapshot);\n const [selectedId, setSelectedId] = useState<string>();\n const selected = snapshot.stories.find((entry) => entry.id === selectedId) ?? snapshot.stories[0];\n\n if (selectedId !== selected?.id) {\n setSelectedId(selected?.id);\n }\n\n return (\n <AdwOverlaySplitView\n minSidebarWidth={220}\n maxSidebarWidth={300}\n sidebar={\n <AdwToolbarView\n topBar={\n <AdwHeaderBar\n titleWidget={\n <AdwWindowTitle title={title} subtitle={`${String(snapshot.stories.length)} stories`} />\n }\n />\n }\n >\n <StoryNavigator\n stories={snapshot.stories}\n errors={snapshot.errors}\n selectedId={selected?.id}\n onSelect={setSelectedId}\n />\n </AdwToolbarView>\n }\n >\n {selected ? (\n <StorybookPreview key={selected.id} entry={selected} />\n ) : (\n <AdwToolbarView topBar={<AdwHeaderBar />}>\n <AdwStatusPage\n name=\"storybook-empty\"\n title={snapshot.isLoading ? \"Loading stories\" : \"Choose a story\"}\n iconName=\"applications-development-symbolic\"\n description=\"Stories from your project appear in the sidebar.\"\n />\n </AdwToolbarView>\n )}\n </AdwOverlaySplitView>\n );\n};\n\n/** Renders the Adwaita explorer application with navigation, story previews, controls, and actions. */\nconst Storybook = ({\n catalog,\n applicationId = \"org.gtkx.Storybook\",\n title = \"GTKX Storybook\",\n}: StorybookProps): ReactNode => (\n <AdwApplication applicationId={applicationId} flags={Gio.ApplicationFlags.NON_UNIQUE}>\n <AdwApplicationWindow title={title} defaultWidth={1200} defaultHeight={800} onCloseRequest={quit}>\n <StorybookView catalog={catalog} title={title} />\n </AdwApplicationWindow>\n </AdwApplication>\n);\n\nexport { Storybook };\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"explorer.d.ts","sourceRoot":"","sources":["../src/explorer.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAI1C,2EAA2E;AAC3E,KAAK,gBAAgB,GAAG;IACpB,kGAAkG;IAClG,aAAa,EAAE,CAAC,OAAO,EAAE,WAAW,EAAE,EAAE,OAAO,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5E,sFAAsF;IACtF,oBAAoB,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IAC/C,8DAA8D;IAC9D,IAAI,EAAE,MAAM,IAAI,CAAC;CACpB,CAAC;AAEF,wFAAwF;AACxF,QAAA,MAAM,cAAc,GAAI,SAAS;IAC7B,uEAAuE;IACvE,aAAa,EAAE,MAAM,CAAC;CACzB,KAAG,gBAcH,CAAC;AAEF,OAAO,EAAE,cAAc,EAAE,CAAC;AAC1B,YAAY,EAAE,gBAAgB,EAAE,CAAC;AACjC,YAAY,EAAE,oBAAoB,EAAE,UAAU,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAElG,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC"}
1
+ {"version":3,"file":"explorer.d.ts","sourceRoot":"","sources":["../src/explorer.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAI1C,2EAA2E;AAC3E,KAAK,gBAAgB,GAAG;IACpB,kGAAkG;IAClG,aAAa,EAAE,CAAC,OAAO,EAAE,WAAW,EAAE,EAAE,OAAO,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5E,sFAAsF;IACtF,oBAAoB,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IAC/C,8DAA8D;IAC9D,IAAI,EAAE,MAAM,IAAI,CAAC;CACpB,CAAC;AAEF,wFAAwF;AACxF,QAAA,MAAM,cAAc,YAAa;IAC7B,uEAAuE;IACvE,aAAa,EAAE,MAAM,CAAC;CACzB,KAAG,gBAcH,CAAC;AAEF,OAAO,EAAE,cAAc,EAAE,CAAC;AAC1B,YAAY,EAAE,gBAAgB,EAAE,CAAC;AACjC,YAAY,EAAE,oBAAoB,EAAE,UAAU,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAElG,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"","sourcesContent":["import type * as Gtk from \"@gtkx/gi/gtk\";\nimport type { ComponentType, ReactNode } from \"react\";\nimport type {\n ArgsFromMeta,\n ComponentAnnotations,\n GlobalTypes,\n Renderer,\n StoryAnnotations as StorybookAnnotations,\n ArgTypes as StorybookArgTypes,\n StoryContext as StorybookContext,\n} from \"storybook/internal/types\";\n\n/** Named values supplied to a story, including component props and custom render args. */\ntype Args = Record<string, unknown>;\n\n/** Storybook renderer types for React content rendered as native GTK widgets. */\ntype NativeRenderer<TArgs extends object = Args> = Renderer & {\n /** React component receiving the story's args. */\n component: ComponentType<TArgs>;\n /** React content returned by story rendering. */\n storyResult: ReactNode;\n /** Native widget type representing the preview canvas. */\n canvasElement: Gtk.Widget;\n};\n\n/** Explicit argument metadata used to configure native controls and named actions. */\ntype ArgTypes<TArgs extends object = Args> = Partial<StorybookArgTypes<TArgs>>;\n\n/** Composed story identity, args, and annotations available to render functions and decorators. */\ntype StoryContext<TArgs extends object = Args> = Pick<\n StorybookContext<NativeRenderer<TArgs>, TArgs>,\n \"id\" | \"name\" | \"title\" | \"args\" | \"initialArgs\" | \"argTypes\" | \"viewMode\"\n> & {\n /** Parameters merged from preview, component metadata, and the story. */\n parameters: Args;\n /** Global values after applying preview defaults and metadata or story overrides. */\n globals: Args;\n};\n\n/** Renders native React content from the current story args and composition context. */\ntype StoryRender<TArgs extends object = Args> = (args: TArgs, context: StoryContext<TArgs>) => ReactNode;\n\n/** Values a decorator can override when invoking the decorated story. */\ntype StoryContextUpdate<TArgs extends object = Args> = {\n /** Partial args merged into the current invocation without changing composed defaults. */\n args?: Partial<TArgs>;\n /** Global values overridden for the decorated invocation. */\n globals?: Args;\n};\n\n/** Wraps story content and can override args or globals when invoking the supplied Story function. */\ntype Decorator<TArgs extends object = Args> = (\n Story: (update?: StoryContextUpdate<TArgs>) => ReactNode,\n context: StoryContext<TArgs>,\n) => ReactNode;\n\n/** Shared CSF annotations accepted at preview, component, and story scope. */\ntype Annotations<TArgs extends object> = {\n /** Default args, with more specific annotation scopes taking precedence. */\n args?: Partial<TArgs>;\n /** Explicit argument descriptions, controls, and action registrations. */\n argTypes?: ArgTypes<TArgs>;\n /** Parameters merged across scopes, including native preview and layout settings. */\n parameters?: Args;\n /** Wrappers composed around the story's render function. */\n decorators?: Decorator<TArgs>[];\n /** Custom renderer used in place of the component or a less specific render annotation. */\n render?: StoryRender<TArgs>;\n /** Storybook tags composed with tags from other annotation scopes. */\n tags?: string[];\n};\n\n/** Default export metadata describing a component's stories and their shared annotations. */\ntype ComponentMeta<TArgs extends object> = Annotations<TArgs> & Pick<\n ComponentAnnotations<NativeRenderer<TArgs>, TArgs>,\n \"title\" | \"id\" | \"includeStories\" | \"excludeStories\"\n> & {\n /** Component rendered with story args when no custom render annotation applies. */\n component?: ComponentType<TArgs>;\n /** Global overrides shared by this component's stories. */\n globals?: Args;\n};\n\n/** Resolves a component's props or accepts an explicitly supplied args object type. */\ntype ComponentOrProps<T> = T extends ComponentType<infer Props extends object>\n ? Props\n : T extends object ? T : Args;\n\n/** Presents combined inferred args as a single object type. */\ntype Simplify<T> = { [Key in keyof T]: T[Key] };\n\n/** Infers story args from component props, render functions, decorators, or declared defaults. */\ntype ArgsFrom<T> = T extends { component?: infer Component; render?: unknown; decorators?: unknown }\n ? Simplify<\n (NonNullable<Component> extends ComponentType<infer Props extends object> ? Props : object) &\n ArgsFromMeta<NativeRenderer, T>\n >\n : T extends { args: infer Defaults extends object } ? Defaults : Args;\n\n/** CSF3 default export metadata typed from a React component or an explicit args type. */\ntype Meta<T = Args> = ComponentMeta<ComponentOrProps<T>>;\n\n/** Annotations for one CSF3 story object, including its display name and global overrides. */\ntype StoryAnnotations<TArgs extends object> = Annotations<TArgs> & {\n /** Display name overriding the name derived from the story's named export. */\n name?: string;\n /** Global overrides applied specifically to this story. */\n globals?: Args;\n};\n\n/** Extracts args already defaulted by component metadata. */\ntype DefaultArgs<T> = T extends { args: infer Defaults } ? Defaults : Record<never, never>;\n\n/** Makes args with metadata defaults optional while preserving other required args. */\ntype RequiredStoryArgs<T, TArgs extends object> =\n Omit<TArgs, keyof DefaultArgs<T>> & Partial<Pick<TArgs, keyof TArgs & keyof DefaultArgs<T>>>;\n\n/** CSF3 story object inferred from metadata, a React component, or an explicit args type. */\ntype StoryObj<T = Args> = T extends { component?: unknown; render?: unknown; decorators?: unknown; args?: unknown }\n ? StoryAnnotations<ArgsFrom<T>> & Pick<\n StorybookAnnotations<NativeRenderer<ArgsFrom<T>>, ArgsFrom<T>, RequiredStoryArgs<T, ArgsFrom<T>>>,\n \"args\"\n >\n : StoryAnnotations<ComponentOrProps<T>>;\n\n/** Project annotations shared by all composed stories. */\ntype Preview = Annotations<Args> & {\n /** Initial global values available in story rendering and decorators. */\n initialGlobals?: Args;\n /** Storybook metadata describing global values; native toolbar controls are not provided. */\n globalTypes?: GlobalTypes;\n};\n\n/** Renderable story with merged annotations; props override its composed default args. */\ntype ComposedStory<TArgs extends object = Args> = ((args: Partial<TArgs>) => ReactNode) & {\n /** Default args merged across preview, component metadata, and story annotations. */\n args: Partial<TArgs>;\n /** Composed argument metadata available to native controls and actions. */\n argTypes: ArgTypes<TArgs>;\n /** Composed parameters available to the renderer and explorer. */\n parameters: Args;\n /** Composed global values available in story context. */\n globals: Args;\n /** Storybook identifier derived from component identity and the story export. */\n id: string;\n /** Story name attached by Storybook's portable composition API. */\n storyName: string;\n /** Tags resulting from composition across annotation scopes. */\n tags: string[];\n};\n\n/** Imported CSF module containing default metadata and named story exports. */\ntype StoryModule = {\n /** Component metadata validated when the module is composed. */\n default: unknown;\n};\n\n/** Named module exports whose types match CSF3 stories, excluding module bookkeeping. */\ntype StoryKeys<TModule extends StoryModule> = {\n [Key in keyof TModule]: Key extends \"default\" | \"__esModule\" | \"__namedExportsOrder\"\n ? never\n : TModule[Key] extends StoryAnnotations<ArgsFrom<TModule[\"default\"]>>\n ? Key\n : never;\n}[keyof TModule] & string;\n\n/** Composed stories keyed by their original named exports. */\ntype ComposedStories<TModule extends StoryModule> = Record<\n StoryKeys<TModule>,\n ComposedStory<ArgsFrom<TModule[\"default\"]>>\n>;\n\nexport type {\n Args,\n ArgTypes,\n ComponentMeta,\n ComposedStories,\n ComposedStory,\n Decorator,\n Meta,\n Preview,\n StoryAnnotations,\n StoryContext,\n StoryContextUpdate,\n StoryModule,\n StoryObj,\n StoryRender,\n};\n"]}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"","sourcesContent":["import type * as Gtk from \"@gtkx/gi/gtk\";\nimport type { ComponentType, ReactNode } from \"react\";\nimport type {\n ArgsFromMeta,\n ComponentAnnotations,\n GlobalTypes,\n Renderer,\n StoryAnnotations as StorybookAnnotations,\n ArgTypes as StorybookArgTypes,\n StoryContext as StorybookContext,\n} from \"storybook/internal/types\";\n\n/** Named values supplied to a story, including component props and custom render args. */\ntype Args = Record<string, unknown>;\n\n/** Storybook renderer types for React content rendered as native GTK widgets. */\ntype NativeRenderer<TArgs extends object = Args> = Renderer & {\n /** React component receiving the story's args. */\n component: ComponentType<TArgs>;\n /** React content returned by story rendering. */\n storyResult: ReactNode;\n /** Native widget type representing the preview canvas. */\n canvasElement: Gtk.Widget;\n};\n\n/** Explicit argument metadata used to configure native controls and named actions. */\ntype ArgTypes<TArgs extends object = Args> = Partial<StorybookArgTypes<TArgs>>;\n\n/** Composed story identity, args, and annotations available to render functions and decorators. */\ntype StoryContext<TArgs extends object = Args> = Pick<\n StorybookContext<NativeRenderer<TArgs>, TArgs>,\n \"id\" | \"name\" | \"title\" | \"args\" | \"initialArgs\" | \"argTypes\" | \"viewMode\"\n> & {\n /** Parameters merged from preview, component metadata, and the story. */\n parameters: Args;\n /** Global values after applying preview defaults and metadata or story overrides. */\n globals: Args;\n};\n\n/** Renders native React content from the current story args and composition context. */\ntype StoryRender<TArgs extends object = Args> = (args: TArgs, context: StoryContext<TArgs>) => ReactNode;\n\n/** Values a decorator can override when invoking the decorated story. */\ntype StoryContextUpdate<TArgs extends object = Args> = {\n /** Partial args merged into the current invocation without changing composed defaults. */\n args?: Partial<TArgs>;\n /** Global values overridden for the decorated invocation. */\n globals?: Args;\n};\n\n/** Wraps story content and can override args or globals when invoking the supplied Story function. */\ntype Decorator<TArgs extends object = Args> = (\n Story: (update?: StoryContextUpdate<TArgs>) => ReactNode,\n context: StoryContext<TArgs>,\n) => ReactNode;\n\n/** Shared CSF annotations accepted at preview, component, and story scope. */\ntype Annotations<TArgs extends object> = {\n /** Default args, with more specific annotation scopes taking precedence. */\n args?: Partial<TArgs>;\n /** Explicit argument descriptions, controls, and action registrations. */\n argTypes?: ArgTypes<TArgs>;\n /** Parameters merged across scopes, including native preview and layout settings. */\n parameters?: Args;\n /** Wrappers composed around the story's render function. */\n decorators?: Decorator<TArgs>[];\n /** Custom renderer used in place of the component or a less specific render annotation. */\n render?: StoryRender<TArgs>;\n /** Storybook tags composed with tags from other annotation scopes. */\n tags?: string[];\n};\n\n/** Default export metadata describing a component's stories and their shared annotations. */\ntype ComponentMeta<TArgs extends object> = Annotations<TArgs> &\n Pick<ComponentAnnotations<NativeRenderer<TArgs>, TArgs>, \"title\" | \"id\" | \"includeStories\" | \"excludeStories\"> & {\n /** Component rendered with story args when no custom render annotation applies. */\n component?: ComponentType<TArgs>;\n /** Global overrides shared by this component's stories. */\n globals?: Args;\n };\n\n/** Resolves a component's props or accepts an explicitly supplied args object type. */\ntype ComponentOrProps<T> = T extends ComponentType<infer Props extends object> ? Props : T extends object ? T : Args;\n\n/** Presents combined inferred args as a single object type. */\ntype Simplify<T> = { [Key in keyof T]: T[Key] };\n\n/** Infers story args from component props, render functions, decorators, or declared defaults. */\ntype ArgsFrom<T> = T extends { component?: infer Component; render?: unknown; decorators?: unknown }\n ? Simplify<\n (NonNullable<Component> extends ComponentType<infer Props extends object> ? Props : object) &\n ArgsFromMeta<NativeRenderer, T>\n >\n : T extends { args: infer Defaults extends object }\n ? Defaults\n : Args;\n\n/** CSF3 default export metadata typed from a React component or an explicit args type. */\ntype Meta<T = Args> = ComponentMeta<ComponentOrProps<T>>;\n\n/** Annotations for one CSF3 story object, including its display name and global overrides. */\ntype StoryAnnotations<TArgs extends object> = Annotations<TArgs> & {\n /** Display name overriding the name derived from the story's named export. */\n name?: string;\n /** Global overrides applied specifically to this story. */\n globals?: Args;\n};\n\n/** Extracts args already defaulted by component metadata. */\ntype DefaultArgs<T> = T extends { args: infer Defaults } ? Defaults : Record<never, never>;\n\n/** Makes args with metadata defaults optional while preserving other required args. */\ntype RequiredStoryArgs<T, TArgs extends object> = Omit<TArgs, keyof DefaultArgs<T>> &\n Partial<Pick<TArgs, keyof TArgs & keyof DefaultArgs<T>>>;\n\n/** CSF3 story object inferred from metadata, a React component, or an explicit args type. */\ntype StoryObj<T = Args> = T extends { component?: unknown; render?: unknown; decorators?: unknown; args?: unknown }\n ? StoryAnnotations<ArgsFrom<T>> &\n Pick<\n StorybookAnnotations<NativeRenderer<ArgsFrom<T>>, ArgsFrom<T>, RequiredStoryArgs<T, ArgsFrom<T>>>,\n \"args\"\n >\n : StoryAnnotations<ComponentOrProps<T>>;\n\n/** Project annotations shared by all composed stories. */\ntype Preview = Annotations<Args> & {\n /** Initial global values available in story rendering and decorators. */\n initialGlobals?: Args;\n /** Storybook metadata describing global values; native toolbar controls are not provided. */\n globalTypes?: GlobalTypes;\n};\n\n/** Renderable story with merged annotations; props override its composed default args. */\ntype ComposedStory<TArgs extends object = Args> = ((args: Partial<TArgs>) => ReactNode) & {\n /** Default args merged across preview, component metadata, and story annotations. */\n args: Partial<TArgs>;\n /** Composed argument metadata available to native controls and actions. */\n argTypes: ArgTypes<TArgs>;\n /** Composed parameters available to the renderer and explorer. */\n parameters: Args;\n /** Composed global values available in story context. */\n globals: Args;\n /** Storybook identifier derived from component identity and the story export. */\n id: string;\n /** Story name attached by Storybook's portable composition API. */\n storyName: string;\n /** Tags resulting from composition across annotation scopes. */\n tags: string[];\n};\n\n/** Imported CSF module containing default metadata and named story exports. */\ntype StoryModule = {\n /** Component metadata validated when the module is composed. */\n default: unknown;\n};\n\n/** Named module exports whose types match CSF3 stories, excluding module bookkeeping. */\ntype StoryKeys<TModule extends StoryModule> = {\n [Key in keyof TModule]: Key extends \"default\" | \"__esModule\" | \"__namedExportsOrder\"\n ? never\n : TModule[Key] extends StoryAnnotations<ArgsFrom<TModule[\"default\"]>>\n ? Key\n : never;\n}[keyof TModule] &\n string;\n\n/** Composed stories keyed by their original named exports. */\ntype ComposedStories<TModule extends StoryModule> = Record<\n StoryKeys<TModule>,\n ComposedStory<ArgsFrom<TModule[\"default\"]>>\n>;\n\nexport type {\n Args,\n ArgTypes,\n ComponentMeta,\n ComposedStories,\n ComposedStory,\n Decorator,\n Meta,\n Preview,\n StoryAnnotations,\n StoryContext,\n StoryContextUpdate,\n StoryModule,\n StoryObj,\n StoryRender,\n};\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"upstream.d.ts","sourceRoot":"","sources":["../src/upstream.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACR,aAAa,EACb,aAAa,EACb,OAAO,EACP,gBAAgB,EAChB,WAAW,EACd,MAAM,YAAY,CAAC;AAEpB,KAAK,YAAY,GAAG,CAAC,KAAK,SAAS,MAAM,EACrC,GAAG,WAAW,EAAE;IACZ,KAAK,EAAE,gBAAgB,CAAC,KAAK,CAAC;IAC9B,IAAI,EAAE,aAAa,CAAC,KAAK,CAAC;IAC1B,OAAO,EAAE,OAAO;IAChB,QAAQ,EAAE;QAAE,MAAM,EAAE,WAAW,CAAC,KAAK,CAAC,CAAA;KAAE;IACxC,UAAU,CAAC,EAAE,MAAM;CACtB,KACA,aAAa,CAAC,KAAK,CAAC,CAAC;AAE1B,QAAA,MAAM,uBAAuB,EAAmB,YAAY,CAAC;AAE7D,OAAO,EAAE,uBAAuB,EAAE,CAAC;AAEnC,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC"}
1
+ {"version":3,"file":"upstream.d.ts","sourceRoot":"","sources":["../src/upstream.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEvG,KAAK,YAAY,GAAG,CAAC,KAAK,SAAS,MAAM,EACrC,GAAG,WAAW,EAAE;IACZ,KAAK,EAAE,gBAAgB,CAAC,KAAK,CAAC;IAC9B,IAAI,EAAE,aAAa,CAAC,KAAK,CAAC;IAC1B,OAAO,EAAE,OAAO;IAChB,QAAQ,EAAE;QAAE,MAAM,EAAE,WAAW,CAAC,KAAK,CAAC,CAAA;KAAE;IACxC,UAAU,CAAC,EAAE,MAAM;CACtB,KACA,aAAa,CAAC,KAAK,CAAC,CAAC;AAE1B,QAAA,MAAM,uBAAuB,EAAmB,YAAY,CAAC;AAE7D,OAAO,EAAE,uBAAuB,EAAE,CAAC;AAEnC,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"upstream.js","sourceRoot":"","sources":["../src/upstream.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAmBrD,MAAM,uBAAuB,GAAG,YAA4B,CAAC;AAE7D,OAAO,EAAE,uBAAuB,EAAE,CAAC;AAEnC,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC","sourcesContent":["import { composeStory } from \"storybook/preview-api\";\nimport type {\n ComponentMeta,\n ComposedStory,\n Preview,\n StoryAnnotations,\n StoryRender,\n} from \"./types.js\";\n\ntype ComposeStory = <TArgs extends object>(\n ...annotations: [\n story: StoryAnnotations<TArgs>,\n meta: ComponentMeta<TArgs>,\n preview: Preview,\n renderer: { render: StoryRender<TArgs> },\n exportName?: string,\n ]\n) => ComposedStory<TArgs>;\n\nconst composeStoryAnnotations = composeStory as ComposeStory;\n\nexport { composeStoryAnnotations };\n\nexport { isExportStory, storyNameFromExport } from \"storybook/internal/csf\";\n"]}
1
+ {"version":3,"file":"upstream.js","sourceRoot":"","sources":["../src/upstream.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAarD,MAAM,uBAAuB,GAAG,YAA4B,CAAC;AAE7D,OAAO,EAAE,uBAAuB,EAAE,CAAC;AAEnC,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC","sourcesContent":["import { composeStory } from \"storybook/preview-api\";\nimport type { ComponentMeta, ComposedStory, Preview, StoryAnnotations, StoryRender } from \"./types.js\";\n\ntype ComposeStory = <TArgs extends object>(\n ...annotations: [\n story: StoryAnnotations<TArgs>,\n meta: ComponentMeta<TArgs>,\n preview: Preview,\n renderer: { render: StoryRender<TArgs> },\n exportName?: string,\n ]\n) => ComposedStory<TArgs>;\n\nconst composeStoryAnnotations = composeStory as ComposeStory;\n\nexport { composeStoryAnnotations };\n\nexport { isExportStory, storyNameFromExport } from \"storybook/internal/csf\";\n"]}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@gtkx/storybook",
3
- "version": "2.0.0-beta.11",
4
- "description": "Explore GTKX components as native stories.",
3
+ "version": "2.0.0-beta.12",
4
+ "description": "Native component stories for GTKX.",
5
5
  "keywords": [
6
6
  "gtkx",
7
7
  "gtk",
@@ -10,7 +10,9 @@
10
10
  "react",
11
11
  "storybook",
12
12
  "csf",
13
- "linux"
13
+ "linux",
14
+ "gnome",
15
+ "desktop"
14
16
  ],
15
17
  "homepage": "https://gtkx.dev",
16
18
  "bugs": {
@@ -50,36 +52,27 @@
50
52
  "dist",
51
53
  "src"
52
54
  ],
53
- "nx": {
54
- "targets": {
55
- "lint": {
56
- "options": {
57
- "cwd": ".",
58
- "command": "eslint {projectRoot}"
59
- }
60
- }
61
- }
62
- },
63
55
  "engines": {
64
56
  "node": ">=26.7.0"
65
57
  },
66
58
  "dependencies": {
67
- "@gtkx/components": "2.0.0-beta.11",
68
- "@gtkx/react": "2.0.0-beta.11",
69
- "storybook": "10.6.0"
59
+ "@gtkx/components": "2.0.0-beta.12",
60
+ "@gtkx/react": "2.0.0-beta.12",
61
+ "@gtkx/utils": "2.0.0-beta.12",
62
+ "storybook": "10.6.2"
70
63
  },
71
64
  "peerDependencies": {
72
65
  "@types/react": "^19.3",
73
66
  "react": "^19.3"
74
67
  },
75
68
  "devDependencies": {
76
- "@gtkx/config": "2.0.0-beta.11",
77
- "@gtkx/testing": "2.0.0-beta.11",
78
- "@gtkx/vitest": "2.0.0-beta.11",
69
+ "@gtkx/config": "2.0.0-beta.12",
70
+ "@gtkx/testing": "2.0.0-beta.12",
71
+ "@gtkx/vitest": "2.0.0-beta.12",
79
72
  "@types/react": "^19.3.0",
80
- "vitest": "^5.0.1"
73
+ "vitest": "5.0.5"
81
74
  },
82
75
  "scripts": {
83
- "release": "tsx ../../scripts/release-package.ts"
76
+ "release": "node ../../scripts/release/publish-package.ts"
84
77
  }
85
78
  }
package/src/actions.ts CHANGED
@@ -1,3 +1,4 @@
1
+ import { normalizeError } from "@gtkx/utils";
1
2
  import { AsyncLocalStorage } from "node:async_hooks";
2
3
  import { inspect } from "node:util";
3
4
  import type { Args, ArgTypes } from "./types.js";
@@ -133,40 +134,39 @@ const settleCallback = async (
133
134
  }
134
135
  };
135
136
 
136
- const bindCallback = (
137
- store: ActionStore,
138
- options: CallbackOptions,
139
- ): EventCallback => (...values) => {
140
- const succeed = (): void => {
141
- store.record(options.name, values);
142
- };
143
- const fail = (cause: unknown): void => {
144
- const error = cause instanceof Error ? cause : new Error(String(cause));
145
- store.record(options.name, values, error);
137
+ const bindCallback =
138
+ (store: ActionStore, options: CallbackOptions): EventCallback =>
139
+ (...values) => {
140
+ const succeed = (): void => {
141
+ store.record(options.name, values);
142
+ };
143
+ const fail = (cause: unknown): void => {
144
+ const error = normalizeError(cause);
145
+ store.record(options.name, values, error);
146
146
 
147
- if (options.onError === undefined) {
148
- throw error;
149
- }
147
+ if (options.onError === undefined) {
148
+ throw error;
149
+ }
150
150
 
151
- options.onError(error);
152
- };
151
+ options.onError(error);
152
+ };
153
153
 
154
- try {
155
- const result = actionScope.run(store, () => options.callback?.(...values));
154
+ try {
155
+ const result = actionScope.run(store, () => options.callback?.(...values));
156
156
 
157
- if (result instanceof Promise) {
158
- return settleCallback(result, succeed, fail);
159
- }
157
+ if (result instanceof Promise) {
158
+ return settleCallback(result, succeed, fail);
159
+ }
160
160
 
161
- succeed();
161
+ succeed();
162
162
 
163
- return result;
164
- } catch (error) {
165
- fail(error);
163
+ return result;
164
+ } catch (error) {
165
+ fail(error);
166
166
 
167
- return;
168
- }
169
- };
167
+ return;
168
+ }
169
+ };
170
170
 
171
171
  const actionName = (value: unknown, configuredName: unknown): string | undefined => {
172
172
  if (typeof configuredName === "string") {
@@ -195,12 +195,7 @@ const callbackOptions = (
195
195
  };
196
196
  };
197
197
 
198
- const bindActions = (
199
- args: Args,
200
- argTypes: ArgTypes,
201
- store: ActionStore,
202
- onError?: (error: Error) => void,
203
- ): Args => {
198
+ const bindActions = (args: Args, argTypes: ArgTypes, store: ActionStore, onError?: (error: Error) => void): Args => {
204
199
  const bound = { ...args };
205
200
  const names = new Set([...Object.keys(args), ...Object.keys(argTypes)]);
206
201
 
package/src/catalog.ts CHANGED
@@ -1,3 +1,4 @@
1
+ import { normalizeError } from "@gtkx/utils";
1
2
  import type { Args, ArgTypes, ComponentMeta, ComposedStory, Preview, StoryAnnotations } from "./types.js";
2
3
  import { composeStories } from "./compose.js";
3
4
  import { storyNameFromExport } from "./upstream.js";
@@ -59,8 +60,6 @@ type LoadedSource = StoryLoadError | { source: StorySource; cached: CachedStorie
59
60
 
60
61
  const EMPTY_PREVIEW: Preview = {};
61
62
 
62
- const normalizeError = (cause: unknown): Error => cause instanceof Error ? cause : new Error(String(cause));
63
-
64
63
  const isObject = (value: unknown): value is Record<string, unknown> =>
65
64
  value !== null && typeof value === "object" && !Array.isArray(value);
66
65
 
@@ -73,8 +72,10 @@ const explicitControls = (
73
72
  const controls: ArgTypes = {};
74
73
 
75
74
  for (const [argument, annotation] of Object.entries(resolved)) {
76
- const control = story?.argTypes?.[argument]?.control ??
77
- meta.argTypes?.[argument]?.control ?? preview.argTypes?.[argument]?.control;
75
+ const control =
76
+ story?.argTypes?.[argument]?.control ??
77
+ meta.argTypes?.[argument]?.control ??
78
+ preview.argTypes?.[argument]?.control;
78
79
 
79
80
  if (control === undefined) {
80
81
  continue;
@@ -173,10 +174,13 @@ const loadSource = async (
173
174
  try {
174
175
  const module = await source.load();
175
176
  const previous = getCache().get(source.id);
176
- const cached = previous !== undefined && previous.module === module &&
177
- previous.title === source.title && previous.preview === preview
178
- ? previous
179
- : { module, title: source.title, preview, entries: composeSource(source, module, preview) };
177
+ const cached =
178
+ previous !== undefined &&
179
+ previous.module === module &&
180
+ previous.title === source.title &&
181
+ previous.preview === preview
182
+ ? previous
183
+ : { module, title: source.title, preview, entries: composeSource(source, module, preview) };
180
184
 
181
185
  return { source, cached };
182
186
  } catch (error) {
@@ -233,7 +237,10 @@ class StoryCatalog {
233
237
  this.publish({ stories, errors, isLoading: false });
234
238
 
235
239
  if (errors.length > 0) {
236
- const failure = new AggregateError(errors.map(({ error }) => error), "Some stories could not be loaded");
240
+ const failure = new AggregateError(
241
+ errors.map(({ error }) => error),
242
+ "Some stories could not be loaded",
243
+ );
237
244
  this.loadFailures.add(failure);
238
245
  throw failure;
239
246
  }
package/src/compose.ts CHANGED
@@ -38,15 +38,21 @@ const composeStory = <TArgs extends object>(
38
38
  throw new TypeError("A story needs a component or render function");
39
39
  }
40
40
 
41
- return composeStoryAnnotations(story, { ...meta }, preview, {
42
- render: (args) => {
43
- if (!meta.component) {
44
- throw new TypeError("A story needs a component or render function");
45
- }
41
+ return composeStoryAnnotations(
42
+ story,
43
+ { ...meta },
44
+ preview,
45
+ {
46
+ render: (args) => {
47
+ if (!meta.component) {
48
+ throw new TypeError("A story needs a component or render function");
49
+ }
46
50
 
47
- return createElement(meta.component, args);
51
+ return createElement(meta.component, args);
52
+ },
48
53
  },
49
- }, exportName);
54
+ exportName,
55
+ );
50
56
  };
51
57
 
52
58
  /**
package/src/controls.tsx CHANGED
@@ -27,7 +27,7 @@ const isObject = (value: unknown): value is Args =>
27
27
  const isWithinBoundsOrAbsent = (value: unknown, min: number, max: number): boolean =>
28
28
  value === undefined || (typeof value === "number" && Number.isFinite(value) && value >= min && value <= max);
29
29
 
30
- const controlTitle = (name: unknown, argument: string): string => typeof name === "string" ? name : argument;
30
+ const controlTitle = (name: unknown, argument: string): string => (typeof name === "string" ? name : argument);
31
31
 
32
32
  const numberDigits = (step: number): number => {
33
33
  const [coefficient = "", exponent = "0"] = String(step).split("e", 2);
@@ -54,9 +54,15 @@ const NumberControl = ({
54
54
  const step = settings.step ?? 1;
55
55
 
56
56
  if (
57
- typeof min !== "number" || typeof max !== "number" || typeof step !== "number" ||
58
- !Number.isFinite(min) || !Number.isFinite(max) || !Number.isFinite(step) ||
59
- step <= 0 || min > max || !isWithinBoundsOrAbsent(value, min, max)
57
+ typeof min !== "number" ||
58
+ typeof max !== "number" ||
59
+ typeof step !== "number" ||
60
+ !Number.isFinite(min) ||
61
+ !Number.isFinite(max) ||
62
+ !Number.isFinite(step) ||
63
+ step <= 0 ||
64
+ min > max ||
65
+ !isWithinBoundsOrAbsent(value, min, max)
60
66
  ) {
61
67
  return <UnsupportedControl title={title} description="Provide a finite number and valid bounds." />;
62
68
  }
@@ -72,7 +78,7 @@ const NumberControl = ({
72
78
  digits={numberDigits(step)}
73
79
  numeric
74
80
  widthChars={8}
75
- adjustment={(
81
+ adjustment={
76
82
  <GtkAdjustment
77
83
  lower={min}
78
84
  upper={max}
@@ -80,7 +86,7 @@ const NumberControl = ({
80
86
  pageIncrement={Math.min(Number.MAX_VALUE, step * 10)}
81
87
  value={currentValue}
82
88
  />
83
- )}
89
+ }
84
90
  onNotifyValue={(next) => {
85
91
  if (!Object.is(next, value)) {
86
92
  onChange({ [argument]: next });
@@ -92,19 +98,31 @@ const NumberControl = ({
92
98
 
93
99
  const SelectControl = (props: Omit<ControlProps, "type">): ReactNode => {
94
100
  const { argument, title, value, options, settings, isDisabled, onChange } = props;
95
- if (!Array.isArray(options) || options.length === 0 || options.some((option: unknown) =>
96
- option !== null && typeof option !== "string" && typeof option !== "number" && typeof option !== "boolean")) {
101
+ if (
102
+ !Array.isArray(options) ||
103
+ options.length === 0 ||
104
+ options.some(
105
+ (option: unknown) =>
106
+ option !== null &&
107
+ typeof option !== "string" &&
108
+ typeof option !== "number" &&
109
+ typeof option !== "boolean",
110
+ )
111
+ ) {
97
112
  return <UnsupportedControl title={title} description="Provide a list of text, number, or boolean options." />;
98
113
  }
99
114
 
100
115
  const values: unknown[] = options;
101
116
  const selected = values.findIndex((option) => Object.is(option, value));
102
117
  const labels = isObject(settings.labels) ? settings.labels : {};
103
- const items = [{ id: NO_SELECTION_ID, value: NO_SELECTION_LABEL }, ...values.map((option, index) => {
104
- const label = labels[String(option)];
105
-
106
- return { id: String(index), value: typeof label === "string" ? label : String(option) };
107
- })];
118
+ const items = [
119
+ { id: NO_SELECTION_ID, value: NO_SELECTION_LABEL },
120
+ ...values.map((option, index) => {
121
+ const label = labels[String(option)];
122
+
123
+ return { id: String(index), value: typeof label === "string" ? label : String(option) };
124
+ }),
125
+ ];
108
126
 
109
127
  return (
110
128
  <ComboRow
@@ -20,14 +20,7 @@ type GroupProps = Pick<NavigatorProps, "selectedId" | "onSelect"> & {
20
20
 
21
21
  const StoryGroup = ({ title, entries, selectedId, onSelect }: GroupProps): ReactNode => (
22
22
  <GtkBox orientation={Gtk.Orientation.VERTICAL} spacing={6}>
23
- <GtkLabel
24
- label={title}
25
- xalign={0}
26
- marginStart={18}
27
- marginEnd={18}
28
- cssClasses={["heading"]}
29
- wrap
30
- />
23
+ <GtkLabel label={title} xalign={0} marginStart={18} marginEnd={18} cssClasses={["heading"]} wrap />
31
24
  <GtkListBox
32
25
  cssClasses={["navigation-sidebar"]}
33
26
  selectedIndex={entries.findIndex((entry) => entry.id === selectedId)}
@@ -54,22 +47,23 @@ const StoryGroup = ({ title, entries, selectedId, onSelect }: GroupProps): React
54
47
  </GtkBox>
55
48
  );
56
49
 
57
- const LoadErrors = ({ errors }: Pick<NavigatorProps, "errors">): ReactNode => errors.length > 0 && (
58
- <GtkBox name="storybook-load-errors" orientation={Gtk.Orientation.VERTICAL} spacing={6}>
59
- {errors.map(({ source, error }, index) => (
60
- <GtkLabel
61
- key={`${source}-${String(index)}`}
62
- label={`${source}\n${error.message.slice(0, 500)}`}
63
- cssClasses={["error"]}
64
- marginStart={18}
65
- marginEnd={18}
66
- wrap
67
- selectable
68
- xalign={0}
69
- />
70
- ))}
71
- </GtkBox>
72
- );
50
+ const LoadErrors = ({ errors }: Pick<NavigatorProps, "errors">): ReactNode =>
51
+ errors.length > 0 && (
52
+ <GtkBox name="storybook-load-errors" orientation={Gtk.Orientation.VERTICAL} spacing={6}>
53
+ {errors.map(({ source, error }, index) => (
54
+ <GtkLabel
55
+ key={`${source}-${String(index)}`}
56
+ label={`${source}\n${error.message.slice(0, 500)}`}
57
+ cssClasses={["error"]}
58
+ marginStart={18}
59
+ marginEnd={18}
60
+ wrap
61
+ selectable
62
+ xalign={0}
63
+ />
64
+ ))}
65
+ </GtkBox>
66
+ );
73
67
 
74
68
  const StoryNavigator = ({ stories, errors, selectedId, onSelect }: NavigatorProps): ReactNode => {
75
69
  const [search, setSearch] = useState("");