storybook-solidjs-vite 10.0.13 → 10.1.1

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.
Files changed (135) hide show
  1. package/README.md +76 -4
  2. package/dist/chunk-2DIRFC5W.js +134 -0
  3. package/dist/chunk-2DIRFC5W.js.map +1 -0
  4. package/dist/chunk-7HMQHLZ6.js +90 -0
  5. package/dist/chunk-7HMQHLZ6.js.map +1 -0
  6. package/dist/chunk-FRAIA7MB.js +34 -0
  7. package/dist/chunk-FRAIA7MB.js.map +1 -0
  8. package/dist/chunk-NNSMHFZY.js +42 -0
  9. package/dist/chunk-NNSMHFZY.js.map +1 -0
  10. package/dist/chunk-P43SJLUM.js +87 -0
  11. package/dist/chunk-P43SJLUM.js.map +1 -0
  12. package/dist/{chunk-DY54VIKM.js → chunk-R46BQ22I.js} +43 -44
  13. package/dist/chunk-R46BQ22I.js.map +1 -0
  14. package/dist/chunk-T3EBLI6L.js +8 -0
  15. package/dist/chunk-T3EBLI6L.js.map +1 -0
  16. package/dist/{chunk-745IQ3F5.js → chunk-W3QB2KPF.js} +6 -8
  17. package/dist/chunk-W3QB2KPF.js.map +1 -0
  18. package/dist/{renderer/entry-preview-argtypes.d.ts → entry-preview/argtypes.d.ts} +1 -2
  19. package/dist/entry-preview/argtypes.js +4 -0
  20. package/dist/entry-preview/argtypes.js.map +1 -0
  21. package/dist/{renderer/entry-preview-docs.d.ts → entry-preview/docs.d.ts} +1 -4
  22. package/dist/entry-preview/docs.js +4 -0
  23. package/dist/entry-preview/docs.js.map +1 -0
  24. package/dist/entry-preview/solid-1.d.ts +16 -0
  25. package/dist/entry-preview/solid-1.js +5 -0
  26. package/dist/entry-preview/solid-1.js.map +1 -0
  27. package/dist/entry-preview/solid-2.d.ts +16 -0
  28. package/dist/entry-preview/solid-2.js +5 -0
  29. package/dist/entry-preview/solid-2.js.map +1 -0
  30. package/dist/{node/index.d.ts → framework/node.d.ts} +1 -1
  31. package/dist/framework/node.js +4 -0
  32. package/dist/framework/node.js.map +1 -0
  33. package/dist/{preset.d.ts → framework/preset.d.ts} +1 -1
  34. package/dist/{preset.js → framework/preset.js} +9 -4
  35. package/dist/framework/preset.js.map +1 -0
  36. package/dist/index.d.ts +54 -9
  37. package/dist/index.js +21 -7
  38. package/dist/index.js.map +1 -1
  39. package/dist/next.d.ts +57 -0
  40. package/dist/next.js +24 -0
  41. package/dist/next.js.map +1 -0
  42. package/dist/preview-annotations-D06K0F7B.d.ts +13 -0
  43. package/dist/public-types-Cr0kLSZG.d.ts +83 -0
  44. package/dist/public-types-Dgk4zHE_.d.ts +33 -0
  45. package/dist/public-types-DsEAs0AM.d.ts +33 -0
  46. package/dist/renderer/playwright.d.ts +1 -0
  47. package/dist/renderer/playwright.js +4 -0
  48. package/dist/renderer/playwright.js.map +1 -0
  49. package/dist/renderer.js +24 -0
  50. package/dist/renderer.js.map +1 -0
  51. package/dist/{applyDecorators-bBQQC6C7.d.ts → set-optional.d-CLuS_wjB.d.ts} +10 -151
  52. package/dist/{types-CGyZsZD6.d.ts → types-CixQ_ttK.d.ts} +11 -8
  53. package/package.json +70 -33
  54. package/src/framework/node.ts +5 -0
  55. package/src/framework/preset.ts +86 -0
  56. package/src/framework/solidVersion.ts +61 -0
  57. package/src/framework/types.ts +47 -0
  58. package/src/index.ts +4 -0
  59. package/src/next.ts +15 -0
  60. package/src/renderer/docs/entry-preview-argtypes.ts +15 -0
  61. package/src/renderer/docs/entry-preview.ts +22 -0
  62. package/src/renderer/docs/extractArgTypes.ts +86 -0
  63. package/src/renderer/docs/lib/captions.ts +6 -0
  64. package/src/renderer/docs/lib/defaultValues/createDefaultValue.ts +87 -0
  65. package/src/renderer/docs/lib/defaultValues/createFromRawDefaultProp.ts +183 -0
  66. package/src/renderer/docs/lib/defaultValues/generateArray.ts +24 -0
  67. package/src/renderer/docs/lib/defaultValues/generateObject.ts +24 -0
  68. package/src/renderer/docs/lib/defaultValues/index.ts +2 -0
  69. package/src/renderer/docs/lib/defaultValues/prettyIdentifier.ts +28 -0
  70. package/src/renderer/docs/lib/generateCode.ts +70 -0
  71. package/src/renderer/docs/lib/inspection/acornParser.test.ts +257 -0
  72. package/src/renderer/docs/lib/inspection/acornParser.ts +241 -0
  73. package/src/renderer/docs/lib/inspection/index.ts +2 -0
  74. package/src/renderer/docs/lib/inspection/inspectValue.ts +17 -0
  75. package/src/renderer/docs/lib/inspection/types.ts +65 -0
  76. package/src/renderer/docs/lib/isHtmlTag.ts +5 -0
  77. package/src/renderer/docs/propTypes/createType.ts +433 -0
  78. package/src/renderer/docs/propTypes/generateFuncSignature.ts +70 -0
  79. package/src/renderer/docs/propTypes/handleProp.ts +51 -0
  80. package/src/renderer/docs/propTypes/rawDefaultPropResolvers.ts +36 -0
  81. package/src/renderer/docs/propTypes/sortProps.ts +18 -0
  82. package/src/renderer/docs/typeScript/handleProp.ts +31 -0
  83. package/src/renderer/index.ts +46 -0
  84. package/src/renderer/playwright.ts +1 -0
  85. package/src/renderer/shared/apply-decorators.ts +55 -0
  86. package/src/renderer/shared/create-define-preview.ts +46 -0
  87. package/src/renderer/shared/preview-annotations.ts +54 -0
  88. package/src/renderer/shared/public-types.ts +43 -0
  89. package/src/renderer/shared/story-store.ts +103 -0
  90. package/src/renderer/v1/define-preview.ts +100 -0
  91. package/src/renderer/v1/entry-preview.ts +115 -0
  92. package/src/renderer/v1/index.ts +5 -0
  93. package/src/renderer/v1/public-api.ts +29 -0
  94. package/src/renderer/v1/public-types.ts +76 -0
  95. package/src/renderer/v2/define-preview.ts +100 -0
  96. package/src/renderer/v2/entry-preview.ts +118 -0
  97. package/src/renderer/v2/index.ts +5 -0
  98. package/src/renderer/v2/public-api.ts +29 -0
  99. package/src/renderer/v2/public-types.ts +76 -0
  100. package/dist/chunk-3NQOL5RP.js +0 -168
  101. package/dist/chunk-3NQOL5RP.js.map +0 -1
  102. package/dist/chunk-64ZBL7FG.js +0 -32
  103. package/dist/chunk-64ZBL7FG.js.map +0 -1
  104. package/dist/chunk-745IQ3F5.js.map +0 -1
  105. package/dist/chunk-DY54VIKM.js.map +0 -1
  106. package/dist/chunk-TRRHAJUQ.js +0 -52
  107. package/dist/chunk-TRRHAJUQ.js.map +0 -1
  108. package/dist/chunk-Z2N7T5KU.js +0 -18
  109. package/dist/chunk-Z2N7T5KU.js.map +0 -1
  110. package/dist/chunk-ZOEBJPOX.js +0 -8
  111. package/dist/chunk-ZOEBJPOX.js.map +0 -1
  112. package/dist/entry-preview-DMjIkfe9.d.ts +0 -56
  113. package/dist/node/index.js +0 -4
  114. package/dist/node/index.js.map +0 -1
  115. package/dist/preset.js.map +0 -1
  116. package/dist/renderer/entry-preview-argtypes.js +0 -4
  117. package/dist/renderer/entry-preview-argtypes.js.map +0 -1
  118. package/dist/renderer/entry-preview-docs.js +0 -5
  119. package/dist/renderer/entry-preview-docs.js.map +0 -1
  120. package/dist/renderer/entry-preview.d.ts +0 -6
  121. package/dist/renderer/entry-preview.js +0 -5
  122. package/dist/renderer/entry-preview.js.map +0 -1
  123. package/dist/renderer/index.d.ts +0 -31
  124. package/dist/renderer/index.js +0 -9
  125. package/dist/renderer/index.js.map +0 -1
  126. package/dist/renderer/preset.js +0 -20
  127. package/dist/renderer/preset.js.map +0 -1
  128. package/dist/renderer/preview.d.ts +0 -39
  129. package/dist/renderer/preview.js +0 -8
  130. package/dist/renderer/preview.js.map +0 -1
  131. package/dist/types-vFmObJUf.d.ts +0 -11
  132. package/preset.js +0 -1
  133. package/preview.js +0 -1
  134. /package/dist/{renderer/preset.d.ts → renderer.d.ts} +0 -0
  135. /package/src/{renderer/typings.d.ts → typings.d.ts} +0 -0
