forgebook 0.3.3 → 0.4.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 (690) hide show
  1. package/README.md +914 -72
  2. package/dist/bin/forgebook/agentClient.d.ts +2 -1
  3. package/dist/bin/forgebook/agentClient.js +13 -6
  4. package/dist/bin/forgebook/agentGuide.d.ts +59 -0
  5. package/dist/bin/forgebook/agentGuide.js +203 -0
  6. package/dist/bin/forgebook/agentLoopCommands.mjs +22 -42
  7. package/dist/bin/forgebook/agentSetup/agentFiles.d.ts +55 -0
  8. package/dist/bin/forgebook/agentSetup/agentFiles.js +319 -0
  9. package/dist/bin/forgebook/agentSetup/assistantHooks.d.ts +71 -0
  10. package/dist/bin/forgebook/agentSetup/assistantHooks.js +125 -0
  11. package/dist/bin/forgebook/agentSetup/ciWorkflow.d.ts +23 -0
  12. package/dist/bin/forgebook/agentSetup/ciWorkflow.js +55 -0
  13. package/dist/bin/forgebook/agentSetup/drawCandidates.d.ts +25 -0
  14. package/dist/bin/forgebook/agentSetup/drawCandidates.js +116 -0
  15. package/dist/bin/forgebook/agentSetup/drawDiagnosis.d.ts +28 -0
  16. package/dist/bin/forgebook/agentSetup/drawDiagnosis.js +134 -0
  17. package/dist/bin/forgebook/agentSetup/drawRun.d.ts +91 -0
  18. package/dist/bin/forgebook/agentSetup/drawRun.js +353 -0
  19. package/dist/bin/forgebook/agentSetup/hookNames.d.ts +7 -0
  20. package/dist/bin/forgebook/agentSetup/hookNames.js +7 -0
  21. package/dist/bin/forgebook/agentSetup/initAgentSteps.d.ts +48 -0
  22. package/dist/bin/forgebook/agentSetup/initAgentSteps.js +104 -0
  23. package/dist/bin/forgebook/agentSetup/liftedProviders.d.ts +17 -0
  24. package/dist/bin/forgebook/agentSetup/liftedProviders.js +186 -0
  25. package/dist/bin/forgebook/agentSetup/projectRunner.d.ts +46 -0
  26. package/dist/bin/forgebook/agentSetup/projectRunner.js +85 -0
  27. package/dist/bin/forgebook/agentSetup/stopHook.d.ts +65 -0
  28. package/dist/bin/forgebook/agentSetup/stopHook.js +202 -0
  29. package/dist/bin/forgebook/agentSetup/uniformPicture.d.ts +7 -0
  30. package/dist/bin/forgebook/agentSetup/uniformPicture.js +98 -0
  31. package/dist/bin/forgebook/agentSetupCommands.d.mts +14 -0
  32. package/dist/bin/forgebook/agentSetupCommands.mjs +98 -0
  33. package/dist/bin/forgebook/agentText.d.ts +23 -3
  34. package/dist/bin/forgebook/agentText.js +175 -28
  35. package/dist/bin/forgebook/agents.md +20 -191
  36. package/dist/bin/forgebook/agentsText.js +2 -1
  37. package/dist/bin/forgebook/appBuild/appBuild.d.ts +59 -0
  38. package/dist/bin/forgebook/appBuild/appBuild.js +213 -0
  39. package/dist/bin/forgebook/appBuild/appViteConfig.d.ts +96 -0
  40. package/dist/bin/forgebook/appBuild/appViteConfig.js +320 -0
  41. package/dist/bin/forgebook/appBuild/tsconfigPaths.d.ts +14 -0
  42. package/dist/bin/forgebook/appBuild/tsconfigPaths.js +80 -0
  43. package/dist/bin/forgebook/auditCommand.d.mts +8 -0
  44. package/dist/bin/forgebook/auditCommand.mjs +75 -0
  45. package/dist/bin/forgebook/auditRun.d.ts +95 -0
  46. package/dist/bin/forgebook/auditRun.js +270 -0
  47. package/dist/bin/forgebook/browserRun.d.ts +21 -0
  48. package/dist/bin/forgebook/browserRun.js +57 -0
  49. package/dist/bin/forgebook/buildFailure.d.ts +7 -0
  50. package/dist/bin/forgebook/buildFailure.js +47 -0
  51. package/dist/bin/forgebook/buildWatch.d.ts +52 -0
  52. package/dist/bin/forgebook/buildWatch.js +137 -0
  53. package/dist/bin/forgebook/builtCatalogue.js +9 -5
  54. package/dist/bin/forgebook/catalogueCommands.d.ts +9 -0
  55. package/dist/bin/forgebook/catalogueCommands.js +23 -0
  56. package/dist/bin/forgebook/catalogueVite.d.ts +5 -1
  57. package/dist/bin/forgebook/catalogueVite.js +14 -6
  58. package/dist/bin/forgebook/commandCacheClaim.d.ts +18 -0
  59. package/dist/bin/forgebook/commandCacheClaim.js +170 -0
  60. package/dist/bin/forgebook/commandServer.d.ts +8 -0
  61. package/dist/bin/forgebook/commandServer.js +61 -13
  62. package/dist/bin/forgebook/forgebookCommands.mjs +105 -28
  63. package/dist/bin/forgebook/graphCommand.d.mts +8 -0
  64. package/dist/bin/forgebook/graphCommand.mjs +84 -0
  65. package/dist/bin/forgebook/guide/commands.md +57 -0
  66. package/dist/bin/forgebook/guide/devices.md +17 -0
  67. package/dist/bin/forgebook/guide/docs-pages.md +13 -0
  68. package/dist/bin/forgebook/guide/frameworks/angular.md +22 -0
  69. package/dist/bin/forgebook/guide/frameworks/html.md +22 -0
  70. package/dist/bin/forgebook/guide/frameworks/nextjs.md +23 -0
  71. package/dist/bin/forgebook/guide/frameworks/nuxt.md +22 -0
  72. package/dist/bin/forgebook/guide/frameworks/preact.md +16 -0
  73. package/dist/bin/forgebook/guide/frameworks/react-native-web.md +21 -0
  74. package/dist/bin/forgebook/guide/frameworks/react.md +16 -0
  75. package/dist/bin/forgebook/guide/frameworks/solid.md +18 -0
  76. package/dist/bin/forgebook/guide/frameworks/svelte.md +18 -0
  77. package/dist/bin/forgebook/guide/frameworks/sveltekit.md +23 -0
  78. package/dist/bin/forgebook/guide/frameworks/vue.md +18 -0
  79. package/dist/bin/forgebook/guide/frameworks/web-components.md +21 -0
  80. package/dist/bin/forgebook/guide/links.md +29 -0
  81. package/dist/bin/forgebook/guide/setup.md +23 -0
  82. package/dist/bin/forgebook/guide/stories.md +90 -0
  83. package/dist/bin/forgebook/guide/switches.md +43 -0
  84. package/dist/bin/forgebook/guideCommand.d.mts +13 -0
  85. package/dist/bin/forgebook/guideCommand.mjs +37 -0
  86. package/dist/bin/forgebook/importers/storybook.d.ts +21 -0
  87. package/dist/bin/forgebook/importers/storybook.js +11 -5
  88. package/dist/bin/forgebook/importers/storybookFrameworks.js +1 -1
  89. package/dist/bin/forgebook/initCommands.d.mts +11 -0
  90. package/dist/bin/forgebook/initCommands.mjs +51 -78
  91. package/dist/bin/forgebook/initConfig.d.ts +5 -3
  92. package/dist/bin/forgebook/initConfig.js +6 -3
  93. package/dist/bin/forgebook/initInstall.d.ts +15 -0
  94. package/dist/bin/forgebook/initInstall.js +77 -0
  95. package/dist/bin/forgebook/initPrint.d.ts +9 -0
  96. package/dist/bin/forgebook/initPrint.js +60 -0
  97. package/dist/bin/forgebook/initRefusals.d.ts +45 -0
  98. package/dist/bin/forgebook/initRefusals.js +91 -0
  99. package/dist/bin/forgebook/initRun.d.ts +28 -0
  100. package/dist/bin/forgebook/initRun.js +311 -0
  101. package/dist/bin/forgebook/mcpCommand.mjs +38 -4
  102. package/dist/bin/forgebook/mcpGraph.d.ts +13 -0
  103. package/dist/bin/forgebook/mcpGraph.js +24 -0
  104. package/dist/bin/forgebook/mcpTokens.d.ts +14 -0
  105. package/dist/bin/forgebook/mcpTokens.js +58 -0
  106. package/dist/bin/forgebook/mcpToolParts.d.ts +7 -0
  107. package/dist/bin/forgebook/mcpToolParts.js +10 -0
  108. package/dist/bin/forgebook/mcpTools.d.ts +13 -6
  109. package/dist/bin/forgebook/mcpTools.js +57 -90
  110. package/dist/bin/forgebook/mcpVerify.d.ts +16 -0
  111. package/dist/bin/forgebook/mcpVerify.js +36 -0
  112. package/dist/bin/forgebook/migrate/codemods.d.ts +11 -0
  113. package/dist/bin/forgebook/migrate/codemods.js +61 -0
  114. package/dist/bin/forgebook/migrate/migrate.types.d.ts +117 -0
  115. package/dist/bin/forgebook/migrate/migrate.types.js +5 -0
  116. package/dist/bin/forgebook/migrate/migrateCommand.d.mts +8 -0
  117. package/dist/bin/forgebook/migrate/migrateCommand.mjs +76 -0
  118. package/dist/bin/forgebook/migrate/migrateRun.d.ts +61 -0
  119. package/dist/bin/forgebook/migrate/migrateRun.js +210 -0
  120. package/dist/bin/forgebook/migrate/migrateText.d.ts +12 -0
  121. package/dist/bin/forgebook/migrate/migrateText.js +30 -0
  122. package/dist/bin/forgebook/migrate/migrateWrite.d.ts +27 -0
  123. package/dist/bin/forgebook/migrate/migrateWrite.js +66 -0
  124. package/dist/bin/forgebook/migrate/objectEdits.d.ts +70 -0
  125. package/dist/bin/forgebook/migrate/objectEdits.js +241 -0
  126. package/dist/bin/forgebook/migrate/playOnInBuilds.d.ts +3 -0
  127. package/dist/bin/forgebook/migrate/playOnInBuilds.js +86 -0
  128. package/dist/bin/forgebook/migrate/propGroupStrings.d.ts +5 -0
  129. package/dist/bin/forgebook/migrate/propGroupStrings.js +81 -0
  130. package/dist/bin/forgebook/newProject/newProject.d.ts +39 -0
  131. package/dist/bin/forgebook/newProject/newProject.js +180 -0
  132. package/dist/bin/forgebook/newProject/newProject.types.d.ts +97 -0
  133. package/dist/bin/forgebook/newProject/newProject.types.js +6 -0
  134. package/dist/bin/forgebook/newProject/packageManagers.d.ts +51 -0
  135. package/dist/bin/forgebook/newProject/packageManagers.js +121 -0
  136. package/dist/bin/forgebook/newProject/projectEntries.d.ts +62 -0
  137. package/dist/bin/forgebook/newProject/projectEntries.js +191 -0
  138. package/dist/bin/forgebook/newProject/projectFrameworks.d.ts +57 -0
  139. package/dist/bin/forgebook/newProject/projectFrameworks.js +148 -0
  140. package/dist/bin/forgebook/newProject/projectLook.d.ts +23 -0
  141. package/dist/bin/forgebook/newProject/projectLook.js +293 -0
  142. package/dist/bin/forgebook/newProject/projectPackages.d.ts +66 -0
  143. package/dist/bin/forgebook/newProject/projectPackages.js +178 -0
  144. package/dist/bin/forgebook/newRepair.d.ts +45 -0
  145. package/dist/bin/forgebook/newRepair.js +157 -0
  146. package/dist/bin/forgebook/newRepairRun.d.ts +69 -0
  147. package/dist/bin/forgebook/newRepairRun.js +148 -0
  148. package/dist/bin/forgebook/newStories.d.ts +23 -1
  149. package/dist/bin/forgebook/newStories.js +101 -11
  150. package/dist/bin/forgebook/newStoriesFile.d.ts +20 -1
  151. package/dist/bin/forgebook/newStoriesFile.js +43 -4
  152. package/dist/bin/forgebook/prebundleRun.d.ts +3 -1
  153. package/dist/bin/forgebook/prebundleRun.js +28 -8
  154. package/dist/bin/forgebook/proofCommand.d.mts +15 -0
  155. package/dist/bin/forgebook/proofCommand.mjs +212 -0
  156. package/dist/bin/forgebook/proofRun.d.ts +63 -0
  157. package/dist/bin/forgebook/proofRun.js +412 -0
  158. package/dist/bin/forgebook/proofText.d.ts +36 -0
  159. package/dist/bin/forgebook/proofText.js +131 -0
  160. package/dist/bin/forgebook/proofWorkflow.d.ts +29 -0
  161. package/dist/bin/forgebook/proofWorkflow.js +205 -0
  162. package/dist/bin/forgebook/setArgsTool.d.ts +8 -0
  163. package/dist/bin/forgebook/setArgsTool.js +70 -0
  164. package/dist/bin/forgebook/storyCheckCommands.mjs +42 -3
  165. package/dist/bin/forgebook/storyCheckRun.d.ts +50 -0
  166. package/dist/bin/forgebook/storyCheckRun.js +83 -9
  167. package/dist/bin/forgebook/storyFileIds.d.ts +15 -0
  168. package/dist/bin/forgebook/storyFileIds.js +14 -0
  169. package/dist/bin/forgebook/stressCases.d.ts +31 -0
  170. package/dist/bin/forgebook/stressCases.js +79 -0
  171. package/dist/bin/forgebook/stressRun.d.ts +12 -0
  172. package/dist/bin/forgebook/stressRun.js +61 -0
  173. package/dist/bin/forgebook/stressText.d.ts +27 -0
  174. package/dist/bin/forgebook/stressText.js +46 -0
  175. package/dist/bin/forgebook/verifyBase.d.ts +45 -0
  176. package/dist/bin/forgebook/verifyBase.js +196 -0
  177. package/dist/bin/forgebook/verifyCommand.d.mts +13 -0
  178. package/dist/bin/forgebook/verifyCommand.mjs +125 -0
  179. package/dist/bin/forgebook/verifyRun.d.ts +63 -0
  180. package/dist/bin/forgebook/verifyRun.js +108 -0
  181. package/dist/bin/forgebook/verifyVerdict.d.ts +40 -0
  182. package/dist/bin/forgebook/verifyVerdict.js +297 -0
  183. package/dist/bin/forgebook/workflowActions.d.ts +23 -0
  184. package/dist/bin/forgebook/workflowActions.js +23 -0
  185. package/dist/bin/forgebook-docs/catalogueMarkdown.js +12 -1
  186. package/dist/src/addressArgs.d.ts +29 -5
  187. package/dist/src/addressArgs.js +58 -16
  188. package/dist/src/addressArgsParam.d.ts +54 -0
  189. package/dist/src/addressArgsParam.js +51 -0
  190. package/dist/src/addressTexts.d.ts +14 -0
  191. package/dist/src/addressTexts.js +28 -21
  192. package/dist/src/agentIndexFile.d.ts +11 -0
  193. package/dist/src/agentIndexFile.js +11 -0
  194. package/dist/src/argConditions.d.ts +52 -0
  195. package/dist/src/argConditions.js +80 -0
  196. package/dist/src/argControl.d.ts +100 -0
  197. package/dist/src/argControl.js +0 -0
  198. package/dist/src/argExpression.d.ts +21 -0
  199. package/dist/src/argExpression.js +30 -0
  200. package/dist/src/argTypes.d.ts +40 -51
  201. package/dist/src/argTypes.js +66 -184
  202. package/dist/src/argsProps.d.ts +3 -3
  203. package/dist/src/argsProps.js +11 -5
  204. package/dist/src/bundlerErrors.d.ts +29 -0
  205. package/dist/src/bundlerErrors.js +49 -0
  206. package/dist/src/catalogue.d.ts +31 -0
  207. package/dist/src/catalogue.js +13 -2
  208. package/dist/src/catalogueRefs.d.ts +75 -0
  209. package/dist/src/catalogueRefs.js +122 -0
  210. package/dist/src/componentDocs.d.ts +71 -0
  211. package/dist/src/componentDocs.js +15 -2
  212. package/dist/src/frame/callValues.d.ts +19 -0
  213. package/dist/src/frame/callValues.js +58 -0
  214. package/dist/src/frame/canvasScheme.d.ts +33 -0
  215. package/dist/src/frame/canvasScheme.js +67 -0
  216. package/dist/src/frame/frame.css +36 -3
  217. package/dist/src/frame/frameStatus.d.ts +16 -1
  218. package/dist/src/frame/frameStatus.js +16 -1
  219. package/dist/src/frame/frameView.js +4 -3
  220. package/dist/src/frame/mountFrame.d.ts +7 -1
  221. package/dist/src/frame/mountFrame.js +153 -46
  222. package/dist/src/frame/panelValues.d.ts +35 -0
  223. package/dist/src/frame/panelValues.js +127 -0
  224. package/dist/src/frame/playActions.d.ts +39 -0
  225. package/dist/src/frame/playActions.js +98 -0
  226. package/dist/src/frame/playStepper.d.ts +28 -0
  227. package/dist/src/frame/playStepper.js +38 -0
  228. package/dist/src/frame/playStory.d.ts +9 -1
  229. package/dist/src/frame/playStory.js +49 -3
  230. package/dist/src/frame/renderer.d.ts +34 -1
  231. package/dist/src/frame/renderer.js +24 -0
  232. package/dist/src/frame/shellChannel.d.ts +1 -1
  233. package/dist/src/frame/shellChannel.js +1 -1
  234. package/dist/src/frame/shellCheck.d.ts +17 -0
  235. package/dist/src/frame/shellCheck.js +25 -0
  236. package/dist/src/frame/shellMessageCheck.d.ts +7 -0
  237. package/dist/src/frame/shellMessageCheck.js +53 -0
  238. package/dist/src/frame/storyContent.d.ts +50 -0
  239. package/dist/src/frame/storyContent.js +73 -0
  240. package/dist/src/frame/storyModule.d.ts +9 -0
  241. package/dist/src/frame/storyModule.js +20 -2
  242. package/dist/src/frame/storyRun.d.ts +15 -7
  243. package/dist/src/frame/storyRun.js +64 -15
  244. package/dist/src/frame/valueSheets.d.ts +35 -0
  245. package/dist/src/frame/valueSheets.js +99 -0
  246. package/dist/src/hotModules.d.ts +20 -0
  247. package/dist/src/hotModules.js +23 -0
  248. package/dist/src/jsxCode.d.ts +1 -14
  249. package/dist/src/jsxCode.js +46 -10
  250. package/dist/src/liveErrors.d.ts +30 -4
  251. package/dist/src/liveErrors.js +18 -3
  252. package/dist/src/messages.d.ts +77 -27
  253. package/dist/src/messages.js +58 -100
  254. package/dist/src/namedValues.d.ts +2 -26
  255. package/dist/src/namedValues.js +0 -47
  256. package/dist/src/pageConfig.d.ts +2 -0
  257. package/dist/src/playTrace.d.ts +19 -2
  258. package/dist/src/playTrace.js +10 -5
  259. package/dist/src/plugin.d.ts +10 -3
  260. package/dist/src/previewRelay.js +9 -1
  261. package/dist/src/printable.d.ts +12 -0
  262. package/dist/src/printable.js +22 -0
  263. package/dist/src/propsSignature.d.ts +37 -0
  264. package/dist/src/propsSignature.js +40 -0
  265. package/dist/src/search.d.ts +41 -5
  266. package/dist/src/search.js +93 -23
  267. package/dist/src/searchMatch.d.ts +4 -1
  268. package/dist/src/searchMatch.js +26 -5
  269. package/dist/src/searchTypos.d.ts +88 -0
  270. package/dist/src/searchTypos.js +178 -0
  271. package/dist/src/shapeValues.d.ts +86 -0
  272. package/dist/src/shapeValues.js +295 -0
  273. package/dist/src/shell/ApiReference.js +6 -3
  274. package/dist/src/shell/ApiTableBox.d.ts +15 -0
  275. package/dist/src/shell/ApiTableBox.js +11 -0
  276. package/dist/src/shell/AppearanceMenu.d.ts +4 -1
  277. package/dist/src/shell/AppearanceMenu.js +9 -6
  278. package/dist/src/shell/CodeTab.d.ts +3 -2
  279. package/dist/src/shell/CodeTab.js +3 -2
  280. package/dist/src/shell/CodeText.d.ts +1 -1
  281. package/dist/src/shell/CodeText.js +2 -3
  282. package/dist/src/shell/CompareGrid.js +1 -1
  283. package/dist/src/shell/ComponentPage.d.ts +1 -1
  284. package/dist/src/shell/ComponentPage.js +5 -1
  285. package/dist/src/shell/CustomControl.d.ts +34 -0
  286. package/dist/src/shell/CustomControl.js +132 -0
  287. package/dist/src/shell/DocContainers.js +1 -1
  288. package/dist/src/shell/DocPage.js +2 -2
  289. package/dist/src/shell/DroppedArgsList.d.ts +2 -2
  290. package/dist/src/shell/DroppedArgsList.js +1 -1
  291. package/dist/src/shell/EmbedPage.js +30 -12
  292. package/dist/src/shell/Example.d.ts +5 -1
  293. package/dist/src/shell/Example.js +16 -8
  294. package/dist/src/shell/FrameView.d.ts +6 -3
  295. package/dist/src/shell/FrameView.js +2 -2
  296. package/dist/src/shell/HomePage.d.ts +3 -1
  297. package/dist/src/shell/HomePage.js +16 -6
  298. package/dist/src/shell/InfoTip.js +2 -2
  299. package/dist/src/shell/InteractionsTab.d.ts +11 -4
  300. package/dist/src/shell/InteractionsTab.js +18 -2
  301. package/dist/src/shell/LazyPage.js +1 -1
  302. package/dist/src/shell/PackageHtml.js +3 -1
  303. package/dist/src/shell/PinnedControl.js +14 -62
  304. package/dist/src/shell/PinnedControlMenu.d.ts +44 -0
  305. package/dist/src/shell/PinnedControlMenu.js +72 -0
  306. package/dist/src/shell/PropFields.d.ts +3 -1
  307. package/dist/src/shell/PropFields.js +9 -6
  308. package/dist/src/shell/PropRows.d.ts +23 -2
  309. package/dist/src/shell/PropRows.js +58 -19
  310. package/dist/src/shell/PropsTab.d.ts +12 -5
  311. package/dist/src/shell/PropsTab.js +9 -21
  312. package/dist/src/shell/RefStoryPage.d.ts +33 -0
  313. package/dist/src/shell/RefStoryPage.js +123 -0
  314. package/dist/src/shell/SearchPanel.js +51 -24
  315. package/dist/src/shell/Shell.d.ts +18 -0
  316. package/dist/src/shell/Shell.js +137 -22
  317. package/dist/src/shell/ShortcutHelp.d.ts +22 -0
  318. package/dist/src/shell/ShortcutHelp.js +66 -0
  319. package/dist/src/shell/Sidebar.d.ts +17 -4
  320. package/dist/src/shell/Sidebar.js +92 -41
  321. package/dist/src/shell/SidebarDocs.js +2 -2
  322. package/dist/src/shell/SidebarEntries.js +5 -3
  323. package/dist/src/shell/SidebarHandle.d.ts +3 -5
  324. package/dist/src/shell/SidebarHandle.js +4 -4
  325. package/dist/src/shell/SidebarRefs.d.ts +39 -0
  326. package/dist/src/shell/SidebarRefs.js +99 -0
  327. package/dist/src/shell/SidebarSearch.js +37 -9
  328. package/dist/src/shell/SignatureReference.js +3 -1
  329. package/dist/src/shell/Stage.d.ts +10 -2
  330. package/dist/src/shell/Stage.js +29 -49
  331. package/dist/src/shell/StatusBadges.d.ts +54 -0
  332. package/dist/src/shell/StatusBadges.js +77 -0
  333. package/dist/src/shell/StoryCodeBlock.d.ts +8 -19
  334. package/dist/src/shell/StoryCodeBlock.js +7 -6
  335. package/dist/src/shell/SwitchGallery.d.ts +36 -0
  336. package/dist/src/shell/SwitchGallery.js +17 -0
  337. package/dist/src/shell/SwitchGalleryPanel.d.ts +37 -0
  338. package/dist/src/shell/SwitchGalleryPanel.js +99 -0
  339. package/dist/src/shell/TagFilter.d.ts +24 -0
  340. package/dist/src/shell/TagFilter.js +45 -0
  341. package/dist/src/shell/TagViews.d.ts +39 -0
  342. package/dist/src/shell/TagViews.js +20 -0
  343. package/dist/src/shell/Toolbar.d.ts +4 -1
  344. package/dist/src/shell/Toolbar.js +17 -7
  345. package/dist/src/shell/ToolbarControl.d.ts +3 -0
  346. package/dist/src/shell/ToolbarControl.js +23 -6
  347. package/dist/src/shell/ViewMenuPanel.js +6 -1
  348. package/dist/src/shell/argChecks.d.ts +22 -0
  349. package/dist/src/shell/argChecks.js +20 -0
  350. package/dist/src/shell/asideStory.js +7 -2
  351. package/dist/src/shell/audienceSections.css +9 -9
  352. package/dist/src/shell/catalogueContext.d.ts +1 -1
  353. package/dist/src/shell/catalogueContext.js +6 -1
  354. package/dist/src/shell/codeSpans.d.ts +27 -0
  355. package/dist/src/shell/codeSpans.js +76 -0
  356. package/dist/src/shell/compareVariants.d.ts +4 -2
  357. package/dist/src/shell/compareVariants.js +16 -8
  358. package/dist/src/shell/composition.d.ts +23 -0
  359. package/dist/src/shell/composition.js +26 -0
  360. package/dist/src/shell/controlCycle.d.ts +1 -1
  361. package/dist/src/shell/controlCycle.js +3 -2
  362. package/dist/src/shell/customControls.d.ts +55 -0
  363. package/dist/src/shell/customControls.js +70 -0
  364. package/dist/src/shell/docPage.css +22 -22
  365. package/dist/src/shell/dockTabs.d.ts +19 -3
  366. package/dist/src/shell/dockTabs.js +28 -20
  367. package/dist/src/shell/embed.css +7 -7
  368. package/dist/src/shell/framesOrigin.d.ts +7 -0
  369. package/dist/src/shell/framesOrigin.js +1 -1
  370. package/dist/src/shell/galleryPlace.d.ts +20 -0
  371. package/dist/src/shell/galleryPlace.js +26 -0
  372. package/dist/src/shell/icons.d.ts +1 -0
  373. package/dist/src/shell/icons.js +1 -0
  374. package/dist/src/shell/keyboard.d.ts +14 -12
  375. package/dist/src/shell/keyboard.js +21 -6
  376. package/dist/src/shell/laterStrings.d.ts +29 -0
  377. package/dist/src/shell/laterStrings.js +42 -3
  378. package/dist/src/shell/mountShell.js +3 -0
  379. package/dist/src/shell/pageStrings.d.ts +4 -0
  380. package/dist/src/shell/pageStrings.js +4 -0
  381. package/dist/src/shell/pageTagView.d.ts +18 -0
  382. package/dist/src/shell/pageTagView.js +10 -0
  383. package/dist/src/shell/playMemory.d.ts +14 -0
  384. package/dist/src/shell/playMemory.js +8 -0
  385. package/dist/src/shell/propNotes.d.ts +23 -0
  386. package/dist/src/shell/propNotes.js +37 -0
  387. package/dist/src/shell/refIndexLoad.d.ts +17 -0
  388. package/dist/src/shell/refIndexLoad.js +38 -0
  389. package/dist/src/shell/refParts.d.ts +34 -0
  390. package/dist/src/shell/refParts.js +9 -0
  391. package/dist/src/shell/refStory.css +21 -0
  392. package/dist/src/shell/refStrings.d.ts +13 -0
  393. package/dist/src/shell/refStrings.js +21 -0
  394. package/dist/src/shell/search.css +11 -11
  395. package/dist/src/shell/shell.css +348 -168
  396. package/dist/src/shell/shellScheme.js +2 -2
  397. package/dist/src/shell/shortcutHelp.css +64 -0
  398. package/dist/src/shell/stageArgs.d.ts +53 -0
  399. package/dist/src/shell/stageArgs.js +64 -0
  400. package/dist/src/shell/statusBadges.css +51 -0
  401. package/dist/src/shell/strings.d.ts +7 -16
  402. package/dist/src/shell/strings.js +12 -17
  403. package/dist/src/shell/switchGallery.css +104 -0
  404. package/dist/src/shell/tagFilter.css +46 -0
  405. package/dist/src/shell/tagView.d.ts +20 -0
  406. package/dist/src/shell/tagView.js +10 -0
  407. package/dist/src/shell/useAddressArgs.d.ts +9 -0
  408. package/dist/src/shell/useAddressArgs.js +56 -11
  409. package/dist/src/shell/useControlKeys.js +2 -2
  410. package/dist/src/shell/useEditedProblems.d.ts +6 -0
  411. package/dist/src/shell/useEditedProblems.js +40 -0
  412. package/dist/src/shell/useFrameMessages.js +3 -0
  413. package/dist/src/shell/useListedTree.d.ts +13 -0
  414. package/dist/src/shell/useListedTree.js +32 -0
  415. package/dist/src/shell/usePageFrames.js +2 -2
  416. package/dist/src/shell/usePopover.d.ts +5 -0
  417. package/dist/src/shell/usePopover.js +7 -1
  418. package/dist/src/shell/useRefIndex.d.ts +22 -0
  419. package/dist/src/shell/useRefIndex.js +36 -0
  420. package/dist/src/shell/useScrollStops.d.ts +20 -0
  421. package/dist/src/shell/useScrollStops.js +41 -0
  422. package/dist/src/shell/useShortcutHelp.d.ts +18 -0
  423. package/dist/src/shell/useShortcutHelp.js +32 -0
  424. package/dist/src/shell/useSidebarOverlay.d.ts +2 -1
  425. package/dist/src/shell/useSidebarOverlay.js +12 -4
  426. package/dist/src/shell/useStoryCode.d.ts +2 -1
  427. package/dist/src/shell/useStoryCode.js +12 -7
  428. package/dist/src/shell/useToolbarLayout.d.ts +5 -1
  429. package/dist/src/shell/useToolbarLayout.js +2 -2
  430. package/dist/src/shell/useWorstCase.d.ts +8 -2
  431. package/dist/src/shell/useWorstCase.js +2 -2
  432. package/dist/src/shell/valueEditors/FileEditor.d.ts +28 -0
  433. package/dist/src/shell/valueEditors/FileEditor.js +66 -0
  434. package/dist/src/shell/valueEditors/JsonEditor.d.ts +14 -0
  435. package/dist/src/shell/valueEditors/JsonEditor.js +53 -0
  436. package/dist/src/shell/valueEditors/ListEditor.d.ts +24 -0
  437. package/dist/src/shell/valueEditors/ListEditor.js +82 -0
  438. package/dist/src/shell/valueEditors/ObjectEditor.d.ts +32 -0
  439. package/dist/src/shell/valueEditors/ObjectEditor.js +70 -0
  440. package/dist/src/shell/valueEditors/PropEditor.d.ts +37 -0
  441. package/dist/src/shell/valueEditors/PropEditor.js +53 -0
  442. package/dist/src/shell/valueEditors/RecordEditor.d.ts +20 -0
  443. package/dist/src/shell/valueEditors/RecordEditor.js +84 -0
  444. package/dist/src/shell/valueEditors/SearchSelect.d.ts +42 -0
  445. package/dist/src/shell/valueEditors/SearchSelect.js +80 -0
  446. package/dist/src/shell/valueEditors/TokenEditor.d.ts +49 -0
  447. package/dist/src/shell/valueEditors/TokenEditor.js +74 -0
  448. package/dist/src/shell/valueEditors/UnionEditor.d.ts +20 -0
  449. package/dist/src/shell/valueEditors/UnionEditor.js +64 -0
  450. package/dist/src/shell/valueEditors/ValueField.d.ts +15 -0
  451. package/dist/src/shell/valueEditors/ValueField.js +147 -0
  452. package/dist/src/shell/valueEditors/editorStrings.d.ts +56 -0
  453. package/dist/src/shell/valueEditors/editorStrings.js +66 -0
  454. package/dist/src/shell/valueEditors/fieldTypes.d.ts +31 -0
  455. package/dist/src/shell/valueEditors/fieldTypes.js +0 -0
  456. package/dist/src/shell/valueEditors/valueEditors.css +153 -0
  457. package/dist/src/shell/worstArgs.d.ts +8 -5
  458. package/dist/src/shell/worstArgs.js +14 -7
  459. package/dist/src/shellTheme.d.ts +1 -1
  460. package/dist/src/shellTheme.js +15 -1
  461. package/dist/src/shellTheme.types.d.ts +4 -0
  462. package/dist/src/shellWord.d.ts +12 -0
  463. package/dist/src/shellWord.js +15 -0
  464. package/dist/src/sourceFiles.js +2 -1
  465. package/dist/src/storyArgTypes.d.ts +57 -0
  466. package/dist/src/storyArgTypes.js +195 -0
  467. package/dist/src/storyBackground.js +14 -3
  468. package/dist/src/storyCheck.d.ts +85 -3
  469. package/dist/src/storyCheck.js +23 -1
  470. package/dist/src/storyCodeText.d.ts +46 -0
  471. package/dist/src/storyCodeText.js +27 -0
  472. package/dist/src/storyControls.d.ts +100 -0
  473. package/dist/src/storyControls.js +100 -0
  474. package/dist/src/storyStatuses.d.ts +55 -0
  475. package/dist/src/storyStatuses.js +104 -0
  476. package/dist/src/storyTagNames.d.ts +25 -0
  477. package/dist/src/storyTagNames.js +25 -0
  478. package/dist/src/storyTags.d.ts +29 -0
  479. package/dist/src/storyTags.js +85 -0
  480. package/dist/src/storyTree.d.ts +13 -0
  481. package/dist/src/storyTree.js +24 -4
  482. package/dist/src/storybookArgs.d.ts +24 -0
  483. package/dist/src/storybookArgs.js +185 -0
  484. package/dist/src/switches.d.ts +66 -3
  485. package/dist/src/switches.js +42 -1
  486. package/dist/src/valueSchema.d.ts +28 -0
  487. package/dist/src/valueSchema.js +196 -0
  488. package/dist/src/valueShape.d.ts +94 -0
  489. package/dist/src/valueShape.js +25 -0
  490. package/dist/src/viewState.d.ts +8 -3
  491. package/dist/src/viewState.js +27 -10
  492. package/dist/src/vite/adapter.d.ts +40 -2
  493. package/dist/src/vite/adapter.js +1 -0
  494. package/dist/src/vite/agent.types.d.ts +347 -7
  495. package/dist/src/vite/agentApi.d.ts +23 -0
  496. package/dist/src/vite/agentApi.js +90 -17
  497. package/dist/src/vite/agentIndex.d.ts +0 -2
  498. package/dist/src/vite/agentIndex.js +5 -6
  499. package/dist/src/vite/agentRoutes.d.ts +20 -1
  500. package/dist/src/vite/agentRoutes.js +106 -65
  501. package/dist/src/vite/agentStatuses.d.ts +42 -0
  502. package/dist/src/vite/agentStatuses.js +67 -0
  503. package/dist/src/vite/agentStoryCode.d.ts +48 -0
  504. package/dist/src/vite/agentStoryCode.js +38 -0
  505. package/dist/src/vite/agentVisibility.d.ts +47 -0
  506. package/dist/src/vite/agentVisibility.js +174 -0
  507. package/dist/src/vite/appAudit.d.ts +134 -0
  508. package/dist/src/vite/appAudit.js +333 -0
  509. package/dist/src/vite/appBuildOption.d.ts +53 -0
  510. package/dist/src/vite/appBuildOption.js +55 -0
  511. package/dist/src/vite/appTokenFiles.d.ts +92 -0
  512. package/dist/src/vite/appTokenFiles.js +433 -0
  513. package/dist/src/vite/appTokens.d.ts +23 -0
  514. package/dist/src/vite/appTokens.js +275 -0
  515. package/dist/src/vite/builtTexts.d.ts +10 -0
  516. package/dist/src/vite/builtTexts.js +59 -22
  517. package/dist/src/vite/catalogueConfig.d.ts +3 -1
  518. package/dist/src/vite/catalogueConfig.js +15 -3
  519. package/dist/src/vite/changeCoverage.d.ts +74 -0
  520. package/dist/src/vite/changeCoverage.js +120 -0
  521. package/dist/src/vite/changedRoute.d.ts +30 -0
  522. package/dist/src/vite/changedRoute.js +197 -0
  523. package/dist/src/vite/checkCode.d.ts +105 -3
  524. package/dist/src/vite/checkCode.js +323 -36
  525. package/dist/src/vite/checkoutWatch.d.ts +97 -0
  526. package/dist/src/vite/checkoutWatch.js +287 -0
  527. package/dist/src/vite/closeWatch.d.ts +8 -0
  528. package/dist/src/vite/closeWatch.js +1 -1
  529. package/dist/src/vite/componentCache.d.ts +8 -0
  530. package/dist/src/vite/componentCache.js +66 -0
  531. package/dist/src/vite/componentGraph.d.ts +71 -0
  532. package/dist/src/vite/componentGraph.js +133 -0
  533. package/dist/src/vite/componentRules.d.ts +33 -0
  534. package/dist/src/vite/componentRules.js +105 -0
  535. package/dist/src/vite/componentScan.d.ts +69 -0
  536. package/dist/src/vite/componentScan.js +418 -0
  537. package/dist/src/vite/compositionCheck.d.ts +15 -0
  538. package/dist/src/vite/compositionCheck.js +243 -0
  539. package/dist/src/vite/config.d.ts +32 -1
  540. package/dist/src/vite/configFile.d.ts +14 -2
  541. package/dist/src/vite/configFile.js +124 -40
  542. package/dist/src/vite/configKeys.d.ts +15 -0
  543. package/dist/src/vite/configKeys.js +171 -0
  544. package/dist/src/vite/configLoadError.d.ts +23 -0
  545. package/dist/src/vite/configLoadError.js +71 -0
  546. package/dist/src/vite/cssDeclarations.d.ts +71 -0
  547. package/dist/src/vite/cssDeclarations.js +290 -0
  548. package/dist/src/vite/cssImports.d.ts +14 -0
  549. package/dist/src/vite/cssImports.js +48 -0
  550. package/dist/src/vite/cssReferences.d.ts +54 -0
  551. package/dist/src/vite/cssReferences.js +157 -0
  552. package/dist/src/vite/cssTokenValues.d.ts +50 -0
  553. package/dist/src/vite/cssTokenValues.js +233 -0
  554. package/dist/src/vite/designTokens.d.ts +24 -0
  555. package/dist/src/vite/designTokens.js +5 -1
  556. package/dist/src/vite/docsExtractor.d.ts +9 -3
  557. package/dist/src/vite/docsExtractor.js +11 -3
  558. package/dist/src/vite/docsProgram.d.ts +17 -4
  559. package/dist/src/vite/docsProgram.js +52 -11
  560. package/dist/src/vite/docsWorker.js +7 -2
  561. package/dist/src/vite/emptyStoryGlobs.d.ts +41 -0
  562. package/dist/src/vite/emptyStoryGlobs.js +52 -0
  563. package/dist/src/vite/fileImports.d.ts +17 -0
  564. package/dist/src/vite/fileImports.js +57 -0
  565. package/dist/src/vite/findComponent.d.ts +10 -2
  566. package/dist/src/vite/findComponent.js +27 -22
  567. package/dist/src/vite/findRoute.js +3 -2
  568. package/dist/src/vite/forcedStates.d.ts +9 -2
  569. package/dist/src/vite/forcedStates.js +12 -3
  570. package/dist/src/vite/forgebookPlugin.d.ts +2 -0
  571. package/dist/src/vite/forgebookPlugin.js +52 -72
  572. package/dist/src/vite/frameErrors.d.ts +19 -0
  573. package/dist/src/vite/frameErrors.js +70 -0
  574. package/dist/src/vite/framesServer.d.ts +12 -0
  575. package/dist/src/vite/framesServer.js +21 -4
  576. package/dist/src/vite/functionComponentDocs.js +81 -12
  577. package/dist/src/vite/generatedModules.js +4 -2
  578. package/dist/src/vite/gitChange.d.ts +38 -5
  579. package/dist/src/vite/gitChange.js +71 -11
  580. package/dist/src/vite/hiddenStoryFiles.d.ts +23 -0
  581. package/dist/src/vite/hiddenStoryFiles.js +107 -0
  582. package/dist/src/vite/hotSnippets.d.ts +38 -14
  583. package/dist/src/vite/hotSnippets.js +137 -39
  584. package/dist/src/vite/importedNames.d.ts +37 -0
  585. package/dist/src/vite/importedNames.js +138 -0
  586. package/dist/src/vite/indexFields.d.ts +6 -0
  587. package/dist/src/vite/indexFields.js +21 -0
  588. package/dist/src/vite/indexStoryFile.d.ts +8 -1
  589. package/dist/src/vite/indexStoryFile.js +22 -157
  590. package/dist/src/vite/jsxCallSites.d.ts +33 -0
  591. package/dist/src/vite/jsxCallSites.js +200 -0
  592. package/dist/src/vite/jsxInScripts.d.ts +67 -0
  593. package/dist/src/vite/jsxInScripts.js +138 -0
  594. package/dist/src/vite/jsxTree.d.ts +20 -0
  595. package/dist/src/vite/jsxTree.js +163 -0
  596. package/dist/src/vite/lineAndColumn.d.ts +13 -0
  597. package/dist/src/vite/lineAndColumn.js +18 -0
  598. package/dist/src/vite/lookAlikes.d.ts +65 -0
  599. package/dist/src/vite/lookAlikes.js +228 -0
  600. package/dist/src/vite/nearestToken.d.ts +17 -0
  601. package/dist/src/vite/nearestToken.js +9 -2
  602. package/dist/src/vite/packageEntries.d.ts +42 -0
  603. package/dist/src/vite/packageEntries.js +127 -0
  604. package/dist/src/vite/pages.d.ts +9 -1
  605. package/dist/src/vite/pages.js +108 -4
  606. package/dist/src/vite/pluginConfig.js +4 -0
  607. package/dist/src/vite/pluginIds.d.ts +2 -0
  608. package/dist/src/vite/pluginIds.js +5 -1
  609. package/dist/src/vite/pluginModules.d.ts +81 -11
  610. package/dist/src/vite/pluginModules.js +109 -21
  611. package/dist/src/vite/prebundled.d.ts +57 -15
  612. package/dist/src/vite/prebundled.js +80 -0
  613. package/dist/src/vite/previewTags.d.ts +25 -0
  614. package/dist/src/vite/previewTags.js +56 -0
  615. package/dist/src/vite/projectFiles.d.ts +54 -0
  616. package/dist/src/vite/projectFiles.js +116 -0
  617. package/dist/src/vite/projectPostcss.d.ts +70 -0
  618. package/dist/src/vite/projectPostcss.js +250 -0
  619. package/dist/src/vite/propDocs.d.ts +12 -0
  620. package/dist/src/vite/propDocs.js +130 -58
  621. package/dist/src/vite/propKind.d.ts +40 -0
  622. package/dist/src/vite/propKind.js +71 -0
  623. package/dist/src/vite/propTypeNotes.d.ts +22 -0
  624. package/dist/src/vite/propTypeNotes.js +51 -0
  625. package/dist/src/vite/publishedExports.d.ts +27 -0
  626. package/dist/src/vite/publishedExports.js +298 -0
  627. package/dist/src/vite/realFolder.d.ts +6 -0
  628. package/dist/src/vite/realFolder.js +25 -0
  629. package/dist/src/vite/refsConfig.d.ts +39 -0
  630. package/dist/src/vite/refsConfig.js +54 -0
  631. package/dist/src/vite/reuseCheck.d.ts +45 -0
  632. package/dist/src/vite/reuseCheck.js +260 -0
  633. package/dist/src/vite/runningVersions.d.ts +33 -0
  634. package/dist/src/vite/runningVersions.js +25 -0
  635. package/dist/src/vite/scriptProblems.d.ts +60 -0
  636. package/dist/src/vite/scriptProblems.js +155 -0
  637. package/dist/src/vite/searchModule.js +3 -2
  638. package/dist/src/vite/searchRoute.js +4 -2
  639. package/dist/src/vite/shapeDocs.d.ts +36 -0
  640. package/dist/src/vite/shapeDocs.js +177 -0
  641. package/dist/src/vite/singleFileComponent.d.ts +17 -0
  642. package/dist/src/vite/singleFileComponent.js +83 -0
  643. package/dist/src/vite/sourceText.d.ts +34 -0
  644. package/dist/src/vite/sourceText.js +72 -0
  645. package/dist/src/vite/sourceTokens.d.ts +7 -0
  646. package/dist/src/vite/sourceTokens.js +7 -2
  647. package/dist/src/vite/stackLines.d.ts +49 -0
  648. package/dist/src/vite/stackLines.js +96 -0
  649. package/dist/src/vite/storyCode.d.ts +22 -7
  650. package/dist/src/vite/storyCode.js +263 -37
  651. package/dist/src/vite/storyCoverage.d.ts +48 -0
  652. package/dist/src/vite/storyCoverage.js +179 -0
  653. package/dist/src/vite/storyFilesModule.d.ts +48 -3
  654. package/dist/src/vite/storyFilesModule.js +105 -15
  655. package/dist/src/vite/storyPatterns.d.ts +31 -0
  656. package/dist/src/vite/storyPatterns.js +140 -5
  657. package/dist/src/vite/storyReach.d.ts +10 -2
  658. package/dist/src/vite/storyReach.js +15 -11
  659. package/dist/src/vite/storyTopLevel.d.ts +51 -0
  660. package/dist/src/vite/storyTopLevel.js +146 -0
  661. package/dist/src/vite/storylessRoutes.d.ts +4 -3
  662. package/dist/src/vite/storylessRoutes.js +210 -19
  663. package/dist/src/vite/switchValuesCheck.d.ts +19 -0
  664. package/dist/src/vite/switchValuesCheck.js +164 -0
  665. package/dist/src/vite/switchesDocument.d.ts +15 -0
  666. package/dist/src/vite/switchesDocument.js +47 -0
  667. package/dist/src/vite/tailwindConfigTokens.d.ts +41 -0
  668. package/dist/src/vite/tailwindConfigTokens.js +306 -0
  669. package/dist/src/vite/textImports.d.ts +15 -0
  670. package/dist/src/vite/textImports.js +58 -0
  671. package/dist/src/vite/textModules.d.ts +6 -5
  672. package/dist/src/vite/textModules.js +13 -8
  673. package/dist/src/vite/tokenAnswers.d.ts +6 -2
  674. package/dist/src/vite/tokenAnswers.js +11 -7
  675. package/dist/src/vite/typeParameters.d.ts +83 -0
  676. package/dist/src/vite/typeParameters.js +270 -0
  677. package/dist/src/vite/unionProps.d.ts +37 -0
  678. package/dist/src/vite/unionProps.js +121 -0
  679. package/dist/src/vite/unresolvedTokens.d.ts +20 -0
  680. package/dist/src/vite/unresolvedTokens.js +193 -0
  681. package/dist/src/vite/usageGraph.js +10 -52
  682. package/dist/src/vite/usageGuidance.d.ts +9 -2
  683. package/dist/src/vite/usageGuidance.js +36 -8
  684. package/dist/src/vite/usageImports.d.ts +35 -0
  685. package/dist/src/vite/usageImports.js +280 -0
  686. package/dist/src/vite/visibilityRoute.d.ts +16 -0
  687. package/dist/src/vite/visibilityRoute.js +320 -0
  688. package/dist/src/worstCase.d.ts +2 -0
  689. package/dist/src/worstCase.js +2 -0
  690. package/package.json +28 -8
