forgebook 0.1.7 → 0.2.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 +906 -23
- package/dist/bin/forgebook/agentClient.d.ts +30 -1
- package/dist/bin/forgebook/agentClient.js +155 -14
- package/dist/bin/forgebook/agentLoopCommands.d.mts +0 -1
- package/dist/bin/forgebook/agentLoopCommands.mjs +161 -40
- package/dist/bin/forgebook/agentText.d.ts +74 -3
- package/dist/bin/forgebook/agentText.js +192 -8
- package/dist/bin/forgebook/agents.md +145 -7
- package/dist/bin/forgebook/agentsText.d.ts +7 -3
- package/dist/bin/forgebook/agentsText.js +7 -3
- package/dist/bin/forgebook/builtCatalogue.d.ts +31 -0
- package/dist/bin/forgebook/builtCatalogue.js +96 -0
- package/dist/bin/forgebook/catalogueCommands.d.ts +22 -3
- package/dist/bin/forgebook/catalogueCommands.js +21 -2
- package/dist/bin/forgebook/catalogueVite.d.ts +51 -9
- package/dist/bin/forgebook/catalogueVite.js +95 -9
- package/dist/bin/forgebook/checkCodeRun.d.ts +8 -0
- package/dist/bin/forgebook/checkCodeRun.js +27 -0
- package/dist/bin/forgebook/commandServer.d.ts +11 -0
- package/dist/bin/forgebook/commandServer.js +39 -0
- package/dist/bin/forgebook/compileCache.d.ts +7 -0
- package/dist/bin/forgebook/compileCache.js +24 -0
- package/dist/bin/forgebook/devCommands.d.mts +14 -0
- package/dist/bin/forgebook/devCommands.mjs +104 -0
- package/dist/bin/forgebook/errorsRun.d.ts +0 -1
- package/dist/bin/forgebook/errorsRun.js +0 -1
- package/dist/bin/forgebook/forgebook.d.mts +0 -1
- package/dist/bin/forgebook/forgebook.mjs +18 -302
- package/dist/bin/forgebook/forgebookCommands.d.mts +1 -0
- package/dist/bin/forgebook/forgebookCommands.mjs +292 -0
- package/dist/bin/forgebook/importers/storybook.d.ts +10 -4
- package/dist/bin/forgebook/importers/storybook.js +71 -45
- package/dist/bin/forgebook/importers/storybookAngular.d.ts +15 -0
- package/dist/bin/forgebook/importers/storybookAngular.js +97 -0
- package/dist/bin/forgebook/importers/storybookFrameworks.d.ts +53 -0
- package/dist/bin/forgebook/importers/storybookFrameworks.js +180 -0
- package/dist/bin/forgebook/importers/storybookReactNative.d.ts +40 -0
- package/dist/bin/forgebook/importers/storybookReactNative.js +179 -0
- package/dist/bin/forgebook/initCommands.d.mts +0 -1
- package/dist/bin/forgebook/initCommands.mjs +23 -12
- package/dist/bin/forgebook/initConfig.d.ts +0 -1
- package/dist/bin/forgebook/initConfig.js +17 -3
- package/dist/bin/forgebook/mcpCommand.d.mts +8 -0
- package/dist/bin/forgebook/mcpCommand.mjs +99 -0
- package/dist/bin/forgebook/mcpPreview.d.ts +32 -0
- package/dist/bin/forgebook/mcpPreview.js +107 -0
- package/dist/bin/forgebook/mcpToolParts.d.ts +28 -0
- package/dist/bin/forgebook/mcpToolParts.js +24 -0
- package/dist/bin/forgebook/mcpTools.d.ts +12 -6
- package/dist/bin/forgebook/mcpTools.js +148 -27
- package/dist/bin/forgebook/newStories.d.ts +2 -3
- package/dist/bin/forgebook/newStories.js +4 -3
- package/dist/bin/forgebook/newStoriesFile.d.ts +3 -4
- package/dist/bin/forgebook/newStoriesFile.js +23 -11
- package/dist/bin/forgebook/pageTools.d.ts +8 -0
- package/dist/bin/forgebook/pageTools.js +71 -0
- package/dist/bin/forgebook/pagesCommands.d.mts +14 -0
- package/dist/bin/forgebook/pagesCommands.mjs +109 -0
- package/dist/bin/forgebook/prebundleChild.d.ts +1 -0
- package/dist/bin/forgebook/prebundleChild.js +34 -0
- package/dist/bin/forgebook/prebundleRun.d.ts +22 -0
- package/dist/bin/forgebook/prebundleRun.js +49 -0
- package/dist/bin/forgebook/prebundleStart.d.ts +44 -0
- package/dist/bin/forgebook/prebundleStart.js +82 -0
- package/dist/bin/forgebook/semanticOptions.d.ts +45 -0
- package/dist/bin/forgebook/semanticOptions.js +36 -0
- package/dist/bin/forgebook/storyCheckCommands.d.mts +13 -0
- package/dist/bin/forgebook/storyCheckCommands.mjs +69 -0
- package/dist/bin/forgebook/storyCheckRun.d.ts +40 -6
- package/dist/bin/forgebook/storyCheckRun.js +90 -16
- package/dist/bin/forgebook/tokensRun.d.ts +41 -0
- package/dist/bin/forgebook/tokensRun.js +42 -0
- package/dist/bin/forgebook/touchWindowRun.d.ts +0 -1
- package/dist/bin/forgebook/touchWindowRun.js +0 -1
- package/dist/bin/forgebook/visualCommands.d.mts +37 -0
- package/dist/bin/forgebook/visualCommands.mjs +162 -0
- package/dist/bin/forgebook/viteCache.d.ts +48 -0
- package/dist/bin/forgebook/viteCache.js +112 -0
- package/dist/bin/forgebook-docs/catalogueDocs.d.ts +1 -2
- package/dist/bin/forgebook-docs/catalogueDocs.js +8 -5
- package/dist/bin/forgebook-docs/catalogueDocs.types.d.ts +24 -3
- package/dist/bin/forgebook-docs/catalogueDocs.types.js +0 -1
- package/dist/bin/forgebook-docs/catalogueMarkdown.d.ts +0 -1
- package/dist/bin/forgebook-docs/catalogueMarkdown.js +88 -24
- package/dist/bin/forgebook-docs/catalogueOptions.d.ts +1 -2
- package/dist/bin/forgebook-docs/catalogueOptions.js +8 -2
- package/dist/bin/forgebook-docs/collectDocs.d.ts +4 -4
- package/dist/bin/forgebook-docs/collectDocs.js +128 -29
- package/dist/bin/forgebook-docs/forgebook-docs.d.mts +0 -1
- package/dist/bin/forgebook-docs/forgebook-docs.mjs +0 -1
- package/dist/bin/forgebook-docs/llmsText.d.ts +5 -1
- package/dist/bin/forgebook-docs/llmsText.js +5 -2
- package/dist/bin/forgebook-docs/moduleDocs.d.ts +0 -1
- package/dist/bin/forgebook-docs/moduleDocs.js +0 -1
- package/dist/bin/forgebook-docs/sassDocs.d.ts +0 -1
- package/dist/bin/forgebook-docs/sassDocs.js +0 -1
- package/dist/bin/forgebook-texts/forgebook-texts.d.mts +0 -1
- package/dist/bin/forgebook-texts/forgebook-texts.mjs +1 -2
- package/dist/bin/forgebook-texts/storyTextsReport.d.ts +0 -1
- package/dist/bin/forgebook-texts/storyTextsReport.js +0 -1
- package/dist/bin/forgebook-texts/storyTextsReport.types.d.ts +0 -1
- package/dist/bin/forgebook-texts/storyTextsReport.types.js +0 -1
- package/dist/bin/frameworkDocs.d.ts +0 -1
- package/dist/bin/frameworkDocs.js +0 -1
- package/dist/src/a11y.d.ts +0 -1
- package/dist/src/a11y.js +0 -1
- package/dist/src/addressArgs.d.ts +74 -0
- package/dist/src/addressArgs.js +109 -0
- package/dist/src/addressTexts.d.ts +35 -0
- package/dist/src/addressTexts.js +51 -0
- package/dist/src/argTypes.d.ts +0 -1
- package/dist/src/argTypes.js +2 -2
- package/dist/src/audiences.d.ts +17 -0
- package/dist/src/audiences.js +15 -0
- package/dist/src/backdrops.d.ts +39 -40
- package/dist/src/backdrops.js +37 -174
- package/dist/src/catalogue.d.ts +57 -21
- package/dist/src/catalogue.js +34 -15
- package/dist/src/codeLiteral.d.ts +41 -0
- package/dist/src/codeLiteral.js +51 -0
- package/dist/src/componentDocs.d.ts +86 -1
- package/dist/src/componentDocs.js +33 -3
- package/dist/src/controlKeys.d.ts +0 -1
- package/dist/src/controlKeys.js +2 -2
- package/dist/src/deviceDrawing.d.ts +114 -0
- package/dist/src/deviceDrawing.js +358 -0
- package/dist/src/deviceMenuView.d.ts +17 -0
- package/dist/src/deviceMenuView.js +22 -0
- package/dist/src/devicePicture.d.ts +57 -0
- package/dist/src/devicePicture.js +104 -0
- package/dist/src/deviceView.d.ts +172 -0
- package/dist/src/deviceView.js +111 -0
- package/dist/src/devices.d.ts +115 -0
- package/dist/src/devices.js +135 -0
- package/dist/src/docAnchors.d.ts +27 -0
- package/dist/src/docAnchors.js +33 -0
- package/dist/src/docPages.d.ts +203 -0
- package/dist/src/docPages.js +169 -0
- package/dist/src/embed.d.ts +32 -0
- package/dist/src/embed.js +24 -0
- package/dist/src/embedCode.d.ts +31 -0
- package/dist/src/embedCode.js +88 -0
- package/dist/src/frame/backdropPictures.d.ts +29 -0
- package/dist/src/frame/backdropPictures.js +187 -0
- package/dist/src/frame/checkStory.d.ts +6 -3
- package/dist/src/frame/checkStory.js +76 -5
- package/dist/src/frame/followTouch.d.ts +9 -0
- package/dist/src/frame/followTouch.js +43 -0
- package/dist/src/frame/frame.css +8 -3
- package/dist/src/frame/frameClock.d.ts +0 -1
- package/dist/src/frame/frameClock.js +0 -1
- package/dist/src/frame/frameStatus.d.ts +2 -1
- package/dist/src/frame/frameStatus.js +2 -1
- package/dist/src/frame/frameView.d.ts +0 -1
- package/dist/src/frame/frameView.js +1 -2
- package/dist/src/frame/matrixLayout.d.ts +0 -1
- package/dist/src/frame/matrixLayout.js +0 -1
- package/dist/src/frame/measureTools.d.ts +0 -1
- package/dist/src/frame/measureTools.js +0 -1
- package/dist/src/frame/mountFrame.d.ts +10 -3
- package/dist/src/frame/mountFrame.js +162 -63
- package/dist/src/frame/playStory.d.ts +0 -1
- package/dist/src/frame/playStory.js +0 -1
- package/dist/src/frame/pluginFrames.d.ts +31 -0
- package/dist/src/frame/pluginFrames.js +23 -0
- package/dist/src/frame/renderer.d.ts +50 -12
- package/dist/src/frame/renderer.js +27 -6
- package/dist/src/frame/settle.d.ts +0 -1
- package/dist/src/frame/settle.js +0 -1
- package/dist/src/frame/shellChannel.d.ts +47 -0
- package/dist/src/frame/shellChannel.js +39 -0
- package/dist/src/frame/spillOutline.d.ts +0 -1
- package/dist/src/frame/spillOutline.js +0 -1
- package/dist/src/frame/staleModule.d.ts +14 -2
- package/dist/src/frame/staleModule.js +19 -2
- package/dist/src/frame/storyCanvas.d.ts +0 -1
- package/dist/src/frame/storyCanvas.js +0 -1
- package/dist/src/frame/storyHooks.d.ts +0 -1
- package/dist/src/frame/storyHooks.js +0 -1
- package/dist/src/frame/storyModule.d.ts +13 -2
- package/dist/src/frame/storyModule.js +45 -3
- package/dist/src/frame/storyRun.d.ts +21 -4
- package/dist/src/frame/storyRun.js +100 -19
- package/dist/src/frame/touchDots.d.ts +0 -1
- package/dist/src/frame/touchDots.js +0 -1
- package/dist/src/frame/touchEvents.d.ts +0 -1
- package/dist/src/frame/touchEvents.js +0 -1
- package/dist/src/frame/touchGesture.d.ts +0 -1
- package/dist/src/frame/touchGesture.js +0 -1
- package/dist/src/frame/touchLayer.d.ts +3 -3
- package/dist/src/frame/touchLayer.js +4 -30
- package/dist/src/frame/touchScroll.d.ts +0 -1
- package/dist/src/frame/touchScroll.js +0 -1
- package/dist/src/frameOrigins.d.ts +62 -0
- package/dist/src/frameOrigins.js +49 -0
- package/dist/src/hotModules.d.ts +48 -0
- package/dist/src/hotModules.js +53 -0
- package/dist/src/jsxCode.d.ts +22 -0
- package/dist/src/jsxCode.js +36 -0
- package/dist/src/languages.d.ts +0 -1
- package/dist/src/languages.js +0 -1
- package/dist/src/liveErrors.d.ts +0 -1
- package/dist/src/liveErrors.js +0 -1
- package/dist/src/matrix.d.ts +0 -1
- package/dist/src/matrix.js +0 -1
- package/dist/src/messages.d.ts +28 -2
- package/dist/src/messages.js +24 -3
- package/dist/src/namedValues.d.ts +11 -1
- package/dist/src/namedValues.js +25 -2
- package/dist/src/namedViews.d.ts +1 -13
- package/dist/src/namedViews.js +30 -7
- package/dist/src/packedText.d.ts +21 -0
- package/dist/src/packedText.js +36 -0
- package/dist/src/pageAddress.d.ts +26 -0
- package/dist/src/pageAddress.js +39 -0
- package/dist/src/pageConfig.d.ts +3 -1
- package/dist/src/pageConfig.js +0 -1
- package/dist/src/pageTree.d.ts +79 -0
- package/dist/src/pageTree.js +108 -0
- package/dist/src/playTrace.d.ts +0 -1
- package/dist/src/playTrace.js +0 -1
- package/dist/src/plugin.d.ts +230 -0
- package/dist/src/plugin.js +12 -0
- package/dist/src/pluginReact.d.ts +23 -0
- package/dist/src/pluginReact.js +24 -0
- package/dist/src/previewRelay.d.ts +40 -0
- package/dist/src/previewRelay.js +69 -0
- package/dist/src/previewTexts.d.ts +26 -0
- package/dist/src/previewTexts.js +33 -0
- package/dist/src/previewView.d.ts +31 -0
- package/dist/src/previewView.js +264 -0
- package/dist/src/propGroups.d.ts +46 -0
- package/dist/src/propGroups.js +59 -0
- package/dist/src/realTouch.d.ts +1 -2
- package/dist/src/realTouch.js +1 -2
- package/dist/src/safeAreaParameter.d.ts +42 -0
- package/dist/src/safeAreaParameter.js +50 -0
- package/dist/src/search.d.ts +154 -0
- package/dist/src/search.js +265 -0
- package/dist/src/searchIndex.d.ts +61 -0
- package/dist/src/searchIndex.js +55 -0
- package/dist/src/searchMarks.d.ts +29 -0
- package/dist/src/searchMarks.js +165 -0
- package/dist/src/searchMatch.d.ts +58 -0
- package/dist/src/searchMatch.js +127 -0
- package/dist/src/shell/A11yTab.d.ts +0 -7
- package/dist/src/shell/A11yTab.js +4 -15
- package/dist/src/shell/AnchorScroll.d.ts +25 -0
- package/dist/src/shell/AnchorScroll.js +10 -0
- package/dist/src/shell/ApiReference.d.ts +12 -4
- package/dist/src/shell/ApiReference.js +74 -19
- package/dist/src/shell/AppearanceMenu.d.ts +1 -2
- package/dist/src/shell/AppearanceMenu.js +8 -5
- package/dist/src/shell/AudienceSections.d.ts +106 -0
- package/dist/src/shell/AudienceSections.js +154 -0
- package/dist/src/shell/AuthoredHome.d.ts +37 -0
- package/dist/src/shell/AuthoredHome.js +96 -0
- package/dist/src/shell/BoxWidth.d.ts +0 -1
- package/dist/src/shell/BoxWidth.js +0 -1
- package/dist/src/shell/ClockBar.d.ts +19 -0
- package/dist/src/shell/ClockBar.js +15 -0
- package/dist/src/shell/ClockControls.d.ts +5 -9
- package/dist/src/shell/ClockControls.js +13 -16
- package/dist/src/shell/Code.d.ts +0 -1
- package/dist/src/shell/Code.js +0 -1
- package/dist/src/shell/CodeTab.d.ts +0 -1
- package/dist/src/shell/CodeTab.js +2 -2
- package/dist/src/shell/CodeText.d.ts +0 -1
- package/dist/src/shell/CodeText.js +0 -1
- package/dist/src/shell/CompareGrid.d.ts +37 -0
- package/dist/src/shell/CompareGrid.js +24 -0
- package/dist/src/shell/ComponentPage.d.ts +45 -7
- package/dist/src/shell/ComponentPage.js +107 -49
- package/dist/src/shell/ControlKeyField.d.ts +0 -1
- package/dist/src/shell/ControlKeyField.js +3 -4
- package/dist/src/shell/ControlRow.d.ts +4 -4
- package/dist/src/shell/ControlRow.js +5 -5
- package/dist/src/shell/DeviceControl.d.ts +31 -0
- package/dist/src/shell/DeviceControl.js +33 -0
- package/dist/src/shell/DeviceSlot.d.ts +114 -0
- package/dist/src/shell/DeviceSlot.js +134 -0
- package/dist/src/shell/DocBlocks.d.ts +100 -0
- package/dist/src/shell/DocBlocks.js +206 -0
- package/dist/src/shell/DocContainers.d.ts +70 -0
- package/dist/src/shell/DocContainers.js +94 -0
- package/dist/src/shell/DocContents.d.ts +29 -0
- package/dist/src/shell/DocContents.js +88 -0
- package/dist/src/shell/DocPage.d.ts +69 -0
- package/dist/src/shell/DocPage.js +141 -0
- package/dist/src/shell/Dock.d.ts +1 -2
- package/dist/src/shell/Dock.js +1 -2
- package/dist/src/shell/DroppedArgsList.d.ts +26 -0
- package/dist/src/shell/DroppedArgsList.js +8 -0
- package/dist/src/shell/DroppedArgsNote.d.ts +14 -0
- package/dist/src/shell/DroppedArgsNote.js +10 -0
- package/dist/src/shell/EmbedButton.d.ts +19 -0
- package/dist/src/shell/EmbedButton.js +96 -0
- package/dist/src/shell/EmbedPage.d.ts +23 -0
- package/dist/src/shell/EmbedPage.js +168 -0
- package/dist/src/shell/EmbedPanel.d.ts +25 -0
- package/dist/src/shell/EmbedPanel.js +46 -0
- package/dist/src/shell/EventsTab.d.ts +0 -1
- package/dist/src/shell/EventsTab.js +2 -3
- package/dist/src/shell/Example.d.ts +20 -2
- package/dist/src/shell/Example.js +75 -22
- package/dist/src/shell/FrameView.d.ts +1 -2
- package/dist/src/shell/FrameView.js +4 -4
- package/dist/src/shell/HomePage.d.ts +78 -4
- package/dist/src/shell/HomePage.js +53 -14
- package/dist/src/shell/HomePieces.d.ts +40 -0
- package/dist/src/shell/HomePieces.js +29 -0
- package/dist/src/shell/InfoTip.d.ts +0 -1
- package/dist/src/shell/InfoTip.js +0 -1
- package/dist/src/shell/InteractionsTab.d.ts +0 -7
- package/dist/src/shell/InteractionsTab.js +3 -9
- package/dist/src/shell/LazyHost.d.ts +16 -0
- package/dist/src/shell/LazyHost.js +42 -0
- package/dist/src/shell/LazyPage.d.ts +24 -0
- package/dist/src/shell/LazyPage.js +9 -0
- package/dist/src/shell/LogicMark.d.ts +9 -0
- package/dist/src/shell/LogicMark.js +5 -0
- package/dist/src/shell/MatrixPicker.d.ts +0 -1
- package/dist/src/shell/MatrixPicker.js +0 -1
- package/dist/src/shell/NamedViews.d.ts +0 -1
- package/dist/src/shell/NamedViews.js +4 -5
- package/dist/src/shell/PackageHtml.d.ts +0 -1
- package/dist/src/shell/PackageHtml.js +0 -1
- package/dist/src/shell/PartsTab.d.ts +0 -7
- package/dist/src/shell/PartsTab.js +3 -13
- package/dist/src/shell/PinnedControl.d.ts +0 -1
- package/dist/src/shell/PinnedControl.js +2 -2
- package/dist/src/shell/PluginBlockHost.d.ts +46 -0
- package/dist/src/shell/PluginBlockHost.js +39 -0
- package/dist/src/shell/PluginTabHost.d.ts +32 -0
- package/dist/src/shell/PluginTabHost.js +25 -0
- package/dist/src/shell/PluginViewHost.d.ts +37 -0
- package/dist/src/shell/PluginViewHost.js +89 -0
- package/dist/src/shell/PropFields.d.ts +0 -1
- package/dist/src/shell/PropFields.js +0 -1
- package/dist/src/shell/PropsTab.d.ts +11 -2
- package/dist/src/shell/PropsTab.js +31 -5
- package/dist/src/shell/SearchPanel.d.ts +63 -0
- package/dist/src/shell/SearchPanel.js +209 -0
- package/dist/src/shell/Segmented.d.ts +0 -1
- package/dist/src/shell/Segmented.js +0 -1
- package/dist/src/shell/Shell.d.ts +34 -6
- package/dist/src/shell/Shell.js +292 -84
- package/dist/src/shell/Sidebar.d.ts +20 -5
- package/dist/src/shell/Sidebar.js +23 -56
- package/dist/src/shell/SidebarDocs.d.ts +38 -0
- package/dist/src/shell/SidebarDocs.js +30 -0
- package/dist/src/shell/SidebarEntries.d.ts +10 -2
- package/dist/src/shell/SidebarEntries.js +3 -3
- package/dist/src/shell/SidebarHandle.d.ts +0 -1
- package/dist/src/shell/SidebarHandle.js +0 -1
- package/dist/src/shell/SidebarSearch.d.ts +40 -0
- package/dist/src/shell/SidebarSearch.js +85 -0
- package/dist/src/shell/SignatureReference.d.ts +25 -0
- package/dist/src/shell/SignatureReference.js +25 -0
- package/dist/src/shell/Stage.d.ts +9 -4
- package/dist/src/shell/Stage.js +121 -60
- package/dist/src/shell/StageCompare.d.ts +14 -0
- package/dist/src/shell/StageCompare.js +11 -0
- package/dist/src/shell/StageTools.d.ts +0 -1
- package/dist/src/shell/StageTools.js +0 -1
- package/dist/src/shell/StageViewport.d.ts +7 -3
- package/dist/src/shell/StageViewport.js +4 -5
- package/dist/src/shell/StoryBar.d.ts +40 -0
- package/dist/src/shell/StoryBar.js +23 -0
- package/dist/src/shell/StoryCodeBlock.d.ts +1 -2
- package/dist/src/shell/StoryCodeBlock.js +0 -1
- package/dist/src/shell/StoryCoverage.d.ts +36 -0
- package/dist/src/shell/StoryCoverage.js +126 -0
- package/dist/src/shell/StoryPicker.d.ts +0 -1
- package/dist/src/shell/StoryPicker.js +0 -1
- package/dist/src/shell/Toolbar.d.ts +9 -3
- package/dist/src/shell/Toolbar.js +12 -7
- package/dist/src/shell/ToolbarControl.d.ts +6 -8
- package/dist/src/shell/ToolbarControl.js +28 -20
- package/dist/src/shell/UsedIn.d.ts +5 -6
- package/dist/src/shell/UsedIn.js +7 -20
- package/dist/src/shell/ViewMenu.d.ts +7 -7
- package/dist/src/shell/ViewMenu.js +61 -176
- package/dist/src/shell/ViewMenuPanel.d.ts +41 -0
- package/dist/src/shell/ViewMenuPanel.js +199 -0
- package/dist/src/shell/WidthField.d.ts +3 -2
- package/dist/src/shell/WidthField.js +2 -3
- package/dist/src/shell/asideStory.d.ts +34 -0
- package/dist/src/shell/asideStory.js +55 -0
- package/dist/src/shell/audienceLayout.d.ts +39 -0
- package/dist/src/shell/audienceLayout.js +33 -0
- package/dist/src/shell/audiencePage.d.ts +113 -0
- package/dist/src/shell/audiencePage.js +144 -0
- package/dist/src/shell/audienceSections.css +95 -0
- package/dist/src/shell/catalogueContext.d.ts +24 -2
- package/dist/src/shell/catalogueContext.js +12 -9
- package/dist/src/shell/codeTokens.d.ts +0 -1
- package/dist/src/shell/codeTokens.js +0 -1
- package/dist/src/shell/codeWriter.d.ts +0 -1
- package/dist/src/shell/codeWriter.js +0 -1
- package/dist/src/shell/compareVariants.d.ts +3 -3
- package/dist/src/shell/compareVariants.js +6 -5
- package/dist/src/shell/controlCycle.d.ts +0 -1
- package/dist/src/shell/controlCycle.js +13 -1
- package/dist/src/shell/controlLabel.d.ts +7 -0
- package/dist/src/shell/controlLabel.js +17 -0
- package/dist/src/shell/device/deviceFrame.css +42 -0
- package/dist/src/shell/device/deviceParts.d.ts +90 -0
- package/dist/src/shell/device/deviceParts.js +120 -0
- package/dist/src/shell/docPage.css +451 -0
- package/dist/src/shell/dockTabs.d.ts +15 -4
- package/dist/src/shell/dockTabs.js +69 -26
- package/dist/src/shell/embed.css +74 -0
- package/dist/src/shell/filesCode.d.ts +21 -0
- package/dist/src/shell/filesCode.js +37 -0
- package/dist/src/shell/forgebookMark.d.ts +15 -0
- package/dist/src/shell/forgebookMark.js +28 -0
- package/dist/src/shell/framesOrigin.d.ts +23 -0
- package/dist/src/shell/framesOrigin.js +69 -0
- package/dist/src/shell/icons.d.ts +4 -1
- package/dist/src/shell/icons.js +4 -1
- package/dist/src/shell/keyboard.d.ts +0 -1
- package/dist/src/shell/keyboard.js +0 -1
- package/dist/src/shell/laterStrings.d.ts +91 -0
- package/dist/src/shell/laterStrings.js +102 -0
- package/dist/src/shell/lazyModule.d.ts +49 -0
- package/dist/src/shell/lazyModule.js +72 -0
- package/dist/src/shell/lazyTab.d.ts +21 -0
- package/dist/src/shell/lazyTab.js +9 -0
- package/dist/src/shell/logicView.d.ts +24 -0
- package/dist/src/shell/logicView.js +39 -0
- package/dist/src/shell/mountShell.d.ts +5 -3
- package/dist/src/shell/mountShell.js +43 -12
- package/dist/src/shell/pageStrings.d.ts +24 -0
- package/dist/src/shell/pageStrings.js +26 -0
- package/dist/src/shell/pluginHosts.d.ts +9 -0
- package/dist/src/shell/pluginHosts.js +6 -0
- package/dist/src/shell/pluginHostsContext.d.ts +20 -0
- package/dist/src/shell/pluginHostsContext.js +16 -0
- package/dist/src/shell/pluginTabs.d.ts +63 -0
- package/dist/src/shell/pluginTabs.js +60 -0
- package/dist/src/shell/search.css +172 -0
- package/dist/src/shell/searchStrings.d.ts +24 -0
- package/dist/src/shell/searchStrings.js +31 -0
- package/dist/src/shell/shell.css +310 -136
- package/dist/src/shell/shellScheme.d.ts +37 -0
- package/dist/src/shell/shellScheme.js +32 -0
- package/dist/src/shell/storyTouch.d.ts +19 -6
- package/dist/src/shell/storyTouch.js +26 -4
- package/dist/src/shell/strings.d.ts +62 -80
- package/dist/src/shell/strings.js +60 -79
- package/dist/src/shell/switchView.d.ts +0 -1
- package/dist/src/shell/switchView.js +0 -1
- package/dist/src/shell/tabSummaries.d.ts +31 -0
- package/dist/src/shell/tabSummaries.js +27 -0
- package/dist/src/shell/treeSearch.d.ts +39 -3
- package/dist/src/shell/treeSearch.js +27 -1
- package/dist/src/shell/useAddressArgs.d.ts +55 -0
- package/dist/src/shell/useAddressArgs.js +62 -0
- package/dist/src/shell/useAnchorScroll.d.ts +24 -0
- package/dist/src/shell/useAnchorScroll.js +90 -0
- package/dist/src/shell/useAppearance.d.ts +7 -2
- package/dist/src/shell/useAppearance.js +14 -5
- package/dist/src/shell/useComponentDocs.d.ts +0 -1
- package/dist/src/shell/useComponentDocs.js +0 -1
- package/dist/src/shell/useControlKeys.d.ts +2 -1
- package/dist/src/shell/useControlKeys.js +2 -3
- package/dist/src/shell/useCopy.d.ts +2 -1
- package/dist/src/shell/useCopy.js +11 -6
- package/dist/src/shell/useFold.d.ts +0 -1
- package/dist/src/shell/useFold.js +0 -1
- package/dist/src/shell/useFrameMessages.d.ts +19 -4
- package/dist/src/shell/useFrameMessages.js +23 -7
- package/dist/src/shell/useFrameQueue.d.ts +7 -3
- package/dist/src/shell/useFrameQueue.js +39 -22
- package/dist/src/shell/useFullPage.d.ts +0 -1
- package/dist/src/shell/useFullPage.js +0 -1
- package/dist/src/shell/useLiveView.d.ts +0 -1
- package/dist/src/shell/useLiveView.js +0 -1
- package/dist/src/shell/useLoaded.d.ts +1 -2
- package/dist/src/shell/useLoaded.js +28 -6
- package/dist/src/shell/usePageDoc.d.ts +0 -1
- package/dist/src/shell/usePageDoc.js +0 -1
- package/dist/src/shell/usePageFrames.d.ts +46 -0
- package/dist/src/shell/usePageFrames.js +50 -0
- package/dist/src/shell/usePluginTabs.d.ts +18 -0
- package/dist/src/shell/usePluginTabs.js +45 -0
- package/dist/src/shell/usePopover.d.ts +0 -1
- package/dist/src/shell/usePopover.js +0 -1
- package/dist/src/shell/useProseLinks.d.ts +14 -0
- package/dist/src/shell/useProseLinks.js +30 -0
- package/dist/src/shell/useRecentPages.d.ts +3 -4
- package/dist/src/shell/useRecentPages.js +1 -2
- package/dist/src/shell/useScrollMemory.d.ts +9 -1
- package/dist/src/shell/useScrollMemory.js +2 -3
- package/dist/src/shell/useSearchIndex.d.ts +24 -0
- package/dist/src/shell/useSearchIndex.js +51 -0
- package/dist/src/shell/useShownView.d.ts +35 -0
- package/dist/src/shell/useShownView.js +36 -0
- package/dist/src/shell/useSidebarLayout.d.ts +0 -1
- package/dist/src/shell/useSidebarLayout.js +0 -1
- package/dist/src/shell/useStored.d.ts +13 -1
- package/dist/src/shell/useStored.js +13 -5
- package/dist/src/shell/useStoryCheck.d.ts +20 -0
- package/dist/src/shell/useStoryCheck.js +33 -0
- package/dist/src/shell/useStoryCode.d.ts +0 -1
- package/dist/src/shell/useStoryCode.js +0 -1
- package/dist/src/shell/useStoryHeights.d.ts +0 -1
- package/dist/src/shell/useStoryHeights.js +0 -1
- package/dist/src/shell/useStoryIdsElement.d.ts +0 -1
- package/dist/src/shell/useStoryIdsElement.js +0 -1
- package/dist/src/shell/useStoryKeys.d.ts +0 -1
- package/dist/src/shell/useStoryKeys.js +0 -1
- package/dist/src/shell/useSyncedTab.d.ts +8 -0
- package/dist/src/shell/useSyncedTab.js +60 -0
- package/dist/src/shell/useSystemDark.d.ts +0 -1
- package/dist/src/shell/useSystemDark.js +0 -1
- package/dist/src/shell/useToolbarLayout.d.ts +0 -1
- package/dist/src/shell/useToolbarLayout.js +0 -1
- package/dist/src/shell/useToolbarOverflow.d.ts +0 -1
- package/dist/src/shell/useToolbarOverflow.js +0 -1
- package/dist/src/shell/useWorstCase.d.ts +0 -1
- package/dist/src/shell/useWorstCase.js +2 -2
- package/dist/src/shell/worstArgs.d.ts +0 -1
- package/dist/src/shell/worstArgs.js +0 -1
- package/dist/src/shellTheme.d.ts +64 -0
- package/dist/src/shellTheme.js +274 -0
- package/dist/src/shellTheme.types.d.ts +93 -0
- package/dist/src/shellTheme.types.js +10 -0
- package/dist/src/sourceFiles.d.ts +17 -3
- package/dist/src/sourceFiles.js +27 -1
- package/dist/src/spills.d.ts +0 -1
- package/dist/src/spills.js +0 -1
- package/dist/src/storyBackground.d.ts +0 -1
- package/dist/src/storyBackground.js +0 -1
- package/dist/src/storyCheck.d.ts +88 -2
- package/dist/src/storyCheck.js +12 -2
- package/dist/src/storyClock.d.ts +0 -1
- package/dist/src/storyClock.js +0 -1
- package/dist/src/storyGlobals.d.ts +0 -1
- package/dist/src/storyGlobals.js +0 -1
- package/dist/src/storyHeights.d.ts +0 -1
- package/dist/src/storyHeights.js +0 -1
- package/dist/src/storyIds.d.ts +36 -0
- package/dist/src/storyIds.js +52 -0
- package/dist/src/storyIdsElement.d.ts +0 -1
- package/dist/src/storyIdsElement.js +0 -1
- package/dist/src/storyTexts.d.ts +11 -5
- package/dist/src/storyTexts.js +16 -5
- package/dist/src/storyTree.d.ts +88 -25
- package/dist/src/storyTree.js +219 -126
- package/dist/src/switches.d.ts +0 -1
- package/dist/src/switches.js +6 -2
- package/dist/src/toolbarLayout.d.ts +0 -1
- package/dist/src/toolbarLayout.js +0 -1
- package/dist/src/treePlaces.d.ts +60 -0
- package/dist/src/treePlaces.js +89 -0
- package/dist/src/usedIn.d.ts +28 -1
- package/dist/src/usedIn.js +93 -3
- package/dist/src/viewState.d.ts +37 -9
- package/dist/src/viewState.js +67 -9
- package/dist/src/viewWords.d.ts +0 -13
- package/dist/src/viewWords.js +41 -3
- package/dist/src/vite/adapter.d.ts +62 -1
- package/dist/src/vite/adapter.js +20 -2
- package/dist/src/vite/agent.types.d.ts +281 -7
- package/dist/src/vite/agent.types.js +11 -1
- package/dist/src/vite/agentApi.d.ts +55 -2
- package/dist/src/vite/agentApi.js +131 -8
- package/dist/src/vite/agentIds.d.ts +25 -0
- package/dist/src/vite/agentIds.js +41 -0
- package/dist/src/vite/agentIndex.d.ts +63 -0
- package/dist/src/vite/agentIndex.js +91 -0
- package/dist/src/vite/agentIndexRoute.d.ts +10 -0
- package/dist/src/vite/agentIndexRoute.js +35 -0
- package/dist/src/vite/agentRoutes.d.ts +80 -19
- package/dist/src/vite/agentRoutes.js +167 -24
- package/dist/src/vite/autoTitle.d.ts +0 -1
- package/dist/src/vite/autoTitle.js +0 -1
- package/dist/src/vite/axeScript.d.ts +20 -0
- package/dist/src/vite/axeScript.js +60 -0
- package/dist/src/vite/builtTexts.d.ts +75 -0
- package/dist/src/vite/builtTexts.js +142 -0
- package/dist/src/vite/catalogueConfig.d.ts +10 -0
- package/dist/src/vite/catalogueConfig.js +64 -0
- package/dist/src/vite/checkCode.d.ts +67 -0
- package/dist/src/vite/checkCode.js +145 -0
- package/dist/src/vite/closeWatch.d.ts +96 -0
- package/dist/src/vite/closeWatch.js +219 -0
- package/dist/src/vite/codeFence.d.ts +78 -0
- package/dist/src/vite/codeFence.js +267 -0
- package/dist/src/vite/componentImport.d.ts +8 -0
- package/dist/src/vite/componentImport.js +35 -0
- package/dist/src/vite/componentPage.d.ts +15 -2
- package/dist/src/vite/componentPage.js +55 -16
- package/dist/src/vite/config.d.ts +51 -3
- package/dist/src/vite/config.js +0 -1
- package/dist/src/vite/configFile.d.ts +65 -9
- package/dist/src/vite/configFile.js +182 -28
- package/dist/src/vite/designTokens.d.ts +75 -0
- package/dist/src/vite/designTokens.js +382 -0
- package/dist/src/vite/diskCache.d.ts +51 -0
- package/dist/src/vite/diskCache.js +211 -0
- package/dist/src/vite/docDirectives.d.ts +116 -0
- package/dist/src/vite/docDirectives.js +425 -0
- package/dist/src/vite/docMarkdown.d.ts +76 -0
- package/dist/src/vite/docMarkdown.js +150 -0
- package/dist/src/vite/docPageBlocks.d.ts +64 -0
- package/dist/src/vite/docPageBlocks.js +322 -0
- package/dist/src/vite/docPageLinks.d.ts +72 -0
- package/dist/src/vite/docPageLinks.js +135 -0
- package/dist/src/vite/docPageMarkdown.d.ts +86 -0
- package/dist/src/vite/docPageMarkdown.js +133 -0
- package/dist/src/vite/docPageRender.d.ts +27 -0
- package/dist/src/vite/docPageRender.js +199 -0
- package/dist/src/vite/docPageTokens.d.ts +91 -0
- package/dist/src/vite/docPageTokens.js +186 -0
- package/dist/src/vite/docPagesModule.d.ts +50 -0
- package/dist/src/vite/docPagesModule.js +118 -0
- package/dist/src/vite/docPagesRoute.d.ts +38 -0
- package/dist/src/vite/docPagesRoute.js +154 -0
- package/dist/src/vite/docsDependencies.d.ts +6 -0
- package/dist/src/vite/docsDependencies.js +150 -0
- package/dist/src/vite/docsExtractor.d.ts +44 -3
- package/dist/src/vite/docsExtractor.js +160 -26
- package/dist/src/vite/docsProgram.d.ts +89 -9
- package/dist/src/vite/docsProgram.js +413 -50
- package/dist/src/vite/docsWorker.d.ts +0 -1
- package/dist/src/vite/docsWorker.js +49 -15
- package/dist/src/vite/figmaLink.d.ts +26 -0
- package/dist/src/vite/figmaLink.js +92 -0
- package/dist/src/vite/findComponent.d.ts +32 -0
- package/dist/src/vite/findComponent.js +52 -0
- package/dist/src/vite/findRoute.d.ts +14 -0
- package/dist/src/vite/findRoute.js +62 -0
- package/dist/src/vite/forcedStates.d.ts +0 -1
- package/dist/src/vite/forcedStates.js +0 -1
- package/dist/src/vite/forgebookPlugin.d.ts +1 -2
- package/dist/src/vite/forgebookPlugin.js +330 -263
- package/dist/src/vite/framesConfig.d.ts +89 -0
- package/dist/src/vite/framesConfig.js +149 -0
- package/dist/src/vite/framesServer.d.ts +43 -0
- package/dist/src/vite/framesServer.js +326 -0
- package/dist/src/vite/functionComponentDocs.d.ts +26 -0
- package/dist/src/vite/functionComponentDocs.js +193 -0
- package/dist/src/vite/gitChange.d.ts +56 -0
- package/dist/src/vite/gitChange.js +86 -0
- package/dist/src/vite/heightsRoute.d.ts +24 -0
- package/dist/src/vite/heightsRoute.js +42 -0
- package/dist/src/vite/highlightCode.d.ts +0 -1
- package/dist/src/vite/highlightCode.js +8 -27
- package/dist/src/vite/hotSnippets.d.ts +86 -0
- package/dist/src/vite/hotSnippets.js +168 -0
- package/dist/src/vite/indexFields.d.ts +61 -0
- package/dist/src/vite/indexFields.js +149 -0
- package/dist/src/vite/indexStoryFile.d.ts +20 -19
- package/dist/src/vite/indexStoryFile.js +172 -201
- package/dist/src/vite/indexedParameters.d.ts +10 -0
- package/dist/src/vite/indexedParameters.js +110 -0
- package/dist/src/vite/mcpProtocol.d.ts +36 -2
- package/dist/src/vite/mcpProtocol.js +100 -15
- package/dist/src/vite/moduleSummary.d.ts +17 -0
- package/dist/src/vite/moduleSummary.js +40 -0
- package/dist/src/vite/nearestToken.d.ts +50 -0
- package/dist/src/vite/nearestToken.js +295 -0
- package/dist/src/vite/originGuard.d.ts +87 -0
- package/dist/src/vite/originGuard.js +163 -0
- package/dist/src/vite/packedModule.d.ts +40 -0
- package/dist/src/vite/packedModule.js +74 -0
- package/dist/src/vite/pages.d.ts +63 -10
- package/dist/src/vite/pages.js +264 -33
- package/dist/src/vite/parsedFiles.d.ts +18 -0
- package/dist/src/vite/parsedFiles.js +91 -0
- package/dist/src/vite/plainGrammars.d.ts +20 -0
- package/dist/src/vite/plainGrammars.js +113 -0
- package/dist/src/vite/pluginConfig.d.ts +47 -0
- package/dist/src/vite/pluginConfig.js +220 -0
- package/dist/src/vite/pluginIds.d.ts +20 -0
- package/dist/src/vite/pluginIds.js +61 -0
- package/dist/src/vite/pluginModules.d.ts +140 -0
- package/dist/src/vite/pluginModules.js +176 -0
- package/dist/src/vite/prebundled.d.ts +18 -5
- package/dist/src/vite/prebundled.js +28 -18
- package/dist/src/vite/previewPages.d.ts +14 -0
- package/dist/src/vite/previewPages.js +81 -0
- package/dist/src/vite/previewRoute.d.ts +8 -0
- package/dist/src/vite/previewRoute.js +8 -0
- package/dist/src/vite/previewRunner.d.ts +56 -0
- package/dist/src/vite/previewRunner.js +207 -0
- package/dist/src/vite/propDocs.d.ts +60 -0
- package/dist/src/vite/propDocs.js +387 -0
- package/dist/src/vite/searchModule.d.ts +40 -0
- package/dist/src/vite/searchModule.js +212 -0
- package/dist/src/vite/searchRoute.d.ts +7 -0
- package/dist/src/vite/searchRoute.js +79 -0
- package/dist/src/vite/serverConditions.d.ts +31 -0
- package/dist/src/vite/serverConditions.js +69 -0
- package/dist/src/vite/signatureDocs.d.ts +18 -0
- package/dist/src/vite/signatureDocs.js +64 -0
- package/dist/src/vite/sourceTokens.d.ts +57 -0
- package/dist/src/vite/sourceTokens.js +164 -0
- package/dist/src/vite/storyCode.d.ts +0 -1
- package/dist/src/vite/storyCode.js +2 -3
- package/dist/src/vite/storyExports.d.ts +32 -0
- package/dist/src/vite/storyExports.js +27 -0
- package/dist/src/vite/storyFilesModule.d.ts +56 -4
- package/dist/src/vite/storyFilesModule.js +122 -34
- package/dist/src/vite/storyMeta.d.ts +20 -11
- package/dist/src/vite/storyMeta.js +74 -38
- package/dist/src/vite/storyParse.d.ts +18 -0
- package/dist/src/vite/storyParse.js +20 -0
- package/dist/src/vite/storyPlay.d.ts +29 -0
- package/dist/src/vite/storyPlay.js +54 -0
- package/dist/src/vite/storyReach.d.ts +42 -0
- package/dist/src/vite/storyReach.js +43 -0
- package/dist/src/vite/storylessRoutes.d.ts +29 -0
- package/dist/src/vite/storylessRoutes.js +126 -0
- package/dist/src/vite/textModules.d.ts +63 -0
- package/dist/src/vite/textModules.js +132 -0
- package/dist/src/vite/textQueries.d.ts +20 -0
- package/dist/src/vite/textQueries.js +20 -0
- package/dist/src/vite/themeFromTokens.d.ts +35 -0
- package/dist/src/vite/themeFromTokens.js +73 -0
- package/dist/src/vite/tokenAnswers.d.ts +20 -0
- package/dist/src/vite/tokenAnswers.js +86 -0
- package/dist/src/vite/tokenClashes.d.ts +44 -0
- package/dist/src/vite/tokenClashes.js +45 -0
- package/dist/src/vite/touchMedia.d.ts +0 -1
- package/dist/src/vite/touchMedia.js +0 -1
- package/dist/src/vite/typeScriptPieces.d.ts +0 -1
- package/dist/src/vite/typeScriptPieces.js +2 -3
- package/dist/src/vite/usageGraph.d.ts +6 -1
- package/dist/src/vite/usageGraph.js +41 -7
- package/dist/src/vite/usageGuidance.d.ts +33 -0
- package/dist/src/vite/usageGuidance.js +45 -0
- package/dist/src/vite/usageModule.d.ts +0 -1
- package/dist/src/vite/usageModule.js +0 -1
- package/dist/src/vite/vitePaths.d.ts +53 -0
- package/dist/src/vite/vitePaths.js +53 -0
- package/dist/src/worstCase.d.ts +0 -1
- package/dist/src/worstCase.js +0 -1
- package/package.json +66 -3
- package/dist/bin/forgebook/agentClient.d.ts.map +0 -1
- package/dist/bin/forgebook/agentClient.js.map +0 -1
- package/dist/bin/forgebook/agentLoopCommands.d.mts.map +0 -1
- package/dist/bin/forgebook/agentLoopCommands.mjs.map +0 -1
- package/dist/bin/forgebook/agentText.d.ts.map +0 -1
- package/dist/bin/forgebook/agentText.js.map +0 -1
- package/dist/bin/forgebook/agentsText.d.ts.map +0 -1
- package/dist/bin/forgebook/agentsText.js.map +0 -1
- package/dist/bin/forgebook/catalogueCommands.d.ts.map +0 -1
- package/dist/bin/forgebook/catalogueCommands.js.map +0 -1
- package/dist/bin/forgebook/catalogueVite.d.ts.map +0 -1
- package/dist/bin/forgebook/catalogueVite.js.map +0 -1
- package/dist/bin/forgebook/errorsRun.d.ts.map +0 -1
- package/dist/bin/forgebook/errorsRun.js.map +0 -1
- package/dist/bin/forgebook/forgebook.d.mts.map +0 -1
- package/dist/bin/forgebook/forgebook.mjs.map +0 -1
- package/dist/bin/forgebook/importers/storybook.d.ts.map +0 -1
- package/dist/bin/forgebook/importers/storybook.js.map +0 -1
- package/dist/bin/forgebook/initCommands.d.mts.map +0 -1
- package/dist/bin/forgebook/initCommands.mjs.map +0 -1
- package/dist/bin/forgebook/initConfig.d.ts.map +0 -1
- package/dist/bin/forgebook/initConfig.js.map +0 -1
- package/dist/bin/forgebook/mcpTools.d.ts.map +0 -1
- package/dist/bin/forgebook/mcpTools.js.map +0 -1
- package/dist/bin/forgebook/newStories.d.ts.map +0 -1
- package/dist/bin/forgebook/newStories.js.map +0 -1
- package/dist/bin/forgebook/newStoriesFile.d.ts.map +0 -1
- package/dist/bin/forgebook/newStoriesFile.js.map +0 -1
- package/dist/bin/forgebook/storyCheckRun.d.ts.map +0 -1
- package/dist/bin/forgebook/storyCheckRun.js.map +0 -1
- package/dist/bin/forgebook/touchWindowRun.d.ts.map +0 -1
- package/dist/bin/forgebook/touchWindowRun.js.map +0 -1
- package/dist/bin/forgebook-docs/catalogueDocs.d.ts.map +0 -1
- package/dist/bin/forgebook-docs/catalogueDocs.js.map +0 -1
- package/dist/bin/forgebook-docs/catalogueDocs.types.d.ts.map +0 -1
- package/dist/bin/forgebook-docs/catalogueDocs.types.js.map +0 -1
- package/dist/bin/forgebook-docs/catalogueMarkdown.d.ts.map +0 -1
- package/dist/bin/forgebook-docs/catalogueMarkdown.js.map +0 -1
- package/dist/bin/forgebook-docs/catalogueOptions.d.ts.map +0 -1
- package/dist/bin/forgebook-docs/catalogueOptions.js.map +0 -1
- package/dist/bin/forgebook-docs/collectDocs.d.ts.map +0 -1
- package/dist/bin/forgebook-docs/collectDocs.js.map +0 -1
- package/dist/bin/forgebook-docs/forgebook-docs.d.mts.map +0 -1
- package/dist/bin/forgebook-docs/forgebook-docs.mjs.map +0 -1
- package/dist/bin/forgebook-docs/llmsText.d.ts.map +0 -1
- package/dist/bin/forgebook-docs/llmsText.js.map +0 -1
- package/dist/bin/forgebook-docs/moduleDocs.d.ts.map +0 -1
- package/dist/bin/forgebook-docs/moduleDocs.js.map +0 -1
- package/dist/bin/forgebook-docs/sassDocs.d.ts.map +0 -1
- package/dist/bin/forgebook-docs/sassDocs.js.map +0 -1
- package/dist/bin/forgebook-docs/sourceId.d.ts +0 -9
- package/dist/bin/forgebook-docs/sourceId.d.ts.map +0 -1
- package/dist/bin/forgebook-docs/sourceId.js +0 -45
- package/dist/bin/forgebook-docs/sourceId.js.map +0 -1
- package/dist/bin/forgebook-texts/forgebook-texts.d.mts.map +0 -1
- package/dist/bin/forgebook-texts/forgebook-texts.mjs.map +0 -1
- package/dist/bin/forgebook-texts/storyTextsReport.d.ts.map +0 -1
- package/dist/bin/forgebook-texts/storyTextsReport.js.map +0 -1
- package/dist/bin/forgebook-texts/storyTextsReport.types.d.ts.map +0 -1
- package/dist/bin/forgebook-texts/storyTextsReport.types.js.map +0 -1
- package/dist/bin/frameworkDocs.d.ts.map +0 -1
- package/dist/bin/frameworkDocs.js.map +0 -1
- package/dist/src/a11y.d.ts.map +0 -1
- package/dist/src/a11y.js.map +0 -1
- package/dist/src/argTypes.d.ts.map +0 -1
- package/dist/src/argTypes.js.map +0 -1
- package/dist/src/backdrops.d.ts.map +0 -1
- package/dist/src/backdrops.js.map +0 -1
- package/dist/src/catalogue.d.ts.map +0 -1
- package/dist/src/catalogue.js.map +0 -1
- package/dist/src/componentDocs.d.ts.map +0 -1
- package/dist/src/componentDocs.js.map +0 -1
- package/dist/src/controlKeys.d.ts.map +0 -1
- package/dist/src/controlKeys.js.map +0 -1
- package/dist/src/frame/checkStory.d.ts.map +0 -1
- package/dist/src/frame/checkStory.js.map +0 -1
- package/dist/src/frame/frameClock.d.ts.map +0 -1
- package/dist/src/frame/frameClock.js.map +0 -1
- package/dist/src/frame/frameStatus.d.ts.map +0 -1
- package/dist/src/frame/frameStatus.js.map +0 -1
- package/dist/src/frame/frameView.d.ts.map +0 -1
- package/dist/src/frame/frameView.js.map +0 -1
- package/dist/src/frame/matrixLayout.d.ts.map +0 -1
- package/dist/src/frame/matrixLayout.js.map +0 -1
- package/dist/src/frame/measureTools.d.ts.map +0 -1
- package/dist/src/frame/measureTools.js.map +0 -1
- package/dist/src/frame/mountFrame.d.ts.map +0 -1
- package/dist/src/frame/mountFrame.js.map +0 -1
- package/dist/src/frame/playStory.d.ts.map +0 -1
- package/dist/src/frame/playStory.js.map +0 -1
- package/dist/src/frame/renderer.d.ts.map +0 -1
- package/dist/src/frame/renderer.js.map +0 -1
- package/dist/src/frame/settle.d.ts.map +0 -1
- package/dist/src/frame/settle.js.map +0 -1
- package/dist/src/frame/spillOutline.d.ts.map +0 -1
- package/dist/src/frame/spillOutline.js.map +0 -1
- package/dist/src/frame/staleModule.d.ts.map +0 -1
- package/dist/src/frame/staleModule.js.map +0 -1
- package/dist/src/frame/storyCanvas.d.ts.map +0 -1
- package/dist/src/frame/storyCanvas.js.map +0 -1
- package/dist/src/frame/storyHooks.d.ts.map +0 -1
- package/dist/src/frame/storyHooks.js.map +0 -1
- package/dist/src/frame/storyModule.d.ts.map +0 -1
- package/dist/src/frame/storyModule.js.map +0 -1
- package/dist/src/frame/storyRun.d.ts.map +0 -1
- package/dist/src/frame/storyRun.js.map +0 -1
- package/dist/src/frame/touchDots.d.ts.map +0 -1
- package/dist/src/frame/touchDots.js.map +0 -1
- package/dist/src/frame/touchEvents.d.ts.map +0 -1
- package/dist/src/frame/touchEvents.js.map +0 -1
- package/dist/src/frame/touchGesture.d.ts.map +0 -1
- package/dist/src/frame/touchGesture.js.map +0 -1
- package/dist/src/frame/touchLayer.d.ts.map +0 -1
- package/dist/src/frame/touchLayer.js.map +0 -1
- package/dist/src/frame/touchScroll.d.ts.map +0 -1
- package/dist/src/frame/touchScroll.js.map +0 -1
- package/dist/src/languages.d.ts.map +0 -1
- package/dist/src/languages.js.map +0 -1
- package/dist/src/liveErrors.d.ts.map +0 -1
- package/dist/src/liveErrors.js.map +0 -1
- package/dist/src/matrix.d.ts.map +0 -1
- package/dist/src/matrix.js.map +0 -1
- package/dist/src/messages.d.ts.map +0 -1
- package/dist/src/messages.js.map +0 -1
- package/dist/src/namedValues.d.ts.map +0 -1
- package/dist/src/namedValues.js.map +0 -1
- package/dist/src/namedViews.d.ts.map +0 -1
- package/dist/src/namedViews.js.map +0 -1
- package/dist/src/pageConfig.d.ts.map +0 -1
- package/dist/src/pageConfig.js.map +0 -1
- package/dist/src/playTrace.d.ts.map +0 -1
- package/dist/src/playTrace.js.map +0 -1
- package/dist/src/realTouch.d.ts.map +0 -1
- package/dist/src/realTouch.js.map +0 -1
- package/dist/src/shell/A11yTab.d.ts.map +0 -1
- package/dist/src/shell/A11yTab.js.map +0 -1
- package/dist/src/shell/ApiReference.d.ts.map +0 -1
- package/dist/src/shell/ApiReference.js.map +0 -1
- package/dist/src/shell/AppearanceMenu.d.ts.map +0 -1
- package/dist/src/shell/AppearanceMenu.js.map +0 -1
- package/dist/src/shell/BoxWidth.d.ts.map +0 -1
- package/dist/src/shell/BoxWidth.js.map +0 -1
- package/dist/src/shell/ClockControls.d.ts.map +0 -1
- package/dist/src/shell/ClockControls.js.map +0 -1
- package/dist/src/shell/Code.d.ts.map +0 -1
- package/dist/src/shell/Code.js.map +0 -1
- package/dist/src/shell/CodeTab.d.ts.map +0 -1
- package/dist/src/shell/CodeTab.js.map +0 -1
- package/dist/src/shell/CodeText.d.ts.map +0 -1
- package/dist/src/shell/CodeText.js.map +0 -1
- package/dist/src/shell/ComponentPage.d.ts.map +0 -1
- package/dist/src/shell/ComponentPage.js.map +0 -1
- package/dist/src/shell/ControlKeyField.d.ts.map +0 -1
- package/dist/src/shell/ControlKeyField.js.map +0 -1
- package/dist/src/shell/ControlRow.d.ts.map +0 -1
- package/dist/src/shell/ControlRow.js.map +0 -1
- package/dist/src/shell/Dock.d.ts.map +0 -1
- package/dist/src/shell/Dock.js.map +0 -1
- package/dist/src/shell/EventsTab.d.ts.map +0 -1
- package/dist/src/shell/EventsTab.js.map +0 -1
- package/dist/src/shell/Example.d.ts.map +0 -1
- package/dist/src/shell/Example.js.map +0 -1
- package/dist/src/shell/FrameView.d.ts.map +0 -1
- package/dist/src/shell/FrameView.js.map +0 -1
- package/dist/src/shell/HomePage.d.ts.map +0 -1
- package/dist/src/shell/HomePage.js.map +0 -1
- package/dist/src/shell/InfoTip.d.ts.map +0 -1
- package/dist/src/shell/InfoTip.js.map +0 -1
- package/dist/src/shell/InteractionsTab.d.ts.map +0 -1
- package/dist/src/shell/InteractionsTab.js.map +0 -1
- package/dist/src/shell/MatrixPicker.d.ts.map +0 -1
- package/dist/src/shell/MatrixPicker.js.map +0 -1
- package/dist/src/shell/NamedViews.d.ts.map +0 -1
- package/dist/src/shell/NamedViews.js.map +0 -1
- package/dist/src/shell/PackageHtml.d.ts.map +0 -1
- package/dist/src/shell/PackageHtml.js.map +0 -1
- package/dist/src/shell/PartsTab.d.ts.map +0 -1
- package/dist/src/shell/PartsTab.js.map +0 -1
- package/dist/src/shell/PinnedControl.d.ts.map +0 -1
- package/dist/src/shell/PinnedControl.js.map +0 -1
- package/dist/src/shell/PropFields.d.ts.map +0 -1
- package/dist/src/shell/PropFields.js.map +0 -1
- package/dist/src/shell/PropsTab.d.ts.map +0 -1
- package/dist/src/shell/PropsTab.js.map +0 -1
- package/dist/src/shell/Segmented.d.ts.map +0 -1
- package/dist/src/shell/Segmented.js.map +0 -1
- package/dist/src/shell/Shell.d.ts.map +0 -1
- package/dist/src/shell/Shell.js.map +0 -1
- package/dist/src/shell/Sidebar.d.ts.map +0 -1
- package/dist/src/shell/Sidebar.js.map +0 -1
- package/dist/src/shell/SidebarEntries.d.ts.map +0 -1
- package/dist/src/shell/SidebarEntries.js.map +0 -1
- package/dist/src/shell/SidebarHandle.d.ts.map +0 -1
- package/dist/src/shell/SidebarHandle.js.map +0 -1
- package/dist/src/shell/Stage.d.ts.map +0 -1
- package/dist/src/shell/Stage.js.map +0 -1
- package/dist/src/shell/StageTools.d.ts.map +0 -1
- package/dist/src/shell/StageTools.js.map +0 -1
- package/dist/src/shell/StageViewport.d.ts.map +0 -1
- package/dist/src/shell/StageViewport.js.map +0 -1
- package/dist/src/shell/StoryCodeBlock.d.ts.map +0 -1
- package/dist/src/shell/StoryCodeBlock.js.map +0 -1
- package/dist/src/shell/StoryPicker.d.ts.map +0 -1
- package/dist/src/shell/StoryPicker.js.map +0 -1
- package/dist/src/shell/Toolbar.d.ts.map +0 -1
- package/dist/src/shell/Toolbar.js.map +0 -1
- package/dist/src/shell/ToolbarControl.d.ts.map +0 -1
- package/dist/src/shell/ToolbarControl.js.map +0 -1
- package/dist/src/shell/UsedIn.d.ts.map +0 -1
- package/dist/src/shell/UsedIn.js.map +0 -1
- package/dist/src/shell/ViewMenu.d.ts.map +0 -1
- package/dist/src/shell/ViewMenu.js.map +0 -1
- package/dist/src/shell/WidthField.d.ts.map +0 -1
- package/dist/src/shell/WidthField.js.map +0 -1
- package/dist/src/shell/catalogueContext.d.ts.map +0 -1
- package/dist/src/shell/catalogueContext.js.map +0 -1
- package/dist/src/shell/codeTokens.d.ts.map +0 -1
- package/dist/src/shell/codeTokens.js.map +0 -1
- package/dist/src/shell/codeWriter.d.ts.map +0 -1
- package/dist/src/shell/codeWriter.js.map +0 -1
- package/dist/src/shell/compareVariants.d.ts.map +0 -1
- package/dist/src/shell/compareVariants.js.map +0 -1
- package/dist/src/shell/controlCycle.d.ts.map +0 -1
- package/dist/src/shell/controlCycle.js.map +0 -1
- package/dist/src/shell/dockTabs.d.ts.map +0 -1
- package/dist/src/shell/dockTabs.js.map +0 -1
- package/dist/src/shell/icons.d.ts.map +0 -1
- package/dist/src/shell/icons.js.map +0 -1
- package/dist/src/shell/keyboard.d.ts.map +0 -1
- package/dist/src/shell/keyboard.js.map +0 -1
- package/dist/src/shell/mountShell.d.ts.map +0 -1
- package/dist/src/shell/mountShell.js.map +0 -1
- package/dist/src/shell/storyTouch.d.ts.map +0 -1
- package/dist/src/shell/storyTouch.js.map +0 -1
- package/dist/src/shell/strings.d.ts.map +0 -1
- package/dist/src/shell/strings.js.map +0 -1
- package/dist/src/shell/switchView.d.ts.map +0 -1
- package/dist/src/shell/switchView.js.map +0 -1
- package/dist/src/shell/treeSearch.d.ts.map +0 -1
- package/dist/src/shell/treeSearch.js.map +0 -1
- package/dist/src/shell/useAppearance.d.ts.map +0 -1
- package/dist/src/shell/useAppearance.js.map +0 -1
- package/dist/src/shell/useComponentDocs.d.ts.map +0 -1
- package/dist/src/shell/useComponentDocs.js.map +0 -1
- package/dist/src/shell/useControlKeys.d.ts.map +0 -1
- package/dist/src/shell/useControlKeys.js.map +0 -1
- package/dist/src/shell/useCopy.d.ts.map +0 -1
- package/dist/src/shell/useCopy.js.map +0 -1
- package/dist/src/shell/useFold.d.ts.map +0 -1
- package/dist/src/shell/useFold.js.map +0 -1
- package/dist/src/shell/useFrameMessages.d.ts.map +0 -1
- package/dist/src/shell/useFrameMessages.js.map +0 -1
- package/dist/src/shell/useFrameQueue.d.ts.map +0 -1
- package/dist/src/shell/useFrameQueue.js.map +0 -1
- package/dist/src/shell/useFullPage.d.ts.map +0 -1
- package/dist/src/shell/useFullPage.js.map +0 -1
- package/dist/src/shell/useLiveView.d.ts.map +0 -1
- package/dist/src/shell/useLiveView.js.map +0 -1
- package/dist/src/shell/useLoaded.d.ts.map +0 -1
- package/dist/src/shell/useLoaded.js.map +0 -1
- package/dist/src/shell/usePageDoc.d.ts.map +0 -1
- package/dist/src/shell/usePageDoc.js.map +0 -1
- package/dist/src/shell/usePopover.d.ts.map +0 -1
- package/dist/src/shell/usePopover.js.map +0 -1
- package/dist/src/shell/useRecentPages.d.ts.map +0 -1
- package/dist/src/shell/useRecentPages.js.map +0 -1
- package/dist/src/shell/useScrollMemory.d.ts.map +0 -1
- package/dist/src/shell/useScrollMemory.js.map +0 -1
- package/dist/src/shell/useSidebarLayout.d.ts.map +0 -1
- package/dist/src/shell/useSidebarLayout.js.map +0 -1
- package/dist/src/shell/useStored.d.ts.map +0 -1
- package/dist/src/shell/useStored.js.map +0 -1
- package/dist/src/shell/useStoryCode.d.ts.map +0 -1
- package/dist/src/shell/useStoryCode.js.map +0 -1
- package/dist/src/shell/useStoryHeights.d.ts.map +0 -1
- package/dist/src/shell/useStoryHeights.js.map +0 -1
- package/dist/src/shell/useStoryIdsElement.d.ts.map +0 -1
- package/dist/src/shell/useStoryIdsElement.js.map +0 -1
- package/dist/src/shell/useStoryKeys.d.ts.map +0 -1
- package/dist/src/shell/useStoryKeys.js.map +0 -1
- package/dist/src/shell/useSystemDark.d.ts.map +0 -1
- package/dist/src/shell/useSystemDark.js.map +0 -1
- package/dist/src/shell/useToolbarLayout.d.ts.map +0 -1
- package/dist/src/shell/useToolbarLayout.js.map +0 -1
- package/dist/src/shell/useToolbarOverflow.d.ts.map +0 -1
- package/dist/src/shell/useToolbarOverflow.js.map +0 -1
- package/dist/src/shell/useWorstCase.d.ts.map +0 -1
- package/dist/src/shell/useWorstCase.js.map +0 -1
- package/dist/src/shell/worstArgs.d.ts.map +0 -1
- package/dist/src/shell/worstArgs.js.map +0 -1
- package/dist/src/sourceFiles.d.ts.map +0 -1
- package/dist/src/sourceFiles.js.map +0 -1
- package/dist/src/spills.d.ts.map +0 -1
- package/dist/src/spills.js.map +0 -1
- package/dist/src/storyBackground.d.ts.map +0 -1
- package/dist/src/storyBackground.js.map +0 -1
- package/dist/src/storyCheck.d.ts.map +0 -1
- package/dist/src/storyCheck.js.map +0 -1
- package/dist/src/storyClock.d.ts.map +0 -1
- package/dist/src/storyClock.js.map +0 -1
- package/dist/src/storyGlobals.d.ts.map +0 -1
- package/dist/src/storyGlobals.js.map +0 -1
- package/dist/src/storyHeights.d.ts.map +0 -1
- package/dist/src/storyHeights.js.map +0 -1
- package/dist/src/storyIdsElement.d.ts.map +0 -1
- package/dist/src/storyIdsElement.js.map +0 -1
- package/dist/src/storyTexts.d.ts.map +0 -1
- package/dist/src/storyTexts.js.map +0 -1
- package/dist/src/storyTree.d.ts.map +0 -1
- package/dist/src/storyTree.js.map +0 -1
- package/dist/src/switches.d.ts.map +0 -1
- package/dist/src/switches.js.map +0 -1
- package/dist/src/toolbarLayout.d.ts.map +0 -1
- package/dist/src/toolbarLayout.js.map +0 -1
- package/dist/src/usedIn.d.ts.map +0 -1
- package/dist/src/usedIn.js.map +0 -1
- package/dist/src/viewState.d.ts.map +0 -1
- package/dist/src/viewState.js.map +0 -1
- package/dist/src/viewWords.d.ts.map +0 -1
- package/dist/src/viewWords.js.map +0 -1
- package/dist/src/vite/adapter.d.ts.map +0 -1
- package/dist/src/vite/adapter.js.map +0 -1
- package/dist/src/vite/agent.types.d.ts.map +0 -1
- package/dist/src/vite/agent.types.js.map +0 -1
- package/dist/src/vite/agentApi.d.ts.map +0 -1
- package/dist/src/vite/agentApi.js.map +0 -1
- package/dist/src/vite/agentRoutes.d.ts.map +0 -1
- package/dist/src/vite/agentRoutes.js.map +0 -1
- package/dist/src/vite/autoTitle.d.ts.map +0 -1
- package/dist/src/vite/autoTitle.js.map +0 -1
- package/dist/src/vite/componentPage.d.ts.map +0 -1
- package/dist/src/vite/componentPage.js.map +0 -1
- package/dist/src/vite/config.d.ts.map +0 -1
- package/dist/src/vite/config.js.map +0 -1
- package/dist/src/vite/configFile.d.ts.map +0 -1
- package/dist/src/vite/configFile.js.map +0 -1
- package/dist/src/vite/docsExtractor.d.ts.map +0 -1
- package/dist/src/vite/docsExtractor.js.map +0 -1
- package/dist/src/vite/docsProgram.d.ts.map +0 -1
- package/dist/src/vite/docsProgram.js.map +0 -1
- package/dist/src/vite/docsWorker.d.ts.map +0 -1
- package/dist/src/vite/docsWorker.js.map +0 -1
- package/dist/src/vite/forcedStates.d.ts.map +0 -1
- package/dist/src/vite/forcedStates.js.map +0 -1
- package/dist/src/vite/forgebookPlugin.d.ts.map +0 -1
- package/dist/src/vite/forgebookPlugin.js.map +0 -1
- package/dist/src/vite/highlightCode.d.ts.map +0 -1
- package/dist/src/vite/highlightCode.js.map +0 -1
- package/dist/src/vite/indexStoryFile.d.ts.map +0 -1
- package/dist/src/vite/indexStoryFile.js.map +0 -1
- package/dist/src/vite/mcpProtocol.d.ts.map +0 -1
- package/dist/src/vite/mcpProtocol.js.map +0 -1
- package/dist/src/vite/pages.d.ts.map +0 -1
- package/dist/src/vite/pages.js.map +0 -1
- package/dist/src/vite/prebundled.d.ts.map +0 -1
- package/dist/src/vite/prebundled.js.map +0 -1
- package/dist/src/vite/storyCode.d.ts.map +0 -1
- package/dist/src/vite/storyCode.js.map +0 -1
- package/dist/src/vite/storyFilesModule.d.ts.map +0 -1
- package/dist/src/vite/storyFilesModule.js.map +0 -1
- package/dist/src/vite/storyMeta.d.ts.map +0 -1
- package/dist/src/vite/storyMeta.js.map +0 -1
- package/dist/src/vite/touchMedia.d.ts.map +0 -1
- package/dist/src/vite/touchMedia.js.map +0 -1
- package/dist/src/vite/typeScriptPieces.d.ts.map +0 -1
- package/dist/src/vite/typeScriptPieces.js.map +0 -1
- package/dist/src/vite/usageGraph.d.ts.map +0 -1
- package/dist/src/vite/usageGraph.js.map +0 -1
- package/dist/src/vite/usageModule.d.ts.map +0 -1
- package/dist/src/vite/usageModule.js.map +0 -1
- package/dist/src/worstCase.d.ts.map +0 -1
- package/dist/src/worstCase.js.map +0 -1
package/README.md
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
<a href="https://forgebook.dev"><img src="https://forgebook.dev/logo.svg" alt="Forgebook" width="64" height="64"></a>
|
|
2
|
+
|
|
1
3
|
# Forgebook
|
|
2
4
|
|
|
3
5
|
See every component in every theme, contrast, language and width. Write CSF stories, run `forgebook dev`: one frame
|
|
@@ -7,20 +9,44 @@ per story, switches for theme, contrast, motion and language, and a props table
|
|
|
7
9
|
> and every change is in the
|
|
8
10
|
> [changelog](https://github.com/ensiria/forgebook/blob/develop/packages/forgebook/CHANGELOG.md).
|
|
9
11
|
|
|
10
|
-
**Requirements:** Node 22.18 or later · Vite 8 (the catalogue is built on it; other bundlers are not supported) · React 19
|
|
11
|
-
[`@forgebook/react`](https://www.npmjs.com/package/@forgebook/react)
|
|
12
|
-
|
|
12
|
+
**Requirements:** Node 22.18 or later · Vite 8 (the catalogue is built on it; other bundlers are not supported) · React 19 through
|
|
13
|
+
[`@forgebook/react`](https://www.npmjs.com/package/@forgebook/react), Vue 3.5 through
|
|
14
|
+
[`@forgebook/vue`](https://www.npmjs.com/package/@forgebook/vue) (a Nuxt project's through
|
|
15
|
+
[`@forgebook/nuxt`](https://www.npmjs.com/package/@forgebook/nuxt)), Svelte 5 through
|
|
16
|
+
[`@forgebook/svelte`](https://www.npmjs.com/package/@forgebook/svelte) (a SvelteKit app's through
|
|
17
|
+
[`@forgebook/sveltekit`](https://www.npmjs.com/package/@forgebook/sveltekit)), Solid 1.9 through
|
|
18
|
+
[`@forgebook/solid`](https://www.npmjs.com/package/@forgebook/solid), Preact 10.19 or 11 through
|
|
19
|
+
[`@forgebook/preact`](https://www.npmjs.com/package/@forgebook/preact), Web Components with Lit 3 through
|
|
20
|
+
[`@forgebook/web-components`](https://www.npmjs.com/package/@forgebook/web-components), Angular 20 to 22 (Analog
|
|
21
|
+
included) through [`@forgebook/angular`](https://www.npmjs.com/package/@forgebook/angular), a Next.js project's
|
|
22
|
+
components through [`@forgebook/nextjs`](https://www.npmjs.com/package/@forgebook/nextjs), React Native through
|
|
23
|
+
react-native-web with [`@forgebook/react-native-web`](https://www.npmjs.com/package/@forgebook/react-native-web), or no
|
|
24
|
+
framework at all
|
|
25
|
+
through [`@forgebook/html`](https://www.npmjs.com/package/@forgebook/html) (stories that return an HTML string or a DOM
|
|
26
|
+
node); other frameworks plug in through the same adapter (the catalogue's own interface is React either way, and the
|
|
27
|
+
frame of a story in another framework loads none) · npm, pnpm, yarn or bun ·
|
|
13
28
|
[MIT licence](https://github.com/ensiria/forgebook/blob/develop/packages/forgebook/LICENSE)
|
|
14
29
|
|
|
15
30
|
## Install
|
|
16
31
|
|
|
17
32
|
In a project with React and Vite, both packages: `forgebook` is the catalogue, `@forgebook/react` the adapter it draws
|
|
18
|
-
React components with.
|
|
33
|
+
React components with. On Vue, Svelte, Solid, Preact or Angular, `@forgebook/vue`, `@forgebook/svelte`,
|
|
34
|
+
`@forgebook/solid`, `@forgebook/preact` or `@forgebook/angular` takes its place, `@forgebook/nuxt` in a Nuxt project,
|
|
35
|
+
`@forgebook/sveltekit` in a SvelteKit app,
|
|
36
|
+
`@forgebook/web-components` for custom elements, and `@forgebook/html` for stories written in plain JavaScript or
|
|
37
|
+
TypeScript with no framework: each README has the configuration and the stories.
|
|
19
38
|
|
|
20
39
|
```sh
|
|
21
40
|
npm install --save-dev forgebook @forgebook/react
|
|
22
41
|
```
|
|
23
42
|
|
|
43
|
+
What Forgebook keeps between runs lives in `node_modules/.vite`, beside Vite's pre-bundled dependencies: Node's compile
|
|
44
|
+
cache of the `forgebook` command in `node_modules/.vite/forgebook/compile`, and what a dev server read of the stories in
|
|
45
|
+
`node_modules/.vite/forgebook/{docs,usage,code,index}`: each component's props, "Used in", a story file's code and the
|
|
46
|
+
sidebar's index, kept with the files they were read from, so a later start answers without reading the components with
|
|
47
|
+
TypeScript until one of those files, a configuration or the lock file changes. Removing `node_modules/.vite` starts from
|
|
48
|
+
nothing.
|
|
49
|
+
|
|
24
50
|
## A first catalogue
|
|
25
51
|
|
|
26
52
|
A component, with its props typed and documented:
|
|
@@ -84,6 +110,13 @@ Badge's page shows its stories, each in its own frame, and an API table read fro
|
|
|
84
110
|
## What a catalogue gives you
|
|
85
111
|
|
|
86
112
|
- **One frame per story**, so a story's styles and globals never leak into another, and its address opens it alone.
|
|
113
|
+
- **Edits drawn in place**: an edited story file, preview or component is drawn anew in its open frame, which keeps
|
|
114
|
+
what you did in the story (a typed field, an open menu); a story with a play, loaders or set-ups runs them again. An
|
|
115
|
+
edit that adds, renames or retitles a story reloads the pages, as an edit of an Angular story file does. On macOS
|
|
116
|
+
the files you work on (the story files the open frames show, and each file they load once you have edited it) are
|
|
117
|
+
watched one by one, so an edit reaches the page without the system's change events' wait of a tenth of a second or
|
|
118
|
+
more. Where the system's change events come late or never (a container's mounted volume, a Windows drive under WSL,
|
|
119
|
+
a network drive), `forgebook dev --poll` checks the files itself.
|
|
87
120
|
- **Switches** for theme, contrast and motion, and the languages you declare; a library adds its own (density, brand)
|
|
88
121
|
through a preset. A direction switch draws every story right to left, and a language declared `dir: "rtl"` does
|
|
89
122
|
it by itself.
|
|
@@ -97,10 +130,20 @@ Badge's page shows its stories, each in its own frame, and an API table read fro
|
|
|
97
130
|
control whose value is not its default.
|
|
98
131
|
- **Touch on the computer**: the Touch switch turns the mouse into a finger for the stories, two with Shift
|
|
99
132
|
([below](#touch)); `forgebook dev --touch` opens Chromium with its real touch emulation.
|
|
133
|
+
- **Hooks and functions**: stories about logic, not looks, document a hook with its signature first
|
|
134
|
+
([below](#hooks-and-functions)).
|
|
100
135
|
- **Widths** to draw a story at, and a **compare** view that draws the same story once per value of one or two
|
|
101
136
|
switches (every theme at both contrasts), per text size or per style sheet, side by side.
|
|
102
137
|
- **Props from the types**: the API table and the panel's controls come from the component's TypeScript props and
|
|
103
138
|
their TSDoc, nothing written twice.
|
|
139
|
+
- **Props in groups**: a component with many props lists them under the groups their TSDoc names (`@group Paging`),
|
|
140
|
+
and a prop typed with a documented object (`texts?: FinderTexts`) unfolds to list its members
|
|
141
|
+
([below](#props-in-groups)).
|
|
142
|
+
- **Shared values, checked**: the values set in the Props tab stay in the address (`args=`), so a link shares them.
|
|
143
|
+
Since whoever writes a link chooses them, a story receives only the props it declares (its component's props, its
|
|
144
|
+
`argTypes`, its own args) that the panel lets a person set, each with a value of that prop's type; anything else
|
|
145
|
+
(`onclick`, `innerHTML`, a text for a number) is left out and listed above the story, with a button that removes it
|
|
146
|
+
from the address. A value that is code never comes from a link.
|
|
104
147
|
- **The worst case in one press**: the Props tab's Worst case button gives every text prop a long text with a word too
|
|
105
148
|
long to break and every number a huge one, kept in the address; the elements that then spill out of their parents
|
|
106
149
|
are outlined and counted, as the browser tests find them. Reset undoes it.
|
|
@@ -110,12 +153,18 @@ Badge's page shows its stories, each in its own frame, and an API table read fro
|
|
|
110
153
|
component (Tree renders Row, Row renders DropLine), each with the stories to open; read from the types, never kept
|
|
111
154
|
by hand. It shows only when there is such a use; a reader folds it away; `usedIn: false` in the configuration turns
|
|
112
155
|
it off.
|
|
156
|
+
- **The design beside the code**: a component's or a story's Figma link gives it a link to Figma and, with
|
|
157
|
+
`@forgebook/plugin-figma`, a Design tab and a side-by-side view ([below](#design-links)).
|
|
113
158
|
- **Interaction states and motion**: `:hover`, `:active`, `:focus`, `:focus-visible` and `:focus-within` forced on a
|
|
114
159
|
story without a pointer; motion replayed on demand.
|
|
115
160
|
- **Packages as sources**: a library ships its stories (`StorySource`), and an app's catalogue lists them beside its
|
|
116
|
-
own, each with its name, logo and
|
|
117
|
-
-
|
|
118
|
-
|
|
161
|
+
own, each with its name, logo, texts and design tokens.
|
|
162
|
+
- **Docs pages**: guides and foundations in Markdown, with live stories inside, in a section of their own above the
|
|
163
|
+
components ([below](#docs-pages)).
|
|
164
|
+
- **Search across everything**: `/` or ⌘K, and the words find docs pages, props, events, descriptions, stories and names
|
|
165
|
+
([below](#search)).
|
|
166
|
+
- **`CATALOG.md`** for coding agents: `forgebook docs` writes one dense line per component, hook, helper, design token
|
|
167
|
+
and docs page of a package, from its exports, their TSDoc, its stories and its source.
|
|
119
168
|
- **Tests from the stories**, with [`@forgebook/testing`](https://www.npmjs.com/package/@forgebook/testing): every
|
|
120
169
|
story in the browser with axe, spills and overlays, screenshots, and every story rendered on the server.
|
|
121
170
|
|
|
@@ -124,7 +173,7 @@ It adds about a dozen packages to a React and Vite project.
|
|
|
124
173
|
## The toolbar
|
|
125
174
|
|
|
126
175
|
The View menu holds every control: the catalogue's switches, and Forgebook's own (the background, the style sheets, the
|
|
127
|
-
text size, the story's width). The catalogue says which start on the toolbar and which it does without; each
|
|
176
|
+
text size, the story's width, [who a page is read by](#who-reads-a-page)). The catalogue says which start on the toolbar and which it does without; each audience
|
|
128
177
|
then pins, orders and hides them, and that arrangement stays in their browser, per catalogue, never in the address
|
|
129
178
|
(a link shares the values, not someone's toolbar).
|
|
130
179
|
|
|
@@ -134,18 +183,27 @@ export default defineConfig({
|
|
|
134
183
|
framework: react(),
|
|
135
184
|
title: "My components",
|
|
136
185
|
stories: ["src/**/*.stories.tsx"],
|
|
137
|
-
// what starts on the toolbar, in this order: a switch's id, or "backdrop", "sheets", "text", "width"
|
|
186
|
+
// what starts on the toolbar, in this order: a switch's id, or "backdrop", "sheets", "text", "width", "audience"
|
|
138
187
|
toolbar: ["theme", "contrast", "width", "text"],
|
|
139
188
|
// Forgebook's own controls this catalogue does without (direction: false drops the direction switch)
|
|
140
189
|
controls: { sheets: false }
|
|
141
190
|
});
|
|
142
191
|
```
|
|
143
192
|
|
|
144
|
-
Without `toolbar`, the colour scheme, the contrast and the
|
|
193
|
+
Without `toolbar`, the colour scheme, the contrast, the width and the device start there. A control turned off in `controls`
|
|
145
194
|
shows nowhere, not even on the toolbar, and keeps its default (the width can still be dragged on the stage). A preset
|
|
146
195
|
may set both; the catalogue's `toolbar` wins, and a control is off when any of them turns it off. A name in `toolbar`
|
|
147
196
|
that is no control at all stops the catalogue with an error saying which.
|
|
148
197
|
|
|
198
|
+
The Background control offers Forgebook's five pictures and the catalogue's own:
|
|
199
|
+
`backgrounds: { builtIn: ["checkerboard"], custom: [{ id: "paper", label: "Paper", light: { color: "#fffdf5" } }] }`
|
|
200
|
+
keeps one picture and adds a plain paper colour (`layers` puts CSS backgrounds over it, `dark` sets another look for the
|
|
201
|
+
dark scheme). Code that reads the resolved settings (`catalogueSettings` from `forgebook/catalogue`) finds each in
|
|
202
|
+
`backdrops`, in one of two shapes. Forgebook's own is `{ kind: "builtIn", id, label, colors }`: only the frame draws its
|
|
203
|
+
picture, so the settings carry its colours, not its picture. A catalogue's is `{ kind: "own", id, label, colors, layers }`,
|
|
204
|
+
its picture being `layers`. `colors` and `layers` are both `{ light, dark }`. The colour under a backdrop in the dark
|
|
205
|
+
scheme is `backdrop.colors.dark`; a custom backdrop's CSS for the light one is `backdrop.layers.light`.
|
|
206
|
+
|
|
149
207
|
## Touch
|
|
150
208
|
|
|
151
209
|
The Touch switch (in View, `m` by default) lets a story be tried as on a phone, from the computer:
|
|
@@ -174,12 +232,478 @@ Safari need a device. For real touch events and native scrolling, `forgebook dev
|
|
|
174
232
|
Chromium window with Chromium's own touch emulation (it needs `@forgebook/testing` and Playwright, as `check` does).
|
|
175
233
|
`controls: { touch: false }` takes the switch away.
|
|
176
234
|
|
|
235
|
+
## Devices
|
|
236
|
+
|
|
237
|
+
At phone and tablet sizes a story can be shown inside a drawn device, as a browser's device mode shows a page. The
|
|
238
|
+
Device control (on the toolbar after the width, and in View beside Touch) says what is shown, "No frame" or the model,
|
|
239
|
+
turns the frame off or picks a model; while a device is shown, a button beside it turns it on its side, and the
|
|
240
|
+
width's presets wait, since the device sets the width. The story gets
|
|
241
|
+
the model's real viewport (its width and its height), the screen's rounded corners clip it, and the status bar, the
|
|
242
|
+
camera's cut and the home indicator sit over it where the device has them. The choice is in the address
|
|
243
|
+
(`forgebook.device=pixel-9&forgebook.orientation=landscape`, under Forgebook's name so a catalogue's own `device` or
|
|
244
|
+
`orientation` switch keeps its parameter), so a link shares it; the compare view puts a device in each cell. The
|
|
245
|
+
control's id, for a configuration's `toolbar` and `controls`, is the same: `controls: { "forgebook.device": false }`
|
|
246
|
+
takes it away (a story's own default still frames it).
|
|
247
|
+
|
|
248
|
+
A story in a device is touched with the catalogue's simulated finger, as a phone is (see Touch below): the reader can
|
|
249
|
+
turn that off for it, as for a story marked for a phone, and a device that should keep the mouse says
|
|
250
|
+
`touch: false`.
|
|
251
|
+
|
|
252
|
+
| Model | Id | Viewport |
|
|
253
|
+
|---|---|---|
|
|
254
|
+
| iPhone 16 | `iphone-16` | 393 × 852 |
|
|
255
|
+
| iPhone 16 Pro Max | `iphone-16-pro-max` | 440 × 956 |
|
|
256
|
+
| iPhone 16e | `iphone-16e` | 390 × 844 |
|
|
257
|
+
| Pixel 9 | `pixel-9` | 412 × 923 |
|
|
258
|
+
| Galaxy S24 | `galaxy-s24` | 360 × 780 |
|
|
259
|
+
| Generic phone | `phone` | 360 × 800 |
|
|
260
|
+
| iPad mini | `ipad-mini` | 744 × 1133 |
|
|
261
|
+
| iPad Pro 13″ | `ipad-pro-13` | 1032 × 1376 |
|
|
262
|
+
|
|
263
|
+
The story is drawn inside the device's safe areas, as a page in a phone's browser is: the status bar, the camera's cut
|
|
264
|
+
and the home indicator take their room around it (59 and 34 px on an iPhone 16 upright, the sides on its side), and
|
|
265
|
+
the story's viewport is what is left (393 × 759). A story that draws edge to edge, as a full-screen app does, says
|
|
266
|
+
`edgeToEdge: true`: it gets the whole screen, and the frame tells it the safe areas as custom properties on its root,
|
|
267
|
+
`--forgebook-safe-area-top`, `-right`, `-bottom` and `-left`, since browsers keep `env(safe-area-inset-*)` at zero in
|
|
268
|
+
a frame. Read them with the real insets as the fallback, so the same CSS works on a phone:
|
|
269
|
+
|
|
270
|
+
```css
|
|
271
|
+
.screen {
|
|
272
|
+
padding-top: var(--forgebook-safe-area-top, env(safe-area-inset-top));
|
|
273
|
+
}
|
|
274
|
+
```
|
|
275
|
+
|
|
276
|
+
An id names a model for good: it is never renamed or removed, and a new model gets a new id.
|
|
277
|
+
|
|
278
|
+
A story meant for a device says so, on its page and on its component's page:
|
|
279
|
+
|
|
280
|
+
```tsx
|
|
281
|
+
export default {
|
|
282
|
+
title: "Screens/Settings",
|
|
283
|
+
component: Settings,
|
|
284
|
+
// every story of the file in an iPhone 16; a story's own fields win
|
|
285
|
+
parameters: { device: { frame: true, model: "iphone-16" } }
|
|
286
|
+
} satisfies Meta<typeof Settings>;
|
|
287
|
+
|
|
288
|
+
export const Landscape: Story<typeof Settings> = { parameters: { device: { orientation: "landscape" } } };
|
|
289
|
+
|
|
290
|
+
// under the status bar, padded with the safe areas the frame tells it
|
|
291
|
+
export const FullScreen: Story<typeof Settings> = { parameters: { device: { edgeToEdge: true } } };
|
|
292
|
+
|
|
293
|
+
// in the iPhone, with the mouse
|
|
294
|
+
export const Pointer: Story<typeof Settings> = { parameters: { device: { touch: false } } };
|
|
295
|
+
```
|
|
296
|
+
|
|
297
|
+
A catalogue sets the default under every story with `device` in its configuration (`device: { model: "pixel-9" }`
|
|
298
|
+
only picks the model the button turns on). Nothing is framed for a catalogue and a story that set nothing. The reader's
|
|
299
|
+
choice wins over both: turned off, a framed story shows without its device.
|
|
300
|
+
|
|
301
|
+
The device is the shell's: the story's own document is the same, so the generated tests and `forgebook shot` stay
|
|
302
|
+
unframed, unless a view names a model (`forgebook shot <id> --view "iphone-16"`, or `"dark pixel-9 landscape"`), which
|
|
303
|
+
gives the picture framed (`portrait` and `landscape` need a model beside them; a catalogue's switch with a value
|
|
304
|
+
named like a model keeps the word, so write `forgebook.device=phone` then). The drawing and its styles load the first time a device is shown.
|
|
305
|
+
|
|
306
|
+
## Hooks and functions
|
|
307
|
+
|
|
308
|
+
A story can be about logic, not looks: a small scene that uses a hook or a function, there to document and try what it
|
|
309
|
+
does. It says so with `parameters: { logic: true }`, on the meta for every story of the file (a story's own `false`
|
|
310
|
+
leaves it out), written plainly: only the index reads it, so one written by code is a problem. Its meta's `component`
|
|
311
|
+
is the hook or the function, and each story has a `render` that draws its scene. In React, `LogicMeta` and `LogicStory` type
|
|
312
|
+
it (`@forgebook/react`):
|
|
313
|
+
|
|
314
|
+
```tsx
|
|
315
|
+
import type { LogicMeta, LogicStory } from "@forgebook/react";
|
|
316
|
+
|
|
317
|
+
import { useUndo } from "./useUndo";
|
|
318
|
+
|
|
319
|
+
export default { title: "Hooks/useUndo", component: useUndo, parameters: { logic: true } } satisfies LogicMeta<
|
|
320
|
+
typeof useUndo
|
|
321
|
+
>;
|
|
322
|
+
|
|
323
|
+
/** A counter whose steps can be undone and redone. */
|
|
324
|
+
export const History: LogicStory = { render: () => <Counter />, play: async ({ canvasElement }) => { /* … */ } };
|
|
325
|
+
```
|
|
326
|
+
|
|
327
|
+
The catalogue marks it in the sidebar and beside its title; the component's page shows the call, a table of the
|
|
328
|
+
parameters (their types and `@param` texts) and the return value (`@returns`) in place of a props table; the story's
|
|
329
|
+
panel opens on Signature, with no tab of args (its scene takes none), and the bar puts away what only changes the looks
|
|
330
|
+
(the colour scheme, the contrast, the style sheets, the text size, the backdrop; the View menu still offers them) and
|
|
331
|
+
Compare: the story is drawn once, never compared. A section of its own is a title's
|
|
332
|
+
first segment, as for any component (`Hooks/useUndo` is under Hooks; the source's `families` orders the sections).
|
|
333
|
+
`@forgebook/testing` tests it once, not in every look, and takes no reference image of it.
|
|
334
|
+
|
|
335
|
+
## Who reads a page
|
|
336
|
+
|
|
337
|
+
A component's page holds what a designer, a coder and a tester each want, in an order that suits none of them. **Reading
|
|
338
|
+
for**, in the View menu, draws the same page for one of them. It is not another page: the frames stay where they are and
|
|
339
|
+
keep their state, and what goes around them is reordered and filtered.
|
|
340
|
+
|
|
341
|
+
| Reading for | First | Left out | Added |
|
|
342
|
+
|---|---|---|---|
|
|
343
|
+
| Everyone | The page as it always was | Nothing | Nothing |
|
|
344
|
+
| Designers | When to use it, then a larger demo | Code, the API reference, the sections on parts and test ids | Docs pages that show it, its design tokens |
|
|
345
|
+
| Coders | The API reference, parts and styling | Nothing | Every example's code, open |
|
|
346
|
+
| Testers | What the stories cover: each story, its group, its play function, whether the generated tests run it | The API reference, sections that are not about testing, "Used in" | A check of every story's accessibility, on request |
|
|
347
|
+
|
|
348
|
+
The address keeps it (`?component=…&audience=designer`), so a link opens the page as it was read, and the page says so with
|
|
349
|
+
a way back to all of it; it is not part of a named view, which holds how stories are drawn. A catalogue can start with another audience, pin the control, give it a key or do without it:
|
|
350
|
+
|
|
351
|
+
```ts
|
|
352
|
+
// forgebook.config.ts
|
|
353
|
+
export default defineConfig({
|
|
354
|
+
framework: react(),
|
|
355
|
+
title: "My components",
|
|
356
|
+
stories: ["src/**/*.stories.tsx"],
|
|
357
|
+
audience: "designer",
|
|
358
|
+
toolbar: ["theme", "audience"],
|
|
359
|
+
keys: { audience: "r" }
|
|
360
|
+
});
|
|
361
|
+
```
|
|
362
|
+
|
|
363
|
+
With `controls: { audience: false }` the catalogue's `audience` is the only one, whatever an address says, and the page
|
|
364
|
+
offers no way back. Names change
|
|
365
|
+
through `strings` (`"audiences.coder": "Developers"`, and `"audienceTexts.coverage"` for what the pages add).
|
|
366
|
+
|
|
367
|
+
A designer's guidance comes from the component's TSDoc (`@useWhen`, `@avoidWhen`, `@alternatives`, `@deprecated`,
|
|
368
|
+
`@replacedBy`). Tokens are those named after the component (`select.border`, `component.select.height`), the rest closed
|
|
369
|
+
under them, and load only when such a page is drawn. A play function is noted when the file writes it for the story: its
|
|
370
|
+
own, the meta's, or from a story of the file it spreads. In a documentation file, sections are told apart by the English
|
|
371
|
+
words of their `##` headings: parts, styling, test ids, hooks, API and props are left out for a designer, with every code
|
|
372
|
+
block; a tester gets accessibility, keyboard, states and test ids, or the whole file when no heading says any of them.
|
|
373
|
+
|
|
374
|
+
## Props in groups
|
|
375
|
+
|
|
376
|
+
A component with forty props reads better in groups. Name a prop's group in its TSDoc, with the `@group` tag TypeDoc
|
|
377
|
+
reads too:
|
|
378
|
+
|
|
379
|
+
```tsx
|
|
380
|
+
export type FinderProps = {
|
|
381
|
+
/** The query. */
|
|
382
|
+
readonly query?: string;
|
|
383
|
+
/**
|
|
384
|
+
* The page shown.
|
|
385
|
+
*
|
|
386
|
+
* @group Paging
|
|
387
|
+
*/
|
|
388
|
+
readonly page?: number;
|
|
389
|
+
/**
|
|
390
|
+
* The texts it shows, for a translation.
|
|
391
|
+
*
|
|
392
|
+
* @group Texts
|
|
393
|
+
*/
|
|
394
|
+
readonly texts?: FinderTexts;
|
|
395
|
+
};
|
|
396
|
+
```
|
|
397
|
+
|
|
398
|
+
- The API reference lists the props that name no group first, then each group under its name, in the order the
|
|
399
|
+
groups first appear among the props; the events keep their own heading after them. The Props tab does the same: the
|
|
400
|
+
props that name no group by control, as before, then each group with its controls, its toggles and the props it
|
|
401
|
+
cannot set.
|
|
402
|
+
- Every group starts open; a reader folds one away from its name.
|
|
403
|
+
- To show some groups first, name them in order: `propGroups: ["Selection", "Paging"]` in the configuration for every
|
|
404
|
+
component, or `parameters: { propGroups: ["Texts"] }` in a component's meta, written as a list of plain strings.
|
|
405
|
+
The meta's come first, then the configuration's, then the rest as they appear. Nothing named, nothing changes.
|
|
406
|
+
- A prop whose type is an object the package declares, with TSDoc on at least one member (`FinderTexts`), has a
|
|
407
|
+
"members" button beside its type: it lists the members under the row, with their types, defaults and TSDoc. Only one
|
|
408
|
+
level, and only once unfolded, so large text types cost the page nothing until read.
|
|
409
|
+
- With `eslint-plugin-tsdoc`, declare the tag in your `tsdoc.json`:
|
|
410
|
+
`{ "tagName": "@group", "syntaxKind": "block", "allowMultiple": false }`.
|
|
411
|
+
|
|
412
|
+
## Docs pages
|
|
413
|
+
|
|
414
|
+
Guides, foundations and recipes are Markdown files with a little front matter, not MDX: a page is read at build time, and
|
|
415
|
+
nothing is compiled in the browser. A project lists them in its configuration (`docs: ["docs/**/*.md"]`); a
|
|
416
|
+
library gives them with its source, so every catalogue that shows it gets them:
|
|
417
|
+
|
|
418
|
+
```ts
|
|
419
|
+
// packages/ui/stories.ts
|
|
420
|
+
import docs from "./docs/**/*.md?forgebook-docs-pages";
|
|
421
|
+
import files from "./src/**/*.stories.tsx?forgebook-files";
|
|
422
|
+
|
|
423
|
+
export const source: StorySource = { id: "acme", name: "Acme UI", files: [files], docs: [docs], sheets };
|
|
424
|
+
```
|
|
425
|
+
|
|
426
|
+
A page says where it goes, then writes what it has to say; a fence named `story` draws a story in its frame, one named
|
|
427
|
+
`props` a component's API table from its types:
|
|
428
|
+
|
|
429
|
+
````md
|
|
430
|
+
---
|
|
431
|
+
title: Guides/Theming
|
|
432
|
+
order: 2
|
|
433
|
+
description: How the library follows the catalogue's theme.
|
|
434
|
+
---
|
|
435
|
+
|
|
436
|
+
The buttons read their colours from the page's theme.
|
|
437
|
+
|
|
438
|
+
```story acme:actions-button--primary
|
|
439
|
+
```
|
|
440
|
+
|
|
441
|
+
## Search
|
|
442
|
+
|
|
443
|
+
The field at the top of the sidebar searches the whole catalogue. The tree filters by name as you type, for browsing;
|
|
444
|
+
beside it a list ranks everything the words find, each component or page with what matched inside it and why (a prop,
|
|
445
|
+
an event, a heading, a sentence, a story), the words marked. `/` or ⌘K (Ctrl+K) comes to the field from anywhere, ↑ and ↓
|
|
446
|
+
move, Enter opens at the exact heading or prop, ⌘Enter or a modified press opens a new tab, Escape empties the field.
|
|
447
|
+
|
|
448
|
+
A prop has an address of its own, so a link to one can be pasted anywhere: `?component=acme:inputs-select#prop.value`,
|
|
449
|
+
and `#prop.Group.label` for a prop of a part named in `subcomponents`. A heading of a component's documentation file
|
|
450
|
+
has one too (`#accessibility`), as a docs page's has.
|
|
451
|
+
|
|
452
|
+
There is no search server and nothing to set up: the plugin builds the index with the catalogue, and the shell loads it
|
|
453
|
+
the first time someone types, so a reader who never searches pays nothing. A static build searches as the dev server
|
|
454
|
+
does. Only what the page does not already hold goes in the index: under 4 KB gzipped for a small library of ten components
|
|
455
|
+
with their documentation and a few guides. On a dev server, the first search waits for your packages' TypeScript for the props; names and docs
|
|
456
|
+
pages answer first.
|
|
457
|
+
|
|
458
|
+
Search and `forgebook find` rank alike, with the same synonyms: `modal` finds a `Dialog`, and a name counts more than a
|
|
459
|
+
sentence. A sentence copied from a page finds that page first. Change the words people see with `strings`, as any
|
|
460
|
+
other text of the shell (`"search.kindPage": "Guides"`).
|
|
461
|
+
|
|
462
|
+
## The props
|
|
463
|
+
|
|
464
|
+
```props acme:actions-button
|
|
465
|
+
```
|
|
466
|
+
|
|
467
|
+
See [the colours](./colours.md#brand), or [every state](?component=acme:actions-button).
|
|
468
|
+
````
|
|
469
|
+
|
|
470
|
+
- `title` places the page: `Guides/Theming` is a page of the group Guides. Without one, the file's opening `#` heading
|
|
471
|
+
or its name; `order` sorts the pages, lower first, then the pages without one by title. The address is
|
|
472
|
+
`?page=acme:guides-theming`, and a heading's anchor follows it (`#the-props`), made as GitHub makes them.
|
|
473
|
+
- Stories load as they come near, follow the view's switches live, and keep their bar: their code, their box over the
|
|
474
|
+
page, a link to their own page. A story of another source works too: the id is the whole one `forgebook stories` lists.
|
|
475
|
+
- A link to another page is written to its file (`./colours.md#brand`), so it works in the repository too. Images are
|
|
476
|
+
relative to the file, and go through the build. A `story` or `props` fence sits in the page's own flow, or in a block
|
|
477
|
+
below (an aside, a tab, a step), not inside a plain list or quote.
|
|
478
|
+
- The page gets its look from the shell's palette, so a `shell.theme` and both appearances reach it; a page with two
|
|
479
|
+
headings or more lists them beside its text, or above it on a narrow page.
|
|
480
|
+
- `forgebook stories` and `forgebook pages` fail when a page names a story or a component that is not there, a link leads
|
|
481
|
+
to no page, an image is not a file of its package, or a block cannot be read; each problem gives its line and column
|
|
482
|
+
(`./docs/theming.md: line 12, column 1: …`), and the page still draws everything else.
|
|
483
|
+
- A page is trusted more than a story's code: a story runs in a frame on an origin of its own, while a page's raw HTML,
|
|
484
|
+
which Markdown lets it hold, runs in the catalogue itself (its links keep only web, mail and the catalogue's own
|
|
485
|
+
addresses). Review a page as you review code, and do not build a catalogue from pages, a library's included, you did
|
|
486
|
+
not write.
|
|
487
|
+
|
|
488
|
+
### Blocks
|
|
489
|
+
|
|
490
|
+
Blocks are written as Starlight, Docusaurus and VitePress write them, so a page reads well on GitHub too: `:::name`
|
|
491
|
+
opens a block, a line of the same colons closes it, `[label]` gives it a title (plain text, values included) and
|
|
492
|
+
`{key="value"}` its attributes. A block inside another has fewer colons than its parent. Everything is drawn at build time; the tabs alone bring a few lines of
|
|
493
|
+
script, with the docs pages' code, which only a page that opens loads.
|
|
494
|
+
|
|
495
|
+
````md
|
|
496
|
+
:::tip[Before you start]
|
|
497
|
+
Anything Markdown holds goes in a block, a story too:
|
|
498
|
+
|
|
499
|
+
```story acme:actions-button--primary
|
|
500
|
+
```
|
|
501
|
+
:::
|
|
502
|
+
|
|
503
|
+
> [!WARNING]
|
|
504
|
+
> GitHub's alerts are asides too: NOTE, TIP, IMPORTANT, WARNING (a caution) and CAUTION (a danger).
|
|
505
|
+
|
|
506
|
+
::::tabs{syncKey="package-manager"}
|
|
507
|
+
:::tab[pnpm]
|
|
508
|
+
```sh
|
|
509
|
+
pnpm add @acme/ui
|
|
510
|
+
```
|
|
511
|
+
:::
|
|
512
|
+
:::tab[npm]
|
|
513
|
+
```sh
|
|
514
|
+
npm install @acme/ui
|
|
515
|
+
```
|
|
516
|
+
:::
|
|
517
|
+
::::
|
|
518
|
+
|
|
519
|
+
:::steps
|
|
520
|
+
1. Install the package.
|
|
521
|
+
2. Wrap the app in its provider.
|
|
522
|
+
|
|
523
|
+
```tsx
|
|
524
|
+
<AcmeProvider theme="light">{app}</AcmeProvider>
|
|
525
|
+
```
|
|
526
|
+
:::
|
|
527
|
+
|
|
528
|
+
::::cards
|
|
529
|
+
:::card[Light and dark]
|
|
530
|
+
Every component follows the theme.
|
|
531
|
+
:::
|
|
532
|
+
::link-card[Theming]{href="./theming.md" description="How the colours are chosen."}
|
|
533
|
+
::::
|
|
534
|
+
````
|
|
535
|
+
|
|
536
|
+
| Block | What it draws |
|
|
537
|
+
|---|---|
|
|
538
|
+
| `:::note`, `:::tip`, `:::important`, `:::caution`, `:::danger` | An aside in its tone's colour; `[label]` replaces the tone's name as its title. |
|
|
539
|
+
| `> [!NOTE]` … `> [!CAUTION]` | The same asides, as GitHub writes them. |
|
|
540
|
+
| `::::tabs{syncKey="…"}` around `:::tab[Label]` | One panel at a time, keys ← → Home End. Tabs with the same `syncKey` (as Starlight names it) switch together, on every page, and the browser keeps the choice. |
|
|
541
|
+
| `:::steps` around one numbered list | Numbered steps; a step may hold code and stories. |
|
|
542
|
+
| `::::cards` around `:::card[Title]` and `::link-card` | Cards side by side, as many to a row as fit. |
|
|
543
|
+
| `::link-card[Title]{href="…" description="…"}` | A card that links to a page by its file, to an address of the catalogue (`?component=…`), or to another site. |
|
|
544
|
+
|
|
545
|
+
A block the page cannot read is reported with its line and column, and what it holds still draws: a name Forgebook does
|
|
546
|
+
not know (a `::` line it does not know stays as text; `:::warning` is pointed to `:::caution`), an attribute a block does
|
|
547
|
+
not take, a closing line with the wrong number of colons, a block never closed. A block starts at
|
|
548
|
+
a line's start; written after spaces, as under a list item, it is not read.
|
|
549
|
+
|
|
550
|
+
### Code
|
|
551
|
+
|
|
552
|
+
The line after a fence's backticks is read whole, as Expressive Code writes it:
|
|
553
|
+
|
|
554
|
+
````md
|
|
555
|
+
```tsx title="Button.tsx" {3} ins={4} del={5}
|
|
556
|
+
import { Button } from "@acme/ui";
|
|
557
|
+
|
|
558
|
+
export const Save = () => (
|
|
559
|
+
<Button tone="primary">Save</Button>
|
|
560
|
+
<Button>Save</Button>
|
|
561
|
+
);
|
|
562
|
+
```
|
|
563
|
+
|
|
564
|
+
```diff lang="tsx"
|
|
565
|
+
-const tone = "neutral";
|
|
566
|
+
+const tone = "primary";
|
|
567
|
+
```
|
|
568
|
+
````
|
|
569
|
+
|
|
570
|
+
`title="…"` names the code (a file, most often); `{1,4-6}` marks lines, `ins={…}` and `del={…}` mark them inserted or
|
|
571
|
+
deleted; `wrap` wraps long lines instead of scrolling. A `diff` fence marks its `+` and `-` lines: with `lang="tsx"` it is
|
|
572
|
+
code, its signs taken off and the rest coloured in that language; without, it is a patch, shown and copied as written. The
|
|
573
|
+
lines are `<mark>`, `<ins>` and `<del>` elements, so a screen reader says what changed, and Copy copies code as it reads
|
|
574
|
+
after the change: no diff signs, no deleted lines. A word the line does not read is a problem, with its
|
|
575
|
+
column.
|
|
576
|
+
|
|
577
|
+
### A home of your own
|
|
578
|
+
|
|
579
|
+
A catalogue's home lists the libraries and their families. To write your own, put `forgebook.home.md` beside the
|
|
580
|
+
configuration (or name another file with `home: "docs/home.md"`); without one, the home stays the generated one. It is a
|
|
581
|
+
docs page, with every block above, a few values and the generated home's pieces among your own words:
|
|
582
|
+
|
|
583
|
+
````md
|
|
584
|
+
---
|
|
585
|
+
description: "{{components}} components in {{libraries}} libraries, version {{version}}."
|
|
586
|
+
---
|
|
587
|
+
|
|
588
|
+
Our design system, for every product team.
|
|
589
|
+
|
|
590
|
+
:::tip[Start here]
|
|
591
|
+
Read [Getting started](./docs/getting-started.md), then pick a component.
|
|
592
|
+
:::
|
|
593
|
+
|
|
594
|
+
::recent
|
|
595
|
+
|
|
596
|
+
```story acme:actions-button--primary
|
|
597
|
+
```
|
|
598
|
+
|
|
599
|
+
::families[Components]{source="acme"}
|
|
600
|
+
|
|
601
|
+
::libraries
|
|
602
|
+
````
|
|
603
|
+
|
|
604
|
+
| Value | What it shows |
|
|
605
|
+
|---|---|
|
|
606
|
+
| `{{title}}` | The catalogue's name. |
|
|
607
|
+
| `{{version}}` | The `version` of the `package.json` the file belongs to, read at build time. |
|
|
608
|
+
| `{{components}}`, `{{stories}}` | How many components and listed stories the catalogue has. |
|
|
609
|
+
| `{{libraries}}`, `{{pages}}` | How many libraries have components, and how many docs pages there are. |
|
|
610
|
+
|
|
611
|
+
| Piece | What it draws |
|
|
612
|
+
|---|---|
|
|
613
|
+
| `::recent[Heading]` | The pages opened last, under "Recently opened" or your heading; nothing when there are none. |
|
|
614
|
+
| `::libraries{source="…"}` | Each library as the generated home shows it: its name and logo, its introduction, its pages and families. |
|
|
615
|
+
| `::families[Heading]{source="…"}` | The family cards alone. |
|
|
616
|
+
| `::pages[Heading]{source="…"}` | The docs pages' card alone. |
|
|
617
|
+
|
|
618
|
+
The title is the front matter's `title`, else the file's opening `#` heading, else the catalogue's name; `description` is
|
|
619
|
+
the lead under it. Values work in docs pages too, and a value is never read inside code, so a page can show `{{title}}`
|
|
620
|
+
itself in backticks; a name that is not a value (`{{name}}`) stays as written and is reported. The pieces belong to the home: on a docs page they are a problem. A link to a `.md` file opens that
|
|
621
|
+
page of the catalogue's own `docs`; a library's page is linked by its address (`?page=acme:guides-theming`). Problems in
|
|
622
|
+
the file are listed above the home and by `forgebook pages`, and `forgebook page home` reads it as an agent would. Restart
|
|
623
|
+
`forgebook dev` after adding or removing the file.
|
|
624
|
+
|
|
625
|
+
## Design links
|
|
626
|
+
|
|
627
|
+
A component carries its own link to Figma, on its meta; a story with a design of its own writes it over the meta's:
|
|
628
|
+
|
|
629
|
+
```ts
|
|
630
|
+
export default {
|
|
631
|
+
title: "Actions/Button",
|
|
632
|
+
component: Button,
|
|
633
|
+
parameters: { design: { figma: "https://www.figma.com/design/AbC123/Kit?node-id=12-34" } }
|
|
634
|
+
} satisfies Meta<typeof Button>;
|
|
635
|
+
|
|
636
|
+
export const Danger: Story<typeof Button> = {
|
|
637
|
+
parameters: { design: { figma: "https://www.figma.com/design/AbC123/Kit?node-id=56-78" } }
|
|
638
|
+
};
|
|
639
|
+
```
|
|
640
|
+
|
|
641
|
+
The component's header then links to Figma. With [`@forgebook/plugin-figma`](https://www.npmjs.com/package/@forgebook/plugin-figma)
|
|
642
|
+
listed in `plugins`, the story's panel has a **Design** tab with the node embedded and **Compare with the story**, the
|
|
643
|
+
story and its design side by side over the page, at the story's width and with the panel's values. Comparing is for your
|
|
644
|
+
eyes: Forgebook draws no overlay and gives no match percentage, because Figma and a browser render differently and such a
|
|
645
|
+
number would mislead. The tab loads, with Figma, only when opened. A docs page shows a design with a fence named `figma`, its
|
|
646
|
+
link after the name.
|
|
647
|
+
|
|
648
|
+
Write the link plainly, as a string: the index reads it without running the file, so a link written by code is a problem.
|
|
649
|
+
A link that is not `https` on `figma.com`, or does not name a `design`, `file`, `proto`, `board`, `slides` or `deck`, is
|
|
650
|
+
reported with the index's problems and never embedded; the component keeps its stories. What is kept of a link is its
|
|
651
|
+
file, branch and node, so a shared link's other parameters are dropped. A `design` parameter without
|
|
652
|
+
`figma` (Storybook's design addon uses the same name) is left alone.
|
|
653
|
+
|
|
654
|
+
Nothing here needs a Figma token: the embed shows what the reader's own Figma session or the file's sharing allows, and
|
|
655
|
+
a private file asks them to sign in, inside the embed. That sign-in needs the browser's storage access, so a reader who
|
|
656
|
+
blocks it uses Open in Figma. A catalogue published with a Content Security Policy allows
|
|
657
|
+
`frame-src https://embed.figma.com https://www.figma.com`. Turn the tab off with `tabs: { figma: false }`; the header's link stays.
|
|
658
|
+
|
|
659
|
+
`forgebook story` and `get_story` return `design`: the link, the `fileKey` and `nodeId` a Figma tool takes, and the
|
|
660
|
+
`address` of the Design tab to hand a person (it opens the story alone without the plugin). `list_stories` gives each component's, and `CATALOG.md` lists it.
|
|
661
|
+
|
|
177
662
|
## Coming from Storybook
|
|
178
663
|
|
|
179
664
|
Forgebook reads Storybook's story files as they are: CSF 3 and CSF 2 (`Template.bind({})`), titles of any depth and
|
|
180
665
|
titles from the file's path, `args` and `argTypes` (with their controls), actions from `fn()` or an `argTypes` action,
|
|
181
666
|
`play` with Testing Library (`@testing-library/dom` and `@testing-library/user-event`, optional peers), `loaders`,
|
|
182
|
-
`tags` (`!dev`, `!test`)
|
|
667
|
+
`tags` (`!dev`, `!test`), a story's `globals`, JSX in `.js` story files (listed and shown as code; Vite compiles JSX only in
|
|
668
|
+
`.jsx` and `.tsx`, so such a library adds the plugin its own Storybook uses for them, through the framework's plugins),
|
|
669
|
+
hooks in a `render` or a decorator (React and
|
|
670
|
+
Preact, with the story's state kept when a decorator draws `<Story />`), Storybook's preview hooks from
|
|
671
|
+
`storybook/preview-api` in a React story file (`useArgs`, whose update and reset change the story's args as the panel
|
|
672
|
+
would and show in it, a value the panel cannot show staying the story's; `useGlobals`, `useParameter` and
|
|
673
|
+
`useStoryContext` to read; its `useState`, `useEffect` and the rest, which are React's there; `useChannel` throws, since
|
|
674
|
+
Storybook's addons are not there), a preview's named exports beside its default
|
|
675
|
+
export, and the text values of its `globalTypes` defaults and `initialGlobals`, which its decorators read. The answers
|
|
676
|
+
to tools and agents read a preview's args and parameters on the server: a package it imports that only a browser can
|
|
677
|
+
load (Storybook's docs blocks, which read `document` as they load) is left as a placeholder there, which the preview can
|
|
678
|
+
keep in a parameter or call (an addon's factory), and what a call made can be looked into as `definePreview` does with
|
|
679
|
+
its `addons: [docs()]`; but the preview cannot read a member of an export, nor use any placeholder as a string, a number
|
|
680
|
+
or a list. A placeholder kept in args or parameters is left out of the answers, as a function is. A preview that still
|
|
681
|
+
cannot load (it uses one so, or one of its own files reads `document`) leaves the
|
|
682
|
+
answers working: it is left out of them and named among their problems, with what it used. A
|
|
683
|
+
`**` pattern skips `node_modules` unless it names it.
|
|
684
|
+
|
|
685
|
+
It lists what Storybook's indexer lists:
|
|
686
|
+
|
|
687
|
+
- every named export as a story, whatever writes its value: an object, a function, a helper's result
|
|
688
|
+
(`export const Chromatic = storiesFor(…)`), another constant (`export const Default: StoryFn = Template`) or a
|
|
689
|
+
re-export (`export { A as B }`, from the file or another module); `includeStories` and `excludeStories` leave some
|
|
690
|
+
out, as there;
|
|
691
|
+
- the meta written in place or held in a constant (`export default meta`, `export { meta as default }`);
|
|
692
|
+
- files with one title as one component: its stories come from every file, in the order of their paths, each with its
|
|
693
|
+
own file's meta, and its page takes the first file's docs and documentation file. Two stories with one id are a
|
|
694
|
+
problem, and the second is left out;
|
|
695
|
+
- Storybook's ids, so a link carries over: `inputs-readmore--open-by-default` for the title `Inputs/ReadMore` and the
|
|
696
|
+
export `OpenByDefault`, the meta's `id` in place of its title, and a story's own `parameters.__id`. An address,
|
|
697
|
+
`forgebook story`, `forgebook check` and the MCP tools still take the ids Forgebook gave before it followed
|
|
698
|
+
Storybook's (`inputs-read-more--open-by-default`), and open the story under its own; a picture stored under such an
|
|
699
|
+
id still counts as the story's baseline until `forgebook shot --update` stores one under its id.
|
|
700
|
+
|
|
701
|
+
A story without a `name` is named from its export's words as Storybook splits them, in sentence case
|
|
702
|
+
(`CustomSVGIcon` → "Custom SVG icon").
|
|
703
|
+
|
|
704
|
+
A component's props are read with the configuration an editor reads its story file with: the nearest `tsconfig.json`
|
|
705
|
+
up the file's folders that holds it, or a project it references. A monorepo whose packages hold only their sources
|
|
706
|
+
and whose root holds the stories, with the paths to the packages' sources, gets its props tables as Storybook does.
|
|
183
707
|
|
|
184
708
|
It does not read MDX, doc blocks or addons. Actions are explicit only: an `on*` prop is not turned into an action by
|
|
185
709
|
its name.
|
|
@@ -188,58 +712,404 @@ To try it on a Storybook project, run `npx forgebook init --from storybook` in t
|
|
|
188
712
|
writes `forgebook.config.ts`: the story globs of `main` (the MDX pages left out), the preview as Forgebook's preview,
|
|
189
713
|
and a switch for each toolbar global of the preview, applied by code as its decorators expect. `main` is loaded, so a
|
|
190
714
|
computed `stories` list is read too; the preview is read from its source, so only `globalTypes` written as plain values
|
|
191
|
-
become switches. It reads React
|
|
192
|
-
|
|
715
|
+
become switches. It reads React, Vue, Svelte, Preact, Solid, Web Components and plain HTML on Vite
|
|
716
|
+
(`@storybook/react-vite`, `@storybook/vue3-vite`, `@storybook/svelte-vite`, `@storybook/sveltekit` (whose
|
|
717
|
+
`sveltekit_experimental` parameters `@forgebook/sveltekit` reads as they are),
|
|
718
|
+
`@storybook/preact-vite`, `storybook-solidjs-vite`, `@storybook/web-components-vite`, `@storybook/html-vite`, and
|
|
719
|
+
Nuxt's `@storybook-vue/nuxt`), Angular (`@storybook/angular`, `@analogjs/storybook-angular`, with the TypeScript
|
|
720
|
+
configuration its stories were compiled with) and Next.js (`@storybook/nextjs-vite`, and `@storybook/nextjs` on webpack,
|
|
721
|
+
whose stories are the same), never replaces a configuration without `--force`, and lists what it left out. A Next.js
|
|
722
|
+
project gets `framework: nextjs()` and keeps its stories' `parameters.nextjs`:
|
|
723
|
+
[`@forgebook/nextjs`](https://github.com/ensiria/forgebook/blob/develop/packages/nextjs/README.md) says what it draws.
|
|
724
|
+
React Native is read from Storybook's React Native Web framework (`@storybook/react-native-web-vite`, its
|
|
725
|
+
`modulesToTranspile` kept), its older webpack addon, and on-device Storybook's `.rnstorybook` folder, whose stories then
|
|
726
|
+
draw in the browser through [`@forgebook/react-native-web`](https://www.npmjs.com/package/@forgebook/react-native-web).
|
|
727
|
+
|
|
728
|
+
## Monorepos
|
|
729
|
+
|
|
730
|
+
Each package hands its stories to one catalogue, a package of its own that imports nothing from the libraries but their
|
|
731
|
+
`stories` export. A package writes a source and exports it:
|
|
732
|
+
|
|
733
|
+
```ts
|
|
734
|
+
// packages/ui/stories.ts
|
|
735
|
+
/// <reference types="@forgebook/story-format/client" />
|
|
736
|
+
import type { StorySource } from "@forgebook/story-format/source";
|
|
737
|
+
|
|
738
|
+
import files from "./src/**/*.stories.tsx?forgebook-files";
|
|
739
|
+
|
|
740
|
+
export const source: StorySource = { id: "ui", name: "UI", files: [files] };
|
|
741
|
+
```
|
|
742
|
+
|
|
743
|
+
```jsonc
|
|
744
|
+
// packages/ui/package.json
|
|
745
|
+
{ "exports": { "./stories": "./stories.ts" } }
|
|
746
|
+
```
|
|
747
|
+
|
|
748
|
+
The catalogue depends on each package and lists their sources, and `watch` lets the dev server see story files added to
|
|
749
|
+
them:
|
|
750
|
+
|
|
751
|
+
```ts
|
|
752
|
+
// apps/catalogue/forgebook.config.ts
|
|
753
|
+
export default defineConfig({
|
|
754
|
+
framework: react(),
|
|
755
|
+
title: "Acme",
|
|
756
|
+
sources: ["@acme/ui/stories", "@acme/charts/stories"],
|
|
757
|
+
watch: ["../../packages/ui/src", "../../packages/charts/src"]
|
|
758
|
+
});
|
|
759
|
+
```
|
|
760
|
+
|
|
761
|
+
A story's id starts with its source's (`ui:actions-button--plain`), so two packages can both have a `Button`. Props are read
|
|
762
|
+
through the `tsconfig.json` that holds the story file: the package's own, or the first one up its folders that lists it. This repository's fixture catalogue is built this way, on two packages, and its
|
|
763
|
+
browser tests run in CI.
|
|
764
|
+
|
|
765
|
+
A monorepo that points its packages at their sources with an export condition (`"source": "./src/index.ts"` in
|
|
766
|
+
`exports`, and `source` in Vite's `resolve.conditions`, set by a framework's plugins) needs nothing more with the
|
|
767
|
+
`forgebook` command: its dev server reads the stories and previews it answers tools with on Node under the same
|
|
768
|
+
conditions, those of other runtimes (`browser`) aside, unless a plugin names the server's own.
|
|
193
769
|
|
|
194
770
|
## Commands
|
|
195
771
|
|
|
196
772
|
| Command | What it does |
|
|
197
773
|
|---|---|
|
|
198
774
|
| `forgebook dev` / `forgebook build` | Runs the catalogue of `forgebook.config.ts`, or builds it into static files |
|
|
775
|
+
| `forgebook prebundle` | Pre-bundles the catalogue's dependencies, as `dev` does on a first start: before it, in CI or an image |
|
|
199
776
|
| `forgebook stories` | Lists every story with its id and links; fails when the story index has problems |
|
|
200
777
|
| `forgebook story <id>` | One story: its args, its component's props, its links in a view (`--view theme=dark`) |
|
|
201
|
-
| `forgebook init --from storybook` | Writes `forgebook.config.ts` from a project's `.storybook` folder: its story globs, preview and toolbar globals |
|
|
778
|
+
| `forgebook init --from storybook` | Writes `forgebook.config.ts` from a project's `.storybook` (or on-device `.rnstorybook`) folder: its framework, story globs, preview and toolbar globals |
|
|
202
779
|
| `forgebook new <file>` | Writes a component's first stories from its props: the main story, one per choice, the worst case |
|
|
203
780
|
| `forgebook check <id>` | Runs the catalogue's browser checks on a story (or a component's stories): accessibility, spills, overlays, errors; with `@forgebook/testing` |
|
|
204
781
|
| `forgebook errors` | Lists what the open frames reported while you edited (a story that could not be shown, a failed play); `--follow` keeps listing |
|
|
205
|
-
| `forgebook shot <id>` | Takes a story's pictures, one PNG per view, at the view's width and the story's height; with `@forgebook/testing` |
|
|
782
|
+
| `forgebook shot <id>` | Takes a story's pictures, one PNG per view, at the view's width and the story's height (framed in a device a view names); with `@forgebook/testing` |
|
|
783
|
+
| `forgebook pages` | Lists the docs pages with their ids and addresses; fails when the index has problems |
|
|
784
|
+
| `forgebook page <id>` | One docs page's Markdown; its headings too with `--json` |
|
|
785
|
+
| `forgebook diff <id>` | Compares a story's pictures with the baselines `forgebook shot --update` stored: the region, the percentage and a marked picture; fails when anything differs |
|
|
206
786
|
| `forgebook mcp` | Serves the same answers to an agent over the Model Context Protocol |
|
|
207
|
-
| `forgebook
|
|
787
|
+
| `forgebook check-page` | Runs the checks on a real page of the application, by its address |
|
|
788
|
+
| `forgebook changed` | Lists the stories a change touches, through what they import |
|
|
789
|
+
| `forgebook verify` | Runs the checks on every story a change touches, with one exit code |
|
|
790
|
+
| `forgebook find` | Finds components by what they are for, in your own words |
|
|
791
|
+
| `forgebook search` | Searches the whole catalogue by its text: docs pages, props, descriptions, stories and names, with the address of each match |
|
|
792
|
+
| `forgebook tokens` | The design tokens, one of them, or the token nearest a value (`--nearest "#1c1b1b"`) |
|
|
793
|
+
| `forgebook check-code` | Checks what a change adds against the design system, with an exit code for CI |
|
|
794
|
+
| `forgebook agents` | Adds Forgebook's instructions to the project's `AGENTS.md` (and an [Agent Skill](https://agentskills.io) with `--skill`, in `.agents/skills` and `.claude/skills`) |
|
|
208
795
|
| `forgebook docs` | Writes a package's `CATALOG.md` and `llms.txt` from its exports, their TSDoc and its stories |
|
|
209
796
|
| `forgebook-texts` | Checks a package's story texts and lists what each language still has to translate |
|
|
210
797
|
|
|
211
798
|
Each command prints its options with `--help`; `stories` and `story` print JSON with `--json`.
|
|
212
799
|
|
|
800
|
+
`forgebook build` names each script it writes by its hash alone (`assets/3f9a1c2b.js`): a catalogue names every story
|
|
801
|
+
file's scripts once per loader, so shorter names make a smaller build. To read what a build holds, name each script after
|
|
802
|
+
its module too (`assets/Button-3f9a1c2b.js`), for one build with `forgebook build --readable-names`, or for every build in
|
|
803
|
+
the configuration:
|
|
804
|
+
|
|
805
|
+
```ts
|
|
806
|
+
export default defineConfig({ /* … */ build: { readableNames: true } });
|
|
807
|
+
```
|
|
808
|
+
|
|
809
|
+
A component's docs, a story file's code and a component's page are data, not scripts: a build writes each as a gzipped
|
|
810
|
+
`.bin` file, which the page unpacks when it shows it, or in the story index itself when it is shorter than that file
|
|
811
|
+
(a story file whose stories are all args has no code).
|
|
812
|
+
|
|
813
|
+
## Mocking an API
|
|
814
|
+
|
|
815
|
+
A story that fetches gets its answers from [MSW](https://mswjs.io), through
|
|
816
|
+
[`@forgebook/plugin-msw`](https://www.npmjs.com/package/@forgebook/plugin-msw). Install both, list the plugin, and write
|
|
817
|
+
MSW's worker into the catalogue's public folder:
|
|
818
|
+
|
|
819
|
+
```sh
|
|
820
|
+
npm install --save-dev msw @forgebook/plugin-msw
|
|
821
|
+
npx msw init public
|
|
822
|
+
```
|
|
823
|
+
|
|
824
|
+
```ts
|
|
825
|
+
// forgebook.config.ts
|
|
826
|
+
import { msw } from "@forgebook/plugin-msw";
|
|
827
|
+
|
|
828
|
+
export default defineConfig({ /* … */ plugins: [msw()] });
|
|
829
|
+
```
|
|
830
|
+
|
|
831
|
+
```tsx
|
|
832
|
+
import { http, HttpResponse } from "msw";
|
|
833
|
+
|
|
834
|
+
/** The list, from a mocked API. */
|
|
835
|
+
export const Loaded: Story<typeof Users> = {
|
|
836
|
+
parameters: {
|
|
837
|
+
msw: { handlers: [http.get("/api/users", () => HttpResponse.json([{ name: "Ada" }]))] }
|
|
838
|
+
}
|
|
839
|
+
};
|
|
840
|
+
```
|
|
841
|
+
|
|
842
|
+
`parameters.msw.handlers` is a list, or a record of lists as MSW's Storybook addon writes it, so those stories move over
|
|
843
|
+
unchanged. MSW loads only for a story that has handlers, and a request none of them answers goes to the network. On a
|
|
844
|
+
component page, where one worker serves every frame, each story's handlers answer its own frame only: a story with none
|
|
845
|
+
goes to the network. The panel's **Network** tab lists the story's handlers and its requests, each answered by a mock or
|
|
846
|
+
by the network, its query left out. It works on the dev server and in a static build. Without the plugin listed,
|
|
847
|
+
`parameters.msw` does nothing, and a story's requests reach the network.
|
|
848
|
+
|
|
849
|
+
## Plugins
|
|
850
|
+
|
|
851
|
+
A plugin is a package a catalogue lists; until it is listed, it adds nothing and costs nothing:
|
|
852
|
+
|
|
853
|
+
```ts
|
|
854
|
+
import { figma } from "@forgebook/plugin-figma";
|
|
855
|
+
import { msw } from "@forgebook/plugin-msw";
|
|
856
|
+
|
|
857
|
+
export default defineConfig({ /* … */ plugins: [figma(), msw()] });
|
|
858
|
+
```
|
|
859
|
+
|
|
860
|
+
A plugin can add a panel tab, a toolbar switch, a docs block, and what runs around a story in its frame; it cannot rearrange
|
|
861
|
+
the shell. Turn a plugin's tab off like any other (`tabs: { figma: false }`), rename it (`strings: { "tabs.figma": "Figma" }`)
|
|
862
|
+
or translate its texts (`strings: { "plugin.figma.compare": "Confronta" }`). `forgebook plugins --json` and `list_plugins`
|
|
863
|
+
say what a catalogue has.
|
|
864
|
+
|
|
865
|
+
The contract, with how to write one and what it leaves out, is [PLUGINS.md](https://github.com/ensiria/forgebook/blob/develop/packages/forgebook/PLUGINS.md).
|
|
866
|
+
|
|
867
|
+
## A preview for every pull request
|
|
868
|
+
`forgebook build` writes static files, so any static host gives each pull request its own catalogue, for free. `--base` is
|
|
869
|
+
for a host that serves it under a sub-path. A host that sets a `Content-Security-Policy` needs `blob:` in `script-src` for
|
|
870
|
+
the Accessibility card: a build keeps axe gzipped, and the frame runs it from a blob once unpacked. It also needs the
|
|
871
|
+
catalogue's own origin in `connect-src` (`'self'`): the page fetches the docs, code, pages and "Used in" a build keeps
|
|
872
|
+
gzipped. This workflow builds on
|
|
873
|
+
every pull request and keeps the result as an artefact; the last step is yours, and any host works:
|
|
874
|
+
```yaml
|
|
875
|
+
# .github/workflows/catalogue-preview.yml
|
|
876
|
+
name: catalogue preview
|
|
877
|
+
on:
|
|
878
|
+
pull_request:
|
|
879
|
+
permissions:
|
|
880
|
+
contents: read
|
|
881
|
+
jobs:
|
|
882
|
+
preview:
|
|
883
|
+
runs-on: ubuntu-latest
|
|
884
|
+
steps:
|
|
885
|
+
- uses: actions/checkout@v4
|
|
886
|
+
- uses: actions/setup-node@v4
|
|
887
|
+
with:
|
|
888
|
+
node-version: 24
|
|
889
|
+
cache: npm
|
|
890
|
+
- run: npm ci
|
|
891
|
+
- run: npx forgebook build --out preview --base "/pr-${{ github.event.number }}/"
|
|
892
|
+
- uses: actions/upload-artifact@v4
|
|
893
|
+
name: catalogue-preview
|
|
894
|
+
path: preview
|
|
895
|
+
# then publish the folder, for example:
|
|
896
|
+
# GitHub Pages: actions/upload-pages-artifact, then actions/deploy-pages (one site, so without --base per PR)
|
|
897
|
+
# Cloudflare: npx wrangler pages deploy preview --branch "pr-${{ github.event.number }}"
|
|
898
|
+
# Your server: rsync -az preview/ "user@host:/var/www/previews/pr-${{ github.event.number }}/"
|
|
899
|
+
A pull request from a fork gets no secrets, so a step that deploys only works for branches of your own repository.
|
|
900
|
+
## Stories on an origin of their own
|
|
901
|
+
|
|
902
|
+
A story's code, or a value a shared link puts in one of its props (an `href`, an `html`), runs in its frame. So that it
|
|
903
|
+
cannot read or act on the catalogue, the frames run on another origin than the catalogue's page:
|
|
904
|
+
|
|
905
|
+
- **On the dev server**, by default: a second port, the catalogue's + 1 (`forgebook dev` prints it as `Frames`). The
|
|
906
|
+
catalogue refuses what another origin's page asks of it, and the frames' port serves only the frame page, the public
|
|
907
|
+
folder and the modules your stories import: a frame cannot call the agent API (`/__forgebook/api/`) or read a file
|
|
908
|
+
of the project that no story imports. Choose the port with `--frame-port` or `frames: { port }`.
|
|
909
|
+
- **In a static build**, the frames share the catalogue's origin, unless you serve the same files from a second host
|
|
910
|
+
and name both, ideally two subdomains of one site (two different sites make the frame's cookies third-party):
|
|
911
|
+
|
|
912
|
+
```ts
|
|
913
|
+
export default defineConfig({
|
|
914
|
+
// …
|
|
915
|
+
frames: { origins: { catalogue: "https://ui.example.com", frames: "https://ui-frames.example.com" } }
|
|
916
|
+
});
|
|
917
|
+
```
|
|
918
|
+
|
|
919
|
+
`origins` also serves a dev server behind a proxy that gives each port a host of its own. `frames: "same-origin"` keeps
|
|
920
|
+
the frames on the catalogue's origin everywhere, for a place that opens one port only; then a story's code can reach the
|
|
921
|
+
catalogue as before; `forgebook dev --frames same-origin` does the same for one run, and `--frames isolated` the reverse. What the frames could use on the catalogue's origin still works on theirs: storage, cookies, MSW's
|
|
922
|
+
worker, the clipboard, full screen, the camera and the microphone. A story's link can no longer take the catalogue's
|
|
923
|
+
tab to another address.
|
|
924
|
+
|
|
925
|
+
What stays reachable from a frame: the code it runs (your stories, their components, what the catalogue imports), the
|
|
926
|
+
errors Vite sends every page while you edit, and `forgebook errors`, where a frame reports its own errors. If the
|
|
927
|
+
default port is taken, the frames move to the next free one, so their storage moves with them; give `--frame-port` to
|
|
928
|
+
keep it.
|
|
929
|
+
|
|
930
|
+
An embed (`?embed`) and an MCP client's inline preview are pages of the catalogue's origin that frame the story on the
|
|
931
|
+
frames' origin in turn, as the catalogue does: a page or a host that frames them names the catalogue's origin only (in
|
|
932
|
+
its `frame-src`, in the preview's `frameDomains`).
|
|
933
|
+
|
|
934
|
+
## Your look in the shell
|
|
935
|
+
The catalogue's page can take your library's colours, fonts and corners. Nothing runs in the browser for it: the theme is
|
|
936
|
+
written into the page at build, and the frames are left alone, since they belong to your stories.
|
|
937
|
+
```ts
|
|
938
|
+
// forgebook.config.ts
|
|
939
|
+
shell: {
|
|
940
|
+
theme: {
|
|
941
|
+
light: { accent: "#7036c4", "accent-text": "#5a2aa0" },
|
|
942
|
+
dark: { accent: "#b28bff" },
|
|
943
|
+
fonts: { sans: "Inter, sans-serif" },
|
|
944
|
+
radius: { control: "4px", card: "8px" }
|
|
945
|
+
}
|
|
946
|
+
Every role is optional, and typed by `ShellTheme` (`import type { ShellTheme } from "forgebook/shell-theme"`): the grounds
|
|
947
|
+
`window`, `sidebar`, `surface`; `separator`, `hover`; the texts `text`, `text-secondary`, `text-tertiary`, `accent-text`,
|
|
948
|
+
`danger-text`; `accent`; and the `code-*` colours. Renaming or removing a role is a breaking change. A preset can give a
|
|
949
|
+
theme too, and the catalogue's wins role by role.
|
|
950
|
+
The reader's Appearance menu also offers **Follow the story**, where the catalogue has a theme switch: a dark story in a
|
|
951
|
+
dark shell. It stays on the system's while comparing, since several themes share the stage. `appearance: "story"` makes
|
|
952
|
+
it the catalogue's default; a reader's own choice always wins.
|
|
953
|
+
When the catalogue starts, a role that does not exist is named, and so is a hex colour that leaves a text or code under
|
|
954
|
+
4.5:1 on its ground, or the accent, which draws the keyboard's focus, under 3:1. Other colour notations are not checked.
|
|
955
|
+
Fonts are yours to load: a web font goes in a style sheet of your own, `shell.css`, with `@font-face`. That sheet loads
|
|
956
|
+
after the shell's. It is also an escape hatch, since the shell's class names are not public API and can change in any
|
|
957
|
+
release. Layout is not themable, though a font does change how wide text runs.
|
|
958
|
+
|
|
959
|
+
## Embedding and white-label
|
|
960
|
+
|
|
961
|
+
Add `embed` to a story's address and the catalogue's page shows that story alone, with no sidebar, toolbar or panel, in
|
|
962
|
+
your theme: paste it in a wiki, in Notion, or in an iframe of your own.
|
|
963
|
+
|
|
964
|
+
```html
|
|
965
|
+
<iframe src="https://ui.example.com/?embed&story=acme:button--primary&theme=dark" title="Button" width="100%" height="320" style="border: 0"></iframe>
|
|
966
|
+
```
|
|
967
|
+
|
|
968
|
+
The story bar's **Embed** button gives the link and this code for the story and view on screen, with the values set in the
|
|
969
|
+
panel; `forgebook story <id>` and the `story_address` tool give the same link as `links.embed`. The switches, the
|
|
970
|
+
background, the language, `args`, `width` and `height` are read from the address; the stage's own settings (compare, zoom,
|
|
971
|
+
the panel, the device frame) are not. The story stays live, and it fills the box it gets, scrolling inside it when it is taller. Docs pages will
|
|
972
|
+
be embedded the same way once they exist, and oEmbed, so that a wiki can turn a pasted link into a frame on its own, comes
|
|
973
|
+
later.
|
|
974
|
+
|
|
975
|
+
A page of your own can follow the story's height. An embed posts `{ type: "forgebook:embed-size", height }` to the page around
|
|
976
|
+
it, and the Embed button's **Follow the story's height** adds the few lines that listen. Check `event.source` and
|
|
977
|
+
`event.origin` in your own listener, as those lines do. The story needs `allow-scripts allow-same-origin` if you sandbox the
|
|
978
|
+
iframe, since its modules are loaded as those of its own origin.
|
|
979
|
+
|
|
980
|
+
An embed sends nothing but the height and listens to nothing from the page around it, and it keeps working where a browser
|
|
981
|
+
denies a third-party frame its storage. What it does take from outside is its address: like the catalogue's own `args`, the
|
|
982
|
+
address reaches the story's props, so a story that renders a prop as raw HTML should not be published for anyone to frame.
|
|
983
|
+
And a height says something: a page that can reach your catalogue can tell whether a story exists.
|
|
984
|
+
|
|
985
|
+
Forgebook sets no framing headers, on the dev server or in a build, so what you host keeps the rules it has. To choose who may
|
|
986
|
+
frame your catalogue, answer with `Content-Security-Policy: frame-ancestors` on your own server, which is the way to protect a
|
|
987
|
+
private one; `X-Frame-Options: DENY` turns embedding off. `controls: { embed: false }` takes the button away, not the address,
|
|
988
|
+
since any page can frame what it can open.
|
|
989
|
+
|
|
990
|
+
To leave no trace of Forgebook's mark, turn the branding off:
|
|
991
|
+
|
|
992
|
+
```ts
|
|
993
|
+
// forgebook.config.ts
|
|
994
|
+
title: "Acme UI",
|
|
995
|
+
logo: "acme.svg",
|
|
996
|
+
shell: { branding: false }
|
|
997
|
+
```
|
|
998
|
+
|
|
999
|
+
The sidebar then shows your logo and title, or your title alone without a logo, and the page's icon is your logo or none.
|
|
1000
|
+
It is on by default. The theme reaches everything Forgebook draws: the catalogue, an embed around its story, its loading and
|
|
1001
|
+
missing-story messages, and the box a frame shows when a story fails.
|
|
1002
|
+
|
|
213
1003
|
## For agents
|
|
214
1004
|
|
|
215
1005
|
`forgebook agents` gives a project's coding agents what they need without being told: how to write a story file here,
|
|
216
1006
|
and the commands that check one, as a section of `AGENTS.md` (renewed in place when it runs again; `--skill` writes
|
|
217
|
-
the same as
|
|
1007
|
+
the same as an Agent Skill any agent can load).
|
|
218
1008
|
|
|
219
1009
|
A coding agent can use the catalogue while it works: find a story's id, read a story's args and its component's
|
|
220
1010
|
props, and hand a person the link that opens it. Add the MCP server to the project's agent configuration, for
|
|
221
1011
|
example `.mcp.json` for Claude Code:
|
|
222
1012
|
|
|
1013
|
+
```
|
|
1014
|
+
|
|
1015
|
+
A library with design tokens (`tokens` in the configuration) can theme the shell from them in a few lines. Each role takes the
|
|
1016
|
+
token's value in both appearances, its `light` and `dark` themes first; colours written by hand win, and a token that
|
|
1017
|
+
is not there or is no colour is warned about and leaves the shell's own. The theme is read when the configuration is, so
|
|
1018
|
+
restart after editing the tokens.
|
|
1019
|
+
|
|
1020
|
+
```ts
|
|
1021
|
+
shell: { theme: { fromTokens: { accent: "color.brand.primary", surface: "color.background.card" } } }
|
|
223
1022
|
```json
|
|
224
1023
|
{ "mcpServers": { "forgebook": { "command": "npx", "args": ["forgebook", "mcp"] } } }
|
|
225
1024
|
```
|
|
226
1025
|
|
|
227
|
-
It offers
|
|
1026
|
+
It offers eighteen tools: `visual_diff`, `check_code`, `check_page`, which checks a real page of the application, `list_stories`, `changed_stories`, `find_component`, which finds a component by what it is for, `get_story`, `story_address`, `new_stories`, which writes a component's first stories from its props and answers the text without writing a file, `check_story`, which runs the catalogue's browser checks on a story and answers its problems (the project needs `@forgebook/testing` and Playwright for it), `recent_errors`, what the frames open in a browser reported while the agent edited (numbered: `since` gives only the new ones), and `story_shot`, a story's pictures in the answer itself, so the agent looks at what it made, `list_pages` and `get_page`, which read the catalogue's docs pages as Markdown, and `search_catalogue`, the search people use. `check`, `shot` and their tools take a view in the address's form (`theme=dark&width=360`) or as words (`"dark it 360"`); every story's `links.component` opens its component's page in that view, so `--view audience=designer` on `forgebook story` and `get_story` gives a link to send a designer. `get_story` also gives the components whose stories use the story's component (`usedIn`), so an agent finds a real use before writing one; `list_stories` gives it for every component when asked (`usedIn: true`, or `forgebook stories --used-in`), since it reads the package's import graph. Run from the catalogue's folder (or give
|
|
228
1027
|
`--config`), it uses the running `forgebook dev` when there is one, and starts a dev server of its own otherwise,
|
|
229
|
-
kept while the agent's session lasts
|
|
1028
|
+
kept while the agent's session lasts; that server keeps its pre-bundled dependencies in
|
|
1029
|
+
`node_modules/.vite/forgebook-commands`, apart from those of a `forgebook dev` running in the same folder. The links name `http://localhost:5173` unless `--url` (or `FORGEBOOK_URL`) says
|
|
230
1030
|
where `forgebook dev` runs.
|
|
231
1031
|
|
|
1032
|
+
`get_story` gives a story's design too (`design`, [above](#design-links)), so an agent can read the node with a Figma tool
|
|
1033
|
+
and compare it with `story_shot`.
|
|
1034
|
+
|
|
1035
|
+
#### Inline previews
|
|
1036
|
+
|
|
1037
|
+
A client that renders [MCP Apps](https://github.com/modelcontextprotocol/ext-apps/blob/main/specification/2026-01-26/apps.mdx)
|
|
1038
|
+
gets one more tool, `story_preview`, and the page `ui://forgebook/story-preview` to show its answer in: the story, live,
|
|
1039
|
+
inside the conversation, with a button that opens it in the catalogue. Any other client gets the answers it always got:
|
|
1040
|
+
the tool is not listed, and `story_shot` is how it sees a story. Nothing runs until the tool is called: a client may read
|
|
1041
|
+
the page ahead of time, and that starts no server and loads no story. When no `forgebook dev` runs, one is started for the
|
|
1042
|
+
first preview and kept for the session.
|
|
1043
|
+
|
|
1044
|
+
The story comes from a local server, and the host decides whether it gets in. A browser refuses a public page's frame to
|
|
1045
|
+
a local address (Chromium's Local Network Access), so a host whose app runs on a public origin, as a web client's does,
|
|
1046
|
+
shows the story's picture instead: the page asks the host to run `story_shot`, and needs Playwright as that tool does. The
|
|
1047
|
+
page's words are replaceable as the shell's are (`strings`): `previewOpen`, `previewWaiting`, `previewLoading`,
|
|
1048
|
+
`previewTakingPicture`, `previewUnavailable`, `previewCancelled`, `previewPicture`, `previewFrame`.
|
|
1049
|
+
|
|
1050
|
+
A component's TSDoc can say what a person knows and an agent cannot guess: `@useWhen`, `@avoidWhen`, `@alternatives`,
|
|
1051
|
+
`@deprecated` and `@replacedBy`. `forgebook story` and `get_story` return them as `docs.guidance`.
|
|
1052
|
+
The most common mistake of an agent working on a design system is a colour or a size written by hand. Name your
|
|
1053
|
+
[DTCG](https://www.designtokens.org/tr/2025.10/) files in the configuration, the base first and each theme in a file of
|
|
1054
|
+
its own, and agents can ask what to write instead:
|
|
1055
|
+
```ts
|
|
1056
|
+
tokens: ["tokens.json", { file: "dark.tokens.json", mode: "dark" }]
|
|
1057
|
+
```
|
|
1058
|
+
A library gives its tokens to every catalogue that shows it: the same list on its source, by path from the module that
|
|
1059
|
+
declares the source. It is read from that module's text, never by running it, so a broken story cannot hide a token: write
|
|
1060
|
+
it in the object of `export const source`, with plain strings and paths inside the package. A source re-exported or
|
|
1061
|
+
spread from another module gives no tokens.
|
|
1062
|
+
```ts
|
|
1063
|
+
export const source: StorySource = { id: "acme-ui", tokens: ["tokens.json"] /* … */ };
|
|
1064
|
+
```
|
|
1065
|
+
A catalogue reads each source's files in its `sources` order, then its own, so its aliases reach a library's palette. When
|
|
1066
|
+
two authors give one token different values in the same theme the last stands, which makes the catalogue's own the final
|
|
1067
|
+
word: it is what puts the libraries together. The answer says so in `clashes` (`kept`, `replaced`), the command warns,
|
|
1068
|
+
and neither fails: a clash is a choice to review, not a token that cannot be read. A file over another may write only
|
|
1069
|
+
`$value`: the token keeps its type, description and deprecation.
|
|
1070
|
+
```sh
|
|
1071
|
+
npx forgebook tokens --category color --json
|
|
1072
|
+
npx forgebook tokens --nearest "#1c1b1b" --json # the nearest tokens, and whether each is really close
|
|
1073
|
+
`forgebook mcp` offers the same as `list_tokens`, `get_token` and `nearest_token`. References (`{a.b}`, `$ref`), `$extends`
|
|
1074
|
+
and `$root` are followed, and a base alias follows what a theme overrides. Deprecated tokens are never suggested. Colours
|
|
1075
|
+
in sRGB, Display P3, Oklab, Oklch and HSL are compared; other spaces are listed but counted as `uncompared`. A theme can
|
|
1076
|
+
reference the base; a `$ref` reaches only its own file.
|
|
1077
|
+
|
|
1078
|
+
An agent that cannot find a component writes a new one, often because the code and the designers use different words.
|
|
1079
|
+
`forgebook build --agent-index` adds `forgebook-agent.json` to the built catalogue, and `forgebook mcp --from <address or
|
|
1080
|
+
folder>` serves it with no dev server and no repository: a team that consumes a published library gives its agents
|
|
1081
|
+
`list_stories`, `get_story`, `story_address`, `find_component` and the token tools. It holds your stories' props, docs and
|
|
1082
|
+
tokens, and anyone who reaches the site can read it, so it is written only when asked. From a folder, links are paths.
|
|
1083
|
+
|
|
1084
|
+
`forgebook find` and `find_component` search names, the meta's `keywords`, titles and stories, with the usual synonyms
|
|
1085
|
+
(`modal` finds a `Dialog`): write `keywords: ["radio tile group"]` on `OptionCards` and it is found.
|
|
1086
|
+
`forgebook search` and `search_catalogue` read the rest, with the same ranking: a prop's name, a sentence of a docs page,
|
|
1087
|
+
each result with the words it missed and the address that opens the exact heading or prop.
|
|
1088
|
+
|
|
1089
|
+
`forgebook check <id> --semantic` also asks a model what axe cannot see: whether a heading describes its section, an
|
|
1090
|
+
image's text says what it shows, a label says what its control does. It is off unless asked, and sends each story's
|
|
1091
|
+
accessibility tree and picture to the OpenAI-compatible API in `FORGEBOOK_SEMANTIC_URL`, with `FORGEBOOK_SEMANTIC_MODEL` and,
|
|
1092
|
+
when it needs one, `FORGEBOOK_SEMANTIC_KEY`. No model comes with Forgebook and no key is stored. What it answers lands in
|
|
1093
|
+
`judgements`, apart from the problems, as an opinion: it does not fail the check.
|
|
1094
|
+
|
|
1095
|
+
`forgebook check-code` and `check_code` read what a change adds, new files included, from where it left `--since`: a colour
|
|
1096
|
+
written by hand, with the token to use when one clearly fits; a size that equals a token; a check turned off with no
|
|
1097
|
+
reason (`@ts-ignore`, `eslint-disable`, `biome-ignore`, `stylelint-disable`); a test deleted. Only styles and components
|
|
1098
|
+
are read for values: stories, tests, token definitions and generated files are left alone. A fix is a token's name, not
|
|
1099
|
+
code to paste. It does not check props, imports or deprecated components. It exits non-zero on a problem, for CI.
|
|
1100
|
+
|
|
232
1101
|
A library tells agents what it offers with `forgebook docs`, run in its folder: `CATALOG.md`, one dense line per
|
|
233
1102
|
component, hook, helper and style module (what it is, how to import it, its props, the id of a story that shows it),
|
|
234
|
-
and
|
|
1103
|
+
docs page and design token of its source (its value, each theme's, what it aliases, what it is for), and `llms.txt`,
|
|
1104
|
+
which points an agent to it and links the pages. The file's name, its sections and the subpaths left out are set in the
|
|
235
1105
|
package's `package.json`:
|
|
236
1106
|
|
|
237
1107
|
```json
|
|
238
|
-
{ "forgebook": { "catalog": { "file": "CATALOG.md", "sections": ["components", "modules"], "exclude": ["./internal/*"] } } }
|
|
1108
|
+
{ "forgebook": { "catalog": { "file": "CATALOG.md", "sections": ["components", "pages", "modules"], "exclude": ["./internal/*"] } } }
|
|
239
1109
|
```
|
|
240
1110
|
|
|
241
|
-
`forgebook docs --check` fails in CI when either file is stale. In CI, `forgebook stories --json` fails on a broken story file (a title taken twice, a title that cannot be placed)
|
|
242
|
-
and its JSON lists every story for a script.
|
|
1111
|
+
`forgebook docs --check` fails in CI when either file is stale. In CI, `forgebook stories --json` fails on a broken story file (a title taken twice, a title that cannot be placed) or a
|
|
1112
|
+
docs page that names what is not there, and its JSON lists every story for a script.
|
|
243
1113
|
|
|
244
1114
|
## Packages
|
|
245
1115
|
|
|
@@ -247,8 +1117,21 @@ and its JSON lists every story for a script.
|
|
|
247
1117
|
|---|---|
|
|
248
1118
|
| `forgebook` | The catalogue: the shell, the frame, the Vite plugin, the commands |
|
|
249
1119
|
| [`@forgebook/react`](https://www.npmjs.com/package/@forgebook/react) | React's story types, renderer and props reader |
|
|
1120
|
+
| [`@forgebook/vue`](https://www.npmjs.com/package/@forgebook/vue) | Vue's story types, renderer and props, events and slots reader |
|
|
1121
|
+
| [`@forgebook/svelte`](https://www.npmjs.com/package/@forgebook/svelte) | Svelte's story types, renderer and props, snippets and callback props reader |
|
|
1122
|
+
| [`@forgebook/sveltekit`](https://www.npmjs.com/package/@forgebook/sveltekit) | SvelteKit on Svelte's adapter: `$app/state`, navigation, forms, paths, the environment and a page's `load` in a story |
|
|
1123
|
+
| [`@forgebook/solid`](https://www.npmjs.com/package/@forgebook/solid) | Solid's story types, renderer (args update in place) and props reader |
|
|
1124
|
+
| [`@forgebook/preact`](https://www.npmjs.com/package/@forgebook/preact) | Preact's story types, renderer (on Preact itself, no compat) and props reader |
|
|
1125
|
+
| [`@forgebook/web-components`](https://www.npmjs.com/package/@forgebook/web-components) | Web Components' story types, Lit renderer, and reader of the Custom Elements Manifest |
|
|
1126
|
+
| [`@forgebook/html`](https://www.npmjs.com/package/@forgebook/html) | Plain HTML's story types, renderer and args reader, for stories with no framework |
|
|
1127
|
+
| [`@forgebook/angular`](https://www.npmjs.com/package/@forgebook/angular) | Angular's and Analog's story types and helpers, renderer, and inputs, outputs and content reader |
|
|
1128
|
+
| [`@forgebook/react-native-web`](https://www.npmjs.com/package/@forgebook/react-native-web) | React Native's components in the browser, through react-native-web |
|
|
1129
|
+
| [`@forgebook/nextjs`](https://www.npmjs.com/package/@forgebook/nextjs) | A Next.js project's components outside Next.js: images, fonts, links, both routers, server components |
|
|
1130
|
+
| [`@forgebook/nuxt`](https://www.npmjs.com/package/@forgebook/nuxt) | A Nuxt project's components outside Nuxt, on Vue's |
|
|
250
1131
|
| [`@forgebook/story-format`](https://www.npmjs.com/package/@forgebook/story-format) | The story format, for a library whose stories must not depend on a catalogue |
|
|
251
1132
|
| [`@forgebook/testing`](https://www.npmjs.com/package/@forgebook/testing) | Tests generated from the stories |
|
|
1133
|
+
| [`@forgebook/plugin-figma`](https://www.npmjs.com/package/@forgebook/plugin-figma) | A story's design in the panel, and beside the story |
|
|
1134
|
+
| [`@forgebook/plugin-msw`](https://www.npmjs.com/package/@forgebook/plugin-msw) | A story's API answered by its handlers, and a Network tab |
|
|
252
1135
|
|
|
253
1136
|
## Contributing
|
|
254
1137
|
|