forgebook 0.3.3 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +914 -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 +175 -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 +57 -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 +90 -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 +196 -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 +297 -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 +100 -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 +66 -184
- 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 +71 -0
- package/dist/src/componentDocs.js +15 -2
- 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/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 +7 -1
- package/dist/src/frame/mountFrame.js +153 -46
- 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/CodeTab.d.ts +3 -2
- package/dist/src/shell/CodeTab.js +3 -2
- 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 +1 -1
- package/dist/src/shell/ComponentPage.js +5 -1
- package/dist/src/shell/CustomControl.d.ts +34 -0
- package/dist/src/shell/CustomControl.js +132 -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 +16 -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/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 +23 -2
- package/dist/src/shell/PropRows.js +58 -19
- package/dist/src/shell/PropsTab.d.ts +12 -5
- package/dist/src/shell/PropsTab.js +9 -21
- 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 +137 -22
- 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/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 +55 -0
- package/dist/src/shell/customControls.js +70 -0
- package/dist/src/shell/docPage.css +22 -22
- package/dist/src/shell/dockTabs.d.ts +19 -3
- package/dist/src/shell/dockTabs.js +28 -20
- package/dist/src/shell/embed.css +7 -7
- 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 +29 -0
- package/dist/src/shell/laterStrings.js +42 -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 +348 -168
- 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/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/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 +147 -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 +85 -3
- package/dist/src/storyCheck.js +23 -1
- package/dist/src/storyCodeText.d.ts +46 -0
- package/dist/src/storyCodeText.js +27 -0
- package/dist/src/storyControls.d.ts +100 -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 +347 -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 +106 -65
- package/dist/src/vite/agentStatuses.d.ts +42 -0
- package/dist/src/vite/agentStatuses.js +67 -0
- package/dist/src/vite/agentStoryCode.d.ts +48 -0
- package/dist/src/vite/agentStoryCode.js +38 -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/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 +15 -3
- 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 +32 -1
- package/dist/src/vite/configFile.d.ts +14 -2
- package/dist/src/vite/configFile.js +124 -40
- package/dist/src/vite/configKeys.d.ts +15 -0
- package/dist/src/vite/configKeys.js +171 -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 +52 -72
- 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 +108 -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 +130 -58
- 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/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
package/dist/src/shell/Stage.js
CHANGED
|
@@ -15,9 +15,9 @@ import { useEffect, useMemo, useRef, useState } from "react";
|
|
|
15
15
|
import { checkedArgsMessage } from "../addressArgs.js";
|
|
16
16
|
import { panelProps, settableProps } from "../argTypes.js";
|
|
17
17
|
import { matrixOf, matrixProps } from "../matrix.js";
|
|
18
|
-
import { panelArgsParam } from "../messages.js";
|
|
19
18
|
import { withFixed, withOwnFixed } from "../storyGlobals.js";
|
|
20
|
-
import {
|
|
19
|
+
import { shownSwitches } from "../switches.js";
|
|
20
|
+
import { frameAddress, isComparing, liveView, schemeOf } from "../viewState.js";
|
|
21
21
|
import { useStoryClockControls } from "./ClockControls.js";
|
|
22
22
|
import { useCatalogue } from "./catalogueContext.js";
|
|
23
23
|
import { DeviceSlot, deviceAddress, isWaitingForDevice, roomSizing, useInkScheme, useStageDevice } from "./DeviceSlot.js";
|
|
@@ -31,6 +31,7 @@ import { StageCompare } from "./StageCompare.js";
|
|
|
31
31
|
import { StageTools } from "./StageTools.js";
|
|
32
32
|
import { StageViewport } from "./StageViewport.js";
|
|
33
33
|
import { StoryBar } from "./StoryBar.js";
|
|
34
|
+
import { embedHeight, embedQuery, takesArgs, usePanelValues } from "./stageArgs.js";
|
|
34
35
|
import { STRINGS } from "./strings.js";
|
|
35
36
|
import { useAddressArgs } from "./useAddressArgs.js";
|
|
36
37
|
import { useFrameMessages } from "./useFrameMessages.js";
|
|
@@ -53,42 +54,16 @@ const widthSetter = (fixed, view, onViewChange) => fixed.width === undefined ? (
|
|
|
53
54
|
const INITIAL_FRAME_HEIGHT = 240;
|
|
54
55
|
/** The most calls the Events tab keeps. */
|
|
55
56
|
const MAX_CALLS = 50;
|
|
56
|
-
/**
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
* @param story - the story.
|
|
61
|
-
*/
|
|
62
|
-
const takesArgs = (story) => !story.isLogic && (story.controls === "all" || story.controls.length > 0);
|
|
63
|
-
/**
|
|
64
|
-
* What an embed of the story keeps of the page: its view and the values set in the panel. An embed draws no device
|
|
65
|
-
* frame, so the device chosen is left out: the embed is the story at the width its iframe gives it.
|
|
66
|
-
*
|
|
67
|
-
* @param view - the reader's view, without what the story fixes, which the story fixes again.
|
|
68
|
-
* @param panelArgs - the values set in the panel.
|
|
69
|
-
* @param switches - the catalogue's switches.
|
|
70
|
-
*/
|
|
71
|
-
const embedQuery = (view, panelArgs, switches) => {
|
|
72
|
-
const params = viewParams({ ...view, device: "auto", orientation: "auto" }, switches);
|
|
73
|
-
const args = panelArgsParam(panelArgs);
|
|
74
|
-
if (args !== "")
|
|
75
|
-
params.set("args", args);
|
|
76
|
-
return params.toString();
|
|
77
|
-
};
|
|
78
|
-
/**
|
|
79
|
-
* The height an embed's iframe starts at: as tall as the frame is on the stage.
|
|
80
|
-
*
|
|
81
|
-
* @param view - the view, with the height set on the stage.
|
|
82
|
-
* @param contentHeight - the story's content, in CSS px.
|
|
83
|
-
* @param story - the story, with the height its scene declares.
|
|
84
|
-
*/
|
|
85
|
-
const embedHeight = (view, contentHeight, story) => view.height === "auto" ? Math.max(contentHeight, story.height ?? 0) : view.height;
|
|
57
|
+
/** No args of the story's own, as one value: what is computed from them is kept while it stays the same. */
|
|
58
|
+
const NO_OWN_ARGS = {};
|
|
59
|
+
/** A story's own args, as its frame reported them; none before it did. */
|
|
60
|
+
const ownArgsOf = (reported, storyId) => reported.get(storyId) ?? NO_OWN_ARGS;
|
|
86
61
|
/**
|
|
87
62
|
* The stage.
|
|
88
63
|
*
|
|
89
64
|
* @param props - the component, the story, the view, the panel's values, the frame page and the loaders.
|
|
90
65
|
*/
|
|
91
|
-
export const Stage = ({ component, story, view: ownView, onViewChange: onOwnViewChange, onFixedChange, panelArgs, onPanelArgsChange, matrixAxes, onMatrixAxesChange, frameUrl, plugins, loadCode, loadDocs, namedValues, header, onShownWidthChange, measuredHeight, backgroundOf, scroll }) => {
|
|
66
|
+
export const Stage = ({ component, story, view: ownView, onViewChange: onOwnViewChange, onFixedChange, loadTokens, argControls, panelArgs, addressLink, onPanelArgsChange, matrixAxes, onMatrixAxesChange, frameUrl, plugins, loadCode, loadDocs, namedValues, header, onShownWidthChange, measuredHeight, backgroundOf, scroll }) => {
|
|
92
67
|
const frameRef = useRef(null);
|
|
93
68
|
const storyRef = useRef(null);
|
|
94
69
|
const code = useStoryCode(loadCode);
|
|
@@ -123,7 +98,9 @@ export const Stage = ({ component, story, view: ownView, onViewChange: onOwnView
|
|
|
123
98
|
null, [docs, matrixAxes, story.isLogic]);
|
|
124
99
|
// the address's values reach the frames only once checked against what the story declares
|
|
125
100
|
const addressArgs = useAddressArgs({
|
|
101
|
+
argControls,
|
|
126
102
|
panelArgs,
|
|
103
|
+
link: addressLink,
|
|
127
104
|
docs,
|
|
128
105
|
storyArgs: storyArgs.get(story.id),
|
|
129
106
|
argTypes: panel.argTypes,
|
|
@@ -132,16 +109,20 @@ export const Stage = ({ component, story, view: ownView, onViewChange: onOwnView
|
|
|
132
109
|
frames: storyRef
|
|
133
110
|
});
|
|
134
111
|
const acceptedArgs = addressArgs.accepted;
|
|
135
|
-
const
|
|
112
|
+
const ownArgs = ownArgsOf(storyArgs, story.id);
|
|
113
|
+
const panelValues = usePanelValues(acceptedArgs, ownArgs, onPanelArgsChange);
|
|
114
|
+
const { values } = panelValues;
|
|
136
115
|
const settable = useMemo(() => docs.status === "ready"
|
|
137
|
-
? settableProps(panelProps(docs.value.props, panel.argTypes), panel.controls, namedValues ?? {})
|
|
138
|
-
: [], [docs, panel.argTypes, panel.controls, namedValues]);
|
|
116
|
+
? settableProps(panelProps(docs.value.props, panel.argTypes, ownArgs), panel.controls, namedValues ?? {})
|
|
117
|
+
: [], [docs, panel.argTypes, panel.controls, namedValues, ownArgs]);
|
|
139
118
|
const worstCase = useWorstCase({
|
|
140
119
|
storyRef,
|
|
141
120
|
storyId: story.id,
|
|
142
121
|
settable,
|
|
143
122
|
values,
|
|
144
123
|
panelArgs: acceptedArgs,
|
|
124
|
+
namedValues,
|
|
125
|
+
worstOfShape: addressArgs.worstOfShape,
|
|
145
126
|
onPanelArgsChange
|
|
146
127
|
});
|
|
147
128
|
const clockControls = useStoryClockControls(frameRef, story.id);
|
|
@@ -188,11 +169,6 @@ export const Stage = ({ component, story, view: ownView, onViewChange: onOwnView
|
|
|
188
169
|
// the docs may arrive after the frames: they learn the events then
|
|
189
170
|
useEffect(() => tellFrames(storyRef.current, { type: "forgebook:events", names: eventNames }), [eventNames]);
|
|
190
171
|
useEffect(() => tellFrames(storyRef.current, { type: "forgebook:matrix", matrix }), [matrix]);
|
|
191
|
-
// a change starts from the values the story takes: one the address named and the story does not is let go
|
|
192
|
-
const changeValue = (name, value) => {
|
|
193
|
-
const { [name]: _removed, ...rest } = acceptedArgs;
|
|
194
|
-
onPanelArgsChange(value === undefined ? rest : { ...rest, [name]: value });
|
|
195
|
-
};
|
|
196
172
|
const replay = () => {
|
|
197
173
|
const message = { type: "forgebook:replay" };
|
|
198
174
|
frameRef.current?.contentWindow?.postMessage(message, framesOrigin());
|
|
@@ -205,7 +181,7 @@ export const Stage = ({ component, story, view: ownView, onViewChange: onOwnView
|
|
|
205
181
|
// among them) is sent live
|
|
206
182
|
// a device sets the story's width and height in place of the stage's own, and its story area is the toolbar's width
|
|
207
183
|
const { shown, framed } = useStageDevice(view, story.device, onShownWidthChange);
|
|
208
|
-
const address = deviceAddress(frameAddress(frameUrl, story.id, useLoadedView(`${story.id}|${view.sheets}`, view), switches), framed);
|
|
184
|
+
const address = deviceAddress(frameAddress(frameUrl, story.id, useLoadedView(`${story.id}|${view.sheets}|${view.play}`, view), switches), framed);
|
|
209
185
|
useLiveView(storyRef, view, !isComparing(view));
|
|
210
186
|
useScrollMemory(storyRef, scroll);
|
|
211
187
|
const ink = useInkScheme(schemeOf(view, switches));
|
|
@@ -244,7 +220,12 @@ export const Stage = ({ component, story, view: ownView, onViewChange: onOwnView
|
|
|
244
220
|
controls: panel.controls,
|
|
245
221
|
actions: panel.actions,
|
|
246
222
|
values,
|
|
247
|
-
|
|
223
|
+
panelArgs: acceptedArgs,
|
|
224
|
+
storyArgs: ownArgs,
|
|
225
|
+
loadTokens,
|
|
226
|
+
argControls,
|
|
227
|
+
globals: shownSwitches(view.switches, switches),
|
|
228
|
+
onValueChange: panelValues.change,
|
|
248
229
|
onReset: () => onPanelArgsChange({}),
|
|
249
230
|
worstCase: worstCase.state,
|
|
250
231
|
namedValues,
|
|
@@ -256,17 +237,16 @@ export const Stage = ({ component, story, view: ownView, onViewChange: onOwnView
|
|
|
256
237
|
calls: calls.filter((call) => call.storyId === story.id),
|
|
257
238
|
onClearCalls: () => setCalls([]),
|
|
258
239
|
trace: isComparing(view) ? undefined : traces.get(story.id),
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
},
|
|
240
|
+
view,
|
|
241
|
+
onViewChange,
|
|
242
|
+
onPlayStep: (command) => tellFrames(storyRef.current, { type: "forgebook:play-step", command }),
|
|
263
243
|
check: storyCheck.check,
|
|
264
244
|
onCheck: isComparing(view) ? undefined : storyCheck.run,
|
|
265
245
|
pluginTabs
|
|
266
246
|
}).filter((tab) => catalogue.tabs.includes(tab.id));
|
|
267
247
|
return (_jsxs("div", { className: "forgebook-workspace", children: [header, _jsxs("div", { className: "forgebook-story-pane", children: [_jsx("div", { ref: storyRef, className: "forgebook-scroll", children: _jsxs("section", { className: "forgebook-story", "aria-label": STRINGS.storyLabel, children: [_jsx(StoryBar, { story: story, axisProps: axisProps, matrixAxes: matrixAxes, onMatrixAxesChange: onMatrixAxesChange, onReplay: canReplay ? replay : undefined, clockControls: hasClock ? clockControls : undefined, frameAddress: frameAddress(frameUrl, story.id, view, switches), embed: {
|
|
268
248
|
title,
|
|
269
|
-
query: embedQuery(ownView,
|
|
249
|
+
query: embedQuery(ownView, acceptedArgs, switches),
|
|
270
250
|
height: embedHeight(view, reportedHeight ?? lastHeight, story)
|
|
271
251
|
} }), _jsx(DroppedArgsNote, { dropped: addressArgs.dropped, onRemove: () => onPanelArgsChange(acceptedArgs) }), isComparing(view) ? (_jsx(StageCompare, { story: story, title: title, view: view, frameUrl: frameUrl, framed: framed, heights: heights, settled: settled, fallbackHeight: lastHeight, backgroundOf: backgroundOf })) : (_jsx(StageViewport, { zoom: view.zoom, ...roomSizing(framed, {
|
|
272
252
|
width: view.width,
|
|
@@ -275,5 +255,5 @@ export const Stage = ({ component, story, view: ownView, onViewChange: onOwnView
|
|
|
275
255
|
background: backgroundOf(view),
|
|
276
256
|
height: view.height,
|
|
277
257
|
onHeightChange: (height) => onViewChange({ ...view, height })
|
|
278
|
-
}), children: (fixedHeight) => (_jsx(DeviceSlot, { framed: framed, scheme: ink, background: backgroundOf(view), children: isWaitingForDevice(shown, framed) ? null : (_jsx(FrameView, {
|
|
258
|
+
}), children: (fixedHeight) => (_jsx(DeviceSlot, { framed: framed, scheme: ink, background: backgroundOf(view), children: isWaitingForDevice(shown, framed) ? null : (_jsx(FrameView, { frame: frameRef, title: title, address: address, heights: heights, settled: settled, fallbackHeight: measuredHeight ?? lastHeight, sceneHeight: story.height, fixedHeight: framed?.area.height ?? fixedHeight }, story.id)) })) }))] }) }), isComparing(view) ? null : (_jsx(StageTools, { zoom: view.zoom, onZoomChange: (zoom) => onViewChange({ ...view, zoom }), tools: view.tools, onToolsChange: (tools) => onViewChange({ ...view, tools }) }))] }), view.isPanelOpen ? (_jsx(Dock, { tabs: tabs, activeTab: view.panelTab, onTabChange: (panelTab) => onViewChange({ ...view, panelTab }), onClose: () => onViewChange({ ...view, isPanelOpen: false }) })) : null] }));
|
|
279
259
|
};
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The statuses' badges: in a component's entry of the sidebar, at the top of its page, beside a story's example that
|
|
3
|
+
* holds a status of its own, and in the tag filter's list.
|
|
4
|
+
* Loaded with the tag filter (`TagViews.tsx`), only for a catalogue whose stories have tags.
|
|
5
|
+
*
|
|
6
|
+
* @remarks
|
|
7
|
+
* A badge says its status in words, so its colour is never the only sign; a hidden word before the badges tells a
|
|
8
|
+
* screen reader what they are. A page whose component is `@deprecated` in its TSDoc shows the `deprecated` badge even
|
|
9
|
+
* when its meta has no such tag, with the TSDoc's reason in its tooltip, so the page never says less than the docs.
|
|
10
|
+
*
|
|
11
|
+
* @module
|
|
12
|
+
*/
|
|
13
|
+
import { type ReactNode } from "react";
|
|
14
|
+
import { type CatalogueStatus } from "../storyStatuses.ts";
|
|
15
|
+
import type { TreeComponent } from "../storyTree.ts";
|
|
16
|
+
import "./statusBadges.scss";
|
|
17
|
+
/**
|
|
18
|
+
* A status's text: the catalogue's label, else Forgebook's word for a default status, else its tag.
|
|
19
|
+
*
|
|
20
|
+
* @param status - the status.
|
|
21
|
+
*/
|
|
22
|
+
export declare const statusLabel: (status: CatalogueStatus) => string;
|
|
23
|
+
/**
|
|
24
|
+
* One badge.
|
|
25
|
+
*
|
|
26
|
+
* @param props - the status, and the tooltip it carries when there is more to say.
|
|
27
|
+
*/
|
|
28
|
+
export declare const StatusBadge: ({ status, hint }: {
|
|
29
|
+
readonly status: CatalogueStatus;
|
|
30
|
+
readonly hint?: string | undefined;
|
|
31
|
+
}) => ReactNode;
|
|
32
|
+
/**
|
|
33
|
+
* The catalogue's statuses, their defaults filled in, once per declaration.
|
|
34
|
+
*/
|
|
35
|
+
export declare const useStatuses: () => readonly CatalogueStatus[];
|
|
36
|
+
/**
|
|
37
|
+
* The badges of the statuses a list of tags holds; nothing for none.
|
|
38
|
+
*
|
|
39
|
+
* @param props - the tags, and the row's class.
|
|
40
|
+
*/
|
|
41
|
+
export declare const StatusBadges: ({ tags, className }: {
|
|
42
|
+
readonly tags: readonly string[];
|
|
43
|
+
readonly className: string;
|
|
44
|
+
}) => ReactNode;
|
|
45
|
+
/**
|
|
46
|
+
* The badges at the top of a component's page: its meta's statuses, and `deprecated` when its TSDoc says so, with the
|
|
47
|
+
* TSDoc's reason in that badge's tooltip.
|
|
48
|
+
*
|
|
49
|
+
* @param props - the component and its docs loader.
|
|
50
|
+
*/
|
|
51
|
+
export declare const ComponentBadges: ({ component, loadDocs }: {
|
|
52
|
+
readonly component: TreeComponent;
|
|
53
|
+
readonly loadDocs: (() => Promise<unknown>) | undefined;
|
|
54
|
+
}) => ReactNode;
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* The statuses' badges: in a component's entry of the sidebar, at the top of its page, beside a story's example that
|
|
4
|
+
* holds a status of its own, and in the tag filter's list.
|
|
5
|
+
* Loaded with the tag filter (`TagViews.tsx`), only for a catalogue whose stories have tags.
|
|
6
|
+
*
|
|
7
|
+
* @remarks
|
|
8
|
+
* A badge says its status in words, so its colour is never the only sign; a hidden word before the badges tells a
|
|
9
|
+
* screen reader what they are. A page whose component is `@deprecated` in its TSDoc shows the `deprecated` badge even
|
|
10
|
+
* when its meta has no such tag, with the TSDoc's reason in its tooltip, so the page never says less than the docs.
|
|
11
|
+
*
|
|
12
|
+
* @module
|
|
13
|
+
*/
|
|
14
|
+
import { useMemo } from "react";
|
|
15
|
+
import { catalogueStatuses, DEPRECATED_STATUS, statusesOf } from "../storyStatuses.js";
|
|
16
|
+
import "./statusBadges.css";
|
|
17
|
+
import { useCatalogue } from "./catalogueContext.js";
|
|
18
|
+
import { textsOfGroup } from "./strings.js";
|
|
19
|
+
import { useComponentDocs } from "./useComponentDocs.js";
|
|
20
|
+
/** The badges' texts, as shown: Forgebook's, with the catalogue's replacements (`strings: { "statuses.review": … }`). */
|
|
21
|
+
const STATUS_TEXTS = textsOfGroup("statuses", {
|
|
22
|
+
status: "Status",
|
|
23
|
+
review: "Review",
|
|
24
|
+
experimental: "Experimental",
|
|
25
|
+
deprecated: "Deprecated",
|
|
26
|
+
fromDocs: (reason) => `Deprecated in its TSDoc: ${reason}`
|
|
27
|
+
});
|
|
28
|
+
/**
|
|
29
|
+
* A status's text: the catalogue's label, else Forgebook's word for a default status, else its tag.
|
|
30
|
+
*
|
|
31
|
+
* @param status - the status.
|
|
32
|
+
*/
|
|
33
|
+
export const statusLabel = (status) => {
|
|
34
|
+
if (status.label !== undefined)
|
|
35
|
+
return status.label;
|
|
36
|
+
if (status.id === "review" || status.id === "experimental" || status.id === "deprecated")
|
|
37
|
+
return STATUS_TEXTS[status.id];
|
|
38
|
+
return status.id;
|
|
39
|
+
};
|
|
40
|
+
/**
|
|
41
|
+
* One badge.
|
|
42
|
+
*
|
|
43
|
+
* @param props - the status, and the tooltip it carries when there is more to say.
|
|
44
|
+
*/
|
|
45
|
+
export const StatusBadge = ({ status, hint }) => (_jsx("span", { className: "forgebook-status", "data-tone": status.tone, title: hint ?? statusLabel(status), children: statusLabel(status) }));
|
|
46
|
+
/**
|
|
47
|
+
* A row of badges, with the hidden word that says what they are; nothing for none.
|
|
48
|
+
*
|
|
49
|
+
* @param props - the statuses, the tooltip of each by id, and the row's class.
|
|
50
|
+
*/
|
|
51
|
+
const Badges = ({ statuses, hints, className }) => statuses.length === 0 ? null : (_jsxs("span", { className: className, children: [_jsxs("span", { className: "forgebook-visually-hidden", children: [STATUS_TEXTS.status, ": "] }), statuses.map((status) => (_jsx(StatusBadge, { status: status, hint: hints?.[status.id] }, status.id)))] }));
|
|
52
|
+
/**
|
|
53
|
+
* The catalogue's statuses, their defaults filled in, once per declaration.
|
|
54
|
+
*/
|
|
55
|
+
export const useStatuses = () => {
|
|
56
|
+
const { statuses } = useCatalogue();
|
|
57
|
+
return useMemo(() => catalogueStatuses(statuses), [statuses]);
|
|
58
|
+
};
|
|
59
|
+
/**
|
|
60
|
+
* The badges of the statuses a list of tags holds; nothing for none.
|
|
61
|
+
*
|
|
62
|
+
* @param props - the tags, and the row's class.
|
|
63
|
+
*/
|
|
64
|
+
export const StatusBadges = ({ tags, className }) => _jsx(Badges, { className: className, statuses: statusesOf(tags, useStatuses()) });
|
|
65
|
+
/**
|
|
66
|
+
* The badges at the top of a component's page: its meta's statuses, and `deprecated` when its TSDoc says so, with the
|
|
67
|
+
* TSDoc's reason in that badge's tooltip.
|
|
68
|
+
*
|
|
69
|
+
* @param props - the component and its docs loader.
|
|
70
|
+
*/
|
|
71
|
+
export const ComponentBadges = ({ component, loadDocs }) => {
|
|
72
|
+
const statuses = useStatuses();
|
|
73
|
+
const docs = useComponentDocs(loadDocs);
|
|
74
|
+
const reason = docs.status === "ready" ? docs.value.guidance?.deprecated : undefined;
|
|
75
|
+
const { tags } = component;
|
|
76
|
+
return (_jsx(Badges, { className: "forgebook-status-badges forgebook-status-badges--page", statuses: statusesOf(reason === undefined ? tags : [...tags, DEPRECATED_STATUS], statuses), hints: reason === undefined ? {} : { [DEPRECATED_STATUS]: STATUS_TEXTS.fromDocs(reason) } }));
|
|
77
|
+
};
|
|
@@ -1,31 +1,20 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* A story's code, as the panel's Code tab and the component page show it: its `render` as written, coloured by the
|
|
3
|
-
* plugin, or, for a story drawn from its args, the component in the framework's code with the
|
|
3
|
+
* plugin, or, for a story drawn from its args, the component in the framework's code with the args its file writes as
|
|
4
|
+
* code (functions, elements) as written and the values of the moment for the rest.
|
|
5
|
+
*
|
|
6
|
+
* @see `../storyCodeText.ts` for the text.
|
|
4
7
|
*
|
|
5
8
|
* @module
|
|
6
9
|
*/
|
|
7
|
-
import type { StoryFileCode } from "@forgebook/story-format/source";
|
|
8
10
|
import type { ReactNode } from "react";
|
|
9
|
-
import type
|
|
10
|
-
import type { PanelArgs } from "../messages.ts";
|
|
11
|
-
/** Which story's code, and the values its JSX is drawn from when it has no `render`. */
|
|
12
|
-
export type StoryCodeSource = {
|
|
13
|
-
/** The story file's code. */
|
|
14
|
-
readonly code: StoryFileCode;
|
|
15
|
-
/** The story's export name. */
|
|
16
|
-
readonly exportName: string;
|
|
17
|
-
/** The component's name as code writes it (`codeNameOf`), for the code of a story drawn from its args. */
|
|
18
|
-
readonly componentName: string;
|
|
19
|
-
/** The values of the moment: the story's args, with the panel's over them on the story page. */
|
|
20
|
-
readonly args: PanelArgs;
|
|
21
|
-
};
|
|
11
|
+
import { type StoryCodeSource } from "../storyCodeText.ts";
|
|
22
12
|
/**
|
|
23
|
-
*
|
|
13
|
+
* Whether the story has a `render` of its own, shown as written.
|
|
24
14
|
*
|
|
25
|
-
* @param source - the file's code
|
|
26
|
-
* @param write - the framework's code writer, for a story drawn from its args.
|
|
15
|
+
* @param source - the file's code and the story.
|
|
27
16
|
*/
|
|
28
|
-
export declare const
|
|
17
|
+
export declare const hasRenderCode: (source: StoryCodeSource) => boolean;
|
|
29
18
|
/**
|
|
30
19
|
* The story's code, coloured.
|
|
31
20
|
*
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { renderCodeOf, storyCodeText, writtenArgsOf } from "../storyCodeText.js";
|
|
2
3
|
import { Code } from "./Code.js";
|
|
3
4
|
import { useCodeWriter } from "./codeWriter.js";
|
|
4
5
|
/**
|
|
5
|
-
*
|
|
6
|
+
* Whether the story has a `render` of its own, shown as written.
|
|
6
7
|
*
|
|
7
|
-
* @param source - the file's code
|
|
8
|
-
* @param write - the framework's code writer, for a story drawn from its args.
|
|
8
|
+
* @param source - the file's code and the story.
|
|
9
9
|
*/
|
|
10
|
-
export const
|
|
10
|
+
export const hasRenderCode = (source) => renderCodeOf(source) !== undefined;
|
|
11
11
|
/**
|
|
12
12
|
* The story's code, coloured.
|
|
13
13
|
*
|
|
@@ -15,12 +15,13 @@ export const storyCodeText = ({ code, exportName, componentName, args }, write)
|
|
|
15
15
|
*/
|
|
16
16
|
export const StoryCodeBlock = (source) => {
|
|
17
17
|
const write = useCodeWriter();
|
|
18
|
-
const render = source
|
|
18
|
+
const render = renderCodeOf(source);
|
|
19
19
|
if (render !== undefined) {
|
|
20
20
|
// biome-ignore lint/style/useNamingConvention: React's own name for markup set as HTML
|
|
21
21
|
const markup = { __html: render.html };
|
|
22
22
|
return (_jsx("pre", { className: "forgebook-code-block", children: _jsx("code", { className: "forgebook-code", dangerouslySetInnerHTML: markup }) }));
|
|
23
23
|
}
|
|
24
24
|
// the attributes' names are names, not types: only the component's name is coloured as one
|
|
25
|
-
|
|
25
|
+
const names = [...Object.keys(source.args), ...Object.keys(writtenArgsOf(source))];
|
|
26
|
+
return (_jsx("pre", { className: "forgebook-code-block", children: _jsx(Code, { text: storyCodeText(source, write), names: names }) }));
|
|
26
27
|
};
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A switch offered as a gallery (`control: "gallery"`): a button naming the value shown, which opens a menu of the
|
|
3
|
+
* values with their previews.
|
|
4
|
+
*
|
|
5
|
+
* @remarks
|
|
6
|
+
* Only the button is on the first screen: the menu's code, its styles and the previews themselves load when it first
|
|
7
|
+
* opens (`SwitchGalleryPanel.tsx`), so a catalogue pays for its gallery only when a reader asks for it.
|
|
8
|
+
*
|
|
9
|
+
* @module
|
|
10
|
+
*/
|
|
11
|
+
import type { ReactNode } from "react";
|
|
12
|
+
import { type ViewSwitch } from "../switches.ts";
|
|
13
|
+
import type { SwitchPreviews } from "./SwitchGalleryPanel.tsx";
|
|
14
|
+
/** A gallery's props. */
|
|
15
|
+
export type SwitchGalleryProps = {
|
|
16
|
+
/** The switch. */
|
|
17
|
+
readonly each: ViewSwitch;
|
|
18
|
+
/** Whether it sits on the toolbar, after its name, or in a row of the View menu, whose row names it. */
|
|
19
|
+
readonly isOnBar: boolean;
|
|
20
|
+
/** The value shown. */
|
|
21
|
+
readonly value: string;
|
|
22
|
+
/** Called with the chosen value. */
|
|
23
|
+
readonly onValueChange: (value: string) => void;
|
|
24
|
+
/** Whether it is off. */
|
|
25
|
+
readonly isDisabled: boolean;
|
|
26
|
+
/** Why it is off, as its tooltip. */
|
|
27
|
+
readonly disabledNote: string | undefined;
|
|
28
|
+
/** Loads the catalogue's previews; none when it gives none. */
|
|
29
|
+
readonly loadPreviews: (() => Promise<SwitchPreviews>) | undefined;
|
|
30
|
+
};
|
|
31
|
+
/**
|
|
32
|
+
* A gallery's button, and its menu once open.
|
|
33
|
+
*
|
|
34
|
+
* @param props - the switch, the value shown and its setter.
|
|
35
|
+
*/
|
|
36
|
+
export declare const SwitchGallery: ({ each, isOnBar, value, onValueChange, isDisabled, disabledNote, loadPreviews }: SwitchGalleryProps) => ReactNode;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { switchValueOf } from "../switches.js";
|
|
3
|
+
import { Icon } from "./icons.js";
|
|
4
|
+
import { LazyView, lazyModule } from "./lazyModule.js";
|
|
5
|
+
import { usePopover } from "./usePopover.js";
|
|
6
|
+
/** The menu's module, loaded when a gallery first opens. */
|
|
7
|
+
const PANEL = lazyModule(() => import("./SwitchGalleryPanel.js").then((module) => module.SwitchGalleryPanel));
|
|
8
|
+
/**
|
|
9
|
+
* A gallery's button, and its menu once open.
|
|
10
|
+
*
|
|
11
|
+
* @param props - the switch, the value shown and its setter.
|
|
12
|
+
*/
|
|
13
|
+
export const SwitchGallery = ({ each, isOnBar, value, onValueChange, isDisabled, disabledNote, loadPreviews }) => {
|
|
14
|
+
const popover = usePopover();
|
|
15
|
+
const name = switchValueOf(each, value)?.label ?? value;
|
|
16
|
+
return (_jsxs("div", { className: "forgebook-toolbar__control", children: [isOnBar ? (_jsx("span", { className: "forgebook-toolbar__label", "aria-hidden": "true", children: each.label })) : null, _jsxs("button", { ref: popover.buttonRef, type: "button", className: "forgebook-button", "aria-label": `${each.label}: ${name}`, "aria-expanded": popover.isOpen, "aria-controls": popover.panelId, disabled: isDisabled, title: isDisabled ? disabledNote : undefined, onClick: (event) => popover.setIsOpen(!popover.isOpen, event), children: [_jsx("span", { className: "forgebook-gallery-names", children: each.values.map((option) => (_jsx("span", { "data-shown": option.value === value ? "" : undefined, children: option.label }, option.value))) }), _jsx(Icon, { name: "chevronDown", size: 12 })] }), popover.isDrawn ? (_jsx(LazyView, { module: PANEL, props: { each, value, onValueChange, popover, loadPreviews }, loading: null, failed: (message) => (_jsx("p", { className: "forgebook-problems", role: "alert", children: message })) })) : null] }));
|
|
17
|
+
};
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The menu of a gallery (`control: "gallery"`): each value of a switch with its preview, so a reader sees a look before
|
|
3
|
+
* applying it.
|
|
4
|
+
*
|
|
5
|
+
* @remarks
|
|
6
|
+
* Native radio buttons, as the shell's other menus: one tab stop, the arrow keys move and choose, and a screen reader
|
|
7
|
+
* reads the group and each value's label. The pictures are decoration beside that label, so they are hidden from it.
|
|
8
|
+
* Drawn in the top layer, positioned from its button: inside the View menu, whose rows scroll, it would be clipped.
|
|
9
|
+
* Loaded when a gallery first opens, with the previews (`SwitchGallery.tsx`): their pictures are fetched only then.
|
|
10
|
+
*
|
|
11
|
+
* @module
|
|
12
|
+
*/
|
|
13
|
+
import { type ReactNode } from "react";
|
|
14
|
+
import type { SwitchPreview, ViewSwitch } from "../switches.ts";
|
|
15
|
+
import "./switchGallery.scss";
|
|
16
|
+
import type { Popover } from "./usePopover.ts";
|
|
17
|
+
/** The catalogue's previews, by switch id then value: the plugin's module, with each picture's address. */
|
|
18
|
+
export type SwitchPreviews = Readonly<Record<string, Readonly<Record<string, SwitchPreview>>>>;
|
|
19
|
+
/** The menu's props. */
|
|
20
|
+
export type SwitchGalleryPanelProps = {
|
|
21
|
+
/** The switch. */
|
|
22
|
+
readonly each: ViewSwitch;
|
|
23
|
+
/** The value shown. */
|
|
24
|
+
readonly value: string;
|
|
25
|
+
/** Called with the chosen value. */
|
|
26
|
+
readonly onValueChange: (value: string) => void;
|
|
27
|
+
/** The button's popover, which opens and closes the menu. */
|
|
28
|
+
readonly popover: Popover;
|
|
29
|
+
/** Loads the catalogue's previews; none when it gives none. */
|
|
30
|
+
readonly loadPreviews: (() => Promise<SwitchPreviews>) | undefined;
|
|
31
|
+
};
|
|
32
|
+
/**
|
|
33
|
+
* The menu.
|
|
34
|
+
*
|
|
35
|
+
* @param props - the switch, the value shown and its setter, and the button's popover.
|
|
36
|
+
*/
|
|
37
|
+
export declare const SwitchGalleryPanel: ({ each, value, onValueChange, popover, loadPreviews }: SwitchGalleryPanelProps) => ReactNode;
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* The menu of a gallery (`control: "gallery"`): each value of a switch with its preview, so a reader sees a look before
|
|
4
|
+
* applying it.
|
|
5
|
+
*
|
|
6
|
+
* @remarks
|
|
7
|
+
* Native radio buttons, as the shell's other menus: one tab stop, the arrow keys move and choose, and a screen reader
|
|
8
|
+
* reads the group and each value's label. The pictures are decoration beside that label, so they are hidden from it.
|
|
9
|
+
* Drawn in the top layer, positioned from its button: inside the View menu, whose rows scroll, it would be clipped.
|
|
10
|
+
* Loaded when a gallery first opens, with the previews (`SwitchGallery.tsx`): their pictures are fetched only then.
|
|
11
|
+
*
|
|
12
|
+
* @module
|
|
13
|
+
*/
|
|
14
|
+
import { useEffect, useId, useLayoutEffect, useState } from "react";
|
|
15
|
+
import { galleryPlace } from "./galleryPlace.js";
|
|
16
|
+
import { Icon } from "./icons.js";
|
|
17
|
+
import "./switchGallery.css";
|
|
18
|
+
/**
|
|
19
|
+
* What a value shows: its picture, its colours and font, or, with no preview, its label's first letter, so it still
|
|
20
|
+
* has a place of its own in the grid.
|
|
21
|
+
*
|
|
22
|
+
* @param props - the value and its preview.
|
|
23
|
+
*/
|
|
24
|
+
const PreviewArt = ({ option, preview }) => {
|
|
25
|
+
const [isBroken, setIsBroken] = useState(false);
|
|
26
|
+
if (preview !== undefined && "image" in preview && !isBroken) {
|
|
27
|
+
return (_jsx("img", { className: "forgebook-gallery__image", src: preview.image, alt: "", decoding: "async", onError: (_event) => setIsBroken(true) }));
|
|
28
|
+
}
|
|
29
|
+
if (preview !== undefined && "swatches" in preview) {
|
|
30
|
+
return (_jsxs(_Fragment, { children: [_jsx("span", { className: "forgebook-gallery__swatches", children: preview.swatches.map((colour, index) => (_jsx("span", { style: { backgroundColor: colour } }, index))) }), preview.font === undefined ? null : (_jsx("span", { className: "forgebook-gallery__font", style: { fontFamily: `"${preview.font}", var(--forgebook-font-sans)` }, children: preview.font }))] }));
|
|
31
|
+
}
|
|
32
|
+
return _jsx("span", { className: "forgebook-gallery__letter", children: Array.from(option.label)[0] });
|
|
33
|
+
};
|
|
34
|
+
/**
|
|
35
|
+
* The menu.
|
|
36
|
+
*
|
|
37
|
+
* @param props - the switch, the value shown and its setter, and the button's popover.
|
|
38
|
+
*/
|
|
39
|
+
export const SwitchGalleryPanel = ({ each, value, onValueChange, popover, loadPreviews }) => {
|
|
40
|
+
const { panelRef, buttonRef, panelId, setIsOpen, closeAfterChoice } = popover;
|
|
41
|
+
const name = useId();
|
|
42
|
+
const [previews, setPreviews] = useState({});
|
|
43
|
+
useEffect(() => {
|
|
44
|
+
let isCurrent = true;
|
|
45
|
+
// without its previews the menu still works: every value then shows its letter
|
|
46
|
+
loadPreviews?.()
|
|
47
|
+
.then((loaded) => {
|
|
48
|
+
if (isCurrent)
|
|
49
|
+
setPreviews(loaded);
|
|
50
|
+
})
|
|
51
|
+
.catch(() => undefined);
|
|
52
|
+
return () => {
|
|
53
|
+
isCurrent = false;
|
|
54
|
+
};
|
|
55
|
+
}, [loadPreviews]);
|
|
56
|
+
// biome-ignore lint/correctness/useExhaustiveDependencies: both are refs, set once the panel is drawn
|
|
57
|
+
useLayoutEffect(() => {
|
|
58
|
+
const panel = panelRef.current;
|
|
59
|
+
const button = buttonRef.current;
|
|
60
|
+
if (panel === null || button === null)
|
|
61
|
+
return;
|
|
62
|
+
panel.showPopover();
|
|
63
|
+
const place = () => {
|
|
64
|
+
const { top, left } = galleryPlace(button.getBoundingClientRect(), panel.getBoundingClientRect(), {
|
|
65
|
+
width: window.innerWidth,
|
|
66
|
+
height: window.innerHeight
|
|
67
|
+
});
|
|
68
|
+
panel.style.top = `${top}px`;
|
|
69
|
+
panel.style.left = `${left}px`;
|
|
70
|
+
};
|
|
71
|
+
place();
|
|
72
|
+
// the first open arrives after its popover's own focus: the code was still loading
|
|
73
|
+
panel.querySelector("input:checked")?.focus();
|
|
74
|
+
window.addEventListener("resize", place);
|
|
75
|
+
return () => window.removeEventListener("resize", place);
|
|
76
|
+
}, []);
|
|
77
|
+
const closeWithKey = () => {
|
|
78
|
+
setIsOpen(false);
|
|
79
|
+
buttonRef.current?.focus();
|
|
80
|
+
};
|
|
81
|
+
// on the way down, wherever the focus is: this menu's alone, so a View menu around it stays open
|
|
82
|
+
// biome-ignore lint/correctness/useExhaustiveDependencies: both it calls read refs and the state's setter
|
|
83
|
+
useEffect(() => {
|
|
84
|
+
const onEscape = (event) => {
|
|
85
|
+
if (event.key !== "Escape")
|
|
86
|
+
return;
|
|
87
|
+
event.stopPropagation();
|
|
88
|
+
closeWithKey();
|
|
89
|
+
};
|
|
90
|
+
document.addEventListener("keydown", onEscape, { capture: true });
|
|
91
|
+
return () => document.removeEventListener("keydown", onEscape, { capture: true });
|
|
92
|
+
}, []);
|
|
93
|
+
return (_jsx("div", { ref: panelRef, id: panelId, className: "forgebook-gallery", popover: "manual", role: "dialog", "aria-label": each.label, onKeyDown: (event) => {
|
|
94
|
+
if (event.key === "Enter")
|
|
95
|
+
closeWithKey();
|
|
96
|
+
}, children: _jsxs("fieldset", { className: "forgebook-gallery__grid", children: [_jsx("legend", { className: "forgebook-visually-hidden", children: each.label }), each.values.map((option) => (_jsxs("label", { className: "forgebook-gallery__item", children: [_jsx("input", { type: "radio", className: "forgebook-visually-hidden", name: name, checked: option.value === value, onChange: () => onValueChange(option.value),
|
|
97
|
+
// on the click, so a press on the value already shown closes the menu too
|
|
98
|
+
onClick: closeAfterChoice }), _jsx("span", { className: "forgebook-gallery__preview", "aria-hidden": "true", children: _jsx(PreviewArt, { option: option, preview: previews[each.id]?.[option.value] }) }), _jsxs("span", { className: "forgebook-gallery__name", children: [option.value === value ? _jsx(Icon, { name: "check", size: 12 }) : null, option.label] })] }, option.value)))] }) }));
|
|
99
|
+
};
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The sidebar's tag filter: a button beside the search, with how many tags are on, which opens the catalogue's tags to
|
|
3
|
+
* ask for or to leave out, a status shown as its badge. Loaded only for a catalogue whose stories have tags.
|
|
4
|
+
*
|
|
5
|
+
* @module
|
|
6
|
+
*/
|
|
7
|
+
import { type ReactNode } from "react";
|
|
8
|
+
import type { StoryTree } from "../storyTree.ts";
|
|
9
|
+
import "./tagFilter.scss";
|
|
10
|
+
/** The filter's props. */
|
|
11
|
+
export type TagFilterProps = {
|
|
12
|
+
/** The whole tree, whose tags it offers. */
|
|
13
|
+
readonly tree: StoryTree;
|
|
14
|
+
/** The tags on, each `name` or `!name`. */
|
|
15
|
+
readonly tags: readonly string[];
|
|
16
|
+
/** Called with the tags on, when they change. */
|
|
17
|
+
readonly onTagsChange: (tags: readonly string[]) => void;
|
|
18
|
+
};
|
|
19
|
+
/**
|
|
20
|
+
* The tag filter.
|
|
21
|
+
*
|
|
22
|
+
* @param props - the tree, the tags on and how to change them.
|
|
23
|
+
*/
|
|
24
|
+
export declare const TagFilter: ({ tree, tags, onTagsChange }: TagFilterProps) => ReactNode;
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* The sidebar's tag filter: a button beside the search, with how many tags are on, which opens the catalogue's tags to
|
|
4
|
+
* ask for or to leave out, a status shown as its badge. Loaded only for a catalogue whose stories have tags.
|
|
5
|
+
*
|
|
6
|
+
* @module
|
|
7
|
+
*/
|
|
8
|
+
import { useEffect, useMemo } from "react";
|
|
9
|
+
import { catalogueTags, taggedTree } from "../storyTags.js";
|
|
10
|
+
import { StatusBadge, useStatuses } from "./StatusBadges.js";
|
|
11
|
+
import "./tagFilter.css";
|
|
12
|
+
import { textsOfGroup } from "./strings.js";
|
|
13
|
+
import { loadedTagFilter } from "./useListedTree.js";
|
|
14
|
+
import { usePopover } from "./usePopover.js";
|
|
15
|
+
/** The filter's texts, as shown: Forgebook's, with the catalogue's replacements. */
|
|
16
|
+
const TAG_STRINGS = textsOfGroup("tagFilter", {
|
|
17
|
+
button: "Filter by tag",
|
|
18
|
+
buttonOn: (count) => `Filter by tag: ${count} on`,
|
|
19
|
+
title: "Tags",
|
|
20
|
+
leaveOut: (tag) => `Leave out ${tag}`,
|
|
21
|
+
clear: "Clear the filter"
|
|
22
|
+
});
|
|
23
|
+
/**
|
|
24
|
+
* The tag filter.
|
|
25
|
+
*
|
|
26
|
+
* @param props - the tree, the tags on and how to change them.
|
|
27
|
+
*/
|
|
28
|
+
export const TagFilter = ({ tree, tags, onTagsChange }) => {
|
|
29
|
+
const { isOpen, isDrawn, setIsOpen, buttonRef, panelRef, panelId } = usePopover();
|
|
30
|
+
// the filter's code came with this chunk: handed over, a checked tag filters the tree in the render that adds it
|
|
31
|
+
useEffect(() => {
|
|
32
|
+
loadedTagFilter.current = taggedTree;
|
|
33
|
+
}, []);
|
|
34
|
+
const offered = useMemo(() => catalogueTags(tree), [tree]);
|
|
35
|
+
const statuses = useStatuses();
|
|
36
|
+
const set = (tag, written) => onTagsChange([
|
|
37
|
+
...tags.filter((each) => each !== tag && each !== `!${tag}`),
|
|
38
|
+
...(written === undefined ? [] : [written])
|
|
39
|
+
]);
|
|
40
|
+
const label = tags.length === 0 ? TAG_STRINGS.button : TAG_STRINGS.buttonOn(tags.length);
|
|
41
|
+
return (_jsxs("div", { className: "forgebook-tag-filter", children: [_jsxs("button", { ref: buttonRef, type: "button", className: "forgebook-icon-button", title: label, "aria-label": label, "aria-expanded": isOpen, "aria-controls": panelId, "data-on": tags.length > 0 ? "" : undefined, onClick: (event) => setIsOpen(!isOpen, event), children: [_jsx("svg", { viewBox: "0 0 16 16", width: 14, height: 14, "aria-hidden": "true", children: _jsx("path", { d: "M2 4h12M4.5 8h7M7 12h2", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round" }) }), tags.length === 0 ? null : _jsx("span", { className: "forgebook-tag-filter__count", children: tags.length })] }), isDrawn ? (_jsxs("div", { ref: panelRef, id: panelId, className: "forgebook-popover forgebook-tag-filter__panel", role: "dialog", "aria-label": TAG_STRINGS.title, children: [_jsx("ul", { className: "forgebook-tag-filter__list", children: offered.map(({ tag, stories }) => {
|
|
42
|
+
const status = statuses.find((each) => each.id === tag);
|
|
43
|
+
return (_jsxs("li", { className: "forgebook-tag-filter__row", children: [_jsxs("label", { className: "forgebook-tag-filter__tag", children: [_jsx("input", { type: "checkbox", checked: tags.includes(tag), onChange: (event) => set(tag, event.target.checked ? tag : undefined) }), _jsx("span", { className: "forgebook-tag-filter__name", children: status === undefined ? tag : _jsx(StatusBadge, { status: status }) }), _jsx("span", { className: "forgebook-tree__count", children: stories })] }), _jsx("button", { type: "button", className: "forgebook-icon-button", title: TAG_STRINGS.leaveOut(tag), "aria-label": TAG_STRINGS.leaveOut(tag), "aria-pressed": tags.includes(`!${tag}`), onClick: () => set(tag, tags.includes(`!${tag}`) ? undefined : `!${tag}`), children: _jsxs("svg", { viewBox: "0 0 16 16", width: 12, height: 12, "aria-hidden": "true", children: [_jsx("circle", { cx: "8", cy: "8", r: "5.5", fill: "none", stroke: "currentColor", strokeWidth: "1.5" }), _jsx("path", { d: "m4 12 8-8", stroke: "currentColor", strokeWidth: "1.5" })] }) })] }, tag));
|
|
44
|
+
}) }), _jsx("button", { type: "button", className: "forgebook-button forgebook-button--quiet", disabled: tags.length === 0, onClick: () => onTagsChange([]), children: TAG_STRINGS.clear })] })) : null] }));
|
|
45
|
+
};
|