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.
- package/README.md +994 -72
- package/dist/bin/forgebook/agentClient.d.ts +2 -1
- package/dist/bin/forgebook/agentClient.js +13 -6
- package/dist/bin/forgebook/agentGuide.d.ts +59 -0
- package/dist/bin/forgebook/agentGuide.js +203 -0
- package/dist/bin/forgebook/agentLoopCommands.mjs +22 -42
- package/dist/bin/forgebook/agentSetup/agentFiles.d.ts +55 -0
- package/dist/bin/forgebook/agentSetup/agentFiles.js +319 -0
- package/dist/bin/forgebook/agentSetup/assistantHooks.d.ts +71 -0
- package/dist/bin/forgebook/agentSetup/assistantHooks.js +125 -0
- package/dist/bin/forgebook/agentSetup/ciWorkflow.d.ts +23 -0
- package/dist/bin/forgebook/agentSetup/ciWorkflow.js +55 -0
- package/dist/bin/forgebook/agentSetup/drawCandidates.d.ts +25 -0
- package/dist/bin/forgebook/agentSetup/drawCandidates.js +116 -0
- package/dist/bin/forgebook/agentSetup/drawDiagnosis.d.ts +28 -0
- package/dist/bin/forgebook/agentSetup/drawDiagnosis.js +134 -0
- package/dist/bin/forgebook/agentSetup/drawRun.d.ts +91 -0
- package/dist/bin/forgebook/agentSetup/drawRun.js +353 -0
- package/dist/bin/forgebook/agentSetup/hookNames.d.ts +7 -0
- package/dist/bin/forgebook/agentSetup/hookNames.js +7 -0
- package/dist/bin/forgebook/agentSetup/initAgentSteps.d.ts +48 -0
- package/dist/bin/forgebook/agentSetup/initAgentSteps.js +104 -0
- package/dist/bin/forgebook/agentSetup/liftedProviders.d.ts +17 -0
- package/dist/bin/forgebook/agentSetup/liftedProviders.js +186 -0
- package/dist/bin/forgebook/agentSetup/projectRunner.d.ts +46 -0
- package/dist/bin/forgebook/agentSetup/projectRunner.js +85 -0
- package/dist/bin/forgebook/agentSetup/stopHook.d.ts +65 -0
- package/dist/bin/forgebook/agentSetup/stopHook.js +202 -0
- package/dist/bin/forgebook/agentSetup/uniformPicture.d.ts +7 -0
- package/dist/bin/forgebook/agentSetup/uniformPicture.js +98 -0
- package/dist/bin/forgebook/agentSetupCommands.d.mts +14 -0
- package/dist/bin/forgebook/agentSetupCommands.mjs +98 -0
- package/dist/bin/forgebook/agentText.d.ts +23 -3
- package/dist/bin/forgebook/agentText.js +182 -28
- package/dist/bin/forgebook/agents.md +20 -191
- package/dist/bin/forgebook/agentsText.js +2 -1
- package/dist/bin/forgebook/appBuild/appBuild.d.ts +59 -0
- package/dist/bin/forgebook/appBuild/appBuild.js +213 -0
- package/dist/bin/forgebook/appBuild/appViteConfig.d.ts +96 -0
- package/dist/bin/forgebook/appBuild/appViteConfig.js +320 -0
- package/dist/bin/forgebook/appBuild/tsconfigPaths.d.ts +14 -0
- package/dist/bin/forgebook/appBuild/tsconfigPaths.js +80 -0
- package/dist/bin/forgebook/auditCommand.d.mts +8 -0
- package/dist/bin/forgebook/auditCommand.mjs +75 -0
- package/dist/bin/forgebook/auditRun.d.ts +95 -0
- package/dist/bin/forgebook/auditRun.js +270 -0
- package/dist/bin/forgebook/browserRun.d.ts +21 -0
- package/dist/bin/forgebook/browserRun.js +57 -0
- package/dist/bin/forgebook/buildFailure.d.ts +7 -0
- package/dist/bin/forgebook/buildFailure.js +47 -0
- package/dist/bin/forgebook/buildWatch.d.ts +52 -0
- package/dist/bin/forgebook/buildWatch.js +137 -0
- package/dist/bin/forgebook/builtCatalogue.js +9 -5
- package/dist/bin/forgebook/catalogueCommands.d.ts +9 -0
- package/dist/bin/forgebook/catalogueCommands.js +23 -0
- package/dist/bin/forgebook/catalogueVite.d.ts +5 -1
- package/dist/bin/forgebook/catalogueVite.js +14 -6
- package/dist/bin/forgebook/commandCacheClaim.d.ts +18 -0
- package/dist/bin/forgebook/commandCacheClaim.js +170 -0
- package/dist/bin/forgebook/commandServer.d.ts +8 -0
- package/dist/bin/forgebook/commandServer.js +61 -13
- package/dist/bin/forgebook/forgebookCommands.mjs +105 -28
- package/dist/bin/forgebook/graphCommand.d.mts +8 -0
- package/dist/bin/forgebook/graphCommand.mjs +84 -0
- package/dist/bin/forgebook/guide/commands.md +62 -0
- package/dist/bin/forgebook/guide/devices.md +17 -0
- package/dist/bin/forgebook/guide/docs-pages.md +13 -0
- package/dist/bin/forgebook/guide/frameworks/angular.md +22 -0
- package/dist/bin/forgebook/guide/frameworks/html.md +22 -0
- package/dist/bin/forgebook/guide/frameworks/nextjs.md +23 -0
- package/dist/bin/forgebook/guide/frameworks/nuxt.md +22 -0
- package/dist/bin/forgebook/guide/frameworks/preact.md +16 -0
- package/dist/bin/forgebook/guide/frameworks/react-native-web.md +21 -0
- package/dist/bin/forgebook/guide/frameworks/react.md +16 -0
- package/dist/bin/forgebook/guide/frameworks/solid.md +18 -0
- package/dist/bin/forgebook/guide/frameworks/svelte.md +18 -0
- package/dist/bin/forgebook/guide/frameworks/sveltekit.md +23 -0
- package/dist/bin/forgebook/guide/frameworks/vue.md +18 -0
- package/dist/bin/forgebook/guide/frameworks/web-components.md +21 -0
- package/dist/bin/forgebook/guide/links.md +29 -0
- package/dist/bin/forgebook/guide/setup.md +23 -0
- package/dist/bin/forgebook/guide/stories.md +95 -0
- package/dist/bin/forgebook/guide/switches.md +43 -0
- package/dist/bin/forgebook/guideCommand.d.mts +13 -0
- package/dist/bin/forgebook/guideCommand.mjs +37 -0
- package/dist/bin/forgebook/importers/storybook.d.ts +21 -0
- package/dist/bin/forgebook/importers/storybook.js +11 -5
- package/dist/bin/forgebook/importers/storybookFrameworks.js +1 -1
- package/dist/bin/forgebook/initCommands.d.mts +11 -0
- package/dist/bin/forgebook/initCommands.mjs +51 -78
- package/dist/bin/forgebook/initConfig.d.ts +5 -3
- package/dist/bin/forgebook/initConfig.js +6 -3
- package/dist/bin/forgebook/initInstall.d.ts +15 -0
- package/dist/bin/forgebook/initInstall.js +77 -0
- package/dist/bin/forgebook/initPrint.d.ts +9 -0
- package/dist/bin/forgebook/initPrint.js +60 -0
- package/dist/bin/forgebook/initRefusals.d.ts +45 -0
- package/dist/bin/forgebook/initRefusals.js +91 -0
- package/dist/bin/forgebook/initRun.d.ts +28 -0
- package/dist/bin/forgebook/initRun.js +311 -0
- package/dist/bin/forgebook/mcpCommand.mjs +38 -4
- package/dist/bin/forgebook/mcpGraph.d.ts +13 -0
- package/dist/bin/forgebook/mcpGraph.js +24 -0
- package/dist/bin/forgebook/mcpTokens.d.ts +14 -0
- package/dist/bin/forgebook/mcpTokens.js +58 -0
- package/dist/bin/forgebook/mcpToolParts.d.ts +7 -0
- package/dist/bin/forgebook/mcpToolParts.js +10 -0
- package/dist/bin/forgebook/mcpTools.d.ts +13 -6
- package/dist/bin/forgebook/mcpTools.js +57 -90
- package/dist/bin/forgebook/mcpVerify.d.ts +16 -0
- package/dist/bin/forgebook/mcpVerify.js +36 -0
- package/dist/bin/forgebook/migrate/codemods.d.ts +11 -0
- package/dist/bin/forgebook/migrate/codemods.js +61 -0
- package/dist/bin/forgebook/migrate/migrate.types.d.ts +117 -0
- package/dist/bin/forgebook/migrate/migrate.types.js +5 -0
- package/dist/bin/forgebook/migrate/migrateCommand.d.mts +8 -0
- package/dist/bin/forgebook/migrate/migrateCommand.mjs +76 -0
- package/dist/bin/forgebook/migrate/migrateRun.d.ts +61 -0
- package/dist/bin/forgebook/migrate/migrateRun.js +210 -0
- package/dist/bin/forgebook/migrate/migrateText.d.ts +12 -0
- package/dist/bin/forgebook/migrate/migrateText.js +30 -0
- package/dist/bin/forgebook/migrate/migrateWrite.d.ts +27 -0
- package/dist/bin/forgebook/migrate/migrateWrite.js +66 -0
- package/dist/bin/forgebook/migrate/objectEdits.d.ts +70 -0
- package/dist/bin/forgebook/migrate/objectEdits.js +241 -0
- package/dist/bin/forgebook/migrate/playOnInBuilds.d.ts +3 -0
- package/dist/bin/forgebook/migrate/playOnInBuilds.js +86 -0
- package/dist/bin/forgebook/migrate/propGroupStrings.d.ts +5 -0
- package/dist/bin/forgebook/migrate/propGroupStrings.js +81 -0
- package/dist/bin/forgebook/newProject/newProject.d.ts +39 -0
- package/dist/bin/forgebook/newProject/newProject.js +180 -0
- package/dist/bin/forgebook/newProject/newProject.types.d.ts +97 -0
- package/dist/bin/forgebook/newProject/newProject.types.js +6 -0
- package/dist/bin/forgebook/newProject/packageManagers.d.ts +51 -0
- package/dist/bin/forgebook/newProject/packageManagers.js +121 -0
- package/dist/bin/forgebook/newProject/projectEntries.d.ts +62 -0
- package/dist/bin/forgebook/newProject/projectEntries.js +191 -0
- package/dist/bin/forgebook/newProject/projectFrameworks.d.ts +57 -0
- package/dist/bin/forgebook/newProject/projectFrameworks.js +148 -0
- package/dist/bin/forgebook/newProject/projectLook.d.ts +23 -0
- package/dist/bin/forgebook/newProject/projectLook.js +293 -0
- package/dist/bin/forgebook/newProject/projectPackages.d.ts +66 -0
- package/dist/bin/forgebook/newProject/projectPackages.js +178 -0
- package/dist/bin/forgebook/newRepair.d.ts +45 -0
- package/dist/bin/forgebook/newRepair.js +157 -0
- package/dist/bin/forgebook/newRepairRun.d.ts +69 -0
- package/dist/bin/forgebook/newRepairRun.js +148 -0
- package/dist/bin/forgebook/newStories.d.ts +23 -1
- package/dist/bin/forgebook/newStories.js +101 -11
- package/dist/bin/forgebook/newStoriesFile.d.ts +20 -1
- package/dist/bin/forgebook/newStoriesFile.js +43 -4
- package/dist/bin/forgebook/prebundleRun.d.ts +3 -1
- package/dist/bin/forgebook/prebundleRun.js +28 -8
- package/dist/bin/forgebook/proofCommand.d.mts +15 -0
- package/dist/bin/forgebook/proofCommand.mjs +212 -0
- package/dist/bin/forgebook/proofRun.d.ts +63 -0
- package/dist/bin/forgebook/proofRun.js +412 -0
- package/dist/bin/forgebook/proofText.d.ts +36 -0
- package/dist/bin/forgebook/proofText.js +131 -0
- package/dist/bin/forgebook/proofWorkflow.d.ts +29 -0
- package/dist/bin/forgebook/proofWorkflow.js +205 -0
- package/dist/bin/forgebook/setArgsTool.d.ts +8 -0
- package/dist/bin/forgebook/setArgsTool.js +70 -0
- package/dist/bin/forgebook/storyCheckCommands.mjs +42 -3
- package/dist/bin/forgebook/storyCheckRun.d.ts +50 -0
- package/dist/bin/forgebook/storyCheckRun.js +83 -9
- package/dist/bin/forgebook/storyFileIds.d.ts +15 -0
- package/dist/bin/forgebook/storyFileIds.js +14 -0
- package/dist/bin/forgebook/stressCases.d.ts +31 -0
- package/dist/bin/forgebook/stressCases.js +79 -0
- package/dist/bin/forgebook/stressRun.d.ts +12 -0
- package/dist/bin/forgebook/stressRun.js +61 -0
- package/dist/bin/forgebook/stressText.d.ts +27 -0
- package/dist/bin/forgebook/stressText.js +46 -0
- package/dist/bin/forgebook/verifyBase.d.ts +45 -0
- package/dist/bin/forgebook/verifyBase.js +204 -0
- package/dist/bin/forgebook/verifyCommand.d.mts +13 -0
- package/dist/bin/forgebook/verifyCommand.mjs +125 -0
- package/dist/bin/forgebook/verifyRun.d.ts +63 -0
- package/dist/bin/forgebook/verifyRun.js +108 -0
- package/dist/bin/forgebook/verifyVerdict.d.ts +40 -0
- package/dist/bin/forgebook/verifyVerdict.js +323 -0
- package/dist/bin/forgebook/workflowActions.d.ts +23 -0
- package/dist/bin/forgebook/workflowActions.js +23 -0
- package/dist/bin/forgebook-docs/catalogueMarkdown.js +12 -1
- package/dist/src/addressArgs.d.ts +29 -5
- package/dist/src/addressArgs.js +58 -16
- package/dist/src/addressArgsParam.d.ts +54 -0
- package/dist/src/addressArgsParam.js +51 -0
- package/dist/src/addressTexts.d.ts +14 -0
- package/dist/src/addressTexts.js +28 -21
- package/dist/src/agentIndexFile.d.ts +11 -0
- package/dist/src/agentIndexFile.js +11 -0
- package/dist/src/argConditions.d.ts +52 -0
- package/dist/src/argConditions.js +80 -0
- package/dist/src/argControl.d.ts +148 -0
- package/dist/src/argControl.js +0 -0
- package/dist/src/argExpression.d.ts +21 -0
- package/dist/src/argExpression.js +30 -0
- package/dist/src/argTypes.d.ts +40 -51
- package/dist/src/argTypes.js +69 -185
- package/dist/src/argsProps.d.ts +3 -3
- package/dist/src/argsProps.js +11 -5
- package/dist/src/bundlerErrors.d.ts +29 -0
- package/dist/src/bundlerErrors.js +49 -0
- package/dist/src/catalogue.d.ts +31 -0
- package/dist/src/catalogue.js +13 -2
- package/dist/src/catalogueRefs.d.ts +75 -0
- package/dist/src/catalogueRefs.js +122 -0
- package/dist/src/componentDocs.d.ts +83 -0
- package/dist/src/componentDocs.js +20 -3
- package/dist/src/controlCode.d.ts +27 -0
- package/dist/src/controlCode.js +41 -0
- package/dist/src/frame/callValues.d.ts +19 -0
- package/dist/src/frame/callValues.js +58 -0
- package/dist/src/frame/canvasScheme.d.ts +33 -0
- package/dist/src/frame/canvasScheme.js +67 -0
- package/dist/src/frame/controlValues.d.ts +39 -0
- package/dist/src/frame/controlValues.js +143 -0
- package/dist/src/frame/frame.css +36 -3
- package/dist/src/frame/frameStatus.d.ts +16 -1
- package/dist/src/frame/frameStatus.js +16 -1
- package/dist/src/frame/frameView.js +4 -3
- package/dist/src/frame/mountFrame.d.ts +10 -1
- package/dist/src/frame/mountFrame.js +160 -55
- package/dist/src/frame/panelControls.d.ts +67 -0
- package/dist/src/frame/panelControls.js +110 -0
- package/dist/src/frame/panelValues.d.ts +35 -0
- package/dist/src/frame/panelValues.js +127 -0
- package/dist/src/frame/playActions.d.ts +39 -0
- package/dist/src/frame/playActions.js +98 -0
- package/dist/src/frame/playStepper.d.ts +28 -0
- package/dist/src/frame/playStepper.js +38 -0
- package/dist/src/frame/playStory.d.ts +9 -1
- package/dist/src/frame/playStory.js +49 -3
- package/dist/src/frame/renderer.d.ts +34 -1
- package/dist/src/frame/renderer.js +24 -0
- package/dist/src/frame/shellChannel.d.ts +1 -1
- package/dist/src/frame/shellChannel.js +1 -1
- package/dist/src/frame/shellCheck.d.ts +17 -0
- package/dist/src/frame/shellCheck.js +25 -0
- package/dist/src/frame/shellMessageCheck.d.ts +7 -0
- package/dist/src/frame/shellMessageCheck.js +53 -0
- package/dist/src/frame/storyContent.d.ts +50 -0
- package/dist/src/frame/storyContent.js +73 -0
- package/dist/src/frame/storyModule.d.ts +9 -0
- package/dist/src/frame/storyModule.js +20 -2
- package/dist/src/frame/storyRun.d.ts +15 -7
- package/dist/src/frame/storyRun.js +64 -15
- package/dist/src/frame/valueSheets.d.ts +35 -0
- package/dist/src/frame/valueSheets.js +99 -0
- package/dist/src/hotModules.d.ts +20 -0
- package/dist/src/hotModules.js +23 -0
- package/dist/src/jsxCode.d.ts +1 -14
- package/dist/src/jsxCode.js +46 -10
- package/dist/src/liveErrors.d.ts +30 -4
- package/dist/src/liveErrors.js +18 -3
- package/dist/src/messages.d.ts +77 -27
- package/dist/src/messages.js +58 -100
- package/dist/src/namedValues.d.ts +2 -26
- package/dist/src/namedValues.js +0 -47
- package/dist/src/pageConfig.d.ts +2 -0
- package/dist/src/playTrace.d.ts +19 -2
- package/dist/src/playTrace.js +10 -5
- package/dist/src/plugin.d.ts +10 -3
- package/dist/src/previewRelay.js +9 -1
- package/dist/src/printable.d.ts +12 -0
- package/dist/src/printable.js +22 -0
- package/dist/src/propsSignature.d.ts +37 -0
- package/dist/src/propsSignature.js +40 -0
- package/dist/src/search.d.ts +41 -5
- package/dist/src/search.js +93 -23
- package/dist/src/searchMatch.d.ts +4 -1
- package/dist/src/searchMatch.js +26 -5
- package/dist/src/searchTypos.d.ts +88 -0
- package/dist/src/searchTypos.js +178 -0
- package/dist/src/shapeValues.d.ts +86 -0
- package/dist/src/shapeValues.js +295 -0
- package/dist/src/shell/ApiReference.js +6 -3
- package/dist/src/shell/ApiTableBox.d.ts +15 -0
- package/dist/src/shell/ApiTableBox.js +11 -0
- package/dist/src/shell/AppearanceMenu.d.ts +4 -1
- package/dist/src/shell/AppearanceMenu.js +9 -6
- package/dist/src/shell/AuthoredHome.js +3 -1
- package/dist/src/shell/CodeTab.d.ts +12 -6
- package/dist/src/shell/CodeTab.js +47 -3
- package/dist/src/shell/CodeText.d.ts +1 -1
- package/dist/src/shell/CodeText.js +2 -3
- package/dist/src/shell/CompareGrid.js +1 -1
- package/dist/src/shell/ComponentPage.d.ts +6 -6
- package/dist/src/shell/ComponentPage.js +8 -2
- package/dist/src/shell/CustomControl.d.ts +34 -0
- package/dist/src/shell/CustomControl.js +125 -0
- package/dist/src/shell/DocContainers.js +1 -1
- package/dist/src/shell/DocPage.js +2 -2
- package/dist/src/shell/DroppedArgsList.d.ts +2 -2
- package/dist/src/shell/DroppedArgsList.js +1 -1
- package/dist/src/shell/EmbedPage.js +30 -12
- package/dist/src/shell/Example.d.ts +5 -1
- package/dist/src/shell/Example.js +16 -8
- package/dist/src/shell/FrameView.d.ts +6 -3
- package/dist/src/shell/FrameView.js +2 -2
- package/dist/src/shell/HomePage.d.ts +3 -1
- package/dist/src/shell/HomePage.js +18 -6
- package/dist/src/shell/InfoTip.js +2 -2
- package/dist/src/shell/InteractionsTab.d.ts +11 -4
- package/dist/src/shell/InteractionsTab.js +18 -2
- package/dist/src/shell/LazyPage.js +1 -1
- package/dist/src/shell/PackageHtml.js +3 -1
- package/dist/src/shell/PageWidth.d.ts +29 -0
- package/dist/src/shell/PageWidth.js +18 -0
- package/dist/src/shell/PinnedControl.js +14 -62
- package/dist/src/shell/PinnedControlMenu.d.ts +44 -0
- package/dist/src/shell/PinnedControlMenu.js +72 -0
- package/dist/src/shell/PropFields.d.ts +3 -1
- package/dist/src/shell/PropFields.js +9 -6
- package/dist/src/shell/PropRows.d.ts +22 -11
- package/dist/src/shell/PropRows.js +62 -24
- package/dist/src/shell/PropsTab.d.ts +12 -5
- package/dist/src/shell/PropsTab.js +9 -22
- package/dist/src/shell/RefStoryPage.d.ts +33 -0
- package/dist/src/shell/RefStoryPage.js +123 -0
- package/dist/src/shell/SearchPanel.js +51 -24
- package/dist/src/shell/Shell.d.ts +18 -0
- package/dist/src/shell/Shell.js +141 -23
- package/dist/src/shell/ShortcutHelp.d.ts +22 -0
- package/dist/src/shell/ShortcutHelp.js +66 -0
- package/dist/src/shell/Sidebar.d.ts +17 -4
- package/dist/src/shell/Sidebar.js +92 -41
- package/dist/src/shell/SidebarDocs.js +2 -2
- package/dist/src/shell/SidebarEntries.js +5 -3
- package/dist/src/shell/SidebarHandle.d.ts +3 -5
- package/dist/src/shell/SidebarHandle.js +4 -4
- package/dist/src/shell/SidebarRefs.d.ts +39 -0
- package/dist/src/shell/SidebarRefs.js +99 -0
- package/dist/src/shell/SidebarSearch.js +37 -9
- package/dist/src/shell/SignatureReference.js +3 -1
- package/dist/src/shell/Stage.d.ts +10 -2
- package/dist/src/shell/Stage.js +29 -49
- package/dist/src/shell/StatusBadges.d.ts +54 -0
- package/dist/src/shell/StatusBadges.js +77 -0
- package/dist/src/shell/StoryCodeBlock.d.ts +8 -19
- package/dist/src/shell/StoryCodeBlock.js +7 -6
- package/dist/src/shell/StoryPicker.d.ts +4 -2
- package/dist/src/shell/StoryPicker.js +3 -3
- package/dist/src/shell/Switch.d.ts +29 -0
- package/dist/src/shell/Switch.js +11 -0
- package/dist/src/shell/SwitchGallery.d.ts +36 -0
- package/dist/src/shell/SwitchGallery.js +17 -0
- package/dist/src/shell/SwitchGalleryPanel.d.ts +37 -0
- package/dist/src/shell/SwitchGalleryPanel.js +99 -0
- package/dist/src/shell/TagFilter.d.ts +24 -0
- package/dist/src/shell/TagFilter.js +45 -0
- package/dist/src/shell/TagViews.d.ts +39 -0
- package/dist/src/shell/TagViews.js +20 -0
- package/dist/src/shell/Toolbar.d.ts +4 -1
- package/dist/src/shell/Toolbar.js +17 -7
- package/dist/src/shell/ToolbarControl.d.ts +3 -0
- package/dist/src/shell/ToolbarControl.js +23 -6
- package/dist/src/shell/ViewMenuPanel.js +6 -1
- package/dist/src/shell/argChecks.d.ts +22 -0
- package/dist/src/shell/argChecks.js +20 -0
- package/dist/src/shell/asideStory.js +7 -2
- package/dist/src/shell/audienceSections.css +9 -9
- package/dist/src/shell/catalogueContext.d.ts +1 -1
- package/dist/src/shell/catalogueContext.js +6 -1
- package/dist/src/shell/codeSpans.d.ts +27 -0
- package/dist/src/shell/codeSpans.js +76 -0
- package/dist/src/shell/compareVariants.d.ts +4 -2
- package/dist/src/shell/compareVariants.js +16 -8
- package/dist/src/shell/composition.d.ts +23 -0
- package/dist/src/shell/composition.js +26 -0
- package/dist/src/shell/controlCycle.d.ts +1 -1
- package/dist/src/shell/controlCycle.js +3 -2
- package/dist/src/shell/customControls.d.ts +62 -0
- package/dist/src/shell/customControls.js +81 -0
- package/dist/src/shell/docPage.css +22 -22
- package/dist/src/shell/dockTabs.d.ts +19 -3
- package/dist/src/shell/dockTabs.js +29 -20
- package/dist/src/shell/embed.css +7 -7
- package/dist/src/shell/frameOrder.d.ts +35 -0
- package/dist/src/shell/frameOrder.js +45 -0
- package/dist/src/shell/framesOrigin.d.ts +7 -0
- package/dist/src/shell/framesOrigin.js +1 -1
- package/dist/src/shell/galleryPlace.d.ts +20 -0
- package/dist/src/shell/galleryPlace.js +26 -0
- package/dist/src/shell/icons.d.ts +1 -0
- package/dist/src/shell/icons.js +1 -0
- package/dist/src/shell/keyboard.d.ts +14 -12
- package/dist/src/shell/keyboard.js +21 -6
- package/dist/src/shell/laterStrings.d.ts +30 -0
- package/dist/src/shell/laterStrings.js +43 -3
- package/dist/src/shell/mountShell.js +3 -0
- package/dist/src/shell/pageStrings.d.ts +4 -0
- package/dist/src/shell/pageStrings.js +4 -0
- package/dist/src/shell/pageTagView.d.ts +18 -0
- package/dist/src/shell/pageTagView.js +10 -0
- package/dist/src/shell/playMemory.d.ts +14 -0
- package/dist/src/shell/playMemory.js +8 -0
- package/dist/src/shell/propNotes.d.ts +23 -0
- package/dist/src/shell/propNotes.js +37 -0
- package/dist/src/shell/refIndexLoad.d.ts +17 -0
- package/dist/src/shell/refIndexLoad.js +38 -0
- package/dist/src/shell/refParts.d.ts +34 -0
- package/dist/src/shell/refParts.js +9 -0
- package/dist/src/shell/refStory.css +21 -0
- package/dist/src/shell/refStrings.d.ts +13 -0
- package/dist/src/shell/refStrings.js +21 -0
- package/dist/src/shell/search.css +11 -11
- package/dist/src/shell/shell.css +376 -169
- package/dist/src/shell/shellScheme.js +2 -2
- package/dist/src/shell/shortcutHelp.css +64 -0
- package/dist/src/shell/stageArgs.d.ts +53 -0
- package/dist/src/shell/stageArgs.js +64 -0
- package/dist/src/shell/statusBadges.css +51 -0
- package/dist/src/shell/strings.d.ts +7 -16
- package/dist/src/shell/strings.js +12 -17
- package/dist/src/shell/switchGallery.css +104 -0
- package/dist/src/shell/tagFilter.css +46 -0
- package/dist/src/shell/tagView.d.ts +20 -0
- package/dist/src/shell/tagView.js +10 -0
- package/dist/src/shell/useAddressArgs.d.ts +9 -0
- package/dist/src/shell/useAddressArgs.js +56 -11
- package/dist/src/shell/useControlKeys.js +2 -2
- package/dist/src/shell/useEditedProblems.d.ts +6 -0
- package/dist/src/shell/useEditedProblems.js +40 -0
- package/dist/src/shell/useFrameMessages.js +3 -0
- package/dist/src/shell/useFrameQueue.d.ts +8 -3
- package/dist/src/shell/useFrameQueue.js +42 -12
- package/dist/src/shell/useListedTree.d.ts +13 -0
- package/dist/src/shell/useListedTree.js +32 -0
- package/dist/src/shell/usePageFrames.js +2 -2
- package/dist/src/shell/usePopover.d.ts +5 -0
- package/dist/src/shell/usePopover.js +7 -1
- package/dist/src/shell/useRefIndex.d.ts +22 -0
- package/dist/src/shell/useRefIndex.js +36 -0
- package/dist/src/shell/useScrollSettled.d.ts +18 -0
- package/dist/src/shell/useScrollSettled.js +56 -0
- package/dist/src/shell/useScrollStops.d.ts +20 -0
- package/dist/src/shell/useScrollStops.js +41 -0
- package/dist/src/shell/useShortcutHelp.d.ts +18 -0
- package/dist/src/shell/useShortcutHelp.js +32 -0
- package/dist/src/shell/useSidebarOverlay.d.ts +2 -1
- package/dist/src/shell/useSidebarOverlay.js +12 -4
- package/dist/src/shell/useStoryCode.d.ts +2 -1
- package/dist/src/shell/useStoryCode.js +12 -7
- package/dist/src/shell/useToolbarLayout.d.ts +5 -1
- package/dist/src/shell/useToolbarLayout.js +2 -2
- package/dist/src/shell/useWorstCase.d.ts +8 -2
- package/dist/src/shell/useWorstCase.js +2 -2
- package/dist/src/shell/valueEditors/FileEditor.d.ts +28 -0
- package/dist/src/shell/valueEditors/FileEditor.js +66 -0
- package/dist/src/shell/valueEditors/JsonEditor.d.ts +14 -0
- package/dist/src/shell/valueEditors/JsonEditor.js +53 -0
- package/dist/src/shell/valueEditors/ListEditor.d.ts +24 -0
- package/dist/src/shell/valueEditors/ListEditor.js +82 -0
- package/dist/src/shell/valueEditors/ObjectEditor.d.ts +32 -0
- package/dist/src/shell/valueEditors/ObjectEditor.js +70 -0
- package/dist/src/shell/valueEditors/PropEditor.d.ts +37 -0
- package/dist/src/shell/valueEditors/PropEditor.js +53 -0
- package/dist/src/shell/valueEditors/RecordEditor.d.ts +20 -0
- package/dist/src/shell/valueEditors/RecordEditor.js +84 -0
- package/dist/src/shell/valueEditors/SearchSelect.d.ts +42 -0
- package/dist/src/shell/valueEditors/SearchSelect.js +80 -0
- package/dist/src/shell/valueEditors/TokenEditor.d.ts +49 -0
- package/dist/src/shell/valueEditors/TokenEditor.js +74 -0
- package/dist/src/shell/valueEditors/UnionEditor.d.ts +20 -0
- package/dist/src/shell/valueEditors/UnionEditor.js +64 -0
- package/dist/src/shell/valueEditors/ValueField.d.ts +15 -0
- package/dist/src/shell/valueEditors/ValueField.js +148 -0
- package/dist/src/shell/valueEditors/editorStrings.d.ts +56 -0
- package/dist/src/shell/valueEditors/editorStrings.js +66 -0
- package/dist/src/shell/valueEditors/fieldTypes.d.ts +31 -0
- package/dist/src/shell/valueEditors/fieldTypes.js +0 -0
- package/dist/src/shell/valueEditors/valueEditors.css +153 -0
- package/dist/src/shell/worstArgs.d.ts +8 -5
- package/dist/src/shell/worstArgs.js +14 -7
- package/dist/src/shellTheme.d.ts +1 -1
- package/dist/src/shellTheme.js +15 -1
- package/dist/src/shellTheme.types.d.ts +4 -0
- package/dist/src/shellWord.d.ts +12 -0
- package/dist/src/shellWord.js +15 -0
- package/dist/src/sourceFiles.js +2 -1
- package/dist/src/storyArgTypes.d.ts +57 -0
- package/dist/src/storyArgTypes.js +195 -0
- package/dist/src/storyBackground.js +14 -3
- package/dist/src/storyCheck.d.ts +99 -3
- package/dist/src/storyCheck.js +39 -1
- package/dist/src/storyCodeText.d.ts +52 -0
- package/dist/src/storyCodeText.js +30 -0
- package/dist/src/storyControls.d.ts +103 -0
- package/dist/src/storyControls.js +100 -0
- package/dist/src/storyStatuses.d.ts +55 -0
- package/dist/src/storyStatuses.js +104 -0
- package/dist/src/storyTagNames.d.ts +25 -0
- package/dist/src/storyTagNames.js +25 -0
- package/dist/src/storyTags.d.ts +29 -0
- package/dist/src/storyTags.js +85 -0
- package/dist/src/storyTree.d.ts +13 -0
- package/dist/src/storyTree.js +24 -4
- package/dist/src/storybookArgs.d.ts +24 -0
- package/dist/src/storybookArgs.js +185 -0
- package/dist/src/switches.d.ts +66 -3
- package/dist/src/switches.js +42 -1
- package/dist/src/valueSchema.d.ts +28 -0
- package/dist/src/valueSchema.js +196 -0
- package/dist/src/valueShape.d.ts +94 -0
- package/dist/src/valueShape.js +25 -0
- package/dist/src/viewState.d.ts +8 -3
- package/dist/src/viewState.js +27 -10
- package/dist/src/vite/adapter.d.ts +40 -2
- package/dist/src/vite/adapter.js +1 -0
- package/dist/src/vite/agent.types.d.ts +354 -7
- package/dist/src/vite/agentApi.d.ts +23 -0
- package/dist/src/vite/agentApi.js +90 -17
- package/dist/src/vite/agentIndex.d.ts +0 -2
- package/dist/src/vite/agentIndex.js +5 -6
- package/dist/src/vite/agentRoutes.d.ts +20 -1
- package/dist/src/vite/agentRoutes.js +135 -66
- package/dist/src/vite/agentStatuses.d.ts +42 -0
- package/dist/src/vite/agentStatuses.js +67 -0
- package/dist/src/vite/agentStoryCode.d.ts +51 -0
- package/dist/src/vite/agentStoryCode.js +44 -0
- package/dist/src/vite/agentVisibility.d.ts +47 -0
- package/dist/src/vite/agentVisibility.js +174 -0
- package/dist/src/vite/appAudit.d.ts +134 -0
- package/dist/src/vite/appAudit.js +333 -0
- package/dist/src/vite/appBuildOption.d.ts +53 -0
- package/dist/src/vite/appBuildOption.js +55 -0
- package/dist/src/vite/appTokenFiles.d.ts +92 -0
- package/dist/src/vite/appTokenFiles.js +433 -0
- package/dist/src/vite/appTokens.d.ts +23 -0
- package/dist/src/vite/appTokens.js +275 -0
- package/dist/src/vite/argControlsConfig.d.ts +30 -0
- package/dist/src/vite/argControlsConfig.js +176 -0
- package/dist/src/vite/builtTexts.d.ts +10 -0
- package/dist/src/vite/builtTexts.js +59 -22
- package/dist/src/vite/catalogueConfig.d.ts +3 -1
- package/dist/src/vite/catalogueConfig.js +21 -4
- package/dist/src/vite/changeCoverage.d.ts +74 -0
- package/dist/src/vite/changeCoverage.js +120 -0
- package/dist/src/vite/changedRoute.d.ts +30 -0
- package/dist/src/vite/changedRoute.js +197 -0
- package/dist/src/vite/checkCode.d.ts +105 -3
- package/dist/src/vite/checkCode.js +323 -36
- package/dist/src/vite/checkoutWatch.d.ts +97 -0
- package/dist/src/vite/checkoutWatch.js +287 -0
- package/dist/src/vite/closeWatch.d.ts +8 -0
- package/dist/src/vite/closeWatch.js +1 -1
- package/dist/src/vite/componentCache.d.ts +8 -0
- package/dist/src/vite/componentCache.js +66 -0
- package/dist/src/vite/componentGraph.d.ts +71 -0
- package/dist/src/vite/componentGraph.js +133 -0
- package/dist/src/vite/componentRules.d.ts +33 -0
- package/dist/src/vite/componentRules.js +105 -0
- package/dist/src/vite/componentScan.d.ts +69 -0
- package/dist/src/vite/componentScan.js +418 -0
- package/dist/src/vite/compositionCheck.d.ts +15 -0
- package/dist/src/vite/compositionCheck.js +243 -0
- package/dist/src/vite/config.d.ts +67 -1
- package/dist/src/vite/configFile.d.ts +15 -2
- package/dist/src/vite/configFile.js +109 -40
- package/dist/src/vite/configKeys.d.ts +15 -0
- package/dist/src/vite/configKeys.js +172 -0
- package/dist/src/vite/configLoadError.d.ts +23 -0
- package/dist/src/vite/configLoadError.js +71 -0
- package/dist/src/vite/cssDeclarations.d.ts +71 -0
- package/dist/src/vite/cssDeclarations.js +290 -0
- package/dist/src/vite/cssImports.d.ts +14 -0
- package/dist/src/vite/cssImports.js +48 -0
- package/dist/src/vite/cssReferences.d.ts +54 -0
- package/dist/src/vite/cssReferences.js +157 -0
- package/dist/src/vite/cssTokenValues.d.ts +50 -0
- package/dist/src/vite/cssTokenValues.js +233 -0
- package/dist/src/vite/designTokens.d.ts +24 -0
- package/dist/src/vite/designTokens.js +5 -1
- package/dist/src/vite/docsExtractor.d.ts +9 -3
- package/dist/src/vite/docsExtractor.js +11 -3
- package/dist/src/vite/docsProgram.d.ts +17 -4
- package/dist/src/vite/docsProgram.js +52 -11
- package/dist/src/vite/docsWorker.js +7 -2
- package/dist/src/vite/emptyStoryGlobs.d.ts +41 -0
- package/dist/src/vite/emptyStoryGlobs.js +52 -0
- package/dist/src/vite/fileImports.d.ts +17 -0
- package/dist/src/vite/fileImports.js +57 -0
- package/dist/src/vite/findComponent.d.ts +10 -2
- package/dist/src/vite/findComponent.js +27 -22
- package/dist/src/vite/findRoute.js +3 -2
- package/dist/src/vite/forcedStates.d.ts +9 -2
- package/dist/src/vite/forcedStates.js +12 -3
- package/dist/src/vite/forgebookPlugin.d.ts +2 -0
- package/dist/src/vite/forgebookPlugin.js +55 -73
- package/dist/src/vite/frameErrors.d.ts +19 -0
- package/dist/src/vite/frameErrors.js +70 -0
- package/dist/src/vite/framesServer.d.ts +12 -0
- package/dist/src/vite/framesServer.js +21 -4
- package/dist/src/vite/functionComponentDocs.js +81 -12
- package/dist/src/vite/generatedModules.js +4 -2
- package/dist/src/vite/gitChange.d.ts +38 -5
- package/dist/src/vite/gitChange.js +71 -11
- package/dist/src/vite/hiddenStoryFiles.d.ts +23 -0
- package/dist/src/vite/hiddenStoryFiles.js +107 -0
- package/dist/src/vite/hotSnippets.d.ts +38 -14
- package/dist/src/vite/hotSnippets.js +137 -39
- package/dist/src/vite/importedNames.d.ts +37 -0
- package/dist/src/vite/importedNames.js +138 -0
- package/dist/src/vite/indexFields.d.ts +6 -0
- package/dist/src/vite/indexFields.js +21 -0
- package/dist/src/vite/indexStoryFile.d.ts +8 -1
- package/dist/src/vite/indexStoryFile.js +22 -157
- package/dist/src/vite/jsxCallSites.d.ts +33 -0
- package/dist/src/vite/jsxCallSites.js +200 -0
- package/dist/src/vite/jsxInScripts.d.ts +67 -0
- package/dist/src/vite/jsxInScripts.js +138 -0
- package/dist/src/vite/jsxTree.d.ts +20 -0
- package/dist/src/vite/jsxTree.js +163 -0
- package/dist/src/vite/lineAndColumn.d.ts +13 -0
- package/dist/src/vite/lineAndColumn.js +18 -0
- package/dist/src/vite/lookAlikes.d.ts +65 -0
- package/dist/src/vite/lookAlikes.js +228 -0
- package/dist/src/vite/nearestToken.d.ts +17 -0
- package/dist/src/vite/nearestToken.js +9 -2
- package/dist/src/vite/packageEntries.d.ts +42 -0
- package/dist/src/vite/packageEntries.js +127 -0
- package/dist/src/vite/pages.d.ts +9 -1
- package/dist/src/vite/pages.js +119 -4
- package/dist/src/vite/pluginConfig.js +4 -0
- package/dist/src/vite/pluginIds.d.ts +2 -0
- package/dist/src/vite/pluginIds.js +5 -1
- package/dist/src/vite/pluginModules.d.ts +81 -11
- package/dist/src/vite/pluginModules.js +109 -21
- package/dist/src/vite/prebundled.d.ts +57 -15
- package/dist/src/vite/prebundled.js +80 -0
- package/dist/src/vite/previewTags.d.ts +25 -0
- package/dist/src/vite/previewTags.js +56 -0
- package/dist/src/vite/projectFiles.d.ts +54 -0
- package/dist/src/vite/projectFiles.js +116 -0
- package/dist/src/vite/projectPostcss.d.ts +70 -0
- package/dist/src/vite/projectPostcss.js +250 -0
- package/dist/src/vite/propDocs.d.ts +12 -0
- package/dist/src/vite/propDocs.js +187 -60
- package/dist/src/vite/propKind.d.ts +40 -0
- package/dist/src/vite/propKind.js +71 -0
- package/dist/src/vite/propTypeNotes.d.ts +22 -0
- package/dist/src/vite/propTypeNotes.js +51 -0
- package/dist/src/vite/publishedExports.d.ts +27 -0
- package/dist/src/vite/publishedExports.js +298 -0
- package/dist/src/vite/realFolder.d.ts +6 -0
- package/dist/src/vite/realFolder.js +25 -0
- package/dist/src/vite/refsConfig.d.ts +39 -0
- package/dist/src/vite/refsConfig.js +54 -0
- package/dist/src/vite/reuseCheck.d.ts +45 -0
- package/dist/src/vite/reuseCheck.js +260 -0
- package/dist/src/vite/runningVersions.d.ts +33 -0
- package/dist/src/vite/runningVersions.js +25 -0
- package/dist/src/vite/scriptProblems.d.ts +60 -0
- package/dist/src/vite/scriptProblems.js +155 -0
- package/dist/src/vite/searchModule.js +3 -2
- package/dist/src/vite/searchRoute.js +4 -2
- package/dist/src/vite/shapeDocs.d.ts +36 -0
- package/dist/src/vite/shapeDocs.js +177 -0
- package/dist/src/vite/singleFileComponent.d.ts +17 -0
- package/dist/src/vite/singleFileComponent.js +83 -0
- package/dist/src/vite/sourceText.d.ts +34 -0
- package/dist/src/vite/sourceText.js +72 -0
- package/dist/src/vite/sourceTokens.d.ts +7 -0
- package/dist/src/vite/sourceTokens.js +7 -2
- package/dist/src/vite/stackLines.d.ts +49 -0
- package/dist/src/vite/stackLines.js +96 -0
- package/dist/src/vite/storyCode.d.ts +22 -7
- package/dist/src/vite/storyCode.js +263 -37
- package/dist/src/vite/storyCoverage.d.ts +48 -0
- package/dist/src/vite/storyCoverage.js +179 -0
- package/dist/src/vite/storyFilesModule.d.ts +48 -3
- package/dist/src/vite/storyFilesModule.js +105 -15
- package/dist/src/vite/storyPatterns.d.ts +31 -0
- package/dist/src/vite/storyPatterns.js +140 -5
- package/dist/src/vite/storyReach.d.ts +10 -2
- package/dist/src/vite/storyReach.js +15 -11
- package/dist/src/vite/storyTopLevel.d.ts +51 -0
- package/dist/src/vite/storyTopLevel.js +146 -0
- package/dist/src/vite/storylessRoutes.d.ts +4 -3
- package/dist/src/vite/storylessRoutes.js +210 -19
- package/dist/src/vite/switchValuesCheck.d.ts +19 -0
- package/dist/src/vite/switchValuesCheck.js +164 -0
- package/dist/src/vite/switchesDocument.d.ts +15 -0
- package/dist/src/vite/switchesDocument.js +47 -0
- package/dist/src/vite/tailwindConfigTokens.d.ts +41 -0
- package/dist/src/vite/tailwindConfigTokens.js +306 -0
- package/dist/src/vite/textImports.d.ts +15 -0
- package/dist/src/vite/textImports.js +58 -0
- package/dist/src/vite/textModules.d.ts +6 -5
- package/dist/src/vite/textModules.js +13 -8
- package/dist/src/vite/tokenAnswers.d.ts +6 -2
- package/dist/src/vite/tokenAnswers.js +11 -7
- package/dist/src/vite/typeParameters.d.ts +83 -0
- package/dist/src/vite/typeParameters.js +270 -0
- package/dist/src/vite/typedControls.d.ts +31 -0
- package/dist/src/vite/typedControls.js +66 -0
- package/dist/src/vite/unionProps.d.ts +37 -0
- package/dist/src/vite/unionProps.js +121 -0
- package/dist/src/vite/unresolvedTokens.d.ts +20 -0
- package/dist/src/vite/unresolvedTokens.js +193 -0
- package/dist/src/vite/usageGraph.js +10 -52
- package/dist/src/vite/usageGuidance.d.ts +9 -2
- package/dist/src/vite/usageGuidance.js +36 -8
- package/dist/src/vite/usageImports.d.ts +35 -0
- package/dist/src/vite/usageImports.js +280 -0
- package/dist/src/vite/visibilityRoute.d.ts +16 -0
- package/dist/src/vite/visibilityRoute.js +320 -0
- package/dist/src/worstCase.d.ts +2 -0
- package/dist/src/worstCase.js +2 -0
- 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
|
|
80
|
+
const declaration = useMemo(() => {
|
|
50
81
|
const ready = storyArgs === undefined ? undefined : { args: storyArgs, argTypes, controls };
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
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
|
|
108
|
+
dropped: checked === undefined ? NOTHING_DROPPED : [...unread, ...refused, ...checked.dropped],
|
|
68
109
|
acceptedParam,
|
|
69
110
|
acceptedFor: (message) => {
|
|
70
|
-
const
|
|
71
|
-
|
|
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 {
|
|
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 (
|
|
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,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
|
|
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
|
|
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
|
|
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
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
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
|
|
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
|
+
};
|