forgebook 0.1.8 → 0.2.0

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 (1124) hide show
  1. package/README.md +875 -23
  2. package/dist/bin/forgebook/agentClient.d.ts +30 -1
  3. package/dist/bin/forgebook/agentClient.js +155 -14
  4. package/dist/bin/forgebook/agentLoopCommands.d.mts +0 -1
  5. package/dist/bin/forgebook/agentLoopCommands.mjs +161 -40
  6. package/dist/bin/forgebook/agentText.d.ts +74 -3
  7. package/dist/bin/forgebook/agentText.js +192 -8
  8. package/dist/bin/forgebook/agents.md +141 -7
  9. package/dist/bin/forgebook/agentsText.d.ts +7 -3
  10. package/dist/bin/forgebook/agentsText.js +7 -3
  11. package/dist/bin/forgebook/builtCatalogue.d.ts +31 -0
  12. package/dist/bin/forgebook/builtCatalogue.js +96 -0
  13. package/dist/bin/forgebook/catalogueCommands.d.ts +22 -3
  14. package/dist/bin/forgebook/catalogueCommands.js +21 -2
  15. package/dist/bin/forgebook/catalogueVite.d.ts +51 -9
  16. package/dist/bin/forgebook/catalogueVite.js +95 -9
  17. package/dist/bin/forgebook/checkCodeRun.d.ts +8 -0
  18. package/dist/bin/forgebook/checkCodeRun.js +27 -0
  19. package/dist/bin/forgebook/commandServer.d.ts +11 -0
  20. package/dist/bin/forgebook/commandServer.js +39 -0
  21. package/dist/bin/forgebook/compileCache.d.ts +7 -0
  22. package/dist/bin/forgebook/compileCache.js +24 -0
  23. package/dist/bin/forgebook/devCommands.d.mts +14 -0
  24. package/dist/bin/forgebook/devCommands.mjs +104 -0
  25. package/dist/bin/forgebook/errorsRun.d.ts +0 -1
  26. package/dist/bin/forgebook/errorsRun.js +0 -1
  27. package/dist/bin/forgebook/forgebook.d.mts +0 -1
  28. package/dist/bin/forgebook/forgebook.mjs +18 -302
  29. package/dist/bin/forgebook/forgebookCommands.d.mts +1 -0
  30. package/dist/bin/forgebook/forgebookCommands.mjs +292 -0
  31. package/dist/bin/forgebook/importers/storybook.d.ts +10 -4
  32. package/dist/bin/forgebook/importers/storybook.js +71 -45
  33. package/dist/bin/forgebook/importers/storybookAngular.d.ts +15 -0
  34. package/dist/bin/forgebook/importers/storybookAngular.js +97 -0
  35. package/dist/bin/forgebook/importers/storybookFrameworks.d.ts +53 -0
  36. package/dist/bin/forgebook/importers/storybookFrameworks.js +180 -0
  37. package/dist/bin/forgebook/importers/storybookReactNative.d.ts +40 -0
  38. package/dist/bin/forgebook/importers/storybookReactNative.js +179 -0
  39. package/dist/bin/forgebook/initCommands.d.mts +0 -1
  40. package/dist/bin/forgebook/initCommands.mjs +23 -12
  41. package/dist/bin/forgebook/initConfig.d.ts +0 -1
  42. package/dist/bin/forgebook/initConfig.js +17 -3
  43. package/dist/bin/forgebook/mcpCommand.d.mts +8 -0
  44. package/dist/bin/forgebook/mcpCommand.mjs +99 -0
  45. package/dist/bin/forgebook/mcpPreview.d.ts +32 -0
  46. package/dist/bin/forgebook/mcpPreview.js +107 -0
  47. package/dist/bin/forgebook/mcpToolParts.d.ts +28 -0
  48. package/dist/bin/forgebook/mcpToolParts.js +24 -0
  49. package/dist/bin/forgebook/mcpTools.d.ts +12 -6
  50. package/dist/bin/forgebook/mcpTools.js +148 -27
  51. package/dist/bin/forgebook/newStories.d.ts +2 -3
  52. package/dist/bin/forgebook/newStories.js +4 -3
  53. package/dist/bin/forgebook/newStoriesFile.d.ts +3 -4
  54. package/dist/bin/forgebook/newStoriesFile.js +23 -11
  55. package/dist/bin/forgebook/pageTools.d.ts +8 -0
  56. package/dist/bin/forgebook/pageTools.js +71 -0
  57. package/dist/bin/forgebook/pagesCommands.d.mts +14 -0
  58. package/dist/bin/forgebook/pagesCommands.mjs +109 -0
  59. package/dist/bin/forgebook/prebundleChild.d.ts +1 -0
  60. package/dist/bin/forgebook/prebundleChild.js +34 -0
  61. package/dist/bin/forgebook/prebundleRun.d.ts +22 -0
  62. package/dist/bin/forgebook/prebundleRun.js +49 -0
  63. package/dist/bin/forgebook/prebundleStart.d.ts +44 -0
  64. package/dist/bin/forgebook/prebundleStart.js +82 -0
  65. package/dist/bin/forgebook/semanticOptions.d.ts +45 -0
  66. package/dist/bin/forgebook/semanticOptions.js +36 -0
  67. package/dist/bin/forgebook/storyCheckCommands.d.mts +13 -0
  68. package/dist/bin/forgebook/storyCheckCommands.mjs +69 -0
  69. package/dist/bin/forgebook/storyCheckRun.d.ts +40 -6
  70. package/dist/bin/forgebook/storyCheckRun.js +90 -17
  71. package/dist/bin/forgebook/tokensRun.d.ts +41 -0
  72. package/dist/bin/forgebook/tokensRun.js +42 -0
  73. package/dist/bin/forgebook/touchWindowRun.d.ts +0 -1
  74. package/dist/bin/forgebook/touchWindowRun.js +0 -1
  75. package/dist/bin/forgebook/visualCommands.d.mts +37 -0
  76. package/dist/bin/forgebook/visualCommands.mjs +162 -0
  77. package/dist/bin/forgebook/viteCache.d.ts +48 -0
  78. package/dist/bin/forgebook/viteCache.js +112 -0
  79. package/dist/bin/forgebook-docs/catalogueDocs.d.ts +1 -2
  80. package/dist/bin/forgebook-docs/catalogueDocs.js +8 -5
  81. package/dist/bin/forgebook-docs/catalogueDocs.types.d.ts +22 -3
  82. package/dist/bin/forgebook-docs/catalogueDocs.types.js +0 -1
  83. package/dist/bin/forgebook-docs/catalogueMarkdown.d.ts +0 -1
  84. package/dist/bin/forgebook-docs/catalogueMarkdown.js +67 -19
  85. package/dist/bin/forgebook-docs/catalogueOptions.d.ts +1 -2
  86. package/dist/bin/forgebook-docs/catalogueOptions.js +8 -2
  87. package/dist/bin/forgebook-docs/collectDocs.d.ts +4 -4
  88. package/dist/bin/forgebook-docs/collectDocs.js +122 -30
  89. package/dist/bin/forgebook-docs/forgebook-docs.d.mts +0 -1
  90. package/dist/bin/forgebook-docs/forgebook-docs.mjs +0 -1
  91. package/dist/bin/forgebook-docs/llmsText.d.ts +5 -1
  92. package/dist/bin/forgebook-docs/llmsText.js +5 -2
  93. package/dist/bin/forgebook-docs/moduleDocs.d.ts +0 -1
  94. package/dist/bin/forgebook-docs/moduleDocs.js +0 -1
  95. package/dist/bin/forgebook-docs/sassDocs.d.ts +0 -1
  96. package/dist/bin/forgebook-docs/sassDocs.js +0 -1
  97. package/dist/bin/forgebook-texts/forgebook-texts.d.mts +0 -1
  98. package/dist/bin/forgebook-texts/forgebook-texts.mjs +1 -2
  99. package/dist/bin/forgebook-texts/storyTextsReport.d.ts +0 -1
  100. package/dist/bin/forgebook-texts/storyTextsReport.js +0 -1
  101. package/dist/bin/forgebook-texts/storyTextsReport.types.d.ts +0 -1
  102. package/dist/bin/forgebook-texts/storyTextsReport.types.js +0 -1
  103. package/dist/bin/frameworkDocs.d.ts +0 -1
  104. package/dist/bin/frameworkDocs.js +0 -1
  105. package/dist/src/a11y.d.ts +0 -1
  106. package/dist/src/a11y.js +0 -1
  107. package/dist/src/addressArgs.d.ts +74 -0
  108. package/dist/src/addressArgs.js +109 -0
  109. package/dist/src/addressTexts.d.ts +35 -0
  110. package/dist/src/addressTexts.js +51 -0
  111. package/dist/src/argTypes.d.ts +0 -1
  112. package/dist/src/argTypes.js +2 -2
  113. package/dist/src/audiences.d.ts +17 -0
  114. package/dist/src/audiences.js +15 -0
  115. package/dist/src/backdrops.d.ts +39 -40
  116. package/dist/src/backdrops.js +37 -174
  117. package/dist/src/catalogue.d.ts +56 -20
  118. package/dist/src/catalogue.js +33 -14
  119. package/dist/src/codeLiteral.d.ts +41 -0
  120. package/dist/src/codeLiteral.js +51 -0
  121. package/dist/src/componentDocs.d.ts +57 -1
  122. package/dist/src/componentDocs.js +20 -3
  123. package/dist/src/controlKeys.d.ts +0 -1
  124. package/dist/src/controlKeys.js +0 -1
  125. package/dist/src/deviceDrawing.d.ts +114 -0
  126. package/dist/src/deviceDrawing.js +358 -0
  127. package/dist/src/deviceMenuView.d.ts +17 -0
  128. package/dist/src/deviceMenuView.js +22 -0
  129. package/dist/src/devicePicture.d.ts +57 -0
  130. package/dist/src/devicePicture.js +104 -0
  131. package/dist/src/deviceView.d.ts +172 -0
  132. package/dist/src/deviceView.js +111 -0
  133. package/dist/src/devices.d.ts +115 -0
  134. package/dist/src/devices.js +135 -0
  135. package/dist/src/docAnchors.d.ts +27 -0
  136. package/dist/src/docAnchors.js +33 -0
  137. package/dist/src/docPages.d.ts +203 -0
  138. package/dist/src/docPages.js +169 -0
  139. package/dist/src/embed.d.ts +32 -0
  140. package/dist/src/embed.js +24 -0
  141. package/dist/src/embedCode.d.ts +31 -0
  142. package/dist/src/embedCode.js +88 -0
  143. package/dist/src/frame/backdropPictures.d.ts +29 -0
  144. package/dist/src/frame/backdropPictures.js +187 -0
  145. package/dist/src/frame/checkStory.d.ts +6 -3
  146. package/dist/src/frame/checkStory.js +76 -5
  147. package/dist/src/frame/followTouch.d.ts +9 -0
  148. package/dist/src/frame/followTouch.js +43 -0
  149. package/dist/src/frame/frame.css +8 -3
  150. package/dist/src/frame/frameClock.d.ts +0 -1
  151. package/dist/src/frame/frameClock.js +0 -1
  152. package/dist/src/frame/frameStatus.d.ts +2 -1
  153. package/dist/src/frame/frameStatus.js +2 -1
  154. package/dist/src/frame/frameView.d.ts +0 -1
  155. package/dist/src/frame/frameView.js +1 -2
  156. package/dist/src/frame/matrixLayout.d.ts +0 -1
  157. package/dist/src/frame/matrixLayout.js +0 -1
  158. package/dist/src/frame/measureTools.d.ts +0 -1
  159. package/dist/src/frame/measureTools.js +0 -1
  160. package/dist/src/frame/mountFrame.d.ts +10 -3
  161. package/dist/src/frame/mountFrame.js +162 -63
  162. package/dist/src/frame/playStory.d.ts +0 -1
  163. package/dist/src/frame/playStory.js +0 -1
  164. package/dist/src/frame/pluginFrames.d.ts +31 -0
  165. package/dist/src/frame/pluginFrames.js +23 -0
  166. package/dist/src/frame/renderer.d.ts +50 -12
  167. package/dist/src/frame/renderer.js +27 -6
  168. package/dist/src/frame/settle.d.ts +0 -1
  169. package/dist/src/frame/settle.js +0 -1
  170. package/dist/src/frame/shellChannel.d.ts +47 -0
  171. package/dist/src/frame/shellChannel.js +39 -0
  172. package/dist/src/frame/spillOutline.d.ts +0 -1
  173. package/dist/src/frame/spillOutline.js +0 -1
  174. package/dist/src/frame/staleModule.d.ts +14 -2
  175. package/dist/src/frame/staleModule.js +19 -2
  176. package/dist/src/frame/storyCanvas.d.ts +0 -1
  177. package/dist/src/frame/storyCanvas.js +0 -1
  178. package/dist/src/frame/storyHooks.d.ts +0 -1
  179. package/dist/src/frame/storyHooks.js +0 -1
  180. package/dist/src/frame/storyModule.d.ts +13 -2
  181. package/dist/src/frame/storyModule.js +45 -3
  182. package/dist/src/frame/storyRun.d.ts +21 -4
  183. package/dist/src/frame/storyRun.js +100 -19
  184. package/dist/src/frame/touchDots.d.ts +0 -1
  185. package/dist/src/frame/touchDots.js +0 -1
  186. package/dist/src/frame/touchEvents.d.ts +0 -1
  187. package/dist/src/frame/touchEvents.js +0 -1
  188. package/dist/src/frame/touchGesture.d.ts +0 -1
  189. package/dist/src/frame/touchGesture.js +0 -1
  190. package/dist/src/frame/touchLayer.d.ts +3 -3
  191. package/dist/src/frame/touchLayer.js +4 -30
  192. package/dist/src/frame/touchScroll.d.ts +0 -1
  193. package/dist/src/frame/touchScroll.js +0 -1
  194. package/dist/src/frameOrigins.d.ts +62 -0
  195. package/dist/src/frameOrigins.js +49 -0
  196. package/dist/src/hotModules.d.ts +48 -0
  197. package/dist/src/hotModules.js +53 -0
  198. package/dist/src/jsxCode.d.ts +22 -0
  199. package/dist/src/jsxCode.js +36 -0
  200. package/dist/src/languages.d.ts +0 -1
  201. package/dist/src/languages.js +0 -1
  202. package/dist/src/liveErrors.d.ts +0 -1
  203. package/dist/src/liveErrors.js +0 -1
  204. package/dist/src/matrix.d.ts +0 -1
  205. package/dist/src/matrix.js +0 -1
  206. package/dist/src/messages.d.ts +28 -2
  207. package/dist/src/messages.js +24 -3
  208. package/dist/src/namedValues.d.ts +11 -1
  209. package/dist/src/namedValues.js +25 -2
  210. package/dist/src/namedViews.d.ts +1 -13
  211. package/dist/src/namedViews.js +30 -7
  212. package/dist/src/packedText.d.ts +21 -0
  213. package/dist/src/packedText.js +36 -0
  214. package/dist/src/pageAddress.d.ts +26 -0
  215. package/dist/src/pageAddress.js +39 -0
  216. package/dist/src/pageConfig.d.ts +3 -1
  217. package/dist/src/pageConfig.js +0 -1
  218. package/dist/src/pageTree.d.ts +79 -0
  219. package/dist/src/pageTree.js +108 -0
  220. package/dist/src/playTrace.d.ts +0 -1
  221. package/dist/src/playTrace.js +0 -1
  222. package/dist/src/plugin.d.ts +230 -0
  223. package/dist/src/plugin.js +12 -0
  224. package/dist/src/pluginReact.d.ts +23 -0
  225. package/dist/src/pluginReact.js +24 -0
  226. package/dist/src/previewRelay.d.ts +40 -0
  227. package/dist/src/previewRelay.js +69 -0
  228. package/dist/src/previewTexts.d.ts +26 -0
  229. package/dist/src/previewTexts.js +33 -0
  230. package/dist/src/previewView.d.ts +31 -0
  231. package/dist/src/previewView.js +264 -0
  232. package/dist/src/propGroups.d.ts +46 -0
  233. package/dist/src/propGroups.js +59 -0
  234. package/dist/src/realTouch.d.ts +1 -2
  235. package/dist/src/realTouch.js +1 -2
  236. package/dist/src/safeAreaParameter.d.ts +42 -0
  237. package/dist/src/safeAreaParameter.js +50 -0
  238. package/dist/src/search.d.ts +154 -0
  239. package/dist/src/search.js +265 -0
  240. package/dist/src/searchIndex.d.ts +61 -0
  241. package/dist/src/searchIndex.js +55 -0
  242. package/dist/src/searchMarks.d.ts +29 -0
  243. package/dist/src/searchMarks.js +165 -0
  244. package/dist/src/searchMatch.d.ts +58 -0
  245. package/dist/src/searchMatch.js +127 -0
  246. package/dist/src/shell/A11yTab.d.ts +0 -7
  247. package/dist/src/shell/A11yTab.js +4 -15
  248. package/dist/src/shell/AnchorScroll.d.ts +25 -0
  249. package/dist/src/shell/AnchorScroll.js +10 -0
  250. package/dist/src/shell/ApiReference.d.ts +11 -4
  251. package/dist/src/shell/ApiReference.js +73 -19
  252. package/dist/src/shell/AppearanceMenu.d.ts +1 -2
  253. package/dist/src/shell/AppearanceMenu.js +8 -5
  254. package/dist/src/shell/AudienceSections.d.ts +106 -0
  255. package/dist/src/shell/AudienceSections.js +154 -0
  256. package/dist/src/shell/AuthoredHome.d.ts +37 -0
  257. package/dist/src/shell/AuthoredHome.js +96 -0
  258. package/dist/src/shell/BoxWidth.d.ts +0 -1
  259. package/dist/src/shell/BoxWidth.js +0 -1
  260. package/dist/src/shell/ClockBar.d.ts +19 -0
  261. package/dist/src/shell/ClockBar.js +15 -0
  262. package/dist/src/shell/ClockControls.d.ts +5 -9
  263. package/dist/src/shell/ClockControls.js +13 -16
  264. package/dist/src/shell/Code.d.ts +0 -1
  265. package/dist/src/shell/Code.js +0 -1
  266. package/dist/src/shell/CodeTab.d.ts +0 -1
  267. package/dist/src/shell/CodeTab.js +2 -2
  268. package/dist/src/shell/CodeText.d.ts +0 -1
  269. package/dist/src/shell/CodeText.js +0 -1
  270. package/dist/src/shell/CompareGrid.d.ts +37 -0
  271. package/dist/src/shell/CompareGrid.js +24 -0
  272. package/dist/src/shell/ComponentPage.d.ts +45 -7
  273. package/dist/src/shell/ComponentPage.js +105 -49
  274. package/dist/src/shell/ControlKeyField.d.ts +0 -1
  275. package/dist/src/shell/ControlKeyField.js +3 -4
  276. package/dist/src/shell/ControlRow.d.ts +4 -4
  277. package/dist/src/shell/ControlRow.js +5 -5
  278. package/dist/src/shell/DeviceControl.d.ts +31 -0
  279. package/dist/src/shell/DeviceControl.js +33 -0
  280. package/dist/src/shell/DeviceSlot.d.ts +114 -0
  281. package/dist/src/shell/DeviceSlot.js +134 -0
  282. package/dist/src/shell/DocBlocks.d.ts +100 -0
  283. package/dist/src/shell/DocBlocks.js +206 -0
  284. package/dist/src/shell/DocContainers.d.ts +70 -0
  285. package/dist/src/shell/DocContainers.js +94 -0
  286. package/dist/src/shell/DocContents.d.ts +29 -0
  287. package/dist/src/shell/DocContents.js +88 -0
  288. package/dist/src/shell/DocPage.d.ts +69 -0
  289. package/dist/src/shell/DocPage.js +141 -0
  290. package/dist/src/shell/Dock.d.ts +1 -2
  291. package/dist/src/shell/Dock.js +1 -2
  292. package/dist/src/shell/DroppedArgsList.d.ts +26 -0
  293. package/dist/src/shell/DroppedArgsList.js +8 -0
  294. package/dist/src/shell/DroppedArgsNote.d.ts +14 -0
  295. package/dist/src/shell/DroppedArgsNote.js +10 -0
  296. package/dist/src/shell/EmbedButton.d.ts +19 -0
  297. package/dist/src/shell/EmbedButton.js +96 -0
  298. package/dist/src/shell/EmbedPage.d.ts +23 -0
  299. package/dist/src/shell/EmbedPage.js +168 -0
  300. package/dist/src/shell/EmbedPanel.d.ts +25 -0
  301. package/dist/src/shell/EmbedPanel.js +46 -0
  302. package/dist/src/shell/EventsTab.d.ts +0 -1
  303. package/dist/src/shell/EventsTab.js +2 -3
  304. package/dist/src/shell/Example.d.ts +20 -2
  305. package/dist/src/shell/Example.js +75 -22
  306. package/dist/src/shell/FrameView.d.ts +1 -2
  307. package/dist/src/shell/FrameView.js +4 -4
  308. package/dist/src/shell/HomePage.d.ts +78 -4
  309. package/dist/src/shell/HomePage.js +53 -14
  310. package/dist/src/shell/HomePieces.d.ts +40 -0
  311. package/dist/src/shell/HomePieces.js +29 -0
  312. package/dist/src/shell/InfoTip.d.ts +0 -1
  313. package/dist/src/shell/InfoTip.js +0 -1
  314. package/dist/src/shell/InteractionsTab.d.ts +0 -7
  315. package/dist/src/shell/InteractionsTab.js +3 -9
  316. package/dist/src/shell/LazyHost.d.ts +16 -0
  317. package/dist/src/shell/LazyHost.js +42 -0
  318. package/dist/src/shell/LazyPage.d.ts +24 -0
  319. package/dist/src/shell/LazyPage.js +9 -0
  320. package/dist/src/shell/LogicMark.d.ts +0 -1
  321. package/dist/src/shell/LogicMark.js +0 -1
  322. package/dist/src/shell/MatrixPicker.d.ts +0 -1
  323. package/dist/src/shell/MatrixPicker.js +0 -1
  324. package/dist/src/shell/NamedViews.d.ts +0 -1
  325. package/dist/src/shell/NamedViews.js +4 -5
  326. package/dist/src/shell/PackageHtml.d.ts +0 -1
  327. package/dist/src/shell/PackageHtml.js +0 -1
  328. package/dist/src/shell/PartsTab.d.ts +0 -7
  329. package/dist/src/shell/PartsTab.js +3 -13
  330. package/dist/src/shell/PinnedControl.d.ts +0 -1
  331. package/dist/src/shell/PinnedControl.js +2 -2
  332. package/dist/src/shell/PluginBlockHost.d.ts +46 -0
  333. package/dist/src/shell/PluginBlockHost.js +39 -0
  334. package/dist/src/shell/PluginTabHost.d.ts +32 -0
  335. package/dist/src/shell/PluginTabHost.js +25 -0
  336. package/dist/src/shell/PluginViewHost.d.ts +37 -0
  337. package/dist/src/shell/PluginViewHost.js +89 -0
  338. package/dist/src/shell/PropFields.d.ts +0 -1
  339. package/dist/src/shell/PropFields.js +0 -1
  340. package/dist/src/shell/PropsTab.d.ts +11 -2
  341. package/dist/src/shell/PropsTab.js +31 -5
  342. package/dist/src/shell/SearchPanel.d.ts +63 -0
  343. package/dist/src/shell/SearchPanel.js +209 -0
  344. package/dist/src/shell/Segmented.d.ts +0 -1
  345. package/dist/src/shell/Segmented.js +0 -1
  346. package/dist/src/shell/Shell.d.ts +34 -6
  347. package/dist/src/shell/Shell.js +271 -70
  348. package/dist/src/shell/Sidebar.d.ts +20 -5
  349. package/dist/src/shell/Sidebar.js +23 -56
  350. package/dist/src/shell/SidebarDocs.d.ts +38 -0
  351. package/dist/src/shell/SidebarDocs.js +30 -0
  352. package/dist/src/shell/SidebarEntries.d.ts +9 -1
  353. package/dist/src/shell/SidebarEntries.js +1 -2
  354. package/dist/src/shell/SidebarHandle.d.ts +0 -1
  355. package/dist/src/shell/SidebarHandle.js +0 -1
  356. package/dist/src/shell/SidebarSearch.d.ts +40 -0
  357. package/dist/src/shell/SidebarSearch.js +85 -0
  358. package/dist/src/shell/SignatureReference.d.ts +0 -1
  359. package/dist/src/shell/SignatureReference.js +1 -2
  360. package/dist/src/shell/Stage.d.ts +9 -4
  361. package/dist/src/shell/Stage.js +112 -59
  362. package/dist/src/shell/StageCompare.d.ts +14 -0
  363. package/dist/src/shell/StageCompare.js +11 -0
  364. package/dist/src/shell/StageTools.d.ts +0 -1
  365. package/dist/src/shell/StageTools.js +0 -1
  366. package/dist/src/shell/StageViewport.d.ts +7 -3
  367. package/dist/src/shell/StageViewport.js +4 -5
  368. package/dist/src/shell/StoryBar.d.ts +40 -0
  369. package/dist/src/shell/StoryBar.js +23 -0
  370. package/dist/src/shell/StoryCodeBlock.d.ts +1 -2
  371. package/dist/src/shell/StoryCodeBlock.js +0 -1
  372. package/dist/src/shell/StoryCoverage.d.ts +36 -0
  373. package/dist/src/shell/StoryCoverage.js +126 -0
  374. package/dist/src/shell/StoryPicker.d.ts +0 -1
  375. package/dist/src/shell/StoryPicker.js +0 -1
  376. package/dist/src/shell/Toolbar.d.ts +7 -3
  377. package/dist/src/shell/Toolbar.js +6 -6
  378. package/dist/src/shell/ToolbarControl.d.ts +6 -8
  379. package/dist/src/shell/ToolbarControl.js +28 -20
  380. package/dist/src/shell/UsedIn.d.ts +5 -6
  381. package/dist/src/shell/UsedIn.js +7 -20
  382. package/dist/src/shell/ViewMenu.d.ts +7 -7
  383. package/dist/src/shell/ViewMenu.js +61 -176
  384. package/dist/src/shell/ViewMenuPanel.d.ts +41 -0
  385. package/dist/src/shell/ViewMenuPanel.js +199 -0
  386. package/dist/src/shell/WidthField.d.ts +3 -2
  387. package/dist/src/shell/WidthField.js +2 -3
  388. package/dist/src/shell/asideStory.d.ts +34 -0
  389. package/dist/src/shell/asideStory.js +55 -0
  390. package/dist/src/shell/audienceLayout.d.ts +39 -0
  391. package/dist/src/shell/audienceLayout.js +33 -0
  392. package/dist/src/shell/audiencePage.d.ts +113 -0
  393. package/dist/src/shell/audiencePage.js +144 -0
  394. package/dist/src/shell/audienceSections.css +95 -0
  395. package/dist/src/shell/catalogueContext.d.ts +24 -2
  396. package/dist/src/shell/catalogueContext.js +12 -9
  397. package/dist/src/shell/codeTokens.d.ts +0 -1
  398. package/dist/src/shell/codeTokens.js +0 -1
  399. package/dist/src/shell/codeWriter.d.ts +0 -1
  400. package/dist/src/shell/codeWriter.js +0 -1
  401. package/dist/src/shell/compareVariants.d.ts +0 -1
  402. package/dist/src/shell/compareVariants.js +2 -2
  403. package/dist/src/shell/controlCycle.d.ts +0 -1
  404. package/dist/src/shell/controlCycle.js +13 -1
  405. package/dist/src/shell/controlLabel.d.ts +7 -0
  406. package/dist/src/shell/controlLabel.js +17 -0
  407. package/dist/src/shell/device/deviceFrame.css +42 -0
  408. package/dist/src/shell/device/deviceParts.d.ts +90 -0
  409. package/dist/src/shell/device/deviceParts.js +120 -0
  410. package/dist/src/shell/docPage.css +451 -0
  411. package/dist/src/shell/dockTabs.d.ts +13 -5
  412. package/dist/src/shell/dockTabs.js +40 -18
  413. package/dist/src/shell/embed.css +74 -0
  414. package/dist/src/shell/filesCode.d.ts +21 -0
  415. package/dist/src/shell/filesCode.js +37 -0
  416. package/dist/src/shell/forgebookMark.d.ts +15 -0
  417. package/dist/src/shell/forgebookMark.js +28 -0
  418. package/dist/src/shell/framesOrigin.d.ts +23 -0
  419. package/dist/src/shell/framesOrigin.js +69 -0
  420. package/dist/src/shell/icons.d.ts +3 -1
  421. package/dist/src/shell/icons.js +3 -1
  422. package/dist/src/shell/keyboard.d.ts +0 -1
  423. package/dist/src/shell/keyboard.js +0 -1
  424. package/dist/src/shell/laterStrings.d.ts +91 -0
  425. package/dist/src/shell/laterStrings.js +102 -0
  426. package/dist/src/shell/lazyModule.d.ts +49 -0
  427. package/dist/src/shell/lazyModule.js +72 -0
  428. package/dist/src/shell/lazyTab.d.ts +21 -0
  429. package/dist/src/shell/lazyTab.js +9 -0
  430. package/dist/src/shell/logicView.d.ts +0 -12
  431. package/dist/src/shell/logicView.js +2 -2
  432. package/dist/src/shell/mountShell.d.ts +5 -3
  433. package/dist/src/shell/mountShell.js +43 -12
  434. package/dist/src/shell/pageStrings.d.ts +24 -0
  435. package/dist/src/shell/pageStrings.js +26 -0
  436. package/dist/src/shell/pluginHosts.d.ts +9 -0
  437. package/dist/src/shell/pluginHosts.js +6 -0
  438. package/dist/src/shell/pluginHostsContext.d.ts +20 -0
  439. package/dist/src/shell/pluginHostsContext.js +16 -0
  440. package/dist/src/shell/pluginTabs.d.ts +63 -0
  441. package/dist/src/shell/pluginTabs.js +60 -0
  442. package/dist/src/shell/search.css +172 -0
  443. package/dist/src/shell/searchStrings.d.ts +24 -0
  444. package/dist/src/shell/searchStrings.js +31 -0
  445. package/dist/src/shell/shell.css +285 -139
  446. package/dist/src/shell/shellScheme.d.ts +37 -0
  447. package/dist/src/shell/shellScheme.js +32 -0
  448. package/dist/src/shell/storyTouch.d.ts +19 -6
  449. package/dist/src/shell/storyTouch.js +26 -4
  450. package/dist/src/shell/strings.d.ts +56 -80
  451. package/dist/src/shell/strings.js +53 -78
  452. package/dist/src/shell/switchView.d.ts +0 -1
  453. package/dist/src/shell/switchView.js +0 -1
  454. package/dist/src/shell/tabSummaries.d.ts +31 -0
  455. package/dist/src/shell/tabSummaries.js +27 -0
  456. package/dist/src/shell/treeSearch.d.ts +39 -3
  457. package/dist/src/shell/treeSearch.js +27 -1
  458. package/dist/src/shell/useAddressArgs.d.ts +55 -0
  459. package/dist/src/shell/useAddressArgs.js +62 -0
  460. package/dist/src/shell/useAnchorScroll.d.ts +24 -0
  461. package/dist/src/shell/useAnchorScroll.js +90 -0
  462. package/dist/src/shell/useAppearance.d.ts +7 -2
  463. package/dist/src/shell/useAppearance.js +14 -5
  464. package/dist/src/shell/useComponentDocs.d.ts +0 -1
  465. package/dist/src/shell/useComponentDocs.js +0 -1
  466. package/dist/src/shell/useControlKeys.d.ts +2 -1
  467. package/dist/src/shell/useControlKeys.js +2 -3
  468. package/dist/src/shell/useCopy.d.ts +2 -1
  469. package/dist/src/shell/useCopy.js +11 -6
  470. package/dist/src/shell/useFold.d.ts +0 -1
  471. package/dist/src/shell/useFold.js +0 -1
  472. package/dist/src/shell/useFrameMessages.d.ts +19 -4
  473. package/dist/src/shell/useFrameMessages.js +23 -7
  474. package/dist/src/shell/useFrameQueue.d.ts +7 -3
  475. package/dist/src/shell/useFrameQueue.js +39 -22
  476. package/dist/src/shell/useFullPage.d.ts +0 -1
  477. package/dist/src/shell/useFullPage.js +0 -1
  478. package/dist/src/shell/useLiveView.d.ts +0 -1
  479. package/dist/src/shell/useLiveView.js +0 -1
  480. package/dist/src/shell/useLoaded.d.ts +1 -2
  481. package/dist/src/shell/useLoaded.js +28 -6
  482. package/dist/src/shell/usePageDoc.d.ts +0 -1
  483. package/dist/src/shell/usePageDoc.js +0 -1
  484. package/dist/src/shell/usePageFrames.d.ts +46 -0
  485. package/dist/src/shell/usePageFrames.js +50 -0
  486. package/dist/src/shell/usePluginTabs.d.ts +18 -0
  487. package/dist/src/shell/usePluginTabs.js +45 -0
  488. package/dist/src/shell/usePopover.d.ts +0 -1
  489. package/dist/src/shell/usePopover.js +0 -1
  490. package/dist/src/shell/useProseLinks.d.ts +14 -0
  491. package/dist/src/shell/useProseLinks.js +30 -0
  492. package/dist/src/shell/useRecentPages.d.ts +3 -4
  493. package/dist/src/shell/useRecentPages.js +1 -2
  494. package/dist/src/shell/useScrollMemory.d.ts +9 -1
  495. package/dist/src/shell/useScrollMemory.js +2 -3
  496. package/dist/src/shell/useSearchIndex.d.ts +24 -0
  497. package/dist/src/shell/useSearchIndex.js +51 -0
  498. package/dist/src/shell/useShownView.d.ts +3 -1
  499. package/dist/src/shell/useShownView.js +5 -5
  500. package/dist/src/shell/useSidebarLayout.d.ts +0 -1
  501. package/dist/src/shell/useSidebarLayout.js +0 -1
  502. package/dist/src/shell/useStored.d.ts +13 -1
  503. package/dist/src/shell/useStored.js +13 -5
  504. package/dist/src/shell/useStoryCheck.d.ts +20 -0
  505. package/dist/src/shell/useStoryCheck.js +33 -0
  506. package/dist/src/shell/useStoryCode.d.ts +0 -1
  507. package/dist/src/shell/useStoryCode.js +0 -1
  508. package/dist/src/shell/useStoryHeights.d.ts +0 -1
  509. package/dist/src/shell/useStoryHeights.js +0 -1
  510. package/dist/src/shell/useStoryIdsElement.d.ts +0 -1
  511. package/dist/src/shell/useStoryIdsElement.js +0 -1
  512. package/dist/src/shell/useStoryKeys.d.ts +0 -1
  513. package/dist/src/shell/useStoryKeys.js +0 -1
  514. package/dist/src/shell/useSyncedTab.d.ts +8 -0
  515. package/dist/src/shell/useSyncedTab.js +60 -0
  516. package/dist/src/shell/useSystemDark.d.ts +0 -1
  517. package/dist/src/shell/useSystemDark.js +0 -1
  518. package/dist/src/shell/useToolbarLayout.d.ts +0 -1
  519. package/dist/src/shell/useToolbarLayout.js +0 -1
  520. package/dist/src/shell/useToolbarOverflow.d.ts +0 -1
  521. package/dist/src/shell/useToolbarOverflow.js +0 -1
  522. package/dist/src/shell/useWorstCase.d.ts +0 -1
  523. package/dist/src/shell/useWorstCase.js +2 -2
  524. package/dist/src/shell/worstArgs.d.ts +0 -1
  525. package/dist/src/shell/worstArgs.js +0 -1
  526. package/dist/src/shellTheme.d.ts +64 -0
  527. package/dist/src/shellTheme.js +274 -0
  528. package/dist/src/shellTheme.types.d.ts +93 -0
  529. package/dist/src/shellTheme.types.js +10 -0
  530. package/dist/src/sourceFiles.d.ts +17 -3
  531. package/dist/src/sourceFiles.js +27 -1
  532. package/dist/src/spills.d.ts +0 -1
  533. package/dist/src/spills.js +0 -1
  534. package/dist/src/storyBackground.d.ts +0 -1
  535. package/dist/src/storyBackground.js +0 -1
  536. package/dist/src/storyCheck.d.ts +86 -2
  537. package/dist/src/storyCheck.js +12 -2
  538. package/dist/src/storyClock.d.ts +0 -1
  539. package/dist/src/storyClock.js +0 -1
  540. package/dist/src/storyGlobals.d.ts +0 -1
  541. package/dist/src/storyGlobals.js +0 -1
  542. package/dist/src/storyHeights.d.ts +0 -1
  543. package/dist/src/storyHeights.js +0 -1
  544. package/dist/src/storyIds.d.ts +36 -0
  545. package/dist/src/storyIds.js +52 -0
  546. package/dist/src/storyIdsElement.d.ts +0 -1
  547. package/dist/src/storyIdsElement.js +0 -1
  548. package/dist/src/storyTexts.d.ts +11 -5
  549. package/dist/src/storyTexts.js +16 -5
  550. package/dist/src/storyTree.d.ts +79 -25
  551. package/dist/src/storyTree.js +211 -127
  552. package/dist/src/switches.d.ts +0 -1
  553. package/dist/src/switches.js +6 -2
  554. package/dist/src/toolbarLayout.d.ts +0 -1
  555. package/dist/src/toolbarLayout.js +0 -1
  556. package/dist/src/treePlaces.d.ts +60 -0
  557. package/dist/src/treePlaces.js +89 -0
  558. package/dist/src/usedIn.d.ts +28 -1
  559. package/dist/src/usedIn.js +93 -3
  560. package/dist/src/viewState.d.ts +37 -9
  561. package/dist/src/viewState.js +67 -9
  562. package/dist/src/viewWords.d.ts +0 -13
  563. package/dist/src/viewWords.js +41 -3
  564. package/dist/src/vite/adapter.d.ts +62 -1
  565. package/dist/src/vite/adapter.js +20 -2
  566. package/dist/src/vite/agent.types.d.ts +279 -7
  567. package/dist/src/vite/agent.types.js +11 -1
  568. package/dist/src/vite/agentApi.d.ts +55 -2
  569. package/dist/src/vite/agentApi.js +130 -8
  570. package/dist/src/vite/agentIds.d.ts +25 -0
  571. package/dist/src/vite/agentIds.js +41 -0
  572. package/dist/src/vite/agentIndex.d.ts +63 -0
  573. package/dist/src/vite/agentIndex.js +91 -0
  574. package/dist/src/vite/agentIndexRoute.d.ts +10 -0
  575. package/dist/src/vite/agentIndexRoute.js +35 -0
  576. package/dist/src/vite/agentRoutes.d.ts +80 -19
  577. package/dist/src/vite/agentRoutes.js +167 -24
  578. package/dist/src/vite/autoTitle.d.ts +0 -1
  579. package/dist/src/vite/autoTitle.js +0 -1
  580. package/dist/src/vite/axeScript.d.ts +20 -0
  581. package/dist/src/vite/axeScript.js +60 -0
  582. package/dist/src/vite/builtTexts.d.ts +75 -0
  583. package/dist/src/vite/builtTexts.js +142 -0
  584. package/dist/src/vite/catalogueConfig.d.ts +10 -0
  585. package/dist/src/vite/catalogueConfig.js +64 -0
  586. package/dist/src/vite/checkCode.d.ts +67 -0
  587. package/dist/src/vite/checkCode.js +145 -0
  588. package/dist/src/vite/closeWatch.d.ts +96 -0
  589. package/dist/src/vite/closeWatch.js +219 -0
  590. package/dist/src/vite/codeFence.d.ts +78 -0
  591. package/dist/src/vite/codeFence.js +267 -0
  592. package/dist/src/vite/componentImport.d.ts +8 -0
  593. package/dist/src/vite/componentImport.js +35 -0
  594. package/dist/src/vite/componentPage.d.ts +15 -2
  595. package/dist/src/vite/componentPage.js +55 -16
  596. package/dist/src/vite/config.d.ts +51 -3
  597. package/dist/src/vite/config.js +0 -1
  598. package/dist/src/vite/configFile.d.ts +65 -9
  599. package/dist/src/vite/configFile.js +182 -28
  600. package/dist/src/vite/designTokens.d.ts +75 -0
  601. package/dist/src/vite/designTokens.js +382 -0
  602. package/dist/src/vite/diskCache.d.ts +51 -0
  603. package/dist/src/vite/diskCache.js +211 -0
  604. package/dist/src/vite/docDirectives.d.ts +116 -0
  605. package/dist/src/vite/docDirectives.js +425 -0
  606. package/dist/src/vite/docMarkdown.d.ts +76 -0
  607. package/dist/src/vite/docMarkdown.js +150 -0
  608. package/dist/src/vite/docPageBlocks.d.ts +64 -0
  609. package/dist/src/vite/docPageBlocks.js +322 -0
  610. package/dist/src/vite/docPageLinks.d.ts +72 -0
  611. package/dist/src/vite/docPageLinks.js +135 -0
  612. package/dist/src/vite/docPageMarkdown.d.ts +86 -0
  613. package/dist/src/vite/docPageMarkdown.js +133 -0
  614. package/dist/src/vite/docPageRender.d.ts +27 -0
  615. package/dist/src/vite/docPageRender.js +199 -0
  616. package/dist/src/vite/docPageTokens.d.ts +91 -0
  617. package/dist/src/vite/docPageTokens.js +186 -0
  618. package/dist/src/vite/docPagesModule.d.ts +50 -0
  619. package/dist/src/vite/docPagesModule.js +118 -0
  620. package/dist/src/vite/docPagesRoute.d.ts +38 -0
  621. package/dist/src/vite/docPagesRoute.js +154 -0
  622. package/dist/src/vite/docsDependencies.d.ts +6 -0
  623. package/dist/src/vite/docsDependencies.js +150 -0
  624. package/dist/src/vite/docsExtractor.d.ts +44 -3
  625. package/dist/src/vite/docsExtractor.js +160 -26
  626. package/dist/src/vite/docsProgram.d.ts +89 -9
  627. package/dist/src/vite/docsProgram.js +413 -50
  628. package/dist/src/vite/docsWorker.d.ts +0 -1
  629. package/dist/src/vite/docsWorker.js +49 -15
  630. package/dist/src/vite/figmaLink.d.ts +26 -0
  631. package/dist/src/vite/figmaLink.js +92 -0
  632. package/dist/src/vite/findComponent.d.ts +32 -0
  633. package/dist/src/vite/findComponent.js +52 -0
  634. package/dist/src/vite/findRoute.d.ts +14 -0
  635. package/dist/src/vite/findRoute.js +62 -0
  636. package/dist/src/vite/forcedStates.d.ts +0 -1
  637. package/dist/src/vite/forcedStates.js +0 -1
  638. package/dist/src/vite/forgebookPlugin.d.ts +1 -2
  639. package/dist/src/vite/forgebookPlugin.js +321 -263
  640. package/dist/src/vite/framesConfig.d.ts +89 -0
  641. package/dist/src/vite/framesConfig.js +149 -0
  642. package/dist/src/vite/framesServer.d.ts +43 -0
  643. package/dist/src/vite/framesServer.js +326 -0
  644. package/dist/src/vite/functionComponentDocs.d.ts +26 -0
  645. package/dist/src/vite/functionComponentDocs.js +193 -0
  646. package/dist/src/vite/gitChange.d.ts +56 -0
  647. package/dist/src/vite/gitChange.js +86 -0
  648. package/dist/src/vite/heightsRoute.d.ts +0 -1
  649. package/dist/src/vite/heightsRoute.js +0 -1
  650. package/dist/src/vite/highlightCode.d.ts +0 -1
  651. package/dist/src/vite/highlightCode.js +8 -27
  652. package/dist/src/vite/hotSnippets.d.ts +86 -0
  653. package/dist/src/vite/hotSnippets.js +168 -0
  654. package/dist/src/vite/indexFields.d.ts +61 -0
  655. package/dist/src/vite/indexFields.js +149 -0
  656. package/dist/src/vite/indexStoryFile.d.ts +19 -18
  657. package/dist/src/vite/indexStoryFile.js +165 -221
  658. package/dist/src/vite/indexedParameters.d.ts +10 -0
  659. package/dist/src/vite/indexedParameters.js +110 -0
  660. package/dist/src/vite/mcpProtocol.d.ts +36 -2
  661. package/dist/src/vite/mcpProtocol.js +100 -15
  662. package/dist/src/vite/moduleSummary.d.ts +17 -0
  663. package/dist/src/vite/moduleSummary.js +40 -0
  664. package/dist/src/vite/nearestToken.d.ts +50 -0
  665. package/dist/src/vite/nearestToken.js +295 -0
  666. package/dist/src/vite/originGuard.d.ts +87 -0
  667. package/dist/src/vite/originGuard.js +163 -0
  668. package/dist/src/vite/packedModule.d.ts +40 -0
  669. package/dist/src/vite/packedModule.js +74 -0
  670. package/dist/src/vite/pages.d.ts +63 -10
  671. package/dist/src/vite/pages.js +264 -33
  672. package/dist/src/vite/parsedFiles.d.ts +18 -0
  673. package/dist/src/vite/parsedFiles.js +91 -0
  674. package/dist/src/vite/plainGrammars.d.ts +20 -0
  675. package/dist/src/vite/plainGrammars.js +113 -0
  676. package/dist/src/vite/pluginConfig.d.ts +47 -0
  677. package/dist/src/vite/pluginConfig.js +220 -0
  678. package/dist/src/vite/pluginIds.d.ts +20 -0
  679. package/dist/src/vite/pluginIds.js +61 -0
  680. package/dist/src/vite/pluginModules.d.ts +140 -0
  681. package/dist/src/vite/pluginModules.js +176 -0
  682. package/dist/src/vite/prebundled.d.ts +18 -5
  683. package/dist/src/vite/prebundled.js +28 -18
  684. package/dist/src/vite/previewPages.d.ts +14 -0
  685. package/dist/src/vite/previewPages.js +81 -0
  686. package/dist/src/vite/previewRoute.d.ts +8 -0
  687. package/dist/src/vite/previewRoute.js +8 -0
  688. package/dist/src/vite/previewRunner.d.ts +56 -0
  689. package/dist/src/vite/previewRunner.js +207 -0
  690. package/dist/src/vite/propDocs.d.ts +60 -0
  691. package/dist/src/vite/propDocs.js +387 -0
  692. package/dist/src/vite/searchModule.d.ts +40 -0
  693. package/dist/src/vite/searchModule.js +212 -0
  694. package/dist/src/vite/searchRoute.d.ts +7 -0
  695. package/dist/src/vite/searchRoute.js +79 -0
  696. package/dist/src/vite/serverConditions.d.ts +31 -0
  697. package/dist/src/vite/serverConditions.js +69 -0
  698. package/dist/src/vite/signatureDocs.d.ts +18 -0
  699. package/dist/src/vite/signatureDocs.js +64 -0
  700. package/dist/src/vite/sourceTokens.d.ts +57 -0
  701. package/dist/src/vite/sourceTokens.js +164 -0
  702. package/dist/src/vite/storyCode.d.ts +0 -1
  703. package/dist/src/vite/storyCode.js +2 -3
  704. package/dist/src/vite/storyExports.d.ts +32 -0
  705. package/dist/src/vite/storyExports.js +27 -0
  706. package/dist/src/vite/storyFilesModule.d.ts +56 -4
  707. package/dist/src/vite/storyFilesModule.js +122 -34
  708. package/dist/src/vite/storyMeta.d.ts +20 -11
  709. package/dist/src/vite/storyMeta.js +74 -38
  710. package/dist/src/vite/storyParse.d.ts +18 -0
  711. package/dist/src/vite/storyParse.js +20 -0
  712. package/dist/src/vite/storyPlay.d.ts +29 -0
  713. package/dist/src/vite/storyPlay.js +54 -0
  714. package/dist/src/vite/storyReach.d.ts +42 -0
  715. package/dist/src/vite/storyReach.js +43 -0
  716. package/dist/src/vite/storylessRoutes.d.ts +29 -0
  717. package/dist/src/vite/storylessRoutes.js +126 -0
  718. package/dist/src/vite/textModules.d.ts +63 -0
  719. package/dist/src/vite/textModules.js +132 -0
  720. package/dist/src/vite/textQueries.d.ts +20 -0
  721. package/dist/src/vite/textQueries.js +20 -0
  722. package/dist/src/vite/themeFromTokens.d.ts +35 -0
  723. package/dist/src/vite/themeFromTokens.js +73 -0
  724. package/dist/src/vite/tokenAnswers.d.ts +20 -0
  725. package/dist/src/vite/tokenAnswers.js +86 -0
  726. package/dist/src/vite/tokenClashes.d.ts +44 -0
  727. package/dist/src/vite/tokenClashes.js +45 -0
  728. package/dist/src/vite/touchMedia.d.ts +0 -1
  729. package/dist/src/vite/touchMedia.js +0 -1
  730. package/dist/src/vite/typeScriptPieces.d.ts +0 -1
  731. package/dist/src/vite/typeScriptPieces.js +2 -3
  732. package/dist/src/vite/usageGraph.d.ts +6 -1
  733. package/dist/src/vite/usageGraph.js +41 -7
  734. package/dist/src/vite/usageGuidance.d.ts +33 -0
  735. package/dist/src/vite/usageGuidance.js +45 -0
  736. package/dist/src/vite/usageModule.d.ts +0 -1
  737. package/dist/src/vite/usageModule.js +0 -1
  738. package/dist/src/vite/vitePaths.d.ts +53 -0
  739. package/dist/src/vite/vitePaths.js +53 -0
  740. package/dist/src/worstCase.d.ts +0 -1
  741. package/dist/src/worstCase.js +0 -1
  742. package/package.json +68 -5
  743. package/dist/bin/forgebook/agentClient.d.ts.map +0 -1
  744. package/dist/bin/forgebook/agentClient.js.map +0 -1
  745. package/dist/bin/forgebook/agentLoopCommands.d.mts.map +0 -1
  746. package/dist/bin/forgebook/agentLoopCommands.mjs.map +0 -1
  747. package/dist/bin/forgebook/agentText.d.ts.map +0 -1
  748. package/dist/bin/forgebook/agentText.js.map +0 -1
  749. package/dist/bin/forgebook/agentsText.d.ts.map +0 -1
  750. package/dist/bin/forgebook/agentsText.js.map +0 -1
  751. package/dist/bin/forgebook/catalogueCommands.d.ts.map +0 -1
  752. package/dist/bin/forgebook/catalogueCommands.js.map +0 -1
  753. package/dist/bin/forgebook/catalogueVite.d.ts.map +0 -1
  754. package/dist/bin/forgebook/catalogueVite.js.map +0 -1
  755. package/dist/bin/forgebook/errorsRun.d.ts.map +0 -1
  756. package/dist/bin/forgebook/errorsRun.js.map +0 -1
  757. package/dist/bin/forgebook/forgebook.d.mts.map +0 -1
  758. package/dist/bin/forgebook/forgebook.mjs.map +0 -1
  759. package/dist/bin/forgebook/importers/storybook.d.ts.map +0 -1
  760. package/dist/bin/forgebook/importers/storybook.js.map +0 -1
  761. package/dist/bin/forgebook/initCommands.d.mts.map +0 -1
  762. package/dist/bin/forgebook/initCommands.mjs.map +0 -1
  763. package/dist/bin/forgebook/initConfig.d.ts.map +0 -1
  764. package/dist/bin/forgebook/initConfig.js.map +0 -1
  765. package/dist/bin/forgebook/mcpTools.d.ts.map +0 -1
  766. package/dist/bin/forgebook/mcpTools.js.map +0 -1
  767. package/dist/bin/forgebook/newStories.d.ts.map +0 -1
  768. package/dist/bin/forgebook/newStories.js.map +0 -1
  769. package/dist/bin/forgebook/newStoriesFile.d.ts.map +0 -1
  770. package/dist/bin/forgebook/newStoriesFile.js.map +0 -1
  771. package/dist/bin/forgebook/storyCheckRun.d.ts.map +0 -1
  772. package/dist/bin/forgebook/storyCheckRun.js.map +0 -1
  773. package/dist/bin/forgebook/touchWindowRun.d.ts.map +0 -1
  774. package/dist/bin/forgebook/touchWindowRun.js.map +0 -1
  775. package/dist/bin/forgebook-docs/catalogueDocs.d.ts.map +0 -1
  776. package/dist/bin/forgebook-docs/catalogueDocs.js.map +0 -1
  777. package/dist/bin/forgebook-docs/catalogueDocs.types.d.ts.map +0 -1
  778. package/dist/bin/forgebook-docs/catalogueDocs.types.js.map +0 -1
  779. package/dist/bin/forgebook-docs/catalogueMarkdown.d.ts.map +0 -1
  780. package/dist/bin/forgebook-docs/catalogueMarkdown.js.map +0 -1
  781. package/dist/bin/forgebook-docs/catalogueOptions.d.ts.map +0 -1
  782. package/dist/bin/forgebook-docs/catalogueOptions.js.map +0 -1
  783. package/dist/bin/forgebook-docs/collectDocs.d.ts.map +0 -1
  784. package/dist/bin/forgebook-docs/collectDocs.js.map +0 -1
  785. package/dist/bin/forgebook-docs/forgebook-docs.d.mts.map +0 -1
  786. package/dist/bin/forgebook-docs/forgebook-docs.mjs.map +0 -1
  787. package/dist/bin/forgebook-docs/llmsText.d.ts.map +0 -1
  788. package/dist/bin/forgebook-docs/llmsText.js.map +0 -1
  789. package/dist/bin/forgebook-docs/moduleDocs.d.ts.map +0 -1
  790. package/dist/bin/forgebook-docs/moduleDocs.js.map +0 -1
  791. package/dist/bin/forgebook-docs/sassDocs.d.ts.map +0 -1
  792. package/dist/bin/forgebook-docs/sassDocs.js.map +0 -1
  793. package/dist/bin/forgebook-docs/sourceId.d.ts +0 -9
  794. package/dist/bin/forgebook-docs/sourceId.d.ts.map +0 -1
  795. package/dist/bin/forgebook-docs/sourceId.js +0 -45
  796. package/dist/bin/forgebook-docs/sourceId.js.map +0 -1
  797. package/dist/bin/forgebook-texts/forgebook-texts.d.mts.map +0 -1
  798. package/dist/bin/forgebook-texts/forgebook-texts.mjs.map +0 -1
  799. package/dist/bin/forgebook-texts/storyTextsReport.d.ts.map +0 -1
  800. package/dist/bin/forgebook-texts/storyTextsReport.js.map +0 -1
  801. package/dist/bin/forgebook-texts/storyTextsReport.types.d.ts.map +0 -1
  802. package/dist/bin/forgebook-texts/storyTextsReport.types.js.map +0 -1
  803. package/dist/bin/frameworkDocs.d.ts.map +0 -1
  804. package/dist/bin/frameworkDocs.js.map +0 -1
  805. package/dist/src/a11y.d.ts.map +0 -1
  806. package/dist/src/a11y.js.map +0 -1
  807. package/dist/src/argTypes.d.ts.map +0 -1
  808. package/dist/src/argTypes.js.map +0 -1
  809. package/dist/src/backdrops.d.ts.map +0 -1
  810. package/dist/src/backdrops.js.map +0 -1
  811. package/dist/src/catalogue.d.ts.map +0 -1
  812. package/dist/src/catalogue.js.map +0 -1
  813. package/dist/src/componentDocs.d.ts.map +0 -1
  814. package/dist/src/componentDocs.js.map +0 -1
  815. package/dist/src/controlKeys.d.ts.map +0 -1
  816. package/dist/src/controlKeys.js.map +0 -1
  817. package/dist/src/frame/checkStory.d.ts.map +0 -1
  818. package/dist/src/frame/checkStory.js.map +0 -1
  819. package/dist/src/frame/frameClock.d.ts.map +0 -1
  820. package/dist/src/frame/frameClock.js.map +0 -1
  821. package/dist/src/frame/frameStatus.d.ts.map +0 -1
  822. package/dist/src/frame/frameStatus.js.map +0 -1
  823. package/dist/src/frame/frameView.d.ts.map +0 -1
  824. package/dist/src/frame/frameView.js.map +0 -1
  825. package/dist/src/frame/matrixLayout.d.ts.map +0 -1
  826. package/dist/src/frame/matrixLayout.js.map +0 -1
  827. package/dist/src/frame/measureTools.d.ts.map +0 -1
  828. package/dist/src/frame/measureTools.js.map +0 -1
  829. package/dist/src/frame/mountFrame.d.ts.map +0 -1
  830. package/dist/src/frame/mountFrame.js.map +0 -1
  831. package/dist/src/frame/playStory.d.ts.map +0 -1
  832. package/dist/src/frame/playStory.js.map +0 -1
  833. package/dist/src/frame/renderer.d.ts.map +0 -1
  834. package/dist/src/frame/renderer.js.map +0 -1
  835. package/dist/src/frame/settle.d.ts.map +0 -1
  836. package/dist/src/frame/settle.js.map +0 -1
  837. package/dist/src/frame/spillOutline.d.ts.map +0 -1
  838. package/dist/src/frame/spillOutline.js.map +0 -1
  839. package/dist/src/frame/staleModule.d.ts.map +0 -1
  840. package/dist/src/frame/staleModule.js.map +0 -1
  841. package/dist/src/frame/storyCanvas.d.ts.map +0 -1
  842. package/dist/src/frame/storyCanvas.js.map +0 -1
  843. package/dist/src/frame/storyHooks.d.ts.map +0 -1
  844. package/dist/src/frame/storyHooks.js.map +0 -1
  845. package/dist/src/frame/storyModule.d.ts.map +0 -1
  846. package/dist/src/frame/storyModule.js.map +0 -1
  847. package/dist/src/frame/storyRun.d.ts.map +0 -1
  848. package/dist/src/frame/storyRun.js.map +0 -1
  849. package/dist/src/frame/touchDots.d.ts.map +0 -1
  850. package/dist/src/frame/touchDots.js.map +0 -1
  851. package/dist/src/frame/touchEvents.d.ts.map +0 -1
  852. package/dist/src/frame/touchEvents.js.map +0 -1
  853. package/dist/src/frame/touchGesture.d.ts.map +0 -1
  854. package/dist/src/frame/touchGesture.js.map +0 -1
  855. package/dist/src/frame/touchLayer.d.ts.map +0 -1
  856. package/dist/src/frame/touchLayer.js.map +0 -1
  857. package/dist/src/frame/touchScroll.d.ts.map +0 -1
  858. package/dist/src/frame/touchScroll.js.map +0 -1
  859. package/dist/src/languages.d.ts.map +0 -1
  860. package/dist/src/languages.js.map +0 -1
  861. package/dist/src/liveErrors.d.ts.map +0 -1
  862. package/dist/src/liveErrors.js.map +0 -1
  863. package/dist/src/matrix.d.ts.map +0 -1
  864. package/dist/src/matrix.js.map +0 -1
  865. package/dist/src/messages.d.ts.map +0 -1
  866. package/dist/src/messages.js.map +0 -1
  867. package/dist/src/namedValues.d.ts.map +0 -1
  868. package/dist/src/namedValues.js.map +0 -1
  869. package/dist/src/namedViews.d.ts.map +0 -1
  870. package/dist/src/namedViews.js.map +0 -1
  871. package/dist/src/pageConfig.d.ts.map +0 -1
  872. package/dist/src/pageConfig.js.map +0 -1
  873. package/dist/src/playTrace.d.ts.map +0 -1
  874. package/dist/src/playTrace.js.map +0 -1
  875. package/dist/src/realTouch.d.ts.map +0 -1
  876. package/dist/src/realTouch.js.map +0 -1
  877. package/dist/src/shell/A11yTab.d.ts.map +0 -1
  878. package/dist/src/shell/A11yTab.js.map +0 -1
  879. package/dist/src/shell/ApiReference.d.ts.map +0 -1
  880. package/dist/src/shell/ApiReference.js.map +0 -1
  881. package/dist/src/shell/AppearanceMenu.d.ts.map +0 -1
  882. package/dist/src/shell/AppearanceMenu.js.map +0 -1
  883. package/dist/src/shell/BoxWidth.d.ts.map +0 -1
  884. package/dist/src/shell/BoxWidth.js.map +0 -1
  885. package/dist/src/shell/ClockControls.d.ts.map +0 -1
  886. package/dist/src/shell/ClockControls.js.map +0 -1
  887. package/dist/src/shell/Code.d.ts.map +0 -1
  888. package/dist/src/shell/Code.js.map +0 -1
  889. package/dist/src/shell/CodeTab.d.ts.map +0 -1
  890. package/dist/src/shell/CodeTab.js.map +0 -1
  891. package/dist/src/shell/CodeText.d.ts.map +0 -1
  892. package/dist/src/shell/CodeText.js.map +0 -1
  893. package/dist/src/shell/ComponentPage.d.ts.map +0 -1
  894. package/dist/src/shell/ComponentPage.js.map +0 -1
  895. package/dist/src/shell/ControlKeyField.d.ts.map +0 -1
  896. package/dist/src/shell/ControlKeyField.js.map +0 -1
  897. package/dist/src/shell/ControlRow.d.ts.map +0 -1
  898. package/dist/src/shell/ControlRow.js.map +0 -1
  899. package/dist/src/shell/Dock.d.ts.map +0 -1
  900. package/dist/src/shell/Dock.js.map +0 -1
  901. package/dist/src/shell/EventsTab.d.ts.map +0 -1
  902. package/dist/src/shell/EventsTab.js.map +0 -1
  903. package/dist/src/shell/Example.d.ts.map +0 -1
  904. package/dist/src/shell/Example.js.map +0 -1
  905. package/dist/src/shell/FrameView.d.ts.map +0 -1
  906. package/dist/src/shell/FrameView.js.map +0 -1
  907. package/dist/src/shell/HomePage.d.ts.map +0 -1
  908. package/dist/src/shell/HomePage.js.map +0 -1
  909. package/dist/src/shell/InfoTip.d.ts.map +0 -1
  910. package/dist/src/shell/InfoTip.js.map +0 -1
  911. package/dist/src/shell/InteractionsTab.d.ts.map +0 -1
  912. package/dist/src/shell/InteractionsTab.js.map +0 -1
  913. package/dist/src/shell/LogicMark.d.ts.map +0 -1
  914. package/dist/src/shell/LogicMark.js.map +0 -1
  915. package/dist/src/shell/MatrixPicker.d.ts.map +0 -1
  916. package/dist/src/shell/MatrixPicker.js.map +0 -1
  917. package/dist/src/shell/NamedViews.d.ts.map +0 -1
  918. package/dist/src/shell/NamedViews.js.map +0 -1
  919. package/dist/src/shell/PackageHtml.d.ts.map +0 -1
  920. package/dist/src/shell/PackageHtml.js.map +0 -1
  921. package/dist/src/shell/PartsTab.d.ts.map +0 -1
  922. package/dist/src/shell/PartsTab.js.map +0 -1
  923. package/dist/src/shell/PinnedControl.d.ts.map +0 -1
  924. package/dist/src/shell/PinnedControl.js.map +0 -1
  925. package/dist/src/shell/PropFields.d.ts.map +0 -1
  926. package/dist/src/shell/PropFields.js.map +0 -1
  927. package/dist/src/shell/PropsTab.d.ts.map +0 -1
  928. package/dist/src/shell/PropsTab.js.map +0 -1
  929. package/dist/src/shell/Segmented.d.ts.map +0 -1
  930. package/dist/src/shell/Segmented.js.map +0 -1
  931. package/dist/src/shell/Shell.d.ts.map +0 -1
  932. package/dist/src/shell/Shell.js.map +0 -1
  933. package/dist/src/shell/Sidebar.d.ts.map +0 -1
  934. package/dist/src/shell/Sidebar.js.map +0 -1
  935. package/dist/src/shell/SidebarEntries.d.ts.map +0 -1
  936. package/dist/src/shell/SidebarEntries.js.map +0 -1
  937. package/dist/src/shell/SidebarHandle.d.ts.map +0 -1
  938. package/dist/src/shell/SidebarHandle.js.map +0 -1
  939. package/dist/src/shell/SignatureReference.d.ts.map +0 -1
  940. package/dist/src/shell/SignatureReference.js.map +0 -1
  941. package/dist/src/shell/Stage.d.ts.map +0 -1
  942. package/dist/src/shell/Stage.js.map +0 -1
  943. package/dist/src/shell/StageTools.d.ts.map +0 -1
  944. package/dist/src/shell/StageTools.js.map +0 -1
  945. package/dist/src/shell/StageViewport.d.ts.map +0 -1
  946. package/dist/src/shell/StageViewport.js.map +0 -1
  947. package/dist/src/shell/StoryCodeBlock.d.ts.map +0 -1
  948. package/dist/src/shell/StoryCodeBlock.js.map +0 -1
  949. package/dist/src/shell/StoryPicker.d.ts.map +0 -1
  950. package/dist/src/shell/StoryPicker.js.map +0 -1
  951. package/dist/src/shell/Toolbar.d.ts.map +0 -1
  952. package/dist/src/shell/Toolbar.js.map +0 -1
  953. package/dist/src/shell/ToolbarControl.d.ts.map +0 -1
  954. package/dist/src/shell/ToolbarControl.js.map +0 -1
  955. package/dist/src/shell/UsedIn.d.ts.map +0 -1
  956. package/dist/src/shell/UsedIn.js.map +0 -1
  957. package/dist/src/shell/ViewMenu.d.ts.map +0 -1
  958. package/dist/src/shell/ViewMenu.js.map +0 -1
  959. package/dist/src/shell/WidthField.d.ts.map +0 -1
  960. package/dist/src/shell/WidthField.js.map +0 -1
  961. package/dist/src/shell/catalogueContext.d.ts.map +0 -1
  962. package/dist/src/shell/catalogueContext.js.map +0 -1
  963. package/dist/src/shell/codeTokens.d.ts.map +0 -1
  964. package/dist/src/shell/codeTokens.js.map +0 -1
  965. package/dist/src/shell/codeWriter.d.ts.map +0 -1
  966. package/dist/src/shell/codeWriter.js.map +0 -1
  967. package/dist/src/shell/compareVariants.d.ts.map +0 -1
  968. package/dist/src/shell/compareVariants.js.map +0 -1
  969. package/dist/src/shell/controlCycle.d.ts.map +0 -1
  970. package/dist/src/shell/controlCycle.js.map +0 -1
  971. package/dist/src/shell/dockTabs.d.ts.map +0 -1
  972. package/dist/src/shell/dockTabs.js.map +0 -1
  973. package/dist/src/shell/icons.d.ts.map +0 -1
  974. package/dist/src/shell/icons.js.map +0 -1
  975. package/dist/src/shell/keyboard.d.ts.map +0 -1
  976. package/dist/src/shell/keyboard.js.map +0 -1
  977. package/dist/src/shell/logicView.d.ts.map +0 -1
  978. package/dist/src/shell/logicView.js.map +0 -1
  979. package/dist/src/shell/mountShell.d.ts.map +0 -1
  980. package/dist/src/shell/mountShell.js.map +0 -1
  981. package/dist/src/shell/storyTouch.d.ts.map +0 -1
  982. package/dist/src/shell/storyTouch.js.map +0 -1
  983. package/dist/src/shell/strings.d.ts.map +0 -1
  984. package/dist/src/shell/strings.js.map +0 -1
  985. package/dist/src/shell/switchView.d.ts.map +0 -1
  986. package/dist/src/shell/switchView.js.map +0 -1
  987. package/dist/src/shell/treeSearch.d.ts.map +0 -1
  988. package/dist/src/shell/treeSearch.js.map +0 -1
  989. package/dist/src/shell/useAppearance.d.ts.map +0 -1
  990. package/dist/src/shell/useAppearance.js.map +0 -1
  991. package/dist/src/shell/useComponentDocs.d.ts.map +0 -1
  992. package/dist/src/shell/useComponentDocs.js.map +0 -1
  993. package/dist/src/shell/useControlKeys.d.ts.map +0 -1
  994. package/dist/src/shell/useControlKeys.js.map +0 -1
  995. package/dist/src/shell/useCopy.d.ts.map +0 -1
  996. package/dist/src/shell/useCopy.js.map +0 -1
  997. package/dist/src/shell/useFold.d.ts.map +0 -1
  998. package/dist/src/shell/useFold.js.map +0 -1
  999. package/dist/src/shell/useFrameMessages.d.ts.map +0 -1
  1000. package/dist/src/shell/useFrameMessages.js.map +0 -1
  1001. package/dist/src/shell/useFrameQueue.d.ts.map +0 -1
  1002. package/dist/src/shell/useFrameQueue.js.map +0 -1
  1003. package/dist/src/shell/useFullPage.d.ts.map +0 -1
  1004. package/dist/src/shell/useFullPage.js.map +0 -1
  1005. package/dist/src/shell/useLiveView.d.ts.map +0 -1
  1006. package/dist/src/shell/useLiveView.js.map +0 -1
  1007. package/dist/src/shell/useLoaded.d.ts.map +0 -1
  1008. package/dist/src/shell/useLoaded.js.map +0 -1
  1009. package/dist/src/shell/usePageDoc.d.ts.map +0 -1
  1010. package/dist/src/shell/usePageDoc.js.map +0 -1
  1011. package/dist/src/shell/usePopover.d.ts.map +0 -1
  1012. package/dist/src/shell/usePopover.js.map +0 -1
  1013. package/dist/src/shell/useRecentPages.d.ts.map +0 -1
  1014. package/dist/src/shell/useRecentPages.js.map +0 -1
  1015. package/dist/src/shell/useScrollMemory.d.ts.map +0 -1
  1016. package/dist/src/shell/useScrollMemory.js.map +0 -1
  1017. package/dist/src/shell/useShownView.d.ts.map +0 -1
  1018. package/dist/src/shell/useShownView.js.map +0 -1
  1019. package/dist/src/shell/useSidebarLayout.d.ts.map +0 -1
  1020. package/dist/src/shell/useSidebarLayout.js.map +0 -1
  1021. package/dist/src/shell/useStored.d.ts.map +0 -1
  1022. package/dist/src/shell/useStored.js.map +0 -1
  1023. package/dist/src/shell/useStoryCode.d.ts.map +0 -1
  1024. package/dist/src/shell/useStoryCode.js.map +0 -1
  1025. package/dist/src/shell/useStoryHeights.d.ts.map +0 -1
  1026. package/dist/src/shell/useStoryHeights.js.map +0 -1
  1027. package/dist/src/shell/useStoryIdsElement.d.ts.map +0 -1
  1028. package/dist/src/shell/useStoryIdsElement.js.map +0 -1
  1029. package/dist/src/shell/useStoryKeys.d.ts.map +0 -1
  1030. package/dist/src/shell/useStoryKeys.js.map +0 -1
  1031. package/dist/src/shell/useSystemDark.d.ts.map +0 -1
  1032. package/dist/src/shell/useSystemDark.js.map +0 -1
  1033. package/dist/src/shell/useToolbarLayout.d.ts.map +0 -1
  1034. package/dist/src/shell/useToolbarLayout.js.map +0 -1
  1035. package/dist/src/shell/useToolbarOverflow.d.ts.map +0 -1
  1036. package/dist/src/shell/useToolbarOverflow.js.map +0 -1
  1037. package/dist/src/shell/useWorstCase.d.ts.map +0 -1
  1038. package/dist/src/shell/useWorstCase.js.map +0 -1
  1039. package/dist/src/shell/worstArgs.d.ts.map +0 -1
  1040. package/dist/src/shell/worstArgs.js.map +0 -1
  1041. package/dist/src/sourceFiles.d.ts.map +0 -1
  1042. package/dist/src/sourceFiles.js.map +0 -1
  1043. package/dist/src/spills.d.ts.map +0 -1
  1044. package/dist/src/spills.js.map +0 -1
  1045. package/dist/src/storyBackground.d.ts.map +0 -1
  1046. package/dist/src/storyBackground.js.map +0 -1
  1047. package/dist/src/storyCheck.d.ts.map +0 -1
  1048. package/dist/src/storyCheck.js.map +0 -1
  1049. package/dist/src/storyClock.d.ts.map +0 -1
  1050. package/dist/src/storyClock.js.map +0 -1
  1051. package/dist/src/storyGlobals.d.ts.map +0 -1
  1052. package/dist/src/storyGlobals.js.map +0 -1
  1053. package/dist/src/storyHeights.d.ts.map +0 -1
  1054. package/dist/src/storyHeights.js.map +0 -1
  1055. package/dist/src/storyIdsElement.d.ts.map +0 -1
  1056. package/dist/src/storyIdsElement.js.map +0 -1
  1057. package/dist/src/storyTexts.d.ts.map +0 -1
  1058. package/dist/src/storyTexts.js.map +0 -1
  1059. package/dist/src/storyTree.d.ts.map +0 -1
  1060. package/dist/src/storyTree.js.map +0 -1
  1061. package/dist/src/switches.d.ts.map +0 -1
  1062. package/dist/src/switches.js.map +0 -1
  1063. package/dist/src/toolbarLayout.d.ts.map +0 -1
  1064. package/dist/src/toolbarLayout.js.map +0 -1
  1065. package/dist/src/usedIn.d.ts.map +0 -1
  1066. package/dist/src/usedIn.js.map +0 -1
  1067. package/dist/src/viewState.d.ts.map +0 -1
  1068. package/dist/src/viewState.js.map +0 -1
  1069. package/dist/src/viewWords.d.ts.map +0 -1
  1070. package/dist/src/viewWords.js.map +0 -1
  1071. package/dist/src/vite/adapter.d.ts.map +0 -1
  1072. package/dist/src/vite/adapter.js.map +0 -1
  1073. package/dist/src/vite/agent.types.d.ts.map +0 -1
  1074. package/dist/src/vite/agent.types.js.map +0 -1
  1075. package/dist/src/vite/agentApi.d.ts.map +0 -1
  1076. package/dist/src/vite/agentApi.js.map +0 -1
  1077. package/dist/src/vite/agentRoutes.d.ts.map +0 -1
  1078. package/dist/src/vite/agentRoutes.js.map +0 -1
  1079. package/dist/src/vite/autoTitle.d.ts.map +0 -1
  1080. package/dist/src/vite/autoTitle.js.map +0 -1
  1081. package/dist/src/vite/componentPage.d.ts.map +0 -1
  1082. package/dist/src/vite/componentPage.js.map +0 -1
  1083. package/dist/src/vite/config.d.ts.map +0 -1
  1084. package/dist/src/vite/config.js.map +0 -1
  1085. package/dist/src/vite/configFile.d.ts.map +0 -1
  1086. package/dist/src/vite/configFile.js.map +0 -1
  1087. package/dist/src/vite/docsExtractor.d.ts.map +0 -1
  1088. package/dist/src/vite/docsExtractor.js.map +0 -1
  1089. package/dist/src/vite/docsProgram.d.ts.map +0 -1
  1090. package/dist/src/vite/docsProgram.js.map +0 -1
  1091. package/dist/src/vite/docsWorker.d.ts.map +0 -1
  1092. package/dist/src/vite/docsWorker.js.map +0 -1
  1093. package/dist/src/vite/forcedStates.d.ts.map +0 -1
  1094. package/dist/src/vite/forcedStates.js.map +0 -1
  1095. package/dist/src/vite/forgebookPlugin.d.ts.map +0 -1
  1096. package/dist/src/vite/forgebookPlugin.js.map +0 -1
  1097. package/dist/src/vite/heightsRoute.d.ts.map +0 -1
  1098. package/dist/src/vite/heightsRoute.js.map +0 -1
  1099. package/dist/src/vite/highlightCode.d.ts.map +0 -1
  1100. package/dist/src/vite/highlightCode.js.map +0 -1
  1101. package/dist/src/vite/indexStoryFile.d.ts.map +0 -1
  1102. package/dist/src/vite/indexStoryFile.js.map +0 -1
  1103. package/dist/src/vite/mcpProtocol.d.ts.map +0 -1
  1104. package/dist/src/vite/mcpProtocol.js.map +0 -1
  1105. package/dist/src/vite/pages.d.ts.map +0 -1
  1106. package/dist/src/vite/pages.js.map +0 -1
  1107. package/dist/src/vite/prebundled.d.ts.map +0 -1
  1108. package/dist/src/vite/prebundled.js.map +0 -1
  1109. package/dist/src/vite/storyCode.d.ts.map +0 -1
  1110. package/dist/src/vite/storyCode.js.map +0 -1
  1111. package/dist/src/vite/storyFilesModule.d.ts.map +0 -1
  1112. package/dist/src/vite/storyFilesModule.js.map +0 -1
  1113. package/dist/src/vite/storyMeta.d.ts.map +0 -1
  1114. package/dist/src/vite/storyMeta.js.map +0 -1
  1115. package/dist/src/vite/touchMedia.d.ts.map +0 -1
  1116. package/dist/src/vite/touchMedia.js.map +0 -1
  1117. package/dist/src/vite/typeScriptPieces.d.ts.map +0 -1
  1118. package/dist/src/vite/typeScriptPieces.js.map +0 -1
  1119. package/dist/src/vite/usageGraph.d.ts.map +0 -1
  1120. package/dist/src/vite/usageGraph.js.map +0 -1
  1121. package/dist/src/vite/usageModule.d.ts.map +0 -1
  1122. package/dist/src/vite/usageModule.js.map +0 -1
  1123. package/dist/src/worstCase.d.ts.map +0 -1
  1124. package/dist/src/worstCase.js.map +0 -1
