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
|
@@ -7,6 +7,8 @@
|
|
|
7
7
|
import { type ReactNode } from "react";
|
|
8
8
|
import { type PanelProp } from "../argTypes.ts";
|
|
9
9
|
import { type ArgValue } from "../messages.ts";
|
|
10
|
+
import type { NamedValues } from "../namedValues.ts";
|
|
11
|
+
import type { ArgControlLoaders } from "./customControls.ts";
|
|
10
12
|
import { type OnValueChange } from "./PropFields.tsx";
|
|
11
13
|
/** A prop the story gives a text by its key (`storyText("key")`): the key, and whether the panel wrote over it. */
|
|
12
14
|
export type TextArgNote = {
|
|
@@ -15,24 +17,43 @@ export type TextArgNote = {
|
|
|
15
17
|
/** Whether the panel holds a value of its own for the prop. */
|
|
16
18
|
readonly isChanged: boolean;
|
|
17
19
|
};
|
|
20
|
+
/** What a field says of its value, and the two ways back from it. */
|
|
21
|
+
export type FieldState = {
|
|
22
|
+
/** The value shown: the story's own, or the panel's over it. */
|
|
23
|
+
readonly value: ArgValue | undefined;
|
|
24
|
+
/** The panel's own value; none when the story's own is shown. */
|
|
25
|
+
readonly panelValue: ArgValue | undefined;
|
|
26
|
+
/** Called with a changed value. */
|
|
27
|
+
readonly onValueChange: OnValueChange;
|
|
28
|
+
};
|
|
18
29
|
/** One adjustable prop with its control. */
|
|
19
|
-
export declare const PropControl: ({ prop, showsGroup, value, named, textArg, onValueChange }: {
|
|
30
|
+
export declare const PropControl: ({ prop, showsGroup, value, panelValue, named, namedValues, loadTokens, argControls, textArg, onValueChange }: {
|
|
20
31
|
readonly prop: PanelProp;
|
|
21
32
|
/** Whether it names its group: in the "Required" group. */
|
|
22
33
|
readonly showsGroup: boolean;
|
|
23
34
|
readonly value: ArgValue | undefined;
|
|
35
|
+
/** The panel's own value; none when the story's own is shown. */
|
|
36
|
+
readonly panelValue: ArgValue | undefined;
|
|
24
37
|
/** The values the source names for the prop's type, when it names some. */
|
|
25
38
|
readonly named: Readonly<Record<string, unknown>> | undefined;
|
|
39
|
+
/** The source's named values, for the parts of a value they fill. */
|
|
40
|
+
readonly namedValues: NamedValues;
|
|
41
|
+
/** Loads the catalogue's design tokens; none when it has none. */
|
|
42
|
+
readonly loadTokens: (() => Promise<unknown>) | undefined;
|
|
43
|
+
/** Loads each custom control the catalogue registers, by name; none when it registers none. */
|
|
44
|
+
readonly argControls?: ArgControlLoaders | undefined;
|
|
26
45
|
/** Where the story's text for the prop comes from, when the story names one by its key. */
|
|
27
46
|
readonly textArg: TextArgNote | undefined;
|
|
28
47
|
readonly onValueChange: OnValueChange;
|
|
29
48
|
}) => ReactNode;
|
|
30
49
|
/** A toggle: its name in a compact checkbox, its description as the tooltip and for screen readers. */
|
|
31
|
-
export declare const Toggle: ({ prop, showsGroup, value, onValueChange }: {
|
|
50
|
+
export declare const Toggle: ({ prop, showsGroup, value, panelValue, onValueChange }: {
|
|
32
51
|
readonly prop: PanelProp;
|
|
33
52
|
/** Whether it names its group: in the "Required" group. */
|
|
34
53
|
readonly showsGroup: boolean;
|
|
35
54
|
readonly value: ArgValue | undefined;
|
|
55
|
+
/** The panel's own value; none when the story's own is shown. */
|
|
56
|
+
readonly panelValue: ArgValue | undefined;
|
|
36
57
|
readonly onValueChange: OnValueChange;
|
|
37
58
|
}) => ReactNode;
|
|
38
59
|
/** A prop the panel cannot set: its name, its type and its description, for reading; its group when asked. */
|
|
@@ -7,19 +7,41 @@ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-run
|
|
|
7
7
|
*/
|
|
8
8
|
import { useId } from "react";
|
|
9
9
|
import { isColorProp } from "../argTypes.js";
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
10
|
+
import { isUnsetArg, UNSET_ARG } from "../messages.js";
|
|
11
|
+
import { Icon } from "./icons.js";
|
|
12
|
+
import { LazyView, lazyModule } from "./lazyModule.js";
|
|
13
|
+
import { ChoiceControl, MOST_PLAIN_OPTIONS, NumberField, textOf } from "./PropFields.js";
|
|
12
14
|
import { STRINGS } from "./strings.js";
|
|
15
|
+
/** The editors a catalogue's plain props never load: nested fields, a searchable list, the tokens, the files. */
|
|
16
|
+
const PROP_EDITOR = lazyModule(() => import("./valueEditors/PropEditor.js").then((module) => module.PropEditor));
|
|
13
17
|
/** A CSS colour as the colour picker takes it (`#rrggbb`), or black when the value is not one. */
|
|
14
18
|
const pickerColor = (value) => typeof value === "string" && /^#[0-9a-f]{6}$/i.test(value) ? value : "#000000";
|
|
15
19
|
/** A prop's group, beside its name in the "Required" group, which gathers props of every group. */
|
|
16
20
|
const GroupName = ({ prop, showsGroup }) => showsGroup && prop.group !== undefined ? _jsx("span", { className: "forgebook-prop__group", children: prop.group }) : null;
|
|
17
21
|
/**
|
|
18
|
-
*
|
|
22
|
+
* The way back from a prop's value: to no value at all, and to the story's own, each offered only when it changes
|
|
23
|
+
* something.
|
|
19
24
|
*
|
|
20
|
-
* @param props - the prop
|
|
25
|
+
* @param props - the prop and its state.
|
|
21
26
|
*/
|
|
22
|
-
const
|
|
27
|
+
const FieldActions = ({ prop, value, panelValue, onValueChange }) => {
|
|
28
|
+
const label = prop.label ?? prop.name;
|
|
29
|
+
const action = (text, icon, next) => (_jsx("button", { type: "button", className: "forgebook-prop__action", "aria-label": text, title: text, onClick: () => onValueChange(prop.name, next), children: _jsx(Icon, { name: icon, size: 12 }) }));
|
|
30
|
+
return (_jsxs("span", { className: "forgebook-prop__actions", children: [value === undefined ? null : action(STRINGS.unsetProp(label), "noValue", UNSET_ARG), panelValue === undefined ? null : action(STRINGS.resetProp(label), "replay", undefined)] }));
|
|
31
|
+
};
|
|
32
|
+
/** What a prop's value is when its field alone cannot say: no value over the story's own, or an empty text. */
|
|
33
|
+
const stateNote = (state) => {
|
|
34
|
+
if (isUnsetArg(state.panelValue))
|
|
35
|
+
return STRINGS.stateUnset;
|
|
36
|
+
return state.value === "" ? STRINGS.stateEmpty : undefined;
|
|
37
|
+
};
|
|
38
|
+
/**
|
|
39
|
+
* A prop's name, whether it is required, its group when asked, its type (whole in the tooltip when it is cut), what its
|
|
40
|
+
* value is and the ways back from it.
|
|
41
|
+
*
|
|
42
|
+
* @param props - the prop, whether it names its group, and its state.
|
|
43
|
+
*/
|
|
44
|
+
const PropHead = ({ prop, showsGroup, state }) => (_jsxs("div", { className: "forgebook-prop__head", children: [_jsxs("code", { className: "forgebook-prop__name", children: [prop.label ?? prop.name, prop.isRequired ? (_jsx("span", { className: "forgebook-prop__required", title: STRINGS.required, children: "*" })) : null] }), _jsx(GroupName, { prop: prop, showsGroup: showsGroup }), _jsx("code", { className: "forgebook-prop__type", title: prop.type, children: prop.type }), state === undefined ? null : (_jsxs(_Fragment, { children: [stateNote(state) === undefined ? null : (_jsx("span", { className: "forgebook-prop__state", children: stateNote(state) })), _jsx(FieldActions, { prop: prop, ...state })] }))] }));
|
|
23
45
|
/** A prop's description and default, under its control. */
|
|
24
46
|
const PropNote = ({ id, prop }) => prop.description === "" && prop.defaultValue === undefined ? null : (_jsxs("p", { id: id, className: "forgebook-prop__description", children: [prop.description, prop.defaultValue === undefined ? null : (_jsxs(_Fragment, { children: [prop.description === "" ? null : " ", STRINGS.defaultIs, " ", _jsx("code", { children: prop.defaultValue })] }))] }));
|
|
25
47
|
/**
|
|
@@ -29,32 +51,49 @@ const PropNote = ({ id, prop }) => prop.description === "" && prop.defaultValue
|
|
|
29
51
|
* @param props - the note, the prop's name and the value setter.
|
|
30
52
|
*/
|
|
31
53
|
const TextArgLine = ({ note, name, onValueChange }) => (_jsxs("p", { className: "forgebook-prop__text-arg", children: [STRINGS.fromTexts, " ", _jsx("code", { children: note.key }), note.isChanged ? (_jsx("button", { type: "button", className: "forgebook-text-button", onClick: () => onValueChange(name, undefined), children: STRINGS.backToText })) : null] }));
|
|
54
|
+
/** Whether a prop is drawn by the editors that load on use, not by the first screen's fields. */
|
|
55
|
+
const usesEditors = (prop, named) => named !== undefined ||
|
|
56
|
+
prop.shape !== undefined ||
|
|
57
|
+
prop.customControl !== undefined ||
|
|
58
|
+
prop.control === "token" ||
|
|
59
|
+
prop.control === "file" ||
|
|
60
|
+
(prop.kind === "choice" &&
|
|
61
|
+
(prop.control === undefined || prop.control === "select") &&
|
|
62
|
+
(prop.choices?.length ?? 0) > MOST_PLAIN_OPTIONS);
|
|
32
63
|
/** One adjustable prop with its control. */
|
|
33
|
-
export const PropControl = ({ prop, showsGroup, value, named, textArg, onValueChange }) => {
|
|
64
|
+
export const PropControl = ({ prop, showsGroup, value, panelValue, named, namedValues, loadTokens, argControls, textArg, onValueChange }) => {
|
|
34
65
|
// the description is shown under the control and named by it, so the control's name is the prop alone
|
|
35
66
|
const descriptionId = useId();
|
|
36
67
|
const label = prop.label ?? prop.name;
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
68
|
+
const state = { value, panelValue, onValueChange };
|
|
69
|
+
if (usesEditors(prop, named)) {
|
|
70
|
+
const editorProps = {
|
|
71
|
+
prop,
|
|
72
|
+
value,
|
|
73
|
+
descriptionId,
|
|
74
|
+
namedValues,
|
|
75
|
+
loadTokens,
|
|
76
|
+
argControls,
|
|
77
|
+
onValueChange
|
|
78
|
+
};
|
|
79
|
+
const isWide = (prop.shape !== undefined || prop.customControl !== undefined) && named === undefined;
|
|
80
|
+
return (_jsxs("div", { className: "forgebook-prop", "data-wide": isWide || undefined, children: [_jsx(PropHead, { prop: prop, showsGroup: showsGroup, state: state }), _jsx(LazyView, { module: PROP_EDITOR, props: editorProps, loading: null, failed: (message) => (_jsx("p", { className: "forgebook-prop__description", role: "alert", children: message })) }), _jsx(PropNote, { id: descriptionId, prop: prop })] }));
|
|
42
81
|
}
|
|
43
82
|
if (prop.kind === "choice") {
|
|
44
|
-
return (_jsxs("div", { className: "forgebook-prop", children: [_jsx(PropHead, { prop: prop, showsGroup: showsGroup }), _jsx(ChoiceControl, { prop: prop, value: value, descriptionId: descriptionId, onValueChange: onValueChange }), _jsx(PropNote, { id: descriptionId, prop: prop })] }));
|
|
83
|
+
return (_jsxs("div", { className: "forgebook-prop", children: [_jsx(PropHead, { prop: prop, showsGroup: showsGroup, state: state }), _jsx(ChoiceControl, { prop: prop, value: value, descriptionId: descriptionId, onValueChange: onValueChange }), _jsx(PropNote, { id: descriptionId, prop: prop })] }));
|
|
45
84
|
}
|
|
46
85
|
if (prop.kind === "number") {
|
|
47
|
-
return (_jsxs("div", { className: "forgebook-prop", children: [_jsx(PropHead, { prop: prop, showsGroup: showsGroup }), _jsx("div", { className: "forgebook-prop__field", children: _jsx(NumberField, { prop: prop, value: value, descriptionId: descriptionId, onValueChange: onValueChange }) }), _jsx(PropNote, { id: descriptionId, prop: prop })] }));
|
|
86
|
+
return (_jsxs("div", { className: "forgebook-prop", children: [_jsx(PropHead, { prop: prop, showsGroup: showsGroup, state: state }), _jsx("div", { className: "forgebook-prop__field", children: _jsx(NumberField, { prop: prop, value: value, descriptionId: descriptionId, onValueChange: onValueChange }) }), _jsx(PropNote, { id: descriptionId, prop: prop })] }));
|
|
48
87
|
}
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
88
|
+
// a text with a line break keeps it: an `<input>` would drop it, from the field and from the link
|
|
89
|
+
const isMultiline = prop.control === "textarea" || (typeof value === "string" && value.includes("\n"));
|
|
90
|
+
const TextControl = isMultiline ? "textarea" : "input";
|
|
91
|
+
return (_jsxs("div", { className: "forgebook-prop", children: [_jsx(PropHead, { prop: prop, showsGroup: showsGroup, state: state }), _jsxs("div", { className: "forgebook-prop__field", children: [_jsx(TextControl, { "aria-label": label, "aria-describedby": descriptionId, ...(isMultiline ? { rows: 4 } : { type: "text" }), value: textOf(value), onChange: (event) => onValueChange(prop.name, event.target.value) }), isColorProp(prop) ? (_jsx("input", { type: "color", className: "forgebook-prop__color", "aria-label": STRINGS.pickColor(label), value: pickerColor(value), onChange: (event) => onValueChange(prop.name, event.target.value) })) : null] }), textArg === undefined ? null : (_jsx(TextArgLine, { note: textArg, name: prop.name, onValueChange: onValueChange })), _jsx(PropNote, { id: descriptionId, prop: prop })] }));
|
|
53
92
|
};
|
|
54
93
|
/** A toggle: its name in a compact checkbox, its description as the tooltip and for screen readers. */
|
|
55
|
-
export const Toggle = ({ prop, showsGroup, value, onValueChange }) => {
|
|
94
|
+
export const Toggle = ({ prop, showsGroup, value, panelValue, onValueChange }) => {
|
|
56
95
|
const descriptionId = useId();
|
|
57
|
-
return (_jsxs("label", { className: "forgebook-toggle", title: prop.description, children: [_jsx("input", { type: "checkbox", "aria-label": prop.label ?? prop.name, checked: value === true, "aria-describedby": descriptionId, onChange: (event) => onValueChange(prop.name, event.target.checked) }), _jsx("code", { children: prop.label ?? prop.name }), _jsx(GroupName, { prop: prop, showsGroup: showsGroup }), _jsx("span", { id: descriptionId, className: "forgebook-visually-hidden", children: prop.description })] }));
|
|
96
|
+
return (_jsxs("span", { className: "forgebook-toggle-row", children: [_jsxs("label", { className: "forgebook-toggle", title: prop.description, children: [_jsx("input", { type: "checkbox", "aria-label": prop.label ?? prop.name, checked: value === true, "aria-describedby": descriptionId, onChange: (event) => onValueChange(prop.name, event.target.checked) }), _jsx("code", { children: prop.label ?? prop.name }), _jsx(GroupName, { prop: prop, showsGroup: showsGroup }), _jsx("span", { id: descriptionId, className: "forgebook-visually-hidden", children: prop.description })] }), isUnsetArg(panelValue) ? _jsx("span", { className: "forgebook-prop__state", children: STRINGS.stateUnset }) : null, _jsx(FieldActions, { prop: prop, value: value, panelValue: panelValue, onValueChange: onValueChange })] }));
|
|
58
97
|
};
|
|
59
98
|
/** A prop the panel cannot set: its name, its type and its description, for reading; its group when asked. */
|
|
60
99
|
export const ReadOnlyProp = ({ prop, showsGroup }) => (_jsxs("div", { className: "forgebook-prop", children: [_jsx(PropHead, { prop: prop, showsGroup: showsGroup }), _jsx("p", { className: "forgebook-prop__description", children: prop.description })] }));
|
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* The panel's Props tab: the props the story lets the panel set,
|
|
3
|
-
*
|
|
2
|
+
* The panel's Props tab: the props the story lets the panel set, in the order the source declares them whatever their
|
|
3
|
+
* control, each with its description and default, then the props it cannot set. A story of fixed examples sets none:
|
|
4
4
|
* the tab says so and lists every prop for reading. The props come with the story's `argTypes` laid over them
|
|
5
5
|
* (`argTypes.ts`): a control they name (a list, buttons, checkboxes, a range, a colour, a date) wins over the one
|
|
6
6
|
* the prop's type gives.
|
|
7
7
|
*
|
|
8
8
|
* @remarks
|
|
9
9
|
* Props whose TSDoc names a group (`@group Selection`) are listed under its name after the others, as the API reference
|
|
10
|
-
* lists them (`propGroups.ts`): each group's controls,
|
|
10
|
+
* lists them (`propGroups.ts`): each group's controls, then its props the panel cannot set. Each starts
|
|
11
11
|
* open, and a reader may fold it away. A component whose props name no group shows the tab as it always was.
|
|
12
12
|
*
|
|
13
|
-
* The required props come first among
|
|
13
|
+
* The required props come first among the others and in each group, or in one "Required" group before the
|
|
14
14
|
* others, each naming its group, as the story, its component, the catalogue and the reader's switch at the top of the
|
|
15
15
|
* tab say (`useRequiredFirst.ts`).
|
|
16
16
|
*
|
|
@@ -22,6 +22,7 @@ import type { ReactNode } from "react";
|
|
|
22
22
|
import { type PanelProp } from "../argTypes.ts";
|
|
23
23
|
import type { ArgValue, PanelArgs } from "../messages.ts";
|
|
24
24
|
import type { NamedValues } from "../namedValues.ts";
|
|
25
|
+
import type { ArgControlLoaders } from "./customControls.ts";
|
|
25
26
|
import { type TextArgNote } from "./PropRows.tsx";
|
|
26
27
|
import type { WorstCaseState } from "./worstArgs.ts";
|
|
27
28
|
/** The tab's props. */
|
|
@@ -30,6 +31,12 @@ export type PropsTabProps = {
|
|
|
30
31
|
readonly props: readonly PanelProp[];
|
|
31
32
|
/** The values shown: the story's args with the panel's changes. */
|
|
32
33
|
readonly values: PanelArgs;
|
|
34
|
+
/** The panel's own values, for what can go back to the story's. */
|
|
35
|
+
readonly panelArgs: PanelArgs;
|
|
36
|
+
/** Loads the catalogue's design tokens; none when it has none. */
|
|
37
|
+
readonly loadTokens?: (() => Promise<unknown>) | undefined;
|
|
38
|
+
/** Loads each custom control the catalogue registers, by name; none when it registers none. */
|
|
39
|
+
readonly argControls?: ArgControlLoaders | undefined;
|
|
33
40
|
/** The props the story lets the panel set. */
|
|
34
41
|
readonly controls: StoryControlsSetting;
|
|
35
42
|
/** Called with a changed value; `undefined` removes the panel's value. */
|
|
@@ -58,4 +65,4 @@ export type PropsTabProps = {
|
|
|
58
65
|
*
|
|
59
66
|
* @param props - the props, the values, which props the story lets the panel set, and the setters.
|
|
60
67
|
*/
|
|
61
|
-
export declare const PropsTab: ({ props, values, controls, onValueChange, onReset, worstCase, namedValues, textArgs, componentGroups, requiredFirst }: PropsTabProps) => ReactNode;
|
|
68
|
+
export declare const PropsTab: ({ props, values, panelArgs, loadTokens, argControls, controls, onValueChange, onReset, worstCase, namedValues, textArgs, componentGroups, requiredFirst }: PropsTabProps) => ReactNode;
|
|
@@ -12,16 +12,15 @@ const NO_TEXT_ARGS = {};
|
|
|
12
12
|
/** No group named first. */
|
|
13
13
|
const NO_GROUPS = [];
|
|
14
14
|
/**
|
|
15
|
-
* A group the props' TSDoc names, under its name: its controls in the order of the props,
|
|
16
|
-
*
|
|
15
|
+
* A group the props' TSDoc names, under its name: its controls in the order of the props, then the props the panel
|
|
16
|
+
* cannot set. The "Required" group is drawn as one, each of its props naming its own group.
|
|
17
17
|
*
|
|
18
18
|
* @param props - the group's name and props, how each prop is drawn, and whether it is the "Required" group.
|
|
19
19
|
*/
|
|
20
|
-
const NamedGroup = ({ name, props, isSettable,
|
|
21
|
-
const
|
|
22
|
-
const toggles = props.filter((prop) => isSettable(prop) && prop.kind === "toggle");
|
|
20
|
+
const NamedGroup = ({ name, props, isSettable, field, isRequired = false }) => {
|
|
21
|
+
const settable = props.filter(isSettable);
|
|
23
22
|
const others = props.filter((prop) => !isSettable(prop));
|
|
24
|
-
return (_jsx("div", { className: "forgebook-prop-group", "data-required": isRequired || undefined, children: _jsxs("details", { className: "forgebook-fold", open: true, children: [_jsxs("summary", { className: "forgebook-fold__summary forgebook-prop-group__title", children: [_jsx(Icon, { name: "chevronRight", size: 12 }), _jsx("h3", { className: "forgebook-fold__name", children: name }), _jsx("span", { className: "forgebook-fold__count", children: STRINGS.propCount(props.length) })] }), _jsxs("div", { className: "forgebook-prop-group__body", children: [
|
|
23
|
+
return (_jsx("div", { className: "forgebook-prop-group", "data-required": isRequired || undefined, children: _jsxs("details", { className: "forgebook-fold", open: true, children: [_jsxs("summary", { className: "forgebook-fold__summary forgebook-prop-group__title", children: [_jsx(Icon, { name: "chevronRight", size: 12 }), _jsx("h3", { className: "forgebook-fold__name", children: name }), _jsx("span", { className: "forgebook-fold__count", children: STRINGS.propCount(props.length) })] }), _jsxs("div", { className: "forgebook-prop-group__body", children: [settable.length === 0 ? null : (_jsx("div", { className: "forgebook-prop-grid", children: settable.map((prop) => field(prop, isRequired)) })), others.length === 0 ? null : (_jsx("div", { className: "forgebook-prop-grid", children: others.map((prop) => (_jsx(ReadOnlyProp, { prop: prop, showsGroup: isRequired }, prop.name))) }))] })] }) }));
|
|
25
24
|
};
|
|
26
25
|
/**
|
|
27
26
|
* The worst case's button, and once it is on, how many elements spill (the frame outlines them).
|
|
@@ -34,7 +33,7 @@ const WorstCaseControl = ({ worstCase }) => (_jsxs(_Fragment, { children: [_jsx(
|
|
|
34
33
|
*
|
|
35
34
|
* @param props - the props, the values, which props the story lets the panel set, and the setters.
|
|
36
35
|
*/
|
|
37
|
-
export const PropsTab = ({ props, values, controls, onValueChange, onReset, worstCase, namedValues = {}, textArgs = NO_TEXT_ARGS, componentGroups = NO_GROUPS, requiredFirst }) => {
|
|
36
|
+
export const PropsTab = ({ props, values, panelArgs, loadTokens, argControls, controls, onValueChange, onReset, worstCase, namedValues = {}, textArgs = NO_TEXT_ARGS, componentGroups = NO_GROUPS, requiredFirst }) => {
|
|
38
37
|
const catalogue = useCatalogue();
|
|
39
38
|
const ordering = useRequiredFirst(requiredFirst);
|
|
40
39
|
const isNamed = (prop) => isNamedProp(prop, namedValues);
|
|
@@ -45,20 +44,9 @@ export const PropsTab = ({ props, values, controls, onValueChange, onReset, wors
|
|
|
45
44
|
// the props that name no group are drawn as the tab always drew them, by control, in the layout's order
|
|
46
45
|
const ungrouped = propGroups.find((group) => group.name === undefined)?.props ?? [];
|
|
47
46
|
const settable = ungrouped.filter(isSettable);
|
|
48
|
-
const control = (prop, showsGroup) => (_jsx(PropControl, { prop: prop, showsGroup: showsGroup, value: values[prop.name], named: isNamed(prop) ? namedValues[prop.type] : undefined, textArg: textArgs[prop.name], onValueChange: onValueChange }, prop.name));
|
|
49
|
-
const
|
|
50
|
-
const groups = [
|
|
51
|
-
{
|
|
52
|
-
title: STRINGS.propGroups.choice,
|
|
53
|
-
props: settable.filter((prop) => prop.kind === "choice" || isNamed(prop))
|
|
54
|
-
},
|
|
55
|
-
{
|
|
56
|
-
title: STRINGS.propGroups.text,
|
|
57
|
-
props: settable.filter((prop) => ["text", "number", "other"].includes(prop.kind) && !isNamed(prop))
|
|
58
|
-
}
|
|
59
|
-
].filter((group) => group.props.length > 0);
|
|
60
|
-
const toggles = settable.filter((prop) => prop.kind === "toggle");
|
|
47
|
+
const control = (prop, showsGroup) => (_jsx(PropControl, { prop: prop, showsGroup: showsGroup, value: values[prop.name], panelValue: panelArgs[prop.name], named: isNamed(prop) ? namedValues[prop.type] : undefined, namedValues: namedValues, loadTokens: loadTokens, argControls: argControls, textArg: textArgs[prop.name], onValueChange: onValueChange }, prop.name));
|
|
48
|
+
const field = (prop, showsGroup) => prop.kind === "toggle" ? (_jsx(Toggle, { prop: prop, showsGroup: showsGroup, value: values[prop.name], panelValue: panelArgs[prop.name], onValueChange: onValueChange }, prop.name)) : (control(prop, showsGroup));
|
|
61
49
|
const others = ungrouped.filter((prop) => !isSettable(prop));
|
|
62
50
|
const hasControls = controls === "all" || controls.length > 0;
|
|
63
|
-
return (_jsxs("div", { className: "forgebook-tab-props", children: [canOrderRequired(listed) ? (_jsx("div", { className: "forgebook-tab-head", children: _jsx(RequiredFirstSwitch, { state: ordering }) })) : null, hasControls ? null : _jsx("p", { className: "forgebook-tab-note", children: STRINGS.fixedExamples }), required.length === 0 ? null : (_jsx(NamedGroup, { name: STRINGS.required, props: required, isSettable: isSettable,
|
|
51
|
+
return (_jsxs("div", { className: "forgebook-tab-props", children: [canOrderRequired(listed) ? (_jsx("div", { className: "forgebook-tab-head", children: _jsx(RequiredFirstSwitch, { state: ordering }) })) : null, hasControls ? null : _jsx("p", { className: "forgebook-tab-note", children: STRINGS.fixedExamples }), required.length === 0 ? null : (_jsx(NamedGroup, { name: STRINGS.required, props: required, isSettable: isSettable, field: field, isRequired: true })), settable.length === 0 ? null : (_jsx("div", { className: "forgebook-prop-group", children: _jsx("div", { className: "forgebook-prop-grid", children: settable.map((prop) => field(prop, false)) }) })), others.length === 0 ? null : (_jsxs("div", { className: "forgebook-prop-group", children: [_jsx("h3", { className: "forgebook-prop-group__title", children: hasControls ? STRINGS.otherProps : STRINGS.allProps }), _jsx("div", { className: "forgebook-prop-grid", children: others.map((prop) => (_jsx(ReadOnlyProp, { prop: prop, showsGroup: false }, prop.name))) })] })), propGroups.map((group) => group.name === undefined ? null : (_jsx(NamedGroup, { name: group.name, props: group.props, isSettable: isSettable, field: field }, group.name))), hasControls ? (_jsxs("div", { className: "forgebook-tab-foot", children: [_jsx("button", { type: "button", className: "forgebook-text-button", onClick: onReset, children: STRINGS.resetArgs }), worstCase?.canApply === true ? _jsx(WorstCaseControl, { worstCase: worstCase }) : null] })) : null] }));
|
|
64
52
|
};
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A story of a composed catalogue (`refs`), shown read-only: its own catalogue's embed page in a frame, on that
|
|
3
|
+
* catalogue's origin, with this catalogue's switches. Loaded the first time one is opened.
|
|
4
|
+
*
|
|
5
|
+
* @remarks
|
|
6
|
+
* The embed page is the composed catalogue's own, so the story runs with its own preview, theme and frames, and this
|
|
7
|
+
* page runs none of its code: what crosses one way is the address (the story and the switches, which the embed reads as
|
|
8
|
+
* any address), the other way a height (`EmbedSizeMessage`), heard only from that frame's window and origin. A change of
|
|
9
|
+
* the toolbar's switches gives the frame a new address. Off this catalogue's origin the frame is sandboxed as a story's
|
|
10
|
+
* frame is, which keeps it from navigating this tab.
|
|
11
|
+
*
|
|
12
|
+
* @module
|
|
13
|
+
*/
|
|
14
|
+
import "./refStory.scss";
|
|
15
|
+
import { type ReactNode } from "react";
|
|
16
|
+
import { type CatalogueRef } from "../catalogueRefs.ts";
|
|
17
|
+
/** The page's props. */
|
|
18
|
+
export type RefStoryPageProps = {
|
|
19
|
+
/** The composed catalogues of the configuration. */
|
|
20
|
+
readonly refs: readonly CatalogueRef[];
|
|
21
|
+
/** The id of the catalogue the address names. */
|
|
22
|
+
readonly refId: string;
|
|
23
|
+
/** The story's id in it. */
|
|
24
|
+
readonly storyId: string;
|
|
25
|
+
/** This catalogue's switches, by id, with the values the view gives them. */
|
|
26
|
+
readonly switches: Readonly<Record<string, string>>;
|
|
27
|
+
};
|
|
28
|
+
/**
|
|
29
|
+
* A story of a composed catalogue, read-only.
|
|
30
|
+
*
|
|
31
|
+
* @param props - the composed catalogues, the one and the story the address names, and the switches.
|
|
32
|
+
*/
|
|
33
|
+
export declare const RefStoryPage: ({ refs, refId, storyId, switches }: RefStoryPageProps) => ReactNode;
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* A story of a composed catalogue (`refs`), shown read-only: its own catalogue's embed page in a frame, on that
|
|
4
|
+
* catalogue's origin, with this catalogue's switches. Loaded the first time one is opened.
|
|
5
|
+
*
|
|
6
|
+
* @remarks
|
|
7
|
+
* The embed page is the composed catalogue's own, so the story runs with its own preview, theme and frames, and this
|
|
8
|
+
* page runs none of its code: what crosses one way is the address (the story and the switches, which the embed reads as
|
|
9
|
+
* any address), the other way a height (`EmbedSizeMessage`), heard only from that frame's window and origin. A change of
|
|
10
|
+
* the toolbar's switches gives the frame a new address. Off this catalogue's origin the frame is sandboxed as a story's
|
|
11
|
+
* frame is, which keeps it from navigating this tab.
|
|
12
|
+
*
|
|
13
|
+
* @module
|
|
14
|
+
*/
|
|
15
|
+
import "./refStory.css";
|
|
16
|
+
import { useEffect, useRef, useState } from "react";
|
|
17
|
+
import { refEmbedAddress, refStoryAddress } from "../catalogueRefs.js";
|
|
18
|
+
import { EMBED_SIZE_TYPE } from "../embed.js";
|
|
19
|
+
import { STAGE_HEIGHT_RANGE } from "../viewState.js";
|
|
20
|
+
import { FRAME_SANDBOX, framesOrigin } from "./framesOrigin.js";
|
|
21
|
+
import { Icon } from "./icons.js";
|
|
22
|
+
import { REF_STRINGS } from "./refStrings.js";
|
|
23
|
+
import { useRefIndex } from "./useRefIndex.js";
|
|
24
|
+
/** The frame's height before the embed reports its own, in CSS px. */
|
|
25
|
+
const WAITING_HEIGHT = 240;
|
|
26
|
+
/**
|
|
27
|
+
* The browser features another site's page may use: what shows a story (full screen, a video, a copy button), and none
|
|
28
|
+
* that asks the reader (the camera, the microphone, the position, the clipboard's reading). A permission the reader
|
|
29
|
+
* gave this catalogue would otherwise be that site's too, without a question.
|
|
30
|
+
*/
|
|
31
|
+
const REF_PERMISSIONS = [
|
|
32
|
+
"fullscreen",
|
|
33
|
+
"picture-in-picture",
|
|
34
|
+
"autoplay",
|
|
35
|
+
"encrypted-media",
|
|
36
|
+
"clipboard-write"
|
|
37
|
+
].join("; ");
|
|
38
|
+
/** The story's component title and name, as the index gives them; none until it is read, or when it lists neither. */
|
|
39
|
+
const namesOf = (index, storyId) => {
|
|
40
|
+
for (const component of index?.components ?? []) {
|
|
41
|
+
const story = component.stories.find((each) => each.id === storyId);
|
|
42
|
+
if (story !== undefined)
|
|
43
|
+
return { component: component.title.split("/").join(" › "), story: story.name };
|
|
44
|
+
}
|
|
45
|
+
return undefined;
|
|
46
|
+
};
|
|
47
|
+
/**
|
|
48
|
+
* Whether a message is a height from the embed page: its type and a number, nothing else is read.
|
|
49
|
+
*
|
|
50
|
+
* @param data - the message.
|
|
51
|
+
*/
|
|
52
|
+
const heightOf = (data) => {
|
|
53
|
+
if (typeof data !== "object" || data === null)
|
|
54
|
+
return undefined;
|
|
55
|
+
const type = Reflect.get(data, "type");
|
|
56
|
+
const height = Reflect.get(data, "height");
|
|
57
|
+
// never taller than a stage: the embed scrolls a taller story inside its frame, and a page could say any number
|
|
58
|
+
return type === EMBED_SIZE_TYPE && typeof height === "number" && Number.isFinite(height) && height > 0
|
|
59
|
+
? Math.min(Math.ceil(height), STAGE_HEIGHT_RANGE.max)
|
|
60
|
+
: undefined;
|
|
61
|
+
};
|
|
62
|
+
/**
|
|
63
|
+
* The embed page's frame, as tall as the story it reports.
|
|
64
|
+
*
|
|
65
|
+
* @param props - the composed catalogue, the frame's address and its accessible name.
|
|
66
|
+
*/
|
|
67
|
+
const RefFrame = ({ composed, address, title }) => {
|
|
68
|
+
const frameRef = useRef(null);
|
|
69
|
+
const [height, setHeight] = useState(undefined);
|
|
70
|
+
const origin = new URL(composed.url).origin;
|
|
71
|
+
useEffect(() => {
|
|
72
|
+
const onMessage = (event) => {
|
|
73
|
+
if (event.origin !== origin || event.source !== frameRef.current?.contentWindow)
|
|
74
|
+
return;
|
|
75
|
+
const reported = heightOf(event.data);
|
|
76
|
+
if (reported !== undefined)
|
|
77
|
+
setHeight(reported);
|
|
78
|
+
};
|
|
79
|
+
window.addEventListener("message", onMessage);
|
|
80
|
+
return () => window.removeEventListener("message", onMessage);
|
|
81
|
+
}, [origin]);
|
|
82
|
+
return (_jsx("iframe", { ref: frameRef, className: "forgebook-ref-story__frame", src: address, title: title, allow: REF_PERMISSIONS,
|
|
83
|
+
// on this catalogue's own origin a sandbox could be lifted by what runs in it; elsewhere it keeps this tab
|
|
84
|
+
sandbox: origin === window.location.origin ? undefined : FRAME_SANDBOX, style: { height: height ?? WAITING_HEIGHT } }));
|
|
85
|
+
};
|
|
86
|
+
/**
|
|
87
|
+
* Whether a composed catalogue is served on the origin this catalogue's stories run on, where it is not this page.
|
|
88
|
+
*
|
|
89
|
+
* @param composed - the composed catalogue.
|
|
90
|
+
*/
|
|
91
|
+
const isOnFramesOrigin = (composed) => {
|
|
92
|
+
const origin = new URL(composed.url).origin;
|
|
93
|
+
return origin === framesOrigin() && origin !== window.location.origin;
|
|
94
|
+
};
|
|
95
|
+
/**
|
|
96
|
+
* Why a story of a composed catalogue is not shown, or none: the shell names only a catalogue it composes, and one on
|
|
97
|
+
* this catalogue's stories' origin would be framed as one of them and share their storage.
|
|
98
|
+
*
|
|
99
|
+
* @param composed - the composed catalogue the address names, if the configuration has it.
|
|
100
|
+
* @param refId - the id the address names.
|
|
101
|
+
*/
|
|
102
|
+
const refusalOf = (composed, refId) => {
|
|
103
|
+
if (composed === undefined)
|
|
104
|
+
return REF_STRINGS.unknownRef(refId);
|
|
105
|
+
return isOnFramesOrigin(composed) ? REF_STRINGS.onFramesOrigin(composed.title) : undefined;
|
|
106
|
+
};
|
|
107
|
+
/**
|
|
108
|
+
* A story of a composed catalogue, read-only.
|
|
109
|
+
*
|
|
110
|
+
* @param props - the composed catalogues, the one and the story the address names, and the switches.
|
|
111
|
+
*/
|
|
112
|
+
export const RefStoryPage = ({ refs, refId, storyId, switches }) => {
|
|
113
|
+
const composed = refs.find((each) => each.id === refId);
|
|
114
|
+
const state = useRefIndex(composed, true);
|
|
115
|
+
const refusal = refusalOf(composed, refId);
|
|
116
|
+
if (composed === undefined || refusal !== undefined)
|
|
117
|
+
return (_jsx("div", { className: "forgebook-workspace", role: "alert", children: _jsx("h1", { className: "forgebook-empty", children: refusal }) }));
|
|
118
|
+
const names = namesOf(state.status === "ready" ? state.index : undefined, storyId);
|
|
119
|
+
const storyName = names?.story ?? storyId;
|
|
120
|
+
return (_jsxs("div", { className: "forgebook-workspace forgebook-ref-story", children: [_jsxs("header", { className: "forgebook-header", children: [_jsx("p", { className: "forgebook-header__path", children: [composed.title, names?.component].filter((part) => part !== undefined).join(" · ") }), _jsxs("div", { className: "forgebook-header__row", children: [_jsx("h1", { className: "forgebook-header__title", children: storyName }), _jsxs("a", { className: "forgebook-button", href: refStoryAddress(composed, storyId), target: "_blank", rel: "noopener noreferrer", children: [_jsx(Icon, { name: "external", size: 12 }), REF_STRINGS.openThere(composed.title)] })] }), _jsx("p", { className: "forgebook-ref-story__note", children: REF_STRINGS.readOnly })] }), _jsx("div", { className: "forgebook-ref-story__stage", children: _jsx(RefFrame
|
|
121
|
+
// a new story is a new frame: its height starts over with it
|
|
122
|
+
, { composed: composed, address: refEmbedAddress(composed, storyId, switches), title: REF_STRINGS.storyTitle(storyName, composed.title) }, storyId) })] }));
|
|
123
|
+
};
|
|
@@ -112,24 +112,30 @@ const ResultNote = ({ result, listed }) => {
|
|
|
112
112
|
return (_jsxs("p", { className: "forgebook-result__note", children: [more > 0 ? _jsx("span", { children: SEARCH_STRINGS.more(more) }) : null, result.missed.length > 0 ? _jsx("span", { children: SEARCH_STRINGS.missing(result.missed.join(", ")) }) : null] }));
|
|
113
113
|
};
|
|
114
114
|
/** The answer's rows, for the keys and the list. */
|
|
115
|
-
const useResultRows = (answer) => {
|
|
115
|
+
const useResultRows = (answer, hrefOf) => {
|
|
116
116
|
const baseId = useId();
|
|
117
117
|
return useMemo(() => answer.results.map((result, place) => ({
|
|
118
118
|
result,
|
|
119
|
-
own: { id: `${baseId}-${place}`, target: result.target },
|
|
119
|
+
own: { id: `${baseId}-${place}`, key: hrefOf(result.target), target: result.target },
|
|
120
120
|
hits: result.hits.map((hit, hitPlace) => ({
|
|
121
121
|
hit,
|
|
122
|
-
row: {
|
|
122
|
+
row: {
|
|
123
|
+
id: `${baseId}-${place}-${hitPlace}`,
|
|
124
|
+
key: `${hrefOf(result.target)} ${hitPlace}`,
|
|
125
|
+
target: hit.target
|
|
126
|
+
}
|
|
123
127
|
}))
|
|
124
|
-
})), [answer, baseId]);
|
|
128
|
+
})), [answer, baseId, hrefOf]);
|
|
125
129
|
};
|
|
126
130
|
/** The highlighted row: moved by the keys and the pointer, kept in view, named to the field. */
|
|
127
|
-
const useActiveRow = ({ rows, isShown, hrefOf, onOpen, onActiveChange, keysRef }) => {
|
|
128
|
-
|
|
129
|
-
//
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
const
|
|
131
|
+
const useActiveRow = ({ rows, isShown, words, isBehind, hrefOf, onOpen, onActiveChange, keysRef }) => {
|
|
132
|
+
// what a person chose is a row, not a place: an index that arrives moves the rows, and Enter must open the one chosen.
|
|
133
|
+
// Until they choose, and for new words, it is the first
|
|
134
|
+
const [chosen, setChosen] = useState();
|
|
135
|
+
const chosenPlace = chosen?.words === words ? rows.findIndex((row) => row.key === chosen.key) : -1;
|
|
136
|
+
const place = Math.max(chosenPlace, 0);
|
|
137
|
+
const active = rows[place];
|
|
138
|
+
const setActive = (row) => setChosen({ words, key: row.key });
|
|
133
139
|
const activeId = isShown ? active?.id : undefined;
|
|
134
140
|
useEffect(() => onActiveChange(activeId), [activeId, onActiveChange]);
|
|
135
141
|
const listRef = useRef(null);
|
|
@@ -138,23 +144,42 @@ const useActiveRow = ({ rows, isShown, hrefOf, onOpen, onActiveChange, keysRef }
|
|
|
138
144
|
return;
|
|
139
145
|
listRef.current?.querySelector(`[id="${CSS.escape(activeId)}"]`)?.scrollIntoView({ block: "nearest" });
|
|
140
146
|
}, [activeId]);
|
|
147
|
+
const act = ({ key, hasModifier }) => {
|
|
148
|
+
if (activeId === undefined || active === undefined)
|
|
149
|
+
return false;
|
|
150
|
+
const step = KEY_STEPS[key];
|
|
151
|
+
const next = step === undefined ? undefined : rows[(place + step + rows.length) % rows.length];
|
|
152
|
+
if (next !== undefined)
|
|
153
|
+
setActive(next);
|
|
154
|
+
else if (key !== "Enter")
|
|
155
|
+
return false;
|
|
156
|
+
else if (hasModifier)
|
|
157
|
+
window.open(hrefOf(active.target), "_blank", "noopener");
|
|
158
|
+
else
|
|
159
|
+
onOpen(active.target);
|
|
160
|
+
return true;
|
|
161
|
+
};
|
|
162
|
+
// a key pressed while the list is behind the words is meant for the list of those words, and waits for it
|
|
163
|
+
const waitingKeys = useRef([]);
|
|
164
|
+
useEffect(() => {
|
|
165
|
+
if (isBehind)
|
|
166
|
+
return;
|
|
167
|
+
const next = waitingKeys.current.shift();
|
|
168
|
+
// one at a time: the next key acts on the row this one moved to, which the next render gives
|
|
169
|
+
if (next !== undefined && !act(next))
|
|
170
|
+
waitingKeys.current = [];
|
|
171
|
+
});
|
|
141
172
|
useImperativeHandle(keysRef, () => ({
|
|
142
173
|
press: (key, hasModifier) => {
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
return false;
|
|
150
|
-
else if (hasModifier)
|
|
151
|
-
window.open(hrefOf(active.target), "_blank", "noopener");
|
|
152
|
-
else
|
|
153
|
-
onOpen(active.target);
|
|
154
|
-
return true;
|
|
174
|
+
const isListKey = key === "Enter" || KEY_STEPS[key] !== undefined;
|
|
175
|
+
if (isListKey && (isBehind || waitingKeys.current.length > 0)) {
|
|
176
|
+
waitingKeys.current.push({ key, hasModifier });
|
|
177
|
+
return true;
|
|
178
|
+
}
|
|
179
|
+
return act({ key, hasModifier });
|
|
155
180
|
}
|
|
156
181
|
}));
|
|
157
|
-
return { active, setActive
|
|
182
|
+
return { active, setActive, listRef };
|
|
158
183
|
};
|
|
159
184
|
/** The answer's state, in a line: how many results, what is still coming, what could not be read. */
|
|
160
185
|
const PanelStatus = ({ total, query, isLoading, hasFailed }) => (_jsxs("p", { className: "forgebook-search-panel__status", role: "status", children: [total === 0 && !isLoading ? _jsx("span", { children: SEARCH_STRINGS.nothing(query.trim()) }) : null, total > 0 ? _jsx("span", { children: SEARCH_STRINGS.count(total) }) : null, isLoading ? _jsx("span", { children: SEARCH_STRINGS.reading }) : null, hasFailed ? _jsx("span", { children: SEARCH_STRINGS.unreadable }) : null] }));
|
|
@@ -175,7 +200,7 @@ export const SearchPanel = ({ tree, sources, query, isOpen, field, sidebarWidth,
|
|
|
175
200
|
// the field never waits for a long list
|
|
176
201
|
const words = useDeferredValue(query);
|
|
177
202
|
const answer = useMemo(() => searchCatalogue(all, words, LIMITS), [all, words]);
|
|
178
|
-
const results = useResultRows(answer);
|
|
203
|
+
const results = useResultRows(answer, hrefOf);
|
|
179
204
|
const rows = useMemo(() => results.flatMap(({ own, hits }) => [own, ...hits.map(({ row }) => row)]), [results]);
|
|
180
205
|
const isShown = isOpen && hasQuery;
|
|
181
206
|
const panelRef = useRef(null);
|
|
@@ -188,6 +213,8 @@ export const SearchPanel = ({ tree, sources, query, isOpen, field, sidebarWidth,
|
|
|
188
213
|
const { active, setActive, listRef } = useActiveRow({
|
|
189
214
|
rows,
|
|
190
215
|
isShown,
|
|
216
|
+
words,
|
|
217
|
+
isBehind: words !== query,
|
|
191
218
|
hrefOf,
|
|
192
219
|
onOpen,
|
|
193
220
|
onActiveChange,
|
|
@@ -10,8 +10,11 @@ import { type AddressTexts } from "../addressTexts.ts";
|
|
|
10
10
|
import type { CatalogueLists } from "../catalogue.ts";
|
|
11
11
|
import type { ViewSwitch } from "../switches.ts";
|
|
12
12
|
import type { WrittenHomeProps } from "./AuthoredHome.tsx";
|
|
13
|
+
import type { ArgControlLoaders } from "./customControls.ts";
|
|
13
14
|
import { type LoadPluginHosts } from "./pluginHostsContext.ts";
|
|
14
15
|
import type { ShellPlugin } from "./pluginTabs.tsx";
|
|
16
|
+
import type { ShellRefs } from "./refParts.tsx";
|
|
17
|
+
import { type ToolbarProps } from "./Toolbar.tsx";
|
|
15
18
|
/** What an app passes to the shell. */
|
|
16
19
|
export type ShellConfig = {
|
|
17
20
|
/** The catalogue's name, in the page title and the sidebar. */
|
|
@@ -30,6 +33,8 @@ export type ShellConfig = {
|
|
|
30
33
|
readonly heights?: string;
|
|
31
34
|
/** The sources, in the order the sidebar lists them. */
|
|
32
35
|
readonly sources: readonly StorySource[];
|
|
36
|
+
/** The catalogue's own story patterns, for a home with no story to say where it looks; none by default. */
|
|
37
|
+
readonly storyGlobs?: readonly string[];
|
|
33
38
|
/**
|
|
34
39
|
* The frame page's address: relative to the shell's (`frame.html`) when the frames share its origin, on the frames'
|
|
35
40
|
* origin otherwise (`mountShell` makes it).
|
|
@@ -55,6 +60,13 @@ export type ShellConfig = {
|
|
|
55
60
|
readonly home?: () => Promise<ComponentType<WrittenHomeProps>>;
|
|
56
61
|
/** Loads the catalogue's design tokens, on first use; none when it has none. */
|
|
57
62
|
readonly loadTokens?: () => Promise<unknown>;
|
|
63
|
+
/**
|
|
64
|
+
* Loads the previews of the catalogue's galleries, when one first opens; none when it gives none. The generated page
|
|
65
|
+
* gives what the configuration's check allowed; the page checks nothing itself.
|
|
66
|
+
*/
|
|
67
|
+
readonly loadSwitchPreviews?: ToolbarProps["loadSwitchPreviews"];
|
|
68
|
+
/** Loads each custom control `argControls` registers, by name; none when it registers none. */
|
|
69
|
+
readonly argControls?: ArgControlLoaders;
|
|
58
70
|
/** The plugins with views (the generated page passes them); none by default. */
|
|
59
71
|
readonly plugins?: readonly ShellPlugin[];
|
|
60
72
|
/**
|
|
@@ -67,6 +79,12 @@ export type ShellConfig = {
|
|
|
67
79
|
* texts that are not plain words from a story that may write them into markup. `any` by default.
|
|
68
80
|
*/
|
|
69
81
|
readonly addressTexts?: AddressTexts;
|
|
82
|
+
/**
|
|
83
|
+
* Other catalogues, built and deployed, listed after this one's stories and shown read-only (`catalogueRefs.ts`), and
|
|
84
|
+
* the code that draws them (`forgebook/shell/refs`): the generated page gives them only for a catalogue that has some,
|
|
85
|
+
* so the others' first load carries none of it. None by default.
|
|
86
|
+
*/
|
|
87
|
+
readonly refs?: ShellRefs;
|
|
70
88
|
};
|
|
71
89
|
/**
|
|
72
90
|
* The catalogue's page: its settings computed once from the configuration (its switches, its languages' switch, its
|