@brett_lamy/docstream 1.3.0 → 1.5.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 +79 -5
- package/dist/assets.d.ts +3 -0
- package/dist/assets.d.ts.map +1 -0
- package/dist/assets.js +20 -0
- package/dist/assets.js.map +1 -0
- package/dist/demo/DemoViewer.d.ts +78 -0
- package/dist/demo/DemoViewer.d.ts.map +1 -0
- package/dist/demo/DemoViewer.js +467 -0
- package/dist/demo/DemoViewer.js.map +1 -0
- package/dist/demo/clipboard.d.ts +70 -0
- package/dist/demo/clipboard.d.ts.map +1 -0
- package/dist/demo/clipboard.js +187 -0
- package/dist/demo/clipboard.js.map +1 -0
- package/dist/demo/context.d.ts +20 -0
- package/dist/demo/context.d.ts.map +1 -0
- package/dist/demo/context.js +31 -0
- package/dist/demo/context.js.map +1 -0
- package/dist/demo/copy-demo.d.ts +23 -0
- package/dist/demo/copy-demo.d.ts.map +1 -0
- package/dist/demo/copy-demo.js +81 -0
- package/dist/demo/copy-demo.js.map +1 -0
- package/dist/demo/glob.d.ts +60 -0
- package/dist/demo/glob.d.ts.map +1 -0
- package/dist/demo/glob.js +158 -0
- package/dist/demo/glob.js.map +1 -0
- package/dist/demo/index.d.ts +16 -0
- package/dist/demo/index.d.ts.map +1 -0
- package/dist/demo/index.js +9 -0
- package/dist/demo/index.js.map +1 -0
- package/dist/demo/markdown.d.ts +60 -0
- package/dist/demo/markdown.d.ts.map +1 -0
- package/dist/demo/markdown.js +181 -0
- package/dist/demo/markdown.js.map +1 -0
- package/dist/demo/surface.d.ts +11 -0
- package/dist/demo/surface.d.ts.map +1 -0
- package/dist/demo/surface.js +69 -0
- package/dist/demo/surface.js.map +1 -0
- package/dist/demo/types.d.ts +91 -0
- package/dist/demo/types.d.ts.map +1 -0
- package/dist/demo/types.js +2 -0
- package/dist/demo/types.js.map +1 -0
- package/dist/demo/vfs.d.ts +51 -0
- package/dist/demo/vfs.d.ts.map +1 -0
- package/dist/demo/vfs.js +156 -0
- package/dist/demo/vfs.js.map +1 -0
- package/dist/docs/CollapsibleCode.d.ts +14 -0
- package/dist/docs/CollapsibleCode.d.ts.map +1 -0
- package/dist/docs/CollapsibleCode.js +19 -0
- package/dist/docs/CollapsibleCode.js.map +1 -0
- package/dist/docs/DocsRenderer.d.ts +55 -0
- package/dist/docs/DocsRenderer.d.ts.map +1 -0
- package/dist/docs/DocsRenderer.js +279 -0
- package/dist/docs/DocsRenderer.js.map +1 -0
- package/dist/docs/HighlightedCode.d.ts +6 -0
- package/dist/docs/HighlightedCode.d.ts.map +1 -0
- package/dist/docs/HighlightedCode.js +40 -0
- package/dist/docs/HighlightedCode.js.map +1 -0
- package/dist/docs/Mermaid.d.ts +7 -0
- package/dist/docs/Mermaid.d.ts.map +1 -0
- package/dist/docs/Mermaid.js +39 -0
- package/dist/docs/Mermaid.js.map +1 -0
- package/dist/docs/PageActions.d.ts +33 -0
- package/dist/docs/PageActions.d.ts.map +1 -0
- package/dist/docs/PageActions.js +115 -0
- package/dist/docs/PageActions.js.map +1 -0
- package/dist/docs/controls.d.ts +29 -0
- package/dist/docs/controls.d.ts.map +1 -0
- package/dist/docs/controls.js +46 -0
- package/dist/docs/controls.js.map +1 -0
- package/dist/docs/copy.d.ts +24 -0
- package/dist/docs/copy.d.ts.map +1 -0
- package/dist/docs/copy.js +62 -0
- package/dist/docs/copy.js.map +1 -0
- package/dist/docs/math.d.ts +3 -0
- package/dist/docs/math.d.ts.map +1 -0
- package/dist/docs/math.js +12 -0
- package/dist/docs/math.js.map +1 -0
- package/dist/docs/reference.d.ts +27 -0
- package/dist/docs/reference.d.ts.map +1 -0
- package/dist/docs/reference.js +73 -0
- package/dist/docs/reference.js.map +1 -0
- package/dist/docs/tabs-sync.d.ts +5 -0
- package/dist/docs/tabs-sync.d.ts.map +1 -0
- package/dist/docs/tabs-sync.js +58 -0
- package/dist/docs/tabs-sync.js.map +1 -0
- package/dist/gitbook/ast.d.ts +506 -0
- package/dist/gitbook/ast.d.ts.map +1 -0
- package/dist/gitbook/ast.js +8 -0
- package/dist/gitbook/ast.js.map +1 -0
- package/dist/gitbook/attrs.d.ts +14 -0
- package/dist/gitbook/attrs.d.ts.map +1 -0
- package/dist/gitbook/attrs.js +36 -0
- package/dist/gitbook/attrs.js.map +1 -0
- package/dist/gitbook/flatten.d.ts +14 -0
- package/dist/gitbook/flatten.d.ts.map +1 -0
- package/dist/gitbook/flatten.js +45 -0
- package/dist/gitbook/flatten.js.map +1 -0
- package/dist/gitbook/index.d.ts +10 -0
- package/dist/gitbook/index.d.ts.map +1 -0
- package/dist/gitbook/index.js +8 -0
- package/dist/gitbook/index.js.map +1 -0
- package/dist/gitbook/inline.d.ts +28 -0
- package/dist/gitbook/inline.d.ts.map +1 -0
- package/dist/gitbook/inline.js +956 -0
- package/dist/gitbook/inline.js.map +1 -0
- package/dist/gitbook/outline.d.ts +16 -0
- package/dist/gitbook/outline.d.ts.map +1 -0
- package/dist/gitbook/outline.js +44 -0
- package/dist/gitbook/outline.js.map +1 -0
- package/dist/gitbook/package-managers.d.ts +12 -0
- package/dist/gitbook/package-managers.d.ts.map +1 -0
- package/dist/gitbook/package-managers.js +93 -0
- package/dist/gitbook/package-managers.js.map +1 -0
- package/dist/gitbook/parse.d.ts +44 -0
- package/dist/gitbook/parse.d.ts.map +1 -0
- package/dist/gitbook/parse.js +1113 -0
- package/dist/gitbook/parse.js.map +1 -0
- package/dist/gitbook/serialize.d.ts +23 -0
- package/dist/gitbook/serialize.d.ts.map +1 -0
- package/dist/gitbook/serialize.js +498 -0
- package/dist/gitbook/serialize.js.map +1 -0
- package/dist/index.d.ts +34 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +24 -0
- package/dist/index.js.map +1 -0
- package/dist/openapi/OpenApiOperation.d.ts +6 -0
- package/dist/openapi/OpenApiOperation.d.ts.map +1 -0
- package/dist/openapi/OpenApiOperation.js +112 -0
- package/dist/openapi/OpenApiOperation.js.map +1 -0
- package/dist/playground/InlineDemoPreview.d.ts +24 -0
- package/dist/playground/InlineDemoPreview.d.ts.map +1 -0
- package/dist/playground/InlineDemoPreview.js +48 -0
- package/dist/playground/InlineDemoPreview.js.map +1 -0
- package/dist/playground/PlaygroundStreamdown.d.ts +16 -0
- package/dist/playground/PlaygroundStreamdown.d.ts.map +1 -0
- package/dist/playground/PlaygroundStreamdown.js +22 -0
- package/dist/playground/PlaygroundStreamdown.js.map +1 -0
- package/dist/playground/ReactCodePreview.d.ts +64 -0
- package/dist/playground/ReactCodePreview.d.ts.map +1 -0
- package/dist/playground/ReactCodePreview.js +108 -0
- package/dist/playground/ReactCodePreview.js.map +1 -0
- package/dist/playground/filesystem.d.ts +27 -0
- package/dist/playground/filesystem.d.ts.map +1 -0
- package/dist/playground/filesystem.js +65 -0
- package/dist/playground/filesystem.js.map +1 -0
- package/dist/playground/index.d.ts +9 -0
- package/dist/playground/index.d.ts.map +1 -0
- package/dist/playground/index.js +7 -0
- package/dist/playground/index.js.map +1 -0
- package/dist/playground/project.d.ts +57 -0
- package/dist/playground/project.d.ts.map +1 -0
- package/dist/playground/project.js +137 -0
- package/dist/playground/project.js.map +1 -0
- package/dist/replay/NativeReplay.d.ts +9 -0
- package/dist/replay/NativeReplay.d.ts.map +1 -0
- package/dist/replay/NativeReplay.js +173 -0
- package/dist/replay/NativeReplay.js.map +1 -0
- package/dist/replay/ReplayPreview.d.ts +33 -0
- package/dist/replay/ReplayPreview.d.ts.map +1 -0
- package/dist/replay/ReplayPreview.js +91 -0
- package/dist/replay/ReplayPreview.js.map +1 -0
- package/dist/replay/index.d.ts +5 -0
- package/dist/replay/index.d.ts.map +1 -0
- package/dist/replay/index.js +4 -0
- package/dist/replay/index.js.map +1 -0
- package/dist/replay/sanitize.d.ts +4 -0
- package/dist/replay/sanitize.d.ts.map +1 -0
- package/dist/replay/sanitize.js +86 -0
- package/dist/replay/sanitize.js.map +1 -0
- package/dist/replay/url.d.ts +8 -0
- package/dist/replay/url.d.ts.map +1 -0
- package/dist/replay/url.js +41 -0
- package/dist/replay/url.js.map +1 -0
- package/dist/source/SourcePreview.d.ts +13 -0
- package/dist/source/SourcePreview.d.ts.map +1 -0
- package/dist/source/SourcePreview.js +47 -0
- package/dist/source/SourcePreview.js.map +1 -0
- package/dist/source/client.d.ts +7 -0
- package/dist/source/client.d.ts.map +1 -0
- package/dist/source/client.js +52 -0
- package/dist/source/client.js.map +1 -0
- package/dist/source/index.d.ts +6 -0
- package/dist/source/index.d.ts.map +1 -0
- package/dist/source/index.js +3 -0
- package/dist/source/index.js.map +1 -0
- package/dist/source/types.d.ts +33 -0
- package/dist/source/types.d.ts.map +1 -0
- package/dist/source/types.js +2 -0
- package/dist/source/types.js.map +1 -0
- package/dist/streamdown.d.ts +19 -0
- package/dist/streamdown.d.ts.map +1 -0
- package/dist/streamdown.js +15 -0
- package/dist/streamdown.js.map +1 -0
- package/dist/styles.css +2441 -0
- package/dist/video/VideoEmbed.d.ts +17 -0
- package/dist/video/VideoEmbed.d.ts.map +1 -0
- package/dist/video/VideoEmbed.js +12 -0
- package/dist/video/VideoEmbed.js.map +1 -0
- package/dist/video/index.d.ts +3 -0
- package/dist/video/index.d.ts.map +1 -0
- package/dist/video/index.js +2 -0
- package/dist/video/index.js.map +1 -0
- package/dist/vite/index.d.ts +21 -0
- package/dist/vite/index.d.ts.map +1 -0
- package/dist/vite/index.js +137 -0
- package/dist/vite/index.js.map +1 -0
- package/dist/viz/VizEmbed.d.ts +18 -0
- package/dist/viz/VizEmbed.d.ts.map +1 -0
- package/dist/viz/VizEmbed.js +12 -0
- package/dist/viz/VizEmbed.js.map +1 -0
- package/dist/viz/index.d.ts +4 -0
- package/dist/viz/index.d.ts.map +1 -0
- package/dist/viz/index.js +3 -0
- package/dist/viz/index.js.map +1 -0
- package/package.json +65 -32
- package/src/demo/DemoViewer.tsx +56 -11
- package/src/demo/clipboard.ts +228 -0
- package/src/demo/context.ts +7 -0
- package/src/demo/copy-demo.tsx +102 -0
- package/src/demo/index.ts +29 -2
- package/src/demo/vfs.ts +197 -0
- package/src/docs/DocsRenderer.tsx +13 -4
- package/src/docs/Mermaid.tsx +5 -3
- package/src/index.ts +19 -0
- package/src/replay/ReplayPreview.tsx +0 -1
- package/src/streamdown.tsx +2 -0
- package/src/styles.css +91 -0
- package/src/replay/styles.css +0 -87
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/demo/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,2BAA2B,EAAE,uBAAuB,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAA;AACvI,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,UAAU,EAAE,cAAc,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AACvH,OAAO,EACL,wBAAwB,EACxB,gBAAgB,EAChB,wBAAwB,EACxB,oCAAoC,EACpC,YAAY,EACZ,uBAAuB,EACvB,4BAA4B,EAC5B,qBAAqB,EACrB,YAAY,EACZ,uBAAuB,EACvB,sBAAsB,EACtB,2BAA2B,EAC3B,uBAAuB,GACxB,MAAM,aAAa,CAAA;AACpB,YAAY,EACV,+BAA+B,EAC/B,kBAAkB,EAClB,kBAAkB,EAClB,sBAAsB,EACtB,yBAAyB,EACzB,iBAAiB,GAClB,MAAM,aAAa,CAAA;AACpB,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAC9D,YAAY,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AACrE,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,iBAAiB,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,OAAO,CAAA;AACtG,YAAY,EAAE,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,sBAAsB,EAAE,MAAM,OAAO,CAAA;AACzF,YAAY,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AACxE,OAAO,EACL,sBAAsB,EACtB,iBAAiB,EACjB,cAAc,EACd,QAAQ,EACR,eAAe,EACf,aAAa,GACd,MAAM,QAAQ,CAAA;AACf,YAAY,EAAE,uBAAuB,EAAE,MAAM,QAAQ,CAAA;AACrD,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,cAAc,EAAE,sBAAsB,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAC3H,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AACtD,YAAY,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AACvF,YAAY,EACV,aAAa,EACb,kBAAkB,EAClB,QAAQ,EACR,QAAQ,EACR,YAAY,EACZ,kBAAkB,EAClB,WAAW,EACX,iBAAiB,EACjB,sBAAsB,GACvB,MAAM,SAAS,CAAA"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export { DocstreamDemoContext, DocstreamDemoRuntimeContext, DocstreamDemoVFSContext, useDemoResolver, useDemoRuntime } from "./context.js";
|
|
2
|
+
export { DemoBlock, DemoFullscreen, DemoViewer, peekDemoSource, prefetchDemoSources, preloadDemos } from "./DemoViewer.js";
|
|
3
|
+
export { DOCSTREAM_CLIPBOARD_TYPE, collectDemoNodes, createDocstreamClipboard, createDocstreamClipboardFromMarkdown, demoNodeMeta, docstreamClipboardItems, docstreamPayloadFromMarkdown, hasDocstreamClipboard, mapDemoNodes, parseDocstreamClipboard, readDocstreamClipboard, readDocstreamClipboardItems, writeDocstreamClipboard, } from "./clipboard.js";
|
|
4
|
+
export { CopyDemoButton, useDocstreamCopy } from "./copy-demo.js";
|
|
5
|
+
export { createDemoVFS, useDemoVFS, useDemoVFSContext, useDemoVFSEntry, useDemoVFSFiles } from "./vfs.js";
|
|
6
|
+
export { createGlobDemoResolver, demoComponentFrom, demoFromSearch, demoHref, languageForPath, sortDemoFiles, } from "./glob.js";
|
|
7
|
+
export { defaultDemoMarkdown, inlineDemoMarkdown, inlineDemoNode, resolveDemosToMarkdown, toInlineFiles } from "./markdown.js";
|
|
8
|
+
export { cssToSurface, surfaceToCss } from "./surface.js";
|
|
9
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/demo/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,2BAA2B,EAAE,uBAAuB,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAA;AACvI,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,UAAU,EAAE,cAAc,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AACvH,OAAO,EACL,wBAAwB,EACxB,gBAAgB,EAChB,wBAAwB,EACxB,oCAAoC,EACpC,YAAY,EACZ,uBAAuB,EACvB,4BAA4B,EAC5B,qBAAqB,EACrB,YAAY,EACZ,uBAAuB,EACvB,sBAAsB,EACtB,2BAA2B,EAC3B,uBAAuB,GACxB,MAAM,aAAa,CAAA;AASpB,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAE9D,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,iBAAiB,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,OAAO,CAAA;AAGtG,OAAO,EACL,sBAAsB,EACtB,iBAAiB,EACjB,cAAc,EACd,QAAQ,EACR,eAAe,EACf,aAAa,GACd,MAAM,QAAQ,CAAA;AAEf,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,cAAc,EAAE,sBAAsB,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAC3H,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import type { DemoInlineFile, DemoNode } from "../gitbook/ast.js";
|
|
2
|
+
import { fenceFor } from "../gitbook/serialize.js";
|
|
3
|
+
import type { DemoFile, DemoMeta, DemoResolver } from "./types.js";
|
|
4
|
+
export { fenceFor };
|
|
5
|
+
/**
|
|
6
|
+
* - `"inline"` (default): every `{% demo src=… %}` keeps its tag and gains its files as
|
|
7
|
+
* inline fences (`{% demo … %}` + titled fences + `{% enddemo %}`), so the Markdown is
|
|
8
|
+
* still a docstream page: it renders back identically where the resolver exists and
|
|
9
|
+
* self-contained everywhere else.
|
|
10
|
+
* - `"plain"`: for LLM prompts and plain Markdown tools — each demo becomes a bold
|
|
11
|
+
* "Example — Title" line, its description, a variants note and one titled fence per
|
|
12
|
+
* file (the pre-1.2 output); `{% command %}` boxes become npm ```` ```sh ```` fences and
|
|
13
|
+
* titled tab sets become a heading plus one bold-labelled part per tab
|
|
14
|
+
* (`flattenForPlainMarkdown`). Not renderable as docstream any more.
|
|
15
|
+
*/
|
|
16
|
+
export type DemoMarkdownFormat = "inline" | "plain";
|
|
17
|
+
export interface ResolveDemosOptions {
|
|
18
|
+
/** Output shape. Defaults to `"inline"` (renderable docstream Markdown). */
|
|
19
|
+
format?: DemoMarkdownFormat;
|
|
20
|
+
/** `"plain"` only: title shown on each file fence. Defaults to `<src>/<path>`. */
|
|
21
|
+
filePath?: (src: string, file: DemoFile) => string;
|
|
22
|
+
/**
|
|
23
|
+
* Markdown rendered for one demo, replacing the whole `{% demo %}` block whatever the
|
|
24
|
+
* `format`. Called only for demos with files (resolved, or inline).
|
|
25
|
+
*/
|
|
26
|
+
render?: (demo: ResolvedDemo) => string;
|
|
27
|
+
}
|
|
28
|
+
export interface ResolvedDemo {
|
|
29
|
+
node: DemoNode;
|
|
30
|
+
meta: DemoMeta | undefined;
|
|
31
|
+
files: DemoFile[];
|
|
32
|
+
title: string;
|
|
33
|
+
}
|
|
34
|
+
/** The pre-1.2 "plain" rendering of one demo: prose plus titled fences. */
|
|
35
|
+
export declare function defaultDemoMarkdown(demo: ResolvedDemo, filePath?: ResolveDemosOptions["filePath"]): string;
|
|
36
|
+
/** Resolver / viewer files as inline demo files: trailing newlines dropped, language filled in. */
|
|
37
|
+
export declare function toInlineFiles(files: DemoFile[]): DemoInlineFile[];
|
|
38
|
+
/**
|
|
39
|
+
* A demo as a self-contained block-form `{% demo %}`: the node's attributes, with the
|
|
40
|
+
* folder's `meta.json` defaults folded in (so the block renders the same without the
|
|
41
|
+
* resolver) — title, description, height, layout, variants, entry and the look fields
|
|
42
|
+
* `status`, `bleed`, `className`, `surface` (as CSS declarations) and `variantsWidth` —
|
|
43
|
+
* and `files` as inline fences. Tag attributes win over `meta.json` where both exist.
|
|
44
|
+
*/
|
|
45
|
+
export declare function inlineDemoNode(node: DemoNode, files: DemoFile[], meta?: DemoMeta): DemoNode;
|
|
46
|
+
/** `inlineDemoNode` serialized: `{% demo … %}` + titled fences + `{% enddemo %}`. */
|
|
47
|
+
export declare function inlineDemoMarkdown(node: DemoNode, files: DemoFile[], meta?: DemoMeta): string;
|
|
48
|
+
/**
|
|
49
|
+
* Make every `{% demo %}` in a page carry its real source files (Copy page, `.md`
|
|
50
|
+
* exports, llms.txt). By default the result is still docstream Markdown — see
|
|
51
|
+
* `DemoMarkdownFormat`. Everything outside demo blocks is returned byte-for-byte, and
|
|
52
|
+
* tags inside code fences are left alone.
|
|
53
|
+
*
|
|
54
|
+
* `"inline"`: blocks that already carry inline files, and demos the resolver cannot
|
|
55
|
+
* resolve (or no resolver), are left exactly as written — they are valid docstream.
|
|
56
|
+
* `"plain"`: unresolvable demos become a short note rather than tag syntax other tools
|
|
57
|
+
* would not understand.
|
|
58
|
+
*/
|
|
59
|
+
export declare function resolveDemosToMarkdown(markdown: string, resolver: DemoResolver | undefined, options?: ResolveDemosOptions): Promise<string>;
|
|
60
|
+
//# sourceMappingURL=markdown.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"markdown.d.ts","sourceRoot":"","sources":["../../src/demo/markdown.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAI9D,OAAO,EAAE,QAAQ,EAAsC,MAAM,sBAAsB,CAAA;AACnF,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAI/D,OAAO,EAAE,QAAQ,EAAE,CAAA;AAEnB;;;;;;;;;;GAUG;AACH,MAAM,MAAM,kBAAkB,GAAG,QAAQ,GAAG,OAAO,CAAA;AAEnD,MAAM,WAAW,mBAAmB;IAClC,4EAA4E;IAC5E,MAAM,CAAC,EAAE,kBAAkB,CAAA;IAC3B,kFAAkF;IAClF,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,KAAK,MAAM,CAAA;IAClD;;;OAGG;IACH,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,YAAY,KAAK,MAAM,CAAA;CACxC;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,QAAQ,CAAA;IACd,IAAI,EAAE,QAAQ,GAAG,SAAS,CAAA;IAC1B,KAAK,EAAE,QAAQ,EAAE,CAAA;IACjB,KAAK,EAAE,MAAM,CAAA;CACd;AAQD,2EAA2E;AAC3E,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,YAAY,EAAE,QAAQ,CAAC,EAAE,mBAAmB,CAAC,UAAU,CAAC,GAAG,MAAM,CAkB1G;AAED,mGAAmG;AACnG,wBAAgB,aAAa,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,cAAc,EAAE,CAKjE;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,IAAI,CAAC,EAAE,QAAQ,GAAG,QAAQ,CA8B3F;AAED,qFAAqF;AACrF,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,IAAI,CAAC,EAAE,QAAQ,GAAG,MAAM,CAE7F;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,sBAAsB,CAC1C,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,YAAY,GAAG,SAAS,EAClC,OAAO,GAAE,mBAAwB,GAChC,OAAO,CAAC,MAAM,CAAC,CAgCjB"}
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
import { TAG_ATTRS } from "../gitbook/attrs.js";
|
|
2
|
+
import { flattenForPlainMarkdown } from "../gitbook/flatten.js";
|
|
3
|
+
import { demoBody, fenceTracker, parseBlocks, parseMarkdown } from "../gitbook/parse.js";
|
|
4
|
+
import { fenceFor, serializeBlocks, serializeMarkdown } from "../gitbook/serialize.js";
|
|
5
|
+
import { languageForPath } from "./glob.js";
|
|
6
|
+
import { surfaceToCss } from "./surface.js";
|
|
7
|
+
export { fenceFor };
|
|
8
|
+
const TAG_RE = new RegExp(String.raw `^(\s*)\{%\s*demo(\s${TAG_ATTRS})?\s*\/?%\}\s*$`);
|
|
9
|
+
function titleFor(src, node, meta) {
|
|
10
|
+
return node.title ?? meta?.title ?? (src.split("/").pop() || src || "Demo");
|
|
11
|
+
}
|
|
12
|
+
/** The pre-1.2 "plain" rendering of one demo: prose plus titled fences. */
|
|
13
|
+
export function defaultDemoMarkdown(demo, filePath) {
|
|
14
|
+
const { node, meta, files, title } = demo;
|
|
15
|
+
const description = node.description ?? meta?.description;
|
|
16
|
+
const variants = node.variants ?? meta?.variants;
|
|
17
|
+
const parts = [`**Example — ${title}**`];
|
|
18
|
+
if (description)
|
|
19
|
+
parts.push(description);
|
|
20
|
+
if (variants?.length) {
|
|
21
|
+
parts.push(`Variants (the \`variant\` prop): ${variants.map((v) => `\`${v.id}\`${v.label !== v.id ? ` (${v.label})` : ""}`).join(", ")}.`);
|
|
22
|
+
}
|
|
23
|
+
if (!files.length)
|
|
24
|
+
parts.push(`> Demo \`${node.src}\` has no source files.`);
|
|
25
|
+
for (const file of files) {
|
|
26
|
+
const fence = fenceFor(file.content);
|
|
27
|
+
const language = file.language ?? languageForPath(file.path) ?? "";
|
|
28
|
+
const title = filePath ? filePath(node.src, file) : node.src ? `${node.src}/${file.path}` : file.path;
|
|
29
|
+
const body = file.content.replace(/\n+$/, "");
|
|
30
|
+
parts.push(`${fence}${language} title="${title}"\n${body}\n${fence}`);
|
|
31
|
+
}
|
|
32
|
+
return parts.join("\n\n");
|
|
33
|
+
}
|
|
34
|
+
/** Resolver / viewer files as inline demo files: trailing newlines dropped, language filled in. */
|
|
35
|
+
export function toInlineFiles(files) {
|
|
36
|
+
return files.map((file) => {
|
|
37
|
+
const language = file.language ?? languageForPath(file.path);
|
|
38
|
+
return { path: file.path, content: file.content.replace(/\n+$/, ""), ...(language ? { language } : {}) };
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* A demo as a self-contained block-form `{% demo %}`: the node's attributes, with the
|
|
43
|
+
* folder's `meta.json` defaults folded in (so the block renders the same without the
|
|
44
|
+
* resolver) — title, description, height, layout, variants, entry and the look fields
|
|
45
|
+
* `status`, `bleed`, `className`, `surface` (as CSS declarations) and `variantsWidth` —
|
|
46
|
+
* and `files` as inline fences. Tag attributes win over `meta.json` where both exist.
|
|
47
|
+
*/
|
|
48
|
+
export function inlineDemoNode(node, files, meta) {
|
|
49
|
+
const inline = toInlineFiles(files);
|
|
50
|
+
const height = node.height ?? (meta?.height === undefined || meta.height === "" ? undefined : String(meta.height));
|
|
51
|
+
const title = node.title ?? meta?.title;
|
|
52
|
+
const description = node.description ?? meta?.description;
|
|
53
|
+
const layout = node.layout ?? meta?.layout;
|
|
54
|
+
const variants = node.variants?.length ? node.variants : meta?.variants?.length ? meta.variants : undefined;
|
|
55
|
+
const entry = node.entry ?? (meta?.entry && inline[0]?.path !== meta.entry ? meta.entry : undefined);
|
|
56
|
+
const status = node.status ?? meta?.status;
|
|
57
|
+
const bleed = node.bleed ?? meta?.bleed;
|
|
58
|
+
const className = node.className ?? meta?.className;
|
|
59
|
+
const surface = node.surface ?? (meta?.surface ? surfaceToCss(meta.surface) : undefined);
|
|
60
|
+
const variantsWidth = node.variantsWidth ?? (meta?.variantsWidth === undefined || meta.variantsWidth === "" ? undefined : String(meta.variantsWidth));
|
|
61
|
+
return {
|
|
62
|
+
type: "demo",
|
|
63
|
+
src: node.src,
|
|
64
|
+
...(title ? { title } : {}),
|
|
65
|
+
...(description ? { description } : {}),
|
|
66
|
+
...(height ? { height } : {}),
|
|
67
|
+
...(layout ? { layout } : {}),
|
|
68
|
+
...(variants ? { variants } : {}),
|
|
69
|
+
...(node.viewport ? { viewport: node.viewport } : {}),
|
|
70
|
+
...(entry ? { entry } : {}),
|
|
71
|
+
...(status ? { status } : {}),
|
|
72
|
+
...(bleed === undefined ? {} : { bleed }),
|
|
73
|
+
...(className ? { className } : {}),
|
|
74
|
+
...(surface ? { surface } : {}),
|
|
75
|
+
...(variantsWidth ? { variantsWidth } : {}),
|
|
76
|
+
...(inline.length ? { files: inline } : {}),
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
/** `inlineDemoNode` serialized: `{% demo … %}` + titled fences + `{% enddemo %}`. */
|
|
80
|
+
export function inlineDemoMarkdown(node, files, meta) {
|
|
81
|
+
return serializeBlocks([inlineDemoNode(node, files, meta)]);
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Make every `{% demo %}` in a page carry its real source files (Copy page, `.md`
|
|
85
|
+
* exports, llms.txt). By default the result is still docstream Markdown — see
|
|
86
|
+
* `DemoMarkdownFormat`. Everything outside demo blocks is returned byte-for-byte, and
|
|
87
|
+
* tags inside code fences are left alone.
|
|
88
|
+
*
|
|
89
|
+
* `"inline"`: blocks that already carry inline files, and demos the resolver cannot
|
|
90
|
+
* resolve (or no resolver), are left exactly as written — they are valid docstream.
|
|
91
|
+
* `"plain"`: unresolvable demos become a short note rather than tag syntax other tools
|
|
92
|
+
* would not understand.
|
|
93
|
+
*/
|
|
94
|
+
export async function resolveDemosToMarkdown(markdown, resolver, options = {}) {
|
|
95
|
+
// Plain output also flattens docstream-only presentation blocks (command boxes, titled tabs).
|
|
96
|
+
if (options.format === "plain" && /\{%\s*(?:command\b|tabs\s(?:[^%\n]|%(?!\}))*\btitle=)/.test(markdown)) {
|
|
97
|
+
markdown = serializeMarkdown(flattenForPlainMarkdown(parseMarkdown(markdown)));
|
|
98
|
+
}
|
|
99
|
+
const lines = markdown.split("\n");
|
|
100
|
+
const jobs = [];
|
|
101
|
+
const fences = fenceTracker();
|
|
102
|
+
for (let i = 0; i < lines.length; i++) {
|
|
103
|
+
const line = lines[i];
|
|
104
|
+
if (fences.step(line))
|
|
105
|
+
continue;
|
|
106
|
+
const tag = line.match(TAG_RE);
|
|
107
|
+
if (!tag)
|
|
108
|
+
continue;
|
|
109
|
+
const indent = tag[1];
|
|
110
|
+
const body = demoBody(lines, i + 1, /\/\s*%\}\s*$/.test(line));
|
|
111
|
+
const end = body ? body.next : i + 1;
|
|
112
|
+
const block = lines.slice(i, end).map((l) => (l.startsWith(indent) ? l.slice(indent.length) : l));
|
|
113
|
+
const node = parseBlocks(block)[0];
|
|
114
|
+
if (node?.type !== "demo")
|
|
115
|
+
continue;
|
|
116
|
+
jobs.push({ index: i, end, indent, promise: renderDemo(node, block[0], resolver, options) });
|
|
117
|
+
i = end - 1;
|
|
118
|
+
}
|
|
119
|
+
if (!jobs.length)
|
|
120
|
+
return markdown;
|
|
121
|
+
const rendered = await Promise.all(jobs.map((job) => job.promise));
|
|
122
|
+
for (let j = jobs.length - 1; j >= 0; j--) {
|
|
123
|
+
const out = rendered[j];
|
|
124
|
+
if (out === null)
|
|
125
|
+
continue;
|
|
126
|
+
const { index, end, indent } = jobs[j];
|
|
127
|
+
const text = indent ? out.split("\n").map((l) => (l ? indent + l : l)).join("\n") : out;
|
|
128
|
+
lines.splice(index, end - index, text);
|
|
129
|
+
}
|
|
130
|
+
return lines.join("\n");
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* `inlineDemoMarkdown`, but keeping the author's tag line byte-for-byte when folding in
|
|
134
|
+
* `meta.json` added no attributes (only the files are new).
|
|
135
|
+
*/
|
|
136
|
+
function inlineDemoKeepingTag(tagLine, node, files, meta) {
|
|
137
|
+
const next = inlineDemoNode(node, files, meta);
|
|
138
|
+
const out = serializeBlocks([next]);
|
|
139
|
+
const bare = (n) => {
|
|
140
|
+
const { files: _files, open: _open, raw: _raw, ...rest } = n;
|
|
141
|
+
return rest;
|
|
142
|
+
};
|
|
143
|
+
if (serializeBlocks([bare(next)]) !== serializeBlocks([bare(node)]))
|
|
144
|
+
return out;
|
|
145
|
+
const tag = tagLine.trim().replace(/\s*\/\s*%\}$/, " %}");
|
|
146
|
+
return tag + out.slice(out.indexOf("\n"));
|
|
147
|
+
}
|
|
148
|
+
/** The replacement for one demo block, or null to keep it byte-for-byte. */
|
|
149
|
+
async function renderDemo(node, tagLine, resolver, options) {
|
|
150
|
+
const plain = options.format === "plain";
|
|
151
|
+
const inlineFiles = node.files?.length ? node.files : undefined;
|
|
152
|
+
let meta;
|
|
153
|
+
let files;
|
|
154
|
+
let failure;
|
|
155
|
+
if (resolver && node.src && !(inlineFiles && !plain && !options.render)) {
|
|
156
|
+
try {
|
|
157
|
+
;
|
|
158
|
+
[meta, files] = await Promise.all([resolver.meta(node.src), resolver.files(node.src)]);
|
|
159
|
+
}
|
|
160
|
+
catch (error) {
|
|
161
|
+
failure = error instanceof Error ? error.message : String(error);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
// Resolver files are the authority; inline files stand in when it cannot help.
|
|
165
|
+
const chosen = files?.length ? files : inlineFiles;
|
|
166
|
+
if (!chosen) {
|
|
167
|
+
if (!plain)
|
|
168
|
+
return null;
|
|
169
|
+
if (failure !== undefined)
|
|
170
|
+
return `> Live demo \`${node.src}\` could not be resolved: ${failure}`;
|
|
171
|
+
if (!resolver || !node.src)
|
|
172
|
+
return `> Live demo \`${node.src || "?"}\` (interactive on the docs site).`;
|
|
173
|
+
}
|
|
174
|
+
const demo = { node, meta, files: chosen ?? [], title: titleFor(node.src, node, meta) };
|
|
175
|
+
if (options.render)
|
|
176
|
+
return options.render(demo);
|
|
177
|
+
if (plain)
|
|
178
|
+
return defaultDemoMarkdown(demo, options.filePath);
|
|
179
|
+
return chosen === inlineFiles ? null : inlineDemoKeepingTag(tagLine, node, chosen, meta);
|
|
180
|
+
}
|
|
181
|
+
//# sourceMappingURL=markdown.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"markdown.js","sourceRoot":"","sources":["../../src/demo/markdown.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { CSSProperties } from "react";
|
|
2
|
+
/** A `meta.json` surface object as the declaration string the demo tag carries. */
|
|
3
|
+
export declare function surfaceToCss(surface: Record<string, string | number>): string;
|
|
4
|
+
/**
|
|
5
|
+
* The tag's declaration string as a React style object. Custom properties keep their
|
|
6
|
+
* name; `kebab-case` becomes camelCase; plain numbers on ordinary properties become
|
|
7
|
+
* numbers (so `padding: 12` means 12px, as it does in `meta.json`).
|
|
8
|
+
*/
|
|
9
|
+
export declare function cssToSurface(css: string): Record<string, string | number>;
|
|
10
|
+
export declare function surfaceStyle(surface: Record<string, string | number> | undefined): CSSProperties | undefined;
|
|
11
|
+
//# sourceMappingURL=surface.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"surface.d.ts","sourceRoot":"","sources":["../../src/demo/surface.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAA;AAU1C,mFAAmF;AACnF,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,GAAG,MAAM,CAK7E;AAyBD;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,CAgBzE;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,GAAG,SAAS,GAAG,aAAa,GAAG,SAAS,CAE5G"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* A demo canvas's `surface` (inline style) has two spellings:
|
|
3
|
+
* - `meta.json`: an object, `{ "background": "var(--brand-50)", "--demo-gap": "12px", "padding": 12 }`;
|
|
4
|
+
* - the `{% demo surface="…" %}` attribute: CSS declarations,
|
|
5
|
+
* `background: var(--brand-50); --demo-gap: 12px; padding: 12`.
|
|
6
|
+
* Keys are kept as written (camelCase, kebab-case or custom properties).
|
|
7
|
+
*/
|
|
8
|
+
/** A `meta.json` surface object as the declaration string the demo tag carries. */
|
|
9
|
+
export function surfaceToCss(surface) {
|
|
10
|
+
return Object.entries(surface)
|
|
11
|
+
.filter(([key, value]) => key.trim() && value !== undefined && value !== null && String(value).trim() !== "")
|
|
12
|
+
.map(([key, value]) => `${key.trim()}: ${String(value).trim()}`)
|
|
13
|
+
.join("; ");
|
|
14
|
+
}
|
|
15
|
+
/** Split on `;` outside parentheses and quotes (`url("a;b")` stays whole). */
|
|
16
|
+
function declarations(css) {
|
|
17
|
+
const out = [];
|
|
18
|
+
let depth = 0;
|
|
19
|
+
let quote = "";
|
|
20
|
+
let current = "";
|
|
21
|
+
for (const ch of css) {
|
|
22
|
+
if (quote) {
|
|
23
|
+
if (ch === quote)
|
|
24
|
+
quote = "";
|
|
25
|
+
}
|
|
26
|
+
else if (ch === '"' || ch === "'")
|
|
27
|
+
quote = ch;
|
|
28
|
+
else if (ch === "(")
|
|
29
|
+
depth++;
|
|
30
|
+
else if (ch === ")")
|
|
31
|
+
depth = Math.max(0, depth - 1);
|
|
32
|
+
else if (ch === ";" && depth === 0) {
|
|
33
|
+
out.push(current);
|
|
34
|
+
current = "";
|
|
35
|
+
continue;
|
|
36
|
+
}
|
|
37
|
+
current += ch;
|
|
38
|
+
}
|
|
39
|
+
out.push(current);
|
|
40
|
+
return out;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* The tag's declaration string as a React style object. Custom properties keep their
|
|
44
|
+
* name; `kebab-case` becomes camelCase; plain numbers on ordinary properties become
|
|
45
|
+
* numbers (so `padding: 12` means 12px, as it does in `meta.json`).
|
|
46
|
+
*/
|
|
47
|
+
export function cssToSurface(css) {
|
|
48
|
+
const style = {};
|
|
49
|
+
for (const declaration of declarations(css)) {
|
|
50
|
+
const colon = declaration.indexOf(":");
|
|
51
|
+
if (colon < 0)
|
|
52
|
+
continue;
|
|
53
|
+
const key = declaration.slice(0, colon).trim();
|
|
54
|
+
const value = declaration.slice(colon + 1).trim();
|
|
55
|
+
if (!key || !value)
|
|
56
|
+
continue;
|
|
57
|
+
if (key.startsWith("--")) {
|
|
58
|
+
style[key] = value;
|
|
59
|
+
continue;
|
|
60
|
+
}
|
|
61
|
+
const name = key.replace(/-([a-z])/g, (_, c) => c.toUpperCase());
|
|
62
|
+
style[name] = /^-?\d+(?:\.\d+)?$/.test(value) ? Number(value) : value;
|
|
63
|
+
}
|
|
64
|
+
return style;
|
|
65
|
+
}
|
|
66
|
+
export function surfaceStyle(surface) {
|
|
67
|
+
return surface && Object.keys(surface).length ? surface : undefined;
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=surface.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"surface.js","sourceRoot":"","sources":["../../src/demo/surface.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import type { ComponentType, ReactNode } from "react";
|
|
2
|
+
import type { DemoLayout, DemoVariantOption } from "../gitbook/ast.js";
|
|
3
|
+
export type DemoVariant = DemoVariantOption;
|
|
4
|
+
/** Defaults for a demo folder, usually its `meta.json`. `{% demo %}` attributes override them. */
|
|
5
|
+
export interface DemoMeta {
|
|
6
|
+
title?: string;
|
|
7
|
+
description?: string;
|
|
8
|
+
/**
|
|
9
|
+
* Preview height: pixels, or any CSS length (`"60vh"`, `"auto"`). Single-file previews
|
|
10
|
+
* treat it as a **minimum** (the card grows with its content); the multi-file viewer's
|
|
11
|
+
* resizable stage and inline-demo iframes use it as the height.
|
|
12
|
+
*/
|
|
13
|
+
height?: number | string;
|
|
14
|
+
variants?: DemoVariant[];
|
|
15
|
+
/** Entry file, relative to the demo folder. Defaults to `index.tsx`. */
|
|
16
|
+
entry?: string;
|
|
17
|
+
layout?: DemoLayout;
|
|
18
|
+
/** Drop the padded preview surface for demos that bring their own full-bleed frame. */
|
|
19
|
+
bleed?: boolean;
|
|
20
|
+
/** Extra class on the preview canvas (the surface the component renders on). */
|
|
21
|
+
className?: string;
|
|
22
|
+
/**
|
|
23
|
+
* Inline style for the preview canvas: CSS custom properties or plain properties,
|
|
24
|
+
* e.g. `{ "background": "var(--brand-50)", "--demo-gap": "12px" }`.
|
|
25
|
+
*/
|
|
26
|
+
surface?: Record<string, string | number>;
|
|
27
|
+
/** A short status shown in the demo header, e.g. `"Live"` or `"Needs network"`. */
|
|
28
|
+
status?: string;
|
|
29
|
+
/** Width of the variant switch (px number or CSS length); its options share it equally. */
|
|
30
|
+
variantsWidth?: number | string;
|
|
31
|
+
}
|
|
32
|
+
export interface DemoFile {
|
|
33
|
+
/** Path relative to the demo folder (`index.tsx`, `parts/Card.tsx`). */
|
|
34
|
+
path: string;
|
|
35
|
+
content: string;
|
|
36
|
+
/** Highlighting language; defaults to the file extension. */
|
|
37
|
+
language?: string;
|
|
38
|
+
}
|
|
39
|
+
/** Props the loaded demo component receives. */
|
|
40
|
+
export interface DemoComponentProps {
|
|
41
|
+
variant?: string;
|
|
42
|
+
}
|
|
43
|
+
export type DemoComponent = ComponentType<DemoComponentProps>;
|
|
44
|
+
/**
|
|
45
|
+
* How a host turns `{% demo src="<page>/<example>" %}` into something renderable.
|
|
46
|
+
* `createGlobDemoResolver` builds one from Vite `import.meta.glob` maps.
|
|
47
|
+
*/
|
|
48
|
+
export interface DemoResolver {
|
|
49
|
+
/** Every known demo id (optional; used by tooling and llms.txt generators). */
|
|
50
|
+
list?(): string[];
|
|
51
|
+
meta(src: string): Promise<DemoMeta | undefined>;
|
|
52
|
+
/** The demo's source files, entry first. These are exactly what the Code view shows. */
|
|
53
|
+
files(src: string): Promise<DemoFile[]>;
|
|
54
|
+
/** The component to render in-page. */
|
|
55
|
+
load(src: string): Promise<DemoComponent>;
|
|
56
|
+
/**
|
|
57
|
+
* Optional deep link that renders the demo alone (e.g. `?demo=<src>`); the host
|
|
58
|
+
* routes it to `<DemoFullscreen>`. When present, the viewer shows an
|
|
59
|
+
* "Open in new tab" link next to its in-page fullscreen button.
|
|
60
|
+
*/
|
|
61
|
+
href?(src: string, options?: {
|
|
62
|
+
variant?: string;
|
|
63
|
+
}): string | undefined;
|
|
64
|
+
}
|
|
65
|
+
/** What an inline-demo runtime gets: the block's own files, ready to run. */
|
|
66
|
+
export interface InlineDemoRuntimeProps {
|
|
67
|
+
/** The block's `src` (may be empty); useful as a cache key or label. */
|
|
68
|
+
src: string;
|
|
69
|
+
title: string;
|
|
70
|
+
/** The inline files, entry first, paths relative to the demo folder. */
|
|
71
|
+
files: DemoFile[];
|
|
72
|
+
/** Path of the entry file (its default export is the component). */
|
|
73
|
+
entry: string;
|
|
74
|
+
/** The selected variant, passed to the component as its `variant` prop. */
|
|
75
|
+
variant?: string;
|
|
76
|
+
/** Extra npm dependencies (`{ "@brett_lamy/ui": "^1.2.0" }`) the files may import. */
|
|
77
|
+
dependencies?: Record<string, string>;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Renders the Preview of a `{% demo %}` block that carries its files inline and has
|
|
81
|
+
* no resolver behind it. `@brett_lamy/docstream/playground` provides an almost-node
|
|
82
|
+
* implementation (`createAlmostNodeDemoRuntime`), which that entry's `PlaygroundStreamdown`
|
|
83
|
+
* wires in by default. The package root never loads a runtime on its own.
|
|
84
|
+
*/
|
|
85
|
+
export type InlineDemoRuntime = (props: InlineDemoRuntimeProps) => ReactNode;
|
|
86
|
+
export interface DemoRuntimeOptions {
|
|
87
|
+
runtime?: InlineDemoRuntime;
|
|
88
|
+
/** Extra npm dependencies handed to the runtime for every inline demo. */
|
|
89
|
+
dependencies?: Record<string, string>;
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/demo/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AACrD,OAAO,KAAK,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAA;AAEnE,MAAM,MAAM,WAAW,GAAG,iBAAiB,CAAA;AAE3C,kGAAkG;AAClG,MAAM,WAAW,QAAQ;IACvB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;IACxB,QAAQ,CAAC,EAAE,WAAW,EAAE,CAAA;IACxB,wEAAwE;IACxE,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,UAAU,CAAA;IACnB,uFAAuF;IACvF,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,gFAAgF;IAChF,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,CAAA;IACzC,mFAAmF;IACnF,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,2FAA2F;IAC3F,aAAa,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;CAChC;AAED,MAAM,WAAW,QAAQ;IACvB,wEAAwE;IACxE,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;IACf,6DAA6D;IAC7D,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAED,gDAAgD;AAChD,MAAM,WAAW,kBAAkB;IACjC,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED,MAAM,MAAM,aAAa,GAAG,aAAa,CAAC,kBAAkB,CAAC,CAAA;AAE7D;;;GAGG;AACH,MAAM,WAAW,YAAY;IAC3B,+EAA+E;IAC/E,IAAI,CAAC,IAAI,MAAM,EAAE,CAAA;IACjB,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,SAAS,CAAC,CAAA;IAChD,wFAAwF;IACxF,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAA;IACvC,uCAAuC;IACvC,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAAA;IACzC;;;;OAIG;IACH,IAAI,CAAC,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,MAAM,GAAG,SAAS,CAAA;CACvE;AAED,6EAA6E;AAC7E,MAAM,WAAW,sBAAsB;IACrC,wEAAwE;IACxE,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,EAAE,MAAM,CAAA;IACb,wEAAwE;IACxE,KAAK,EAAE,QAAQ,EAAE,CAAA;IACjB,oEAAoE;IACpE,KAAK,EAAE,MAAM,CAAA;IACb,2EAA2E;IAC3E,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,sFAAsF;IACtF,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CACtC;AAED;;;;;GAKG;AACH,MAAM,MAAM,iBAAiB,GAAG,CAAC,KAAK,EAAE,sBAAsB,KAAK,SAAS,CAAA;AAE5E,MAAM,WAAW,kBAAkB;IACjC,OAAO,CAAC,EAAE,iBAAiB,CAAA;IAC3B,0EAA0E;IAC1E,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CACtC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/demo/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import type { DemoFile, DemoMeta, DemoResolver, InlineDemoRuntime } from "./types.js";
|
|
2
|
+
export interface DemoVFSEntry {
|
|
3
|
+
/** Entry first (or `meta.entry`), paths relative to the demo folder. */
|
|
4
|
+
files: DemoFile[];
|
|
5
|
+
/** `meta.json`-style defaults, usually the `{% demo %}` tag's attributes. */
|
|
6
|
+
meta?: DemoMeta;
|
|
7
|
+
}
|
|
8
|
+
export interface DemoVFSChange {
|
|
9
|
+
src: string;
|
|
10
|
+
/** The new entry; `undefined` when `src` was removed. */
|
|
11
|
+
entry: DemoVFSEntry | undefined;
|
|
12
|
+
}
|
|
13
|
+
export interface DemoVFSResolverOptions {
|
|
14
|
+
/** The host resolver, consulted first. */
|
|
15
|
+
resolver?: DemoResolver;
|
|
16
|
+
/** Runs VFS files for `load(src)`. Without one, `load` rejects for VFS-only demos. */
|
|
17
|
+
runtime?: InlineDemoRuntime;
|
|
18
|
+
/** Extra npm dependencies handed to the runtime. */
|
|
19
|
+
dependencies?: Record<string, string>;
|
|
20
|
+
}
|
|
21
|
+
export interface DemoVFS {
|
|
22
|
+
get(src: string): DemoVFSEntry | undefined;
|
|
23
|
+
has(src: string): boolean;
|
|
24
|
+
/** Every `src` held, in insertion order. */
|
|
25
|
+
list(): string[];
|
|
26
|
+
/** Adds or replaces `src`. A no-op (and no change event) when nothing differs. */
|
|
27
|
+
set(src: string, files: DemoFile[], meta?: DemoMeta): void;
|
|
28
|
+
delete(src: string): boolean;
|
|
29
|
+
clear(): void;
|
|
30
|
+
/** Everything held, as `{ [src]: entry }`. The object is stable until the next change. */
|
|
31
|
+
snapshot(): Readonly<Record<string, DemoVFSEntry>>;
|
|
32
|
+
/** Files only, as `{ [src]: files }` (what a host usually persists). Stable until the next change. */
|
|
33
|
+
files(): Readonly<Record<string, DemoFile[]>>;
|
|
34
|
+
subscribe(listener: (change: DemoVFSChange) => void): () => void;
|
|
35
|
+
/** This VFS as a `DemoResolver` layered over a host resolver. */
|
|
36
|
+
resolver(options?: DemoVFSResolverOptions): DemoResolver;
|
|
37
|
+
}
|
|
38
|
+
/** A new, empty (or pre-filled) demo VFS. */
|
|
39
|
+
export declare function createDemoVFS(initial?: Record<string, DemoFile[] | DemoVFSEntry>): DemoVFS;
|
|
40
|
+
/**
|
|
41
|
+
* A demo VFS owned by the calling component (created once). Pass it as `demoVFS` to several
|
|
42
|
+
* editors / renderers to share pasted demo files between them.
|
|
43
|
+
*/
|
|
44
|
+
export declare function useDemoVFS(initial?: Record<string, DemoFile[] | DemoVFSEntry>): DemoVFS;
|
|
45
|
+
/** The VFS in context (a renderer's or editor's `demoVFS`), unless `override` is given. */
|
|
46
|
+
export declare function useDemoVFSContext(override?: DemoVFS): DemoVFS | undefined;
|
|
47
|
+
/** `{ [src]: files }` of a VFS, re-rendering on change. */
|
|
48
|
+
export declare function useDemoVFSFiles(vfs: DemoVFS | undefined): Readonly<Record<string, DemoFile[]>>;
|
|
49
|
+
/** One VFS entry, re-rendering when it changes. */
|
|
50
|
+
export declare function useDemoVFSEntry(vfs: DemoVFS | undefined, src: string): DemoVFSEntry | undefined;
|
|
51
|
+
//# sourceMappingURL=vfs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vfs.d.ts","sourceRoot":"","sources":["../../src/demo/vfs.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAsB,QAAQ,EAAE,QAAQ,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAA;AAEtG,MAAM,WAAW,YAAY;IAC3B,wEAAwE;IACxE,KAAK,EAAE,QAAQ,EAAE,CAAA;IACjB,6EAA6E;IAC7E,IAAI,CAAC,EAAE,QAAQ,CAAA;CAChB;AAED,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,MAAM,CAAA;IACX,yDAAyD;IACzD,KAAK,EAAE,YAAY,GAAG,SAAS,CAAA;CAChC;AAED,MAAM,WAAW,sBAAsB;IACrC,0CAA0C;IAC1C,QAAQ,CAAC,EAAE,YAAY,CAAA;IACvB,sFAAsF;IACtF,OAAO,CAAC,EAAE,iBAAiB,CAAA;IAC3B,oDAAoD;IACpD,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CACtC;AAED,MAAM,WAAW,OAAO;IACtB,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CAAA;IAC1C,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;IACzB,4CAA4C;IAC5C,IAAI,IAAI,MAAM,EAAE,CAAA;IAChB,kFAAkF;IAClF,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,IAAI,CAAC,EAAE,QAAQ,GAAG,IAAI,CAAA;IAC1D,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;IAC5B,KAAK,IAAI,IAAI,CAAA;IACb,0FAA0F;IAC1F,QAAQ,IAAI,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,CAAA;IAClD,sGAAsG;IACtG,KAAK,IAAI,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAA;IAC7C,SAAS,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,aAAa,KAAK,IAAI,GAAG,MAAM,IAAI,CAAA;IAChE,iEAAiE;IACjE,QAAQ,CAAC,OAAO,CAAC,EAAE,sBAAsB,GAAG,YAAY,CAAA;CACzD;AAiBD,6CAA6C;AAC7C,wBAAgB,aAAa,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,EAAE,GAAG,YAAY,CAAC,GAAG,OAAO,CAyD1F;AAuCD;;;GAGG;AACH,wBAAgB,UAAU,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,EAAE,GAAG,YAAY,CAAC,GAAG,OAAO,CAIvF;AAED,2FAA2F;AAC3F,wBAAgB,iBAAiB,CAAC,QAAQ,CAAC,EAAE,OAAO,GAAG,OAAO,GAAG,SAAS,CAGzE;AAKD,2DAA2D;AAC3D,wBAAgB,eAAe,CAAC,GAAG,EAAE,OAAO,GAAG,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC,CAE9F;AAED,mDAAmD;AACnD,wBAAgB,eAAe,CAAC,GAAG,EAAE,OAAO,GAAG,SAAS,EAAE,GAAG,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CAG/F"}
|