@brett_lamy/docstream 1.2.4 → 1.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (216) hide show
  1. package/README.md +76 -14
  2. package/dist/assets.d.ts +3 -0
  3. package/dist/assets.d.ts.map +1 -0
  4. package/dist/assets.js +20 -0
  5. package/dist/assets.js.map +1 -0
  6. package/dist/demo/DemoViewer.d.ts +64 -0
  7. package/dist/demo/DemoViewer.d.ts.map +1 -0
  8. package/dist/demo/DemoViewer.js +426 -0
  9. package/dist/demo/DemoViewer.js.map +1 -0
  10. package/dist/demo/context.d.ts +14 -0
  11. package/dist/demo/context.d.ts.map +1 -0
  12. package/dist/demo/context.js +25 -0
  13. package/dist/demo/context.js.map +1 -0
  14. package/dist/demo/glob.d.ts +60 -0
  15. package/dist/demo/glob.d.ts.map +1 -0
  16. package/dist/demo/glob.js +158 -0
  17. package/dist/demo/glob.js.map +1 -0
  18. package/dist/demo/index.d.ts +10 -0
  19. package/dist/demo/index.d.ts.map +1 -0
  20. package/dist/demo/index.js +6 -0
  21. package/dist/demo/index.js.map +1 -0
  22. package/dist/demo/markdown.d.ts +60 -0
  23. package/dist/demo/markdown.d.ts.map +1 -0
  24. package/dist/demo/markdown.js +181 -0
  25. package/dist/demo/markdown.js.map +1 -0
  26. package/dist/demo/surface.d.ts +11 -0
  27. package/dist/demo/surface.d.ts.map +1 -0
  28. package/dist/demo/surface.js +69 -0
  29. package/dist/demo/surface.js.map +1 -0
  30. package/dist/demo/types.d.ts +91 -0
  31. package/dist/demo/types.d.ts.map +1 -0
  32. package/dist/demo/types.js +2 -0
  33. package/dist/demo/types.js.map +1 -0
  34. package/dist/docs/CollapsibleCode.d.ts +14 -0
  35. package/dist/docs/CollapsibleCode.d.ts.map +1 -0
  36. package/dist/docs/CollapsibleCode.js +19 -0
  37. package/dist/docs/CollapsibleCode.js.map +1 -0
  38. package/dist/docs/DocsRenderer.d.ts +49 -0
  39. package/dist/docs/DocsRenderer.d.ts.map +1 -0
  40. package/dist/docs/DocsRenderer.js +277 -0
  41. package/dist/docs/DocsRenderer.js.map +1 -0
  42. package/dist/docs/HighlightedCode.d.ts +6 -0
  43. package/dist/docs/HighlightedCode.d.ts.map +1 -0
  44. package/dist/docs/HighlightedCode.js +40 -0
  45. package/dist/docs/HighlightedCode.js.map +1 -0
  46. package/dist/docs/Mermaid.d.ts +7 -0
  47. package/dist/docs/Mermaid.d.ts.map +1 -0
  48. package/dist/docs/Mermaid.js +39 -0
  49. package/dist/docs/Mermaid.js.map +1 -0
  50. package/dist/docs/PageActions.d.ts +33 -0
  51. package/dist/docs/PageActions.d.ts.map +1 -0
  52. package/dist/docs/PageActions.js +115 -0
  53. package/dist/docs/PageActions.js.map +1 -0
  54. package/dist/docs/controls.d.ts +29 -0
  55. package/dist/docs/controls.d.ts.map +1 -0
  56. package/dist/docs/controls.js +46 -0
  57. package/dist/docs/controls.js.map +1 -0
  58. package/dist/docs/copy.d.ts +24 -0
  59. package/dist/docs/copy.d.ts.map +1 -0
  60. package/dist/docs/copy.js +62 -0
  61. package/dist/docs/copy.js.map +1 -0
  62. package/dist/docs/math.d.ts +3 -0
  63. package/dist/docs/math.d.ts.map +1 -0
  64. package/dist/docs/math.js +12 -0
  65. package/dist/docs/math.js.map +1 -0
  66. package/dist/docs/reference.d.ts +27 -0
  67. package/dist/docs/reference.d.ts.map +1 -0
  68. package/dist/docs/reference.js +73 -0
  69. package/dist/docs/reference.js.map +1 -0
  70. package/dist/docs/tabs-sync.d.ts +5 -0
  71. package/dist/docs/tabs-sync.d.ts.map +1 -0
  72. package/dist/docs/tabs-sync.js +58 -0
  73. package/dist/docs/tabs-sync.js.map +1 -0
  74. package/dist/gitbook/ast.d.ts +506 -0
  75. package/dist/gitbook/ast.d.ts.map +1 -0
  76. package/dist/gitbook/ast.js +8 -0
  77. package/dist/gitbook/ast.js.map +1 -0
  78. package/dist/gitbook/attrs.d.ts +14 -0
  79. package/dist/gitbook/attrs.d.ts.map +1 -0
  80. package/dist/gitbook/attrs.js +36 -0
  81. package/dist/gitbook/attrs.js.map +1 -0
  82. package/dist/gitbook/flatten.d.ts +14 -0
  83. package/dist/gitbook/flatten.d.ts.map +1 -0
  84. package/dist/gitbook/flatten.js +45 -0
  85. package/dist/gitbook/flatten.js.map +1 -0
  86. package/dist/gitbook/index.d.ts +10 -0
  87. package/dist/gitbook/index.d.ts.map +1 -0
  88. package/dist/gitbook/index.js +8 -0
  89. package/dist/gitbook/index.js.map +1 -0
  90. package/dist/gitbook/inline.d.ts +28 -0
  91. package/dist/gitbook/inline.d.ts.map +1 -0
  92. package/dist/gitbook/inline.js +956 -0
  93. package/dist/gitbook/inline.js.map +1 -0
  94. package/dist/gitbook/outline.d.ts +16 -0
  95. package/dist/gitbook/outline.d.ts.map +1 -0
  96. package/dist/gitbook/outline.js +44 -0
  97. package/dist/gitbook/outline.js.map +1 -0
  98. package/dist/gitbook/package-managers.d.ts +12 -0
  99. package/dist/gitbook/package-managers.d.ts.map +1 -0
  100. package/dist/gitbook/package-managers.js +93 -0
  101. package/dist/gitbook/package-managers.js.map +1 -0
  102. package/dist/gitbook/parse.d.ts +44 -0
  103. package/dist/gitbook/parse.d.ts.map +1 -0
  104. package/dist/gitbook/parse.js +1113 -0
  105. package/dist/gitbook/parse.js.map +1 -0
  106. package/dist/gitbook/serialize.d.ts +23 -0
  107. package/dist/gitbook/serialize.d.ts.map +1 -0
  108. package/dist/gitbook/serialize.js +498 -0
  109. package/dist/gitbook/serialize.js.map +1 -0
  110. package/dist/index.d.ts +34 -0
  111. package/dist/index.d.ts.map +1 -0
  112. package/dist/index.js +24 -0
  113. package/dist/index.js.map +1 -0
  114. package/dist/openapi/OpenApiOperation.d.ts +6 -0
  115. package/dist/openapi/OpenApiOperation.d.ts.map +1 -0
  116. package/dist/openapi/OpenApiOperation.js +112 -0
  117. package/dist/openapi/OpenApiOperation.js.map +1 -0
  118. package/dist/playground/InlineDemoPreview.d.ts +24 -0
  119. package/dist/playground/InlineDemoPreview.d.ts.map +1 -0
  120. package/dist/playground/InlineDemoPreview.js +48 -0
  121. package/dist/playground/InlineDemoPreview.js.map +1 -0
  122. package/dist/playground/PlaygroundStreamdown.d.ts +16 -0
  123. package/dist/playground/PlaygroundStreamdown.d.ts.map +1 -0
  124. package/dist/playground/PlaygroundStreamdown.js +22 -0
  125. package/dist/playground/PlaygroundStreamdown.js.map +1 -0
  126. package/dist/playground/ReactCodePreview.d.ts +64 -0
  127. package/dist/playground/ReactCodePreview.d.ts.map +1 -0
  128. package/dist/playground/ReactCodePreview.js +108 -0
  129. package/dist/playground/ReactCodePreview.js.map +1 -0
  130. package/dist/playground/filesystem.d.ts +27 -0
  131. package/dist/playground/filesystem.d.ts.map +1 -0
  132. package/dist/playground/filesystem.js +65 -0
  133. package/dist/playground/filesystem.js.map +1 -0
  134. package/dist/playground/index.d.ts +9 -0
  135. package/dist/playground/index.d.ts.map +1 -0
  136. package/dist/playground/index.js +7 -0
  137. package/dist/playground/index.js.map +1 -0
  138. package/dist/playground/project.d.ts +57 -0
  139. package/dist/playground/project.d.ts.map +1 -0
  140. package/dist/playground/project.js +137 -0
  141. package/dist/playground/project.js.map +1 -0
  142. package/dist/replay/NativeReplay.d.ts +9 -0
  143. package/dist/replay/NativeReplay.d.ts.map +1 -0
  144. package/dist/replay/NativeReplay.js +173 -0
  145. package/dist/replay/NativeReplay.js.map +1 -0
  146. package/dist/replay/ReplayPreview.d.ts +33 -0
  147. package/dist/replay/ReplayPreview.d.ts.map +1 -0
  148. package/dist/replay/ReplayPreview.js +91 -0
  149. package/dist/replay/ReplayPreview.js.map +1 -0
  150. package/dist/replay/index.d.ts +5 -0
  151. package/dist/replay/index.d.ts.map +1 -0
  152. package/dist/replay/index.js +4 -0
  153. package/dist/replay/index.js.map +1 -0
  154. package/dist/replay/sanitize.d.ts +4 -0
  155. package/dist/replay/sanitize.d.ts.map +1 -0
  156. package/dist/replay/sanitize.js +86 -0
  157. package/dist/replay/sanitize.js.map +1 -0
  158. package/dist/replay/url.d.ts +8 -0
  159. package/dist/replay/url.d.ts.map +1 -0
  160. package/dist/replay/url.js +41 -0
  161. package/dist/replay/url.js.map +1 -0
  162. package/dist/source/SourcePreview.d.ts +13 -0
  163. package/dist/source/SourcePreview.d.ts.map +1 -0
  164. package/dist/source/SourcePreview.js +47 -0
  165. package/dist/source/SourcePreview.js.map +1 -0
  166. package/dist/source/client.d.ts +7 -0
  167. package/dist/source/client.d.ts.map +1 -0
  168. package/dist/source/client.js +52 -0
  169. package/dist/source/client.js.map +1 -0
  170. package/dist/source/index.d.ts +6 -0
  171. package/dist/source/index.d.ts.map +1 -0
  172. package/dist/source/index.js +3 -0
  173. package/dist/source/index.js.map +1 -0
  174. package/dist/source/types.d.ts +33 -0
  175. package/dist/source/types.d.ts.map +1 -0
  176. package/dist/source/types.js +2 -0
  177. package/dist/source/types.js.map +1 -0
  178. package/dist/streamdown.d.ts +19 -0
  179. package/dist/streamdown.d.ts.map +1 -0
  180. package/dist/streamdown.js +15 -0
  181. package/dist/streamdown.js.map +1 -0
  182. package/dist/styles.css +2441 -0
  183. package/dist/video/VideoEmbed.d.ts +17 -0
  184. package/dist/video/VideoEmbed.d.ts.map +1 -0
  185. package/dist/video/VideoEmbed.js +12 -0
  186. package/dist/video/VideoEmbed.js.map +1 -0
  187. package/dist/video/index.d.ts +3 -0
  188. package/dist/video/index.d.ts.map +1 -0
  189. package/dist/video/index.js +2 -0
  190. package/dist/video/index.js.map +1 -0
  191. package/dist/vite/index.d.ts +21 -0
  192. package/dist/vite/index.d.ts.map +1 -0
  193. package/dist/vite/index.js +137 -0
  194. package/dist/vite/index.js.map +1 -0
  195. package/dist/viz/VizEmbed.d.ts +18 -0
  196. package/dist/viz/VizEmbed.d.ts.map +1 -0
  197. package/dist/viz/VizEmbed.js +12 -0
  198. package/dist/viz/VizEmbed.js.map +1 -0
  199. package/dist/viz/index.d.ts +4 -0
  200. package/dist/viz/index.d.ts.map +1 -0
  201. package/dist/viz/index.js +3 -0
  202. package/dist/viz/index.js.map +1 -0
  203. package/package.json +70 -34
  204. package/src/demo/types.ts +2 -2
  205. package/src/docs/DocsRenderer.tsx +31 -7
  206. package/src/docs/Mermaid.tsx +5 -3
  207. package/src/docs/math.ts +3 -0
  208. package/src/index.ts +10 -28
  209. package/src/playground/PlaygroundStreamdown.tsx +28 -61
  210. package/src/playground/filesystem.ts +10 -190
  211. package/src/playground/index.ts +4 -0
  212. package/src/playground/project.ts +194 -0
  213. package/src/replay/NativeReplay.tsx +236 -0
  214. package/src/replay/ReplayPreview.tsx +7 -226
  215. package/src/styles.css +91 -1
  216. package/src/replay/styles.css +0 -87
