forgebook 0.3.3 → 0.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (713) hide show
  1. package/README.md +994 -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 +182 -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 +62 -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 +95 -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 +204 -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 +323 -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 +148 -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 +69 -185
  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 +83 -0
  211. package/dist/src/componentDocs.js +20 -3
  212. package/dist/src/controlCode.d.ts +27 -0
  213. package/dist/src/controlCode.js +41 -0
  214. package/dist/src/frame/callValues.d.ts +19 -0
  215. package/dist/src/frame/callValues.js +58 -0
  216. package/dist/src/frame/canvasScheme.d.ts +33 -0
  217. package/dist/src/frame/canvasScheme.js +67 -0
  218. package/dist/src/frame/controlValues.d.ts +39 -0
  219. package/dist/src/frame/controlValues.js +143 -0
  220. package/dist/src/frame/frame.css +36 -3
  221. package/dist/src/frame/frameStatus.d.ts +16 -1
  222. package/dist/src/frame/frameStatus.js +16 -1
  223. package/dist/src/frame/frameView.js +4 -3
  224. package/dist/src/frame/mountFrame.d.ts +10 -1
  225. package/dist/src/frame/mountFrame.js +160 -55
  226. package/dist/src/frame/panelControls.d.ts +67 -0
  227. package/dist/src/frame/panelControls.js +110 -0
  228. package/dist/src/frame/panelValues.d.ts +35 -0
  229. package/dist/src/frame/panelValues.js +127 -0
  230. package/dist/src/frame/playActions.d.ts +39 -0
  231. package/dist/src/frame/playActions.js +98 -0
  232. package/dist/src/frame/playStepper.d.ts +28 -0
  233. package/dist/src/frame/playStepper.js +38 -0
  234. package/dist/src/frame/playStory.d.ts +9 -1
  235. package/dist/src/frame/playStory.js +49 -3
  236. package/dist/src/frame/renderer.d.ts +34 -1
  237. package/dist/src/frame/renderer.js +24 -0
  238. package/dist/src/frame/shellChannel.d.ts +1 -1
  239. package/dist/src/frame/shellChannel.js +1 -1
  240. package/dist/src/frame/shellCheck.d.ts +17 -0
  241. package/dist/src/frame/shellCheck.js +25 -0
  242. package/dist/src/frame/shellMessageCheck.d.ts +7 -0
  243. package/dist/src/frame/shellMessageCheck.js +53 -0
  244. package/dist/src/frame/storyContent.d.ts +50 -0
  245. package/dist/src/frame/storyContent.js +73 -0
  246. package/dist/src/frame/storyModule.d.ts +9 -0
  247. package/dist/src/frame/storyModule.js +20 -2
  248. package/dist/src/frame/storyRun.d.ts +15 -7
  249. package/dist/src/frame/storyRun.js +64 -15
  250. package/dist/src/frame/valueSheets.d.ts +35 -0
  251. package/dist/src/frame/valueSheets.js +99 -0
  252. package/dist/src/hotModules.d.ts +20 -0
  253. package/dist/src/hotModules.js +23 -0
  254. package/dist/src/jsxCode.d.ts +1 -14
  255. package/dist/src/jsxCode.js +46 -10
  256. package/dist/src/liveErrors.d.ts +30 -4
  257. package/dist/src/liveErrors.js +18 -3
  258. package/dist/src/messages.d.ts +77 -27
  259. package/dist/src/messages.js +58 -100
  260. package/dist/src/namedValues.d.ts +2 -26
  261. package/dist/src/namedValues.js +0 -47
  262. package/dist/src/pageConfig.d.ts +2 -0
  263. package/dist/src/playTrace.d.ts +19 -2
  264. package/dist/src/playTrace.js +10 -5
  265. package/dist/src/plugin.d.ts +10 -3
  266. package/dist/src/previewRelay.js +9 -1
  267. package/dist/src/printable.d.ts +12 -0
  268. package/dist/src/printable.js +22 -0
  269. package/dist/src/propsSignature.d.ts +37 -0
  270. package/dist/src/propsSignature.js +40 -0
  271. package/dist/src/search.d.ts +41 -5
  272. package/dist/src/search.js +93 -23
  273. package/dist/src/searchMatch.d.ts +4 -1
  274. package/dist/src/searchMatch.js +26 -5
  275. package/dist/src/searchTypos.d.ts +88 -0
  276. package/dist/src/searchTypos.js +178 -0
  277. package/dist/src/shapeValues.d.ts +86 -0
  278. package/dist/src/shapeValues.js +295 -0
  279. package/dist/src/shell/ApiReference.js +6 -3
  280. package/dist/src/shell/ApiTableBox.d.ts +15 -0
  281. package/dist/src/shell/ApiTableBox.js +11 -0
  282. package/dist/src/shell/AppearanceMenu.d.ts +4 -1
  283. package/dist/src/shell/AppearanceMenu.js +9 -6
  284. package/dist/src/shell/AuthoredHome.js +3 -1
  285. package/dist/src/shell/CodeTab.d.ts +12 -6
  286. package/dist/src/shell/CodeTab.js +47 -3
  287. package/dist/src/shell/CodeText.d.ts +1 -1
  288. package/dist/src/shell/CodeText.js +2 -3
  289. package/dist/src/shell/CompareGrid.js +1 -1
  290. package/dist/src/shell/ComponentPage.d.ts +6 -6
  291. package/dist/src/shell/ComponentPage.js +8 -2
  292. package/dist/src/shell/CustomControl.d.ts +34 -0
  293. package/dist/src/shell/CustomControl.js +125 -0
  294. package/dist/src/shell/DocContainers.js +1 -1
  295. package/dist/src/shell/DocPage.js +2 -2
  296. package/dist/src/shell/DroppedArgsList.d.ts +2 -2
  297. package/dist/src/shell/DroppedArgsList.js +1 -1
  298. package/dist/src/shell/EmbedPage.js +30 -12
  299. package/dist/src/shell/Example.d.ts +5 -1
  300. package/dist/src/shell/Example.js +16 -8
  301. package/dist/src/shell/FrameView.d.ts +6 -3
  302. package/dist/src/shell/FrameView.js +2 -2
  303. package/dist/src/shell/HomePage.d.ts +3 -1
  304. package/dist/src/shell/HomePage.js +18 -6
  305. package/dist/src/shell/InfoTip.js +2 -2
  306. package/dist/src/shell/InteractionsTab.d.ts +11 -4
  307. package/dist/src/shell/InteractionsTab.js +18 -2
  308. package/dist/src/shell/LazyPage.js +1 -1
  309. package/dist/src/shell/PackageHtml.js +3 -1
  310. package/dist/src/shell/PageWidth.d.ts +29 -0
  311. package/dist/src/shell/PageWidth.js +18 -0
  312. package/dist/src/shell/PinnedControl.js +14 -62
  313. package/dist/src/shell/PinnedControlMenu.d.ts +44 -0
  314. package/dist/src/shell/PinnedControlMenu.js +72 -0
  315. package/dist/src/shell/PropFields.d.ts +3 -1
  316. package/dist/src/shell/PropFields.js +9 -6
  317. package/dist/src/shell/PropRows.d.ts +22 -11
  318. package/dist/src/shell/PropRows.js +62 -24
  319. package/dist/src/shell/PropsTab.d.ts +12 -5
  320. package/dist/src/shell/PropsTab.js +9 -22
  321. package/dist/src/shell/RefStoryPage.d.ts +33 -0
  322. package/dist/src/shell/RefStoryPage.js +123 -0
  323. package/dist/src/shell/SearchPanel.js +51 -24
  324. package/dist/src/shell/Shell.d.ts +18 -0
  325. package/dist/src/shell/Shell.js +141 -23
  326. package/dist/src/shell/ShortcutHelp.d.ts +22 -0
  327. package/dist/src/shell/ShortcutHelp.js +66 -0
  328. package/dist/src/shell/Sidebar.d.ts +17 -4
  329. package/dist/src/shell/Sidebar.js +92 -41
  330. package/dist/src/shell/SidebarDocs.js +2 -2
  331. package/dist/src/shell/SidebarEntries.js +5 -3
  332. package/dist/src/shell/SidebarHandle.d.ts +3 -5
  333. package/dist/src/shell/SidebarHandle.js +4 -4
  334. package/dist/src/shell/SidebarRefs.d.ts +39 -0
  335. package/dist/src/shell/SidebarRefs.js +99 -0
  336. package/dist/src/shell/SidebarSearch.js +37 -9
  337. package/dist/src/shell/SignatureReference.js +3 -1
  338. package/dist/src/shell/Stage.d.ts +10 -2
  339. package/dist/src/shell/Stage.js +29 -49
  340. package/dist/src/shell/StatusBadges.d.ts +54 -0
  341. package/dist/src/shell/StatusBadges.js +77 -0
  342. package/dist/src/shell/StoryCodeBlock.d.ts +8 -19
  343. package/dist/src/shell/StoryCodeBlock.js +7 -6
  344. package/dist/src/shell/StoryPicker.d.ts +4 -2
  345. package/dist/src/shell/StoryPicker.js +3 -3
  346. package/dist/src/shell/Switch.d.ts +29 -0
  347. package/dist/src/shell/Switch.js +11 -0
  348. package/dist/src/shell/SwitchGallery.d.ts +36 -0
  349. package/dist/src/shell/SwitchGallery.js +17 -0
  350. package/dist/src/shell/SwitchGalleryPanel.d.ts +37 -0
  351. package/dist/src/shell/SwitchGalleryPanel.js +99 -0
  352. package/dist/src/shell/TagFilter.d.ts +24 -0
  353. package/dist/src/shell/TagFilter.js +45 -0
  354. package/dist/src/shell/TagViews.d.ts +39 -0
  355. package/dist/src/shell/TagViews.js +20 -0
  356. package/dist/src/shell/Toolbar.d.ts +4 -1
  357. package/dist/src/shell/Toolbar.js +17 -7
  358. package/dist/src/shell/ToolbarControl.d.ts +3 -0
  359. package/dist/src/shell/ToolbarControl.js +23 -6
  360. package/dist/src/shell/ViewMenuPanel.js +6 -1
  361. package/dist/src/shell/argChecks.d.ts +22 -0
  362. package/dist/src/shell/argChecks.js +20 -0
  363. package/dist/src/shell/asideStory.js +7 -2
  364. package/dist/src/shell/audienceSections.css +9 -9
  365. package/dist/src/shell/catalogueContext.d.ts +1 -1
  366. package/dist/src/shell/catalogueContext.js +6 -1
  367. package/dist/src/shell/codeSpans.d.ts +27 -0
  368. package/dist/src/shell/codeSpans.js +76 -0
  369. package/dist/src/shell/compareVariants.d.ts +4 -2
  370. package/dist/src/shell/compareVariants.js +16 -8
  371. package/dist/src/shell/composition.d.ts +23 -0
  372. package/dist/src/shell/composition.js +26 -0
  373. package/dist/src/shell/controlCycle.d.ts +1 -1
  374. package/dist/src/shell/controlCycle.js +3 -2
  375. package/dist/src/shell/customControls.d.ts +62 -0
  376. package/dist/src/shell/customControls.js +81 -0
  377. package/dist/src/shell/docPage.css +22 -22
  378. package/dist/src/shell/dockTabs.d.ts +19 -3
  379. package/dist/src/shell/dockTabs.js +29 -20
  380. package/dist/src/shell/embed.css +7 -7
  381. package/dist/src/shell/frameOrder.d.ts +35 -0
  382. package/dist/src/shell/frameOrder.js +45 -0
  383. package/dist/src/shell/framesOrigin.d.ts +7 -0
  384. package/dist/src/shell/framesOrigin.js +1 -1
  385. package/dist/src/shell/galleryPlace.d.ts +20 -0
  386. package/dist/src/shell/galleryPlace.js +26 -0
  387. package/dist/src/shell/icons.d.ts +1 -0
  388. package/dist/src/shell/icons.js +1 -0
  389. package/dist/src/shell/keyboard.d.ts +14 -12
  390. package/dist/src/shell/keyboard.js +21 -6
  391. package/dist/src/shell/laterStrings.d.ts +30 -0
  392. package/dist/src/shell/laterStrings.js +43 -3
  393. package/dist/src/shell/mountShell.js +3 -0
  394. package/dist/src/shell/pageStrings.d.ts +4 -0
  395. package/dist/src/shell/pageStrings.js +4 -0
  396. package/dist/src/shell/pageTagView.d.ts +18 -0
  397. package/dist/src/shell/pageTagView.js +10 -0
  398. package/dist/src/shell/playMemory.d.ts +14 -0
  399. package/dist/src/shell/playMemory.js +8 -0
  400. package/dist/src/shell/propNotes.d.ts +23 -0
  401. package/dist/src/shell/propNotes.js +37 -0
  402. package/dist/src/shell/refIndexLoad.d.ts +17 -0
  403. package/dist/src/shell/refIndexLoad.js +38 -0
  404. package/dist/src/shell/refParts.d.ts +34 -0
  405. package/dist/src/shell/refParts.js +9 -0
  406. package/dist/src/shell/refStory.css +21 -0
  407. package/dist/src/shell/refStrings.d.ts +13 -0
  408. package/dist/src/shell/refStrings.js +21 -0
  409. package/dist/src/shell/search.css +11 -11
  410. package/dist/src/shell/shell.css +376 -169
  411. package/dist/src/shell/shellScheme.js +2 -2
  412. package/dist/src/shell/shortcutHelp.css +64 -0
  413. package/dist/src/shell/stageArgs.d.ts +53 -0
  414. package/dist/src/shell/stageArgs.js +64 -0
  415. package/dist/src/shell/statusBadges.css +51 -0
  416. package/dist/src/shell/strings.d.ts +7 -16
  417. package/dist/src/shell/strings.js +12 -17
  418. package/dist/src/shell/switchGallery.css +104 -0
  419. package/dist/src/shell/tagFilter.css +46 -0
  420. package/dist/src/shell/tagView.d.ts +20 -0
  421. package/dist/src/shell/tagView.js +10 -0
  422. package/dist/src/shell/useAddressArgs.d.ts +9 -0
  423. package/dist/src/shell/useAddressArgs.js +56 -11
  424. package/dist/src/shell/useControlKeys.js +2 -2
  425. package/dist/src/shell/useEditedProblems.d.ts +6 -0
  426. package/dist/src/shell/useEditedProblems.js +40 -0
  427. package/dist/src/shell/useFrameMessages.js +3 -0
  428. package/dist/src/shell/useFrameQueue.d.ts +8 -3
  429. package/dist/src/shell/useFrameQueue.js +42 -12
  430. package/dist/src/shell/useListedTree.d.ts +13 -0
  431. package/dist/src/shell/useListedTree.js +32 -0
  432. package/dist/src/shell/usePageFrames.js +2 -2
  433. package/dist/src/shell/usePopover.d.ts +5 -0
  434. package/dist/src/shell/usePopover.js +7 -1
  435. package/dist/src/shell/useRefIndex.d.ts +22 -0
  436. package/dist/src/shell/useRefIndex.js +36 -0
  437. package/dist/src/shell/useScrollSettled.d.ts +18 -0
  438. package/dist/src/shell/useScrollSettled.js +56 -0
  439. package/dist/src/shell/useScrollStops.d.ts +20 -0
  440. package/dist/src/shell/useScrollStops.js +41 -0
  441. package/dist/src/shell/useShortcutHelp.d.ts +18 -0
  442. package/dist/src/shell/useShortcutHelp.js +32 -0
  443. package/dist/src/shell/useSidebarOverlay.d.ts +2 -1
  444. package/dist/src/shell/useSidebarOverlay.js +12 -4
  445. package/dist/src/shell/useStoryCode.d.ts +2 -1
  446. package/dist/src/shell/useStoryCode.js +12 -7
  447. package/dist/src/shell/useToolbarLayout.d.ts +5 -1
  448. package/dist/src/shell/useToolbarLayout.js +2 -2
  449. package/dist/src/shell/useWorstCase.d.ts +8 -2
  450. package/dist/src/shell/useWorstCase.js +2 -2
  451. package/dist/src/shell/valueEditors/FileEditor.d.ts +28 -0
  452. package/dist/src/shell/valueEditors/FileEditor.js +66 -0
  453. package/dist/src/shell/valueEditors/JsonEditor.d.ts +14 -0
  454. package/dist/src/shell/valueEditors/JsonEditor.js +53 -0
  455. package/dist/src/shell/valueEditors/ListEditor.d.ts +24 -0
  456. package/dist/src/shell/valueEditors/ListEditor.js +82 -0
  457. package/dist/src/shell/valueEditors/ObjectEditor.d.ts +32 -0
  458. package/dist/src/shell/valueEditors/ObjectEditor.js +70 -0
  459. package/dist/src/shell/valueEditors/PropEditor.d.ts +37 -0
  460. package/dist/src/shell/valueEditors/PropEditor.js +53 -0
  461. package/dist/src/shell/valueEditors/RecordEditor.d.ts +20 -0
  462. package/dist/src/shell/valueEditors/RecordEditor.js +84 -0
  463. package/dist/src/shell/valueEditors/SearchSelect.d.ts +42 -0
  464. package/dist/src/shell/valueEditors/SearchSelect.js +80 -0
  465. package/dist/src/shell/valueEditors/TokenEditor.d.ts +49 -0
  466. package/dist/src/shell/valueEditors/TokenEditor.js +74 -0
  467. package/dist/src/shell/valueEditors/UnionEditor.d.ts +20 -0
  468. package/dist/src/shell/valueEditors/UnionEditor.js +64 -0
  469. package/dist/src/shell/valueEditors/ValueField.d.ts +15 -0
  470. package/dist/src/shell/valueEditors/ValueField.js +148 -0
  471. package/dist/src/shell/valueEditors/editorStrings.d.ts +56 -0
  472. package/dist/src/shell/valueEditors/editorStrings.js +66 -0
  473. package/dist/src/shell/valueEditors/fieldTypes.d.ts +31 -0
  474. package/dist/src/shell/valueEditors/fieldTypes.js +0 -0
  475. package/dist/src/shell/valueEditors/valueEditors.css +153 -0
  476. package/dist/src/shell/worstArgs.d.ts +8 -5
  477. package/dist/src/shell/worstArgs.js +14 -7
  478. package/dist/src/shellTheme.d.ts +1 -1
  479. package/dist/src/shellTheme.js +15 -1
  480. package/dist/src/shellTheme.types.d.ts +4 -0
  481. package/dist/src/shellWord.d.ts +12 -0
  482. package/dist/src/shellWord.js +15 -0
  483. package/dist/src/sourceFiles.js +2 -1
  484. package/dist/src/storyArgTypes.d.ts +57 -0
  485. package/dist/src/storyArgTypes.js +195 -0
  486. package/dist/src/storyBackground.js +14 -3
  487. package/dist/src/storyCheck.d.ts +99 -3
  488. package/dist/src/storyCheck.js +39 -1
  489. package/dist/src/storyCodeText.d.ts +52 -0
  490. package/dist/src/storyCodeText.js +30 -0
  491. package/dist/src/storyControls.d.ts +103 -0
  492. package/dist/src/storyControls.js +100 -0
  493. package/dist/src/storyStatuses.d.ts +55 -0
  494. package/dist/src/storyStatuses.js +104 -0
  495. package/dist/src/storyTagNames.d.ts +25 -0
  496. package/dist/src/storyTagNames.js +25 -0
  497. package/dist/src/storyTags.d.ts +29 -0
  498. package/dist/src/storyTags.js +85 -0
  499. package/dist/src/storyTree.d.ts +13 -0
  500. package/dist/src/storyTree.js +24 -4
  501. package/dist/src/storybookArgs.d.ts +24 -0
  502. package/dist/src/storybookArgs.js +185 -0
  503. package/dist/src/switches.d.ts +66 -3
  504. package/dist/src/switches.js +42 -1
  505. package/dist/src/valueSchema.d.ts +28 -0
  506. package/dist/src/valueSchema.js +196 -0
  507. package/dist/src/valueShape.d.ts +94 -0
  508. package/dist/src/valueShape.js +25 -0
  509. package/dist/src/viewState.d.ts +8 -3
  510. package/dist/src/viewState.js +27 -10
  511. package/dist/src/vite/adapter.d.ts +40 -2
  512. package/dist/src/vite/adapter.js +1 -0
  513. package/dist/src/vite/agent.types.d.ts +354 -7
  514. package/dist/src/vite/agentApi.d.ts +23 -0
  515. package/dist/src/vite/agentApi.js +90 -17
  516. package/dist/src/vite/agentIndex.d.ts +0 -2
  517. package/dist/src/vite/agentIndex.js +5 -6
  518. package/dist/src/vite/agentRoutes.d.ts +20 -1
  519. package/dist/src/vite/agentRoutes.js +135 -66
  520. package/dist/src/vite/agentStatuses.d.ts +42 -0
  521. package/dist/src/vite/agentStatuses.js +67 -0
  522. package/dist/src/vite/agentStoryCode.d.ts +51 -0
  523. package/dist/src/vite/agentStoryCode.js +44 -0
  524. package/dist/src/vite/agentVisibility.d.ts +47 -0
  525. package/dist/src/vite/agentVisibility.js +174 -0
  526. package/dist/src/vite/appAudit.d.ts +134 -0
  527. package/dist/src/vite/appAudit.js +333 -0
  528. package/dist/src/vite/appBuildOption.d.ts +53 -0
  529. package/dist/src/vite/appBuildOption.js +55 -0
  530. package/dist/src/vite/appTokenFiles.d.ts +92 -0
  531. package/dist/src/vite/appTokenFiles.js +433 -0
  532. package/dist/src/vite/appTokens.d.ts +23 -0
  533. package/dist/src/vite/appTokens.js +275 -0
  534. package/dist/src/vite/argControlsConfig.d.ts +30 -0
  535. package/dist/src/vite/argControlsConfig.js +176 -0
  536. package/dist/src/vite/builtTexts.d.ts +10 -0
  537. package/dist/src/vite/builtTexts.js +59 -22
  538. package/dist/src/vite/catalogueConfig.d.ts +3 -1
  539. package/dist/src/vite/catalogueConfig.js +21 -4
  540. package/dist/src/vite/changeCoverage.d.ts +74 -0
  541. package/dist/src/vite/changeCoverage.js +120 -0
  542. package/dist/src/vite/changedRoute.d.ts +30 -0
  543. package/dist/src/vite/changedRoute.js +197 -0
  544. package/dist/src/vite/checkCode.d.ts +105 -3
  545. package/dist/src/vite/checkCode.js +323 -36
  546. package/dist/src/vite/checkoutWatch.d.ts +97 -0
  547. package/dist/src/vite/checkoutWatch.js +287 -0
  548. package/dist/src/vite/closeWatch.d.ts +8 -0
  549. package/dist/src/vite/closeWatch.js +1 -1
  550. package/dist/src/vite/componentCache.d.ts +8 -0
  551. package/dist/src/vite/componentCache.js +66 -0
  552. package/dist/src/vite/componentGraph.d.ts +71 -0
  553. package/dist/src/vite/componentGraph.js +133 -0
  554. package/dist/src/vite/componentRules.d.ts +33 -0
  555. package/dist/src/vite/componentRules.js +105 -0
  556. package/dist/src/vite/componentScan.d.ts +69 -0
  557. package/dist/src/vite/componentScan.js +418 -0
  558. package/dist/src/vite/compositionCheck.d.ts +15 -0
  559. package/dist/src/vite/compositionCheck.js +243 -0
  560. package/dist/src/vite/config.d.ts +67 -1
  561. package/dist/src/vite/configFile.d.ts +15 -2
  562. package/dist/src/vite/configFile.js +109 -40
  563. package/dist/src/vite/configKeys.d.ts +15 -0
  564. package/dist/src/vite/configKeys.js +172 -0
  565. package/dist/src/vite/configLoadError.d.ts +23 -0
  566. package/dist/src/vite/configLoadError.js +71 -0
  567. package/dist/src/vite/cssDeclarations.d.ts +71 -0
  568. package/dist/src/vite/cssDeclarations.js +290 -0
  569. package/dist/src/vite/cssImports.d.ts +14 -0
  570. package/dist/src/vite/cssImports.js +48 -0
  571. package/dist/src/vite/cssReferences.d.ts +54 -0
  572. package/dist/src/vite/cssReferences.js +157 -0
  573. package/dist/src/vite/cssTokenValues.d.ts +50 -0
  574. package/dist/src/vite/cssTokenValues.js +233 -0
  575. package/dist/src/vite/designTokens.d.ts +24 -0
  576. package/dist/src/vite/designTokens.js +5 -1
  577. package/dist/src/vite/docsExtractor.d.ts +9 -3
  578. package/dist/src/vite/docsExtractor.js +11 -3
  579. package/dist/src/vite/docsProgram.d.ts +17 -4
  580. package/dist/src/vite/docsProgram.js +52 -11
  581. package/dist/src/vite/docsWorker.js +7 -2
  582. package/dist/src/vite/emptyStoryGlobs.d.ts +41 -0
  583. package/dist/src/vite/emptyStoryGlobs.js +52 -0
  584. package/dist/src/vite/fileImports.d.ts +17 -0
  585. package/dist/src/vite/fileImports.js +57 -0
  586. package/dist/src/vite/findComponent.d.ts +10 -2
  587. package/dist/src/vite/findComponent.js +27 -22
  588. package/dist/src/vite/findRoute.js +3 -2
  589. package/dist/src/vite/forcedStates.d.ts +9 -2
  590. package/dist/src/vite/forcedStates.js +12 -3
  591. package/dist/src/vite/forgebookPlugin.d.ts +2 -0
  592. package/dist/src/vite/forgebookPlugin.js +55 -73
  593. package/dist/src/vite/frameErrors.d.ts +19 -0
  594. package/dist/src/vite/frameErrors.js +70 -0
  595. package/dist/src/vite/framesServer.d.ts +12 -0
  596. package/dist/src/vite/framesServer.js +21 -4
  597. package/dist/src/vite/functionComponentDocs.js +81 -12
  598. package/dist/src/vite/generatedModules.js +4 -2
  599. package/dist/src/vite/gitChange.d.ts +38 -5
  600. package/dist/src/vite/gitChange.js +71 -11
  601. package/dist/src/vite/hiddenStoryFiles.d.ts +23 -0
  602. package/dist/src/vite/hiddenStoryFiles.js +107 -0
  603. package/dist/src/vite/hotSnippets.d.ts +38 -14
  604. package/dist/src/vite/hotSnippets.js +137 -39
  605. package/dist/src/vite/importedNames.d.ts +37 -0
  606. package/dist/src/vite/importedNames.js +138 -0
  607. package/dist/src/vite/indexFields.d.ts +6 -0
  608. package/dist/src/vite/indexFields.js +21 -0
  609. package/dist/src/vite/indexStoryFile.d.ts +8 -1
  610. package/dist/src/vite/indexStoryFile.js +22 -157
  611. package/dist/src/vite/jsxCallSites.d.ts +33 -0
  612. package/dist/src/vite/jsxCallSites.js +200 -0
  613. package/dist/src/vite/jsxInScripts.d.ts +67 -0
  614. package/dist/src/vite/jsxInScripts.js +138 -0
  615. package/dist/src/vite/jsxTree.d.ts +20 -0
  616. package/dist/src/vite/jsxTree.js +163 -0
  617. package/dist/src/vite/lineAndColumn.d.ts +13 -0
  618. package/dist/src/vite/lineAndColumn.js +18 -0
  619. package/dist/src/vite/lookAlikes.d.ts +65 -0
  620. package/dist/src/vite/lookAlikes.js +228 -0
  621. package/dist/src/vite/nearestToken.d.ts +17 -0
  622. package/dist/src/vite/nearestToken.js +9 -2
  623. package/dist/src/vite/packageEntries.d.ts +42 -0
  624. package/dist/src/vite/packageEntries.js +127 -0
  625. package/dist/src/vite/pages.d.ts +9 -1
  626. package/dist/src/vite/pages.js +119 -4
  627. package/dist/src/vite/pluginConfig.js +4 -0
  628. package/dist/src/vite/pluginIds.d.ts +2 -0
  629. package/dist/src/vite/pluginIds.js +5 -1
  630. package/dist/src/vite/pluginModules.d.ts +81 -11
  631. package/dist/src/vite/pluginModules.js +109 -21
  632. package/dist/src/vite/prebundled.d.ts +57 -15
  633. package/dist/src/vite/prebundled.js +80 -0
  634. package/dist/src/vite/previewTags.d.ts +25 -0
  635. package/dist/src/vite/previewTags.js +56 -0
  636. package/dist/src/vite/projectFiles.d.ts +54 -0
  637. package/dist/src/vite/projectFiles.js +116 -0
  638. package/dist/src/vite/projectPostcss.d.ts +70 -0
  639. package/dist/src/vite/projectPostcss.js +250 -0
  640. package/dist/src/vite/propDocs.d.ts +12 -0
  641. package/dist/src/vite/propDocs.js +187 -60
  642. package/dist/src/vite/propKind.d.ts +40 -0
  643. package/dist/src/vite/propKind.js +71 -0
  644. package/dist/src/vite/propTypeNotes.d.ts +22 -0
  645. package/dist/src/vite/propTypeNotes.js +51 -0
  646. package/dist/src/vite/publishedExports.d.ts +27 -0
  647. package/dist/src/vite/publishedExports.js +298 -0
  648. package/dist/src/vite/realFolder.d.ts +6 -0
  649. package/dist/src/vite/realFolder.js +25 -0
  650. package/dist/src/vite/refsConfig.d.ts +39 -0
  651. package/dist/src/vite/refsConfig.js +54 -0
  652. package/dist/src/vite/reuseCheck.d.ts +45 -0
  653. package/dist/src/vite/reuseCheck.js +260 -0
  654. package/dist/src/vite/runningVersions.d.ts +33 -0
  655. package/dist/src/vite/runningVersions.js +25 -0
  656. package/dist/src/vite/scriptProblems.d.ts +60 -0
  657. package/dist/src/vite/scriptProblems.js +155 -0
  658. package/dist/src/vite/searchModule.js +3 -2
  659. package/dist/src/vite/searchRoute.js +4 -2
  660. package/dist/src/vite/shapeDocs.d.ts +36 -0
  661. package/dist/src/vite/shapeDocs.js +177 -0
  662. package/dist/src/vite/singleFileComponent.d.ts +17 -0
  663. package/dist/src/vite/singleFileComponent.js +83 -0
  664. package/dist/src/vite/sourceText.d.ts +34 -0
  665. package/dist/src/vite/sourceText.js +72 -0
  666. package/dist/src/vite/sourceTokens.d.ts +7 -0
  667. package/dist/src/vite/sourceTokens.js +7 -2
  668. package/dist/src/vite/stackLines.d.ts +49 -0
  669. package/dist/src/vite/stackLines.js +96 -0
  670. package/dist/src/vite/storyCode.d.ts +22 -7
  671. package/dist/src/vite/storyCode.js +263 -37
  672. package/dist/src/vite/storyCoverage.d.ts +48 -0
  673. package/dist/src/vite/storyCoverage.js +179 -0
  674. package/dist/src/vite/storyFilesModule.d.ts +48 -3
  675. package/dist/src/vite/storyFilesModule.js +105 -15
  676. package/dist/src/vite/storyPatterns.d.ts +31 -0
  677. package/dist/src/vite/storyPatterns.js +140 -5
  678. package/dist/src/vite/storyReach.d.ts +10 -2
  679. package/dist/src/vite/storyReach.js +15 -11
  680. package/dist/src/vite/storyTopLevel.d.ts +51 -0
  681. package/dist/src/vite/storyTopLevel.js +146 -0
  682. package/dist/src/vite/storylessRoutes.d.ts +4 -3
  683. package/dist/src/vite/storylessRoutes.js +210 -19
  684. package/dist/src/vite/switchValuesCheck.d.ts +19 -0
  685. package/dist/src/vite/switchValuesCheck.js +164 -0
  686. package/dist/src/vite/switchesDocument.d.ts +15 -0
  687. package/dist/src/vite/switchesDocument.js +47 -0
  688. package/dist/src/vite/tailwindConfigTokens.d.ts +41 -0
  689. package/dist/src/vite/tailwindConfigTokens.js +306 -0
  690. package/dist/src/vite/textImports.d.ts +15 -0
  691. package/dist/src/vite/textImports.js +58 -0
  692. package/dist/src/vite/textModules.d.ts +6 -5
  693. package/dist/src/vite/textModules.js +13 -8
  694. package/dist/src/vite/tokenAnswers.d.ts +6 -2
  695. package/dist/src/vite/tokenAnswers.js +11 -7
  696. package/dist/src/vite/typeParameters.d.ts +83 -0
  697. package/dist/src/vite/typeParameters.js +270 -0
  698. package/dist/src/vite/typedControls.d.ts +31 -0
  699. package/dist/src/vite/typedControls.js +66 -0
  700. package/dist/src/vite/unionProps.d.ts +37 -0
  701. package/dist/src/vite/unionProps.js +121 -0
  702. package/dist/src/vite/unresolvedTokens.d.ts +20 -0
  703. package/dist/src/vite/unresolvedTokens.js +193 -0
  704. package/dist/src/vite/usageGraph.js +10 -52
  705. package/dist/src/vite/usageGuidance.d.ts +9 -2
  706. package/dist/src/vite/usageGuidance.js +36 -8
  707. package/dist/src/vite/usageImports.d.ts +35 -0
  708. package/dist/src/vite/usageImports.js +280 -0
  709. package/dist/src/vite/visibilityRoute.d.ts +16 -0
  710. package/dist/src/vite/visibilityRoute.js +320 -0
  711. package/dist/src/worstCase.d.ts +2 -0
  712. package/dist/src/worstCase.js +2 -0
  713. package/package.json +28 -8
