jvetrau-ds 0.1.37 → 0.1.38
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/components/markdown/markdown.cjs +146 -19
- package/components/markdown/markdown.cjs.map +1 -1
- package/components/markdown/markdown.css +17 -2
- package/components/markdown/markdown.d.ts +1 -0
- package/components/markdown/markdown.js +146 -19
- package/components/markdown/markdown.js.map +1 -1
- package/package.json +1 -1
- package/styles.css +17 -2
|
@@ -20,6 +20,106 @@ function normalizeHeadingLevelOffset(value) {
|
|
|
20
20
|
function getHeadingLevel(sourceLevel, offset) {
|
|
21
21
|
return Math.min(6, sourceLevel + offset);
|
|
22
22
|
}
|
|
23
|
+
function createTextNode(value) {
|
|
24
|
+
return {
|
|
25
|
+
type: "text",
|
|
26
|
+
value
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
function appendNodesWithSeparator(target, nodes) {
|
|
30
|
+
if (nodes.length === 0) {
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
if (target.length > 0) {
|
|
34
|
+
target.push(createTextNode(" "));
|
|
35
|
+
}
|
|
36
|
+
target.push(...nodes);
|
|
37
|
+
}
|
|
38
|
+
function flattenInlineNode(node) {
|
|
39
|
+
switch (node.type) {
|
|
40
|
+
case "html":
|
|
41
|
+
return [];
|
|
42
|
+
case "break":
|
|
43
|
+
return [
|
|
44
|
+
createTextNode(" ")
|
|
45
|
+
];
|
|
46
|
+
case "image":
|
|
47
|
+
case "imageReference":
|
|
48
|
+
return node.alt ? [
|
|
49
|
+
createTextNode(node.alt)
|
|
50
|
+
] : [];
|
|
51
|
+
default:
|
|
52
|
+
if (!node.children) {
|
|
53
|
+
return [
|
|
54
|
+
node
|
|
55
|
+
];
|
|
56
|
+
}
|
|
57
|
+
return [
|
|
58
|
+
{
|
|
59
|
+
...node,
|
|
60
|
+
children: node.children.flatMap(
|
|
61
|
+
flattenInlineNode
|
|
62
|
+
)
|
|
63
|
+
}
|
|
64
|
+
];
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
function flattenBlockNode(node) {
|
|
68
|
+
switch (node.type) {
|
|
69
|
+
case "paragraph":
|
|
70
|
+
case "heading":
|
|
71
|
+
return (node.children ?? []).flatMap(
|
|
72
|
+
flattenInlineNode
|
|
73
|
+
);
|
|
74
|
+
case "tableCell":
|
|
75
|
+
return (node.children ?? []).flatMap(
|
|
76
|
+
flattenInlineNode
|
|
77
|
+
);
|
|
78
|
+
case "code":
|
|
79
|
+
return node.value ? [
|
|
80
|
+
{
|
|
81
|
+
type: "inlineCode",
|
|
82
|
+
value: node.value
|
|
83
|
+
}
|
|
84
|
+
] : [];
|
|
85
|
+
case "html":
|
|
86
|
+
case "definition":
|
|
87
|
+
case "footnoteDefinition":
|
|
88
|
+
case "thematicBreak":
|
|
89
|
+
case "yaml":
|
|
90
|
+
return [];
|
|
91
|
+
case "blockquote":
|
|
92
|
+
case "list":
|
|
93
|
+
case "listItem":
|
|
94
|
+
case "table":
|
|
95
|
+
case "tableRow":
|
|
96
|
+
return flattenBlockNodes(node.children ?? []);
|
|
97
|
+
default:
|
|
98
|
+
return node.children ? flattenBlockNodes(node.children) : [];
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
function flattenBlockNodes(nodes) {
|
|
102
|
+
const result = [];
|
|
103
|
+
for (const node of nodes) {
|
|
104
|
+
appendNodesWithSeparator(
|
|
105
|
+
result,
|
|
106
|
+
flattenBlockNode(node)
|
|
107
|
+
);
|
|
108
|
+
}
|
|
109
|
+
return result;
|
|
110
|
+
}
|
|
111
|
+
const remarkExcerpt = () => {
|
|
112
|
+
return (tree) => {
|
|
113
|
+
const root = tree;
|
|
114
|
+
const children = flattenBlockNodes(root.children);
|
|
115
|
+
root.children = children.length > 0 ? [
|
|
116
|
+
{
|
|
117
|
+
type: "paragraph",
|
|
118
|
+
children
|
|
119
|
+
}
|
|
120
|
+
] : [];
|
|
121
|
+
};
|
|
122
|
+
};
|
|
23
123
|
const MarkdownHeading = ({
|
|
24
124
|
sourceLevel,
|
|
25
125
|
offset,
|
|
@@ -42,24 +142,14 @@ const MarkdownHeading = ({
|
|
|
42
142
|
return /* @__PURE__ */ jsxRuntime.jsx("h6", { ...props, children });
|
|
43
143
|
}
|
|
44
144
|
};
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
headingLevelOffset = 0,
|
|
48
|
-
className = "",
|
|
49
|
-
...props
|
|
50
|
-
}) => {
|
|
51
|
-
if (!content.trim()) {
|
|
52
|
-
return null;
|
|
53
|
-
}
|
|
54
|
-
const classes = classnames.classnames("markdown", className, {});
|
|
55
|
-
const normalizedHeadingLevelOffset = normalizeHeadingLevelOffset(headingLevelOffset);
|
|
56
|
-
const components = {
|
|
145
|
+
function createDocumentComponents(headingLevelOffset) {
|
|
146
|
+
return {
|
|
57
147
|
h1: ({ node: _node, ...headingProps }) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
58
148
|
MarkdownHeading,
|
|
59
149
|
{
|
|
60
150
|
...headingProps,
|
|
61
151
|
sourceLevel: 1,
|
|
62
|
-
offset:
|
|
152
|
+
offset: headingLevelOffset
|
|
63
153
|
}
|
|
64
154
|
),
|
|
65
155
|
h2: ({ node: _node, ...headingProps }) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
@@ -67,7 +157,7 @@ const Markdown = ({
|
|
|
67
157
|
{
|
|
68
158
|
...headingProps,
|
|
69
159
|
sourceLevel: 2,
|
|
70
|
-
offset:
|
|
160
|
+
offset: headingLevelOffset
|
|
71
161
|
}
|
|
72
162
|
),
|
|
73
163
|
h3: ({ node: _node, ...headingProps }) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
@@ -75,7 +165,7 @@ const Markdown = ({
|
|
|
75
165
|
{
|
|
76
166
|
...headingProps,
|
|
77
167
|
sourceLevel: 3,
|
|
78
|
-
offset:
|
|
168
|
+
offset: headingLevelOffset
|
|
79
169
|
}
|
|
80
170
|
),
|
|
81
171
|
h4: ({ node: _node, ...headingProps }) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
@@ -83,7 +173,7 @@ const Markdown = ({
|
|
|
83
173
|
{
|
|
84
174
|
...headingProps,
|
|
85
175
|
sourceLevel: 4,
|
|
86
|
-
offset:
|
|
176
|
+
offset: headingLevelOffset
|
|
87
177
|
}
|
|
88
178
|
),
|
|
89
179
|
h5: ({ node: _node, ...headingProps }) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
@@ -91,7 +181,7 @@ const Markdown = ({
|
|
|
91
181
|
{
|
|
92
182
|
...headingProps,
|
|
93
183
|
sourceLevel: 5,
|
|
94
|
-
offset:
|
|
184
|
+
offset: headingLevelOffset
|
|
95
185
|
}
|
|
96
186
|
),
|
|
97
187
|
h6: ({ node: _node, ...headingProps }) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
@@ -99,10 +189,47 @@ const Markdown = ({
|
|
|
99
189
|
{
|
|
100
190
|
...headingProps,
|
|
101
191
|
sourceLevel: 6,
|
|
102
|
-
offset:
|
|
192
|
+
offset: headingLevelOffset
|
|
103
193
|
}
|
|
104
194
|
)
|
|
105
195
|
};
|
|
196
|
+
}
|
|
197
|
+
const Markdown = ({
|
|
198
|
+
content,
|
|
199
|
+
excerpt = false,
|
|
200
|
+
headingLevelOffset = 0,
|
|
201
|
+
className = "",
|
|
202
|
+
...props
|
|
203
|
+
}) => {
|
|
204
|
+
if (!content.trim()) {
|
|
205
|
+
return null;
|
|
206
|
+
}
|
|
207
|
+
const classes = classnames.classnames("markdown", className, {
|
|
208
|
+
"markdown--excerpt": excerpt
|
|
209
|
+
});
|
|
210
|
+
if (excerpt) {
|
|
211
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
212
|
+
"div",
|
|
213
|
+
{
|
|
214
|
+
className: classes,
|
|
215
|
+
...props,
|
|
216
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
217
|
+
ReactMarkdown__default.default,
|
|
218
|
+
{
|
|
219
|
+
remarkPlugins: [
|
|
220
|
+
remarkGfm__default.default,
|
|
221
|
+
remarkExcerpt
|
|
222
|
+
],
|
|
223
|
+
children: content
|
|
224
|
+
}
|
|
225
|
+
)
|
|
226
|
+
}
|
|
227
|
+
);
|
|
228
|
+
}
|
|
229
|
+
const normalizedHeadingLevelOffset = normalizeHeadingLevelOffset(headingLevelOffset);
|
|
230
|
+
const documentComponents = createDocumentComponents(
|
|
231
|
+
normalizedHeadingLevelOffset
|
|
232
|
+
);
|
|
106
233
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
107
234
|
"div",
|
|
108
235
|
{
|
|
@@ -112,7 +239,7 @@ const Markdown = ({
|
|
|
112
239
|
ReactMarkdown__default.default,
|
|
113
240
|
{
|
|
114
241
|
remarkPlugins: [remarkGfm__default.default],
|
|
115
|
-
components,
|
|
242
|
+
components: documentComponents,
|
|
116
243
|
children: content
|
|
117
244
|
}
|
|
118
245
|
)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components/markdown/markdown.tsx"],"names":["jsx","classnames","ReactMarkdown","remarkGfm"],"mappings":"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","file":"markdown.cjs","sourcesContent":["import React from 'react';\nimport ReactMarkdown, { type Components } from 'react-markdown';\nimport remarkGfm from 'remark-gfm';\n\nimport './markdown.css';\nimport { classnames } from '../helpers/classnames';\n\nexport interface MarkdownProps\n extends Omit<\n React.HTMLAttributes<HTMLDivElement>,\n 'children' | 'dangerouslySetInnerHTML'\n > {\n content: string;\n headingLevelOffset?: number;\n}\n\ninterface MarkdownHeadingProps\n extends React.HTMLAttributes<HTMLHeadingElement> {\n sourceLevel: number;\n offset: number;\n}\n\nfunction normalizeHeadingLevelOffset(value: number | undefined) {\n if (value === undefined || !Number.isFinite(value)) {\n return 0;\n }\n\n return Math.max(0, Math.floor(value));\n}\n\nfunction getHeadingLevel(\n sourceLevel: number,\n offset: number,\n) {\n return Math.min(6, sourceLevel + offset);\n}\n\nconst MarkdownHeading: React.FC<MarkdownHeadingProps> = ({\n sourceLevel,\n offset,\n children,\n ...props\n}) => {\n const level = getHeadingLevel(sourceLevel, offset);\n\n switch (level) {\n case 1:\n return <h1 {...props}>{children}</h1>;\n\n case 2:\n return <h2 {...props}>{children}</h2>;\n\n case 3:\n return <h3 {...props}>{children}</h3>;\n\n case 4:\n return <h4 {...props}>{children}</h4>;\n\n case 5:\n return <h5 {...props}>{children}</h5>;\n\n default:\n return <h6 {...props}>{children}</h6>;\n }\n};\n\nconst Markdown: React.FC<MarkdownProps> = ({\n content,\n headingLevelOffset = 0,\n className = '',\n ...props\n}) => {\n if (!content.trim()) {\n return null;\n }\n\n const classes = classnames('markdown', className, {});\n\n const normalizedHeadingLevelOffset =\n normalizeHeadingLevelOffset(headingLevelOffset);\n\n const components: Components = {\n h1: ({ node: _node, ...headingProps }) => (\n <MarkdownHeading\n {...headingProps}\n sourceLevel={1}\n offset={normalizedHeadingLevelOffset}\n />\n ),\n\n h2: ({ node: _node, ...headingProps }) => (\n <MarkdownHeading\n {...headingProps}\n sourceLevel={2}\n offset={normalizedHeadingLevelOffset}\n />\n ),\n\n h3: ({ node: _node, ...headingProps }) => (\n <MarkdownHeading\n {...headingProps}\n sourceLevel={3}\n offset={normalizedHeadingLevelOffset}\n />\n ),\n\n h4: ({ node: _node, ...headingProps }) => (\n <MarkdownHeading\n {...headingProps}\n sourceLevel={4}\n offset={normalizedHeadingLevelOffset}\n />\n ),\n\n h5: ({ node: _node, ...headingProps }) => (\n <MarkdownHeading\n {...headingProps}\n sourceLevel={5}\n offset={normalizedHeadingLevelOffset}\n />\n ),\n\n h6: ({ node: _node, ...headingProps }) => (\n <MarkdownHeading\n {...headingProps}\n sourceLevel={6}\n offset={normalizedHeadingLevelOffset}\n />\n ),\n };\n\n return (\n <div\n className={classes}\n {...props}\n >\n <ReactMarkdown\n remarkPlugins={[remarkGfm]}\n components={components}\n >\n {content}\n </ReactMarkdown>\n </div>\n );\n};\n\nexport default Markdown;\n"]}
|
|
1
|
+
{"version":3,"sources":["../../../src/components/markdown/markdown.tsx"],"names":["jsx","classnames","ReactMarkdown","remarkGfm"],"mappings":"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","file":"markdown.cjs","sourcesContent":["import React from 'react';\nimport ReactMarkdown, { type Components } from 'react-markdown';\nimport remarkGfm from 'remark-gfm';\nimport type { Plugin } from 'unified';\n\nimport './markdown.css';\nimport { classnames } from '../helpers/classnames';\n\nexport interface MarkdownProps\n extends Omit<\n React.HTMLAttributes<HTMLDivElement>,\n 'children' | 'dangerouslySetInnerHTML'\n > {\n content: string;\n excerpt?: boolean;\n headingLevelOffset?: number;\n}\n\ninterface MarkdownHeadingProps\n extends React.HTMLAttributes<HTMLHeadingElement> {\n sourceLevel: number;\n offset: number;\n}\n\ntype MarkdownNode = {\n type: string;\n value?: string;\n alt?: string | null;\n children?: MarkdownNode[];\n [key: string]: unknown;\n};\n\ntype MarkdownRoot = {\n type: 'root';\n children: MarkdownNode[];\n};\n\nfunction normalizeHeadingLevelOffset(value: number | undefined) {\n if (value === undefined || !Number.isFinite(value)) {\n return 0;\n }\n\n return Math.max(0, Math.floor(value));\n}\n\nfunction getHeadingLevel(\n sourceLevel: number,\n offset: number,\n) {\n return Math.min(6, sourceLevel + offset);\n}\n\nfunction createTextNode(value: string): MarkdownNode {\n return {\n type: 'text',\n value,\n };\n}\n\nfunction appendNodesWithSeparator(\n target: MarkdownNode[],\n nodes: MarkdownNode[],\n) {\n if (nodes.length === 0) {\n return;\n }\n\n if (target.length > 0) {\n target.push(createTextNode(' '));\n }\n\n target.push(...nodes);\n}\n\nfunction flattenInlineNode(\n node: MarkdownNode,\n): MarkdownNode[] {\n switch (node.type) {\n case 'html':\n return [];\n\n case 'break':\n return [\n createTextNode(' '),\n ];\n\n case 'image':\n case 'imageReference':\n return node.alt\n ? [\n createTextNode(node.alt),\n ]\n : [];\n\n default:\n if (!node.children) {\n return [\n node,\n ];\n }\n\n return [\n {\n ...node,\n children: node.children.flatMap(\n flattenInlineNode,\n ),\n },\n ];\n }\n}\n\nfunction flattenBlockNode(\n node: MarkdownNode,\n): MarkdownNode[] {\n switch (node.type) {\n case 'paragraph':\n case 'heading':\n return (node.children ?? []).flatMap(\n flattenInlineNode,\n );\n\n case 'tableCell':\n return (node.children ?? []).flatMap(\n flattenInlineNode,\n );\n\n case 'code':\n return node.value\n ? [\n {\n type: 'inlineCode',\n value: node.value,\n },\n ]\n : [];\n\n case 'html':\n case 'definition':\n case 'footnoteDefinition':\n case 'thematicBreak':\n case 'yaml':\n return [];\n\n case 'blockquote':\n case 'list':\n case 'listItem':\n case 'table':\n case 'tableRow':\n return flattenBlockNodes(node.children ?? []);\n\n default:\n return node.children\n ? flattenBlockNodes(node.children)\n : [];\n }\n}\n\nfunction flattenBlockNodes(\n nodes: MarkdownNode[],\n): MarkdownNode[] {\n const result: MarkdownNode[] = [];\n\n for (const node of nodes) {\n appendNodesWithSeparator(\n result,\n flattenBlockNode(node),\n );\n }\n\n return result;\n}\n\nconst remarkExcerpt: Plugin = () => {\n return (tree) => {\n const root = tree as MarkdownRoot;\n const children = flattenBlockNodes(root.children);\n\n root.children = children.length > 0\n ? [\n {\n type: 'paragraph',\n children,\n },\n ]\n : [];\n };\n};\n\nconst MarkdownHeading: React.FC<MarkdownHeadingProps> = ({\n sourceLevel,\n offset,\n children,\n ...props\n}) => {\n const level = getHeadingLevel(sourceLevel, offset);\n\n switch (level) {\n case 1:\n return <h1 {...props}>{children}</h1>;\n\n case 2:\n return <h2 {...props}>{children}</h2>;\n\n case 3:\n return <h3 {...props}>{children}</h3>;\n\n case 4:\n return <h4 {...props}>{children}</h4>;\n\n case 5:\n return <h5 {...props}>{children}</h5>;\n\n default:\n return <h6 {...props}>{children}</h6>;\n }\n};\n\nfunction createDocumentComponents(\n headingLevelOffset: number,\n): Components {\n return {\n h1: ({ node: _node, ...headingProps }) => (\n <MarkdownHeading\n {...headingProps}\n sourceLevel={1}\n offset={headingLevelOffset}\n />\n ),\n\n h2: ({ node: _node, ...headingProps }) => (\n <MarkdownHeading\n {...headingProps}\n sourceLevel={2}\n offset={headingLevelOffset}\n />\n ),\n\n h3: ({ node: _node, ...headingProps }) => (\n <MarkdownHeading\n {...headingProps}\n sourceLevel={3}\n offset={headingLevelOffset}\n />\n ),\n\n h4: ({ node: _node, ...headingProps }) => (\n <MarkdownHeading\n {...headingProps}\n sourceLevel={4}\n offset={headingLevelOffset}\n />\n ),\n\n h5: ({ node: _node, ...headingProps }) => (\n <MarkdownHeading\n {...headingProps}\n sourceLevel={5}\n offset={headingLevelOffset}\n />\n ),\n\n h6: ({ node: _node, ...headingProps }) => (\n <MarkdownHeading\n {...headingProps}\n sourceLevel={6}\n offset={headingLevelOffset}\n />\n ),\n };\n}\n\nconst Markdown: React.FC<MarkdownProps> = ({\n content,\n excerpt = false,\n headingLevelOffset = 0,\n className = '',\n ...props\n}) => {\n if (!content.trim()) {\n return null;\n }\n\n const classes = classnames('markdown', className, {\n 'markdown--excerpt': excerpt,\n });\n\n if (excerpt) {\n return (\n <div\n className={classes}\n {...props}\n >\n <ReactMarkdown\n remarkPlugins={[\n remarkGfm,\n remarkExcerpt,\n ]}\n >\n {content}\n </ReactMarkdown>\n </div>\n );\n }\n\n const normalizedHeadingLevelOffset =\n normalizeHeadingLevelOffset(headingLevelOffset);\n\n const documentComponents = createDocumentComponents(\n normalizedHeadingLevelOffset,\n );\n\n return (\n <div\n className={classes}\n {...props}\n >\n <ReactMarkdown\n remarkPlugins={[remarkGfm]}\n components={documentComponents}\n >\n {content}\n </ReactMarkdown>\n </div>\n );\n};\n\nexport default Markdown;\n"]}
|
|
@@ -38,6 +38,17 @@
|
|
|
38
38
|
.markdown h6,
|
|
39
39
|
.markdown p {
|
|
40
40
|
/* size */
|
|
41
|
+
margin: 0;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
.markdown h5,
|
|
45
|
+
.markdown h6 {
|
|
46
|
+
/* typography */
|
|
47
|
+
font-family: var(--font-h4-family);
|
|
48
|
+
font-size: var(--font-h4);
|
|
49
|
+
font-weight: var(--font-h4-weight);
|
|
50
|
+
line-height: var(--font-h4-line);
|
|
51
|
+
letter-spacing: var(--font-h4-letter-spacing);
|
|
41
52
|
}
|
|
42
53
|
|
|
43
54
|
.markdown ul,
|
|
@@ -46,7 +57,6 @@
|
|
|
46
57
|
display: flex;
|
|
47
58
|
flex-direction: column;
|
|
48
59
|
gap: var(--markdown-list-gap);
|
|
49
|
-
|
|
50
60
|
margin: 0;
|
|
51
61
|
padding-left: var(--markdown-list-padding);
|
|
52
62
|
}
|
|
@@ -137,7 +147,6 @@
|
|
|
137
147
|
padding:
|
|
138
148
|
var(--markdown-code-padding-block)
|
|
139
149
|
var(--markdown-code-padding-inline);
|
|
140
|
-
|
|
141
150
|
overflow-x: auto;
|
|
142
151
|
|
|
143
152
|
/* border */
|
|
@@ -163,6 +172,7 @@
|
|
|
163
172
|
/* size */
|
|
164
173
|
width: 100%;
|
|
165
174
|
|
|
175
|
+
/* border */
|
|
166
176
|
border-collapse: collapse;
|
|
167
177
|
}
|
|
168
178
|
|
|
@@ -193,4 +203,9 @@
|
|
|
193
203
|
.markdown input[type='checkbox'] {
|
|
194
204
|
/* size */
|
|
195
205
|
margin: 0;
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
.markdown--excerpt > p {
|
|
209
|
+
/* size */
|
|
210
|
+
margin: 0;
|
|
196
211
|
}
|
|
@@ -2,6 +2,7 @@ import React from 'react';
|
|
|
2
2
|
import './markdown.css';
|
|
3
3
|
export interface MarkdownProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'children' | 'dangerouslySetInnerHTML'> {
|
|
4
4
|
content: string;
|
|
5
|
+
excerpt?: boolean;
|
|
5
6
|
headingLevelOffset?: number;
|
|
6
7
|
}
|
|
7
8
|
declare const Markdown: React.FC<MarkdownProps>;
|
|
@@ -13,6 +13,106 @@ function normalizeHeadingLevelOffset(value) {
|
|
|
13
13
|
function getHeadingLevel(sourceLevel, offset) {
|
|
14
14
|
return Math.min(6, sourceLevel + offset);
|
|
15
15
|
}
|
|
16
|
+
function createTextNode(value) {
|
|
17
|
+
return {
|
|
18
|
+
type: "text",
|
|
19
|
+
value
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
function appendNodesWithSeparator(target, nodes) {
|
|
23
|
+
if (nodes.length === 0) {
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
if (target.length > 0) {
|
|
27
|
+
target.push(createTextNode(" "));
|
|
28
|
+
}
|
|
29
|
+
target.push(...nodes);
|
|
30
|
+
}
|
|
31
|
+
function flattenInlineNode(node) {
|
|
32
|
+
switch (node.type) {
|
|
33
|
+
case "html":
|
|
34
|
+
return [];
|
|
35
|
+
case "break":
|
|
36
|
+
return [
|
|
37
|
+
createTextNode(" ")
|
|
38
|
+
];
|
|
39
|
+
case "image":
|
|
40
|
+
case "imageReference":
|
|
41
|
+
return node.alt ? [
|
|
42
|
+
createTextNode(node.alt)
|
|
43
|
+
] : [];
|
|
44
|
+
default:
|
|
45
|
+
if (!node.children) {
|
|
46
|
+
return [
|
|
47
|
+
node
|
|
48
|
+
];
|
|
49
|
+
}
|
|
50
|
+
return [
|
|
51
|
+
{
|
|
52
|
+
...node,
|
|
53
|
+
children: node.children.flatMap(
|
|
54
|
+
flattenInlineNode
|
|
55
|
+
)
|
|
56
|
+
}
|
|
57
|
+
];
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
function flattenBlockNode(node) {
|
|
61
|
+
switch (node.type) {
|
|
62
|
+
case "paragraph":
|
|
63
|
+
case "heading":
|
|
64
|
+
return (node.children ?? []).flatMap(
|
|
65
|
+
flattenInlineNode
|
|
66
|
+
);
|
|
67
|
+
case "tableCell":
|
|
68
|
+
return (node.children ?? []).flatMap(
|
|
69
|
+
flattenInlineNode
|
|
70
|
+
);
|
|
71
|
+
case "code":
|
|
72
|
+
return node.value ? [
|
|
73
|
+
{
|
|
74
|
+
type: "inlineCode",
|
|
75
|
+
value: node.value
|
|
76
|
+
}
|
|
77
|
+
] : [];
|
|
78
|
+
case "html":
|
|
79
|
+
case "definition":
|
|
80
|
+
case "footnoteDefinition":
|
|
81
|
+
case "thematicBreak":
|
|
82
|
+
case "yaml":
|
|
83
|
+
return [];
|
|
84
|
+
case "blockquote":
|
|
85
|
+
case "list":
|
|
86
|
+
case "listItem":
|
|
87
|
+
case "table":
|
|
88
|
+
case "tableRow":
|
|
89
|
+
return flattenBlockNodes(node.children ?? []);
|
|
90
|
+
default:
|
|
91
|
+
return node.children ? flattenBlockNodes(node.children) : [];
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
function flattenBlockNodes(nodes) {
|
|
95
|
+
const result = [];
|
|
96
|
+
for (const node of nodes) {
|
|
97
|
+
appendNodesWithSeparator(
|
|
98
|
+
result,
|
|
99
|
+
flattenBlockNode(node)
|
|
100
|
+
);
|
|
101
|
+
}
|
|
102
|
+
return result;
|
|
103
|
+
}
|
|
104
|
+
const remarkExcerpt = () => {
|
|
105
|
+
return (tree) => {
|
|
106
|
+
const root = tree;
|
|
107
|
+
const children = flattenBlockNodes(root.children);
|
|
108
|
+
root.children = children.length > 0 ? [
|
|
109
|
+
{
|
|
110
|
+
type: "paragraph",
|
|
111
|
+
children
|
|
112
|
+
}
|
|
113
|
+
] : [];
|
|
114
|
+
};
|
|
115
|
+
};
|
|
16
116
|
const MarkdownHeading = ({
|
|
17
117
|
sourceLevel,
|
|
18
118
|
offset,
|
|
@@ -35,24 +135,14 @@ const MarkdownHeading = ({
|
|
|
35
135
|
return /* @__PURE__ */ jsx("h6", { ...props, children });
|
|
36
136
|
}
|
|
37
137
|
};
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
headingLevelOffset = 0,
|
|
41
|
-
className = "",
|
|
42
|
-
...props
|
|
43
|
-
}) => {
|
|
44
|
-
if (!content.trim()) {
|
|
45
|
-
return null;
|
|
46
|
-
}
|
|
47
|
-
const classes = classnames("markdown", className, {});
|
|
48
|
-
const normalizedHeadingLevelOffset = normalizeHeadingLevelOffset(headingLevelOffset);
|
|
49
|
-
const components = {
|
|
138
|
+
function createDocumentComponents(headingLevelOffset) {
|
|
139
|
+
return {
|
|
50
140
|
h1: ({ node: _node, ...headingProps }) => /* @__PURE__ */ jsx(
|
|
51
141
|
MarkdownHeading,
|
|
52
142
|
{
|
|
53
143
|
...headingProps,
|
|
54
144
|
sourceLevel: 1,
|
|
55
|
-
offset:
|
|
145
|
+
offset: headingLevelOffset
|
|
56
146
|
}
|
|
57
147
|
),
|
|
58
148
|
h2: ({ node: _node, ...headingProps }) => /* @__PURE__ */ jsx(
|
|
@@ -60,7 +150,7 @@ const Markdown = ({
|
|
|
60
150
|
{
|
|
61
151
|
...headingProps,
|
|
62
152
|
sourceLevel: 2,
|
|
63
|
-
offset:
|
|
153
|
+
offset: headingLevelOffset
|
|
64
154
|
}
|
|
65
155
|
),
|
|
66
156
|
h3: ({ node: _node, ...headingProps }) => /* @__PURE__ */ jsx(
|
|
@@ -68,7 +158,7 @@ const Markdown = ({
|
|
|
68
158
|
{
|
|
69
159
|
...headingProps,
|
|
70
160
|
sourceLevel: 3,
|
|
71
|
-
offset:
|
|
161
|
+
offset: headingLevelOffset
|
|
72
162
|
}
|
|
73
163
|
),
|
|
74
164
|
h4: ({ node: _node, ...headingProps }) => /* @__PURE__ */ jsx(
|
|
@@ -76,7 +166,7 @@ const Markdown = ({
|
|
|
76
166
|
{
|
|
77
167
|
...headingProps,
|
|
78
168
|
sourceLevel: 4,
|
|
79
|
-
offset:
|
|
169
|
+
offset: headingLevelOffset
|
|
80
170
|
}
|
|
81
171
|
),
|
|
82
172
|
h5: ({ node: _node, ...headingProps }) => /* @__PURE__ */ jsx(
|
|
@@ -84,7 +174,7 @@ const Markdown = ({
|
|
|
84
174
|
{
|
|
85
175
|
...headingProps,
|
|
86
176
|
sourceLevel: 5,
|
|
87
|
-
offset:
|
|
177
|
+
offset: headingLevelOffset
|
|
88
178
|
}
|
|
89
179
|
),
|
|
90
180
|
h6: ({ node: _node, ...headingProps }) => /* @__PURE__ */ jsx(
|
|
@@ -92,10 +182,47 @@ const Markdown = ({
|
|
|
92
182
|
{
|
|
93
183
|
...headingProps,
|
|
94
184
|
sourceLevel: 6,
|
|
95
|
-
offset:
|
|
185
|
+
offset: headingLevelOffset
|
|
96
186
|
}
|
|
97
187
|
)
|
|
98
188
|
};
|
|
189
|
+
}
|
|
190
|
+
const Markdown = ({
|
|
191
|
+
content,
|
|
192
|
+
excerpt = false,
|
|
193
|
+
headingLevelOffset = 0,
|
|
194
|
+
className = "",
|
|
195
|
+
...props
|
|
196
|
+
}) => {
|
|
197
|
+
if (!content.trim()) {
|
|
198
|
+
return null;
|
|
199
|
+
}
|
|
200
|
+
const classes = classnames("markdown", className, {
|
|
201
|
+
"markdown--excerpt": excerpt
|
|
202
|
+
});
|
|
203
|
+
if (excerpt) {
|
|
204
|
+
return /* @__PURE__ */ jsx(
|
|
205
|
+
"div",
|
|
206
|
+
{
|
|
207
|
+
className: classes,
|
|
208
|
+
...props,
|
|
209
|
+
children: /* @__PURE__ */ jsx(
|
|
210
|
+
ReactMarkdown,
|
|
211
|
+
{
|
|
212
|
+
remarkPlugins: [
|
|
213
|
+
remarkGfm,
|
|
214
|
+
remarkExcerpt
|
|
215
|
+
],
|
|
216
|
+
children: content
|
|
217
|
+
}
|
|
218
|
+
)
|
|
219
|
+
}
|
|
220
|
+
);
|
|
221
|
+
}
|
|
222
|
+
const normalizedHeadingLevelOffset = normalizeHeadingLevelOffset(headingLevelOffset);
|
|
223
|
+
const documentComponents = createDocumentComponents(
|
|
224
|
+
normalizedHeadingLevelOffset
|
|
225
|
+
);
|
|
99
226
|
return /* @__PURE__ */ jsx(
|
|
100
227
|
"div",
|
|
101
228
|
{
|
|
@@ -105,7 +232,7 @@ const Markdown = ({
|
|
|
105
232
|
ReactMarkdown,
|
|
106
233
|
{
|
|
107
234
|
remarkPlugins: [remarkGfm],
|
|
108
|
-
components,
|
|
235
|
+
components: documentComponents,
|
|
109
236
|
children: content
|
|
110
237
|
}
|
|
111
238
|
)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components/markdown/markdown.tsx"],"names":[],"mappings":"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","file":"markdown.js","sourcesContent":["import React from 'react';\nimport ReactMarkdown, { type Components } from 'react-markdown';\nimport remarkGfm from 'remark-gfm';\n\nimport './markdown.css';\nimport { classnames } from '../helpers/classnames';\n\nexport interface MarkdownProps\n extends Omit<\n React.HTMLAttributes<HTMLDivElement>,\n 'children' | 'dangerouslySetInnerHTML'\n > {\n content: string;\n headingLevelOffset?: number;\n}\n\ninterface MarkdownHeadingProps\n extends React.HTMLAttributes<HTMLHeadingElement> {\n sourceLevel: number;\n offset: number;\n}\n\nfunction normalizeHeadingLevelOffset(value: number | undefined) {\n if (value === undefined || !Number.isFinite(value)) {\n return 0;\n }\n\n return Math.max(0, Math.floor(value));\n}\n\nfunction getHeadingLevel(\n sourceLevel: number,\n offset: number,\n) {\n return Math.min(6, sourceLevel + offset);\n}\n\nconst MarkdownHeading: React.FC<MarkdownHeadingProps> = ({\n sourceLevel,\n offset,\n children,\n ...props\n}) => {\n const level = getHeadingLevel(sourceLevel, offset);\n\n switch (level) {\n case 1:\n return <h1 {...props}>{children}</h1>;\n\n case 2:\n return <h2 {...props}>{children}</h2>;\n\n case 3:\n return <h3 {...props}>{children}</h3>;\n\n case 4:\n return <h4 {...props}>{children}</h4>;\n\n case 5:\n return <h5 {...props}>{children}</h5>;\n\n default:\n return <h6 {...props}>{children}</h6>;\n }\n};\n\nconst Markdown: React.FC<MarkdownProps> = ({\n content,\n headingLevelOffset = 0,\n className = '',\n ...props\n}) => {\n if (!content.trim()) {\n return null;\n }\n\n const classes = classnames('markdown', className, {});\n\n const normalizedHeadingLevelOffset =\n normalizeHeadingLevelOffset(headingLevelOffset);\n\n const components: Components = {\n h1: ({ node: _node, ...headingProps }) => (\n <MarkdownHeading\n {...headingProps}\n sourceLevel={1}\n offset={normalizedHeadingLevelOffset}\n />\n ),\n\n h2: ({ node: _node, ...headingProps }) => (\n <MarkdownHeading\n {...headingProps}\n sourceLevel={2}\n offset={normalizedHeadingLevelOffset}\n />\n ),\n\n h3: ({ node: _node, ...headingProps }) => (\n <MarkdownHeading\n {...headingProps}\n sourceLevel={3}\n offset={normalizedHeadingLevelOffset}\n />\n ),\n\n h4: ({ node: _node, ...headingProps }) => (\n <MarkdownHeading\n {...headingProps}\n sourceLevel={4}\n offset={normalizedHeadingLevelOffset}\n />\n ),\n\n h5: ({ node: _node, ...headingProps }) => (\n <MarkdownHeading\n {...headingProps}\n sourceLevel={5}\n offset={normalizedHeadingLevelOffset}\n />\n ),\n\n h6: ({ node: _node, ...headingProps }) => (\n <MarkdownHeading\n {...headingProps}\n sourceLevel={6}\n offset={normalizedHeadingLevelOffset}\n />\n ),\n };\n\n return (\n <div\n className={classes}\n {...props}\n >\n <ReactMarkdown\n remarkPlugins={[remarkGfm]}\n components={components}\n >\n {content}\n </ReactMarkdown>\n </div>\n );\n};\n\nexport default Markdown;\n"]}
|
|
1
|
+
{"version":3,"sources":["../../../src/components/markdown/markdown.tsx"],"names":[],"mappings":"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","file":"markdown.js","sourcesContent":["import React from 'react';\nimport ReactMarkdown, { type Components } from 'react-markdown';\nimport remarkGfm from 'remark-gfm';\nimport type { Plugin } from 'unified';\n\nimport './markdown.css';\nimport { classnames } from '../helpers/classnames';\n\nexport interface MarkdownProps\n extends Omit<\n React.HTMLAttributes<HTMLDivElement>,\n 'children' | 'dangerouslySetInnerHTML'\n > {\n content: string;\n excerpt?: boolean;\n headingLevelOffset?: number;\n}\n\ninterface MarkdownHeadingProps\n extends React.HTMLAttributes<HTMLHeadingElement> {\n sourceLevel: number;\n offset: number;\n}\n\ntype MarkdownNode = {\n type: string;\n value?: string;\n alt?: string | null;\n children?: MarkdownNode[];\n [key: string]: unknown;\n};\n\ntype MarkdownRoot = {\n type: 'root';\n children: MarkdownNode[];\n};\n\nfunction normalizeHeadingLevelOffset(value: number | undefined) {\n if (value === undefined || !Number.isFinite(value)) {\n return 0;\n }\n\n return Math.max(0, Math.floor(value));\n}\n\nfunction getHeadingLevel(\n sourceLevel: number,\n offset: number,\n) {\n return Math.min(6, sourceLevel + offset);\n}\n\nfunction createTextNode(value: string): MarkdownNode {\n return {\n type: 'text',\n value,\n };\n}\n\nfunction appendNodesWithSeparator(\n target: MarkdownNode[],\n nodes: MarkdownNode[],\n) {\n if (nodes.length === 0) {\n return;\n }\n\n if (target.length > 0) {\n target.push(createTextNode(' '));\n }\n\n target.push(...nodes);\n}\n\nfunction flattenInlineNode(\n node: MarkdownNode,\n): MarkdownNode[] {\n switch (node.type) {\n case 'html':\n return [];\n\n case 'break':\n return [\n createTextNode(' '),\n ];\n\n case 'image':\n case 'imageReference':\n return node.alt\n ? [\n createTextNode(node.alt),\n ]\n : [];\n\n default:\n if (!node.children) {\n return [\n node,\n ];\n }\n\n return [\n {\n ...node,\n children: node.children.flatMap(\n flattenInlineNode,\n ),\n },\n ];\n }\n}\n\nfunction flattenBlockNode(\n node: MarkdownNode,\n): MarkdownNode[] {\n switch (node.type) {\n case 'paragraph':\n case 'heading':\n return (node.children ?? []).flatMap(\n flattenInlineNode,\n );\n\n case 'tableCell':\n return (node.children ?? []).flatMap(\n flattenInlineNode,\n );\n\n case 'code':\n return node.value\n ? [\n {\n type: 'inlineCode',\n value: node.value,\n },\n ]\n : [];\n\n case 'html':\n case 'definition':\n case 'footnoteDefinition':\n case 'thematicBreak':\n case 'yaml':\n return [];\n\n case 'blockquote':\n case 'list':\n case 'listItem':\n case 'table':\n case 'tableRow':\n return flattenBlockNodes(node.children ?? []);\n\n default:\n return node.children\n ? flattenBlockNodes(node.children)\n : [];\n }\n}\n\nfunction flattenBlockNodes(\n nodes: MarkdownNode[],\n): MarkdownNode[] {\n const result: MarkdownNode[] = [];\n\n for (const node of nodes) {\n appendNodesWithSeparator(\n result,\n flattenBlockNode(node),\n );\n }\n\n return result;\n}\n\nconst remarkExcerpt: Plugin = () => {\n return (tree) => {\n const root = tree as MarkdownRoot;\n const children = flattenBlockNodes(root.children);\n\n root.children = children.length > 0\n ? [\n {\n type: 'paragraph',\n children,\n },\n ]\n : [];\n };\n};\n\nconst MarkdownHeading: React.FC<MarkdownHeadingProps> = ({\n sourceLevel,\n offset,\n children,\n ...props\n}) => {\n const level = getHeadingLevel(sourceLevel, offset);\n\n switch (level) {\n case 1:\n return <h1 {...props}>{children}</h1>;\n\n case 2:\n return <h2 {...props}>{children}</h2>;\n\n case 3:\n return <h3 {...props}>{children}</h3>;\n\n case 4:\n return <h4 {...props}>{children}</h4>;\n\n case 5:\n return <h5 {...props}>{children}</h5>;\n\n default:\n return <h6 {...props}>{children}</h6>;\n }\n};\n\nfunction createDocumentComponents(\n headingLevelOffset: number,\n): Components {\n return {\n h1: ({ node: _node, ...headingProps }) => (\n <MarkdownHeading\n {...headingProps}\n sourceLevel={1}\n offset={headingLevelOffset}\n />\n ),\n\n h2: ({ node: _node, ...headingProps }) => (\n <MarkdownHeading\n {...headingProps}\n sourceLevel={2}\n offset={headingLevelOffset}\n />\n ),\n\n h3: ({ node: _node, ...headingProps }) => (\n <MarkdownHeading\n {...headingProps}\n sourceLevel={3}\n offset={headingLevelOffset}\n />\n ),\n\n h4: ({ node: _node, ...headingProps }) => (\n <MarkdownHeading\n {...headingProps}\n sourceLevel={4}\n offset={headingLevelOffset}\n />\n ),\n\n h5: ({ node: _node, ...headingProps }) => (\n <MarkdownHeading\n {...headingProps}\n sourceLevel={5}\n offset={headingLevelOffset}\n />\n ),\n\n h6: ({ node: _node, ...headingProps }) => (\n <MarkdownHeading\n {...headingProps}\n sourceLevel={6}\n offset={headingLevelOffset}\n />\n ),\n };\n}\n\nconst Markdown: React.FC<MarkdownProps> = ({\n content,\n excerpt = false,\n headingLevelOffset = 0,\n className = '',\n ...props\n}) => {\n if (!content.trim()) {\n return null;\n }\n\n const classes = classnames('markdown', className, {\n 'markdown--excerpt': excerpt,\n });\n\n if (excerpt) {\n return (\n <div\n className={classes}\n {...props}\n >\n <ReactMarkdown\n remarkPlugins={[\n remarkGfm,\n remarkExcerpt,\n ]}\n >\n {content}\n </ReactMarkdown>\n </div>\n );\n }\n\n const normalizedHeadingLevelOffset =\n normalizeHeadingLevelOffset(headingLevelOffset);\n\n const documentComponents = createDocumentComponents(\n normalizedHeadingLevelOffset,\n );\n\n return (\n <div\n className={classes}\n {...props}\n >\n <ReactMarkdown\n remarkPlugins={[remarkGfm]}\n components={documentComponents}\n >\n {content}\n </ReactMarkdown>\n </div>\n );\n};\n\nexport default Markdown;\n"]}
|
package/package.json
CHANGED
package/styles.css
CHANGED
|
@@ -1321,6 +1321,17 @@
|
|
|
1321
1321
|
.markdown h6,
|
|
1322
1322
|
.markdown p {
|
|
1323
1323
|
/* size */
|
|
1324
|
+
margin: 0;
|
|
1325
|
+
}
|
|
1326
|
+
|
|
1327
|
+
.markdown h5,
|
|
1328
|
+
.markdown h6 {
|
|
1329
|
+
/* typography */
|
|
1330
|
+
font-family: var(--font-h4-family);
|
|
1331
|
+
font-size: var(--font-h4);
|
|
1332
|
+
font-weight: var(--font-h4-weight);
|
|
1333
|
+
line-height: var(--font-h4-line);
|
|
1334
|
+
letter-spacing: var(--font-h4-letter-spacing);
|
|
1324
1335
|
}
|
|
1325
1336
|
|
|
1326
1337
|
.markdown ul,
|
|
@@ -1329,7 +1340,6 @@
|
|
|
1329
1340
|
display: flex;
|
|
1330
1341
|
flex-direction: column;
|
|
1331
1342
|
gap: var(--markdown-list-gap);
|
|
1332
|
-
|
|
1333
1343
|
margin: 0;
|
|
1334
1344
|
padding-left: var(--markdown-list-padding);
|
|
1335
1345
|
}
|
|
@@ -1420,7 +1430,6 @@
|
|
|
1420
1430
|
padding:
|
|
1421
1431
|
var(--markdown-code-padding-block)
|
|
1422
1432
|
var(--markdown-code-padding-inline);
|
|
1423
|
-
|
|
1424
1433
|
overflow-x: auto;
|
|
1425
1434
|
|
|
1426
1435
|
/* border */
|
|
@@ -1446,6 +1455,7 @@
|
|
|
1446
1455
|
/* size */
|
|
1447
1456
|
width: 100%;
|
|
1448
1457
|
|
|
1458
|
+
/* border */
|
|
1449
1459
|
border-collapse: collapse;
|
|
1450
1460
|
}
|
|
1451
1461
|
|
|
@@ -1478,6 +1488,11 @@
|
|
|
1478
1488
|
margin: 0;
|
|
1479
1489
|
}
|
|
1480
1490
|
|
|
1491
|
+
.markdown--excerpt > p {
|
|
1492
|
+
/* size */
|
|
1493
|
+
margin: 0;
|
|
1494
|
+
}
|
|
1495
|
+
|
|
1481
1496
|
/* src/components/menu/menu.css */
|
|
1482
1497
|
.menu {
|
|
1483
1498
|
/* color */
|