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
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A `file` control: small files kept as `data:` addresses, since the value must be JSON a link can hold. A file too large
|
|
3
|
+
* for an address, or of a type a browser would run as a page, is refused with the reason, as the check on a link would
|
|
4
|
+
* refuse it (`addressArgs.ts`).
|
|
5
|
+
*
|
|
6
|
+
* @module
|
|
7
|
+
*/
|
|
8
|
+
import { type ReactNode } from "react";
|
|
9
|
+
import { type ArgValue } from "../../messages.ts";
|
|
10
|
+
/** The file control's props. */
|
|
11
|
+
export type FileEditorProps = {
|
|
12
|
+
/** The field's name. */
|
|
13
|
+
readonly label: string;
|
|
14
|
+
/** The element that describes it. */
|
|
15
|
+
readonly describedBy: string;
|
|
16
|
+
/** The files it takes, as `<input accept>` writes it. */
|
|
17
|
+
readonly accept: string | undefined;
|
|
18
|
+
/** The kept files. */
|
|
19
|
+
readonly value: ArgValue | undefined;
|
|
20
|
+
/** Called with the kept files; none when none is left. */
|
|
21
|
+
readonly onChange: (value: readonly string[] | undefined) => void;
|
|
22
|
+
};
|
|
23
|
+
/**
|
|
24
|
+
* The file control.
|
|
25
|
+
*
|
|
26
|
+
* @param props - the field's name, what it takes, and the kept files.
|
|
27
|
+
*/
|
|
28
|
+
export declare const FileEditor: ({ label, describedBy, accept, value, onChange }: FileEditorProps) => ReactNode;
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* A `file` control: small files kept as `data:` addresses, since the value must be JSON a link can hold. A file too large
|
|
4
|
+
* for an address, or of a type a browser would run as a page, is refused with the reason, as the check on a link would
|
|
5
|
+
* refuse it (`addressArgs.ts`).
|
|
6
|
+
*
|
|
7
|
+
* @module
|
|
8
|
+
*/
|
|
9
|
+
import { useState } from "react";
|
|
10
|
+
import { isChoiceList } from "../../messages.js";
|
|
11
|
+
import { isFileText, MOST_FILE_TEXT } from "../../shapeValues.js";
|
|
12
|
+
import { Icon } from "../icons.js";
|
|
13
|
+
import { EDITOR_STRINGS } from "./editorStrings.js";
|
|
14
|
+
/** A file as a `data:` address. */
|
|
15
|
+
const readFile = (file) => new Promise((resolve, reject) => {
|
|
16
|
+
const reader = new FileReader();
|
|
17
|
+
reader.onload = () => resolve(typeof reader.result === "string" ? reader.result : "");
|
|
18
|
+
reader.onerror = () => reject(new Error(file.name));
|
|
19
|
+
reader.readAsDataURL(file);
|
|
20
|
+
});
|
|
21
|
+
/** A length in bytes, for a person. */
|
|
22
|
+
const sizeText = (bytes) => (bytes < 1024 ? `${bytes} B` : `${(bytes / 1024).toFixed(1)} KB`);
|
|
23
|
+
/** What a kept file is, from its address. */
|
|
24
|
+
const fileLine = (text) => {
|
|
25
|
+
const comma = text.indexOf(",");
|
|
26
|
+
const type = text.slice(5, comma).split(";")[0] ?? "";
|
|
27
|
+
// what base64 holds: three bytes for each four characters
|
|
28
|
+
return EDITOR_STRINGS.fileLine(type, sizeText(Math.floor(((text.length - comma - 1) * 3) / 4)));
|
|
29
|
+
};
|
|
30
|
+
/**
|
|
31
|
+
* The file control.
|
|
32
|
+
*
|
|
33
|
+
* @param props - the field's name, what it takes, and the kept files.
|
|
34
|
+
*/
|
|
35
|
+
export const FileEditor = ({ label, describedBy, accept, value, onChange }) => {
|
|
36
|
+
const files = isChoiceList(value) ? value.filter((each) => typeof each === "string") : [];
|
|
37
|
+
const [problems, setProblems] = useState([]);
|
|
38
|
+
const add = async (chosen) => {
|
|
39
|
+
const kept = [];
|
|
40
|
+
const refused = [];
|
|
41
|
+
for (const file of chosen) {
|
|
42
|
+
try {
|
|
43
|
+
const text = await readFile(file);
|
|
44
|
+
if (text.length > MOST_FILE_TEXT)
|
|
45
|
+
refused.push(EDITOR_STRINGS.fileTooLarge(file.name, sizeText((MOST_FILE_TEXT * 3) / 4)));
|
|
46
|
+
else if (isFileText(text))
|
|
47
|
+
kept.push(text);
|
|
48
|
+
else
|
|
49
|
+
refused.push(EDITOR_STRINGS.fileRefused(file.name));
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
refused.push(EDITOR_STRINGS.fileFailed(file.name));
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
setProblems(refused);
|
|
56
|
+
if (kept.length > 0)
|
|
57
|
+
onChange([...files, ...kept]);
|
|
58
|
+
};
|
|
59
|
+
return (_jsxs("div", { className: "forgebook-value-list", children: [_jsx("input", { type: "file", multiple: true, "aria-label": EDITOR_STRINGS.fileChoose(label), "aria-describedby": describedBy, ...(accept === undefined ? {} : { accept }), onChange: (event) => {
|
|
60
|
+
void add([...(event.target.files ?? [])]);
|
|
61
|
+
event.target.value = "";
|
|
62
|
+
} }), files.map((file, index) => (_jsxs("div", { className: "forgebook-value-list__item", children: [_jsx("span", { className: "forgebook-value-list__field forgebook-value-note", children: fileLine(file) }), _jsx("div", { className: "forgebook-value-list__buttons", children: _jsx("button", { type: "button", className: "forgebook-prop__action", "aria-label": EDITOR_STRINGS.fileRemove(EDITOR_STRINGS.itemName(label, index + 1)), onClick: () => {
|
|
63
|
+
const left = files.filter((_, position) => position !== index);
|
|
64
|
+
onChange(left.length === 0 ? undefined : left);
|
|
65
|
+
}, children: _jsx(Icon, { name: "close", size: 12 }) }) })] }, file))), problems.map((problem) => (_jsx("p", { className: "forgebook-value-note", "data-tone": "problem", role: "alert", children: problem }, problem)))] }));
|
|
66
|
+
};
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A value typed as JSON: the way out for what cannot be drawn as fields, and for pasting a whole value. What does not
|
|
3
|
+
* parse, or is not what the prop takes, stays in the field with the reason beside it and never reaches the story.
|
|
4
|
+
*
|
|
5
|
+
* @module
|
|
6
|
+
*/
|
|
7
|
+
import { type ReactNode } from "react";
|
|
8
|
+
import type { FieldProps } from "./fieldTypes.ts";
|
|
9
|
+
/**
|
|
10
|
+
* A value's JSON field.
|
|
11
|
+
*
|
|
12
|
+
* @param props - the field's props.
|
|
13
|
+
*/
|
|
14
|
+
export declare const JsonEditor: ({ shape, value, label, describedBy, namedValues, onChange }: FieldProps) => ReactNode;
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* A value typed as JSON: the way out for what cannot be drawn as fields, and for pasting a whole value. What does not
|
|
4
|
+
* parse, or is not what the prop takes, stays in the field with the reason beside it and never reaches the story.
|
|
5
|
+
*
|
|
6
|
+
* @module
|
|
7
|
+
*/
|
|
8
|
+
import { useId, useState } from "react";
|
|
9
|
+
import { isArgValue } from "../../messages.js";
|
|
10
|
+
import { isValueOfShape } from "../../shapeValues.js";
|
|
11
|
+
import { EDITOR_STRINGS } from "./editorStrings.js";
|
|
12
|
+
/** A value as the field writes it. */
|
|
13
|
+
const jsonText = (value) => value === undefined ? "" : JSON.stringify(value, null, 2);
|
|
14
|
+
/** What a text says: the value it writes, or why it is not one. */
|
|
15
|
+
const readJson = (text, { shape, namedValues }) => {
|
|
16
|
+
if (text.trim() === "")
|
|
17
|
+
return { value: undefined };
|
|
18
|
+
let parsed;
|
|
19
|
+
try {
|
|
20
|
+
parsed = JSON.parse(text);
|
|
21
|
+
}
|
|
22
|
+
catch (error) {
|
|
23
|
+
return { problem: EDITOR_STRINGS.jsonInvalid(error instanceof Error ? error.message : String(error)) };
|
|
24
|
+
}
|
|
25
|
+
if (!isArgValue(parsed))
|
|
26
|
+
return { problem: EDITOR_STRINGS.jsonRefused };
|
|
27
|
+
return isValueOfShape(shape, parsed, namedValues)
|
|
28
|
+
? { value: parsed }
|
|
29
|
+
: { problem: EDITOR_STRINGS.jsonMisfit };
|
|
30
|
+
};
|
|
31
|
+
/**
|
|
32
|
+
* A value's JSON field.
|
|
33
|
+
*
|
|
34
|
+
* @param props - the field's props.
|
|
35
|
+
*/
|
|
36
|
+
export const JsonEditor = ({ shape, value, label, describedBy, namedValues, onChange }) => {
|
|
37
|
+
const problemId = useId();
|
|
38
|
+
const written = jsonText(value);
|
|
39
|
+
const [draft, setDraft] = useState({ text: written, before: written, after: written });
|
|
40
|
+
// a value changed from outside (Reset, the worst case) replaces what was typed; the field's own stays as typed, and so
|
|
41
|
+
// does what its parent did not take (an item of a list cannot be left without a value)
|
|
42
|
+
const text = draft.before === written || draft.after === written ? draft.text : written;
|
|
43
|
+
const read = readJson(text, { shape, namedValues });
|
|
44
|
+
const problem = "problem" in read ? read.problem : undefined;
|
|
45
|
+
return (_jsxs("div", { className: "forgebook-value-json", children: [_jsx("textarea", { className: "forgebook-value-json__text", "aria-label": label, "aria-describedby": problem === undefined ? describedBy : problemId, "aria-invalid": problem !== undefined, spellCheck: false, rows: Math.min(12, Math.max(3, text.split("\n").length)), value: text, onChange: (event) => {
|
|
46
|
+
const next = event.target.value;
|
|
47
|
+
const nextRead = readJson(next, { shape, namedValues });
|
|
48
|
+
const after = "value" in nextRead ? jsonText(nextRead.value) : written;
|
|
49
|
+
setDraft({ text: next, before: written, after });
|
|
50
|
+
if ("value" in nextRead)
|
|
51
|
+
onChange(nextRead.value);
|
|
52
|
+
} }), problem === undefined ? null : (_jsx("p", { id: problemId, className: "forgebook-value-note", "data-tone": "problem", role: "alert", children: problem }))] }));
|
|
53
|
+
};
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A list's items as fields, added, removed and moved with buttons, so a keyboard does all a pointer does: the focus
|
|
3
|
+
* follows an item it moved, and a screen reader is told where it went.
|
|
4
|
+
*
|
|
5
|
+
* @remarks
|
|
6
|
+
* Items keep their place as their key: an item has no identity of its own in JSON, and a key that moved with the value
|
|
7
|
+
* would take the focus out of the field being typed in on every keystroke.
|
|
8
|
+
*
|
|
9
|
+
* @module
|
|
10
|
+
*/
|
|
11
|
+
import { type ReactNode } from "react";
|
|
12
|
+
import type { ValueShape } from "../../valueShape.ts";
|
|
13
|
+
import type { DrawField, FieldProps } from "./fieldTypes.ts";
|
|
14
|
+
/**
|
|
15
|
+
* A list's editor.
|
|
16
|
+
*
|
|
17
|
+
* @param props - the field's props, and how to draw an item.
|
|
18
|
+
*/
|
|
19
|
+
export declare const ListEditor: ({ shape, value, label, namedValues, depth, onChange, drawField }: FieldProps & {
|
|
20
|
+
readonly shape: {
|
|
21
|
+
readonly of: ValueShape;
|
|
22
|
+
};
|
|
23
|
+
readonly drawField: DrawField;
|
|
24
|
+
}) => ReactNode;
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* A list's items as fields, added, removed and moved with buttons, so a keyboard does all a pointer does: the focus
|
|
4
|
+
* follows an item it moved, and a screen reader is told where it went.
|
|
5
|
+
*
|
|
6
|
+
* @remarks
|
|
7
|
+
* Items keep their place as their key: an item has no identity of its own in JSON, and a key that moved with the value
|
|
8
|
+
* would take the focus out of the field being typed in on every keystroke.
|
|
9
|
+
*
|
|
10
|
+
* @module
|
|
11
|
+
*/
|
|
12
|
+
import { useEffect, useRef, useState } from "react";
|
|
13
|
+
import { isArgList } from "../../messages.js";
|
|
14
|
+
import { startValueOf } from "../../shapeValues.js";
|
|
15
|
+
import { Icon } from "../icons.js";
|
|
16
|
+
import { EDITOR_STRINGS } from "./editorStrings.js";
|
|
17
|
+
/** The arrows, drawn as text: the first screen's icons stay what the first screen uses. */
|
|
18
|
+
const ARROWS = { up: "↑", down: "↓" };
|
|
19
|
+
/** One small button of an item; at an end of the list it does nothing, but keeps the focus it was given. */
|
|
20
|
+
const ItemButton = ({ action, label, isOff = false, onPress }) => (_jsx("button", { type: "button", className: "forgebook-prop__action", "data-action": action, "aria-label": label, title: label, "aria-disabled": isOff || undefined, onClick: isOff ? undefined : onPress, children: action === "remove" ? _jsx(Icon, { name: "close", size: 12 }) : ARROWS[action] }));
|
|
21
|
+
/**
|
|
22
|
+
* A list's editor.
|
|
23
|
+
*
|
|
24
|
+
* @param props - the field's props, and how to draw an item.
|
|
25
|
+
*/
|
|
26
|
+
export const ListEditor = ({ shape, value, label, namedValues, depth, onChange, drawField }) => {
|
|
27
|
+
const items = value !== undefined && isArgList(value) ? value : [];
|
|
28
|
+
const listRef = useRef(null);
|
|
29
|
+
const pending = useRef(undefined);
|
|
30
|
+
const [announcement, setAnnouncement] = useState("");
|
|
31
|
+
const itemShape = shape.of;
|
|
32
|
+
const start = startValueOf(itemShape, namedValues);
|
|
33
|
+
useEffect(() => {
|
|
34
|
+
const focus = pending.current;
|
|
35
|
+
if (focus === undefined)
|
|
36
|
+
return;
|
|
37
|
+
pending.current = undefined;
|
|
38
|
+
const selector = focus.action === "add"
|
|
39
|
+
? "[data-action='add']"
|
|
40
|
+
: `[data-item='${focus.index}'] [data-action='${focus.action}']`;
|
|
41
|
+
const fallback = listRef.current?.querySelector("[data-action='add']");
|
|
42
|
+
(listRef.current?.querySelector(selector) ?? fallback)?.focus();
|
|
43
|
+
});
|
|
44
|
+
const itemLabel = (index) => EDITOR_STRINGS.itemName(label, index + 1);
|
|
45
|
+
const move = (index, by, action) => {
|
|
46
|
+
const next = [...items];
|
|
47
|
+
const [item] = next.splice(index, 1);
|
|
48
|
+
if (item === undefined)
|
|
49
|
+
return;
|
|
50
|
+
next.splice(index + by, 0, item);
|
|
51
|
+
pending.current = { index: index + by, action };
|
|
52
|
+
setAnnouncement(EDITOR_STRINGS.itemMoved(itemLabel(index), index + by + 1, next.length));
|
|
53
|
+
onChange(next);
|
|
54
|
+
};
|
|
55
|
+
const remove = (index) => {
|
|
56
|
+
const next = items.filter((_, position) => position !== index);
|
|
57
|
+
pending.current =
|
|
58
|
+
next.length === 0
|
|
59
|
+
? { index: 0, action: "add" }
|
|
60
|
+
: { index: Math.min(index, next.length - 1), action: "remove" };
|
|
61
|
+
setAnnouncement(EDITOR_STRINGS.itemRemoved(itemLabel(index), next.length));
|
|
62
|
+
onChange(next);
|
|
63
|
+
};
|
|
64
|
+
const change = (index, item) => {
|
|
65
|
+
if (item === undefined)
|
|
66
|
+
return;
|
|
67
|
+
onChange(items.map((each, position) => (position === index ? item : each)));
|
|
68
|
+
};
|
|
69
|
+
return (_jsxs("div", { className: "forgebook-value-list", ref: listRef, children: [items.length === 0 ? _jsx("p", { className: "forgebook-value-note", children: EDITOR_STRINGS.emptyList }) : null, items.map((item, index) => (_jsxs("div", { className: "forgebook-value-list__item", "data-item": index, children: [_jsx("div", { className: "forgebook-value-list__field", children: drawField({
|
|
70
|
+
shape: itemShape,
|
|
71
|
+
value: item,
|
|
72
|
+
label: itemLabel(index),
|
|
73
|
+
namedValues,
|
|
74
|
+
depth: depth + 1,
|
|
75
|
+
isRequired: true,
|
|
76
|
+
onChange: (next) => change(index, next)
|
|
77
|
+
}) }), _jsxs("div", { className: "forgebook-value-list__buttons", children: [_jsx(ItemButton, { action: "up", label: EDITOR_STRINGS.moveUp(itemLabel(index)), isOff: index === 0, onPress: () => move(index, -1, "up") }), _jsx(ItemButton, { action: "down", label: EDITOR_STRINGS.moveDown(itemLabel(index)), isOff: index === items.length - 1, onPress: () => move(index, 1, "down") }), _jsx(ItemButton, { action: "remove", label: EDITOR_STRINGS.removeItem(itemLabel(index)), onPress: () => remove(index) })] })] }, index))), _jsxs("button", { type: "button", className: "forgebook-text-button forgebook-value-add", "data-action": "add", disabled: start === undefined, onClick: () => {
|
|
78
|
+
if (start === undefined)
|
|
79
|
+
return;
|
|
80
|
+
onChange([...items, start]);
|
|
81
|
+
}, children: [_jsx(Icon, { name: "plus", size: 12 }), EDITOR_STRINGS.addItem(label)] }), _jsx("span", { className: "forgebook-visually-hidden", role: "status", children: announcement })] }));
|
|
82
|
+
};
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* An object's fields, one under the other, and a tuple's items: what a type declares, each with its name, whether it is
|
|
3
|
+
* required, and a way to take an optional one away.
|
|
4
|
+
*
|
|
5
|
+
* @module
|
|
6
|
+
*/
|
|
7
|
+
import type { ReactNode } from "react";
|
|
8
|
+
import { type ShapeField, type ValueShape } from "../../valueShape.ts";
|
|
9
|
+
import type { DrawField, FieldProps } from "./fieldTypes.ts";
|
|
10
|
+
/**
|
|
11
|
+
* An object's editor. The first change starts from what the required fields must hold, so what reaches the story always
|
|
12
|
+
* fits its type.
|
|
13
|
+
*
|
|
14
|
+
* @param props - the field's props, and how to draw a field.
|
|
15
|
+
*/
|
|
16
|
+
export declare const ObjectEditor: ({ shape, value, label, namedValues, depth, onChange, drawField }: FieldProps & {
|
|
17
|
+
readonly shape: {
|
|
18
|
+
readonly fields: readonly ShapeField[];
|
|
19
|
+
};
|
|
20
|
+
readonly drawField: DrawField;
|
|
21
|
+
}) => ReactNode;
|
|
22
|
+
/**
|
|
23
|
+
* A tuple's editor: its items, fixed in number, each of its own shape.
|
|
24
|
+
*
|
|
25
|
+
* @param props - the field's props, and how to draw an item.
|
|
26
|
+
*/
|
|
27
|
+
export declare const TupleEditor: ({ shape, value, label, namedValues, depth, onChange, drawField }: FieldProps & {
|
|
28
|
+
readonly shape: {
|
|
29
|
+
readonly items: readonly ValueShape[];
|
|
30
|
+
};
|
|
31
|
+
readonly drawField: DrawField;
|
|
32
|
+
}) => ReactNode;
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { isArgList, isArgObject } from "../../messages.js";
|
|
3
|
+
import { startValueOf } from "../../shapeValues.js";
|
|
4
|
+
import { canSetShape } from "../../valueShape.js";
|
|
5
|
+
import { Icon } from "../icons.js";
|
|
6
|
+
import { STRINGS } from "../strings.js";
|
|
7
|
+
import { EDITOR_STRINGS } from "./editorStrings.js";
|
|
8
|
+
/** Whether a field's shape opens further: an optional one that holds nothing stays closed behind a button. */
|
|
9
|
+
const opensFurther = (shape) => shape.kind === "object" || shape.kind === "list" || shape.kind === "record" || shape.kind === "tuple";
|
|
10
|
+
/** One field of an object: its name and its value, or the button that gives it one. */
|
|
11
|
+
const ObjectField = ({ field, value, label, namedValues, depth, onChange, drawField }) => {
|
|
12
|
+
const fieldLabel = EDITOR_STRINGS.fieldValue(label, field.name);
|
|
13
|
+
const start = startValueOf(field.shape, namedValues);
|
|
14
|
+
const isClosed = value === undefined && !field.isRequired && opensFurther(field.shape);
|
|
15
|
+
return (_jsxs("div", { className: "forgebook-value-field", children: [_jsxs("div", { className: "forgebook-value-field__head", children: [_jsxs("code", { className: "forgebook-value-field__name", title: field.description, children: [field.name, field.isRequired ? (_jsx("span", { className: "forgebook-prop__required", title: STRINGS.required, children: "*" })) : null] }), value === undefined || field.isRequired ? null : (_jsx("button", { type: "button", className: "forgebook-prop__action", "aria-label": EDITOR_STRINGS.clearField(fieldLabel), title: EDITOR_STRINGS.clearField(fieldLabel), onClick: () => onChange(undefined), children: _jsx(Icon, { name: "noValue", size: 12 }) }))] }), isClosed ? (_jsxs("button", { type: "button", className: "forgebook-text-button forgebook-value-add", disabled: start === undefined, onClick: () => onChange(start), children: [_jsx(Icon, { name: "plus", size: 12 }), EDITOR_STRINGS.addField(fieldLabel)] })) : (drawField({
|
|
16
|
+
shape: field.shape,
|
|
17
|
+
value,
|
|
18
|
+
label: fieldLabel,
|
|
19
|
+
namedValues,
|
|
20
|
+
depth: depth + 1,
|
|
21
|
+
isRequired: field.isRequired,
|
|
22
|
+
onChange: (next) => {
|
|
23
|
+
// a required field cannot go: what reaches the story always fits its type
|
|
24
|
+
if (next !== undefined || !field.isRequired)
|
|
25
|
+
onChange(next);
|
|
26
|
+
}
|
|
27
|
+
}))] }));
|
|
28
|
+
};
|
|
29
|
+
/**
|
|
30
|
+
* An object's editor. The first change starts from what the required fields must hold, so what reaches the story always
|
|
31
|
+
* fits its type.
|
|
32
|
+
*
|
|
33
|
+
* @param props - the field's props, and how to draw a field.
|
|
34
|
+
*/
|
|
35
|
+
export const ObjectEditor = ({ shape, value, label, namedValues, depth, onChange, drawField }) => {
|
|
36
|
+
const current = value !== undefined && isArgObject(value) ? value : {};
|
|
37
|
+
const change = (name, next) => {
|
|
38
|
+
const started = startValueOf({ kind: "object", fields: shape.fields }, namedValues);
|
|
39
|
+
const base = value === undefined && started !== undefined && isArgObject(started) ? started : current;
|
|
40
|
+
const { [name]: _removed, ...rest } = base;
|
|
41
|
+
onChange(next === undefined ? rest : { ...base, [name]: next });
|
|
42
|
+
};
|
|
43
|
+
return (_jsx("div", { className: "forgebook-value-object", "data-depth": depth, children: shape.fields
|
|
44
|
+
// a part only the source's named values can fill, and it names none, has nothing to draw
|
|
45
|
+
.filter((field) => canSetShape(field.shape, namedValues))
|
|
46
|
+
.map((field) => (_jsx(ObjectField, { field: field, value: Object.hasOwn(current, field.name) ? current[field.name] : undefined, label: label, namedValues: namedValues, depth: depth, onChange: (next) => change(field.name, next), drawField: drawField }, field.name))) }));
|
|
47
|
+
};
|
|
48
|
+
/**
|
|
49
|
+
* A tuple's editor: its items, fixed in number, each of its own shape.
|
|
50
|
+
*
|
|
51
|
+
* @param props - the field's props, and how to draw an item.
|
|
52
|
+
*/
|
|
53
|
+
export const TupleEditor = ({ shape, value, label, namedValues, depth, onChange, drawField }) => {
|
|
54
|
+
const current = value !== undefined && isArgList(value) ? value : undefined;
|
|
55
|
+
const started = startValueOf({ kind: "tuple", items: shape.items }, namedValues);
|
|
56
|
+
const base = current ?? (started !== undefined && isArgList(started) ? started : []);
|
|
57
|
+
return (_jsx("div", { className: "forgebook-value-tuple", children: shape.items.map((item, index) => (_jsx("div", { className: "forgebook-value-field", children: drawField({
|
|
58
|
+
shape: item,
|
|
59
|
+
value: current?.[index],
|
|
60
|
+
label: EDITOR_STRINGS.itemName(label, index + 1),
|
|
61
|
+
namedValues,
|
|
62
|
+
depth: depth + 1,
|
|
63
|
+
isRequired: true,
|
|
64
|
+
onChange: (next) => {
|
|
65
|
+
if (next === undefined)
|
|
66
|
+
return;
|
|
67
|
+
onChange(base.map((each, position) => (position === index ? next : each)));
|
|
68
|
+
}
|
|
69
|
+
}) }, index))) }));
|
|
70
|
+
};
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The panel's editors that load on use, as one prop asks for them: nested fields from its shape, a search among its
|
|
3
|
+
* options or the source's named values, the catalogue's tokens, files. A catalogue of plain props never loads this module
|
|
4
|
+
* (`PropRows.tsx`).
|
|
5
|
+
*
|
|
6
|
+
* @module
|
|
7
|
+
*/
|
|
8
|
+
import type { ReactNode } from "react";
|
|
9
|
+
import type { PanelProp } from "../../argTypes.ts";
|
|
10
|
+
import { type ArgValue } from "../../messages.ts";
|
|
11
|
+
import type { NamedValues } from "../../namedValues.ts";
|
|
12
|
+
import type { ArgControlLoaders } from "../customControls.ts";
|
|
13
|
+
import type { OnValueChange } from "../PropFields.tsx";
|
|
14
|
+
import "./valueEditors.scss";
|
|
15
|
+
/** The editor's props. */
|
|
16
|
+
export type PropEditorProps = {
|
|
17
|
+
/** The prop. */
|
|
18
|
+
readonly prop: PanelProp;
|
|
19
|
+
/** Its value. */
|
|
20
|
+
readonly value: ArgValue | undefined;
|
|
21
|
+
/** The element that describes it. */
|
|
22
|
+
readonly descriptionId: string;
|
|
23
|
+
/** The source's named values. */
|
|
24
|
+
readonly namedValues: NamedValues;
|
|
25
|
+
/** Loads the catalogue's design tokens; none when it has none. */
|
|
26
|
+
readonly loadTokens: (() => Promise<unknown>) | undefined;
|
|
27
|
+
/** Loads each custom control the catalogue registers, by name; none when it registers none. */
|
|
28
|
+
readonly argControls: ArgControlLoaders | undefined;
|
|
29
|
+
/** Called with a changed value. */
|
|
30
|
+
readonly onValueChange: OnValueChange;
|
|
31
|
+
};
|
|
32
|
+
/**
|
|
33
|
+
* One prop's editor.
|
|
34
|
+
*
|
|
35
|
+
* @param props - the prop, its value, and what it may draw from.
|
|
36
|
+
*/
|
|
37
|
+
export declare const PropEditor: ({ prop, value, descriptionId, namedValues, loadTokens, argControls, onValueChange }: PropEditorProps) => ReactNode;
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { UNSET_ARG } from "../../messages.js";
|
|
3
|
+
import { resolvedShape } from "../../shapeValues.js";
|
|
4
|
+
import { canSetShape } from "../../valueShape.js";
|
|
5
|
+
import { LazyView, lazyModule } from "../lazyModule.js";
|
|
6
|
+
import { EDITOR_STRINGS } from "./editorStrings.js";
|
|
7
|
+
import { FileEditor } from "./FileEditor.js";
|
|
8
|
+
import { SearchSelect } from "./SearchSelect.js";
|
|
9
|
+
import { TokenEditor } from "./TokenEditor.js";
|
|
10
|
+
import { ValueField } from "./ValueField.js";
|
|
11
|
+
import "./valueEditors.css";
|
|
12
|
+
/** The host of the custom controls, which a catalogue with none never loads. */
|
|
13
|
+
const CUSTOM_CONTROL = lazyModule(() => import("../CustomControl.js").then((module) => module.CustomControl));
|
|
14
|
+
/** No custom control registered. */
|
|
15
|
+
const NO_ARG_CONTROLS = {};
|
|
16
|
+
/** A custom control's field: its host loads with the first, so an editor of any other kind pays nothing for it. */
|
|
17
|
+
const CustomField = ({ prop, name, value, argControls, onValueChange }) => (_jsx(LazyView, { module: CUSTOM_CONTROL, props: { prop, name, value, loaders: argControls ?? NO_ARG_CONTROLS, onValueChange }, loading: null, failed: (message) => (_jsx("p", { className: "forgebook-prop__description forgebook-prop__problem", role: "alert", children: message })) }));
|
|
18
|
+
/** A prop's fields, or why it has none: a required part only named values can fill, and the source names none. */
|
|
19
|
+
const ShapedField = (props) => canSetShape(props.shape, props.namedValues) ? (_jsx(ValueField, { ...props })) : (_jsx("p", { className: "forgebook-value-note", children: EDITOR_STRINGS.cannotSet }));
|
|
20
|
+
/**
|
|
21
|
+
* One prop's editor.
|
|
22
|
+
*
|
|
23
|
+
* @param props - the prop, its value, and what it may draw from.
|
|
24
|
+
*/
|
|
25
|
+
export const PropEditor = ({ prop, value, descriptionId, namedValues, loadTokens, argControls, onValueChange }) => {
|
|
26
|
+
const label = prop.label ?? prop.name;
|
|
27
|
+
const change = (next) => onValueChange(prop.name, next ?? UNSET_ARG);
|
|
28
|
+
if (prop.customControl !== undefined) {
|
|
29
|
+
return (_jsx(CustomField, { prop: prop, name: prop.customControl, value: value, argControls: argControls, onValueChange: onValueChange }));
|
|
30
|
+
}
|
|
31
|
+
if (prop.control === "file") {
|
|
32
|
+
return (_jsx(FileEditor, { label: label, describedBy: descriptionId, accept: prop.accept, value: value, onChange: change }));
|
|
33
|
+
}
|
|
34
|
+
if (prop.control === "token" && prop.tokens !== undefined) {
|
|
35
|
+
return (_jsx(TokenEditor, { label: label, describedBy: descriptionId, tokens: prop.tokens, value: typeof value === "string" ? value : undefined, loadTokens: loadTokens, onChange: change }));
|
|
36
|
+
}
|
|
37
|
+
if (Object.hasOwn(namedValues, prop.type) && prop.control === undefined && prop.kind === "other") {
|
|
38
|
+
return (_jsx(ValueField, { shape: {
|
|
39
|
+
kind: "named",
|
|
40
|
+
type: prop.type,
|
|
41
|
+
...(prop.canTakeText === true ? { canTakeText: true } : {})
|
|
42
|
+
}, value: value, label: label, describedBy: descriptionId, namedValues: namedValues, depth: 0, onChange: change }));
|
|
43
|
+
}
|
|
44
|
+
if (prop.shape !== undefined) {
|
|
45
|
+
return (_jsx(ShapedField, { shape: resolvedShape(prop.shape), value: value, label: label, describedBy: descriptionId, namedValues: namedValues, depth: 0, onChange: change }));
|
|
46
|
+
}
|
|
47
|
+
// many options, searched
|
|
48
|
+
const choices = prop.choices ?? [];
|
|
49
|
+
return (_jsx(SearchSelect, { label: label, describedBy: descriptionId, options: choices.map((choice) => ({
|
|
50
|
+
value: String(choice),
|
|
51
|
+
label: prop.labels?.[String(choice)] ?? String(choice)
|
|
52
|
+
})), value: typeof value === "string" || typeof value === "number" ? String(value) : undefined, onChange: (text) => change(choices.find((choice) => String(choice) === text)) }));
|
|
53
|
+
};
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Any names, each holding a value of one shape (`Record<string, number>`): each entry's name and value, added and
|
|
3
|
+
* removed. A name that cannot be kept stays in its field with the reason beside it, and the value is untouched.
|
|
4
|
+
*
|
|
5
|
+
* @module
|
|
6
|
+
*/
|
|
7
|
+
import { type ReactNode } from "react";
|
|
8
|
+
import type { ValueShape } from "../../valueShape.ts";
|
|
9
|
+
import type { DrawField, FieldProps } from "./fieldTypes.ts";
|
|
10
|
+
/**
|
|
11
|
+
* A record's editor.
|
|
12
|
+
*
|
|
13
|
+
* @param props - the field's props, and how to draw a value.
|
|
14
|
+
*/
|
|
15
|
+
export declare const RecordEditor: ({ shape, value, label, namedValues, depth, onChange, drawField }: FieldProps & {
|
|
16
|
+
readonly shape: {
|
|
17
|
+
readonly of: ValueShape;
|
|
18
|
+
};
|
|
19
|
+
readonly drawField: DrawField;
|
|
20
|
+
}) => ReactNode;
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* Any names, each holding a value of one shape (`Record<string, number>`): each entry's name and value, added and
|
|
4
|
+
* removed. A name that cannot be kept stays in its field with the reason beside it, and the value is untouched.
|
|
5
|
+
*
|
|
6
|
+
* @module
|
|
7
|
+
*/
|
|
8
|
+
import { useId, useState } from "react";
|
|
9
|
+
import { isArgObject } from "../../messages.js";
|
|
10
|
+
import { isUnsafeFreeName, startValueOf } from "../../shapeValues.js";
|
|
11
|
+
import { Icon } from "../icons.js";
|
|
12
|
+
import { EDITOR_STRINGS } from "./editorStrings.js";
|
|
13
|
+
/** Names no object holds: a component that merges it would write on every object of the page. */
|
|
14
|
+
const PROTOTYPE_NAMES = ["__proto__", "constructor", "prototype"];
|
|
15
|
+
/** Why a name cannot be kept, or none when it can. */
|
|
16
|
+
const nameProblem = (name, others) => {
|
|
17
|
+
if (name === "")
|
|
18
|
+
return EDITOR_STRINGS.nameEmpty;
|
|
19
|
+
if (others.includes(name))
|
|
20
|
+
return EDITOR_STRINGS.nameTaken;
|
|
21
|
+
return PROTOTYPE_NAMES.includes(name) || isUnsafeFreeName(name) ? EDITOR_STRINGS.nameRefused : undefined;
|
|
22
|
+
};
|
|
23
|
+
/** An entry's name: what is typed stays here until it can be kept. */
|
|
24
|
+
const EntryName = ({ name, others, label, onRename }) => {
|
|
25
|
+
const problemId = useId();
|
|
26
|
+
const [draft, setDraft] = useState(name);
|
|
27
|
+
// the row may come to hold another entry (one above it removed, a reset): what was typed was for the last
|
|
28
|
+
const [shownName, setShownName] = useState(name);
|
|
29
|
+
if (shownName !== name) {
|
|
30
|
+
setShownName(name);
|
|
31
|
+
setDraft(name);
|
|
32
|
+
}
|
|
33
|
+
const problem = nameProblem(draft, others);
|
|
34
|
+
return (_jsxs("div", { className: "forgebook-value-record__name", children: [_jsx("input", { type: "text", "aria-label": EDITOR_STRINGS.fieldName(label), "aria-invalid": problem !== undefined, "aria-describedby": problem === undefined ? undefined : problemId, value: draft, onChange: (event) => {
|
|
35
|
+
const next = event.target.value;
|
|
36
|
+
setDraft(next);
|
|
37
|
+
if (nameProblem(next, others) === undefined)
|
|
38
|
+
onRename(next);
|
|
39
|
+
}, onBlur: () => {
|
|
40
|
+
if (problem !== undefined)
|
|
41
|
+
setDraft(name);
|
|
42
|
+
} }), problem === undefined ? null : (_jsx("p", { id: problemId, className: "forgebook-value-note", "data-tone": "problem", role: "alert", children: problem }))] }));
|
|
43
|
+
};
|
|
44
|
+
/**
|
|
45
|
+
* A record's editor.
|
|
46
|
+
*
|
|
47
|
+
* @param props - the field's props, and how to draw a value.
|
|
48
|
+
*/
|
|
49
|
+
export const RecordEditor = ({ shape, value, label, namedValues, depth, onChange, drawField }) => {
|
|
50
|
+
const current = value !== undefined && isArgObject(value) ? value : {};
|
|
51
|
+
const entries = Object.entries(current);
|
|
52
|
+
const names = entries.map(([name]) => name);
|
|
53
|
+
const start = startValueOf(shape.of, namedValues);
|
|
54
|
+
const newName = () => {
|
|
55
|
+
const base = EDITOR_STRINGS.newField;
|
|
56
|
+
let count = names.length + 1;
|
|
57
|
+
while (names.includes(`${base}${count}`))
|
|
58
|
+
count += 1;
|
|
59
|
+
return `${base}${count}`;
|
|
60
|
+
};
|
|
61
|
+
// renamed in place, so the entries keep their order and the field keeps its focus
|
|
62
|
+
const rename = (from, to) => onChange(Object.fromEntries(entries.map(([name, each]) => [name === from ? to : name, each])));
|
|
63
|
+
const change = (name, next) => {
|
|
64
|
+
if (next !== undefined)
|
|
65
|
+
onChange({ ...current, [name]: next });
|
|
66
|
+
};
|
|
67
|
+
return (_jsxs("div", { className: "forgebook-value-list", children: [entries.length === 0 ? _jsx("p", { className: "forgebook-value-note", children: EDITOR_STRINGS.emptyList }) : null, entries.map(([name, each], index) => {
|
|
68
|
+
const entryLabel = EDITOR_STRINGS.itemName(label, index + 1);
|
|
69
|
+
return (_jsxs("div", { className: "forgebook-value-list__item", children: [_jsxs("div", { className: "forgebook-value-record__entry", children: [_jsx(EntryName, { name: name, others: names.filter((other) => other !== name), label: entryLabel, onRename: (to) => rename(name, to) }), _jsx("div", { className: "forgebook-value-list__field", children: drawField({
|
|
70
|
+
shape: shape.of,
|
|
71
|
+
value: each,
|
|
72
|
+
label: EDITOR_STRINGS.fieldValue(entryLabel, name),
|
|
73
|
+
namedValues,
|
|
74
|
+
depth: depth + 1,
|
|
75
|
+
onChange: (next) => change(name, next)
|
|
76
|
+
}) })] }), _jsx("div", { className: "forgebook-value-list__buttons", children: _jsx("button", { type: "button", className: "forgebook-prop__action", "aria-label": EDITOR_STRINGS.removeItem(entryLabel), title: EDITOR_STRINGS.removeItem(entryLabel), onClick: () => {
|
|
77
|
+
const { [name]: _removed, ...rest } = current;
|
|
78
|
+
onChange(rest);
|
|
79
|
+
}, children: _jsx(Icon, { name: "close", size: 12 }) }) })] }, index));
|
|
80
|
+
}), _jsxs("button", { type: "button", className: "forgebook-text-button forgebook-value-add", disabled: start === undefined, onClick: () => {
|
|
81
|
+
if (start !== undefined)
|
|
82
|
+
onChange({ ...current, [newName()]: start });
|
|
83
|
+
}, children: [_jsx(Icon, { name: "plus", size: 12 }), EDITOR_STRINGS.addItem(label)] })] }));
|
|
84
|
+
};
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A list to search: a text field that narrows its options, walked with the arrow keys, as a combobox for screen readers.
|
|
3
|
+
* For many options, and for the source's named values and the catalogue's tokens, where a name is what a reader knows.
|
|
4
|
+
*
|
|
5
|
+
* @remarks
|
|
6
|
+
* The list opens in the flow rather than over the panel: the panel scrolls, and would cut an overlay at its edge.
|
|
7
|
+
*
|
|
8
|
+
* @module
|
|
9
|
+
*/
|
|
10
|
+
import { type ReactNode } from "react";
|
|
11
|
+
/** One option of the list. */
|
|
12
|
+
export type SearchOption = {
|
|
13
|
+
/** What choosing it gives. */
|
|
14
|
+
readonly value: string;
|
|
15
|
+
/** What it is called. */
|
|
16
|
+
readonly label: string;
|
|
17
|
+
/** What it holds, beside its name; none by default. */
|
|
18
|
+
readonly hint?: string;
|
|
19
|
+
/** A colour to show beside its name; none by default. */
|
|
20
|
+
readonly swatch?: string;
|
|
21
|
+
};
|
|
22
|
+
/** The list's props. */
|
|
23
|
+
export type SearchSelectProps = {
|
|
24
|
+
/** The field's name. */
|
|
25
|
+
readonly label: string;
|
|
26
|
+
/** The element that describes it. */
|
|
27
|
+
readonly describedBy?: string | undefined;
|
|
28
|
+
/** The options. */
|
|
29
|
+
readonly options: readonly SearchOption[];
|
|
30
|
+
/** The chosen value; none when nothing is. */
|
|
31
|
+
readonly value: string | undefined;
|
|
32
|
+
/** Whether the list offers "no value"; `true` by default. */
|
|
33
|
+
readonly canClear?: boolean;
|
|
34
|
+
/** Called with the chosen value; none for "no value". */
|
|
35
|
+
readonly onChange: (value: string | undefined) => void;
|
|
36
|
+
};
|
|
37
|
+
/**
|
|
38
|
+
* A list to search.
|
|
39
|
+
*
|
|
40
|
+
* @param props - the options and the chosen value.
|
|
41
|
+
*/
|
|
42
|
+
export declare const SearchSelect: ({ label, describedBy, options, value, canClear, onChange }: SearchSelectProps) => ReactNode;
|