@@ -9,8 +9,8 @@
9
9
  *
10
10
  * @module
11
11
  */
12
- import { useEffect, useMemo, useRef } from "react";
13
- import { checkedAddressArgs, checkedArgsMessage } from "../addressArgs.js";
12
+ import { useEffect, useMemo, useRef, useState } from "react";
13
+ import { checkedAddressArgs, checkedArgsMessage, declaredArgProps, needsShapeChecks } from "../addressArgs.js";
14
14
  import { panelArgsParam } from "../messages.js";
15
15
  import { tellFrames } from "./FrameView.js";
16
16
  /**
@@ -38,19 +38,57 @@ const NO_ARGS = {};
38
38
  const NOTHING_DROPPED = [];
39
39
  /** A source without named values. */
40
40
  const NO_NAMED_VALUES = {};
41
+ /** No custom control registered. */
42
+ const NO_ARG_CONTROLS = {};
43
+ /**
44
+ * What checks a story's structured values, loaded when a story first has a prop that needs it. Until it arrives such a
45
+ * prop's value waits, whichever its story.
46
+ *
47
+ * @param declaration - what the story declares.
48
+ * @param loaders - the catalogue's custom controls.
49
+ */
50
+ const useArgChecks = (declaration, loaders) => {
51
+ const props = declaration === undefined ? [] : declaredArgProps(declaration);
52
+ const names = props.flatMap((prop) => prop.customControl ?? []).join("\n");
53
+ const isNeeded = props.some(needsShapeChecks);
54
+ const [loaded, setLoaded] = useState();
55
+ useEffect(() => {
56
+ if (!isNeeded)
57
+ return;
58
+ let isCurrent = true;
59
+ void import("./argChecks.js")
60
+ .then(({ loadedChecks }) => loadedChecks(names === "" ? [] : names.split("\n"), loaders ?? NO_ARG_CONTROLS))
61
+ .then((checks) => {
62
+ if (isCurrent)
63
+ setLoaded({ names, checks });
64
+ });
65
+ return () => {
66
+ isCurrent = false;
67
+ };
68
+ }, [isNeeded, names, loaders]);
69
+ return loaded?.names === names ? loaded.checks : undefined;
70
+ };
41
71
  /**
42
72
  * The address's values, checked against what the story declares.
43
73
  *
44
74
  * @param input - the address's values and what the stage knows of the story.
45
75
  */