package/README.md CHANGED
@@ -15,10 +15,11 @@ Adds SolidJS support to Storybook.
15
15
 
16
16
  ## ✨ Features
17
17
 
18
- - SolidJS support out of the box
18
+ - Solid 1 and Solid 2 support
19
19
  - Vite-powered builder
20
20
  - TypeScript-first setup
21
21
  - ArgTypes generation from TypeScript
22
+ - [CSF Next](https://storybook.js.org/docs/api/csf/csf-next) factory API (optional)
22
23
  - Compatible with Storybook addons
23
24
  - Integrated testing (Vitest, Playwright)
24
25
 
@@ -45,6 +46,77 @@ You can customize Vite and Storybook as usual.
45
46
  - Add stories in `src/**/*.stories.tsx` or `src/**/*.stories.js`
46
47
  - Use Storybook addons for additional functionality
47
48
 
49
+ ### Solid 1
50
+
51
+ On Solid 1, import from `storybook-solidjs-vite` in config, preview, and stories:
52
+
53
+ ```ts
54
+ // .storybook/main.ts
55
+ import type { StorybookConfig } from 'storybook-solidjs-vite';
56
+
57
+ const config: StorybookConfig = {
58
+ framework: 'storybook-solidjs-vite',
59
+ };
60
+
61
+ export default config;
62
+ ```
63
+
64
+ ```ts
65
+ // .storybook/preview.tsx & stories
66
+ import type { Preview, Meta, StoryObj } from 'storybook-solidjs-vite';
67
+ ```
68
+
69
+ ### Solid 2
70
+
71
+ On Solid 2, use `storybook-solidjs-vite/next` in preview and stories — the types there match the Solid 2 renderer:
72
+
73
+ ```ts
74
+ import type { Preview, Meta, StoryObj } from 'storybook-solidjs-vite/next';
75
+ ```
76
+
77
+ Imports without `/next` often still run, but TypeScript may complain because those types describe the Solid 1 renderer.
78
+
79
+ In `main.ts` either framework name is fine: `storybook-solidjs-vite` reads the major version from your installed `solid-js`, and `storybook-solidjs-vite/next` forces Solid 2.
80
+
81
+ ```ts
82
+ framework: 'storybook-solidjs-vite'
83
+ framework: 'storybook-solidjs-vite/next'
84
+ ```
85
+
86
+ ### CSF Next
87
+
88
+ [CSF Next](https://storybook.js.org/docs/api/csf/csf-next) works on Solid 1 and Solid 2.
89
+
90
+ ```ts
91
+ // .storybook/main.ts
92
+ import { defineMain } from 'storybook-solidjs-vite/node';
93
+
94
+ export default defineMain({
95
+ framework: { name: 'storybook-solidjs-vite' },
96
+ });
97
+ ```
98
+
99
+ ```ts
100
+ // .storybook/preview.tsx
101
+ import { definePreview } from 'storybook-solidjs-vite';
102
+ // for Solid 2, use:
103
+ // import { definePreview } from 'storybook-solidjs-vite/next';
104
+ ```
105
+
106
+ ```ts
107
+ // src/Button.stories.ts
108
+ import preview from '../.storybook/preview';
109
+ import { Button } from './Button';
110
+
111
+ const meta = preview.meta({
112
+ component: Button,
113
+ });
114
+
115
+ export const Primary = meta.story({
116
+ args: { label: 'Button' },
117
+ });
118
+ ```
119
+
48
120
  ### TypeScript docgen
49
121
 
50
122
  TypeScript props for docs and controls are generated with [@joshwooding/vite-plugin-react-docgen-typescript](https://github.com/joshwooding/vite-plugin-react-docgen-typescript).
@@ -77,13 +149,13 @@ export default config;
77
149
 
78
150
  ## 🎨 Decorators
79
151
 
80
- Storybook re-executes decorator and story code on updates (e.g. args, globals). SolidJS uses fine-grained reactivity and does not require re-running component functions.
152
+ On args or globals changes, Storybook re-runs decorators and stories the same model as React, where each update calls your functions again. Solid updates through fine-grained signals and usually does not need that.
81
153
 
82
- This mismatch can cause duplicate DOM elements when decorators return JSX.
154
+ If a decorator returns JSX, the extra runs can leave duplicate nodes in the DOM.
83
155
 
84
156
  ### createJSXDecorator
85
157
 
86
- Use for decorators that return JSX. Ensures they run only once.
158
+ Use for decorators that return JSX. Ensures they run only once per story mount.
87
159
 
88
160
  ```tsx
89
161
  import { createJSXDecorator } from 'storybook-solidjs-vite';
@@ -0,0 +1,134 @@
1
+ import { defaultDecorateStory } from 'storybook/preview-api';
2
+ import { global } from '@storybook/global';
3
+ import { createComponent } from 'solid-js';
4
+ import { configure } from 'storybook/test';
5
+
6
+ // src/renderer/shared/public-types.ts
7
+ var IS_SOLID_JSX_FLAG = "__isJSX";
8
+
9
+ // src/renderer/shared/story-store.ts
10
+ var getStoryId = (context) => {
11
+ const canvasId = context.canvasElement?.id;
12
+ if (!canvasId || canvasId === "storybook-root") {
13
+ return context.id;
14
+ }
15
+ return canvasId;
16
+ };
17
+ function createStoryState(createStore) {
18
+ const [globals, setGlobals] = createStore({});
19
+ const renderedStories = /* @__PURE__ */ new Set();
20
+ const argsStores = /* @__PURE__ */ new Map();
21
+ const disposers = /* @__PURE__ */ new Map();
22
+ const getArgsStore = (storyId) => {
23
+ let store = argsStores.get(storyId);
24
+ if (!store) {
25
+ store = createStore({});
26
+ argsStores.set(storyId, store);
27
+ }
28
+ return store;
29
+ };
30
+ return {
31
+ isStoryRendered(storyId) {
32
+ return renderedStories.has(storyId);
33
+ },
34
+ resetStory(storyId) {
35
+ renderedStories.delete(storyId);
36
+ disposers.delete(storyId);
37
+ argsStores.delete(storyId);
38
+ },
39
+ setRendered(storyId, isRendered) {
40
+ if (isRendered) {
41
+ renderedStories.add(storyId);
42
+ } else {
43
+ renderedStories.delete(storyId);
44
+ }
45
+ },
46
+ setDisposeFn(storyId, disposeFn) {
47
+ if (disposeFn) {
48
+ disposers.set(storyId, disposeFn);
49
+ } else {
50
+ disposers.delete(storyId);
51
+ }
52
+ },
53
+ makeContextReactive(context) {
54
+ const storyId = getStoryId(context);
55
+ if (!storyId) {
56
+ throw new Error("Story ID is required");
57
+ }
58
+ const [args, setArgs] = getArgsStore(storyId);
59
+ setArgs(() => context.args);
60
+ setGlobals(() => context.globals);
61
+ context.args = args;
62
+ context.globals = globals;
63
+ },
64
+ disposeStory(storyId) {
65
+ disposers.get(storyId)?.();
66
+ disposers.delete(storyId);
67
+ }
68
+ };
69
+ }
70
+ function createApplyDecorators(store, createComponent2) {
71
+ return (storyFn, rawDecorators) => {
72
+ const decorators = rawDecorators.map(
73
+ (decorator) => {
74
+ const originalFn = decorator.originalFn;
75
+ const isJSX = Boolean(
76
+ decorator[IS_SOLID_JSX_FLAG] || originalFn?.[IS_SOLID_JSX_FLAG]
77
+ );
78
+ return (StoryFn, context) => {
79
+ if (isJSX) {
80
+ const storyId = getStoryId(context);
81
+ if (storyId && store.isStoryRendered(storyId)) {
82
+ return StoryFn(context);
83
+ }
84
+ }
85
+ return decorator(StoryFn, context);
86
+ };
87
+ }
88
+ );
89
+ return defaultDecorateStory((context) => {
90
+ const storyId = getStoryId(context);
91
+ if (storyId && store.isStoryRendered(storyId)) {
92
+ return null;
93
+ }
94
+ return createComponent2(storyFn, context);
95
+ }, decorators);
96
+ };
97
+ }
98
+ if (global.window) {
99
+ global.window.STORYBOOK_ENV = "solid";
100
+ }
101
+ var parameters = {
102
+ renderer: "solid"
103
+ };
104
+ var render = (_, context) => {
105
+ if (!context.component) {
106
+ throw new Error(
107
+ `Unable to render story ${context.id} as the component annotation is missing from the default export`
108
+ );
109
+ }
110
+ return createComponent(context.component, context.args);
111
+ };
112
+ var beforeAll = async () => {
113
+ try {
114
+ configure({
115
+ unstable_advanceTimersWrapper: (cb) => cb(),
116
+ asyncWrapper: async (cb) => {
117
+ const result = await cb();
118
+ await new Promise((resolve) => {
119
+ setTimeout(() => resolve(), 0);
120
+ if (typeof jest !== "undefined" && jest != null && (setTimeout._isMockFunction === true || Object.prototype.hasOwnProperty.call(setTimeout, "clock"))) {
121
+ jest.advanceTimersByTime(0);
122
+ }
123
+ });
124
+ return result;
125
+ },
126
+ eventWrapper: (cb) => cb()
127
+ });
128
+ } catch {
129
+ }
130
+ };
131
+
132
+ export { IS_SOLID_JSX_FLAG, beforeAll, createApplyDecorators, createStoryState, getStoryId, parameters, render };
133
+ //# sourceMappingURL=chunk-2DIRFC5W.js.map
134
+ //# sourceMappingURL=chunk-2DIRFC5W.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/renderer/shared/public-types.ts","../src/renderer/shared/story-store.ts","../src/renderer/shared/apply-decorators.ts","../src/renderer/shared/preview-annotations.ts"],"names":["createComponent"],"mappings":"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","file":"chunk-2DIRFC5W.js","sourcesContent":["import type {\n Canvas,\n DecoratorFunction,\n RenderContext as GenericRenderContext,\n StoryContext as GenericStoryContext,\n StrictArgs,\n WebRenderer,\n} from 'storybook/internal/types';\nimport type { Simplify } from 'type-fest';\n\nexport type { Args, ArgTypes, Parameters, StrictArgs } from 'storybook/internal/types';\n\n/**\n * Marks decorators that return JSX so they are not re-run on every Storybook update.\n * Prefer `createJSXDecorator` over setting this flag manually.\n */\nexport const IS_SOLID_JSX_FLAG = '__isJSX';\n\n// This performs a downcast to function types that are mocks, when a mock fn is given to meta args.\nexport type AddMocks<TArgs, DefaultArgs> = Simplify<{\n [T in keyof TArgs]: T extends keyof DefaultArgs\n ? DefaultArgs[T] extends (...args: any) => any & { mock: object }\n ? DefaultArgs[T]\n : TArgs[T]\n : TArgs[T];\n}>;\n\n/** Loose renderer shape for shared runtime code (v1 entry-preview and v2 entry-preview). */\nexport interface SolidRenderer extends WebRenderer {\n component: (props: Record<string, any>) => any;\n storyResult: any;\n mount: (ui?: any) => Promise<Canvas>;\n}\n\nexport type Decorator<TArgs = StrictArgs> = DecoratorFunction<SolidRenderer, TArgs> & {\n [IS_SOLID_JSX_FLAG]?: boolean;\n};\n\nexport type StoryContext<TArgs = StrictArgs> = GenericStoryContext<SolidRenderer, TArgs> & {\n renderToCanvas: () => Promise<void>;\n};\n\nexport type RenderContext = GenericRenderContext<SolidRenderer>;\n","import type { Args, Globals, StoryContext as InternalStoryContext } from 'storybook/internal/types';\nimport type { SolidRenderer } from './public-types';\n\n/** Update store via `(prev) => next` (version layer applies reconcile/draft setter). */\ntype SetStoreFn<T extends object> = (update: (prev: T) => T) => void;\n\n/** Reactive store tuple returned by `createStore` (state + setter). */\ntype SolidStore<T extends object> = readonly [\n state: T,\n setState: SetStoreFn<T>\n];\n\ntype CreateStoreFn = <T extends object>(initial: T) => SolidStore<T>;\n\nexport interface StoryStateStore {\n isStoryRendered: (storyId: string) => boolean;\n resetStory: (storyId: string) => void;\n setRendered: (storyId: string, rendered: boolean) => void;\n setDisposeFn: (storyId: string, disposeFn: (() => void) | null) => void;\n makeContextReactive: (context: InternalStoryContext<SolidRenderer, Args>) => void;\n disposeStory: (storyId: string) => void;\n}\n\nexport const getStoryId = (context: { id?: string; canvasElement?: { id?: string } }): string | undefined => {\n const canvasId = context.canvasElement?.id;\n\n if (!canvasId || canvasId === 'storybook-root') {\n return context.id;\n }\n\n return canvasId;\n};\n\nexport function createStoryState(createStore: CreateStoreFn): StoryStateStore {\n const [globals, setGlobals] = createStore<Globals>({});\n const renderedStories = new Set<string>();\n const argsStores = new Map<string, SolidStore<Args>>();\n const disposers = new Map<string, () => void>();\n\n const getArgsStore = (storyId: string): SolidStore<Args> => {\n let store = argsStores.get(storyId);\n\n if (!store) {\n store = createStore({} as Args);\n argsStores.set(storyId, store);\n }\n\n return store;\n };\n\n return {\n isStoryRendered(storyId) {\n return renderedStories.has(storyId);\n },\n\n resetStory(storyId) {\n renderedStories.delete(storyId);\n disposers.delete(storyId);\n argsStores.delete(storyId);\n },\n\n setRendered(storyId, isRendered) {\n if (isRendered) {\n renderedStories.add(storyId);\n }\n else {\n renderedStories.delete(storyId);\n }\n },\n\n setDisposeFn(storyId, disposeFn) {\n if (disposeFn) {\n disposers.set(storyId, disposeFn);\n }\n else {\n disposers.delete(storyId);\n }\n },\n\n makeContextReactive(context) {\n const storyId = getStoryId(context);\n\n if (!storyId) {\n throw new Error('Story ID is required');\n }\n\n const [args, setArgs] = getArgsStore(storyId);\n\n // Update reactive stores with the new values\n setArgs(() => context.args);\n setGlobals(() => context.globals);\n\n // Sync the reactive stores to the context\n context.args = args;\n context.globals = globals;\n },\n\n disposeStory(storyId) {\n disposers.get(storyId)?.();\n disposers.delete(storyId);\n },\n };\n}\n","import { defaultDecorateStory } from 'storybook/preview-api';\n\nimport { IS_SOLID_JSX_FLAG } from './public-types';\nimport { getStoryId } from './story-store';\n\nimport type { Args, StoryContext as InternalStoryContext, LegacyStoryFn } from 'storybook/internal/types';\nimport type {\n Decorator,\n SolidRenderer,\n} from './public-types';\nimport type { StoryStateStore } from './story-store';\n\nexport function createApplyDecorators(\n store: StoryStateStore,\n createComponent: (\n storyFn: LegacyStoryFn<SolidRenderer>,\n context: InternalStoryContext<SolidRenderer, Args>\n ) => SolidRenderer['storyResult']\n): (\n storyFn: LegacyStoryFn<SolidRenderer>,\n rawDecorators: Decorator[]\n) => LegacyStoryFn<SolidRenderer> {\n return (storyFn, rawDecorators) => {\n const decorators = rawDecorators.map(\n (decorator): Decorator => {\n const originalFn = (decorator as Decorator & { originalFn?: Decorator }).originalFn;\n const isJSX = Boolean(\n decorator[IS_SOLID_JSX_FLAG] || originalFn?.[IS_SOLID_JSX_FLAG]\n );\n\n return (StoryFn, context) => {\n if (isJSX) {\n const storyId = getStoryId(context);\n\n if (storyId && store.isStoryRendered(storyId)) {\n return StoryFn(context);\n }\n }\n\n return decorator(StoryFn, context);\n };\n }\n );\n\n return defaultDecorateStory((context) => {\n const storyId = getStoryId(context);\n\n if (storyId && store.isStoryRendered(storyId)) {\n return null;\n }\n\n return createComponent(storyFn, context);\n }, decorators);\n };\n}\n","import { global } from '@storybook/global';\nimport { createComponent } from 'solid-js';\nimport { configure } from 'storybook/test';\n\nimport type { ArgsStoryFn } from 'storybook/internal/types';\nimport type { SolidRenderer } from './public-types';\n\nif (global.window) {\n global.window.STORYBOOK_ENV = 'solid';\n}\n\n/** Preview-wide parameters for the Solid renderer. */\nexport const parameters = {\n renderer: 'solid',\n};\n\n/** Default render for meta/stories with `component` + `args` and no custom `render` (CSF 3+). */\nexport const render: ArgsStoryFn<SolidRenderer> = (_, context) => {\n if (!context.component) {\n throw new Error(\n `Unable to render story ${ context.id } as the component annotation is missing from the default export`\n );\n }\n\n return createComponent(context.component, context.args);\n};\n\n/** Configures `storybook/test` wrappers so Solid updates flush after async play steps. */\nexport const beforeAll = async() => {\n try {\n configure({\n unstable_advanceTimersWrapper: (cb: () => any) => cb(),\n asyncWrapper: async(cb: () => any) => {\n const result = await cb();\n\n await new Promise<void>((resolve) => {\n setTimeout(() => resolve(), 0);\n\n // @ts-expect-error global jest\n if (typeof jest !== 'undefined' && jest != null && ((setTimeout as any)._isMockFunction === true || Object.prototype.hasOwnProperty.call(setTimeout, 'clock'))) {\n // @ts-expect-error global jest\n jest!.advanceTimersByTime(0);\n }\n });\n\n return result;\n },\n eventWrapper: (cb: () => any) => cb(),\n });\n }\n catch {\n // storybook/test might not be available; noop\n }\n};\n"]}
@@ -0,0 +1,90 @@
1
+ import { render, parameters, beforeAll, createApplyDecorators, createStoryState, getStoryId } from './chunk-2DIRFC5W.js';
2
+ import { __export } from './chunk-G3PMV62Z.js';
3
+ import { render as render$1 } from '@solidjs/web';
4
+ import { createComponent, onSettled, Errored, createStore as createStore$1 } from 'solid-js';
5
+
6
+ // src/renderer/v2/entry-preview.ts
7
+ var entry_preview_exports = {};
8
+ __export(entry_preview_exports, {
9
+ applyDecorators: () => applyDecorators,
10
+ beforeAll: () => beforeAll,
11
+ mount: () => mount,
12
+ parameters: () => parameters,
13
+ render: () => render,
14
+ renderToCanvas: () => renderToCanvas
15
+ });
16
+ var createStore = (initial) => {
17
+ const [state, setStore] = createStore$1(initial);
18
+ const setState = (update) => {
19
+ setStore(() => update(state));
20
+ };
21
+ return [state, setState];
22
+ };
23
+ var storyStore = createStoryState(createStore);
24
+ var applyDecorators = createApplyDecorators(
25
+ storyStore,
26
+ createComponent
27
+ );
28
+ var renderToCanvas = async (renderContext, canvasElement) => {
29
+ const storyId = getStoryId({ ...renderContext, canvasElement });
30
+ if (!storyId) {
31
+ throw new Error("Story ID is required");
32
+ }
33
+ const { storyContext, storyFn: StoryFn, showMain, showException } = renderContext;
34
+ const Story = StoryFn;
35
+ if (!storyStore.isStoryRendered(storyId)) {
36
+ const App = (() => {
37
+ onSettled(() => {
38
+ showMain();
39
+ storyStore.setRendered(storyId, true);
40
+ return () => {
41
+ storyStore.setRendered(storyId, false);
42
+ };
43
+ });
44
+ if (storyContext?.parameters?.["__isPortableStory"]) {
45
+ return createComponent(Story, {});
46
+ }
47
+ return createComponent(Errored, {
48
+ fallback: (err, _reset) => {
49
+ const error = err();
50
+ showException(error);
51
+ return error;
52
+ },
53
+ children: createComponent(Story, {})
54
+ });
55
+ });
56
+ const disposeFn = render$1(() => createComponent(App, {}), canvasElement);
57
+ storyStore.setDisposeFn(storyId, disposeFn);
58
+ } else {
59
+ StoryFn();
60
+ }
61
+ return () => {
62
+ storyStore.disposeStory(storyId);
63
+ storyStore.resetStory(storyId);
64
+ };
65
+ };
66
+ var mount = (context) => {
67
+ const storyId = getStoryId(context);
68
+ const { forceRemount } = context;
69
+ if (!storyId) {
70
+ throw new Error("Story ID is required");
71
+ }
72
+ return async (ui) => {
73
+ if (ui != null) {
74
+ context.originalStoryFn = () => ui;
75
+ }
76
+ if (forceRemount) {
77
+ storyStore.disposeStory(storyId);
78
+ }
79
+ if (!storyStore.isStoryRendered(storyId) || forceRemount) {
80
+ storyStore.resetStory(storyId);
81
+ }
82
+ storyStore.makeContextReactive(context);
83
+ await context.renderToCanvas();
84
+ return context.canvas;
85
+ };
86
+ };
87
+
88
+ export { applyDecorators, entry_preview_exports, mount, renderToCanvas };
89
+ //# sourceMappingURL=chunk-7HMQHLZ6.js.map
90
+ //# sourceMappingURL=chunk-7HMQHLZ6.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/renderer/v2/entry-preview.ts"],"names":["solidCreateStore","solidRender"],"mappings":"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","file":"chunk-7HMQHLZ6.js","sourcesContent":["import { render as solidRender } from '@solidjs/web';\nimport {\n createComponent,\n Errored,\n onSettled,\n createStore as solidCreateStore,\n} from 'solid-js-v2';\n\nimport { createApplyDecorators } from '../shared/apply-decorators.ts';\nimport { createStoryState, getStoryId } from '../shared/story-store';\n\nimport type { Args } from 'storybook/internal/types';\nimport type { RenderContext, SolidComponent, SolidRenderer, StoryContext, StoryFnReturnType } from './public-types';\n\nexport * from '../shared/preview-annotations';\n\nconst createStore = <T extends object>(initial: T) => {\n const [state, setStore] = solidCreateStore(initial as any);\n\n const setState = (update: (prev: T) => T) => {\n setStore(() => update(state as unknown as T));\n };\n\n return [state as T, setState] as const;\n};\n\nconst storyStore = createStoryState(createStore);\n\n/** Wraps the story fn with decorators, JSX decorators skip re-render when the story is already mounted. */\nexport const applyDecorators = createApplyDecorators(\n storyStore,\n createComponent as Parameters<typeof createApplyDecorators>[1]\n);\n\n/** Mounts or updates the story in the preview canvas. Returns cleanup when the story changes. */\nexport const renderToCanvas = async(\n renderContext: RenderContext,\n canvasElement: SolidRenderer['canvasElement']\n) => {\n const storyId = getStoryId({ ...renderContext, canvasElement });\n\n if (!storyId) {\n throw new Error('Story ID is required');\n }\n\n const { storyContext, storyFn: StoryFn, showMain, showException } = renderContext;\n const Story = StoryFn as SolidComponent;\n\n if (!storyStore.isStoryRendered(storyId)) {\n const App = (() => {\n onSettled(() => {\n showMain();\n storyStore.setRendered(storyId, true);\n\n return () => {\n storyStore.setRendered(storyId, false);\n };\n });\n\n if (storyContext?.parameters?.['__isPortableStory']) {\n return createComponent(Story, {});\n }\n\n return createComponent(Errored, {\n fallback: (err: () => unknown, _reset: () => void) => {\n const error = err() as Error;\n\n showException(error);\n\n return error as any;\n },\n children: createComponent(Story, {}),\n });\n }) as SolidComponent;\n\n const disposeFn = solidRender(() => createComponent(App, {}), canvasElement);\n\n storyStore.setDisposeFn(storyId, disposeFn);\n }\n else {\n StoryFn();\n }\n\n return () => {\n storyStore.disposeStory(storyId);\n storyStore.resetStory(storyId);\n };\n};\n\n/** Play/mount API: sync reactive args and globals, then render via `renderToCanvas`. */\nexport const mount = (context: StoryContext<Args>) => {\n const storyId = getStoryId(context);\n const { forceRemount } = context;\n\n if (!storyId) {\n throw new Error('Story ID is required');\n }\n\n return async(ui: StoryFnReturnType) => {\n if (ui != null) {\n context.originalStoryFn = () => ui;\n }\n\n if (forceRemount) {\n storyStore.disposeStory(storyId);\n }\n\n if (!storyStore.isStoryRendered(storyId) || forceRemount) {\n storyStore.resetStory(storyId);\n }\n\n storyStore.makeContextReactive(context);\n\n await context.renderToCanvas();\n\n return context.canvas;\n };\n};\n"]}
@@ -0,0 +1,34 @@
1
+ import { entry_preview_argtypes_exports } from './chunk-R46BQ22I.js';
2
+ import { entry_preview_exports } from './chunk-W3QB2KPF.js';
3
+ import { definePreview } from 'storybook/internal/csf';
4
+
5
+ function createDefinePreview(solidAnnotations) {
6
+ return function definePreview$1(input) {
7
+ const { addons, ...projectAnnotations } = input;
8
+ const preview = definePreview({
9
+ ...projectAnnotations,
10
+ addons: [
11
+ solidAnnotations,
12
+ entry_preview_argtypes_exports,
13
+ entry_preview_exports,
14
+ ...addons ?? []
15
+ ]
16
+ });
17
+ const defineMeta = preview.meta.bind(preview);
18
+ preview.meta = (_input) => {
19
+ const meta = defineMeta(_input);
20
+ const defineStory = meta.story.bind(meta);
21
+ meta.story = (__input) => {
22
+ const story = defineStory(__input);
23
+ story.Component = story.__compose();
24
+ return story;
25
+ };
26
+ return meta;
27
+ };
28
+ return preview;
29
+ };
30
+ }
31
+
32
+ export { createDefinePreview };
33
+ //# sourceMappingURL=chunk-FRAIA7MB.js.map
34
+ //# sourceMappingURL=chunk-FRAIA7MB.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/renderer/shared/create-define-preview.ts"],"names":["definePreview","definePreviewBase"],"mappings":";;;;AAQO,SAAS,oBAAoB,gBAAA,EAAuC;AACvE,EAAA,OAAO,SAASA,gBACZ,KAAA,EACF;AACE,IAAA,MAAM,EAAE,MAAA,EAAQ,GAAG,kBAAA,EAAmB,GAAI,KAAA;AAE1C,IAAA,MAAM,UAAUC,aAAA,CAAkB;AAAA,MAC9B,GAAG,kBAAA;AAAA,MACH,MAAA,EAAQ;AAAA,QACJ,gBAAA;AAAA,QACA,8BAAA;AAAA,QACA,qBAAA;AAAA,QACA,GAAI,UAAU;AAAC;AACnB,KACH,CAAA;AAED,IAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,IAAA,CAAK,IAAA,CAAK,OAAO,CAAA;AAE5C,IAAA,OAAA,CAAQ,IAAA,GAAO,CAAC,MAAA,KAAW;AACvB,MAAA,MAAM,IAAA,GAAO,WAAW,MAAM,CAAA;AAC9B,MAAA,MAAM,WAAA,GAAc,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA;AAGxC,MAAA,IAAA,CAAK,KAAA,GAAQ,CAAC,OAAA,KAAiB;AAC3B,QAAA,MAAM,KAAA,GAAQ,YAAY,OAAO,CAAA;AAGjC,QAAA,KAAA,CAAM,SAAA,GAAY,MAAM,SAAA,EAAU;AAElC,QAAA,OAAO,KAAA;AAAA,MACX,CAAA;AAEA,MAAA,OAAO,IAAA;AAAA,IACX,CAAA;AAEA,IAAA,OAAO,OAAA;AAAA,EACX,CAAA;AACJ","file":"chunk-FRAIA7MB.js","sourcesContent":["import { definePreview as definePreviewBase } from 'storybook/internal/csf';\n\nimport * as solidDocsAnnotations from '../docs/entry-preview';\nimport * as solidArgTypesAnnotations from '../docs/entry-preview-argtypes';\n\nimport type { PreviewAddon } from 'storybook/internal/csf';\nimport type { ProjectAnnotations } from 'storybook/internal/types';\n\nexport function createDefinePreview(solidAnnotations: PreviewAddon<never>) {\n return function definePreview<Addons extends PreviewAddon<never>[] = []>(\n input: { addons?: Addons } & ProjectAnnotations<any>\n ) {\n const { addons, ...projectAnnotations } = input;\n\n const preview = definePreviewBase({\n ...projectAnnotations,\n addons: [\n solidAnnotations,\n solidArgTypesAnnotations,\n solidDocsAnnotations,\n ...(addons ?? []),\n ],\n });\n\n const defineMeta = preview.meta.bind(preview);\n\n preview.meta = (_input) => {\n const meta = defineMeta(_input);\n const defineStory = meta.story.bind(meta);\n\n // @ts-expect-error internal code that is hard to type\n meta.story = (__input: any) => {\n const story = defineStory(__input);\n\n // @ts-ignore this is a private property used only here\n story.Component = story.__compose();\n\n return story;\n };\n\n return meta;\n };\n\n return preview;\n };\n}\n"]}
@@ -0,0 +1,42 @@
1
+ import { readFileSync } from 'fs';
2
+ import { createRequire } from 'module';
3
+ import { join } from 'path';
4
+ import semver from 'semver';
5
+
6
+ // src/framework/solidVersion.ts
7
+ function getFrameworkName(framework) {
8
+ return typeof framework === "string" ? framework : framework.name;
9
+ }
10
+ function detectInstalledSolidVersion(configDir) {
11
+ const projectRequire = createRequire(join(configDir, "package.json"));
12
+ let pkgPath;
13
+ try {
14
+ pkgPath = projectRequire.resolve("solid-js/package.json");
15
+ } catch {
16
+ throw new Error("Could not detect Solid version: `solid-js` is not installed.");
17
+ }
18
+ const { version } = JSON.parse(readFileSync(pkgPath, "utf8"));
19
+ return semver.major(version ?? "1.9.0");
20
+ }
21
+ function resolveSolidVersion(framework, configDir) {
22
+ const name = getFrameworkName(framework);
23
+ if (name === "storybook-solidjs-vite/next") {
24
+ return 2;
25
+ }
26
+ return detectInstalledSolidVersion(configDir);
27
+ }
28
+ var SOLID_DEDUPE_PACKAGES = [
29
+ "solid-js",
30
+ "@solidjs/web",
31
+ "@solidjs/signals",
32
+ "@solidjs/router",
33
+ "@solidjs/meta"
34
+ ];
35
+ function mergeSolidDedupe(existing) {
36
+ const base = existing == null ? [] : [...existing];
37
+ return [.../* @__PURE__ */ new Set([...base, ...SOLID_DEDUPE_PACKAGES])];
38
+ }
39
+
40
+ export { mergeSolidDedupe, resolveSolidVersion };
41
+ //# sourceMappingURL=chunk-NNSMHFZY.js.map
42
+ //# sourceMappingURL=chunk-NNSMHFZY.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/framework/solidVersion.ts"],"names":[],"mappings":";;;;;;AAOA,SAAS,iBAAiB,SAAA,EAAoC;AAC1D,EAAA,OAAO,OAAO,SAAA,KAAc,QAAA,GAAW,SAAA,GAAY,SAAA,CAAU,IAAA;AACjE;AAEA,SAAS,4BAA4B,SAAA,EAAiC;AAClE,EAAA,MAAM,cAAA,GAAiB,aAAA,CAAc,IAAA,CAAK,SAAA,EAAW,cAAc,CAAC,CAAA;AAEpE,EAAA,IAAI,OAAA;AAEJ,EAAA,IAAI;AACA,IAAA,OAAA,GAAU,cAAA,CAAe,QAAQ,uBAAuB,CAAA;AAAA,EAC5D,CAAA,CAAA,MACM;AACF,IAAA,MAAM,IAAI,MAAM,8DAA8D,CAAA;AAAA,EAClF;AAEA,EAAA,MAAM,EAAE,SAAQ,GAAI,IAAA,CAAK,MAAM,YAAA,CAAa,OAAA,EAAS,MAAM,CAAC,CAAA;AAE5D,EAAA,OAAO,MAAA,CAAO,KAAA,CAAM,OAAA,IAAW,OAAO,CAAA;AAC1C;AAQO,SAAS,mBAAA,CACZ,WACA,SAAA,EACY;AACZ,EAAA,MAAM,IAAA,GAAO,iBAAiB,SAAS,CAAA;AAEvC,EAAA,IAAI,SAAS,6BAAA,EAA+B;AACxC,IAAA,OAAO,CAAA;AAAA,EACX;AAEA,EAAA,OAAO,4BAA4B,SAAS,CAAA;AAChD;AAGO,IAAM,qBAAA,GAAwB;AAAA,EACjC,UAAA;AAAA,EACA,cAAA;AAAA,EACA,kBAAA;AAAA,EACA,iBAAA;AAAA,EACA;AACJ,CAAA;AAEO,SAAS,iBAAiB,QAAA,EAAiD;AAC9E,EAAA,MAAM,OAAO,QAAA,IAAY,IAAA,GAAO,EAAC,GAAI,CAAC,GAAG,QAAQ,CAAA;AAEjD,EAAA,OAAO,CAAC,mBAAG,IAAI,GAAA,CAAI,CAAC,GAAG,IAAA,EAAM,GAAG,qBAAqB,CAAC,CAAC,CAAA;AAC3D","file":"chunk-NNSMHFZY.js","sourcesContent":["import { readFileSync } from 'node:fs';\nimport { createRequire } from 'node:module';\nimport { join } from 'node:path';\nimport semver from 'semver';\n\nimport type { FrameworkConfig, SolidVersion } from './types';\n\nfunction getFrameworkName(framework: FrameworkConfig): string {\n return typeof framework === 'string' ? framework : framework.name;\n}\n\nfunction detectInstalledSolidVersion(configDir: string): SolidVersion {\n const projectRequire = createRequire(join(configDir, 'package.json'));\n\n let pkgPath: string;\n\n try {\n pkgPath = projectRequire.resolve('solid-js/package.json');\n }\n catch {\n throw new Error('Could not detect Solid version: `solid-js` is not installed.');\n }\n\n const { version } = JSON.parse(readFileSync(pkgPath, 'utf8')) as { version?: string };\n\n return semver.major(version ?? '1.9.0') as SolidVersion;\n}\n\n/**\n * Resolves the Solid major version for the Storybook renderer.\n *\n * - `storybook-solidjs-vite/next` → Solid 2\n * - `storybook-solidjs-vite` → detected from installed `solid-js`\n */\nexport function resolveSolidVersion(\n framework: FrameworkConfig,\n configDir: string\n): SolidVersion {\n const name = getFrameworkName(framework);\n\n if (name === 'storybook-solidjs-vite/next') {\n return 2;\n }\n\n return detectInstalledSolidVersion(configDir);\n}\n\n/** Force a single copy of Solid packages (renderer + app + linked deps). */\nexport const SOLID_DEDUPE_PACKAGES = [\n 'solid-js',\n '@solidjs/web',\n '@solidjs/signals',\n '@solidjs/router',\n '@solidjs/meta',\n] as const;\n\nexport function mergeSolidDedupe(existing?: string | readonly string[]): string[] {\n const base = existing == null ? [] : [...existing];\n\n return [...new Set([...base, ...SOLID_DEDUPE_PACKAGES])];\n}\n"]}
@@ -0,0 +1,87 @@
1
+ import { render, parameters, beforeAll, createApplyDecorators, createStoryState, getStoryId } from './chunk-2DIRFC5W.js';
2
+ import { __export } from './chunk-G3PMV62Z.js';
3
+ import { createComponent, onMount, onCleanup, ErrorBoundary } from 'solid-js';
4
+ import { createStore as createStore$1, reconcile } from 'solid-js/store';
5
+ import { render as render$1 } from 'solid-js/web';
6
+
7
+ // src/renderer/v1/entry-preview.ts
8
+ var entry_preview_exports = {};
9
+ __export(entry_preview_exports, {
10
+ applyDecorators: () => applyDecorators,
11
+ beforeAll: () => beforeAll,
12
+ mount: () => mount,
13
+ parameters: () => parameters,
14
+ render: () => render,
15
+ renderToCanvas: () => renderToCanvas
16
+ });
17
+ var createStore = (initial) => {
18
+ const [state, setStore] = createStore$1(initial);
19
+ const setState = (update) => {
20
+ setStore(reconcile(update(state)));
21
+ };
22
+ return [state, setState];
23
+ };
24
+ var storyStore = createStoryState(createStore);
25
+ var applyDecorators = createApplyDecorators(storyStore, createComponent);
26
+ var renderToCanvas = async (renderContext, canvasElement) => {
27
+ const storyId = getStoryId({ ...renderContext, canvasElement });
28
+ if (!storyId) {
29
+ throw new Error("Story ID is required");
30
+ }
31
+ const { storyContext, storyFn: StoryFn, showMain, showException } = renderContext;
32
+ const Story = StoryFn;
33
+ if (!storyStore.isStoryRendered(storyId)) {
34
+ const App = () => {
35
+ onMount(() => {
36
+ showMain();
37
+ storyStore.setRendered(storyId, true);
38
+ });
39
+ onCleanup(() => {
40
+ storyStore.setRendered(storyId, false);
41
+ });
42
+ if (storyContext?.parameters?.["__isPortableStory"]) {
43
+ return createComponent(Story, {});
44
+ }
45
+ return createComponent(ErrorBoundary, {
46
+ fallback: (err) => {
47
+ showException(err);
48
+ return err;
49
+ },
50
+ children: createComponent(Story, {})
51
+ });
52
+ };
53
+ const disposeFn = render$1(() => createComponent(App, {}), canvasElement);
54
+ storyStore.setDisposeFn(storyId, disposeFn);
55
+ } else {
56
+ StoryFn();
57
+ }
58
+ return () => {
59
+ storyStore.disposeStory(storyId);
60
+ storyStore.resetStory(storyId);
61
+ };
62
+ };
63
+ var mount = (context) => {
64
+ const storyId = getStoryId(context);
65
+ const { forceRemount } = context;
66
+ if (!storyId) {
67
+ throw new Error("Story ID is required");
68
+ }
69
+ return async (ui) => {
70
+ if (ui != null) {
71
+ context.originalStoryFn = () => ui;
72
+ }
73
+ if (forceRemount) {
74
+ storyStore.disposeStory(storyId);
75
+ }
76
+ if (!storyStore.isStoryRendered(storyId) || forceRemount) {
77
+ storyStore.resetStory(storyId);
78
+ }
79
+ storyStore.makeContextReactive(context);
80
+ await context.renderToCanvas();
81
+ return context.canvas;
82
+ };
83
+ };
84
+
85
+ export { applyDecorators, entry_preview_exports, mount, renderToCanvas };
86
+ //# sourceMappingURL=chunk-P43SJLUM.js.map
87
+ //# sourceMappingURL=chunk-P43SJLUM.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/renderer/v1/entry-preview.ts"],"names":["solidCreateStore","solidRender"],"mappings":"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","file":"chunk-P43SJLUM.js","sourcesContent":["import {\n createComponent,\n ErrorBoundary,\n onCleanup,\n onMount,\n} from 'solid-js-v1';\nimport { reconcile, createStore as solidCreateStore } from 'solid-js-v1/store';\nimport { render as solidRender } from 'solid-js-v1/web';\n\nimport { createApplyDecorators } from '../shared/apply-decorators.ts';\nimport { createStoryState, getStoryId } from '../shared/story-store';\n\nimport type { Args } from 'storybook/internal/types';\nimport type { RenderContext, SolidComponent, SolidRenderer, StoryContext, StoryFnReturnType } from './public-types';\n\nexport * from '../shared/preview-annotations';\n\n// Story state to control rendered stories and do not remount already rendered stories\nconst createStore = <T extends object>(initial: T) => {\n const [state, setStore] = solidCreateStore<T>(initial);\n\n const setState = (update: (prev: T) => T) => {\n setStore(reconcile(update(state)));\n };\n\n return [state, setState] as const;\n};\n\nconst storyStore = createStoryState(createStore);\n\n/** Wraps the story fn with decorators, JSX decorators skip re-render when the story is already mounted. */\nexport const applyDecorators = createApplyDecorators(storyStore, createComponent);\n\n/** Mounts or updates the story in the preview canvas. Returns cleanup when the story changes. */\nexport const renderToCanvas = async(\n renderContext: RenderContext,\n canvasElement: SolidRenderer['canvasElement']\n) => {\n const storyId = getStoryId({ ...renderContext, canvasElement });\n\n if (!storyId) {\n throw new Error('Story ID is required');\n }\n\n const { storyContext, storyFn: StoryFn, showMain, showException } = renderContext;\n const Story = StoryFn as SolidComponent;\n\n if (!storyStore.isStoryRendered(storyId)) {\n const App: SolidComponent = () => {\n onMount(() => {\n showMain();\n storyStore.setRendered(storyId, true);\n });\n\n onCleanup(() => {\n storyStore.setRendered(storyId, false);\n });\n\n if (storyContext?.parameters?.['__isPortableStory']) {\n return createComponent(Story, {});\n }\n\n return createComponent(ErrorBoundary, {\n fallback: (err: Error) => {\n showException(err);\n\n return err as any;\n },\n children: createComponent(Story, {}),\n });\n };\n\n const disposeFn = solidRender(() => createComponent(App, {}), canvasElement);\n\n storyStore.setDisposeFn(storyId, disposeFn);\n }\n else {\n StoryFn();\n }\n\n return () => {\n storyStore.disposeStory(storyId);\n storyStore.resetStory(storyId);\n };\n};\n\n/** Play/mount API: sync reactive args and globals, then render via `renderToCanvas`. */\nexport const mount = (context: StoryContext<Args>) => {\n const storyId = getStoryId(context);\n const { forceRemount } = context;\n\n if (!storyId) {\n throw new Error('Story ID is required');\n }\n\n return async(ui: StoryFnReturnType) => {\n if (ui != null) {\n context.originalStoryFn = () => ui;\n }\n\n if (forceRemount) {\n storyStore.disposeStory(storyId);\n }\n\n if (!storyStore.isStoryRendered(storyId) || forceRemount) {\n storyStore.resetStory(storyId);\n }\n\n storyStore.makeContextReactive(context);\n\n await context.renderToCanvas();\n\n return context.canvas;\n };\n};\n"]}