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