46
76
  export const useAddressArgs = (input) => {
47
- const { panelArgs, docs, storyArgs, argTypes, controls, frames } = input;
77
+ const { panelArgs, link, docs, storyArgs, argTypes, controls, frames } = input;
78
+ const typeValue = link?.typeValue;
48
79
  const namedValues = input.namedValues ?? NO_NAMED_VALUES;
49
- const checked = useMemo(() => {
80
+ const declaration = useMemo(() => {
50
81
  const ready = storyArgs === undefined ? undefined : { args: storyArgs, argTypes, controls };
51
- const declaration = declarationOf(docs, ready, namedValues);
52
- return declaration === undefined ? undefined : checkedAddressArgs(panelArgs, declaration);
53
- }, [panelArgs, docs, storyArgs, argTypes, controls, namedValues]);
82
+ return declarationOf(docs, ready, namedValues);
83
+ }, [docs, storyArgs, argTypes, controls, namedValues]);
84
+ const checks = useArgChecks(declaration, input.argControls);
85
+ const checked = useMemo(() => {
86
+ if (declaration === undefined)
87
+ return undefined;
88
+ const read = checkedAddressArgs(panelArgs, declaration, typeValue, checks);
89
+ // nothing is told of the address until all of it can be: a story must not draw half a link
90
+ return read.isWaiting ? undefined : read;
91
+ }, [panelArgs, typeValue, declaration, checks]);
54
92
  const acceptedParam = checked === undefined ? undefined : panelArgsParam(checked.accepted);
55
93
  // the values reach the frames from the address, so going back in the history sets them too; compared as text, so a
56
94
  // frame is told again only when they change
@@ -61,14 +99,21 @@ export const useAddressArgs = (input) => {
61
99
  return;
62
100
  tellFrames(frames.current, checkedArgsMessage(sealedRef.current));
63
101
  }, [acceptedParam, frames]);
