@assistant-ui/react-markdown 0.7.13 → 0.7.15
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/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +2 -0
- package/dist/index.mjs.map +1 -1
- package/dist/memoization.d.ts +22 -0
- package/dist/memoization.d.ts.map +1 -0
- package/dist/memoization.js +60 -0
- package/dist/memoization.js.map +1 -0
- package/dist/memoization.mjs +33 -0
- package/dist/memoization.mjs.map +1 -0
- package/dist/overrides/CodeBlock.d.ts +0 -2
- package/dist/overrides/CodeBlock.d.ts.map +1 -1
- package/dist/overrides/CodeBlock.js +2 -4
- package/dist/overrides/CodeBlock.js.map +1 -1
- package/dist/overrides/CodeBlock.mjs +2 -4
- package/dist/overrides/CodeBlock.mjs.map +1 -1
- package/dist/overrides/CodeOverride.d.ts +2 -2
- package/dist/overrides/CodeOverride.d.ts.map +1 -1
- package/dist/overrides/CodeOverride.js +10 -8
- package/dist/overrides/CodeOverride.js.map +1 -1
- package/dist/overrides/CodeOverride.mjs +15 -10
- package/dist/overrides/CodeOverride.mjs.map +1 -1
- package/dist/overrides/PreOverride.d.ts +3 -2
- package/dist/overrides/PreOverride.d.ts.map +1 -1
- package/dist/overrides/PreOverride.js +3 -1
- package/dist/overrides/PreOverride.js.map +1 -1
- package/dist/overrides/PreOverride.mjs +8 -2
- package/dist/overrides/PreOverride.mjs.map +1 -1
- package/dist/overrides/defaultComponents.d.ts +0 -2
- package/dist/overrides/defaultComponents.d.ts.map +1 -1
- package/dist/overrides/defaultComponents.js +1 -1
- package/dist/overrides/defaultComponents.js.map +1 -1
- package/dist/overrides/defaultComponents.mjs +1 -1
- package/dist/overrides/defaultComponents.mjs.map +1 -1
- package/dist/primitives/MarkdownText.d.ts +2 -3
- package/dist/primitives/MarkdownText.d.ts.map +1 -1
- package/dist/primitives/MarkdownText.js +53 -32
- package/dist/primitives/MarkdownText.js.map +1 -1
- package/dist/primitives/MarkdownText.mjs +55 -33
- package/dist/primitives/MarkdownText.mjs.map +1 -1
- package/package.json +3 -3
- package/src/index.ts +2 -0
- package/src/memoization.tsx +47 -0
- package/src/overrides/CodeBlock.tsx +0 -4
- package/src/overrides/CodeOverride.tsx +20 -8
- package/src/overrides/PreOverride.tsx +10 -2
- package/src/overrides/defaultComponents.tsx +3 -5
- package/src/primitives/MarkdownText.tsx +64 -36
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/overrides/defaultComponents.tsx"],"sourcesContent":["import type { ComponentType, ReactNode } from \"react\";\nimport {
|
|
1
|
+
{"version":3,"sources":["../../src/overrides/defaultComponents.tsx"],"sourcesContent":["import type { ComponentType, ReactNode } from \"react\";\nimport { PreComponent, CodeComponent, CodeHeaderProps } from \"./types\";\n\nexport const DefaultPre: PreComponent = ({ node, ...rest }) => (\n <pre {...rest} />\n);\n\nexport const DefaultCode: CodeComponent = ({ node, ...rest }) => (\n <code {...rest} />\n);\n\nexport const DefaultCodeBlockContent: ComponentType<{\n components: { Pre: PreComponent; Code: CodeComponent };\n code: string | ReactNode | undefined;\n}> = ({ components: { Pre, Code }, code }) => (\n <Pre>\n <Code>{code}</Code>\n </Pre>\n);\n\nexport const DefaultCodeHeader: ComponentType<CodeHeaderProps> = () => null;\n"],"mappings":";AAIE;AADK,IAAM,aAA2B,CAAC,EAAE,MAAM,GAAG,KAAK,MACvD,oBAAC,SAAK,GAAG,MAAM;AAGV,IAAM,cAA6B,CAAC,EAAE,MAAM,GAAG,KAAK,MACzD,oBAAC,UAAM,GAAG,MAAM;AAGX,IAAM,0BAGR,CAAC,EAAE,YAAY,EAAE,KAAK,KAAK,GAAG,KAAK,MACtC,oBAAC,OACC,8BAAC,QAAM,gBAAK,GACd;AAGK,IAAM,oBAAoD,MAAM;","names":[]}
|
|
@@ -1,8 +1,7 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { ElementType, ForwardRefExoticComponent, RefAttributes, type ComponentPropsWithoutRef, type ComponentType } from "react";
|
|
2
2
|
import { type Options } from "react-markdown";
|
|
3
3
|
import { SyntaxHighlighterProps, CodeHeaderProps } from "../overrides/types";
|
|
4
4
|
import { Primitive } from "@radix-ui/react-primitive";
|
|
5
|
-
type MarkdownTextPrimitiveElement = ComponentRef<typeof Primitive.div>;
|
|
6
5
|
type PrimitiveDivProps = ComponentPropsWithoutRef<typeof Primitive.div>;
|
|
7
6
|
export type MarkdownTextPrimitiveProps = Omit<Options, "components" | "children"> & {
|
|
8
7
|
containerProps?: Omit<PrimitiveDivProps, "children" | "asChild"> | undefined;
|
|
@@ -21,6 +20,6 @@ export type MarkdownTextPrimitiveProps = Omit<Options, "components" | "children"
|
|
|
21
20
|
}> | undefined;
|
|
22
21
|
smooth?: boolean | undefined;
|
|
23
22
|
};
|
|
24
|
-
export declare const MarkdownTextPrimitive: ForwardRefExoticComponent<MarkdownTextPrimitiveProps> & RefAttributes<
|
|
23
|
+
export declare const MarkdownTextPrimitive: ForwardRefExoticComponent<MarkdownTextPrimitiveProps> & RefAttributes<HTMLDivElement>;
|
|
25
24
|
export {};
|
|
26
25
|
//# sourceMappingURL=MarkdownText.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MarkdownText.d.ts","sourceRoot":"","sources":["../../src/primitives/MarkdownText.tsx"],"names":[],"mappings":"AAGA,OAAO,
|
|
1
|
+
{"version":3,"file":"MarkdownText.d.ts","sourceRoot":"","sources":["../../src/primitives/MarkdownText.tsx"],"names":[],"mappings":"AAGA,OAAO,EAEL,WAAW,EAGX,yBAAyB,EACzB,aAAa,EAEb,KAAK,wBAAwB,EAC7B,KAAK,aAAa,EACnB,MAAM,OAAO,CAAC;AACf,OAAsB,EAAE,KAAK,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAC7D,OAAO,EAAE,sBAAsB,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAU7E,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAMtD,KAAK,iBAAiB,GAAG,wBAAwB,CAAC,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC;AAExE,MAAM,MAAM,0BAA0B,GAAG,IAAI,CAC3C,OAAO,EACP,YAAY,GAAG,UAAU,CAC1B,GAAG;IACF,cAAc,CAAC,EAAE,IAAI,CAAC,iBAAiB,EAAE,UAAU,GAAG,SAAS,CAAC,GAAG,SAAS,CAAC;IAC7E,kBAAkB,CAAC,EAAE,WAAW,GAAG,SAAS,CAAC;IAC7C,UAAU,CAAC,EACP,CAAC,WAAW,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,GAAG;QACpC,iBAAiB,CAAC,EAAE,aAAa,CAAC,sBAAsB,CAAC,GAAG,SAAS,CAAC;QACtE,UAAU,CAAC,EAAE,aAAa,CAAC,eAAe,CAAC,GAAG,SAAS,CAAC;QACxD;;YAEI;QACJ,WAAW,CAAC,EAAE,SAAS,CAAC;KACzB,CAAC,GACF,SAAS,CAAC;IACd,oBAAoB,CAAC,EACjB,MAAM,CACJ,MAAM,EACN;QACE,UAAU,CAAC,EAAE,aAAa,CAAC,eAAe,CAAC,GAAG,SAAS,CAAC;QACxD,iBAAiB,CAAC,EAAE,aAAa,CAAC,sBAAsB,CAAC,GAAG,SAAS,CAAC;KACvE,CACF,GACD,SAAS,CAAC;IACd,MAAM,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CAC9B,CAAC;AAqFF,eAAO,MAAM,qBAAqB,uFAEjC,CAAC"}
|
|
@@ -43,43 +43,61 @@ var import_react_use_callback_ref = require("@radix-ui/react-use-callback-ref");
|
|
|
43
43
|
var import_CodeOverride = require("../overrides/CodeOverride.js");
|
|
44
44
|
var import_classnames = __toESM(require("classnames"));
|
|
45
45
|
var import_jsx_runtime = require("react/jsx-runtime");
|
|
46
|
-
var { useSmooth } = import_react.INTERNAL;
|
|
47
|
-
var
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
46
|
+
var { useSmooth, useSmoothStatus, withSmoothContextProvider } = import_react.INTERNAL;
|
|
47
|
+
var MarkdownTextInner = ({
|
|
48
|
+
components: userComponents,
|
|
49
|
+
componentsByLanguage = userComponents?.by_language,
|
|
50
|
+
smooth = true,
|
|
51
|
+
...rest
|
|
52
|
+
}) => {
|
|
53
|
+
const { text } = useSmooth((0, import_react.useContentPartText)(), smooth);
|
|
54
|
+
const {
|
|
55
|
+
pre = import_defaultComponents.DefaultPre,
|
|
56
|
+
code = import_defaultComponents.DefaultCode,
|
|
57
|
+
SyntaxHighlighter = import_defaultComponents.DefaultCodeBlockContent,
|
|
58
|
+
CodeHeader = import_defaultComponents.DefaultCodeHeader
|
|
59
|
+
} = userComponents ?? {};
|
|
60
|
+
const useCodeOverrideComponents = (0, import_react2.useMemo)(() => {
|
|
61
|
+
return {
|
|
62
|
+
Pre: pre,
|
|
63
|
+
Code: code,
|
|
64
|
+
SyntaxHighlighter,
|
|
65
|
+
CodeHeader
|
|
66
|
+
};
|
|
67
|
+
}, [pre, code, SyntaxHighlighter, CodeHeader]);
|
|
68
|
+
const CodeComponent = (0, import_react_use_callback_ref.useCallbackRef)((props) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
69
|
+
import_CodeOverride.CodeOverride,
|
|
70
|
+
{
|
|
71
|
+
components: useCodeOverrideComponents,
|
|
72
|
+
componentsByLanguage,
|
|
73
|
+
...props
|
|
74
|
+
}
|
|
75
|
+
));
|
|
76
|
+
const components = (0, import_react2.useMemo)(() => {
|
|
58
77
|
const {
|
|
59
|
-
pre = import_defaultComponents.DefaultPre,
|
|
60
|
-
code = import_defaultComponents.DefaultCode,
|
|
61
|
-
SyntaxHighlighter = import_defaultComponents.DefaultCodeBlockContent,
|
|
62
|
-
CodeHeader = import_defaultComponents.DefaultCodeHeader,
|
|
78
|
+
pre: pre2 = import_defaultComponents.DefaultPre,
|
|
79
|
+
code: code2 = import_defaultComponents.DefaultCode,
|
|
80
|
+
SyntaxHighlighter: SyntaxHighlighter2 = import_defaultComponents.DefaultCodeBlockContent,
|
|
81
|
+
CodeHeader: CodeHeader2 = import_defaultComponents.DefaultCodeHeader,
|
|
63
82
|
by_language,
|
|
64
83
|
...componentsRest
|
|
65
84
|
} = userComponents ?? {};
|
|
66
|
-
|
|
85
|
+
return {
|
|
67
86
|
...componentsRest,
|
|
68
87
|
pre: import_PreOverride.PreOverride,
|
|
69
|
-
code:
|
|
70
|
-
import_CodeOverride.CodeOverride,
|
|
71
|
-
{
|
|
72
|
-
components: {
|
|
73
|
-
Pre: pre,
|
|
74
|
-
Code: code,
|
|
75
|
-
SyntaxHighlighter,
|
|
76
|
-
CodeHeader
|
|
77
|
-
},
|
|
78
|
-
componentsByLanguage,
|
|
79
|
-
...props
|
|
80
|
-
}
|
|
81
|
-
))
|
|
88
|
+
code: CodeComponent
|
|
82
89
|
};
|
|
90
|
+
}, [CodeComponent, userComponents, componentsByLanguage]);
|
|
91
|
+
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_react_markdown.default, { components, ...rest, children: text });
|
|
92
|
+
};
|
|
93
|
+
var MarkdownTextPrimitiveImpl = (0, import_react2.forwardRef)(
|
|
94
|
+
({
|
|
95
|
+
className,
|
|
96
|
+
containerProps,
|
|
97
|
+
containerComponent: Container = "div",
|
|
98
|
+
...rest
|
|
99
|
+
}, forwardedRef) => {
|
|
100
|
+
const status = useSmoothStatus();
|
|
83
101
|
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
84
102
|
Container,
|
|
85
103
|
{
|
|
@@ -87,12 +105,15 @@ var MarkdownTextPrimitive = (0, import_react2.forwardRef)(
|
|
|
87
105
|
...containerProps,
|
|
88
106
|
className: (0, import_classnames.default)(className, containerProps?.className),
|
|
89
107
|
ref: forwardedRef,
|
|
90
|
-
children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
108
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(MarkdownTextInner, { ...rest })
|
|
91
109
|
}
|
|
92
110
|
);
|
|
93
111
|
}
|
|
94
112
|
);
|
|
95
|
-
|
|
113
|
+
MarkdownTextPrimitiveImpl.displayName = "MarkdownTextPrimitive";
|
|
114
|
+
var MarkdownTextPrimitive = withSmoothContextProvider(
|
|
115
|
+
MarkdownTextPrimitiveImpl
|
|
116
|
+
);
|
|
96
117
|
// Annotate the CommonJS export names for ESM import in node:
|
|
97
118
|
0 && (module.exports = {
|
|
98
119
|
MarkdownTextPrimitive
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/primitives/MarkdownText.tsx"],"sourcesContent":["\"use client\";\n\nimport { INTERNAL, useContentPartText } from \"@assistant-ui/react\";\nimport {\n ComponentRef,\n ElementType,\n forwardRef,\n ForwardRefExoticComponent,\n RefAttributes,\n type ComponentPropsWithoutRef,\n type ComponentType,\n} from \"react\";\nimport ReactMarkdown, { type Options } from \"react-markdown\";\nimport { SyntaxHighlighterProps, CodeHeaderProps } from \"../overrides/types\";\nimport { PreOverride } from \"../overrides/PreOverride\";\nimport {\n DefaultPre,\n DefaultCode,\n DefaultCodeBlockContent,\n DefaultCodeHeader,\n} from \"../overrides/defaultComponents\";\nimport { useCallbackRef } from \"@radix-ui/react-use-callback-ref\";\nimport { CodeOverride } from \"../overrides/CodeOverride\";\nimport { Primitive } from \"@radix-ui/react-primitive\";\nimport classNames from \"classnames\";\n\nconst { useSmooth } = INTERNAL;\n\ntype MarkdownTextPrimitiveElement = ComponentRef<typeof Primitive.div>;\ntype PrimitiveDivProps = ComponentPropsWithoutRef<typeof Primitive.div>;\n\nexport type MarkdownTextPrimitiveProps = Omit<\n Options,\n \"components\" | \"children\"\n> & {\n containerProps?: Omit<PrimitiveDivProps, \"children\" | \"asChild\"> | undefined;\n containerComponent?: ElementType | undefined;\n components?:\n | (NonNullable<Options[\"components\"]> & {\n SyntaxHighlighter?: ComponentType<SyntaxHighlighterProps> | undefined;\n CodeHeader?: ComponentType<CodeHeaderProps> | undefined;\n /**\n * @deprecated Use `componentsByLanguage` instead of `components.by_language`. This will be removed in the next major version.\n **/\n by_language?: undefined;\n })\n | undefined;\n componentsByLanguage?:\n | Record<\n string,\n {\n CodeHeader?: ComponentType<CodeHeaderProps> | undefined;\n SyntaxHighlighter?: ComponentType<SyntaxHighlighterProps> | undefined;\n }\n >\n | undefined;\n smooth?: boolean | undefined;\n};\n\
|
|
1
|
+
{"version":3,"sources":["../../src/primitives/MarkdownText.tsx"],"sourcesContent":["\"use client\";\n\nimport { INTERNAL, useContentPartText } from \"@assistant-ui/react\";\nimport {\n ComponentRef,\n ElementType,\n FC,\n forwardRef,\n ForwardRefExoticComponent,\n RefAttributes,\n useMemo,\n type ComponentPropsWithoutRef,\n type ComponentType,\n} from \"react\";\nimport ReactMarkdown, { type Options } from \"react-markdown\";\nimport { SyntaxHighlighterProps, CodeHeaderProps } from \"../overrides/types\";\nimport { PreOverride } from \"../overrides/PreOverride\";\nimport {\n DefaultPre,\n DefaultCode,\n DefaultCodeBlockContent,\n DefaultCodeHeader,\n} from \"../overrides/defaultComponents\";\nimport { useCallbackRef } from \"@radix-ui/react-use-callback-ref\";\nimport { CodeOverride } from \"../overrides/CodeOverride\";\nimport { Primitive } from \"@radix-ui/react-primitive\";\nimport classNames from \"classnames\";\n\nconst { useSmooth, useSmoothStatus, withSmoothContextProvider } = INTERNAL;\n\ntype MarkdownTextPrimitiveElement = ComponentRef<typeof Primitive.div>;\ntype PrimitiveDivProps = ComponentPropsWithoutRef<typeof Primitive.div>;\n\nexport type MarkdownTextPrimitiveProps = Omit<\n Options,\n \"components\" | \"children\"\n> & {\n containerProps?: Omit<PrimitiveDivProps, \"children\" | \"asChild\"> | undefined;\n containerComponent?: ElementType | undefined;\n components?:\n | (NonNullable<Options[\"components\"]> & {\n SyntaxHighlighter?: ComponentType<SyntaxHighlighterProps> | undefined;\n CodeHeader?: ComponentType<CodeHeaderProps> | undefined;\n /**\n * @deprecated Use `componentsByLanguage` instead of `components.by_language`. This will be removed in the next major version.\n **/\n by_language?: undefined;\n })\n | undefined;\n componentsByLanguage?:\n | Record<\n string,\n {\n CodeHeader?: ComponentType<CodeHeaderProps> | undefined;\n SyntaxHighlighter?: ComponentType<SyntaxHighlighterProps> | undefined;\n }\n >\n | undefined;\n smooth?: boolean | undefined;\n};\n\nconst MarkdownTextInner: FC<MarkdownTextPrimitiveProps> = ({\n components: userComponents,\n componentsByLanguage = userComponents?.by_language,\n smooth = true,\n ...rest\n}) => {\n const { text } = useSmooth(useContentPartText(), smooth);\n\n const {\n pre = DefaultPre,\n code = DefaultCode,\n SyntaxHighlighter = DefaultCodeBlockContent,\n CodeHeader = DefaultCodeHeader,\n } = userComponents ?? {};\n const useCodeOverrideComponents = useMemo(() => {\n return {\n Pre: pre,\n Code: code,\n SyntaxHighlighter,\n CodeHeader,\n };\n }, [pre, code, SyntaxHighlighter, CodeHeader]);\n const CodeComponent = useCallbackRef((props) => (\n <CodeOverride\n components={useCodeOverrideComponents}\n componentsByLanguage={componentsByLanguage}\n {...props}\n />\n ));\n\n const components: Options[\"components\"] = useMemo(() => {\n const {\n pre = DefaultPre,\n code = DefaultCode,\n SyntaxHighlighter = DefaultCodeBlockContent,\n CodeHeader = DefaultCodeHeader,\n by_language,\n ...componentsRest\n } = userComponents ?? {};\n return {\n ...componentsRest,\n pre: PreOverride,\n code: CodeComponent,\n };\n }, [CodeComponent, userComponents, componentsByLanguage]);\n\n return (\n <ReactMarkdown components={components} {...rest}>\n {text}\n </ReactMarkdown>\n );\n};\n\nconst MarkdownTextPrimitiveImpl: ForwardRefExoticComponent<MarkdownTextPrimitiveProps> &\n RefAttributes<MarkdownTextPrimitiveElement> = forwardRef<\n MarkdownTextPrimitiveElement,\n MarkdownTextPrimitiveProps\n>(\n (\n {\n className,\n containerProps,\n containerComponent: Container = \"div\",\n ...rest\n },\n forwardedRef,\n ) => {\n const status = useSmoothStatus();\n return (\n <Container\n data-status={status.type}\n {...containerProps}\n className={classNames(className, containerProps?.className)}\n ref={forwardedRef}\n >\n <MarkdownTextInner {...rest}></MarkdownTextInner>\n </Container>\n );\n },\n);\n\nMarkdownTextPrimitiveImpl.displayName = \"MarkdownTextPrimitive\";\n\nexport const MarkdownTextPrimitive = withSmoothContextProvider(\n MarkdownTextPrimitiveImpl,\n);\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA,mBAA6C;AAC7C,IAAAA,gBAUO;AACP,4BAA4C;AAE5C,yBAA4B;AAC5B,+BAKO;AACP,oCAA+B;AAC/B,0BAA6B;AAE7B,wBAAuB;AA0DnB;AAxDJ,IAAM,EAAE,WAAW,iBAAiB,0BAA0B,IAAI;AAiClE,IAAM,oBAAoD,CAAC;AAAA,EACzD,YAAY;AAAA,EACZ,uBAAuB,gBAAgB;AAAA,EACvC,SAAS;AAAA,EACT,GAAG;AACL,MAAM;AACJ,QAAM,EAAE,KAAK,IAAI,cAAU,iCAAmB,GAAG,MAAM;AAEvD,QAAM;AAAA,IACJ,MAAM;AAAA,IACN,OAAO;AAAA,IACP,oBAAoB;AAAA,IACpB,aAAa;AAAA,EACf,IAAI,kBAAkB,CAAC;AACvB,QAAM,gCAA4B,uBAAQ,MAAM;AAC9C,WAAO;AAAA,MACL,KAAK;AAAA,MACL,MAAM;AAAA,MACN;AAAA,MACA;AAAA,IACF;AAAA,EACF,GAAG,CAAC,KAAK,MAAM,mBAAmB,UAAU,CAAC;AAC7C,QAAM,oBAAgB,8CAAe,CAAC,UACpC;AAAA,IAAC;AAAA;AAAA,MACC,YAAY;AAAA,MACZ;AAAA,MACC,GAAG;AAAA;AAAA,EACN,CACD;AAED,QAAM,iBAAoC,uBAAQ,MAAM;AACtD,UAAM;AAAA,MACJ,KAAAC,OAAM;AAAA,MACN,MAAAC,QAAO;AAAA,MACP,mBAAAC,qBAAoB;AAAA,MACpB,YAAAC,cAAa;AAAA,MACb;AAAA,MACA,GAAG;AAAA,IACL,IAAI,kBAAkB,CAAC;AACvB,WAAO;AAAA,MACL,GAAG;AAAA,MACH,KAAK;AAAA,MACL,MAAM;AAAA,IACR;AAAA,EACF,GAAG,CAAC,eAAe,gBAAgB,oBAAoB,CAAC;AAExD,SACE,4CAAC,sBAAAC,SAAA,EAAc,YAAyB,GAAG,MACxC,gBACH;AAEJ;AAEA,IAAM,gCAC0C;AAAA,EAI9C,CACE;AAAA,IACE;AAAA,IACA;AAAA,IACA,oBAAoB,YAAY;AAAA,IAChC,GAAG;AAAA,EACL,GACA,iBACG;AACH,UAAM,SAAS,gBAAgB;AAC/B,WACE;AAAA,MAAC;AAAA;AAAA,QACC,eAAa,OAAO;AAAA,QACnB,GAAG;AAAA,QACJ,eAAW,kBAAAC,SAAW,WAAW,gBAAgB,SAAS;AAAA,QAC1D,KAAK;AAAA,QAEL,sDAAC,qBAAmB,GAAG,MAAM;AAAA;AAAA,IAC/B;AAAA,EAEJ;AACF;AAEA,0BAA0B,cAAc;AAEjC,IAAM,wBAAwB;AAAA,EACnC;AACF;","names":["import_react","pre","code","SyntaxHighlighter","CodeHeader","ReactMarkdown","classNames"]}
|
|
@@ -3,7 +3,8 @@
|
|
|
3
3
|
// src/primitives/MarkdownText.tsx
|
|
4
4
|
import { INTERNAL, useContentPartText } from "@assistant-ui/react";
|
|
5
5
|
import {
|
|
6
|
-
forwardRef
|
|
6
|
+
forwardRef,
|
|
7
|
+
useMemo
|
|
7
8
|
} from "react";
|
|
8
9
|
import ReactMarkdown from "react-markdown";
|
|
9
10
|
import { PreOverride } from "../overrides/PreOverride.mjs";
|
|
@@ -17,43 +18,61 @@ import { useCallbackRef } from "@radix-ui/react-use-callback-ref";
|
|
|
17
18
|
import { CodeOverride } from "../overrides/CodeOverride.mjs";
|
|
18
19
|
import classNames from "classnames";
|
|
19
20
|
import { jsx } from "react/jsx-runtime";
|
|
20
|
-
var { useSmooth } = INTERNAL;
|
|
21
|
-
var
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
21
|
+
var { useSmooth, useSmoothStatus, withSmoothContextProvider } = INTERNAL;
|
|
22
|
+
var MarkdownTextInner = ({
|
|
23
|
+
components: userComponents,
|
|
24
|
+
componentsByLanguage = userComponents?.by_language,
|
|
25
|
+
smooth = true,
|
|
26
|
+
...rest
|
|
27
|
+
}) => {
|
|
28
|
+
const { text } = useSmooth(useContentPartText(), smooth);
|
|
29
|
+
const {
|
|
30
|
+
pre = DefaultPre,
|
|
31
|
+
code = DefaultCode,
|
|
32
|
+
SyntaxHighlighter = DefaultCodeBlockContent,
|
|
33
|
+
CodeHeader = DefaultCodeHeader
|
|
34
|
+
} = userComponents ?? {};
|
|
35
|
+
const useCodeOverrideComponents = useMemo(() => {
|
|
36
|
+
return {
|
|
37
|
+
Pre: pre,
|
|
38
|
+
Code: code,
|
|
39
|
+
SyntaxHighlighter,
|
|
40
|
+
CodeHeader
|
|
41
|
+
};
|
|
42
|
+
}, [pre, code, SyntaxHighlighter, CodeHeader]);
|
|
43
|
+
const CodeComponent = useCallbackRef((props) => /* @__PURE__ */ jsx(
|
|
44
|
+
CodeOverride,
|
|
45
|
+
{
|
|
46
|
+
components: useCodeOverrideComponents,
|
|
47
|
+
componentsByLanguage,
|
|
48
|
+
...props
|
|
49
|
+
}
|
|
50
|
+
));
|
|
51
|
+
const components = useMemo(() => {
|
|
32
52
|
const {
|
|
33
|
-
pre = DefaultPre,
|
|
34
|
-
code = DefaultCode,
|
|
35
|
-
SyntaxHighlighter = DefaultCodeBlockContent,
|
|
36
|
-
CodeHeader = DefaultCodeHeader,
|
|
53
|
+
pre: pre2 = DefaultPre,
|
|
54
|
+
code: code2 = DefaultCode,
|
|
55
|
+
SyntaxHighlighter: SyntaxHighlighter2 = DefaultCodeBlockContent,
|
|
56
|
+
CodeHeader: CodeHeader2 = DefaultCodeHeader,
|
|
37
57
|
by_language,
|
|
38
58
|
...componentsRest
|
|
39
59
|
} = userComponents ?? {};
|
|
40
|
-
|
|
60
|
+
return {
|
|
41
61
|
...componentsRest,
|
|
42
62
|
pre: PreOverride,
|
|
43
|
-
code:
|
|
44
|
-
CodeOverride,
|
|
45
|
-
{
|
|
46
|
-
components: {
|
|
47
|
-
Pre: pre,
|
|
48
|
-
Code: code,
|
|
49
|
-
SyntaxHighlighter,
|
|
50
|
-
CodeHeader
|
|
51
|
-
},
|
|
52
|
-
componentsByLanguage,
|
|
53
|
-
...props
|
|
54
|
-
}
|
|
55
|
-
))
|
|
63
|
+
code: CodeComponent
|
|
56
64
|
};
|
|
65
|
+
}, [CodeComponent, userComponents, componentsByLanguage]);
|
|
66
|
+
return /* @__PURE__ */ jsx(ReactMarkdown, { components, ...rest, children: text });
|
|
67
|
+
};
|
|
68
|
+
var MarkdownTextPrimitiveImpl = forwardRef(
|
|
69
|
+
({
|
|
70
|
+
className,
|
|
71
|
+
containerProps,
|
|
72
|
+
containerComponent: Container = "div",
|
|
73
|
+
...rest
|
|
74
|
+
}, forwardedRef) => {
|
|
75
|
+
const status = useSmoothStatus();
|
|
57
76
|
return /* @__PURE__ */ jsx(
|
|
58
77
|
Container,
|
|
59
78
|
{
|
|
@@ -61,12 +80,15 @@ var MarkdownTextPrimitive = forwardRef(
|
|
|
61
80
|
...containerProps,
|
|
62
81
|
className: classNames(className, containerProps?.className),
|
|
63
82
|
ref: forwardedRef,
|
|
64
|
-
children: /* @__PURE__ */ jsx(
|
|
83
|
+
children: /* @__PURE__ */ jsx(MarkdownTextInner, { ...rest })
|
|
65
84
|
}
|
|
66
85
|
);
|
|
67
86
|
}
|
|
68
87
|
);
|
|
69
|
-
|
|
88
|
+
MarkdownTextPrimitiveImpl.displayName = "MarkdownTextPrimitive";
|
|
89
|
+
var MarkdownTextPrimitive = withSmoothContextProvider(
|
|
90
|
+
MarkdownTextPrimitiveImpl
|
|
91
|
+
);
|
|
70
92
|
export {
|
|
71
93
|
MarkdownTextPrimitive
|
|
72
94
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/primitives/MarkdownText.tsx"],"sourcesContent":["\"use client\";\n\nimport { INTERNAL, useContentPartText } from \"@assistant-ui/react\";\nimport {\n ComponentRef,\n ElementType,\n forwardRef,\n ForwardRefExoticComponent,\n RefAttributes,\n type ComponentPropsWithoutRef,\n type ComponentType,\n} from \"react\";\nimport ReactMarkdown, { type Options } from \"react-markdown\";\nimport { SyntaxHighlighterProps, CodeHeaderProps } from \"../overrides/types\";\nimport { PreOverride } from \"../overrides/PreOverride\";\nimport {\n DefaultPre,\n DefaultCode,\n DefaultCodeBlockContent,\n DefaultCodeHeader,\n} from \"../overrides/defaultComponents\";\nimport { useCallbackRef } from \"@radix-ui/react-use-callback-ref\";\nimport { CodeOverride } from \"../overrides/CodeOverride\";\nimport { Primitive } from \"@radix-ui/react-primitive\";\nimport classNames from \"classnames\";\n\nconst { useSmooth } = INTERNAL;\n\ntype MarkdownTextPrimitiveElement = ComponentRef<typeof Primitive.div>;\ntype PrimitiveDivProps = ComponentPropsWithoutRef<typeof Primitive.div>;\n\nexport type MarkdownTextPrimitiveProps = Omit<\n Options,\n \"components\" | \"children\"\n> & {\n containerProps?: Omit<PrimitiveDivProps, \"children\" | \"asChild\"> | undefined;\n containerComponent?: ElementType | undefined;\n components?:\n | (NonNullable<Options[\"components\"]> & {\n SyntaxHighlighter?: ComponentType<SyntaxHighlighterProps> | undefined;\n CodeHeader?: ComponentType<CodeHeaderProps> | undefined;\n /**\n * @deprecated Use `componentsByLanguage` instead of `components.by_language`. This will be removed in the next major version.\n **/\n by_language?: undefined;\n })\n | undefined;\n componentsByLanguage?:\n | Record<\n string,\n {\n CodeHeader?: ComponentType<CodeHeaderProps> | undefined;\n SyntaxHighlighter?: ComponentType<SyntaxHighlighterProps> | undefined;\n }\n >\n | undefined;\n smooth?: boolean | undefined;\n};\n\
|
|
1
|
+
{"version":3,"sources":["../../src/primitives/MarkdownText.tsx"],"sourcesContent":["\"use client\";\n\nimport { INTERNAL, useContentPartText } from \"@assistant-ui/react\";\nimport {\n ComponentRef,\n ElementType,\n FC,\n forwardRef,\n ForwardRefExoticComponent,\n RefAttributes,\n useMemo,\n type ComponentPropsWithoutRef,\n type ComponentType,\n} from \"react\";\nimport ReactMarkdown, { type Options } from \"react-markdown\";\nimport { SyntaxHighlighterProps, CodeHeaderProps } from \"../overrides/types\";\nimport { PreOverride } from \"../overrides/PreOverride\";\nimport {\n DefaultPre,\n DefaultCode,\n DefaultCodeBlockContent,\n DefaultCodeHeader,\n} from \"../overrides/defaultComponents\";\nimport { useCallbackRef } from \"@radix-ui/react-use-callback-ref\";\nimport { CodeOverride } from \"../overrides/CodeOverride\";\nimport { Primitive } from \"@radix-ui/react-primitive\";\nimport classNames from \"classnames\";\n\nconst { useSmooth, useSmoothStatus, withSmoothContextProvider } = INTERNAL;\n\ntype MarkdownTextPrimitiveElement = ComponentRef<typeof Primitive.div>;\ntype PrimitiveDivProps = ComponentPropsWithoutRef<typeof Primitive.div>;\n\nexport type MarkdownTextPrimitiveProps = Omit<\n Options,\n \"components\" | \"children\"\n> & {\n containerProps?: Omit<PrimitiveDivProps, \"children\" | \"asChild\"> | undefined;\n containerComponent?: ElementType | undefined;\n components?:\n | (NonNullable<Options[\"components\"]> & {\n SyntaxHighlighter?: ComponentType<SyntaxHighlighterProps> | undefined;\n CodeHeader?: ComponentType<CodeHeaderProps> | undefined;\n /**\n * @deprecated Use `componentsByLanguage` instead of `components.by_language`. This will be removed in the next major version.\n **/\n by_language?: undefined;\n })\n | undefined;\n componentsByLanguage?:\n | Record<\n string,\n {\n CodeHeader?: ComponentType<CodeHeaderProps> | undefined;\n SyntaxHighlighter?: ComponentType<SyntaxHighlighterProps> | undefined;\n }\n >\n | undefined;\n smooth?: boolean | undefined;\n};\n\nconst MarkdownTextInner: FC<MarkdownTextPrimitiveProps> = ({\n components: userComponents,\n componentsByLanguage = userComponents?.by_language,\n smooth = true,\n ...rest\n}) => {\n const { text } = useSmooth(useContentPartText(), smooth);\n\n const {\n pre = DefaultPre,\n code = DefaultCode,\n SyntaxHighlighter = DefaultCodeBlockContent,\n CodeHeader = DefaultCodeHeader,\n } = userComponents ?? {};\n const useCodeOverrideComponents = useMemo(() => {\n return {\n Pre: pre,\n Code: code,\n SyntaxHighlighter,\n CodeHeader,\n };\n }, [pre, code, SyntaxHighlighter, CodeHeader]);\n const CodeComponent = useCallbackRef((props) => (\n <CodeOverride\n components={useCodeOverrideComponents}\n componentsByLanguage={componentsByLanguage}\n {...props}\n />\n ));\n\n const components: Options[\"components\"] = useMemo(() => {\n const {\n pre = DefaultPre,\n code = DefaultCode,\n SyntaxHighlighter = DefaultCodeBlockContent,\n CodeHeader = DefaultCodeHeader,\n by_language,\n ...componentsRest\n } = userComponents ?? {};\n return {\n ...componentsRest,\n pre: PreOverride,\n code: CodeComponent,\n };\n }, [CodeComponent, userComponents, componentsByLanguage]);\n\n return (\n <ReactMarkdown components={components} {...rest}>\n {text}\n </ReactMarkdown>\n );\n};\n\nconst MarkdownTextPrimitiveImpl: ForwardRefExoticComponent<MarkdownTextPrimitiveProps> &\n RefAttributes<MarkdownTextPrimitiveElement> = forwardRef<\n MarkdownTextPrimitiveElement,\n MarkdownTextPrimitiveProps\n>(\n (\n {\n className,\n containerProps,\n containerComponent: Container = \"div\",\n ...rest\n },\n forwardedRef,\n ) => {\n const status = useSmoothStatus();\n return (\n <Container\n data-status={status.type}\n {...containerProps}\n className={classNames(className, containerProps?.className)}\n ref={forwardedRef}\n >\n <MarkdownTextInner {...rest}></MarkdownTextInner>\n </Container>\n );\n },\n);\n\nMarkdownTextPrimitiveImpl.displayName = \"MarkdownTextPrimitive\";\n\nexport const MarkdownTextPrimitive = withSmoothContextProvider(\n MarkdownTextPrimitiveImpl,\n);\n"],"mappings":";;;AAEA,SAAS,UAAU,0BAA0B;AAC7C;AAAA,EAIE;AAAA,EAGA;AAAA,OAGK;AACP,OAAO,mBAAqC;AAE5C,SAAS,mBAAmB;AAC5B;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,sBAAsB;AAC/B,SAAS,oBAAoB;AAE7B,OAAO,gBAAgB;AA0DnB;AAxDJ,IAAM,EAAE,WAAW,iBAAiB,0BAA0B,IAAI;AAiClE,IAAM,oBAAoD,CAAC;AAAA,EACzD,YAAY;AAAA,EACZ,uBAAuB,gBAAgB;AAAA,EACvC,SAAS;AAAA,EACT,GAAG;AACL,MAAM;AACJ,QAAM,EAAE,KAAK,IAAI,UAAU,mBAAmB,GAAG,MAAM;AAEvD,QAAM;AAAA,IACJ,MAAM;AAAA,IACN,OAAO;AAAA,IACP,oBAAoB;AAAA,IACpB,aAAa;AAAA,EACf,IAAI,kBAAkB,CAAC;AACvB,QAAM,4BAA4B,QAAQ,MAAM;AAC9C,WAAO;AAAA,MACL,KAAK;AAAA,MACL,MAAM;AAAA,MACN;AAAA,MACA;AAAA,IACF;AAAA,EACF,GAAG,CAAC,KAAK,MAAM,mBAAmB,UAAU,CAAC;AAC7C,QAAM,gBAAgB,eAAe,CAAC,UACpC;AAAA,IAAC;AAAA;AAAA,MACC,YAAY;AAAA,MACZ;AAAA,MACC,GAAG;AAAA;AAAA,EACN,CACD;AAED,QAAM,aAAoC,QAAQ,MAAM;AACtD,UAAM;AAAA,MACJ,KAAAA,OAAM;AAAA,MACN,MAAAC,QAAO;AAAA,MACP,mBAAAC,qBAAoB;AAAA,MACpB,YAAAC,cAAa;AAAA,MACb;AAAA,MACA,GAAG;AAAA,IACL,IAAI,kBAAkB,CAAC;AACvB,WAAO;AAAA,MACL,GAAG;AAAA,MACH,KAAK;AAAA,MACL,MAAM;AAAA,IACR;AAAA,EACF,GAAG,CAAC,eAAe,gBAAgB,oBAAoB,CAAC;AAExD,SACE,oBAAC,iBAAc,YAAyB,GAAG,MACxC,gBACH;AAEJ;AAEA,IAAM,4BAC0C;AAAA,EAI9C,CACE;AAAA,IACE;AAAA,IACA;AAAA,IACA,oBAAoB,YAAY;AAAA,IAChC,GAAG;AAAA,EACL,GACA,iBACG;AACH,UAAM,SAAS,gBAAgB;AAC/B,WACE;AAAA,MAAC;AAAA;AAAA,QACC,eAAa,OAAO;AAAA,QACnB,GAAG;AAAA,QACJ,WAAW,WAAW,WAAW,gBAAgB,SAAS;AAAA,QAC1D,KAAK;AAAA,QAEL,8BAAC,qBAAmB,GAAG,MAAM;AAAA;AAAA,IAC/B;AAAA,EAEJ;AACF;AAEA,0BAA0B,cAAc;AAEjC,IAAM,wBAAwB;AAAA,EACnC;AACF;","names":["pre","code","SyntaxHighlighter","CodeHeader"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@assistant-ui/react-markdown",
|
|
3
|
-
"version": "0.7.
|
|
3
|
+
"version": "0.7.15",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"exports": {
|
|
6
6
|
".": {
|
|
@@ -41,7 +41,7 @@
|
|
|
41
41
|
"react-markdown": "^9.0.3"
|
|
42
42
|
},
|
|
43
43
|
"peerDependencies": {
|
|
44
|
-
"@assistant-ui/react": "^0.7.
|
|
44
|
+
"@assistant-ui/react": "^0.7.62",
|
|
45
45
|
"@types/react": "*",
|
|
46
46
|
"react": "^18 || ^19 || ^19.0.0-rc",
|
|
47
47
|
"tailwindcss": "^3.4.4"
|
|
@@ -65,7 +65,7 @@
|
|
|
65
65
|
"tailwindcss": "^3.4.17",
|
|
66
66
|
"tailwindcss-animate": "^1.0.7",
|
|
67
67
|
"tsx": "^4.19.2",
|
|
68
|
-
"@assistant-ui/react": "0.7.
|
|
68
|
+
"@assistant-ui/react": "0.7.62",
|
|
69
69
|
"@assistant-ui/tailwindcss-transformer": "0.1.0",
|
|
70
70
|
"@assistant-ui/tsbuildutils": "^0.0.1",
|
|
71
71
|
"@assistant-ui/tsconfig": "0.0.0"
|
package/src/index.ts
CHANGED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { Element } from "hast";
|
|
2
|
+
import { ComponentProps, ComponentType, ElementType, memo } from "react";
|
|
3
|
+
import { CodeHeaderProps, SyntaxHighlighterProps } from "./overrides/types";
|
|
4
|
+
|
|
5
|
+
type Components = {
|
|
6
|
+
[Key in Extract<ElementType, string>]?: ComponentType<ComponentProps<Key>>;
|
|
7
|
+
} & {
|
|
8
|
+
SyntaxHighlighter?: ComponentType<SyntaxHighlighterProps> | undefined;
|
|
9
|
+
CodeHeader?: ComponentType<CodeHeaderProps> | undefined;
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
const areChildrenEqual = (prev: string | unknown, next: string | unknown) => {
|
|
13
|
+
if (typeof prev === "string") return prev === next;
|
|
14
|
+
return JSON.stringify(prev) === JSON.stringify(next);
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
export const areNodesEqual = (
|
|
18
|
+
prev: Element | undefined,
|
|
19
|
+
next: Element | undefined,
|
|
20
|
+
) => {
|
|
21
|
+
if (!prev || !next) return prev === next;
|
|
22
|
+
const isEqual =
|
|
23
|
+
JSON.stringify(prev?.properties) === JSON.stringify(next?.properties) &&
|
|
24
|
+
areChildrenEqual(prev?.children, next?.children);
|
|
25
|
+
return isEqual;
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
export const memoCompareNodes = (
|
|
29
|
+
prev: { node?: Element | undefined },
|
|
30
|
+
next: { node?: Element | undefined },
|
|
31
|
+
) => {
|
|
32
|
+
return areNodesEqual(prev.node, next.node);
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
export const memoizeMarkdownComponents = (components: Components = {}) => {
|
|
36
|
+
return Object.fromEntries(
|
|
37
|
+
Object.entries(components ?? {}).map(([key, value]) => {
|
|
38
|
+
if (!value) return [key, value];
|
|
39
|
+
|
|
40
|
+
const Component = value as ComponentType;
|
|
41
|
+
const WithoutNode = ({ node, ...props }: { node?: Element }) => {
|
|
42
|
+
return <Component {...props} />;
|
|
43
|
+
};
|
|
44
|
+
return [key, memo(WithoutNode, memoCompareNodes)];
|
|
45
|
+
}),
|
|
46
|
+
);
|
|
47
|
+
};
|
|
@@ -7,7 +7,6 @@ import {
|
|
|
7
7
|
SyntaxHighlighterProps,
|
|
8
8
|
} from "./types";
|
|
9
9
|
import { DefaultCodeBlockContent } from "./defaultComponents";
|
|
10
|
-
import { Element } from "hast";
|
|
11
10
|
|
|
12
11
|
export type CodeBlockProps = {
|
|
13
12
|
language: string;
|
|
@@ -18,14 +17,12 @@ export type CodeBlockProps = {
|
|
|
18
17
|
CodeHeader: ComponentType<CodeHeaderProps>;
|
|
19
18
|
SyntaxHighlighter: ComponentType<SyntaxHighlighterProps>;
|
|
20
19
|
};
|
|
21
|
-
node: Element | undefined;
|
|
22
20
|
};
|
|
23
21
|
|
|
24
22
|
export const DefaultCodeBlock: FC<CodeBlockProps> = ({
|
|
25
23
|
components: { Pre, Code, SyntaxHighlighter, CodeHeader },
|
|
26
24
|
language,
|
|
27
25
|
code,
|
|
28
|
-
node,
|
|
29
26
|
}) => {
|
|
30
27
|
const components = useMemo(() => ({ Pre, Code }), [Pre, Code]);
|
|
31
28
|
|
|
@@ -38,7 +35,6 @@ export const DefaultCodeBlock: FC<CodeBlockProps> = ({
|
|
|
38
35
|
components={components}
|
|
39
36
|
language={language ?? "unknown"}
|
|
40
37
|
code={code}
|
|
41
|
-
node={node}
|
|
42
38
|
/>
|
|
43
39
|
</>
|
|
44
40
|
);
|
|
@@ -1,5 +1,11 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
1
|
+
import {
|
|
2
|
+
ComponentPropsWithoutRef,
|
|
3
|
+
ComponentType,
|
|
4
|
+
FC,
|
|
5
|
+
memo,
|
|
6
|
+
useContext,
|
|
7
|
+
} from "react";
|
|
8
|
+
import { PreContext, useIsMarkdownCodeBlock } from "./PreOverride";
|
|
3
9
|
import {
|
|
4
10
|
CodeComponent,
|
|
5
11
|
CodeHeaderProps,
|
|
@@ -10,6 +16,7 @@ import { DefaultCodeBlock } from "./CodeBlock";
|
|
|
10
16
|
import { useCallbackRef } from "@radix-ui/react-use-callback-ref";
|
|
11
17
|
import { withDefaultProps } from "./withDefaults";
|
|
12
18
|
import { DefaultCodeBlockContent } from "./defaultComponents";
|
|
19
|
+
import { memoCompareNodes } from "../memoization";
|
|
13
20
|
|
|
14
21
|
const CodeBlockOverride: FC<CodeOverrideProps> = ({
|
|
15
22
|
components: {
|
|
@@ -20,7 +27,6 @@ const CodeBlockOverride: FC<CodeOverrideProps> = ({
|
|
|
20
27
|
},
|
|
21
28
|
componentsByLanguage = {},
|
|
22
29
|
children,
|
|
23
|
-
node,
|
|
24
30
|
...codeProps
|
|
25
31
|
}) => {
|
|
26
32
|
const preProps = useContext(PreContext)!;
|
|
@@ -42,7 +48,6 @@ const CodeBlockOverride: FC<CodeOverrideProps> = ({
|
|
|
42
48
|
<DefaultCodeBlockContent
|
|
43
49
|
components={{ Pre: WrappedPre, Code: WrappedCode }}
|
|
44
50
|
code={children}
|
|
45
|
-
node={node}
|
|
46
51
|
/>
|
|
47
52
|
);
|
|
48
53
|
}
|
|
@@ -64,7 +69,6 @@ const CodeBlockOverride: FC<CodeOverrideProps> = ({
|
|
|
64
69
|
}}
|
|
65
70
|
language={language || "unknown"}
|
|
66
71
|
code={children}
|
|
67
|
-
node={node}
|
|
68
72
|
/>
|
|
69
73
|
);
|
|
70
74
|
};
|
|
@@ -87,13 +91,13 @@ export type CodeOverrideProps = ComponentPropsWithoutRef<CodeComponent> & {
|
|
|
87
91
|
| undefined;
|
|
88
92
|
};
|
|
89
93
|
|
|
90
|
-
|
|
94
|
+
const CodeOverrideImpl: FC<CodeOverrideProps> = ({
|
|
91
95
|
components,
|
|
92
96
|
componentsByLanguage,
|
|
93
97
|
...props
|
|
94
98
|
}) => {
|
|
95
|
-
const
|
|
96
|
-
if (!
|
|
99
|
+
const isCodeBlock = useIsMarkdownCodeBlock();
|
|
100
|
+
if (!isCodeBlock) return <components.Code {...props} />;
|
|
97
101
|
return (
|
|
98
102
|
<CodeBlockOverride
|
|
99
103
|
components={components}
|
|
@@ -102,3 +106,11 @@ export const CodeOverride: FC<CodeOverrideProps> = ({
|
|
|
102
106
|
/>
|
|
103
107
|
);
|
|
104
108
|
};
|
|
109
|
+
|
|
110
|
+
export const CodeOverride = memo(CodeOverrideImpl, (prev, next) => {
|
|
111
|
+
const isEqual =
|
|
112
|
+
prev.components === next.components &&
|
|
113
|
+
prev.componentsByLanguage === next.componentsByLanguage &&
|
|
114
|
+
memoCompareNodes(prev, next);
|
|
115
|
+
return isEqual;
|
|
116
|
+
});
|
|
@@ -1,5 +1,11 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {
|
|
2
|
+
createContext,
|
|
3
|
+
ComponentPropsWithoutRef,
|
|
4
|
+
useContext,
|
|
5
|
+
memo,
|
|
6
|
+
} from "react";
|
|
2
7
|
import { PreComponent } from "./types";
|
|
8
|
+
import { memoCompareNodes } from "../memoization";
|
|
3
9
|
|
|
4
10
|
export const PreContext = createContext<Omit<
|
|
5
11
|
ComponentPropsWithoutRef<PreComponent>,
|
|
@@ -10,6 +16,8 @@ export const useIsMarkdownCodeBlock = () => {
|
|
|
10
16
|
return useContext(PreContext) !== null;
|
|
11
17
|
};
|
|
12
18
|
|
|
13
|
-
|
|
19
|
+
const PreOverrideImpl: PreComponent = ({ children, ...rest }) => {
|
|
14
20
|
return <PreContext.Provider value={rest}>{children}</PreContext.Provider>;
|
|
15
21
|
};
|
|
22
|
+
|
|
23
|
+
export const PreOverride = memo(PreOverrideImpl, memoCompareNodes);
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import type { ComponentType, ReactNode } from "react";
|
|
2
|
-
import { Element } from "hast";
|
|
3
2
|
import { PreComponent, CodeComponent, CodeHeaderProps } from "./types";
|
|
4
3
|
|
|
5
4
|
export const DefaultPre: PreComponent = ({ node, ...rest }) => (
|
|
@@ -13,10 +12,9 @@ export const DefaultCode: CodeComponent = ({ node, ...rest }) => (
|
|
|
13
12
|
export const DefaultCodeBlockContent: ComponentType<{
|
|
14
13
|
components: { Pre: PreComponent; Code: CodeComponent };
|
|
15
14
|
code: string | ReactNode | undefined;
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
<Code node={node}>{code}</Code>
|
|
15
|
+
}> = ({ components: { Pre, Code }, code }) => (
|
|
16
|
+
<Pre>
|
|
17
|
+
<Code>{code}</Code>
|
|
20
18
|
</Pre>
|
|
21
19
|
);
|
|
22
20
|
|