@@ -1,6 +1,8 @@
1
- import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
1
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { useId, useState } from "react";
3
3
  import { deviceDefaultOf, shownDevice } from "../deviceView.js";
4
+ import { storyCodeText } from "../storyCodeText.js";
5
+ import { isFilterTag } from "../storyTagNames.js";
4
6
  import { frameAddress, schemeOf } from "../viewState.js";
5
7
  import { BoxWidthControl, useBoxWidth } from "./BoxWidth.js";
6
8
  import { CodeText } from "./CodeText.js";
@@ -10,8 +12,9 @@ import { DeviceSlot, deviceAddress, inkScheme, isWaitingForDevice, roomSizing, u
10
12
  import { FrameView } from "./FrameView.js";
11
13
  import { Icon } from "./icons.js";
12
14
  import { LATER_STRINGS } from "./laterStrings.js";
15
+ import { PageTagView } from "./pageTagView.js";
13
16
  import { StageViewport } from "./StageViewport.js";
14
- import { StoryCodeBlock, storyCodeText } from "./StoryCodeBlock.js";
17
+ import { StoryCodeBlock } from "./StoryCodeBlock.js";
15
18
  import { touchedView } from "./storyTouch.js";
16
19
  import { STRINGS } from "./strings.js";
17
20
  import { useCopy } from "./useCopy.js";
@@ -39,7 +42,12 @@ export const StoryLink = ({ story, hrefOf, onOpen, className, label, children })
39
42
  const ExampleCode = ({ id, source, isShown }) => {
40
43
  const { isCopied, copy } = useCopy();
41
44
  const write = useCodeWriter();
42
- return (_jsx("div", { id: id, className: "forgebook-example__code", "data-open": isShown ? "" : undefined, inert: !isShown, children: _jsxs("div", { className: "forgebook-example__code-inner", children: [_jsx("button", { type: "button", className: "forgebook-example__copy", onClick: () => copy(storyCodeText(source, write)), "aria-live": "polite", children: isCopied ? STRINGS.copied : LATER_STRINGS.copy }), _jsx(StoryCodeBlock, { ...source })] }) }));
45
+ // a page of fifty stories would hold fifty coloured blocks nobody opened: the code is written when first shown, then
46
+ // kept, so closing it plays the same transition as opening it
47
+ const [wasShown, setWasShown] = useState(isShown);
48
+ if (isShown && !wasShown)
49
+ setWasShown(true);
50
+ return (_jsx("div", { id: id, className: "forgebook-example__code", "data-open": isShown ? "" : undefined, inert: !isShown, children: _jsx("div", { className: "forgebook-example__code-inner", children: wasShown || isShown ? (_jsxs(_Fragment, { children: [_jsx("button", { type: "button", className: "forgebook-example__copy", onClick: () => copy(storyCodeText(source, write)), "aria-live": "polite", children: isCopied ? STRINGS.copied : LATER_STRINGS.copy }), _jsx(StoryCodeBlock, { ...source })] })) : null }) }));
43
51
  };
44
52
  /**
45
53
  * The height an example's story is drawn at least at: its scene's, and over the page the room its stage has.
@@ -49,11 +57,11 @@ const ExampleCode = ({ id, source, isShown }) => {
49
57
  */
50
58
  const sceneHeightOf = (story, stageHeight) => stageHeight === undefined ? story.height : Math.max(story.height ?? 0, stageHeight);
51
59
  /**
52
- * An example's title, a link to its story's page, and its description.
60
+ * An example's title, a link to its story's page with the statuses the story holds of its own, and its description.
53
61
  *
54
62
  * @param props - the story and how its link opens it.
55
63
  */
56
- const ExampleHead = ({ story, context }) => (_jsxs("header", { className: "forgebook-example__head", children: [_jsx("h4", { className: "forgebook-example__title", children: _jsx(StoryLink, { story: story, hrefOf: context.hrefOf, onOpen: context.onOpen, className: "forgebook-link", children: story.name }) }), story.description === undefined ? null : (_jsx("p", { className: "forgebook-example__description", children: _jsx(CodeText, { text: story.description }) }))] }));
64
+ const ExampleHead = ({ story, titleTag: Title, context }) => (_jsxs("header", { className: "forgebook-example__head", children: [_jsxs(Title, { className: "forgebook-example__title", children: [_jsx(StoryLink, { story: story, hrefOf: context.hrefOf, onOpen: context.onOpen, className: "forgebook-link", children: story.name }), story.tags.some(isFilterTag) ? (_jsx(PageTagView, { place: "story", story: story, component: context.component })) : null] }), story.description === undefined ? null : (_jsx("p", { className: "forgebook-example__description", children: _jsx(CodeText, { text: story.description }) }))] }));
57
65
  /**
58
66
  * What keeps an example's place while its box is over the page: a slot of its height in the list, and the shade
59
67
  * under the box, a press on which brings it back.
@@ -137,17 +145,17 @@ const exampleHeights = (story, context, isDemo) => {
137
145
  * @param props - the story, whether it is the demo, whether its frame may load, where the queue watches it, and what
138
146
  * every example shares.
139
147
  */
140
- export const Example = ({ story, isDemo, isMounted, observe, ...context }) => {
148
+ export const Example = ({ story, isDemo, titleTag = "h3", isMounted, observe, ...context }) => {
141
149
  const { source, hasCode, isCodeShown, setIsCodeShown } = useExampleCode(story, context);
142
150
  const codeId = useId();
143
151
  const full = useFullPage();
144
152
  const { touch } = useCatalogue();
145
153
  const { shown, framed, scheme } = useExampleDevice(story, context);
146
154
  // the frame loads with the story's finger as it is then; a change after reaches it live, keeping the story's state
147
- const loadedView = useLoadedView(context.frameView.sheets, touchedView(context.frameView, story.id, context.touches, touch));
155
+ const loadedView = useLoadedView(`${context.frameView.sheets}|${context.frameView.play}`, touchedView(context.frameView, story.id, context.touches, touch));
148
156
  const boxWidth = useBoxWidth(full.isOver, context.view.width);
149
157
  const { fallback: fallbackHeight, least: leastHeight } = exampleHeights(story, context, isDemo);
150
- return (_jsxs("article", { ref: observe, className: "forgebook-example", "data-demo": isDemo ? "" : undefined, "aria-label": isDemo ? STRINGS.frameTitle(context.component.name, story.name) : story.name, children: [isDemo ? null : _jsx(ExampleHead, { story: story, context: context }), full.isOver ? _jsx(FullPageSlot, { full: full }) : null, _jsxs("div", { ref: full.boxRef, className: "forgebook-example__box", "data-full": full.isOver ? "" : undefined, ...(full.isFull ? { role: "dialog", "aria-label": story.name } : {}), children: [_jsx("div", { ref: full.stageRef, className: "forgebook-example__stage", children: _jsx(StageViewport, { ...roomSizing(framed, {
158
+ return (_jsxs("article", { ref: observe, className: "forgebook-example", "data-demo": isDemo ? "" : undefined, "aria-label": isDemo ? STRINGS.frameTitle(context.component.name, story.name) : story.name, children: [isDemo ? null : _jsx(ExampleHead, { story: story, titleTag: titleTag, context: context }), full.isOver ? _jsx(FullPageSlot, { full: full }) : null, _jsxs("div", { ref: full.boxRef, className: "forgebook-example__box", "data-full": full.isOver ? "" : undefined, ...(full.isFull ? { role: "dialog", "aria-label": story.name } : {}), children: [_jsx("div", { ref: full.stageRef, className: "forgebook-example__stage", children: _jsx(StageViewport, { ...roomSizing(framed, {
151
159
  width: boxWidth.width,
152
160
  onWidthChange: boxWidth.onWidthChange,
153
161
  onShownWidthChange: boxWidth.onShownWidthChange,
@@ -29,8 +29,11 @@ export type FrameViewProps = {
29
29
  readonly fixedHeight?: number | undefined;
30
30
  /** The addresses of the frames that finished loading: until its own is there, the frame shows that it loads. */
31
31
  readonly settled: ReadonlySet<string>;
32
- /** The iframe. */
33
- readonly ref?: Ref<HTMLIFrameElement>;
32
+ /**
33
+ * The ref the iframe is given. A prop of its own rather than `ref`: the shell runs on the project's React, and React 18
34
+ * passes no `ref` to a function component. Short, as every byte of the shell's first load counts.
35
+ */
36
+ readonly frame?: Ref<HTMLIFrameElement>;
34
37
  };
35
38
  /**
36
39
  * A story's frame, as tall as its story.
@@ -38,7 +41,7 @@ export type FrameViewProps = {
38
41
  * @param props - the frame's title, address, the reported heights, the height until its own arrives, and the frames
39
42
  * that finished loading.
40
43
  */
41
- export declare const FrameView: ({ title, address, heights, fallbackHeight, settled, sceneHeight, fixedHeight, ref }: FrameViewProps) => ReactNode;
44
+ export declare const FrameView: ({ title, address, heights, fallbackHeight, settled, sceneHeight, fixedHeight, frame }: FrameViewProps) => ReactNode;
42
45
  /**
43
46
  * Sends a message to every frame inside an element.
44
47
  *
@@ -7,14 +7,14 @@ import { STRINGS } from "./strings.js";
7
7
  * @param props - the frame's title, address, the reported heights, the height until its own arrives, and the frames
8
8
  * that finished loading.
9
9
  */
10
- export const FrameView = ({ title, address, heights, fallbackHeight, settled, sceneHeight = 0, fixedHeight, ref }) => {
10
+ export const FrameView = ({ title, address, heights, fallbackHeight, settled, sceneHeight = 0, fixedHeight, frame }) => {
11
11
  const isLoading = !settled.has(address);
12
12
  // while it loads, an empty document reports a height of nothing: the box keeps its waiting height until the story
13
13
  // is there, then takes the story's
14
14
  const reported = heights.get(address);
15
15
  const contentHeight = isLoading ? Math.max(reported ?? 0, fallbackHeight) : (reported ?? fallbackHeight);
16
16
  const height = fixedHeight ?? Math.max(contentHeight, sceneHeight);
17
- return (_jsxs("div", { className: "forgebook-frame-box", "data-loading": isLoading ? "" : undefined, children: [_jsx("iframe", { ref: ref, className: "forgebook-frame-view", title: title, src: address, ...storyFrameAttributes(), style: { height } }), isLoading ? (_jsx("div", { className: "forgebook-frame-loading", role: "status", children: _jsxs("span", { className: "forgebook-frame-loading__label", children: [_jsx("span", { className: "forgebook-spinner", "aria-hidden": "true" }), STRINGS.loadingStory] }) })) : null] }));
17
+ return (_jsxs("div", { className: "forgebook-frame-box", "data-loading": isLoading ? "" : undefined, children: [_jsx("iframe", { ref: frame, className: "forgebook-frame-view", title: title, src: address, ...storyFrameAttributes(), style: { height } }), isLoading ? (_jsx("div", { className: "forgebook-frame-loading", role: "status", children: _jsxs("span", { className: "forgebook-frame-loading__label", children: [_jsx("span", { className: "forgebook-spinner", "aria-hidden": "true" }), STRINGS.loadingStory] }) })) : null] }));
18
18
  };
19
19
  /**
20
20
  * Sends a message to every frame inside an element.
@@ -21,6 +21,8 @@ export type HomePageProps = {
21
21
  readonly tree: StoryTree;
22
22
  /** The sources, for their introductions. */
23
23
  readonly sources: readonly StorySource[];
24
+ /** The catalogue's own story patterns, for a home with no story to say where it looks; none by default. */
25
+ readonly storyGlobs?: readonly string[] | undefined;
24
26
  /** The pages opened last, the newest first. */
25
27
  readonly recent: readonly RecentPage[];
26
28
  /** A page's address, for its link. */
@@ -109,5 +111,5 @@ export declare const LibrarySection: ({ source, sources, hrefOf, onOpen }: Pick<
109
111
  *
110
112
  * @param props - the title, the tree, the sources, the recent pages, and how to open a page.
111
113
  */
112
- export declare const HomePage: ({ title, tree, sources, recent, hrefOf, onOpen, header }: HomePageProps) => ReactNode;
114
+ export declare const HomePage: ({ title, tree, sources, storyGlobs, recent, hrefOf, onOpen, header }: HomePageProps) => ReactNode;
113
115
  export {};
@@ -2,12 +2,18 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { useState } from "react";
3
3
  import { findPage } from "../pageTree.js";
4
4
  import { findComponent, findStory } from "../storyTree.js";
5
+ import { LATER_STRINGS } from "./laterStrings.js";
5
6
  import { PackageHtml } from "./PackageHtml.js";
6
7
  import { PAGE_STRINGS } from "./pageStrings.js";
7
- import { STRINGS } from "./strings.js";
8
8
  import { useLoaded } from "./useLoaded.js";
9
9
  /** The most components a family's card lists before "Show all". */
10
10
  const CARD_COMPONENTS = 6;
11
+ /**
12
+ * What the home says before the first story: where the catalogue looks, and how to write one.
13
+ *
14
+ * @param props - the catalogue's story patterns.
15
+ */
16
+ const NoStoryYet = ({ globs }) => (_jsxs("section", { className: "forgebook-home__no-story", "data-testid": "forgebook-no-story", children: [_jsx("p", { children: PAGE_STRINGS.homeNoStoryLead }), _jsx("ul", { children: globs.map((glob) => (_jsx("li", { children: _jsx("code", { children: glob }) }, glob))) }), _jsx("p", { children: PAGE_STRINGS.homeNoStoryHelp }), _jsx("pre", { children: _jsx("code", { children: PAGE_STRINGS.homeNoStoryCommand }) })] }));
11
17
  /** A link to a page, opened in place unless the user asks for another tab. */
12
18
  export const PageLink = ({ page, hrefOf, onOpen, className, children }) => (_jsx("a", { className: className, href: hrefOf(page), onClick: (event) => {
13
19
  if (event.metaKey || event.ctrlKey || event.shiftKey || event.button !== 0)
@@ -83,7 +89,7 @@ export const FamilyCard = ({ family, hrefOf, onOpen }) => {
83
89
  *
84
90
  * @param props - the source, and how to open a page.
85
91
  */
86
- export const DocsCard = ({ source, hrefOf, onOpen }) => (_jsxs("article", { className: "forgebook-home__card", "aria-label": STRINGS.docsNav, children: [_jsx("h3", { className: "forgebook-home__card-title", children: STRINGS.docsNav }), _jsx("ul", { className: "forgebook-home__components", children: source.pages.map((page) => (_jsx("li", { children: _jsx(PageLink, { page: { kind: "page", id: page.id }, hrefOf: hrefOf, onOpen: onOpen, className: "forgebook-link", children: page.name }) }, page.id))) })] }));
92
+ export const DocsCard = ({ source, hrefOf, onOpen }) => (_jsxs("article", { className: "forgebook-home__card", "aria-label": LATER_STRINGS.docsNav, children: [_jsx("h3", { className: "forgebook-home__card-title", children: LATER_STRINGS.docsNav }), _jsx("ul", { className: "forgebook-home__components", children: source.pages.map((page) => (_jsx("li", { children: _jsx(PageLink, { page: { kind: "page", id: page.id }, hrefOf: hrefOf, onOpen: onOpen, className: "forgebook-link", children: page.name }) }, page.id))) })] }));
87
93
  /**
88
94
  * How many components a tree has, in every library.
89
95
  *
@@ -117,8 +123,12 @@ export const LibrarySection = ({ source, sources, hrefOf, onOpen }) => (_jsxs("s
117
123
  *
118
124
  * @param props - the title, the tree, the sources, the recent pages, and how to open a page.
119
125
  */
120
- export const HomePage = ({ title, tree, sources, recent, hrefOf, onOpen, header }) => {
121
- return (_jsxs("div", { className: "forgebook-workspace", children: [header, _jsx("div", { className: "forgebook-scroll", children: _jsxs("div", { className: "forgebook-home", children: [_jsxs("header", { className: "forgebook-home__head", children: [_jsx("h1", { className: "forgebook-home__title", children: title }), _jsx("p", { className: "forgebook-doc__lead", children: tree.sources.length === 0
122
- ? PAGE_STRINGS.homeEmpty
123
- : PAGE_STRINGS.homeSummary(componentCount(tree), libraryCount(tree)) })] }), _jsx(RecentSection, { tree: tree, recent: recent, hrefOf: hrefOf, onOpen: onOpen }), tree.sources.map((source) => (_jsx(LibrarySection, { source: source, sources: sources, hrefOf: hrefOf, onOpen: onOpen }, source.id)))] }) })] }));
126
+ export const HomePage = ({ title, tree, sources, storyGlobs = [], recent, hrefOf, onOpen, header }) => {
127
+ // a catalogue that names patterns and lists nothing is one about to get its first story: a build never gets here, since
128
+ // it stops on a pattern that matches nothing
129
+ const listingGlobs = storyGlobs.filter((glob) => !glob.startsWith("!") || glob.startsWith("!("));
130
+ const isWaiting = listingGlobs.length > 0 && componentCount(tree) === 0;
131
+ return (_jsxs("div", { className: "forgebook-workspace", children: [header, _jsx("div", { className: "forgebook-scroll", children: _jsxs("div", { className: "forgebook-home", children: [_jsxs("header", { className: "forgebook-home__head", children: [_jsx("h1", { className: "forgebook-home__title", children: title }), _jsxs("p", { className: "forgebook-doc__lead", children: [isWaiting ? PAGE_STRINGS.homeNoStoryTitle : null, !isWaiting && tree.sources.length === 0 ? PAGE_STRINGS.homeEmpty : null, !isWaiting && tree.sources.length > 0
132
+ ? PAGE_STRINGS.homeSummary(componentCount(tree), libraryCount(tree))
133
+ : null] })] }), isWaiting ? _jsx(NoStoryYet, { globs: listingGlobs }) : null, _jsx(RecentSection, { tree: tree, recent: recent, hrefOf: hrefOf, onOpen: onOpen }), tree.sources.map((source) => (_jsx(LibrarySection, { source: source, sources: sources, hrefOf: hrefOf, onOpen: onOpen }, source.id)))] }) })] }));
124
134
  };
@@ -11,7 +11,7 @@ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-run
11
11
  */
12
12
  import { useId, useRef } from "react";
13
13
  import { Icon } from "./icons.js";
14
- import { STRINGS } from "./strings.js";
14
+ import { LATER_STRINGS } from "./laterStrings.js";
15
15
  /** The room kept between the note, its button and the window's edges, in CSS px. */
16
16
  const GAP_PX = 6;
17
17
  /**
@@ -40,7 +40,7 @@ export const InfoTip = ({ note, about }) => {
40
40
  if (noteRef.current?.matches(":popover-open") === true)
41
41
  noteRef.current.hidePopover();
42
42
  };
43
- return (_jsxs(_Fragment, { children: [_jsx("button", { ref: buttonRef, type: "button", className: "forgebook-info-tip", "aria-label": STRINGS.aboutControl(about), "aria-describedby": noteId,
43
+ return (_jsxs(_Fragment, { children: [_jsx("button", { ref: buttonRef, type: "button", className: "forgebook-info-tip", "aria-label": LATER_STRINGS.aboutControl(about), "aria-describedby": noteId,
44
44
  // its own note is its tooltip: an empty title keeps a parent's (a pinned control's key) from showing over it
45
45
  title: "", onPointerEnter: show, onPointerLeave: hide, onFocus: show, onBlur: hide, onKeyDown: (event) => {
46
46
  // an open note takes the first Escape; the menu around it, the next
@@ -1,21 +1,28 @@
1
1
  /**
2
2
  * The panel's Interactions tab: the story's play function as it ran, whether it passed or where it failed, each step
3
- * it named with `step`, and a button that runs it again on a fresh mount.
3
+ * it named with `step`, each action it took through its context's tools, a button that runs it again on a fresh mount,
4
+ * and a debugger that stops it before each action.
4
5
  *
5
6
  * @module
6
7
  */
7
8
  import type { ReactNode } from "react";
9
+ import type { PlayStepCommand } from "../messages.ts";
8
10
  import type { PlayTrace } from "../playTrace.ts";
11
+ import type { ViewState } from "../viewState.ts";
9
12
  /** The tab's props. */
10
13
  export type InteractionsTabProps = {
11
14
  /** The play's trace. */
12
15
  readonly trace: PlayTrace;
13
- /** Runs the play again on a fresh mount. */
14
- readonly onPlayAgain: () => void;
16
+ /** Runs the play again on a fresh mount, or steps through it. */
17
+ readonly onPlayStep: (command: PlayStepCommand) => void;
18
+ /** The view, whose play switch it shows. */
19
+ readonly view: ViewState;
20
+ /** Changes the view. */
21
+ readonly onViewChange: (view: ViewState) => void;
15
22
  };
16
23
  /**
17
24
  * The Interactions tab.
18
25
  *
19
26
  * @param props - the trace and how to run the play again.
20
27
  */
21
- export declare const InteractionsTab: ({ trace, onPlayAgain }: InteractionsTabProps) => ReactNode;
28
+ export declare const InteractionsTab: (props: InteractionsTabProps) => ReactNode;
@@ -1,11 +1,27 @@
1
- import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
1
+ import { jsxs as _jsxs, jsx as _jsx, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { useCatalogue } from "./catalogueContext.js";
2
3
  import { LATER_STRINGS } from "./laterStrings.js";
4
+ import { rememberPlay } from "./playMemory.js";
3
5
  import { STRINGS } from "./strings.js";
4
6
  /** A status with its time, as a line ends. */
5
7
  const StatusNote = ({ status, ms }) => (_jsxs("span", { className: "forgebook-play__status", "data-status": status, children: [STRINGS.playStatus[status], ms === undefined ? null : ` · ${LATER_STRINGS.playTime(ms)}`] }));
8
+ /** Actions, in order; nothing when there are none. */
9
+ const ActionList = ({ actions }) => actions.length === 0 ? null : (_jsx("ol", { className: "forgebook-play__actions", children: actions.map((action, index) => (_jsxs("li", { className: "forgebook-play__action", "data-status": action.status, children: [_jsx("code", { className: "forgebook-play__label", children: action.label }), _jsx(StatusNote, { status: action.status, ms: action.ms }), action.error === undefined ? null : _jsx("p", { className: "forgebook-play__error", children: action.error })] }, index))) }));
10
+ /** The buttons that run the play: to its end, or one action at a time. */
11
+ const PlayButtons = ({ trace, onPlayStep }) => trace.pausedAt === undefined ? (_jsxs(_Fragment, { children: [_jsx("button", { type: "button", className: "forgebook-button", disabled: trace.status === "running", onClick: () => onPlayStep("start"), children: LATER_STRINGS.playStepThrough }), _jsx("button", { type: "button", className: "forgebook-button", disabled: trace.status === "running", onClick: () => onPlayStep("again"), children: trace.status === "off" ? LATER_STRINGS.playRun : LATER_STRINGS.playAgain })] })) : (_jsxs(_Fragment, { children: [_jsx("button", { type: "button", className: "forgebook-button", onClick: () => onPlayStep("next"), children: LATER_STRINGS.playNext }), _jsx("button", { type: "button", className: "forgebook-button", onClick: () => onPlayStep("continue"), children: LATER_STRINGS.playContinue })] }));
6
12
  /**
7
13
  * The Interactions tab.
8
14
  *
9
15
  * @param props - the trace and how to run the play again.
10
16
  */
11
- export const InteractionsTab = ({ trace, onPlayAgain }) => (_jsxs("div", { className: "forgebook-prop-group", "aria-live": "polite", children: [_jsxs("div", { className: "forgebook-calls__head", children: [_jsxs("h3", { className: "forgebook-prop-group__title", children: [LATER_STRINGS.playTitle, " ", _jsx(StatusNote, { status: trace.status, ms: trace.ms })] }), _jsx("button", { type: "button", className: "forgebook-button", disabled: trace.status === "running", onClick: onPlayAgain, children: LATER_STRINGS.playAgain })] }), trace.error === undefined ? null : (_jsx("p", { className: "forgebook-problems", role: "alert", children: trace.error })), trace.steps.length === 0 ? (_jsx("p", { className: "forgebook-prop__description", children: LATER_STRINGS.playNoSteps })) : (_jsx("ol", { className: "forgebook-play__steps", children: trace.steps.map((step, index) => (_jsxs("li", { className: "forgebook-play__step", "data-status": step.status, children: [_jsx("span", { className: "forgebook-play__label", children: step.label }), _jsx(StatusNote, { status: step.status, ms: step.ms }), step.error === undefined ? null : _jsx("p", { className: "forgebook-play__error", children: step.error })] }, index))) }))] }));
17
+ export const InteractionsTab = (props) => {
18
+ const { trace, view, onViewChange } = props;
19
+ const catalogue = useCatalogue();
20
+ const actions = trace.actions ?? [];
21
+ const outside = actions.filter((action) => action.step === undefined);
22
+ return (_jsxs("div", { className: "forgebook-prop-group", "aria-live": "polite", children: [_jsxs("div", { className: "forgebook-calls__head", children: [_jsxs("h3", { className: "forgebook-prop-group__title", children: [LATER_STRINGS.playTitle, " ", _jsx(StatusNote, { status: trace.status, ms: trace.ms })] }), _jsx("div", { className: "forgebook-play__buttons", children: _jsx(PlayButtons, { ...props }) })] }), _jsxs("label", { className: "forgebook-play__switch", children: [_jsx("input", { type: "checkbox", checked: view.play === "on", onChange: (event) => {
23
+ const play = event.target.checked ? "on" : "off";
24
+ rememberPlay(catalogue, play);
25
+ onViewChange({ ...view, play });
26
+ } }), LATER_STRINGS.playOnOpen] }), trace.pausedAt === undefined ? null : (_jsx("p", { className: "forgebook-play__paused", role: "status", children: LATER_STRINGS.playPaused(trace.pausedAt) })), trace.error === undefined ? null : (_jsx("p", { className: "forgebook-problems", role: "alert", children: trace.error })), trace.steps.length === 0 && actions.length === 0 ? (_jsx("p", { className: "forgebook-prop__description", children: trace.status === "off" ? LATER_STRINGS.playOff : LATER_STRINGS.playNoSteps })) : null, trace.steps.length === 0 ? null : (_jsx("ol", { className: "forgebook-play__steps", children: trace.steps.map((step, index) => (_jsxs("li", { className: "forgebook-play__step", "data-status": step.status, children: [_jsx("span", { className: "forgebook-play__label", children: step.label }), _jsx(StatusNote, { status: step.status, ms: step.ms }), step.error === undefined ? null : _jsx("p", { className: "forgebook-play__error", children: step.error }), _jsx(ActionList, { actions: actions.filter((action) => action.step === index) })] }, index))) })), _jsx(ActionList, { actions: outside }), actions.length === 0 ? (_jsx("p", { className: "forgebook-prop__description", children: LATER_STRINGS.playActionsNote })) : null] }));
27
+ };
@@ -6,4 +6,4 @@ import { STRINGS } from "./strings.js";
6
6
  *
7
7
  * @param props - the page's module, its own props and the header.
8
8
  */
9
- export const LazyPage = ({ module, pageProps, header }) => (_jsx(LazyView, { module: module, props: pageProps, loading: _jsx("div", { className: "forgebook-workspace", "aria-busy": "true", children: header }), failed: (message) => (_jsxs("div", { className: "forgebook-workspace", children: [header, _jsxs("p", { className: "forgebook-problems", role: "alert", children: [STRINGS.pageLoadError, ": ", message] })] })) }));
9
+ export const LazyPage = ({ module, pageProps, header }) => (_jsx(LazyView, { module: module, props: pageProps, loading: _jsx("div", { className: "forgebook-workspace", "aria-busy": "true", children: header }), failed: (message) => (_jsxs("div", { className: "forgebook-workspace", children: [header, _jsxs("p", { className: "forgebook-problems", role: "alert", children: [STRINGS.pageLoadError, ". ", message] })] })) }));
@@ -1,12 +1,14 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { useScrollStops } from "./useScrollStops.js";
2
3
  /**
3
4
  * The package's HTML, as trusted as its stories' code: it comes from the package's own files, read at build time.
4
5
  *
5
6
  * @param props - the element's class and the HTML.
6
7
  */
7
8
  export const PackageHtml = ({ className, html }) => {
9
+ const rootRef = useScrollStops("pre", html);
8
10
  // biome-ignore lint/style/useNamingConvention: React's own name for markup set as HTML
9
11
  const markup = { __html: html };
10
12
  // biome-ignore lint/security/noDangerouslySetInnerHtml: the package's own Markdown, rendered by the plugin
11
- return _jsx("div", { className: className, dangerouslySetInnerHTML: markup });
13
+ return _jsx("div", { ref: rootRef, className: className, dangerouslySetInnerHTML: markup });
12
14
  };
@@ -6,70 +6,15 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
6
6
  *
7
7
  * @module
8
8
  */
9
- import { useCallback, useEffect, useLayoutEffect, useRef, useState } from "react";
9
+ import { useCallback, useState } from "react";
10
10
  import { controlLabel } from "./controlLabel.js";
11
- import { InfoTip } from "./InfoTip.js";
11
+ import { LazyView, lazyModule } from "./lazyModule.js";
12
12
  import { STRINGS } from "./strings.js";
13
13
  import { ToolbarControl } from "./ToolbarControl.js";
14
- /** The room the menu keeps from the window's edges, in CSS px. */
15
- const EDGE_PX = 8;
16
- /**
17
- * The control's menu: its two choices as menu items, the first focused, the arrow keys between them; closed by a
18
- * choice, a press outside or Escape, the focus going back where it was.
19
- *
20
- * @param props - the control, where the menu opens, what its choices do, and what closing it does.
21
- */
22
- const ControlMenu = ({ control, isHidden, at, layout, onClose }) => {
23
- const menuRef = useRef(null);
24
- // the menu stays inside the window: opened near its right or lower edge, it moves back by what would run past
25
- useLayoutEffect(() => {
26
- const menu = menuRef.current;
27
- if (menu === null)
28
- return;
29
- const box = menu.getBoundingClientRect();
30
- menu.style.left = `${Math.max(EDGE_PX, Math.min(at.x, window.innerWidth - box.width - EDGE_PX))}px`;
31
- menu.style.top = `${Math.max(EDGE_PX, Math.min(at.y, window.innerHeight - box.height - EDGE_PX))}px`;
32
- }, [at]);
33
- useEffect(() => {
34
- const before = document.activeElement;
35
- menuRef.current?.querySelector("[role=menuitem]")?.focus();
36
- const close = (event) => {
37
- const isOutside = event instanceof PointerEvent &&
38
- !(event.target instanceof Node && menuRef.current?.contains(event.target));
39
- const isEscape = event instanceof KeyboardEvent && event.key === "Escape";
40
- if (!isOutside && !isEscape)
41
- return;
42
- onClose();
43
- if (isEscape && before instanceof HTMLElement)
44
- before.focus();
45
- };
46
- document.addEventListener("pointerdown", close);
47
- document.addEventListener("keydown", close);
48
- return () => {
49
- document.removeEventListener("pointerdown", close);
50
- document.removeEventListener("keydown", close);
51
- };
52
- }, [onClose]);
53
- const step = (event) => {
54
- if (event.key !== "ArrowDown" && event.key !== "ArrowUp")
55
- return;
56
- event.preventDefault();
57
- const items = [...(menuRef.current?.querySelectorAll("[role=menuitem]") ?? [])];
58
- const focused = document.activeElement;
59
- const index = focused instanceof HTMLButtonElement ? items.indexOf(focused) : -1;
60
- const next = (index + (event.key === "ArrowDown" ? 1 : -1) + items.length) % items.length;
61
- items[next]?.focus();
62
- };
63
- const unpin = () => {
64
- onClose();
65
- layout.pin(control.id, false);
66
- };
67
- const toggleHidden = () => {
68
- onClose();
69
- layout.hide(control.id, !isHidden);
70
- };
71
- return (_jsxs("div", { ref: menuRef, className: "forgebook-context-menu", role: "menu", "aria-label": STRINGS.controlMenu(controlLabel(control)), style: { left: at.x, top: at.y }, onKeyDown: step, children: [_jsx("button", { type: "button", role: "menuitem", className: "forgebook-context-menu__item", onClick: unpin, children: STRINGS.unpinControl }), _jsx("button", { type: "button", role: "menuitem", className: "forgebook-context-menu__item", onClick: toggleHidden, children: isHidden ? STRINGS.showInView : STRINGS.hideInView })] }));
72
- };
14
+ /** A note's button, for the few switches with a note: most catalogues pin none of them. */
15
+ const INFO_TIP = lazyModule(() => import("./InfoTip.js").then((module) => module.InfoTip));
16
+ /** The control's menu, loaded the first time one opens. */
17
+ const CONTROL_MENU = lazyModule(() => import("./PinnedControlMenu.js").then((module) => module.ControlMenu));
73
18
  /**
74
19
  * A pinned control.
75
20
  *
@@ -89,5 +34,12 @@ export const PinnedControl = ({ control, isHidden, isChanged, layout, ...context
89
34
  };
90
35
  return (_jsxs("div", { className: "forgebook-toolbar__pinned", "data-control": control.id,
91
36
  // the key that cycles it, in the tooltip of every part that has no tooltip of its own
92
- title: shortcut === undefined ? undefined : STRINGS.cycleKey(controlLabel(control), shortcut.toUpperCase()), onContextMenu: open, children: [_jsx(ToolbarControl, { control: control, form: "bar", ...context }), control.kind === "switch" && control.switch.description !== undefined ? (_jsx(InfoTip, { note: control.switch.description, about: controlLabel(control) })) : null, isChanged ? (_jsx("span", { className: "forgebook-dot forgebook-toolbar__changed", role: "img", "aria-label": STRINGS.controlChanged(controlLabel(control)) })) : null, menuAt === undefined ? null : (_jsx(ControlMenu, { control: control, isHidden: isHidden, at: menuAt, layout: layout, onClose: close }))] }));
37
+ title: shortcut === undefined ? undefined : STRINGS.cycleKey(controlLabel(control), shortcut.toUpperCase()), onContextMenu: open, children: [_jsx(ToolbarControl, { control: control, form: "bar", ...context }), control.kind === "switch" && control.switch.description !== undefined ? (_jsx(LazyView, { module: INFO_TIP, props: { note: control.switch.description, about: controlLabel(control) }, loading: null, failed: () => null })) : null, isChanged ? (_jsx("span", { className: "forgebook-dot forgebook-toolbar__changed", role: "img", "aria-label": STRINGS.controlChanged(controlLabel(control)) })) : null, menuAt === undefined ? null : (_jsx(LazyView, { module: CONTROL_MENU, props: {
38
+ id: control.id,
39
+ label: controlLabel(control),
40
+ isHidden,
41
+ at: menuAt,
42
+ layout,
43
+ onClose: close
44
+ }, loading: null, failed: () => null }))] }));
93
45
  };
@@ -0,0 +1,44 @@
1
+ /**
2
+ * A pinned control's small menu, opened by a right-click or the keyboard's menu key: take it off the toolbar, hide it in
3
+ * the View menu or show it there again.
4
+ *
5
+ * @remarks
6
+ * Loaded the first time one opens (`PinnedControl.tsx`): the control is on the first screen, and few readers ever ask for
7
+ * its menu.
8
+ *
9
+ * @module
10
+ */
11
+ import { type ReactNode } from "react";
12
+ import type { ToolbarLayout } from "./useToolbarLayout.ts";
13
+ /** Where the menu opens, in the window's px. */
14
+ export type MenuPoint = {
15
+ /** From the window's left. */
16
+ readonly x: number;
17
+ /** From the window's top. */
18
+ readonly y: number;
19
+ };
20
+ /** The menu's props. */
21
+ export type ControlMenuProps = {
22
+ /** The control's id. */
23
+ readonly id: string;
24
+ /**
25
+ * The control's name. Given rather than read here: a module the page also imports would be taken into a chunk of its
26
+ * own, and the first load would grow by more than this menu saves.
27
+ */
28
+ readonly label: string;
29
+ /** Whether it takes no row in the View menu. */
30
+ readonly isHidden: boolean;
31
+ /** Where the menu opens. */
32
+ readonly at: MenuPoint;
33
+ /** The toolbar's arrangement, which its choices change. */
34
+ readonly layout: ToolbarLayout;
35
+ /** Called when it closes. */
36
+ readonly onClose: () => void;
37
+ };
38
+ /**
39
+ * The control's menu: its two choices as menu items, the first focused, the arrow keys between them; closed by a
40
+ * choice, a press outside or Escape, the focus going back where it was.
41
+ *
42
+ * @param props - the control, where the menu opens, what its choices do, and what closing it does.
43
+ */
44
+ export declare const ControlMenu: ({ id, label, isHidden, at, layout, onClose }: ControlMenuProps) => ReactNode;
@@ -0,0 +1,72 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /**
3
+ * A pinned control's small menu, opened by a right-click or the keyboard's menu key: take it off the toolbar, hide it in
4
+ * the View menu or show it there again.
5
+ *
6
+ * @remarks
7
+ * Loaded the first time one opens (`PinnedControl.tsx`): the control is on the first screen, and few readers ever ask for
8
+ * its menu.
9
+ *
10
+ * @module
11
+ */
12
+ import { useEffect, useLayoutEffect, useRef } from "react";
13
+ import { LATER_STRINGS } from "./laterStrings.js";
14
+ /** The room the menu keeps from the window's edges, in CSS px. */
15
+ const EDGE_PX = 8;
16
+ /**
17
+ * The control's menu: its two choices as menu items, the first focused, the arrow keys between them; closed by a
18
+ * choice, a press outside or Escape, the focus going back where it was.
19
+ *
20
+ * @param props - the control, where the menu opens, what its choices do, and what closing it does.
21
+ */
22
+ export const ControlMenu = ({ id, label, isHidden, at, layout, onClose }) => {
23
+ const menuRef = useRef(null);
24
+ // the menu stays inside the window: opened near its right or lower edge, it moves back by what would run past
25
+ useLayoutEffect(() => {
26
+ const menu = menuRef.current;
27
+ if (menu === null)
28
+ return;
29
+ const box = menu.getBoundingClientRect();
30
+ menu.style.left = `${Math.max(EDGE_PX, Math.min(at.x, window.innerWidth - box.width - EDGE_PX))}px`;
31
+ menu.style.top = `${Math.max(EDGE_PX, Math.min(at.y, window.innerHeight - box.height - EDGE_PX))}px`;
32
+ }, [at]);
33
+ useEffect(() => {
34
+ const before = document.activeElement;
35
+ menuRef.current?.querySelector("[role=menuitem]")?.focus();
36
+ const close = (event) => {
37
+ const isOutside = event instanceof PointerEvent &&
38
+ !(event.target instanceof Node && menuRef.current?.contains(event.target));
39
+ const isEscape = event instanceof KeyboardEvent && event.key === "Escape";
40
+ if (!isOutside && !isEscape)
41
+ return;
42
+ onClose();
43
+ if (isEscape && before instanceof HTMLElement)
44
+ before.focus();
45
+ };
46
+ document.addEventListener("pointerdown", close);
47
+ document.addEventListener("keydown", close);
48
+ return () => {
49
+ document.removeEventListener("pointerdown", close);
50
+ document.removeEventListener("keydown", close);
51
+ };
52
+ }, [onClose]);
53
+ const step = (event) => {
54
+ if (event.key !== "ArrowDown" && event.key !== "ArrowUp")
55
+ return;
56
+ event.preventDefault();
57
+ const items = [...(menuRef.current?.querySelectorAll("[role=menuitem]") ?? [])];
58
+ const focused = document.activeElement;
59
+ const index = focused instanceof HTMLButtonElement ? items.indexOf(focused) : -1;
60
+ const next = (index + (event.key === "ArrowDown" ? 1 : -1) + items.length) % items.length;
61
+ items[next]?.focus();
62
+ };
63
+ const unpin = () => {
64
+ onClose();
65
+ layout.pin(id, false);
66
+ };
67
+ const toggleHidden = () => {
68
+ onClose();
69
+ layout.hide(id, !isHidden);
70
+ };
71
+ return (_jsxs("div", { ref: menuRef, className: "forgebook-context-menu", role: "menu", "aria-label": LATER_STRINGS.controlMenu(label), style: { left: at.x, top: at.y }, onKeyDown: step, children: [_jsx("button", { type: "button", role: "menuitem", className: "forgebook-context-menu__item", onClick: unpin, children: LATER_STRINGS.unpinControl }), _jsx("button", { type: "button", role: "menuitem", className: "forgebook-context-menu__item", onClick: toggleHidden, children: isHidden ? LATER_STRINGS.showInView : LATER_STRINGS.hideInView })] }));
72
+ };
@@ -7,10 +7,12 @@
7
7
  import type { ReactNode } from "react";
8
8
  import type { PanelProp } from "../argTypes.ts";
9
9
  import { type ArgValue } from "../messages.ts";
10
- /** Called with a changed value; `undefined` removes the panel's value. */
10
+ /** Called with a changed value; `undefined` removes the panel's value, `UNSET_ARG` leaves the prop with none. */
11
11
  export type OnValueChange = (name: string, value: ArgValue | undefined) => void;
12
12
  /** A value as a text field shows it: texts and numbers as they are, anything else empty. */
13
13
  export declare const textOf: (value: ArgValue | undefined) => string;
14
+ /** The most options a native list holds before the panel offers a search among them. */
15
+ export declare const MOST_PLAIN_OPTIONS = 12;
14
16
  /**
15
17
  * A choice's control: buttons side by side for `radio` or a few short values, a list for `select` or otherwise, and
16
18
  * a multiple choice for `check` and `multi-select`.
@@ -1,5 +1,5 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
- import { isChoiceList } from "../messages.js";
2
+ import { isChoiceList, UNSET_ARG } from "../messages.js";
3
3
  import { Segmented } from "./Segmented.js";
4
4
  import { STRINGS } from "./strings.js";
5
5
  /** A value as a text field shows it: texts and numbers as they are, anything else empty. */
@@ -16,8 +16,10 @@ const dateFieldOf = (value) => {
16
16
  const local = new Date(value - date.getTimezoneOffset() * 60_000);
17
17
  return local.toISOString().slice(0, 16);
18
18
  };
19
- /** The value of the choice that leaves a prop to the story: no choice of a component is an empty text. */
19
+ /** The value of the choice that leaves a prop without one: no choice of a component is an empty text. */
20
20
  const UNSET = "";
21
+ /** The most options a native list holds before the panel offers a search among them. */
22
+ export const MOST_PLAIN_OPTIONS = 12;
21
23
  /** The most choices shown as buttons, and the longest label; past either, a list. */
22
24
  const FEW_CHOICES = { count: 4, length: 10 };
23
25
  /** Whether a choice's values fit side by side as buttons. */
@@ -52,11 +54,11 @@ export const ChoiceControl = ({ prop, value, descriptionId, onValueChange }) =>
52
54
  return (_jsx(Segmented, { label: prop.label ?? prop.name, options: [
53
55
  { value: UNSET, label: unsetLabel },
54
56
  ...choices.map((choice) => ({ value: choice, label: choiceLabel(prop, choice) }))
55
- ], value: choiceOf(value) ?? UNSET, onValueChange: (chosen) => onValueChange(prop.name, chosen === UNSET ? undefined : chosen) }));
57
+ ], value: choiceOf(value) ?? UNSET, onValueChange: (chosen) => onValueChange(prop.name, chosen === UNSET ? UNSET_ARG : chosen) }));
56
58
  }
57
59
  return (_jsxs("select", { "aria-label": prop.label ?? prop.name, "aria-describedby": descriptionId, value: textOf(value), onChange: (event) => {
58
60
  const chosen = choices.find((choice) => String(choice) === event.target.value);
59
- onValueChange(prop.name, chosen);
61
+ onValueChange(prop.name, chosen ?? UNSET_ARG);
60
62
  }, children: [_jsx("option", { value: "", children: unsetLabel }), choices.map((choice) => (_jsx("option", { value: String(choice), children: choiceLabel(prop, choice) }, String(choice))))] }));
61
63
  };
62
64
  /** A field for a number, a range or a date, as its `argTypes` say; a date's value is ms since the Unix epoch. */
@@ -66,7 +68,7 @@ export const NumberField = ({ prop, value, descriptionId, onValueChange }) => {
66
68
  return (_jsx("input", { type: "datetime-local", "aria-label": label, "aria-describedby": descriptionId, value: dateFieldOf(value), onChange: (event) => {
67
69
  const time = event.target.valueAsNumber;
68
70
  // the field's own value is in UTC: read back in the browser's time zone, as it was shown
69
- const local = Number.isNaN(time) ? undefined : time + new Date(time).getTimezoneOffset() * 60_000;
71
+ const local = Number.isNaN(time) ? UNSET_ARG : time + new Date(time).getTimezoneOffset() * 60_000;
70
72
  onValueChange(prop.name, local);
71
73
  } }));
72
74
  }
@@ -75,6 +77,7 @@ export const NumberField = ({ prop, value, descriptionId, onValueChange }) => {
75
77
  ...(prop.max === undefined ? {} : { max: prop.max }),
76
78
  ...(prop.step === undefined ? {} : { step: prop.step })
77
79
  };
78
- const change = (text) => onValueChange(prop.name, text === "" ? undefined : Number(text));
80
+ // a number has no empty value, so a cleared field leaves the prop with none
81
+ const change = (text) => onValueChange(prop.name, text === "" ? UNSET_ARG : Number(text));
79
82
  return (_jsxs(_Fragment, { children: [prop.control === "range" ? (_jsx("input", { type: "range", "aria-label": label, "aria-describedby": descriptionId, ...bounds, value: typeof value === "number" ? value : (prop.min ?? 0), onChange: (event) => change(event.target.value) })) : null, _jsx("input", { type: "number", "aria-label": prop.control === "range" ? STRINGS.rangeValue(label) : label, "aria-describedby": descriptionId, ...bounds, value: textOf(value), onChange: (event) => change(event.target.value) })] }));
80
83
  };