102
+ // said with the check's: the note's button keeps what the story accepts, which is not known before
103
+ const unread = (link?.unread ?? []).map((name) => ({ name, reason: "unreadable" }));
104
+ const refused = (link?.refused ?? []).map((name) => ({ name, reason: "markup" }));
64
105
  return {
65
106
  accepted: checked?.accepted ?? NO_ARGS,
66
107
  checked: checked?.sealed,
67
- dropped: checked?.dropped ?? NOTHING_DROPPED,
108
+ dropped: checked === undefined ? NOTHING_DROPPED : [...unread, ...refused, ...checked.dropped],
68
109
  acceptedParam,
69
110
  acceptedFor: (message) => {
70
- const declaration = declarationOf(docs, message, namedValues);
71
- return declaration === undefined ? undefined : checkedAddressArgs(panelArgs, declaration).sealed;
72
- }
111
+ const ready = declarationOf(docs, message, namedValues);
112
+ if (ready === undefined)
113
+ return undefined;
114
+ const read = checkedAddressArgs(panelArgs, ready, typeValue, checks);
115
+ return read.isWaiting ? undefined : read.sealed;
116
+ },
117
+ worstOfShape: checks?.worstOfShape
73
118
  };
74
119
  };
@@ -8,7 +8,7 @@ import { useEffect, useRef } from "react";
8
8
  import { pressedControl } from "../controlKeys.js";