package/README.md CHANGED
@@ -1,3 +1,5 @@
1
+ <a href="https://forgebook.dev"><img src="https://forgebook.dev/logo.svg" alt="Forgebook" width="64" height="64"></a>
2
+
1
3
  # Forgebook
2
4
 
3
5
  See every component in every theme, contrast, language and width. Write CSF stories, run `forgebook dev`: one frame
@@ -7,20 +9,44 @@ per story, switches for theme, contrast, motion and language, and a props table
7
9
  > and every change is in the
8
10
  > [changelog](https://github.com/ensiria/forgebook/blob/develop/packages/forgebook/CHANGELOG.md).
9
11
 
10
- **Requirements:** Node 22.18 or later · Vite 8 (the catalogue is built on it; other bundlers are not supported) · React 19 today, through
11
- [`@forgebook/react`](https://www.npmjs.com/package/@forgebook/react); other frameworks plug in through the same
12
- adapter (the catalogue's own interface is React either way) · npm, pnpm, yarn or bun ·
12
+ **Requirements:** Node 22.18 or later · Vite 8 (the catalogue is built on it; other bundlers are not supported) · React 19 through
13
+ [`@forgebook/react`](https://www.npmjs.com/package/@forgebook/react), Vue 3.5 through
14
+ [`@forgebook/vue`](https://www.npmjs.com/package/@forgebook/vue) (a Nuxt project's through
15
+ [`@forgebook/nuxt`](https://www.npmjs.com/package/@forgebook/nuxt)), Svelte 5 through
16
+ [`@forgebook/svelte`](https://www.npmjs.com/package/@forgebook/svelte) (a SvelteKit app's through
17
+ [`@forgebook/sveltekit`](https://www.npmjs.com/package/@forgebook/sveltekit)), Solid 1.9 through
18
+ [`@forgebook/solid`](https://www.npmjs.com/package/@forgebook/solid), Preact 10.19 or 11 through
19
+ [`@forgebook/preact`](https://www.npmjs.com/package/@forgebook/preact), Web Components with Lit 3 through
20
+ [`@forgebook/web-components`](https://www.npmjs.com/package/@forgebook/web-components), Angular 20 to 22 (Analog
21
+ included) through [`@forgebook/angular`](https://www.npmjs.com/package/@forgebook/angular), a Next.js project's
22
+ components through [`@forgebook/nextjs`](https://www.npmjs.com/package/@forgebook/nextjs), React Native through
23
+ react-native-web with [`@forgebook/react-native-web`](https://www.npmjs.com/package/@forgebook/react-native-web), or no
24
+ framework at all
25
+ through [`@forgebook/html`](https://www.npmjs.com/package/@forgebook/html) (stories that return an HTML string or a DOM
26
+ node); other frameworks plug in through the same adapter (the catalogue's own interface is React either way, and the
27
+ frame of a story in another framework loads none) · npm, pnpm, yarn or bun ·
13
28
  [MIT licence](https://github.com/ensiria/forgebook/blob/develop/packages/forgebook/LICENSE)
14
29
 
15
30
  ## Install
16
31
 
17
32
  In a project with React and Vite, both packages: `forgebook` is the catalogue, `@forgebook/react` the adapter it draws
18
- React components with.
33
+ React components with. On Vue, Svelte, Solid, Preact or Angular, `@forgebook/vue`, `@forgebook/svelte`,
34
+ `@forgebook/solid`, `@forgebook/preact` or `@forgebook/angular` takes its place, `@forgebook/nuxt` in a Nuxt project,
35
+ `@forgebook/sveltekit` in a SvelteKit app,
36
+ `@forgebook/web-components` for custom elements, and `@forgebook/html` for stories written in plain JavaScript or
37
+ TypeScript with no framework: each README has the configuration and the stories.
19
38
 
20
39
  ```sh
21
40
  npm install --save-dev forgebook @forgebook/react
22
41
  ```
23
42
 
43
+ What Forgebook keeps between runs lives in `node_modules/.vite`, beside Vite's pre-bundled dependencies: Node's compile
44
+ cache of the `forgebook` command in `node_modules/.vite/forgebook/compile`, and what a dev server read of the stories in
45
+ `node_modules/.vite/forgebook/{docs,usage,code,index}`: each component's props, "Used in", a story file's code and the
46
+ sidebar's index, kept with the files they were read from, so a later start answers without reading the components with
47
+ TypeScript until one of those files, a configuration or the lock file changes. Removing `node_modules/.vite` starts from
48
+ nothing.
49
+
24
50
  ## A first catalogue
25
51
 
26
52
  A component, with its props typed and documented:
@@ -84,6 +110,13 @@ Badge's page shows its stories, each in its own frame, and an API table read fro
84
110
  ## What a catalogue gives you
85
111
 
86
112
  - **One frame per story**, so a story's styles and globals never leak into another, and its address opens it alone.
113
+ - **Edits drawn in place**: an edited story file, preview or component is drawn anew in its open frame, which keeps
114
+ what you did in the story (a typed field, an open menu); a story with a play, loaders or set-ups runs them again. An
115
+ edit that adds, renames or retitles a story reloads the pages, as an edit of an Angular story file does. On macOS
116
+ the files you work on (the story files the open frames show, and each file they load once you have edited it) are
117
+ watched one by one, so an edit reaches the page without the system's change events' wait of a tenth of a second or
118
+ more. Where the system's change events come late or never (a container's mounted volume, a Windows drive under WSL,
119
+ a network drive), `forgebook dev --poll` checks the files itself.
87
120
  - **Switches** for theme, contrast and motion, and the languages you declare; a library adds its own (density, brand)
88
121
  through a preset. A direction switch draws every story right to left, and a language declared `dir: "rtl"` does
89
122
  it by itself.
@@ -103,6 +136,14 @@ Badge's page shows its stories, each in its own frame, and an API table read fro
103
136
  switches (every theme at both contrasts), per text size or per style sheet, side by side.
104
137
  - **Props from the types**: the API table and the panel's controls come from the component's TypeScript props and
105
138
  their TSDoc, nothing written twice.
139
+ - **Props in groups**: a component with many props lists them under the groups their TSDoc names (`@group Paging`),
140
+ and a prop typed with a documented object (`texts?: FinderTexts`) unfolds to list its members
141
+ ([below](#props-in-groups)).
142
+ - **Shared values, checked**: the values set in the Props tab stay in the address (`args=`), so a link shares them.
143
+ Since whoever writes a link chooses them, a story receives only the props it declares (its component's props, its
144
+ `argTypes`, its own args) that the panel lets a person set, each with a value of that prop's type; anything else
145
+ (`onclick`, `innerHTML`, a text for a number) is left out and listed above the story, with a button that removes it
146
+ from the address. A value that is code never comes from a link.
106
147
  - **The worst case in one press**: the Props tab's Worst case button gives every text prop a long text with a word too
107
148
  long to break and every number a huge one, kept in the address; the elements that then spill out of their parents
108
149
  are outlined and counted, as the browser tests find them. Reset undoes it.
@@ -112,12 +153,18 @@ Badge's page shows its stories, each in its own frame, and an API table read fro
112
153
  component (Tree renders Row, Row renders DropLine), each with the stories to open; read from the types, never kept
113
154
  by hand. It shows only when there is such a use; a reader folds it away; `usedIn: false` in the configuration turns
114
155
  it off.
156
+ - **The design beside the code**: a component's or a story's Figma link gives it a link to Figma and, with
157
+ `@forgebook/plugin-figma`, a Design tab and a side-by-side view ([below](#design-links)).
115
158
  - **Interaction states and motion**: `:hover`, `:active`, `:focus`, `:focus-visible` and `:focus-within` forced on a
116
159
  story without a pointer; motion replayed on demand.
117
160
  - **Packages as sources**: a library ships its stories (`StorySource`), and an app's catalogue lists them beside its
118
- own, each with its name, logo and texts.
119
- - **`CATALOG.md`** for coding agents: `forgebook docs` writes one dense line per component, hook and helper of a
120
- package, from its exports, their TSDoc and its stories.
161
+ own, each with its name, logo, texts and design tokens.
162
+ - **Docs pages**: guides and foundations in Markdown, with live stories inside, in a section of their own above the
163
+ components ([below](#docs-pages)).
164
+ - **Search across everything**: `/` or ⌘K, and the words find docs pages, props, events, descriptions, stories and names
165
+ ([below](#search)).
166
+ - **`CATALOG.md`** for coding agents: `forgebook docs` writes one dense line per component, hook, helper, design token
167
+ and docs page of a package, from its exports, their TSDoc, its stories and its source.
121
168
  - **Tests from the stories**, with [`@forgebook/testing`](https://www.npmjs.com/package/@forgebook/testing): every
122
169
  story in the browser with axe, spills and overlays, screenshots, and every story rendered on the server.
123
170
 
@@ -126,7 +173,7 @@ It adds about a dozen packages to a React and Vite project.
126
173
  ## The toolbar
127
174
 
128
175
  The View menu holds every control: the catalogue's switches, and Forgebook's own (the background, the style sheets, the
129
- text size, the story's width). The catalogue says which start on the toolbar and which it does without; each reader
176
+ text size, the story's width, [who a page is read by](#who-reads-a-page)). The catalogue says which start on the toolbar and which it does without; each audience
130
177
  then pins, orders and hides them, and that arrangement stays in their browser, per catalogue, never in the address
131
178
  (a link shares the values, not someone's toolbar).
132
179
 
@@ -136,18 +183,27 @@ export default defineConfig({
136
183
  framework: react(),
137
184
  title: "My components",
138
185
  stories: ["src/**/*.stories.tsx"],
139
- // what starts on the toolbar, in this order: a switch's id, or "backdrop", "sheets", "text", "width"
186
+ // what starts on the toolbar, in this order: a switch's id, or "backdrop", "sheets", "text", "width", "audience"
140
187
  toolbar: ["theme", "contrast", "width", "text"],
141
188
  // Forgebook's own controls this catalogue does without (direction: false drops the direction switch)
142
189
  controls: { sheets: false }
143
190
  });
144
191
  ```
145
192
 
146
- Without `toolbar`, the colour scheme, the contrast and the width start there. A control turned off in `controls`
193
+ Without `toolbar`, the colour scheme, the contrast, the width and the device start there. A control turned off in `controls`
147
194
  shows nowhere, not even on the toolbar, and keeps its default (the width can still be dragged on the stage). A preset
148
195
  may set both; the catalogue's `toolbar` wins, and a control is off when any of them turns it off. A name in `toolbar`
149
196
  that is no control at all stops the catalogue with an error saying which.
150
197
 
198
+ The Background control offers Forgebook's five pictures and the catalogue's own:
199
+ `backgrounds: { builtIn: ["checkerboard"], custom: [{ id: "paper", label: "Paper", light: { color: "#fffdf5" } }] }`
200
+ keeps one picture and adds a plain paper colour (`layers` puts CSS backgrounds over it, `dark` sets another look for the
201
+ dark scheme). Code that reads the resolved settings (`catalogueSettings` from `forgebook/catalogue`) finds each in
202
+ `backdrops`, in one of two shapes. Forgebook's own is `{ kind: "builtIn", id, label, colors }`: only the frame draws its
203
+ picture, so the settings carry its colours, not its picture. A catalogue's is `{ kind: "own", id, label, colors, layers }`,
204
+ its picture being `layers`. `colors` and `layers` are both `{ light, dark }`. The colour under a backdrop in the dark
205
+ scheme is `backdrop.colors.dark`; a custom backdrop's CSS for the light one is `backdrop.layers.light`.
206
+
151
207
  ## Touch
152
208
 
153
209
  The Touch switch (in View, `m` by default) lets a story be tried as on a phone, from the computer:
@@ -176,6 +232,77 @@ Safari need a device. For real touch events and native scrolling, `forgebook dev
176
232
  Chromium window with Chromium's own touch emulation (it needs `@forgebook/testing` and Playwright, as `check` does).
177
233
  `controls: { touch: false }` takes the switch away.
178
234
 
235
+ ## Devices
236
+
237
+ At phone and tablet sizes a story can be shown inside a drawn device, as a browser's device mode shows a page. The
238
+ Device control (on the toolbar after the width, and in View beside Touch) says what is shown, "No frame" or the model,
239
+ turns the frame off or picks a model; while a device is shown, a button beside it turns it on its side, and the
240
+ width's presets wait, since the device sets the width. The story gets
241
+ the model's real viewport (its width and its height), the screen's rounded corners clip it, and the status bar, the
242
+ camera's cut and the home indicator sit over it where the device has them. The choice is in the address
243
+ (`forgebook.device=pixel-9&forgebook.orientation=landscape`, under Forgebook's name so a catalogue's own `device` or
244
+ `orientation` switch keeps its parameter), so a link shares it; the compare view puts a device in each cell. The
245
+ control's id, for a configuration's `toolbar` and `controls`, is the same: `controls: { "forgebook.device": false }`
246
+ takes it away (a story's own default still frames it).
247
+
248
+ A story in a device is touched with the catalogue's simulated finger, as a phone is (see Touch below): the reader can
249
+ turn that off for it, as for a story marked for a phone, and a device that should keep the mouse says
250
+ `touch: false`.
251
+
252
+ | Model | Id | Viewport |
253
+ |---|---|---|
254
+ | iPhone 16 | `iphone-16` | 393 × 852 |
255
+ | iPhone 16 Pro Max | `iphone-16-pro-max` | 440 × 956 |
256
+ | iPhone 16e | `iphone-16e` | 390 × 844 |
257
+ | Pixel 9 | `pixel-9` | 412 × 923 |
258
+ | Galaxy S24 | `galaxy-s24` | 360 × 780 |
259
+ | Generic phone | `phone` | 360 × 800 |
260
+ | iPad mini | `ipad-mini` | 744 × 1133 |
261
+ | iPad Pro 13″ | `ipad-pro-13` | 1032 × 1376 |
262
+
263
+ The story is drawn inside the device's safe areas, as a page in a phone's browser is: the status bar, the camera's cut
264
+ and the home indicator take their room around it (59 and 34 px on an iPhone 16 upright, the sides on its side), and
265
+ the story's viewport is what is left (393 × 759). A story that draws edge to edge, as a full-screen app does, says
266
+ `edgeToEdge: true`: it gets the whole screen, and the frame tells it the safe areas as custom properties on its root,
267
+ `--forgebook-safe-area-top`, `-right`, `-bottom` and `-left`, since browsers keep `env(safe-area-inset-*)` at zero in
268
+ a frame. Read them with the real insets as the fallback, so the same CSS works on a phone:
269
+
270
+ ```css
271
+ .screen {
272
+ padding-top: var(--forgebook-safe-area-top, env(safe-area-inset-top));
273
+ }
274
+ ```
275
+
276
+ An id names a model for good: it is never renamed or removed, and a new model gets a new id.
277
+
278
+ A story meant for a device says so, on its page and on its component's page:
279
+
280
+ ```tsx
281
+ export default {
282
+ title: "Screens/Settings",
283
+ component: Settings,
284
+ // every story of the file in an iPhone 16; a story's own fields win
285
+ parameters: { device: { frame: true, model: "iphone-16" } }
286
+ } satisfies Meta<typeof Settings>;
287
+
288
+ export const Landscape: Story<typeof Settings> = { parameters: { device: { orientation: "landscape" } } };
289
+
290
+ // under the status bar, padded with the safe areas the frame tells it
291
+ export const FullScreen: Story<typeof Settings> = { parameters: { device: { edgeToEdge: true } } };
292
+
293
+ // in the iPhone, with the mouse
294
+ export const Pointer: Story<typeof Settings> = { parameters: { device: { touch: false } } };
295
+ ```
296
+
297
+ A catalogue sets the default under every story with `device` in its configuration (`device: { model: "pixel-9" }`
298
+ only picks the model the button turns on). Nothing is framed for a catalogue and a story that set nothing. The reader's
299
+ choice wins over both: turned off, a framed story shows without its device.
300
+
301
+ The device is the shell's: the story's own document is the same, so the generated tests and `forgebook shot` stay
302
+ unframed, unless a view names a model (`forgebook shot <id> --view "iphone-16"`, or `"dark pixel-9 landscape"`), which
303
+ gives the picture framed (`portrait` and `landscape` need a model beside them; a catalogue's switch with a value
304
+ named like a model keeps the word, so write `forgebook.device=phone` then). The drawing and its styles load the first time a device is shown.
305
+
179
306
  ## Hooks and functions
180
307
 
181
308
  A story can be about logic, not looks: a small scene that uses a hook or a function, there to document and try what it
@@ -205,12 +332,378 @@ Compare: the story is drawn once, never compared. A section of its own is a titl
205
332
  first segment, as for any component (`Hooks/useUndo` is under Hooks; the source's `families` orders the sections).
206
333
  `@forgebook/testing` tests it once, not in every look, and takes no reference image of it.
207
334
 
335
+ ## Who reads a page
336
+
337
+ A component's page holds what a designer, a coder and a tester each want, in an order that suits none of them. **Reading
338
+ for**, in the View menu, draws the same page for one of them. It is not another page: the frames stay where they are and
339
+ keep their state, and what goes around them is reordered and filtered.
340
+
341
+ | Reading for | First | Left out | Added |
342
+ |---|---|---|---|
343
+ | Everyone | The page as it always was | Nothing | Nothing |
344
+ | Designers | When to use it, then a larger demo | Code, the API reference, the sections on parts and test ids | Docs pages that show it, its design tokens |
345
+ | Coders | The API reference, parts and styling | Nothing | Every example's code, open |
346
+ | Testers | What the stories cover: each story, its group, its play function, whether the generated tests run it | The API reference, sections that are not about testing, "Used in" | A check of every story's accessibility, on request |
347
+
348
+ The address keeps it (`?component=…&audience=designer`), so a link opens the page as it was read, and the page says so with
349
+ a way back to all of it; it is not part of a named view, which holds how stories are drawn. A catalogue can start with another audience, pin the control, give it a key or do without it:
350
+
351
+ ```ts
352
+ // forgebook.config.ts
353
+ export default defineConfig({
354
+ framework: react(),
355
+ title: "My components",
356
+ stories: ["src/**/*.stories.tsx"],
357
+ audience: "designer",
358
+ toolbar: ["theme", "audience"],
359
+ keys: { audience: "r" }
360
+ });
361
+ ```
362
+
363
+ With `controls: { audience: false }` the catalogue's `audience` is the only one, whatever an address says, and the page
364
+ offers no way back. Names change
365
+ through `strings` (`"audiences.coder": "Developers"`, and `"audienceTexts.coverage"` for what the pages add).
366
+
367
+ A designer's guidance comes from the component's TSDoc (`@useWhen`, `@avoidWhen`, `@alternatives`, `@deprecated`,
368
+ `@replacedBy`). Tokens are those named after the component (`select.border`, `component.select.height`), the rest closed
369
+ under them, and load only when such a page is drawn. A play function is noted when the file writes it for the story: its
370
+ own, the meta's, or from a story of the file it spreads. In a documentation file, sections are told apart by the English
371
+ words of their `##` headings: parts, styling, test ids, hooks, API and props are left out for a designer, with every code
372
+ block; a tester gets accessibility, keyboard, states and test ids, or the whole file when no heading says any of them.
373
+
374
+ ## Props in groups
375
+
376
+ A component with forty props reads better in groups. Name a prop's group in its TSDoc, with the `@group` tag TypeDoc
377
+ reads too:
378
+
379
+ ```tsx
380
+ export type FinderProps = {
381
+ /** The query. */
382
+ readonly query?: string;
383
+ /**
384
+ * The page shown.
385
+ *
386
+ * @group Paging
387
+ */
388
+ readonly page?: number;
389
+ /**
390
+ * The texts it shows, for a translation.
391
+ *
392
+ * @group Texts
393
+ */
394
+ readonly texts?: FinderTexts;
395
+ };
396
+ ```
397
+
398
+ - The API reference lists the props that name no group first, then each group under its name, in the order the
399
+ groups first appear among the props; the events keep their own heading after them. The Props tab does the same: the
400
+ props that name no group by control, as before, then each group with its controls, its toggles and the props it
401
+ cannot set.
402
+ - Every group starts open; a reader folds one away from its name.
403
+ - To show some groups first, name them in order: `propGroups: ["Selection", "Paging"]` in the configuration for every
404
+ component, or `parameters: { propGroups: ["Texts"] }` in a component's meta, written as a list of plain strings.
405
+ The meta's come first, then the configuration's, then the rest as they appear. Nothing named, nothing changes.
406
+ - A prop whose type is an object the package declares, with TSDoc on at least one member (`FinderTexts`), has a
407
+ "members" button beside its type: it lists the members under the row, with their types, defaults and TSDoc. Only one
408
+ level, and only once unfolded, so large text types cost the page nothing until read.
409
+ - With `eslint-plugin-tsdoc`, declare the tag in your `tsdoc.json`:
410
+ `{ "tagName": "@group", "syntaxKind": "block", "allowMultiple": false }`.
411
+
412
+ ## Docs pages
413
+
414
+ Guides, foundations and recipes are Markdown files with a little front matter, not MDX: a page is read at build time, and
415
+ nothing is compiled in the browser. A project lists them in its configuration (`docs: ["docs/**/*.md"]`); a
416
+ library gives them with its source, so every catalogue that shows it gets them:
417
+
418
+ ```ts
419
+ // packages/ui/stories.ts
420
+ import docs from "./docs/**/*.md?forgebook-docs-pages";
421
+ import files from "./src/**/*.stories.tsx?forgebook-files";
422
+
423
+ export const source: StorySource = { id: "acme", name: "Acme UI", files: [files], docs: [docs], sheets };
424
+ ```
425
+
426
+ A page says where it goes, then writes what it has to say; a fence named `story` draws a story in its frame, one named
427
+ `props` a component's API table from its types:
428
+
429
+ ````md
430
+ ---
431
+ title: Guides/Theming
432
+ order: 2
433
+ description: How the library follows the catalogue's theme.
434
+ ---
435
+
436
+ The buttons read their colours from the page's theme.
437
+
438
+ ```story acme:actions-button--primary
439
+ ```
440
+
441
+ ## Search
442
+
443
+ The field at the top of the sidebar searches the whole catalogue. The tree filters by name as you type, for browsing;
444
+ beside it a list ranks everything the words find, each component or page with what matched inside it and why (a prop,
445
+ an event, a heading, a sentence, a story), the words marked. `/` or ⌘K (Ctrl+K) comes to the field from anywhere, ↑ and ↓
446
+ move, Enter opens at the exact heading or prop, ⌘Enter or a modified press opens a new tab, Escape empties the field.
447
+
448
+ A prop has an address of its own, so a link to one can be pasted anywhere: `?component=acme:inputs-select#prop.value`,
449
+ and `#prop.Group.label` for a prop of a part named in `subcomponents`. A heading of a component's documentation file
450
+ has one too (`#accessibility`), as a docs page's has.
451
+
452
+ There is no search server and nothing to set up: the plugin builds the index with the catalogue, and the shell loads it
453
+ the first time someone types, so a reader who never searches pays nothing. A static build searches as the dev server
454
+ does. Only what the page does not already hold goes in the index: under 4 KB gzipped for a small library of ten components
455
+ with their documentation and a few guides. On a dev server, the first search waits for your packages' TypeScript for the props; names and docs
456
+ pages answer first.
457
+
458
+ Search and `forgebook find` rank alike, with the same synonyms: `modal` finds a `Dialog`, and a name counts more than a
459
+ sentence. A sentence copied from a page finds that page first. Change the words people see with `strings`, as any
460
+ other text of the shell (`"search.kindPage": "Guides"`).
461
+
462
+ ## The props
463
+
464
+ ```props acme:actions-button
465
+ ```
466
+
467
+ See [the colours](./colours.md#brand), or [every state](?component=acme:actions-button).
468
+ ````
469
+
470
+ - `title` places the page: `Guides/Theming` is a page of the group Guides. Without one, the file's opening `#` heading
471
+ or its name; `order` sorts the pages, lower first, then the pages without one by title. The address is
472
+ `?page=acme:guides-theming`, and a heading's anchor follows it (`#the-props`), made as GitHub makes them.
473
+ - Stories load as they come near, follow the view's switches live, and keep their bar: their code, their box over the
474
+ page, a link to their own page. A story of another source works too: the id is the whole one `forgebook stories` lists.
475
+ - A link to another page is written to its file (`./colours.md#brand`), so it works in the repository too. Images are
476
+ relative to the file, and go through the build. A `story` or `props` fence sits in the page's own flow, or in a block
477
+ below (an aside, a tab, a step), not inside a plain list or quote.
478
+ - The page gets its look from the shell's palette, so a `shell.theme` and both appearances reach it; a page with two
479
+ headings or more lists them beside its text, or above it on a narrow page.
480
+ - `forgebook stories` and `forgebook pages` fail when a page names a story or a component that is not there, a link leads
481
+ to no page, an image is not a file of its package, or a block cannot be read; each problem gives its line and column
482
+ (`./docs/theming.md: line 12, column 1: …`), and the page still draws everything else.
483
+ - A page is trusted more than a story's code: a story runs in a frame on an origin of its own, while a page's raw HTML,
484
+ which Markdown lets it hold, runs in the catalogue itself (its links keep only web, mail and the catalogue's own
485
+ addresses). Review a page as you review code, and do not build a catalogue from pages, a library's included, you did
486
+ not write.
487
+
488
+ ### Blocks
489
+
490
+ Blocks are written as Starlight, Docusaurus and VitePress write them, so a page reads well on GitHub too: `:::name`
491
+ opens a block, a line of the same colons closes it, `[label]` gives it a title (plain text, values included) and
492
+ `{key="value"}` its attributes. A block inside another has fewer colons than its parent. Everything is drawn at build time; the tabs alone bring a few lines of
493
+ script, with the docs pages' code, which only a page that opens loads.
494
+
495
+ ````md
496
+ :::tip[Before you start]
497
+ Anything Markdown holds goes in a block, a story too:
498
+
499
+ ```story acme:actions-button--primary
500
+ ```
501
+ :::
502
+
503
+ > [!WARNING]
504
+ > GitHub's alerts are asides too: NOTE, TIP, IMPORTANT, WARNING (a caution) and CAUTION (a danger).
505
+
506
+ ::::tabs{syncKey="package-manager"}
507
+ :::tab[pnpm]
508
+ ```sh
509
+ pnpm add @acme/ui
510
+ ```
511
+ :::
512
+ :::tab[npm]
513
+ ```sh
514
+ npm install @acme/ui
515
+ ```
516
+ :::
517
+ ::::
518
+
519
+ :::steps
520
+ 1. Install the package.
521
+ 2. Wrap the app in its provider.
522
+
523
+ ```tsx
524
+ <AcmeProvider theme="light">{app}</AcmeProvider>
525
+ ```
526
+ :::
527
+
528
+ ::::cards
529
+ :::card[Light and dark]
530
+ Every component follows the theme.
531
+ :::
532
+ ::link-card[Theming]{href="./theming.md" description="How the colours are chosen."}
533
+ ::::
534
+ ````
535
+
536
+ | Block | What it draws |
537
+ |---|---|
538
+ | `:::note`, `:::tip`, `:::important`, `:::caution`, `:::danger` | An aside in its tone's colour; `[label]` replaces the tone's name as its title. |
539
+ | `> [!NOTE]` … `> [!CAUTION]` | The same asides, as GitHub writes them. |
540
+ | `::::tabs{syncKey="…"}` around `:::tab[Label]` | One panel at a time, keys ← → Home End. Tabs with the same `syncKey` (as Starlight names it) switch together, on every page, and the browser keeps the choice. |
541
+ | `:::steps` around one numbered list | Numbered steps; a step may hold code and stories. |
542
+ | `::::cards` around `:::card[Title]` and `::link-card` | Cards side by side, as many to a row as fit. |
543
+ | `::link-card[Title]{href="…" description="…"}` | A card that links to a page by its file, to an address of the catalogue (`?component=…`), or to another site. |
544
+
545
+ A block the page cannot read is reported with its line and column, and what it holds still draws: a name Forgebook does
546
+ not know (a `::` line it does not know stays as text; `:::warning` is pointed to `:::caution`), an attribute a block does
547
+ not take, a closing line with the wrong number of colons, a block never closed. A block starts at
548
+ a line's start; written after spaces, as under a list item, it is not read.
549
+
550
+ ### Code
551
+
552
+ The line after a fence's backticks is read whole, as Expressive Code writes it:
553
+
554
+ ````md
555
+ ```tsx title="Button.tsx" {3} ins={4} del={5}
556
+ import { Button } from "@acme/ui";
557
+
558
+ export const Save = () => (
559
+ <Button tone="primary">Save</Button>
560
+ <Button>Save</Button>
561
+ );
562
+ ```
563
+
564
+ ```diff lang="tsx"
565
+ -const tone = "neutral";
566
+ +const tone = "primary";
567
+ ```
568
+ ````
569
+
570
+ `title="…"` names the code (a file, most often); `{1,4-6}` marks lines, `ins={…}` and `del={…}` mark them inserted or
571
+ deleted; `wrap` wraps long lines instead of scrolling. A `diff` fence marks its `+` and `-` lines: with `lang="tsx"` it is
572
+ code, its signs taken off and the rest coloured in that language; without, it is a patch, shown and copied as written. The
573
+ lines are `<mark>`, `<ins>` and `<del>` elements, so a screen reader says what changed, and Copy copies code as it reads
574
+ after the change: no diff signs, no deleted lines. A word the line does not read is a problem, with its
575
+ column.
576
+
577
+ ### A home of your own
578
+
579
+ A catalogue's home lists the libraries and their families. To write your own, put `forgebook.home.md` beside the
580
+ configuration (or name another file with `home: "docs/home.md"`); without one, the home stays the generated one. It is a
581
+ docs page, with every block above, a few values and the generated home's pieces among your own words:
582
+
583
+ ````md
584
+ ---
585
+ description: "{{components}} components in {{libraries}} libraries, version {{version}}."
586
+ ---
587
+
588
+ Our design system, for every product team.
589
+
590
+ :::tip[Start here]
591
+ Read [Getting started](./docs/getting-started.md), then pick a component.
592
+ :::
593
+
594
+ ::recent
595
+
596
+ ```story acme:actions-button--primary
597
+ ```
598
+
599
+ ::families[Components]{source="acme"}
600
+
601
+ ::libraries
602
+ ````
603
+
604
+ | Value | What it shows |
605
+ |---|---|
606
+ | `{{title}}` | The catalogue's name. |
607
+ | `{{version}}` | The `version` of the `package.json` the file belongs to, read at build time. |
608
+ | `{{components}}`, `{{stories}}` | How many components and listed stories the catalogue has. |
609
+ | `{{libraries}}`, `{{pages}}` | How many libraries have components, and how many docs pages there are. |
610
+
611
+ | Piece | What it draws |
612
+ |---|---|
613
+ | `::recent[Heading]` | The pages opened last, under "Recently opened" or your heading; nothing when there are none. |
614
+ | `::libraries{source="…"}` | Each library as the generated home shows it: its name and logo, its introduction, its pages and families. |
615
+ | `::families[Heading]{source="…"}` | The family cards alone. |
616
+ | `::pages[Heading]{source="…"}` | The docs pages' card alone. |
617
+
618
+ The title is the front matter's `title`, else the file's opening `#` heading, else the catalogue's name; `description` is
619
+ the lead under it. Values work in docs pages too, and a value is never read inside code, so a page can show `{{title}}`
620
+ itself in backticks; a name that is not a value (`{{name}}`) stays as written and is reported. The pieces belong to the home: on a docs page they are a problem. A link to a `.md` file opens that
621
+ page of the catalogue's own `docs`; a library's page is linked by its address (`?page=acme:guides-theming`). Problems in
622
+ the file are listed above the home and by `forgebook pages`, and `forgebook page home` reads it as an agent would. Restart
623
+ `forgebook dev` after adding or removing the file.
624
+
625
+ ## Design links
626
+
627
+ A component carries its own link to Figma, on its meta; a story with a design of its own writes it over the meta's:
628
+
629
+ ```ts
630
+ export default {
631
+ title: "Actions/Button",
632
+ component: Button,
633
+ parameters: { design: { figma: "https://www.figma.com/design/AbC123/Kit?node-id=12-34" } }
634
+ } satisfies Meta<typeof Button>;
635
+
636
+ export const Danger: Story<typeof Button> = {
637
+ parameters: { design: { figma: "https://www.figma.com/design/AbC123/Kit?node-id=56-78" } }
638
+ };
639
+ ```
640
+
641
+ The component's header then links to Figma. With [`@forgebook/plugin-figma`](https://www.npmjs.com/package/@forgebook/plugin-figma)
642
+ listed in `plugins`, the story's panel has a **Design** tab with the node embedded and **Compare with the story**, the
643
+ story and its design side by side over the page, at the story's width and with the panel's values. Comparing is for your
644
+ eyes: Forgebook draws no overlay and gives no match percentage, because Figma and a browser render differently and such a
645
+ number would mislead. The tab loads, with Figma, only when opened. A docs page shows a design with a fence named `figma`, its
646
+ link after the name.
647
+
648
+ Write the link plainly, as a string: the index reads it without running the file, so a link written by code is a problem.
649
+ A link that is not `https` on `figma.com`, or does not name a `design`, `file`, `proto`, `board`, `slides` or `deck`, is
650
+ reported with the index's problems and never embedded; the component keeps its stories. What is kept of a link is its
651
+ file, branch and node, so a shared link's other parameters are dropped. A `design` parameter without
652
+ `figma` (Storybook's design addon uses the same name) is left alone.
653
+
654
+ Nothing here needs a Figma token: the embed shows what the reader's own Figma session or the file's sharing allows, and
655
+ a private file asks them to sign in, inside the embed. That sign-in needs the browser's storage access, so a reader who
656
+ blocks it uses Open in Figma. A catalogue published with a Content Security Policy allows
657
+ `frame-src https://embed.figma.com https://www.figma.com`. Turn the tab off with `tabs: { figma: false }`; the header's link stays.
658
+
659
+ `forgebook story` and `get_story` return `design`: the link, the `fileKey` and `nodeId` a Figma tool takes, and the
660
+ `address` of the Design tab to hand a person (it opens the story alone without the plugin). `list_stories` gives each component's, and `CATALOG.md` lists it.
661
+
208
662
  ## Coming from Storybook
209
663
 
210
664
  Forgebook reads Storybook's story files as they are: CSF 3 and CSF 2 (`Template.bind({})`), titles of any depth and
211
665
  titles from the file's path, `args` and `argTypes` (with their controls), actions from `fn()` or an `argTypes` action,
212
666
  `play` with Testing Library (`@testing-library/dom` and `@testing-library/user-event`, optional peers), `loaders`,
213
- `tags` (`!dev`, `!test`) and a story's `globals`.
667
+ `tags` (`!dev`, `!test`), a story's `globals`, JSX in `.js` story files (listed and shown as code; Vite compiles JSX only in
668
+ `.jsx` and `.tsx`, so such a library adds the plugin its own Storybook uses for them, through the framework's plugins),
669
+ hooks in a `render` or a decorator (React and
670
+ Preact, with the story's state kept when a decorator draws `<Story />`), Storybook's preview hooks from
671
+ `storybook/preview-api` in a React story file (`useArgs`, whose update and reset change the story's args as the panel
672
+ would and show in it, a value the panel cannot show staying the story's; `useGlobals`, `useParameter` and
673
+ `useStoryContext` to read; its `useState`, `useEffect` and the rest, which are React's there; `useChannel` throws, since
674
+ Storybook's addons are not there), a preview's named exports beside its default
675
+ export, and the text values of its `globalTypes` defaults and `initialGlobals`, which its decorators read. The answers
676
+ to tools and agents read a preview's args and parameters on the server: a package it imports that only a browser can
677
+ load (Storybook's docs blocks, which read `document` as they load) is left as a placeholder there, which the preview can
678
+ keep in a parameter or call (an addon's factory), and what a call made can be looked into as `definePreview` does with
679
+ its `addons: [docs()]`; but the preview cannot read a member of an export, nor use any placeholder as a string, a number
680
+ or a list. A placeholder kept in args or parameters is left out of the answers, as a function is. A preview that still
681
+ cannot load (it uses one so, or one of its own files reads `document`) leaves the
682
+ answers working: it is left out of them and named among their problems, with what it used. A
683
+ `**` pattern skips `node_modules` unless it names it.
684
+
685
+ It lists what Storybook's indexer lists:
686
+
687
+ - every named export as a story, whatever writes its value: an object, a function, a helper's result
688
+ (`export const Chromatic = storiesFor(…)`), another constant (`export const Default: StoryFn = Template`) or a
689
+ re-export (`export { A as B }`, from the file or another module); `includeStories` and `excludeStories` leave some
690
+ out, as there;
691
+ - the meta written in place or held in a constant (`export default meta`, `export { meta as default }`);
692
+ - files with one title as one component: its stories come from every file, in the order of their paths, each with its
693
+ own file's meta, and its page takes the first file's docs and documentation file. Two stories with one id are a
694
+ problem, and the second is left out;
695
+ - Storybook's ids, so a link carries over: `inputs-readmore--open-by-default` for the title `Inputs/ReadMore` and the
696
+ export `OpenByDefault`, the meta's `id` in place of its title, and a story's own `parameters.__id`. An address,
697
+ `forgebook story`, `forgebook check` and the MCP tools still take the ids Forgebook gave before it followed
698
+ Storybook's (`inputs-read-more--open-by-default`), and open the story under its own; a picture stored under such an
699
+ id still counts as the story's baseline until `forgebook shot --update` stores one under its id.
700
+
701
+ A story without a `name` is named from its export's words as Storybook splits them, in sentence case
702
+ (`CustomSVGIcon` → "Custom SVG icon").
703
+
704
+ A component's props are read with the configuration an editor reads its story file with: the nearest `tsconfig.json`
705
+ up the file's folders that holds it, or a project it references. A monorepo whose packages hold only their sources
706
+ and whose root holds the stories, with the paths to the packages' sources, gets its props tables as Storybook does.
214
707
 
215
708
  It does not read MDX, doc blocks or addons. Actions are explicit only: an `on*` prop is not turned into an action by
216
709
  its name.
@@ -219,58 +712,404 @@ To try it on a Storybook project, run `npx forgebook init --from storybook` in t
219
712
  writes `forgebook.config.ts`: the story globs of `main` (the MDX pages left out), the preview as Forgebook's preview,
220
713
  and a switch for each toolbar global of the preview, applied by code as its decorators expect. `main` is loaded, so a
221
714
  computed `stories` list is read too; the preview is read from its source, so only `globalTypes` written as plain values
222
- become switches. It reads React on Vite (`@storybook/react-vite`) only, never replaces a configuration without
223
- `--force`, and lists what it left out.
715
+ become switches. It reads React, Vue, Svelte, Preact, Solid, Web Components and plain HTML on Vite
716
+ (`@storybook/react-vite`, `@storybook/vue3-vite`, `@storybook/svelte-vite`, `@storybook/sveltekit` (whose
717
+ `sveltekit_experimental` parameters `@forgebook/sveltekit` reads as they are),
718
+ `@storybook/preact-vite`, `storybook-solidjs-vite`, `@storybook/web-components-vite`, `@storybook/html-vite`, and
719
+ Nuxt's `@storybook-vue/nuxt`), Angular (`@storybook/angular`, `@analogjs/storybook-angular`, with the TypeScript
720
+ configuration its stories were compiled with) and Next.js (`@storybook/nextjs-vite`, and `@storybook/nextjs` on webpack,
721
+ whose stories are the same), never replaces a configuration without `--force`, and lists what it left out. A Next.js
722
+ project gets `framework: nextjs()` and keeps its stories' `parameters.nextjs`:
723
+ [`@forgebook/nextjs`](https://github.com/ensiria/forgebook/blob/develop/packages/nextjs/README.md) says what it draws.
724
+ React Native is read from Storybook's React Native Web framework (`@storybook/react-native-web-vite`, its
725
+ `modulesToTranspile` kept), its older webpack addon, and on-device Storybook's `.rnstorybook` folder, whose stories then
726
+ draw in the browser through [`@forgebook/react-native-web`](https://www.npmjs.com/package/@forgebook/react-native-web).
727
+
728
+ ## Monorepos
729
+
730
+ Each package hands its stories to one catalogue, a package of its own that imports nothing from the libraries but their
731
+ `stories` export. A package writes a source and exports it:
732
+
733
+ ```ts
734
+ // packages/ui/stories.ts
735
+ /// <reference types="@forgebook/story-format/client" />
736
+ import type { StorySource } from "@forgebook/story-format/source";
737
+
738
+ import files from "./src/**/*.stories.tsx?forgebook-files";
739
+
740
+ export const source: StorySource = { id: "ui", name: "UI", files: [files] };
741
+ ```
742
+
743
+ ```jsonc
744
+ // packages/ui/package.json
745
+ { "exports": { "./stories": "./stories.ts" } }
746
+ ```
747
+
748
+ The catalogue depends on each package and lists their sources, and `watch` lets the dev server see story files added to
749
+ them:
750
+
751
+ ```ts
752
+ // apps/catalogue/forgebook.config.ts
753
+ export default defineConfig({
754
+ framework: react(),
755
+ title: "Acme",
756
+ sources: ["@acme/ui/stories", "@acme/charts/stories"],
757
+ watch: ["../../packages/ui/src", "../../packages/charts/src"]
758
+ });
759
+ ```
760
+
761
+ A story's id starts with its source's (`ui:actions-button--plain`), so two packages can both have a `Button`. Props are read
762
+ through the `tsconfig.json` that holds the story file: the package's own, or the first one up its folders that lists it. This repository's fixture catalogue is built this way, on two packages, and its
763
+ browser tests run in CI.
764
+
765
+ A monorepo that points its packages at their sources with an export condition (`"source": "./src/index.ts"` in
766
+ `exports`, and `source` in Vite's `resolve.conditions`, set by a framework's plugins) needs nothing more with the
767
+ `forgebook` command: its dev server reads the stories and previews it answers tools with on Node under the same
768
+ conditions, those of other runtimes (`browser`) aside, unless a plugin names the server's own.
224
769
 
225
770
  ## Commands
226
771
 
227
772
  | Command | What it does |
228
773
  |---|---|
229
774
  | `forgebook dev` / `forgebook build` | Runs the catalogue of `forgebook.config.ts`, or builds it into static files |
775
+ | `forgebook prebundle` | Pre-bundles the catalogue's dependencies, as `dev` does on a first start: before it, in CI or an image |
230
776
  | `forgebook stories` | Lists every story with its id and links; fails when the story index has problems |
231
777
  | `forgebook story <id>` | One story: its args, its component's props, its links in a view (`--view theme=dark`) |
232
- | `forgebook init --from storybook` | Writes `forgebook.config.ts` from a project's `.storybook` folder: its story globs, preview and toolbar globals |
778
+ | `forgebook init --from storybook` | Writes `forgebook.config.ts` from a project's `.storybook` (or on-device `.rnstorybook`) folder: its framework, story globs, preview and toolbar globals |
233
779
  | `forgebook new <file>` | Writes a component's first stories from its props: the main story, one per choice, the worst case |
234
780
  | `forgebook check <id>` | Runs the catalogue's browser checks on a story (or a component's stories): accessibility, spills, overlays, errors; with `@forgebook/testing` |
235
781
  | `forgebook errors` | Lists what the open frames reported while you edited (a story that could not be shown, a failed play); `--follow` keeps listing |
236
- | `forgebook shot <id>` | Takes a story's pictures, one PNG per view, at the view's width and the story's height; with `@forgebook/testing` |
782
+ | `forgebook shot <id>` | Takes a story's pictures, one PNG per view, at the view's width and the story's height (framed in a device a view names); with `@forgebook/testing` |
783
+ | `forgebook pages` | Lists the docs pages with their ids and addresses; fails when the index has problems |
784
+ | `forgebook page <id>` | One docs page's Markdown; its headings too with `--json` |
785
+ | `forgebook diff <id>` | Compares a story's pictures with the baselines `forgebook shot --update` stored: the region, the percentage and a marked picture; fails when anything differs |
237
786
  | `forgebook mcp` | Serves the same answers to an agent over the Model Context Protocol |
238
- | `forgebook agents` | Adds Forgebook's instructions to the project's `AGENTS.md` (and a Claude Code skill with `--skill`) |
787
+ | `forgebook check-page` | Runs the checks on a real page of the application, by its address |
788
+ | `forgebook changed` | Lists the stories a change touches, through what they import |
789
+ | `forgebook verify` | Runs the checks on every story a change touches, with one exit code |
790
+ | `forgebook find` | Finds components by what they are for, in your own words |
791
+ | `forgebook search` | Searches the whole catalogue by its text: docs pages, props, descriptions, stories and names, with the address of each match |
792
+ | `forgebook tokens` | The design tokens, one of them, or the token nearest a value (`--nearest "#1c1b1b"`) |
793
+ | `forgebook check-code` | Checks what a change adds against the design system, with an exit code for CI |
794
+ | `forgebook agents` | Adds Forgebook's instructions to the project's `AGENTS.md` (and an [Agent Skill](https://agentskills.io) with `--skill`, in `.agents/skills` and `.claude/skills`) |
239
795
  | `forgebook docs` | Writes a package's `CATALOG.md` and `llms.txt` from its exports, their TSDoc and its stories |
240
796
  | `forgebook-texts` | Checks a package's story texts and lists what each language still has to translate |
241
797
 
242
798
  Each command prints its options with `--help`; `stories` and `story` print JSON with `--json`.
243
799
 
800
+ `forgebook build` names each script it writes by its hash alone (`assets/3f9a1c2b.js`): a catalogue names every story
801
+ file's scripts once per loader, so shorter names make a smaller build. To read what a build holds, name each script after
802
+ its module too (`assets/Button-3f9a1c2b.js`), for one build with `forgebook build --readable-names`, or for every build in
803
+ the configuration:
804
+
805
+ ```ts
806
+ export default defineConfig({ /* … */ build: { readableNames: true } });
807
+ ```
808
+
809
+ A component's docs, a story file's code and a component's page are data, not scripts: a build writes each as a gzipped
810
+ `.bin` file, which the page unpacks when it shows it, or in the story index itself when it is shorter than that file
811
+ (a story file whose stories are all args has no code).
812
+
813
+ ## Mocking an API
814
+
815
+ A story that fetches gets its answers from [MSW](https://mswjs.io), through
816
+ [`@forgebook/plugin-msw`](https://www.npmjs.com/package/@forgebook/plugin-msw). Install both, list the plugin, and write
817
+ MSW's worker into the catalogue's public folder:
818
+
819
+ ```sh
820
+ npm install --save-dev msw @forgebook/plugin-msw
821
+ npx msw init public
822
+ ```
823
+
824
+ ```ts
825
+ // forgebook.config.ts
826
+ import { msw } from "@forgebook/plugin-msw";
827
+
828
+ export default defineConfig({ /* … */ plugins: [msw()] });
829
+ ```
830
+
831
+ ```tsx
832
+ import { http, HttpResponse } from "msw";
833
+
834
+ /** The list, from a mocked API. */
835
+ export const Loaded: Story<typeof Users> = {
836
+ parameters: {
837
+ msw: { handlers: [http.get("/api/users", () => HttpResponse.json([{ name: "Ada" }]))] }
838
+ }
839
+ };
840
+ ```
841
+
842
+ `parameters.msw.handlers` is a list, or a record of lists as MSW's Storybook addon writes it, so those stories move over
843
+ unchanged. MSW loads only for a story that has handlers, and a request none of them answers goes to the network. On a
844
+ component page, where one worker serves every frame, each story's handlers answer its own frame only: a story with none
845
+ goes to the network. The panel's **Network** tab lists the story's handlers and its requests, each answered by a mock or
846
+ by the network, its query left out. It works on the dev server and in a static build. Without the plugin listed,
847
+ `parameters.msw` does nothing, and a story's requests reach the network.
848
+
849
+ ## Plugins
850
+
851
+ A plugin is a package a catalogue lists; until it is listed, it adds nothing and costs nothing:
852
+
853
+ ```ts
854
+ import { figma } from "@forgebook/plugin-figma";
855
+ import { msw } from "@forgebook/plugin-msw";
856
+
857
+ export default defineConfig({ /* … */ plugins: [figma(), msw()] });
858
+ ```
859
+
860
+ A plugin can add a panel tab, a toolbar switch, a docs block, and what runs around a story in its frame; it cannot rearrange
861
+ the shell. Turn a plugin's tab off like any other (`tabs: { figma: false }`), rename it (`strings: { "tabs.figma": "Figma" }`)
862
+ or translate its texts (`strings: { "plugin.figma.compare": "Confronta" }`). `forgebook plugins --json` and `list_plugins`
863
+ say what a catalogue has.
864
+
865
+ The contract, with how to write one and what it leaves out, is [PLUGINS.md](https://github.com/ensiria/forgebook/blob/develop/packages/forgebook/PLUGINS.md).
866
+
867
+ ## A preview for every pull request
868
+ `forgebook build` writes static files, so any static host gives each pull request its own catalogue, for free. `--base` is
869
+ for a host that serves it under a sub-path. A host that sets a `Content-Security-Policy` needs `blob:` in `script-src` for
870
+ the Accessibility card: a build keeps axe gzipped, and the frame runs it from a blob once unpacked. It also needs the
871
+ catalogue's own origin in `connect-src` (`'self'`): the page fetches the docs, code, pages and "Used in" a build keeps
872
+ gzipped. This workflow builds on
873
+ every pull request and keeps the result as an artefact; the last step is yours, and any host works:
874
+ ```yaml
875
+ # .github/workflows/catalogue-preview.yml
876
+ name: catalogue preview
877
+ on:
878
+ pull_request:
879
+ permissions:
880
+ contents: read
881
+ jobs:
882
+ preview:
883
+ runs-on: ubuntu-latest
884
+ steps:
885
+ - uses: actions/checkout@v4
886
+ - uses: actions/setup-node@v4
887
+ with:
888
+ node-version: 24
889
+ cache: npm
890
+ - run: npm ci
891
+ - run: npx forgebook build --out preview --base "/pr-${{ github.event.number }}/"
892
+ - uses: actions/upload-artifact@v4
893
+ name: catalogue-preview
894
+ path: preview
895
+ # then publish the folder, for example:
896
+ # GitHub Pages: actions/upload-pages-artifact, then actions/deploy-pages (one site, so without --base per PR)
897
+ # Cloudflare: npx wrangler pages deploy preview --branch "pr-${{ github.event.number }}"
898
+ # Your server: rsync -az preview/ "user@host:/var/www/previews/pr-${{ github.event.number }}/"
899
+ A pull request from a fork gets no secrets, so a step that deploys only works for branches of your own repository.
900
+ ## Stories on an origin of their own
901
+
902
+ A story's code, or a value a shared link puts in one of its props (an `href`, an `html`), runs in its frame. So that it
903
+ cannot read or act on the catalogue, the frames run on another origin than the catalogue's page:
904
+
905
+ - **On the dev server**, by default: a second port, the catalogue's + 1 (`forgebook dev` prints it as `Frames`). The
906
+ catalogue refuses what another origin's page asks of it, and the frames' port serves only the frame page, the public
907
+ folder and the modules your stories import: a frame cannot call the agent API (`/__forgebook/api/`) or read a file
908
+ of the project that no story imports. Choose the port with `--frame-port` or `frames: { port }`.
909
+ - **In a static build**, the frames share the catalogue's origin, unless you serve the same files from a second host
910
+ and name both, ideally two subdomains of one site (two different sites make the frame's cookies third-party):
911
+
912
+ ```ts
913
+ export default defineConfig({
914
+ // …
915
+ frames: { origins: { catalogue: "https://ui.example.com", frames: "https://ui-frames.example.com" } }
916
+ });
917
+ ```
918
+
919
+ `origins` also serves a dev server behind a proxy that gives each port a host of its own. `frames: "same-origin"` keeps
920
+ the frames on the catalogue's origin everywhere, for a place that opens one port only; then a story's code can reach the
921
+ catalogue as before; `forgebook dev --frames same-origin` does the same for one run, and `--frames isolated` the reverse. What the frames could use on the catalogue's origin still works on theirs: storage, cookies, MSW's
922
+ worker, the clipboard, full screen, the camera and the microphone. A story's link can no longer take the catalogue's
923
+ tab to another address.
924
+
925
+ What stays reachable from a frame: the code it runs (your stories, their components, what the catalogue imports), the
926
+ errors Vite sends every page while you edit, and `forgebook errors`, where a frame reports its own errors. If the
927
+ default port is taken, the frames move to the next free one, so their storage moves with them; give `--frame-port` to
928
+ keep it.
929
+
930
+ An embed (`?embed`) and an MCP client's inline preview are pages of the catalogue's origin that frame the story on the
931
+ frames' origin in turn, as the catalogue does: a page or a host that frames them names the catalogue's origin only (in
932
+ its `frame-src`, in the preview's `frameDomains`).
933
+
934
+ ## Your look in the shell
935
+ The catalogue's page can take your library's colours, fonts and corners. Nothing runs in the browser for it: the theme is
936
+ written into the page at build, and the frames are left alone, since they belong to your stories.
937
+ ```ts
938
+ // forgebook.config.ts
939
+ shell: {
940
+ theme: {
941
+ light: { accent: "#7036c4", "accent-text": "#5a2aa0" },
942
+ dark: { accent: "#b28bff" },
943
+ fonts: { sans: "Inter, sans-serif" },
944
+ radius: { control: "4px", card: "8px" }
945
+ }
946
+ Every role is optional, and typed by `ShellTheme` (`import type { ShellTheme } from "forgebook/shell-theme"`): the grounds
947
+ `window`, `sidebar`, `surface`; `separator`, `hover`; the texts `text`, `text-secondary`, `text-tertiary`, `accent-text`,
948
+ `danger-text`; `accent`; and the `code-*` colours. Renaming or removing a role is a breaking change. A preset can give a
949
+ theme too, and the catalogue's wins role by role.
950
+ The reader's Appearance menu also offers **Follow the story**, where the catalogue has a theme switch: a dark story in a
951
+ dark shell. It stays on the system's while comparing, since several themes share the stage. `appearance: "story"` makes
952
+ it the catalogue's default; a reader's own choice always wins.
953
+ When the catalogue starts, a role that does not exist is named, and so is a hex colour that leaves a text or code under
954
+ 4.5:1 on its ground, or the accent, which draws the keyboard's focus, under 3:1. Other colour notations are not checked.
955
+ Fonts are yours to load: a web font goes in a style sheet of your own, `shell.css`, with `@font-face`. That sheet loads
956
+ after the shell's. It is also an escape hatch, since the shell's class names are not public API and can change in any
957
+ release. Layout is not themable, though a font does change how wide text runs.
958
+
959
+ ## Embedding and white-label
960
+
961
+ Add `embed` to a story's address and the catalogue's page shows that story alone, with no sidebar, toolbar or panel, in
962
+ your theme: paste it in a wiki, in Notion, or in an iframe of your own.
963
+
964
+ ```html
965
+ <iframe src="https://ui.example.com/?embed&story=acme:button--primary&theme=dark" title="Button" width="100%" height="320" style="border: 0"></iframe>
966
+ ```
967
+
968
+ The story bar's **Embed** button gives the link and this code for the story and view on screen, with the values set in the
969
+ panel; `forgebook story <id>` and the `story_address` tool give the same link as `links.embed`. The switches, the
970
+ background, the language, `args`, `width` and `height` are read from the address; the stage's own settings (compare, zoom,
971
+ the panel, the device frame) are not. The story stays live, and it fills the box it gets, scrolling inside it when it is taller. Docs pages will
972
+ be embedded the same way once they exist, and oEmbed, so that a wiki can turn a pasted link into a frame on its own, comes
973
+ later.
974
+
975
+ A page of your own can follow the story's height. An embed posts `{ type: "forgebook:embed-size", height }` to the page around
976
+ it, and the Embed button's **Follow the story's height** adds the few lines that listen. Check `event.source` and
977
+ `event.origin` in your own listener, as those lines do. The story needs `allow-scripts allow-same-origin` if you sandbox the
978
+ iframe, since its modules are loaded as those of its own origin.
979
+
980
+ An embed sends nothing but the height and listens to nothing from the page around it, and it keeps working where a browser
981
+ denies a third-party frame its storage. What it does take from outside is its address: like the catalogue's own `args`, the
982
+ address reaches the story's props, so a story that renders a prop as raw HTML should not be published for anyone to frame.
983
+ And a height says something: a page that can reach your catalogue can tell whether a story exists.
984
+
985
+ Forgebook sets no framing headers, on the dev server or in a build, so what you host keeps the rules it has. To choose who may
986
+ frame your catalogue, answer with `Content-Security-Policy: frame-ancestors` on your own server, which is the way to protect a
987
+ private one; `X-Frame-Options: DENY` turns embedding off. `controls: { embed: false }` takes the button away, not the address,
988
+ since any page can frame what it can open.
989
+
990
+ To leave no trace of Forgebook's mark, turn the branding off:
991
+
992
+ ```ts
993
+ // forgebook.config.ts
994
+ title: "Acme UI",
995
+ logo: "acme.svg",
996
+ shell: { branding: false }
997
+ ```
998
+
999
+ The sidebar then shows your logo and title, or your title alone without a logo, and the page's icon is your logo or none.
1000
+ It is on by default. The theme reaches everything Forgebook draws: the catalogue, an embed around its story, its loading and
1001
+ missing-story messages, and the box a frame shows when a story fails.
1002
+
244
1003
  ## For agents
245
1004
 
246
1005
  `forgebook agents` gives a project's coding agents what they need without being told: how to write a story file here,
247
1006
  and the commands that check one, as a section of `AGENTS.md` (renewed in place when it runs again; `--skill` writes
248
- the same as a Claude Code skill).
1007
+ the same as an Agent Skill any agent can load).
249
1008
 
250
1009
  A coding agent can use the catalogue while it works: find a story's id, read a story's args and its component's
251
1010
  props, and hand a person the link that opens it. Add the MCP server to the project's agent configuration, for
252
1011
  example `.mcp.json` for Claude Code:
253
1012
 
1013
+ ```
1014
+
1015
+ A library with design tokens (`tokens` in the configuration) can theme the shell from them in a few lines. Each role takes the
1016
+ token's value in both appearances, its `light` and `dark` themes first; colours written by hand win, and a token that
1017
+ is not there or is no colour is warned about and leaves the shell's own. The theme is read when the configuration is, so
1018
+ restart after editing the tokens.
1019
+
1020
+ ```ts
1021
+ shell: { theme: { fromTokens: { accent: "color.brand.primary", surface: "color.background.card" } } }
254
1022
  ```json
255
1023
  { "mcpServers": { "forgebook": { "command": "npx", "args": ["forgebook", "mcp"] } } }
256
1024
  ```
257
1025
 
258
- It offers seven tools: `list_stories`, `get_story`, `story_address`, `new_stories`, which writes a component's first stories from its props and answers the text without writing a file, `check_story`, which runs the catalogue's browser checks on a story and answers its problems (the project needs `@forgebook/testing` and Playwright for it), `recent_errors`, what the frames open in a browser reported while the agent edited (numbered: `since` gives only the new ones), and `story_shot`, a story's pictures in the answer itself, so the agent looks at what it made. `check`, `shot` and their tools take a view in the address's form (`theme=dark&width=360`) or as words (`"dark it 360"`). `get_story` also gives the components whose stories use the story's component (`usedIn`), so an agent finds a real use before writing one; `list_stories` gives it for every component when asked (`usedIn: true`, or `forgebook stories --used-in`), since it reads the package's import graph. Run from the catalogue's folder (or give
1026
+ It offers eighteen tools: `visual_diff`, `check_code`, `check_page`, which checks a real page of the application, `list_stories`, `changed_stories`, `find_component`, which finds a component by what it is for, `get_story`, `story_address`, `new_stories`, which writes a component's first stories from its props and answers the text without writing a file, `check_story`, which runs the catalogue's browser checks on a story and answers its problems (the project needs `@forgebook/testing` and Playwright for it), `recent_errors`, what the frames open in a browser reported while the agent edited (numbered: `since` gives only the new ones), and `story_shot`, a story's pictures in the answer itself, so the agent looks at what it made, `list_pages` and `get_page`, which read the catalogue's docs pages as Markdown, and `search_catalogue`, the search people use. `check`, `shot` and their tools take a view in the address's form (`theme=dark&width=360`) or as words (`"dark it 360"`); every story's `links.component` opens its component's page in that view, so `--view audience=designer` on `forgebook story` and `get_story` gives a link to send a designer. `get_story` also gives the components whose stories use the story's component (`usedIn`), so an agent finds a real use before writing one; `list_stories` gives it for every component when asked (`usedIn: true`, or `forgebook stories --used-in`), since it reads the package's import graph. Run from the catalogue's folder (or give
259
1027
  `--config`), it uses the running `forgebook dev` when there is one, and starts a dev server of its own otherwise,
260
- kept while the agent's session lasts. The links name `http://localhost:5173` unless `--url` (or `FORGEBOOK_URL`) says
1028
+ kept while the agent's session lasts; that server keeps its pre-bundled dependencies in
1029
+ `node_modules/.vite/forgebook-commands`, apart from those of a `forgebook dev` running in the same folder. The links name `http://localhost:5173` unless `--url` (or `FORGEBOOK_URL`) says
261
1030
  where `forgebook dev` runs.
262
1031
 
1032
+ `get_story` gives a story's design too (`design`, [above](#design-links)), so an agent can read the node with a Figma tool
1033
+ and compare it with `story_shot`.
1034
+
1035
+ #### Inline previews
1036
+
1037
+ A client that renders [MCP Apps](https://github.com/modelcontextprotocol/ext-apps/blob/main/specification/2026-01-26/apps.mdx)
1038
+ gets one more tool, `story_preview`, and the page `ui://forgebook/story-preview` to show its answer in: the story, live,
1039
+ inside the conversation, with a button that opens it in the catalogue. Any other client gets the answers it always got:
1040
+ the tool is not listed, and `story_shot` is how it sees a story. Nothing runs until the tool is called: a client may read
1041
+ the page ahead of time, and that starts no server and loads no story. When no `forgebook dev` runs, one is started for the
1042
+ first preview and kept for the session.
1043
+
1044
+ The story comes from a local server, and the host decides whether it gets in. A browser refuses a public page's frame to
1045
+ a local address (Chromium's Local Network Access), so a host whose app runs on a public origin, as a web client's does,
1046
+ shows the story's picture instead: the page asks the host to run `story_shot`, and needs Playwright as that tool does. The
1047
+ page's words are replaceable as the shell's are (`strings`): `previewOpen`, `previewWaiting`, `previewLoading`,
1048
+ `previewTakingPicture`, `previewUnavailable`, `previewCancelled`, `previewPicture`, `previewFrame`.
1049
+
1050
+ A component's TSDoc can say what a person knows and an agent cannot guess: `@useWhen`, `@avoidWhen`, `@alternatives`,
1051
+ `@deprecated` and `@replacedBy`. `forgebook story` and `get_story` return them as `docs.guidance`.
1052
+ The most common mistake of an agent working on a design system is a colour or a size written by hand. Name your
1053
+ [DTCG](https://www.designtokens.org/tr/2025.10/) files in the configuration, the base first and each theme in a file of
1054
+ its own, and agents can ask what to write instead:
1055
+ ```ts
1056
+ tokens: ["tokens.json", { file: "dark.tokens.json", mode: "dark" }]
1057
+ ```
1058
+ A library gives its tokens to every catalogue that shows it: the same list on its source, by path from the module that
1059
+ declares the source. It is read from that module's text, never by running it, so a broken story cannot hide a token: write
1060
+ it in the object of `export const source`, with plain strings and paths inside the package. A source re-exported or
1061
+ spread from another module gives no tokens.
1062
+ ```ts
1063
+ export const source: StorySource = { id: "acme-ui", tokens: ["tokens.json"] /* … */ };
1064
+ ```
1065
+ A catalogue reads each source's files in its `sources` order, then its own, so its aliases reach a library's palette. When
1066
+ two authors give one token different values in the same theme the last stands, which makes the catalogue's own the final
1067
+ word: it is what puts the libraries together. The answer says so in `clashes` (`kept`, `replaced`), the command warns,
1068
+ and neither fails: a clash is a choice to review, not a token that cannot be read. A file over another may write only
1069
+ `$value`: the token keeps its type, description and deprecation.
1070
+ ```sh
1071
+ npx forgebook tokens --category color --json
1072
+ npx forgebook tokens --nearest "#1c1b1b" --json # the nearest tokens, and whether each is really close
1073
+ `forgebook mcp` offers the same as `list_tokens`, `get_token` and `nearest_token`. References (`{a.b}`, `$ref`), `$extends`
1074
+ and `$root` are followed, and a base alias follows what a theme overrides. Deprecated tokens are never suggested. Colours
1075
+ in sRGB, Display P3, Oklab, Oklch and HSL are compared; other spaces are listed but counted as `uncompared`. A theme can
1076
+ reference the base; a `$ref` reaches only its own file.
1077
+
1078
+ An agent that cannot find a component writes a new one, often because the code and the designers use different words.
1079
+ `forgebook build --agent-index` adds `forgebook-agent.json` to the built catalogue, and `forgebook mcp --from <address or
1080
+ folder>` serves it with no dev server and no repository: a team that consumes a published library gives its agents
1081
+ `list_stories`, `get_story`, `story_address`, `find_component` and the token tools. It holds your stories' props, docs and
1082
+ tokens, and anyone who reaches the site can read it, so it is written only when asked. From a folder, links are paths.
1083
+
1084
+ `forgebook find` and `find_component` search names, the meta's `keywords`, titles and stories, with the usual synonyms
1085
+ (`modal` finds a `Dialog`): write `keywords: ["radio tile group"]` on `OptionCards` and it is found.
1086
+ `forgebook search` and `search_catalogue` read the rest, with the same ranking: a prop's name, a sentence of a docs page,
1087
+ each result with the words it missed and the address that opens the exact heading or prop.
1088
+
1089
+ `forgebook check <id> --semantic` also asks a model what axe cannot see: whether a heading describes its section, an
1090
+ image's text says what it shows, a label says what its control does. It is off unless asked, and sends each story's
1091
+ accessibility tree and picture to the OpenAI-compatible API in `FORGEBOOK_SEMANTIC_URL`, with `FORGEBOOK_SEMANTIC_MODEL` and,
1092
+ when it needs one, `FORGEBOOK_SEMANTIC_KEY`. No model comes with Forgebook and no key is stored. What it answers lands in
1093
+ `judgements`, apart from the problems, as an opinion: it does not fail the check.
1094
+
1095
+ `forgebook check-code` and `check_code` read what a change adds, new files included, from where it left `--since`: a colour
1096
+ written by hand, with the token to use when one clearly fits; a size that equals a token; a check turned off with no
1097
+ reason (`@ts-ignore`, `eslint-disable`, `biome-ignore`, `stylelint-disable`); a test deleted. Only styles and components
1098
+ are read for values: stories, tests, token definitions and generated files are left alone. A fix is a token's name, not
1099
+ code to paste. It does not check props, imports or deprecated components. It exits non-zero on a problem, for CI.
1100
+
263
1101
  A library tells agents what it offers with `forgebook docs`, run in its folder: `CATALOG.md`, one dense line per
264
1102
  component, hook, helper and style module (what it is, how to import it, its props, the id of a story that shows it),
265
- and `llms.txt`, which points an agent to it. The file's name, its sections and the subpaths left out are set in the
1103
+ docs page and design token of its source (its value, each theme's, what it aliases, what it is for), and `llms.txt`,
1104
+ which points an agent to it and links the pages. The file's name, its sections and the subpaths left out are set in the
266
1105
  package's `package.json`:
267
1106
 
268
1107
  ```json
269
- { "forgebook": { "catalog": { "file": "CATALOG.md", "sections": ["components", "modules"], "exclude": ["./internal/*"] } } }
1108
+ { "forgebook": { "catalog": { "file": "CATALOG.md", "sections": ["components", "pages", "modules"], "exclude": ["./internal/*"] } } }
270
1109
  ```
271
1110
 
272
- `forgebook docs --check` fails in CI when either file is stale. In CI, `forgebook stories --json` fails on a broken story file (a title taken twice, a title that cannot be placed),
273
- and its JSON lists every story for a script.
1111
+ `forgebook docs --check` fails in CI when either file is stale. In CI, `forgebook stories --json` fails on a broken story file (a title taken twice, a title that cannot be placed) or a
1112
+ docs page that names what is not there, and its JSON lists every story for a script.
274
1113
 
275
1114
  ## Packages
276
1115
 
@@ -278,8 +1117,21 @@ and its JSON lists every story for a script.
278
1117
  |---|---|
279
1118
  | `forgebook` | The catalogue: the shell, the frame, the Vite plugin, the commands |
280
1119
  | [`@forgebook/react`](https://www.npmjs.com/package/@forgebook/react) | React's story types, renderer and props reader |
1120
+ | [`@forgebook/vue`](https://www.npmjs.com/package/@forgebook/vue) | Vue's story types, renderer and props, events and slots reader |
1121
+ | [`@forgebook/svelte`](https://www.npmjs.com/package/@forgebook/svelte) | Svelte's story types, renderer and props, snippets and callback props reader |
1122
+ | [`@forgebook/sveltekit`](https://www.npmjs.com/package/@forgebook/sveltekit) | SvelteKit on Svelte's adapter: `$app/state`, navigation, forms, paths, the environment and a page's `load` in a story |
1123
+ | [`@forgebook/solid`](https://www.npmjs.com/package/@forgebook/solid) | Solid's story types, renderer (args update in place) and props reader |
1124
+ | [`@forgebook/preact`](https://www.npmjs.com/package/@forgebook/preact) | Preact's story types, renderer (on Preact itself, no compat) and props reader |
1125
+ | [`@forgebook/web-components`](https://www.npmjs.com/package/@forgebook/web-components) | Web Components' story types, Lit renderer, and reader of the Custom Elements Manifest |
1126
+ | [`@forgebook/html`](https://www.npmjs.com/package/@forgebook/html) | Plain HTML's story types, renderer and args reader, for stories with no framework |
1127
+ | [`@forgebook/angular`](https://www.npmjs.com/package/@forgebook/angular) | Angular's and Analog's story types and helpers, renderer, and inputs, outputs and content reader |
1128
+ | [`@forgebook/react-native-web`](https://www.npmjs.com/package/@forgebook/react-native-web) | React Native's components in the browser, through react-native-web |
1129
+ | [`@forgebook/nextjs`](https://www.npmjs.com/package/@forgebook/nextjs) | A Next.js project's components outside Next.js: images, fonts, links, both routers, server components |
1130
+ | [`@forgebook/nuxt`](https://www.npmjs.com/package/@forgebook/nuxt) | A Nuxt project's components outside Nuxt, on Vue's |
281
1131
  | [`@forgebook/story-format`](https://www.npmjs.com/package/@forgebook/story-format) | The story format, for a library whose stories must not depend on a catalogue |
282
1132
  | [`@forgebook/testing`](https://www.npmjs.com/package/@forgebook/testing) | Tests generated from the stories |
1133
+ | [`@forgebook/plugin-figma`](https://www.npmjs.com/package/@forgebook/plugin-figma) | A story's design in the panel, and beside the story |
1134
+ | [`@forgebook/plugin-msw`](https://www.npmjs.com/package/@forgebook/plugin-msw) | A story's API answered by its handlers, and a Network tab |
283
1135
 
284
1136
  ## Contributing
285
1137