@@ -0,0 +1,158 @@
1
+ const LANGUAGES = { mjs: "js", cjs: "js", mts: "ts", cts: "ts", md: "markdown", yml: "yaml" };
2
+ export function languageForPath(path) {
3
+ const ext = path.split("/").pop()?.split(".").pop()?.toLowerCase();
4
+ if (!ext || ext === path)
5
+ return undefined;
6
+ return LANGUAGES[ext] ?? ext;
7
+ }
8
+ const unwrap = async (value) => typeof value === "function" ? value() : value;
9
+ function trimSlashes(path) {
10
+ return path.replace(/\\/g, "/").replace(/\/+$/, "");
11
+ }
12
+ /** Picks the component out of a loaded module: `default`, else the first function export. */
13
+ export function demoComponentFrom(module, src = "demo") {
14
+ if (typeof module === "function")
15
+ return module;
16
+ const record = (module ?? {});
17
+ const candidate = typeof record.default === "function"
18
+ ? record.default
19
+ : Object.values(record).find((value) => typeof value === "function");
20
+ if (typeof candidate !== "function")
21
+ throw new Error(`Demo ${src} has no default-exported component`);
22
+ return candidate;
23
+ }
24
+ /** Orders files entry first, then top-level before nested, then by path. */
25
+ export function sortDemoFiles(files, entry = "index.tsx") {
26
+ const depth = (path) => path.split("/").length;
27
+ return [...files].sort((a, b) => {
28
+ if (a.path === entry)
29
+ return -1;
30
+ if (b.path === entry)
31
+ return 1;
32
+ return depth(a.path) - depth(b.path) || a.path.localeCompare(b.path);
33
+ });
34
+ }
35
+ /**
36
+ * Build a `DemoResolver` from Vite `import.meta.glob` maps. Each `<page>/<example>`
37
+ * folder holds an entry module (default export = the demo component, which receives
38
+ * `variant`), any number of source files, and an optional `meta.json`.
39
+ */
40
+ export function createGlobDemoResolver(options) {
41
+ const defaultEntry = options.entry ?? "index.tsx";
42
+ const root = options.root === undefined ? undefined : trimSlashes(options.root);
43
+ // Demo ids come from the entry modules: with `root`, the first two folders under it;
44
+ // without, the last two folders of each entry path.
45
+ const folders = new Map(); // src → folder prefix (with trailing slash)
46
+ for (const key of Object.keys(options.modules)) {
47
+ const path = key.replace(/\\/g, "/");
48
+ if (root !== undefined) {
49
+ const prefix = root ? `${root}/` : "";
50
+ if (!path.startsWith(prefix))
51
+ continue;
52
+ const parts = path.slice(prefix.length).split("/");
53
+ if (parts.length < 3)
54
+ continue;
55
+ const src = `${parts[0]}/${parts[1]}`;
56
+ if (!folders.has(src))
57
+ folders.set(src, `${prefix}${src}/`);
58
+ }
59
+ else {
60
+ const parts = path.split("/").slice(0, -1);
61
+ if (parts.length < 2)
62
+ continue;
63
+ const src = parts.slice(-2).join("/");
64
+ if (!folders.has(src))
65
+ folders.set(src, `${parts.join("/")}/`);
66
+ }
67
+ }
68
+ /** The key's path relative to the demo folder, or null when it lives elsewhere. */
69
+ const inFolder = (src, key) => {
70
+ const prefix = folders.get(src);
71
+ const path = key.replace(/\\/g, "/");
72
+ return prefix && path.startsWith(prefix) ? path.slice(prefix.length) : null;
73
+ };
74
+ const metaCache = new Map();
75
+ const filesCache = new Map();
76
+ const loadCache = new Map();
77
+ const meta = (src) => {
78
+ let hit = metaCache.get(src);
79
+ if (!hit) {
80
+ const key = Object.keys(options.metas ?? {}).find((k) => inFolder(src, k) === "meta.json");
81
+ hit = key
82
+ ? unwrap(options.metas[key]).then((m) => {
83
+ const value = m;
84
+ return value && typeof value === "object" && "default" in value && value.default ? value.default : value;
85
+ })
86
+ : Promise.resolve(undefined);
87
+ metaCache.set(src, hit);
88
+ }
89
+ return hit;
90
+ };
91
+ const entryFor = async (src) => (await meta(src))?.entry ?? defaultEntry;
92
+ return {
93
+ list: () => [...folders.keys()].sort(),
94
+ meta,
95
+ files(src) {
96
+ let hit = filesCache.get(src);
97
+ if (!hit) {
98
+ hit = (async () => {
99
+ const entry = await entryFor(src);
100
+ const found = Object.entries(options.sources)
101
+ .map(([key, value]) => ({ path: inFolder(src, key), value }))
102
+ .filter((f) => !!f.path && f.path !== "meta.json" && !options.exclude?.(f.path, src));
103
+ const files = await Promise.all(found.map(async ({ path, value }) => {
104
+ const content = await unwrap(value);
105
+ const text = typeof content === "string"
106
+ ? content
107
+ : content && typeof content === "object" && typeof content.default === "string"
108
+ ? content.default
109
+ : String(content);
110
+ return { path, content: text, language: languageForPath(path) };
111
+ }));
112
+ return sortDemoFiles(files, entry);
113
+ })();
114
+ filesCache.set(src, hit);
115
+ }
116
+ return hit;
117
+ },
118
+ load(src) {
119
+ let hit = loadCache.get(src);
120
+ if (!hit) {
121
+ hit = (async () => {
122
+ const entry = await entryFor(src);
123
+ const keys = Object.keys(options.modules).filter((k) => inFolder(src, k) !== null);
124
+ const key = keys.find((k) => inFolder(src, k) === entry) ?? keys[0];
125
+ if (!key)
126
+ throw new Error(`No demo module found for ${src}`);
127
+ return demoComponentFrom(await unwrap(options.modules[key]), src);
128
+ })();
129
+ hit.catch(() => loadCache.delete(src));
130
+ loadCache.set(src, hit);
131
+ }
132
+ return hit;
133
+ },
134
+ ...(options.href ? { href: options.href } : {}),
135
+ };
136
+ }
137
+ /**
138
+ * The conventional deep link for one demo: `?demo=<src>` on the current page
139
+ * (or `base`). Hosts route it to `<DemoFullscreen>`; see `demoFromSearch`.
140
+ */
141
+ export function demoHref(src, options = {}) {
142
+ const base = options.base ?? (typeof location === "undefined" ? "/" : location.pathname);
143
+ const params = new URLSearchParams({ [options.param ?? "demo"]: src });
144
+ if (options.variant)
145
+ params.set("variant", options.variant);
146
+ return `${base}?${params.toString().replace(/%2F/gi, "/")}`;
147
+ }
148
+ /** Reads the `?demo=<src>` (and optional `variant`) deep link. */
149
+ export function demoFromSearch(search, param = "demo") {
150
+ const query = search ?? (typeof location === "undefined" ? "" : location.search);
151
+ const params = new URLSearchParams(query);
152
+ const src = params.get(param);
153
+ if (!src)
154
+ return null;
155
+ const variant = params.get("variant");
156
+ return variant ? { src, variant } : { src };
157
+ }
158
+ //# sourceMappingURL=glob.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"glob.js","sourceRoot":"","sources":["../../src/demo/glob.ts"],"names":[],"mappings":"AAoCA,MAAM,SAAS,GAA2B,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,EAAE,CAAA;AAErH,MAAM,UAAU,eAAe,CAAC,IAAY;IAC1C,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,WAAW,EAAE,CAAA;IAClE,IAAI,CAAC,GAAG,IAAI,GAAG,KAAK,IAAI;QAAE,OAAO,SAAS,CAAA;IAC1C,OAAO,SAAS,CAAC,GAAG,CAAC,IAAI,GAAG,CAAA;AAC9B,CAAC;AAED,MAAM,MAAM,GAAG,KAAK,EAAM,KAAmB,EAAc,EAAE,CAC3D,OAAO,KAAK,KAAK,UAAU,CAAC,CAAC,CAAE,KAAiB,EAAE,CAAC,CAAC,CAAC,KAAK,CAAA;AAE5D,SAAS,WAAW,CAAC,IAAY;IAC/B,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAA;AACrD,CAAC;AAED,6FAA6F;AAC7F,MAAM,UAAU,iBAAiB,CAAC,MAAe,EAAE,GAAG,GAAG,MAAM;IAC7D,IAAI,OAAO,MAAM,KAAK,UAAU;QAAE,OAAO,MAAuB,CAAA;IAChE,MAAM,MAAM,GAAG,CAAC,MAAM,IAAI,EAAE,CAA4B,CAAA;IACxD,MAAM,SAAS,GACb,OAAO,MAAM,CAAC,OAAO,KAAK,UAAU;QAClC,CAAC,CAAC,MAAM,CAAC,OAAO;QAChB,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,KAAK,KAAK,UAAU,CAAC,CAAA;IACxE,IAAI,OAAO,SAAS,KAAK,UAAU;QAAE,MAAM,IAAI,KAAK,CAAC,QAAQ,GAAG,oCAAoC,CAAC,CAAA;IACrG,OAAO,SAA0B,CAAA;AACnC,CAAC;AAED,4EAA4E;AAC5E,MAAM,UAAU,aAAa,CAAC,KAAiB,EAAE,KAAK,GAAG,WAAW;IAClE,MAAM,KAAK,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAA;IACtD,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QAC9B,IAAI,CAAC,CAAC,IAAI,KAAK,KAAK;YAAE,OAAO,CAAC,CAAC,CAAA;QAC/B,IAAI,CAAC,CAAC,IAAI,KAAK,KAAK;YAAE,OAAO,CAAC,CAAA;QAC9B,OAAO,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;IACtE,CAAC,CAAC,CAAA;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,sBAAsB,CAAC,OAAgC;IACrE,MAAM,YAAY,GAAG,OAAO,CAAC,KAAK,IAAI,WAAW,CAAA;IACjD,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;IAE/E,qFAAqF;IACrF,oDAAoD;IACpD,MAAM,OAAO,GAAG,IAAI,GAAG,EAAkB,CAAA,CAAC,4CAA4C;IACtF,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QAC/C,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;QACpC,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACvB,MAAM,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE,CAAA;YACrC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;gBAAE,SAAQ;YACtC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;YAClD,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;gBAAE,SAAQ;YAC9B,MAAM,GAAG,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,CAAA;YACrC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC;gBAAE,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,MAAM,GAAG,GAAG,GAAG,CAAC,CAAA;QAC7D,CAAC;aAAM,CAAC;YACN,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;YAC1C,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;gBAAE,SAAQ;YAC9B,MAAM,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;YACrC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC;gBAAE,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;QAChE,CAAC;IACH,CAAC;IACD,mFAAmF;IACnF,MAAM,QAAQ,GAAG,CAAC,GAAW,EAAE,GAAW,EAAE,EAAE;QAC5C,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;QAC/B,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;QACpC,OAAO,MAAM,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;IAC7E,CAAC,CAAA;IAED,MAAM,SAAS,GAAG,IAAI,GAAG,EAAyC,CAAA;IAClE,MAAM,UAAU,GAAG,IAAI,GAAG,EAA+B,CAAA;IACzD,MAAM,SAAS,GAAG,IAAI,GAAG,EAAkC,CAAA;IAE3D,MAAM,IAAI,GAAG,CAAC,GAAW,EAAE,EAAE;QAC3B,IAAI,GAAG,GAAG,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;QAC5B,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC,KAAK,WAAW,CAAC,CAAA;YAC1F,GAAG,GAAG,GAAG;gBACP,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,KAAM,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE;oBACrC,MAAM,KAAK,GAAG,CAAsC,CAAA;oBACpD,OAAO,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,SAAS,IAAI,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAA;gBAC1G,CAAC,CAAC;gBACJ,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;YAC9B,SAAS,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;QACzB,CAAC;QACD,OAAO,GAAG,CAAA;IACZ,CAAC,CAAA;IAED,MAAM,QAAQ,GAAG,KAAK,EAAE,GAAW,EAAE,EAAE,CAAC,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,IAAI,YAAY,CAAA;IAEhF,OAAO;QACL,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE;QACtC,IAAI;QACJ,KAAK,CAAC,GAAG;YACP,IAAI,GAAG,GAAG,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;YAC7B,IAAI,CAAC,GAAG,EAAE,CAAC;gBACT,GAAG,GAAG,CAAC,KAAK,IAAI,EAAE;oBAChB,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,GAAG,CAAC,CAAA;oBACjC,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC;yBAC1C,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;yBAC5D,MAAM,CAAC,CAAC,CAAC,EAAoD,EAAE,CAC9D,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,KAAK,WAAW,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAA;oBAC1E,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE;wBAClE,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,CAAA;wBACnC,MAAM,IAAI,GACR,OAAO,OAAO,KAAK,QAAQ;4BACzB,CAAC,CAAC,OAAO;4BACT,CAAC,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAQ,OAAiC,CAAC,OAAO,KAAK,QAAQ;gCACxG,CAAC,CAAE,OAA+B,CAAC,OAAO;gCAC1C,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;wBACvB,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,eAAe,CAAC,IAAI,CAAC,EAAE,CAAA;oBACjE,CAAC,CAAC,CAAC,CAAA;oBACH,OAAO,aAAa,CAAC,KAAK,EAAE,KAAK,CAAC,CAAA;gBACpC,CAAC,CAAC,EAAE,CAAA;gBACJ,UAAU,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;YAC1B,CAAC;YACD,OAAO,GAAG,CAAA;QACZ,CAAC;QACD,IAAI,CAAC,GAAG;YACN,IAAI,GAAG,GAAG,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;YAC5B,IAAI,CAAC,GAAG,EAAE,CAAC;gBACT,GAAG,GAAG,CAAC,KAAK,IAAI,EAAE;oBAChB,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,GAAG,CAAC,CAAA;oBACjC,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,CAAA;oBAClF,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC,KAAK,KAAK,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAA;oBACnE,IAAI,CAAC,GAAG;wBAAE,MAAM,IAAI,KAAK,CAAC,4BAA4B,GAAG,EAAE,CAAC,CAAA;oBAC5D,OAAO,iBAAiB,CAAC,MAAM,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;gBACnE,CAAC,CAAC,EAAE,CAAA;gBACJ,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAA;gBACtC,SAAS,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;YACzB,CAAC;YACD,OAAO,GAAG,CAAA;QACZ,CAAC;QACD,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAChD,CAAA;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,QAAQ,CAAC,GAAW,EAAE,UAA+D,EAAE;IACrG,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,CAAC,OAAO,QAAQ,KAAK,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAA;IACxF,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,IAAI,MAAM,CAAC,EAAE,GAAG,EAAE,CAAC,CAAA;IACtE,IAAI,OAAO,CAAC,OAAO;QAAE,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,OAAO,CAAC,OAAO,CAAC,CAAA;IAC3D,OAAO,GAAG,IAAI,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,EAAE,CAAA;AAC7D,CAAC;AAED,kEAAkE;AAClE,MAAM,UAAU,cAAc,CAAC,MAAe,EAAE,KAAK,GAAG,MAAM;IAC5D,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,OAAO,QAAQ,KAAK,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAA;IAChF,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,KAAK,CAAC,CAAA;IACzC,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;IAC7B,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAA;IACrB,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;IACrC,OAAO,OAAO,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAA;AAC7C,CAAC"}
@@ -0,0 +1,10 @@
1
+ export { DocstreamDemoContext, DocstreamDemoRuntimeContext, useDemoResolver, useDemoRuntime } from "./context.js";
2
+ export { DemoBlock, DemoFullscreen, DemoViewer, preloadDemos } from "./DemoViewer.js";
3
+ export type { DemoFullscreenProps, DemoViewerProps } from "./DemoViewer.js";
4
+ export { createGlobDemoResolver, demoComponentFrom, demoFromSearch, demoHref, languageForPath, sortDemoFiles, } from "./glob.js";
5
+ export type { GlobDemoResolverOptions } from "./glob.js";
6
+ export { defaultDemoMarkdown, inlineDemoMarkdown, inlineDemoNode, resolveDemosToMarkdown, toInlineFiles } from "./markdown.js";
7
+ export { cssToSurface, surfaceToCss } from "./surface.js";
8
+ export type { DemoMarkdownFormat, ResolveDemosOptions, ResolvedDemo } from "./markdown.js";
9
+ export type { DemoComponent, DemoComponentProps, DemoFile, DemoMeta, DemoResolver, DemoRuntimeOptions, DemoVariant, InlineDemoRuntime, InlineDemoRuntimeProps, } from "./types.js";
10
+ //# sourceMappingURL=index.d.ts.map
@@ -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,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAA;AAC9G,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAClF,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,6 @@
1
+ export { DocstreamDemoContext, DocstreamDemoRuntimeContext, useDemoResolver, useDemoRuntime } from "./context.js";
2
+ export { DemoBlock, DemoFullscreen, DemoViewer, preloadDemos } from "./DemoViewer.js";
3
+ export { createGlobDemoResolver, demoComponentFrom, demoFromSearch, demoHref, languageForPath, sortDemoFiles, } from "./glob.js";
4
+ export { defaultDemoMarkdown, inlineDemoMarkdown, inlineDemoNode, resolveDemosToMarkdown, toInlineFiles } from "./markdown.js";
5
+ export { cssToSurface, surfaceToCss } from "./surface.js";
6
+ //# 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,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAA;AAC9G,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAElF,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":"AAEA;;;;;;GAMG;AAEH,mFAAmF;AACnF,MAAM,UAAU,YAAY,CAAC,OAAwC;IACnE,OAAO,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC;SAC3B,MAAM,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC;SAC5G,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,IAAI,EAAE,KAAK,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;SAC/D,IAAI,CAAC,IAAI,CAAC,CAAA;AACf,CAAC;AAED,8EAA8E;AAC9E,SAAS,YAAY,CAAC,GAAW;IAC/B,MAAM,GAAG,GAAa,EAAE,CAAA;IACxB,IAAI,KAAK,GAAG,CAAC,CAAA;IACb,IAAI,KAAK,GAAG,EAAE,CAAA;IACd,IAAI,OAAO,GAAG,EAAE,CAAA;IAChB,KAAK,MAAM,EAAE,IAAI,GAAG,EAAE,CAAC;QACrB,IAAI,KAAK,EAAE,CAAC;YACV,IAAI,EAAE,KAAK,KAAK;gBAAE,KAAK,GAAG,EAAE,CAAA;QAC9B,CAAC;aAAM,IAAI,EAAE,KAAK,GAAG,IAAI,EAAE,KAAK,GAAG;YAAE,KAAK,GAAG,EAAE,CAAA;aAC1C,IAAI,EAAE,KAAK,GAAG;YAAE,KAAK,EAAE,CAAA;aACvB,IAAI,EAAE,KAAK,GAAG;YAAE,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,CAAA;aAC9C,IAAI,EAAE,KAAK,GAAG,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;YACnC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;YACjB,OAAO,GAAG,EAAE,CAAA;YACZ,SAAQ;QACV,CAAC;QACD,OAAO,IAAI,EAAE,CAAA;IACf,CAAC;IACD,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IACjB,OAAO,GAAG,CAAA;AACZ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAAC,GAAW;IACtC,MAAM,KAAK,GAAoC,EAAE,CAAA;IACjD,KAAK,MAAM,WAAW,IAAI,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC;QAC5C,MAAM,KAAK,GAAG,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;QACtC,IAAI,KAAK,GAAG,CAAC;YAAE,SAAQ;QACvB,MAAM,GAAG,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,IAAI,EAAE,CAAA;QAC9C,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;QACjD,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK;YAAE,SAAQ;QAC5B,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACzB,KAAK,CAAC,GAAG,CAAC,GAAG,KAAK,CAAA;YAClB,SAAQ;QACV,CAAC;QACD,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC,EAAE,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAA;QACxE,KAAK,CAAC,IAAI,CAAC,GAAG,mBAAmB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAA;IACvE,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,OAAoD;IAC/E,OAAO,OAAO,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAE,OAAyB,CAAC,CAAC,CAAC,SAAS,CAAA;AACxF,CAAC"}