9
9
  import { useCatalogue } from "./catalogueContext.js";
10
10
  import { cycledView } from "./controlCycle.js";
11
- import { isTyping } from "./keyboard.js";
11
+ import { isSingleKeyFree } from "./keyboard.js";
12
12
  /**
13
13
  * Listens to the controls' keys.
14
14
  *
@@ -21,7 +21,7 @@ export const useControlKeys = (input) => {
21
21
  latest.current = input;
22
22
  useEffect(() => {
23
23
  const cycle = (event) => {
24
- if (isTyping(event.target))
24
+ if (!isSingleKeyFree(event))
25
25
  return;
26
26
  const { keys, view, onViewChange, fixed, isStoryPage, isComponentPage } = latest.current;
27
27
  const pressed = pressedControl(keys, {
@@ -0,0 +1,6 @@
1
+ /**
2
+ * The problems to show.
3
+ *
4
+ * @param problems - the index's problems, as the page read them.
5
+ */
6
+ export declare const useEditedProblems: (problems: readonly string[]) => readonly string[];
@@ -0,0 +1,40 @@
1
+ /**
2
+ * The index's problems as a dev server's edits leave them: a story file that an edit left unreadable, or a component
3
+ * that no longer parses, is named at once, without a reload that would take its story away from the reader, and no
4
+ * longer once a later edit fixed it.
5
+ *
6
+ * @module
7
+ */
8
+ import { useEffect, useMemo, useState } from "react";
9
+ import { STORY_FILE_READ_EVENT, storyFileReadOf } from "../hotModules.js";
10
+ /** No file an edit told of. */
11
+ const NONE = new Map();
12
+ /**
13
+ * The problems to show.
14
+ *
15
+ * @param problems - the index's problems, as the page read them.
16
+ */
17
+ export const useEditedProblems = (problems) => {
18
+ const [edited, setEdited] = useState(NONE);
19
+ useEffect(() => {
20
+ // a build has no edits
21
+ if (import.meta.hot === undefined)
22
+ return undefined;
23
+ const follow = (event) => {
24
+ const read = storyFileReadOf(event);
25
+ if (read === undefined)
26
+ return;
27
+ setEdited((before) => {
28
+ // a fix is kept too: it takes away what the page read of the file (a component that did not parse)
29
+ return new Map(before).set(read.file, read.problem);
30
+ });
31
+ };
32
+ window.addEventListener(STORY_FILE_READ_EVENT, follow);
33
+ return () => window.removeEventListener(STORY_FILE_READ_EVENT, follow);
34
+ }, []);
35
+ // an edit's word on a file replaces what the page read of it: the problem names its file first
36
+ return useMemo(() => {
37
+ const kept = problems.filter((problem) => ![...edited.keys()].some((file) => problem.startsWith(file)));
38
+ return [...kept, ...[...edited.values()].filter((problem) => problem !== undefined)];
39
+ }, [problems, edited]);
40
+ };
@@ -38,6 +38,9 @@ const onFrameMessage = (message, frame, targets) => {
38
38
  if (address !== undefined)
39
39
  targets.setHeight(address, message.height);
40
40
  return;
41
+ case "forgebook:scheme":
42
+ frame.style.colorScheme = message.scheme;
43
+ return;
41
44
  case "forgebook:error":
42
45
  handlers.onFailed?.(message.storyId, message.message);
43
46
  return;
@@ -1,12 +1,17 @@
1
1
  /**
2
- * Which frames of a page of many stories may load: those near the visible part of the page, a few at a time, so the
3
- * browser is never asked for thousands of modules at once.
2
+ * Which frames of a page of many stories may load: those near the visible part of the page, nearest first, a few at a
3
+ * time, so the browser is never asked for thousands of modules at once.
4
4
  *
5
5
  * @remarks
6
6
  * In development every frame loads its sources' modules one by one (a few hundred requests); twenty frames at once
7
7
  * exhaust the browser ("insufficient resources") and stories stay blank. A frame loads once its story is near the
8
8
  * visible part of the scrolling page and fewer than `MAX_LOADING` frames are still loading; once loaded it stays.
9
9
  *
10
+ * The reader may be anywhere on the page, so a free place goes to the waiting story nearest the visible part, not to
11
+ * the first one in the page's order (`frameOrder.ts`); and no frame starts while the page scrolls fast
12
+ * (`useScrollSettled.ts`), so the stories a scroll flies past never hold a place the stories where it stops need. A
13
+ * frame already loading finishes wherever the page goes.
14
+ *
10
15
  * @module
11
16
  */
12
17
  import { type RefObject } from "react";
@@ -21,7 +26,7 @@ export type FrameQueue = {
21
26
  readonly observerOf: (storyId: string, place?: number) => (element: HTMLElement | null) => void;
22
27
  /** Records a story whose frame finished loading. */
23
28
  readonly markReady: (storyId: string) => void;
24
- /** Loads every frame of the page, wherever it is, still a few at a time. */
29
+ /** Loads every frame of the page, wherever it is, still a few at a time and nearest first. */
25
30
  readonly loadAll: () => void;
26
31
  };
27
32
  /**
@@ -1,19 +1,44 @@
1
1
  /**
2
- * Which frames of a page of many stories may load: those near the visible part of the page, a few at a time, so the
3
- * browser is never asked for thousands of modules at once.
2
+ * Which frames of a page of many stories may load: those near the visible part of the page, nearest first, a few at a
3
+ * time, so the browser is never asked for thousands of modules at once.
4
4
  *
5
5
  * @remarks
6
6
  * In development every frame loads its sources' modules one by one (a few hundred requests); twenty frames at once
7
7
  * exhaust the browser ("insufficient resources") and stories stay blank. A frame loads once its story is near the
8
8
  * visible part of the scrolling page and fewer than `MAX_LOADING` frames are still loading; once loaded it stays.
9
9
  *
10
+ * The reader may be anywhere on the page, so a free place goes to the waiting story nearest the visible part, not to
11
+ * the first one in the page's order (`frameOrder.ts`); and no frame starts while the page scrolls fast
12
+ * (`useScrollSettled.ts`), so the stories a scroll flies past never hold a place the stories where it stops need. A
13
+ * frame already loading finishes wherever the page goes.
14
+ *
10
15
  * @module
11
16
  */
12
17
  import { useCallback, useEffect, useRef, useState } from "react";
18
+ import { distanceFromView, nearestFrames } from "./frameOrder.js";
19
+ import { useScrollSettled } from "./useScrollSettled.js";
13
20
  /** The most frames loading at once. */
14
21
  const MAX_LOADING = 2;
15
22
  /** How far beyond the visible part a story counts as near, as an IntersectionObserver margin. */
16
23
  const NEAR_MARGIN = "600px 0px";
24
+ /**
25
+ * How far each waiting story is from the visible part of the page: its nearest place, for a story shown twice.
26
+ *
27
+ * @param waiting - the stories waiting for their frame.
28
+ * @param elements - the elements that hold the page's frames, with their story.
29
+ * @param root - the element that scrolls the page; the window when there is none.
30
+ */
31
+ const distancesOf = (waiting, elements, root) => {
32
+ const view = root?.getBoundingClientRect() ?? { top: 0, bottom: window.innerHeight };
33
+ const distances = new Map();
34
+ for (const [element, storyId] of elements) {
35
+ if (!waiting.has(storyId))
36
+ continue;
37
+ const distance = distanceFromView(element.getBoundingClientRect(), view);
38
+ distances.set(storyId, Math.min(distance, distances.get(storyId) ?? distance));
39
+ }
40
+ return distances;
41
+ };
17
42
  /**
18
43
  * The queue of a page's frames.
19
44
  *
@@ -30,6 +55,7 @@ export const useFrameQueue = (storyIds, root) => {
30
55
  const observerRef = useRef(undefined);
31
56
  const elements = useRef(new Map());
32
57
  const observers = useRef(new Map());
58
+ const isSettled = useScrollSettled(root);
33
59
  useEffect(() => {
34
60
  const observer = new IntersectionObserver((entries) => setNear((current) => {
35
61
  const next = new Set(current);
@@ -46,17 +72,21 @@ export const useFrameQueue = (storyIds, root) => {
46
72
  observerRef.current = observer;
47
73
  return () => observer.disconnect();
48
74
  }, [root]);
49
- // a few more frames whenever a story comes near or a frame finishes loading; a frame the page no longer lists never
50
- // finishes, and must not hold a place
75
+ // a few more frames whenever a story comes near, a frame finishes loading or the page stops flying; a frame the page
76
+ // no longer lists never finishes, and must not hold a place
51
77
  useEffect(() => {
52
- setMounted((current) => {
53
- const nearIds = new Set([...near].map((element) => elements.current.get(element)));
54
- const loading = [...current].filter((id) => storyIds.includes(id) && !ready.has(id)).length;
55
- const waiting = storyIds.filter((id) => (isEveryStoryNear || nearIds.has(id)) && !current.has(id));
56
- const next = waiting.slice(0, Math.max(0, MAX_LOADING - loading));
57
- return next.length === 0 ? current : new Set([...current, ...next]);
58
- });
59
- }, [storyIds, near, ready, isEveryStoryNear]);
78
+ if (!isSettled)
79
+ return;
80
+ const free = MAX_LOADING - [...mounted].filter((id) => storyIds.includes(id) && !ready.has(id)).length;
81
+ if (free <= 0)
82
+ return;
83
+ const nearIds = new Set([...near].map((element) => elements.current.get(element)));
84
+ const waiting = storyIds.filter((id) => (isEveryStoryNear || nearIds.has(id)) && !mounted.has(id));
85
+ if (waiting.length === 0)
86
+ return;
87
+ const next = nearestFrames(waiting, distancesOf(new Set(waiting), elements.current, root.current), free);
88
+ setMounted(new Set([...mounted, ...next]));
89
+ }, [storyIds, near, ready, isEveryStoryNear, isSettled, mounted, root]);
60
90
  const observerOf = useCallback((storyId, place = 0) => {
61
91
  const key = `${storyId}\n${place}`;
62
92
  const known = observers.current.get(key);
@@ -0,0 +1,13 @@
1
+ import type { taggedTree } from "../storyTags.ts";
2
+ import type { StoryTree } from "../storyTree.ts";
3
+ /** The filter, set by the tag filter's button, which loads its code: read during a render, never waited for. */
4
+ export declare const loadedTagFilter: {
5
+ current?: typeof taggedTree;
6
+ };
7
+ /**
8
+ * The tree to list.
9
+ *
10
+ * @param tree - the whole tree.
11
+ * @param tags - the address's tags; none lists the whole tree.
12
+ */
13
+ export declare const useListedTree: (tree: StoryTree, tags: readonly string[]) => StoryTree;
@@ -0,0 +1,32 @@
1
+ /**
2
+ * The tree the sidebar and the story keys list: the whole one, or what the address's tags keep of it.
3
+ *
4
+ * @remarks
5
+ * The filter's code loads only when an address names a tag, or with the tag filter's button, which hands it over
6
+ * (`loadedTagFilter`) so the render that puts a checked tag in the address is already filtered. A catalogue nobody
7
+ * filters pays for a question and not for its answer. Opened on an address that names a tag, the whole tree shows
8
+ * until the code arrives, as the search's tree does before its list comes.
9
+ *
10
+ * @module
11
+ */
12
+ import { useEffect, useMemo, useState } from "react";
13
+ /** The filter, set by the tag filter's button, which loads its code: read during a render, never waited for. */
14
+ export const loadedTagFilter = {};
15
+ /**
16
+ * The tree to list.
17
+ *
18
+ * @param tree - the whole tree.
19
+ * @param tags - the address's tags; none lists the whole tree.
20
+ */
21
+ export const useListedTree = (tree, tags) => {
22
+ const [filter, setFilter] = useState();
23
+ const isFiltered = tags.length > 0;
24
+ useEffect(() => {
25
+ if (isFiltered)
26
+ void import("../storyTags.js").then((module) => setFilter(() => module.taggedTree));
27
+ }, [isFiltered]);
28
+ return useMemo(() => {
29
+ const loaded = filter ?? loadedTagFilter.current;
30
+ return isFiltered && loaded !== undefined ? loaded(tree, tags) : tree;
31
+ }, [filter, isFiltered, tree, tags]);
32
+ };
@@ -20,9 +20,9 @@ import { useLiveView, useLoadedView } from "./useLiveView.js";
20
20
  export const usePageFrames = ({ stories, queued, pageRef, view, touchOverrides }) => {
21
21
  // each story's own args, as its frame reports them: the code of a story drawn from its args is written from them
22
22
  const [storyArgs, setStoryArgs] = useState(new Map());
23
- // the frames keep the view they loaded with; only the style sheets load them again, the rest of the view (the
23
+ // the frames keep the view they loaded with; only the style sheets and the play switch load them again, the rest of the view (the
24
24
  // switches, the language among them) is sent to them live
25
- const frameView = useLoadedView(view.sheets, view);
25
+ const frameView = useLoadedView(`${view.sheets}|${view.play}`, view);
26
26
  const catalogue = useCatalogue();
27
27
  // each story meant for a phone (marked so, or shown in a device touched with a finger) with its own finger: its frame
28
28
  // gets it in place of the toolbar's Touch
@@ -25,6 +25,11 @@ export type Popover = {
25
25
  readonly setIsOpen: (isOpen: boolean, press?: {
26
26
  readonly detail: number;
27
27
  }) => void;
28
+ /**
29
+ * Closes the panel after a choice in it was taken by the pointer. The arrow keys choose as they move: a panel that
30
+ * closed on the first would keep every choice past the next one out of reach, so with the keys Escape closes it.
31
+ */
32
+ readonly closeAfterChoice: () => void;
28
33
  /** The button. */
29
34
  readonly buttonRef: RefObject<HTMLButtonElement | null>;
30
35
  /** The panel. */
@@ -27,6 +27,7 @@ export const usePopover = () => {
27
27
  const panelRef = useRef(null);
28
28
  const closing = useRef(undefined);
29
29
  const isByPointer = useRef(false);
30
+ const isLastInputKey = useRef(false);
30
31
  const panelId = useId();
31
32
  const setIsOpen = (isOpening, press) => {
32
33
  const panel = panelRef.current;
@@ -60,6 +61,10 @@ export const usePopover = () => {
60
61
  // a cancelled closing (opened again) leaves the panel open
61
62
  .catch(() => undefined);
62
63
  };
64
+ const closeAfterChoice = () => {
65
+ if (!isLastInputKey.current)
66
+ setIsOpen(false);
67
+ };
63
68
  // it grows in from its button's corner as it is drawn
64
69
  useLayoutEffect(() => {
65
70
  const panel = panelRef.current;
@@ -76,6 +81,7 @@ export const usePopover = () => {
76
81
  return;
77
82
  panelRef.current?.querySelector("input:checked")?.focus();
78
83
  const close = (event) => {
84
+ isLastInputKey.current = event instanceof KeyboardEvent;
79
85
  const target = event.target instanceof Node ? event.target : null;
80
86
  const isOutside = event instanceof PointerEvent &&
81
87
  !panelRef.current?.contains(target) &&
@@ -95,5 +101,5 @@ export const usePopover = () => {
95
101
  document.removeEventListener("keydown", close);
96
102
  };
97
103
  }, [isOpen]);
98
- return { isOpen, isDrawn, setIsOpen, buttonRef, panelRef, panelId };
104
+ return { isOpen, isDrawn, setIsOpen, closeAfterChoice, buttonRef, panelRef, panelId };
99
105
  };
@@ -0,0 +1,22 @@
1
+ import type { CatalogueRef, RefIndex } from "../catalogueRefs.ts";
2
+ /** A composed catalogue's index: loading, read, or why it could not be. */
3
+ export type RefIndexState = {
4
+ readonly status: "loading";
5
+ } | {
6
+ readonly status: "ready";
7
+ readonly index: RefIndex;
8
+ } | {
9
+ readonly status: "error";
10
+ readonly message: string;
11
+ };
12
+ /**
13
+ * A composed catalogue's index, fetched once it is wanted (its section open, one of its stories shown).
14
+ *
15
+ * @remarks
16
+ * What a load ended with is kept with the address it was for, so another catalogue's index never stands in for this
17
+ * one's while its own loads: two catalogues built from one library share story ids.
18
+ *
19
+ * @param ref - the composed catalogue; none when there is none to read.
20
+ * @param isWanted - whether it is wanted yet.
21
+ */
22
+ export declare const useRefIndex: (ref: CatalogueRef | undefined, isWanted: boolean) => RefIndexState;
@@ -0,0 +1,36 @@
1
+ /**
2
+ * A composed catalogue's index as a state the shell can show: loading, read, or why it failed.
3
+ *
4
+ * @module
5
+ */
6
+ import { useEffect, useState } from "react";
7
+ import { loadRefIndex } from "./refIndexLoad.js";
8
+ /** Before any load ended. */
9
+ const LOADING = { status: "loading" };
10
+ /**
11
+ * A composed catalogue's index, fetched once it is wanted (its section open, one of its stories shown).
12
+ *
13
+ * @remarks
14
+ * What a load ended with is kept with the address it was for, so another catalogue's index never stands in for this
15
+ * one's while its own loads: two catalogues built from one library share story ids.
16
+ *
17
+ * @param ref - the composed catalogue; none when there is none to read.
18
+ * @param isWanted - whether it is wanted yet.
19
+ */
20
+ export const useRefIndex = (ref, isWanted) => {
21
+ const [settled, setSettled] = useState(undefined);
22
+ useEffect(() => {
23
+ if (ref === undefined || !isWanted)
24
+ return;
25
+ let isCurrent = true;
26
+ const settle = (state) => {
27
+ if (isCurrent)
28
+ setSettled({ url: ref.url, state });
29
+ };
30
+ loadRefIndex(ref).then((index) => settle({ status: "ready", index }), (error) => settle({ status: "error", message: error instanceof Error ? error.message : String(error) }));
31
+ return () => {
32
+ isCurrent = false;
33
+ };
34
+ }, [ref, isWanted]);
35
+ return settled !== undefined && settled.url === ref?.url ? settled.state : LOADING;
36
+ };
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Whether a scrolling page has stopped flying past its content, for the frame queue (`useFrameQueue`).
3
+ *
4
+ * @remarks
5
+ * A fast scroll to the end of a long page passes over stories the reader never looks at: a frame started for one of
6
+ * them takes a loading place from the stories where the scroll stops. The page counts as unsettled while it scrolls
7
+ * faster than `FAST_SCROLL`, and settles `SETTLE_MS` after its last fast step; a slow scroll, a reader's, stays
8
+ * settled, so stories keep loading as they come near.
9
+ *
10
+ * @module
11
+ */
12
+ import { type RefObject } from "react";
13
+ /**
14
+ * Whether the page is settled: true unless it scrolled fast in the last `SETTLE_MS`.
15
+ *
16
+ * @param root - the element that scrolls the page; the hook reads nothing when it is not there.
17
+ */
18
+ export declare const useScrollSettled: (root: RefObject<HTMLElement | null>) => boolean;
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Whether a scrolling page has stopped flying past its content, for the frame queue (`useFrameQueue`).
3
+ *
4
+ * @remarks
5
+ * A fast scroll to the end of a long page passes over stories the reader never looks at: a frame started for one of
6
+ * them takes a loading place from the stories where the scroll stops. The page counts as unsettled while it scrolls
7
+ * faster than `FAST_SCROLL`, and settles `SETTLE_MS` after its last fast step; a slow scroll, a reader's, stays
8
+ * settled, so stories keep loading as they come near.
9
+ *
10
+ * @module
11
+ */
12
+ import { useEffect, useState } from "react";
13
+ /** The scroll speed above which the page flies past its stories, in CSS px per millisecond: 2000 px a second. */
14
+ const FAST_SCROLL = 2;
15
+ /** How long after its last fast step the page counts as settled, in milliseconds. */
16
+ const SETTLE_MS = 150;
17
+ /**
18
+ * The longest time read between two scroll events, in milliseconds: a jump after a pause (the End key, a link to a
19
+ * story further down) counts as fast, not as a long slow step.
20
+ */
21
+ const LONGEST_STEP_MS = 100;
22
+ /**
23
+ * Whether the page is settled: true unless it scrolled fast in the last `SETTLE_MS`.
24
+ *
25
+ * @param root - the element that scrolls the page; the hook reads nothing when it is not there.
26
+ */
27
+ export const useScrollSettled = (root) => {
28
+ const [isSettled, setIsSettled] = useState(true);
29
+ useEffect(() => {
30
+ const element = root.current;
31
+ if (element === null)
32
+ return undefined;
33
+ let lastTop = element.scrollTop;
34
+ let lastTime = performance.now();
35
+ let timer;
36
+ const onScroll = () => {
37
+ const now = performance.now();
38
+ const step = Math.min(Math.max(now - lastTime, 1), LONGEST_STEP_MS);
39
+ const speed = Math.abs(element.scrollTop - lastTop) / step;
40
+ lastTop = element.scrollTop;
41
+ lastTime = now;
42
+ if (speed <= FAST_SCROLL)
43
+ return;
44
+ setIsSettled(false);
45
+ clearTimeout(timer);
46
+ timer = setTimeout(() => setIsSettled(true), SETTLE_MS);
47
+ };
48
+ element.addEventListener("scroll", onScroll, { passive: true });
49
+ return () => {
50
+ element.removeEventListener("scroll", onScroll);
51
+ clearTimeout(timer);
52
+ setIsSettled(true);
53
+ };
54
+ }, [root]);
55
+ return isSettled;
56
+ };
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Tab stops for what scrolls sideways: a part with nothing of its own to focus can only be scrolled by a keyboard from a
3
+ * stop on the part itself.
4
+ *
5
+ * @remarks
6
+ * A part takes a stop only while it overflows: on a wide window, where a code block or a props table fits, a stop would
7
+ * be one more press on the way through the page with nothing to do there. The parts are read again whenever the root
8
+ * changes size: the window narrowed, a fold opened, the fonts arrived.
9
+ *
10
+ * @module
11
+ */
12
+ import { type RefObject } from "react";
13
+ /**
14
+ * Gives the parts of an element that overflow sideways a Tab stop, and takes it back when they fit.
15
+ *
16
+ * @param selector - the parts, inside the element; the element itself when absent.
17
+ * @param content - what the parts are drawn from, when it can change with no change of the element's size.
18
+ * @returns the ref for the element.
19
+ */
20
+ export declare const useScrollStops: (selector?: string, content?: string) => RefObject<HTMLDivElement | null>;
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Tab stops for what scrolls sideways: a part with nothing of its own to focus can only be scrolled by a keyboard from a
3
+ * stop on the part itself.
4
+ *
5
+ * @remarks
6
+ * A part takes a stop only while it overflows: on a wide window, where a code block or a props table fits, a stop would
7
+ * be one more press on the way through the page with nothing to do there. The parts are read again whenever the root
8
+ * changes size: the window narrowed, a fold opened, the fonts arrived.
9
+ *
10
+ * @module
11
+ */
12
+ import { useEffect, useRef } from "react";
13
+ /**
14
+ * Gives the parts of an element that overflow sideways a Tab stop, and takes it back when they fit.
15
+ *
16
+ * @param selector - the parts, inside the element; the element itself when absent.
17
+ * @param content - what the parts are drawn from, when it can change with no change of the element's size.
18
+ * @returns the ref for the element.
19
+ */
20
+ export const useScrollStops = (selector, content) => {
21
+ const rootRef = useRef(null);
22
+ // biome-ignore lint/correctness/useExhaustiveDependencies: `content` replaces the parts, whose stops go with them
23
+ useEffect(() => {
24
+ const root = rootRef.current;
25
+ if (root === null)
26
+ return;
27
+ const update = () => {
28
+ const parts = selector === undefined ? [root] : root.querySelectorAll(selector);
29
+ for (const part of parts) {
30
+ if (part.scrollWidth > part.clientWidth)
31
+ part.tabIndex = 0;
32
+ else
33
+ part.removeAttribute("tabindex");
34
+ }
35
+ };
36
+ const observer = new ResizeObserver(update);
37
+ observer.observe(root);
38
+ return () => observer.disconnect();
39
+ }, [selector, content]);
40
+ return rootRef;
41
+ };
@@ -0,0 +1,18 @@
1
+ /**
2
+ * The list of the shell's keys: `?` opens it anywhere the shell's keys work, or the menu at the sidebar's foot.
3
+ *
4
+ * @remarks
5
+ * Only the key and whether it is open sit in the first load; the list comes with its first opening.
6
+ *
7
+ * @module
8
+ */
9
+ import { type ReactNode } from "react";
10
+ /** What the shell wires to the list. */
11
+ export type ShortcutHelp = {
12
+ /** The list, while it is open. */
13
+ readonly help: ReactNode;
14
+ /** Opens it. */
15
+ readonly showHelp: () => void;
16
+ };
17
+ /** Listens to the key that opens the list, and holds whether it is open. */
18
+ export declare const useShortcutHelp: () => ShortcutHelp;
@@ -0,0 +1,32 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ /**
3
+ * The list of the shell's keys: `?` opens it anywhere the shell's keys work, or the menu at the sidebar's foot.
4
+ *
5
+ * @remarks
6
+ * Only the key and whether it is open sit in the first load; the list comes with its first opening.
7
+ *
8
+ * @module
9
+ */
10
+ import { useEffect, useState } from "react";
11
+ import { isSingleKeyFree } from "./keyboard.js";
12
+ import { LazyView, lazyModule } from "./lazyModule.js";
13
+ /** The list, loaded when first opened. */
14
+ const SHORTCUT_HELP = lazyModule(() => import("./ShortcutHelp.js").then((module) => module.ShortcutHelp));
15
+ /** Listens to the key that opens the list, and holds whether it is open. */
16
+ export const useShortcutHelp = () => {
17
+ const [isOpen, setIsOpen] = useState(false);
18
+ useEffect(() => {
19
+ const open = (event) => {
20
+ if (event.key !== "?" || event.metaKey || event.ctrlKey || event.altKey || !isSingleKeyFree(event))
21
+ return;
22
+ event.preventDefault();
23
+ setIsOpen(true);
24
+ };
25
+ document.addEventListener("keydown", open);
26
+ return () => document.removeEventListener("keydown", open);
27
+ }, []);
28
+ return {
29
+ help: isOpen ? (_jsx(LazyView, { module: SHORTCUT_HELP, props: { onClose: () => setIsOpen(false) }, loading: null, failed: () => null })) : null,
30
+ showHelp: () => setIsOpen(true)
31
+ };
32
+ };