pd-markdown 2.0.3 → 2.0.4-1

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 (66) hide show
  1. package/README.md +36 -0
  2. package/package.json +11 -4
  3. package/packages/parser/dist/index.cjs +1 -1
  4. package/packages/parser/dist/index.mjs +4 -184
  5. package/packages/parser/dist/index.mjs.map +1 -1
  6. package/packages/parser/dist/plugins/transform/heading.mjs +39 -0
  7. package/packages/parser/dist/plugins/transform/heading.mjs.map +1 -0
  8. package/packages/parser/dist/plugins/transform/list.mjs +21 -0
  9. package/packages/parser/dist/plugins/transform/list.mjs.map +1 -0
  10. package/packages/parser/dist/plugins/transform/table.mjs +40 -0
  11. package/packages/parser/dist/plugins/transform/table.mjs.map +1 -0
  12. package/packages/parser/dist/processor.mjs +100 -0
  13. package/packages/parser/dist/processor.mjs.map +1 -0
  14. package/packages/web/dist/MarkdownRenderer-CflS5zy_.js +43 -0
  15. package/packages/web/dist/MarkdownRenderer-CflS5zy_.js.map +1 -0
  16. package/packages/web/dist/NodeRenderer-DTR-8m1G.js +225 -0
  17. package/packages/web/dist/NodeRenderer-DTR-8m1G.js.map +1 -0
  18. package/packages/web/dist/client.cjs +16 -0
  19. package/packages/web/dist/client.cjs.map +1 -0
  20. package/packages/web/dist/client.mjs +5 -0
  21. package/packages/web/dist/client.mjs.map +1 -0
  22. package/packages/web/dist/components/MarkdownRenderer.mjs +41 -0
  23. package/packages/web/dist/components/MarkdownRenderer.mjs.map +1 -0
  24. package/packages/web/dist/components/NodeRenderer.mjs +131 -0
  25. package/packages/web/dist/components/NodeRenderer.mjs.map +1 -0
  26. package/packages/web/dist/components/StreamMarkdownRenderer.mjs +145 -0
  27. package/packages/web/dist/components/StreamMarkdownRenderer.mjs.map +1 -0
  28. package/packages/web/dist/components/context.mjs +17 -0
  29. package/packages/web/dist/components/context.mjs.map +1 -0
  30. package/packages/web/dist/components/defaults/Blockquote.mjs +8 -0
  31. package/packages/web/dist/components/defaults/Blockquote.mjs.map +1 -0
  32. package/packages/web/dist/components/defaults/Code.mjs +12 -0
  33. package/packages/web/dist/components/defaults/Code.mjs.map +1 -0
  34. package/packages/web/dist/components/defaults/Heading.mjs +10 -0
  35. package/packages/web/dist/components/defaults/Heading.mjs.map +1 -0
  36. package/packages/web/dist/components/defaults/Image.mjs +8 -0
  37. package/packages/web/dist/components/defaults/Image.mjs.map +1 -0
  38. package/packages/web/dist/components/defaults/Link.mjs +10 -0
  39. package/packages/web/dist/components/defaults/Link.mjs.map +1 -0
  40. package/packages/web/dist/components/defaults/List.mjs +17 -0
  41. package/packages/web/dist/components/defaults/List.mjs.map +1 -0
  42. package/packages/web/dist/components/defaults/Paragraph.mjs +8 -0
  43. package/packages/web/dist/components/defaults/Paragraph.mjs.map +1 -0
  44. package/packages/web/dist/components/defaults/Table.mjs +21 -0
  45. package/packages/web/dist/components/defaults/Table.mjs.map +1 -0
  46. package/packages/web/dist/components/defaults/index.mjs +29 -0
  47. package/packages/web/dist/components/defaults/index.mjs.map +1 -0
  48. package/packages/web/dist/context-DR5sJXYw.js +86 -0
  49. package/packages/web/dist/context-DR5sJXYw.js.map +1 -0
  50. package/packages/web/dist/hooks/useMarkdown.mjs +31 -0
  51. package/packages/web/dist/hooks/useMarkdown.mjs.map +1 -0
  52. package/packages/web/dist/hooks/useStreamMarkdown.mjs +274 -0
  53. package/packages/web/dist/hooks/useStreamMarkdown.mjs.map +1 -0
  54. package/packages/web/dist/index.cjs +29 -712
  55. package/packages/web/dist/index.cjs.map +1 -1
  56. package/packages/web/dist/index.d.ts +28 -26
  57. package/packages/web/dist/index.mjs +15 -693
  58. package/packages/web/dist/index.mjs.map +1 -1
  59. package/packages/web/dist/server.cjs +25 -0
  60. package/packages/web/dist/server.cjs.map +1 -0
  61. package/packages/web/dist/server.mjs +12 -0
  62. package/packages/web/dist/server.mjs.map +1 -0
  63. package/packages/web/dist/useStreamMarkdown-CXM4Hrzx.js +417 -0
  64. package/packages/web/dist/useStreamMarkdown-CXM4Hrzx.js.map +1 -0
  65. package/packages/web/dist/useStreamMarkdown-DEOfH8Ve.js +459 -0
  66. package/packages/web/dist/useStreamMarkdown-DEOfH8Ve.js.map +1 -0
@@ -0,0 +1,225 @@
1
+ 'use strict';
2
+
3
+ var jsxRuntime = require('react/jsx-runtime');
4
+
5
+ const Heading = ({ node, children }) => {
6
+ const Tag = `h${node.depth}`;
7
+ const id = node.data && 'id' in node.data ? node.data.id : undefined;
8
+ return jsxRuntime.jsx(Tag, { id: id, children: children });
9
+ };
10
+
11
+ const Paragraph = ({ children }) => {
12
+ return jsxRuntime.jsx("p", { children: children });
13
+ };
14
+
15
+ const List = ({ node, children }) => {
16
+ const Tag = node.ordered ? 'ol' : 'ul';
17
+ const start = node.ordered && node.start != null && node.start !== 1 ? node.start : undefined;
18
+ return jsxRuntime.jsx(Tag, { start: start, children: children });
19
+ };
20
+ const ListItem = ({ node, children }) => {
21
+ // Handle task list items
22
+ if (typeof node.checked === 'boolean') {
23
+ return (jsxRuntime.jsxs("li", { className: "task-list-item", children: [jsxRuntime.jsx("input", { type: "checkbox", checked: node.checked, readOnly: true }), jsxRuntime.jsx("span", { children: children })] }));
24
+ }
25
+ return jsxRuntime.jsx("li", { children: children });
26
+ };
27
+
28
+ const Table = ({ children }) => {
29
+ return (jsxRuntime.jsx("table", { children: children }));
30
+ };
31
+ const TableRow = ({ children, isHeader }) => {
32
+ if (isHeader) {
33
+ return (jsxRuntime.jsx("thead", { children: jsxRuntime.jsx("tr", { children: children }) }));
34
+ }
35
+ return jsxRuntime.jsx("tr", { children: children });
36
+ };
37
+ const TableCell = ({ node, children }) => {
38
+ const isHeader = node.data?.isHeader;
39
+ const align = node.data?.align;
40
+ const Tag = isHeader ? 'th' : 'td';
41
+ const style = align ? { textAlign: align } : undefined;
42
+ return jsxRuntime.jsx(Tag, { style: style, children: children });
43
+ };
44
+
45
+ const Code = ({ node }) => {
46
+ const className = node.lang ? `language-${node.lang}` : undefined;
47
+ return (jsxRuntime.jsx("pre", { children: jsxRuntime.jsx("code", { className: className, children: node.value }) }));
48
+ };
49
+ const InlineCodeComponent = ({ node }) => {
50
+ return jsxRuntime.jsx("code", { children: node.value });
51
+ };
52
+
53
+ const Link = ({ node, children }) => {
54
+ // Basic security: prevent javascript: URLs
55
+ const href = node.url?.startsWith('javascript:') ? '#' : node.url;
56
+ return (jsxRuntime.jsx("a", { href: href, title: node.title || undefined, children: children }));
57
+ };
58
+
59
+ const Image = ({ node }) => {
60
+ return jsxRuntime.jsx("img", { src: node.url, alt: node.alt || '', title: node.title || undefined });
61
+ };
62
+
63
+ const Blockquote = ({ children }) => {
64
+ return jsxRuntime.jsx("blockquote", { children: children });
65
+ };
66
+
67
+ /**
68
+ * Default component map
69
+ */
70
+ const defaultComponents = {
71
+ heading: Heading,
72
+ paragraph: Paragraph,
73
+ list: List,
74
+ listItem: ListItem,
75
+ table: Table,
76
+ tableRow: TableRow,
77
+ tableCell: TableCell,
78
+ code: Code,
79
+ inlineCode: InlineCodeComponent,
80
+ link: Link,
81
+ image: Image,
82
+ blockquote: Blockquote,
83
+ };
84
+
85
+ /**
86
+ * Recursive node renderer that renders AST nodes to React elements
87
+ */
88
+ const NodeRenderer = ({ node, components = {} }) => {
89
+ // Get the component for this node type
90
+ const getComponent = (type) => {
91
+ return components[type] || defaultComponents[type];
92
+ };
93
+ // Render children nodes
94
+ const renderChildren = (children) => {
95
+ return children.map((child, index) => (jsxRuntime.jsx(NodeRenderer, { node: child, components: components }, index)));
96
+ };
97
+ // Render phrasing content (inline elements)
98
+ const renderPhrasingContent = (children) => {
99
+ return children.map((child, index) => {
100
+ switch (child.type) {
101
+ case 'text':
102
+ return child.value;
103
+ case 'strong':
104
+ return jsxRuntime.jsx("strong", { children: renderPhrasingContent(child.children) }, index);
105
+ case 'emphasis':
106
+ return jsxRuntime.jsx("em", { children: renderPhrasingContent(child.children) }, index);
107
+ case 'delete':
108
+ return jsxRuntime.jsx("del", { children: renderPhrasingContent(child.children) }, index);
109
+ case 'inlineCode': {
110
+ const InlineCode = getComponent('inlineCode');
111
+ return InlineCode ? jsxRuntime.jsx(InlineCode, { node: child }, index) : jsxRuntime.jsx("code", { children: child.value }, index);
112
+ }
113
+ case 'link': {
114
+ const Link = getComponent('link');
115
+ return Link ? (jsxRuntime.jsx(Link, { node: child, children: renderPhrasingContent(child.children) }, index)) : (jsxRuntime.jsx("a", { href: child.url, children: renderPhrasingContent(child.children) }, index));
116
+ }
117
+ case 'image': {
118
+ const Image = getComponent('image');
119
+ return Image ? jsxRuntime.jsx(Image, { node: child }, index) : jsxRuntime.jsx("img", { src: child.url, alt: child.alt || '' }, index);
120
+ }
121
+ case 'break':
122
+ return jsxRuntime.jsx("br", {}, index);
123
+ case 'html':
124
+ // For safety, render HTML as text in React
125
+ return child.value;
126
+ default:
127
+ // For unknown inline types, try to render as text if possible
128
+ if ('value' in child && typeof child.value === 'string') {
129
+ return child.value;
130
+ }
131
+ if ('children' in child) {
132
+ return renderPhrasingContent(child.children);
133
+ }
134
+ return null;
135
+ }
136
+ });
137
+ };
138
+ // Handle different node types
139
+ switch (node.type) {
140
+ case 'root':
141
+ return jsxRuntime.jsx(jsxRuntime.Fragment, { children: renderChildren(node.children) });
142
+ case 'heading': {
143
+ const Heading = getComponent('heading');
144
+ return Heading ? (jsxRuntime.jsx(Heading, { node: node, children: renderPhrasingContent(node.children) })) : null;
145
+ }
146
+ case 'paragraph': {
147
+ const Paragraph = getComponent('paragraph');
148
+ return Paragraph ? (jsxRuntime.jsx(Paragraph, { node: node, children: renderPhrasingContent(node.children) })) : null;
149
+ }
150
+ case 'list': {
151
+ const List = getComponent('list');
152
+ return List ? (jsxRuntime.jsx(List, { node: node, children: renderChildren(node.children) })) : null;
153
+ }
154
+ case 'listItem': {
155
+ const ListItem = getComponent('listItem');
156
+ const children = node.children.map((child, index) => {
157
+ // Unwrap single paragraph in list item
158
+ if (child.type === 'paragraph' && node.children.length === 1) {
159
+ return renderPhrasingContent(child.children);
160
+ }
161
+ return jsxRuntime.jsx(NodeRenderer, { node: child }, index);
162
+ });
163
+ return ListItem ? jsxRuntime.jsx(ListItem, { node: node, children: children }) : null;
164
+ }
165
+ case 'table': {
166
+ const Table = getComponent('table');
167
+ const TableRow = getComponent('tableRow');
168
+ if (!Table || !TableRow)
169
+ return null;
170
+ const [headerRow, ...bodyRows] = node.children;
171
+ return (jsxRuntime.jsxs(Table, { node: node, children: [headerRow && (jsxRuntime.jsx(TableRow, { node: headerRow, isHeader: true, children: headerRow.children.map((cell, index) => (jsxRuntime.jsx(NodeRenderer, { node: cell }, index))) })), bodyRows.length > 0 && (jsxRuntime.jsx("tbody", { children: bodyRows.map((row, rowIndex) => (jsxRuntime.jsx(TableRow, { node: row, children: row.children.map((cell, cellIndex) => (jsxRuntime.jsx(NodeRenderer, { node: cell }, cellIndex))) }, rowIndex))) }))] }));
172
+ }
173
+ case 'tableCell': {
174
+ const TableCell = getComponent('tableCell');
175
+ return TableCell ? (jsxRuntime.jsx(TableCell, { node: node, children: renderPhrasingContent(node.children) })) : null;
176
+ }
177
+ case 'code': {
178
+ const Code = getComponent('code');
179
+ return Code ? jsxRuntime.jsx(Code, { node: node }) : null;
180
+ }
181
+ case 'blockquote': {
182
+ const Blockquote = getComponent('blockquote');
183
+ return Blockquote ? (jsxRuntime.jsx(Blockquote, { node: node, children: renderChildren(node.children) })) : null;
184
+ }
185
+ case 'thematicBreak':
186
+ return jsxRuntime.jsx("hr", {});
187
+ case 'html':
188
+ // For safety, don't render raw HTML by default
189
+ return null;
190
+ case 'yaml':
191
+ // Frontmatter shouldn't be rendered
192
+ return null;
193
+ default: {
194
+ // Try to find a custom component for unknown types
195
+ const CustomComponent = getComponent(node.type);
196
+ if (CustomComponent) {
197
+ const children = 'children' in node
198
+ ? renderChildren(node.children)
199
+ : undefined;
200
+ return jsxRuntime.jsx(CustomComponent, { node: node, children: children });
201
+ }
202
+ // Fallback: try to render children if available
203
+ if ('children' in node) {
204
+ return jsxRuntime.jsx(jsxRuntime.Fragment, { children: renderChildren(node.children) });
205
+ }
206
+ return null;
207
+ }
208
+ }
209
+ };
210
+
211
+ exports.Blockquote = Blockquote;
212
+ exports.Code = Code;
213
+ exports.Heading = Heading;
214
+ exports.Image = Image;
215
+ exports.InlineCodeComponent = InlineCodeComponent;
216
+ exports.Link = Link;
217
+ exports.List = List;
218
+ exports.ListItem = ListItem;
219
+ exports.NodeRenderer = NodeRenderer;
220
+ exports.Paragraph = Paragraph;
221
+ exports.Table = Table;
222
+ exports.TableCell = TableCell;
223
+ exports.TableRow = TableRow;
224
+ exports.defaultComponents = defaultComponents;
225
+ //# sourceMappingURL=NodeRenderer-DTR-8m1G.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NodeRenderer-DTR-8m1G.js","sources":["../src/components/defaults/Heading.tsx","../src/components/defaults/Paragraph.tsx","../src/components/defaults/List.tsx","../src/components/defaults/Table.tsx","../src/components/defaults/Code.tsx","../src/components/defaults/Link.tsx","../src/components/defaults/Image.tsx","../src/components/defaults/Blockquote.tsx","../src/components/defaults/index.tsx","../src/components/NodeRenderer.tsx"],"sourcesContent":[null,null,null,null,null,null,null,null,null,null],"names":["_jsx","_jsxs","_Fragment"],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ 'use strict';
2
+
3
+ var useStreamMarkdown = require('./useStreamMarkdown-DEOfH8Ve.js');
4
+ require('react');
5
+ require('pd-markdown-parser');
6
+ require('react/jsx-runtime');
7
+ require('./NodeRenderer-DTR-8m1G.js');
8
+
9
+
10
+
11
+ exports.MarkdownContext = useStreamMarkdown.MarkdownContext;
12
+ exports.StreamMarkdownRenderer = useStreamMarkdown.StreamMarkdownRenderer;
13
+ exports.useMarkdown = useStreamMarkdown.useMarkdown;
14
+ exports.useMarkdownContext = useStreamMarkdown.useMarkdownContext;
15
+ exports.useStreamMarkdown = useStreamMarkdown.useStreamMarkdown;
16
+ //# sourceMappingURL=client.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;"}
@@ -0,0 +1,5 @@
1
+ export { useMarkdown } from './hooks/useMarkdown.mjs';
2
+ export { MarkdownContext, useMarkdownContext } from './components/context.mjs';
3
+ export { StreamMarkdownRenderer } from './components/StreamMarkdownRenderer.mjs';
4
+ export { useStreamMarkdown } from './hooks/useStreamMarkdown.mjs';
5
+ //# sourceMappingURL=client.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;"}
@@ -0,0 +1,41 @@
1
+ import { jsx } from 'react/jsx-runtime';
2
+ import { createParser } from 'pd-markdown-parser';
3
+ import { NodeRenderer } from './NodeRenderer.mjs';
4
+
5
+ // Singleton parser for client-side use
6
+ let defaultParser = null;
7
+ function getParser(options) {
8
+ if (options) {
9
+ return createParser(options);
10
+ }
11
+ if (!defaultParser) {
12
+ defaultParser = createParser();
13
+ }
14
+ return defaultParser;
15
+ }
16
+ /**
17
+ * Main markdown renderer component
18
+ *
19
+ * Supports both client-side and server-side rendering:
20
+ * - Pass `source` for automatic parsing
21
+ * - Pass `ast` for pre-parsed content (SSR optimization)
22
+ */
23
+ const MarkdownRenderer = ({ source, ast, components = {}, className, style, parserOptions, }) => {
24
+ // Use provided AST or parse source
25
+ let tree;
26
+ if (ast) {
27
+ tree = ast;
28
+ }
29
+ else if (source) {
30
+ const parser = getParser(parserOptions);
31
+ tree = parser.parse(source);
32
+ }
33
+ else {
34
+ // No content provided
35
+ return null;
36
+ }
37
+ return (jsx("div", { className: className, style: style, children: jsx(NodeRenderer, { node: tree, components: components }) }));
38
+ };
39
+
40
+ export { MarkdownRenderer };
41
+ //# sourceMappingURL=MarkdownRenderer.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MarkdownRenderer.mjs","sources":["../../src/components/MarkdownRenderer.tsx"],"sourcesContent":[null],"names":["_jsx"],"mappings":";;;;AAqBA;AACA,IAAI,aAAa,GAA2C,IAAI;AAEhE,SAAS,SAAS,CAAC,OAAuB,EAAA;IACxC,IAAI,OAAO,EAAE;AACX,QAAA,OAAO,YAAY,CAAC,OAAO,CAAC;IAC9B;IACA,IAAI,CAAC,aAAa,EAAE;QAClB,aAAa,GAAG,YAAY,EAAE;IAChC;AACA,IAAA,OAAO,aAAa;AACtB;AAEA;;;;;;AAMG;MACU,gBAAgB,GAA8B,CAAC,EAC1D,MAAM,EACN,GAAG,EACH,UAAU,GAAG,EAAE,EACf,SAAS,EACT,KAAK,EACL,aAAa,GACd,KAAI;;AAEH,IAAA,IAAI,IAAU;IACd,IAAI,GAAG,EAAE;QACP,IAAI,GAAG,GAAG;IACZ;SAAO,IAAI,MAAM,EAAE;AACjB,QAAA,MAAM,MAAM,GAAG,SAAS,CAAC,aAAa,CAAC;AACvC,QAAA,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC;IAC7B;SAAO;;AAEL,QAAA,OAAO,IAAI;IACb;IAEA,QACEA,aAAK,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAA,QAAA,EACrCA,GAAA,CAAC,YAAY,EAAA,EAAC,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,UAAU,EAAA,CAAI,EAAA,CAChD;AAEV;;;;"}
@@ -0,0 +1,131 @@
1
+ import { jsx, Fragment, jsxs } from 'react/jsx-runtime';
2
+ import { defaultComponents } from './defaults/index.mjs';
3
+
4
+ /**
5
+ * Recursive node renderer that renders AST nodes to React elements
6
+ */
7
+ const NodeRenderer = ({ node, components = {} }) => {
8
+ // Get the component for this node type
9
+ const getComponent = (type) => {
10
+ return components[type] || defaultComponents[type];
11
+ };
12
+ // Render children nodes
13
+ const renderChildren = (children) => {
14
+ return children.map((child, index) => (jsx(NodeRenderer, { node: child, components: components }, index)));
15
+ };
16
+ // Render phrasing content (inline elements)
17
+ const renderPhrasingContent = (children) => {
18
+ return children.map((child, index) => {
19
+ switch (child.type) {
20
+ case 'text':
21
+ return child.value;
22
+ case 'strong':
23
+ return jsx("strong", { children: renderPhrasingContent(child.children) }, index);
24
+ case 'emphasis':
25
+ return jsx("em", { children: renderPhrasingContent(child.children) }, index);
26
+ case 'delete':
27
+ return jsx("del", { children: renderPhrasingContent(child.children) }, index);
28
+ case 'inlineCode': {
29
+ const InlineCode = getComponent('inlineCode');
30
+ return InlineCode ? jsx(InlineCode, { node: child }, index) : jsx("code", { children: child.value }, index);
31
+ }
32
+ case 'link': {
33
+ const Link = getComponent('link');
34
+ return Link ? (jsx(Link, { node: child, children: renderPhrasingContent(child.children) }, index)) : (jsx("a", { href: child.url, children: renderPhrasingContent(child.children) }, index));
35
+ }
36
+ case 'image': {
37
+ const Image = getComponent('image');
38
+ return Image ? jsx(Image, { node: child }, index) : jsx("img", { src: child.url, alt: child.alt || '' }, index);
39
+ }
40
+ case 'break':
41
+ return jsx("br", {}, index);
42
+ case 'html':
43
+ // For safety, render HTML as text in React
44
+ return child.value;
45
+ default:
46
+ // For unknown inline types, try to render as text if possible
47
+ if ('value' in child && typeof child.value === 'string') {
48
+ return child.value;
49
+ }
50
+ if ('children' in child) {
51
+ return renderPhrasingContent(child.children);
52
+ }
53
+ return null;
54
+ }
55
+ });
56
+ };
57
+ // Handle different node types
58
+ switch (node.type) {
59
+ case 'root':
60
+ return jsx(Fragment, { children: renderChildren(node.children) });
61
+ case 'heading': {
62
+ const Heading = getComponent('heading');
63
+ return Heading ? (jsx(Heading, { node: node, children: renderPhrasingContent(node.children) })) : null;
64
+ }
65
+ case 'paragraph': {
66
+ const Paragraph = getComponent('paragraph');
67
+ return Paragraph ? (jsx(Paragraph, { node: node, children: renderPhrasingContent(node.children) })) : null;
68
+ }
69
+ case 'list': {
70
+ const List = getComponent('list');
71
+ return List ? (jsx(List, { node: node, children: renderChildren(node.children) })) : null;
72
+ }
73
+ case 'listItem': {
74
+ const ListItem = getComponent('listItem');
75
+ const children = node.children.map((child, index) => {
76
+ // Unwrap single paragraph in list item
77
+ if (child.type === 'paragraph' && node.children.length === 1) {
78
+ return renderPhrasingContent(child.children);
79
+ }
80
+ return jsx(NodeRenderer, { node: child }, index);
81
+ });
82
+ return ListItem ? jsx(ListItem, { node: node, children: children }) : null;
83
+ }
84
+ case 'table': {
85
+ const Table = getComponent('table');
86
+ const TableRow = getComponent('tableRow');
87
+ if (!Table || !TableRow)
88
+ return null;
89
+ const [headerRow, ...bodyRows] = node.children;
90
+ return (jsxs(Table, { node: node, children: [headerRow && (jsx(TableRow, { node: headerRow, isHeader: true, children: headerRow.children.map((cell, index) => (jsx(NodeRenderer, { node: cell }, index))) })), bodyRows.length > 0 && (jsx("tbody", { children: bodyRows.map((row, rowIndex) => (jsx(TableRow, { node: row, children: row.children.map((cell, cellIndex) => (jsx(NodeRenderer, { node: cell }, cellIndex))) }, rowIndex))) }))] }));
91
+ }
92
+ case 'tableCell': {
93
+ const TableCell = getComponent('tableCell');
94
+ return TableCell ? (jsx(TableCell, { node: node, children: renderPhrasingContent(node.children) })) : null;
95
+ }
96
+ case 'code': {
97
+ const Code = getComponent('code');
98
+ return Code ? jsx(Code, { node: node }) : null;
99
+ }
100
+ case 'blockquote': {
101
+ const Blockquote = getComponent('blockquote');
102
+ return Blockquote ? (jsx(Blockquote, { node: node, children: renderChildren(node.children) })) : null;
103
+ }
104
+ case 'thematicBreak':
105
+ return jsx("hr", {});
106
+ case 'html':
107
+ // For safety, don't render raw HTML by default
108
+ return null;
109
+ case 'yaml':
110
+ // Frontmatter shouldn't be rendered
111
+ return null;
112
+ default: {
113
+ // Try to find a custom component for unknown types
114
+ const CustomComponent = getComponent(node.type);
115
+ if (CustomComponent) {
116
+ const children = 'children' in node
117
+ ? renderChildren(node.children)
118
+ : undefined;
119
+ return jsx(CustomComponent, { node: node, children: children });
120
+ }
121
+ // Fallback: try to render children if available
122
+ if ('children' in node) {
123
+ return jsx(Fragment, { children: renderChildren(node.children) });
124
+ }
125
+ return null;
126
+ }
127
+ }
128
+ };
129
+
130
+ export { NodeRenderer };
131
+ //# sourceMappingURL=NodeRenderer.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NodeRenderer.mjs","sources":["../../src/components/NodeRenderer.tsx"],"sourcesContent":[null],"names":["_jsx","_Fragment","_jsxs"],"mappings":"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"}
@@ -0,0 +1,145 @@
1
+ import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
2
+ import { useRef, useState, useEffect, useMemo } from 'react';
3
+ import { createParser } from 'pd-markdown-parser';
4
+ import { NodeRenderer } from './NodeRenderer.mjs';
5
+
6
+ // ─── Styles ───────────────────────────────────────────────────────────
7
+ const cursorKeyframes = `
8
+ @keyframes pd-md-cursor-blink {
9
+ 0%, 100% { opacity: 1; }
10
+ 50% { opacity: 0; }
11
+ }
12
+
13
+ @keyframes pd-md-fade-in {
14
+ from { opacity: 0; transform: translateY(4px); }
15
+ to { opacity: 1; transform: translateY(0); }
16
+ }
17
+ `;
18
+ const cursorStyle = {
19
+ display: 'inline-block',
20
+ width: '2px',
21
+ height: '1.1em',
22
+ backgroundColor: 'currentColor',
23
+ marginLeft: '2px',
24
+ verticalAlign: 'text-bottom',
25
+ animation: 'pd-md-cursor-blink 1s step-end infinite',
26
+ };
27
+ // ─── Internal Parsed AST Hook ─────────────────────────────────────────
28
+ function useParsedAst(source, options) {
29
+ const parserRef = useRef(null);
30
+ const optionsRef = useRef(options);
31
+ if (!parserRef.current ||
32
+ JSON.stringify(optionsRef.current) !== JSON.stringify(options)) {
33
+ parserRef.current = createParser(options);
34
+ optionsRef.current = options;
35
+ }
36
+ return useMemo(() => {
37
+ try {
38
+ return parserRef.current.parse(source);
39
+ }
40
+ catch {
41
+ return { type: 'root', children: [] };
42
+ }
43
+ }, [source]);
44
+ }
45
+ // ─── Cursor Component ─────────────────────────────────────────────────
46
+ const StreamCursor = ({ customElement }) => {
47
+ if (customElement) {
48
+ return jsx(Fragment, { children: customElement });
49
+ }
50
+ return jsx("span", { style: cursorStyle, "aria-hidden": "true", "data-streaming-cursor": true });
51
+ };
52
+ // ─── Main Component ──────────────────────────────────────────────────
53
+ /**
54
+ * StreamMarkdownRenderer — A streaming-aware markdown renderer.
55
+ *
56
+ * This component is designed for rendering AI-generated streaming markdown.
57
+ * It shows a blinking cursor at the end while content is being streamed,
58
+ * and optionally animates new content blocks as they appear.
59
+ *
60
+ * Usage patterns:
61
+ *
62
+ * 1. **With `useStreamMarkdown` hook** (recommended):
63
+ * ```tsx
64
+ * const stream = useStreamMarkdown()
65
+ * // ... consume stream
66
+ * <StreamMarkdownRenderer
67
+ * source={stream.source}
68
+ * ast={stream.ast}
69
+ * isStreaming={stream.isStreaming}
70
+ * />
71
+ * ```
72
+ *
73
+ * 2. **Standalone** (pass source, let it parse internally):
74
+ * ```tsx
75
+ * <StreamMarkdownRenderer
76
+ * source={accumulatedText}
77
+ * isStreaming={isLoading}
78
+ * />
79
+ * ```
80
+ */
81
+ const StreamMarkdownRenderer = ({ source, isStreaming = false, ast: externalAst, components = {}, className, style, parserOptions, showCursor = true, cursorElement, animationClassName, enableAnimation = true, }) => {
82
+ // Use external AST if provided, otherwise parse internally
83
+ const internalAst = useParsedAst(externalAst ? '' : source, parserOptions);
84
+ const ast = externalAst || internalAst;
85
+ // Track previous child count for animation
86
+ const prevChildCountRef = useRef(0);
87
+ const [animatingIndices, setAnimatingIndices] = useState(new Set());
88
+ // Detect new blocks for animation
89
+ useEffect(() => {
90
+ const currentCount = ast.children.length;
91
+ const prevCount = prevChildCountRef.current;
92
+ if (enableAnimation &&
93
+ isStreaming &&
94
+ currentCount > prevCount &&
95
+ prevCount > 0) {
96
+ const newIndices = new Set();
97
+ for (let i = prevCount; i < currentCount; i++) {
98
+ newIndices.add(i);
99
+ }
100
+ setAnimatingIndices(newIndices);
101
+ // Clear animation flags after animation completes
102
+ const timer = setTimeout(() => {
103
+ setAnimatingIndices(new Set());
104
+ }, 300);
105
+ prevChildCountRef.current = currentCount;
106
+ return () => clearTimeout(timer);
107
+ }
108
+ prevChildCountRef.current = currentCount;
109
+ }, [ast.children.length, enableAnimation, isStreaming]);
110
+ // Auto-scroll ref
111
+ const containerRef = useRef(null);
112
+ // Inject keyframe styles
113
+ useEffect(() => {
114
+ const styleId = 'pd-md-stream-styles';
115
+ if (!document.getElementById(styleId)) {
116
+ const styleEl = document.createElement('style');
117
+ styleEl.id = styleId;
118
+ styleEl.textContent = cursorKeyframes;
119
+ document.head.appendChild(styleEl);
120
+ }
121
+ }, []);
122
+ if (!source && !externalAst) {
123
+ return null;
124
+ }
125
+ const wrapperStyle = {
126
+ ...style,
127
+ position: 'relative',
128
+ };
129
+ return (jsxs("div", { ref: containerRef, className: className, style: wrapperStyle, children: [ast.children.map((child, index) => {
130
+ const isNewBlock = animatingIndices.has(index);
131
+ const isLastBlock = index === ast.children.length - 1;
132
+ const blockStyle = enableAnimation && isNewBlock
133
+ ? {
134
+ animation: 'pd-md-fade-in 0.3s ease-out forwards',
135
+ }
136
+ : {};
137
+ const blockClassName = isNewBlock
138
+ ? animationClassName || undefined
139
+ : undefined;
140
+ return (jsxs("div", { style: blockStyle, className: blockClassName, "data-stream-block": isLastBlock && isStreaming ? 'active' : undefined, children: [jsx(NodeRenderer, { node: child, components: components }), showCursor && isStreaming && isLastBlock && (jsx(StreamCursor, { customElement: cursorElement }))] }, index));
141
+ }), showCursor && isStreaming && ast.children.length === 0 && (jsx(StreamCursor, { customElement: cursorElement }))] }));
142
+ };
143
+
144
+ export { StreamMarkdownRenderer };
145
+ //# sourceMappingURL=StreamMarkdownRenderer.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StreamMarkdownRenderer.mjs","sources":["../../src/components/StreamMarkdownRenderer.tsx"],"sourcesContent":[null],"names":["_jsx","_Fragment","_jsxs"],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import { createContext, useContext } from 'react';
2
+
3
+ /**
4
+ * Context for passing configuration down the component tree
5
+ */
6
+ const MarkdownContext = createContext({
7
+ components: {},
8
+ });
9
+ /**
10
+ * Hook to access markdown context
11
+ */
12
+ function useMarkdownContext() {
13
+ return useContext(MarkdownContext);
14
+ }
15
+
16
+ export { MarkdownContext, useMarkdownContext };
17
+ //# sourceMappingURL=context.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.mjs","sources":["../../src/components/context.ts"],"sourcesContent":[null],"names":[],"mappings":";;AAWA;;AAEG;AACI,MAAM,eAAe,GAAG,aAAa,CAAuB;AACjE,IAAA,UAAU,EAAE,EAAE;AACf,CAAA;AAED;;AAEG;SACa,kBAAkB,GAAA;AAChC,IAAA,OAAO,UAAU,CAAC,eAAe,CAAC;AACpC;;;;"}
@@ -0,0 +1,8 @@
1
+ import { jsx } from 'react/jsx-runtime';
2
+
3
+ const Blockquote = ({ children }) => {
4
+ return jsx("blockquote", { children: children });
5
+ };
6
+
7
+ export { Blockquote };
8
+ //# sourceMappingURL=Blockquote.mjs.map