orbitchat 2.14.0 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (179) hide show
  1. package/dist/assets/ChartRenderer-B1mYF_kk.js +80 -0
  2. package/dist/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
  3. package/dist/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
  4. package/dist/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
  5. package/dist/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
  6. package/dist/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
  7. package/dist/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
  8. package/dist/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
  9. package/dist/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
  10. package/dist/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
  11. package/dist/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
  12. package/dist/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
  13. package/dist/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
  14. package/dist/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
  15. package/dist/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
  16. package/dist/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
  17. package/dist/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
  18. package/dist/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
  19. package/dist/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
  20. package/dist/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
  21. package/dist/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
  22. package/dist/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
  23. package/dist/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
  24. package/dist/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
  25. package/dist/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
  26. package/dist/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
  27. package/dist/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
  28. package/dist/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
  29. package/dist/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
  30. package/dist/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
  31. package/dist/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
  32. package/dist/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
  33. package/dist/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
  34. package/dist/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
  35. package/dist/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
  36. package/dist/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
  37. package/dist/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
  38. package/dist/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
  39. package/dist/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
  40. package/dist/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
  41. package/dist/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
  42. package/dist/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
  43. package/dist/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
  44. package/dist/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
  45. package/dist/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
  46. package/dist/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
  47. package/dist/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
  48. package/dist/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
  49. package/dist/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
  50. package/dist/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
  51. package/dist/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
  52. package/dist/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
  53. package/dist/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
  54. package/dist/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
  55. package/dist/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
  56. package/dist/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
  57. package/dist/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
  58. package/dist/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
  59. package/dist/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
  60. package/dist/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
  61. package/dist/assets/MermaidRenderer-Dhffx5mc.js +260 -0
  62. package/dist/assets/MusicRenderer-DbXJ8e4-.js +18 -0
  63. package/dist/assets/SVGRenderer-EhamRX_K.js +6 -0
  64. package/dist/assets/_basePickBy-C2AibBqo.js +1 -0
  65. package/dist/assets/_baseUniq-D52pUSvn.js +1 -0
  66. package/dist/assets/arc-BSnyvXPh.js +1 -0
  67. package/dist/assets/architectureDiagram-VXUJARFQ-BLMvVsZu.js +36 -0
  68. package/dist/assets/band-CquvqAHh.js +1 -0
  69. package/dist/assets/blockDiagram-VD42YOAC-CTz0dv5u.js +122 -0
  70. package/dist/assets/c4Diagram-YG6GDRKO-BjbN-GGh.js +10 -0
  71. package/dist/assets/channel-ryTtfXZE.js +1 -0
  72. package/dist/assets/chunk-4BX2VUAB-DEMWGIsU.js +1 -0
  73. package/dist/assets/chunk-55IACEB6-BYaauHLT.js +1 -0
  74. package/dist/assets/chunk-B4BG7PRW-D3_GFcfd.js +165 -0
  75. package/dist/assets/chunk-DI55MBZ5-Dy2EuzfA.js +220 -0
  76. package/dist/assets/{chunk-FMBD7UC4-dPK7Boav-Cz7OoDLR.js → chunk-FMBD7UC4-C9XHmwza.js} +2 -2
  77. package/dist/assets/chunk-QN33PNHL-BOCltIi9.js +1 -0
  78. package/dist/assets/chunk-QZHKN3VN-CvA964eQ.js +1 -0
  79. package/dist/assets/chunk-TZMSLE5B-B-3rZz90.js +1 -0
  80. package/dist/assets/classDiagram-2ON5EDUG-VbShFIzz.js +1 -0
  81. package/dist/assets/classDiagram-v2-WZHVMYZB-VbShFIzz.js +1 -0
  82. package/dist/assets/clone-BlhdKVDQ.js +1 -0
  83. package/dist/assets/cose-bilkent-S5V4N54A-CzPip3he.js +1 -0
  84. package/dist/assets/cytoscape.esm-CyJtwmzi.js +331 -0
  85. package/dist/assets/dagre-6UL2VRFP-CfCXYus3.js +4 -0
  86. package/dist/assets/defaultLocale-DX6XiGOO.js +1 -0
  87. package/dist/assets/diagram-PSM6KHXK-DyI2eDqp.js +24 -0
  88. package/dist/assets/diagram-QEK2KX5R-DuakIh40.js +43 -0
  89. package/dist/assets/diagram-S2PKOQOG-C3-4IORM.js +24 -0
  90. package/dist/assets/erDiagram-Q2GNP2WA-Dt-nZEaD.js +60 -0
  91. package/dist/assets/flowDiagram-NV44I4VS-B-2wjyTQ.js +162 -0
  92. package/dist/assets/ganttDiagram-JELNMOA3-CHTvjPq0.js +267 -0
  93. package/dist/assets/gitGraphDiagram-V2S2FVAM-d5GWmgY4.js +65 -0
  94. package/dist/assets/graph-COgkbiU8.js +1 -0
  95. package/dist/assets/index-DN2bBcCs.js +134 -0
  96. package/dist/assets/index-DtztdW2a.js +643 -0
  97. package/dist/assets/index-lGqyWNWb.css +1 -0
  98. package/dist/assets/infoDiagram-HS3SLOUP-30Hn0iLj.js +2 -0
  99. package/dist/assets/init-Dmth1JHB.js +1 -0
  100. package/dist/assets/journeyDiagram-XKPGCS4Q-CMOYXQ79.js +139 -0
  101. package/dist/assets/kanban-definition-3W4ZIXB7-dt3376cq.js +89 -0
  102. package/dist/assets/layout-DH97sy5g.js +1 -0
  103. package/dist/assets/linear-CKzVTQ0r.js +1 -0
  104. package/dist/assets/mindmap-definition-VGOIOE7T-BcZHPAlA.js +68 -0
  105. package/dist/assets/ordinal-DILIJJjt.js +1 -0
  106. package/dist/assets/pieDiagram-ADFJNKIX-DXjvgcgl.js +30 -0
  107. package/dist/assets/purify.es-A66Cw1IH.js +2 -0
  108. package/dist/assets/quadrantDiagram-AYHSOK5B-CICk2FdS.js +7 -0
  109. package/dist/assets/requirementDiagram-UZGBJVZJ-BdtxpQRA.js +64 -0
  110. package/dist/assets/sankeyDiagram-TZEHDZUN-BVNS9BQJ.js +10 -0
  111. package/dist/assets/sequenceDiagram-WL72ISMW-DF4fJTM7.js +145 -0
  112. package/dist/assets/stateDiagram-FKZM4ZOC-C8H8HujX.js +1 -0
  113. package/dist/assets/stateDiagram-v2-4FDKWEC3-DwtU033b.js +1 -0
  114. package/dist/assets/step-EjIQ8UIn.js +1 -0
  115. package/dist/assets/time-h5EapSZu.js +1 -0
  116. package/dist/assets/timeline-definition-IT6M3QCI-DUSG5Vfy.js +61 -0
  117. package/dist/assets/treemap-GDKQZRPO-1PI2PY4S.js +160 -0
  118. package/dist/assets/xychartDiagram-PRI3JC2R-CFPJj8WK.js +7 -0
  119. package/dist/favicon.svg +3 -1
  120. package/dist/index.html +2 -2
  121. package/markdown-renderer/LICENSE +201 -0
  122. package/markdown-renderer/src/CodeBlock.tsx +332 -0
  123. package/markdown-renderer/src/MarkdownComponents.tsx +233 -0
  124. package/markdown-renderer/src/MarkdownStyles.css +668 -0
  125. package/markdown-renderer/src/css.d.ts +4 -0
  126. package/markdown-renderer/src/index.ts +32 -0
  127. package/markdown-renderer/src/preprocessing.ts +519 -0
  128. package/markdown-renderer/src/renderers/ChartRenderer.tsx +1434 -0
  129. package/markdown-renderer/src/renderers/MermaidRenderer.tsx +474 -0
  130. package/markdown-renderer/src/renderers/MusicRenderer.tsx +394 -0
  131. package/markdown-renderer/src/renderers/SVGRenderer.tsx +307 -0
  132. package/markdown-renderer/src/types.ts +174 -0
  133. package/package.json +25 -3
  134. package/dist/assets/_baseUniq-BRKsqoH--68FUaYxk.js +0 -1
  135. package/dist/assets/arc-pab_su9s-BuY-VRZt.js +0 -1
  136. package/dist/assets/architectureDiagram-VXUJARFQ-DqQ8r_6g-C5b5VsO8.js +0 -36
  137. package/dist/assets/blockDiagram-VD42YOAC-B-dKfcH3-DVjqMJ-3.js +0 -122
  138. package/dist/assets/c4Diagram-YG6GDRKO-DMUPaBEl-o6ghjFV9.js +0 -10
  139. package/dist/assets/channel-HKsfPa5q-rOME8XF8.js +0 -1
  140. package/dist/assets/chunk-4BX2VUAB-CX67kh_B-Dl0Loq_e.js +0 -1
  141. package/dist/assets/chunk-55IACEB6-BocSyyvr-DYW83vZR.js +0 -1
  142. package/dist/assets/chunk-B4BG7PRW-CO8QAyfE-CsF1OX4R.js +0 -165
  143. package/dist/assets/chunk-DI55MBZ5-Dw1L6Eos-Dl1shJzL.js +0 -220
  144. package/dist/assets/chunk-QN33PNHL-vP2PqfVG-BuQNN8G2.js +0 -1
  145. package/dist/assets/chunk-QZHKN3VN-Bcidzu63-Bud1NKOb.js +0 -1
  146. package/dist/assets/chunk-TZMSLE5B-BtljMjlg-BKLxPJ-x.js +0 -1
  147. package/dist/assets/classDiagram-2ON5EDUG-C7cYN9hv-BHg-LSxQ.js +0 -1
  148. package/dist/assets/classDiagram-v2-WZHVMYZB-C7cYN9hv-BHg-LSxQ.js +0 -1
  149. package/dist/assets/clone-DoPb9X13-DejjKfXe.js +0 -1
  150. package/dist/assets/cose-bilkent-S5V4N54A-BGzO4EsH-rofdToAx.js +0 -1
  151. package/dist/assets/cytoscape.esm-CjI2IsL8-Da6dFVsf.js +0 -331
  152. package/dist/assets/dagre-6UL2VRFP-TzNvXCds-Ls1mVyc7.js +0 -4
  153. package/dist/assets/diagram-PSM6KHXK-BqY4RpUg-BJmYXUei.js +0 -24
  154. package/dist/assets/diagram-QEK2KX5R-CTjgBsne-dz-VLadE.js +0 -43
  155. package/dist/assets/diagram-S2PKOQOG-BqrhTIpA-ikxUE9Dj.js +0 -24
  156. package/dist/assets/erDiagram-Q2GNP2WA-B2hsi_Tl-B5gu6Jrx.js +0 -60
  157. package/dist/assets/flowDiagram-NV44I4VS-C03vtt_F-C9LVdVvn.js +0 -162
  158. package/dist/assets/ganttDiagram-JELNMOA3-B3hAg964-CYO6ZcQ8.js +0 -267
  159. package/dist/assets/gitGraphDiagram-NY62KEGX-ByhMH0yZ-BvO0WGzP.js +0 -65
  160. package/dist/assets/graph-BmNkcFEM-Bl2fiTgr.js +0 -1
  161. package/dist/assets/index-BXexqYFc-CFPIFV8r.js +0 -134
  162. package/dist/assets/index-KsGsuMGp.css +0 -1
  163. package/dist/assets/index-nqhgVFEP.js +0 -1010
  164. package/dist/assets/infoDiagram-WHAUD3N6-is6Ho4-T-D6tHdi3J.js +0 -2
  165. package/dist/assets/journeyDiagram-XKPGCS4Q-CRTOL26C-CL4DFaQP.js +0 -139
  166. package/dist/assets/kanban-definition-3W4ZIXB7-CNnO_t6O-DZBlsSao.js +0 -89
  167. package/dist/assets/layout-C0kZPebx-DiUdszUx.js +0 -1
  168. package/dist/assets/min-7Gb0pNxh-DsojA8pm.js +0 -1
  169. package/dist/assets/mindmap-definition-VGOIOE7T-CJZ2wTTa-Cd46k2jT.js +0 -68
  170. package/dist/assets/pieDiagram-ADFJNKIX-C9OSknjr-BGVcHmss.js +0 -30
  171. package/dist/assets/quadrantDiagram-AYHSOK5B-CW8yuAqv-CrCYjmJT.js +0 -7
  172. package/dist/assets/requirementDiagram-UZGBJVZJ-nGPhruO1-BzOGHXGi.js +0 -64
  173. package/dist/assets/sankeyDiagram-TZEHDZUN-CmL90u-m-BWp9STLO.js +0 -10
  174. package/dist/assets/sequenceDiagram-WL72ISMW-B02VRcnM-DB4Adljk.js +0 -145
  175. package/dist/assets/stateDiagram-FKZM4ZOC-DjoyLUdz-pDyQ50aU.js +0 -1
  176. package/dist/assets/stateDiagram-v2-4FDKWEC3-Bq76BTB7-C3j4gDpN.js +0 -1
  177. package/dist/assets/timeline-definition-IT6M3QCI-CTn0Gm3T-O1FhSixZ.js +0 -61
  178. package/dist/assets/treemap-KMMF4GRG-BjgLKKyi-DG8IQefJ.js +0 -128
  179. package/dist/assets/xychartDiagram-PRI3JC2R-Cgg6Uija-CPVch5-l.js +0 -7
@@ -0,0 +1,233 @@
1
+ import React from 'react';
2
+ import ReactMarkdown, { type Components } from 'react-markdown';
3
+ import remarkMath from 'remark-math';
4
+ import rehypeKatex from 'rehype-katex';
5
+ import remarkGfm from 'remark-gfm';
6
+ import type { PluggableList } from 'unified';
7
+ import 'katex/dist/katex.min.css';
8
+ // Load mhchem for chemistry support (ESM build so it patches the same KaTeX instance)
9
+ import 'katex/contrib/mhchem';
10
+
11
+ import { preprocessMarkdown, containsMathNotation } from './preprocessing';
12
+ import { CodeBlock } from './CodeBlock';
13
+ import { BLOCK_LEVEL_TAGS, type MarkdownRendererProps } from './types';
14
+
15
+ /**
16
+ * Custom link component for ReactMarkdown that opens links in new tabs
17
+ */
18
+ export const MarkdownLink: React.FC<React.AnchorHTMLAttributes<HTMLAnchorElement>> = ({
19
+ children,
20
+ href = '',
21
+ className = '',
22
+ ...props
23
+ }) => {
24
+ const childText = React.Children.toArray(children)
25
+ .map((child) => (typeof child === 'string' ? child : ''))
26
+ .join('')
27
+ .trim();
28
+
29
+ const isHttpLink = /^https?:\/\//i.test(href);
30
+ const isBareUrl = Boolean(isHttpLink && childText && normalizeUrlText(childText) === normalizeUrlText(href));
31
+
32
+ const parsed = isHttpLink ? parseUrl(href) : null;
33
+ const showCardStyle = Boolean(isBareUrl && parsed);
34
+ const classes = ['markdown-link', showCardStyle ? 'markdown-link--card' : 'markdown-link--inline', className]
35
+ .filter(Boolean)
36
+ .join(' ');
37
+
38
+ return (
39
+ <a
40
+ {...props}
41
+ href={href}
42
+ target="_blank"
43
+ rel="noopener noreferrer"
44
+ className={classes}
45
+ >
46
+ <span className="markdown-link__content">
47
+ {showCardStyle && parsed ? (
48
+ <>
49
+ <span className="markdown-link__hostname">{parsed.hostname}</span>
50
+ {parsed.path && parsed.path !== '/' && (
51
+ <span className="markdown-link__path">{parsed.path}</span>
52
+ )}
53
+ </>
54
+ ) : (
55
+ children
56
+ )}
57
+ </span>
58
+ {isHttpLink && (
59
+ <span className="markdown-link__icon" aria-hidden="true">
60
+ <svg
61
+ width="14"
62
+ height="14"
63
+ viewBox="0 0 24 24"
64
+ fill="none"
65
+ xmlns="http://www.w3.org/2000/svg"
66
+ >
67
+ <path
68
+ d="M8 16L16 8M16 8H9M16 8V15"
69
+ stroke="currentColor"
70
+ strokeWidth="1.6"
71
+ strokeLinecap="round"
72
+ strokeLinejoin="round"
73
+ />
74
+ </svg>
75
+ </span>
76
+ )}
77
+ </a>
78
+ );
79
+ };
80
+
81
+ function normalizeUrlText(value: string): string {
82
+ return value.trim().replace(/\/$/, '');
83
+ }
84
+
85
+ function parseUrl(raw: string) {
86
+ try {
87
+ const url = new URL(raw);
88
+ const hostname = url.hostname.replace(/^www\./i, '');
89
+ const path = `${url.pathname}${url.search}${url.hash}` || '/';
90
+ return { hostname, path };
91
+ } catch {
92
+ return null;
93
+ }
94
+ }
95
+
96
+ /**
97
+ * Enhanced Markdown renderer with robust currency and math handling
98
+ */
99
+ export const MarkdownRenderer: React.FC<MarkdownRendererProps> = ({
100
+ content,
101
+ className = '',
102
+ disableMath = false,
103
+ enableGraphs = true,
104
+ enableMermaid = true,
105
+ enableSVG = true,
106
+ enableCharts = true,
107
+ enableMusic = true,
108
+ enableSyntaxHighlighting = true,
109
+ syntaxTheme = 'dark',
110
+ }) => {
111
+ const processedContent = preprocessMarkdown(content);
112
+ if (!processedContent) return null;
113
+
114
+ const remarkPlugins: PluggableList = disableMath
115
+ ? [remarkGfm]
116
+ : [remarkGfm, [remarkMath, { singleDollarTextMath: true }]];
117
+
118
+ const rehypePlugins: PluggableList = [];
119
+ if (!disableMath) {
120
+ rehypePlugins.push([rehypeKatex, {
121
+ throwOnError: false,
122
+ errorColor: '#cc0000',
123
+ strict: false,
124
+ trust: true,
125
+ macros: {
126
+ "\\RR": "\\mathbb{R}",
127
+ "\\NN": "\\mathbb{N}",
128
+ "\\ZZ": "\\mathbb{Z}",
129
+ "\\QQ": "\\mathbb{Q}",
130
+ "\\CC": "\\mathbb{C}",
131
+ "\\dx": "\\,dx",
132
+ "\\dy": "\\,dy",
133
+ "\\dt": "\\,dt",
134
+ "\\dz": "\\,dz",
135
+ }
136
+ }]);
137
+ }
138
+
139
+ const components: Partial<Components> = {
140
+ a: MarkdownLink,
141
+ code: (props) => {
142
+ const { className, children, ...rest } = props;
143
+
144
+ // Properly detect inline code:
145
+ // In react-markdown v10, the most reliable way is:
146
+ // 1. If inline prop is explicitly set, use that
147
+ // 2. If there's a language- class, it's a block code (fenced code blocks have language)
148
+ // 3. If no language class, it's inline code (single backticks like `word`)
149
+ const hasLanguageClass = className && /language-/.test(className);
150
+ const isInlineCode =
151
+ ('inline' in props && typeof props.inline === 'boolean' && props.inline) ||
152
+ !hasLanguageClass;
153
+
154
+ // Block-level code: fenced code blocks have language class
155
+ const isBlockLevel = hasLanguageClass;
156
+
157
+ return (
158
+ <CodeBlock
159
+ inline={isInlineCode}
160
+ className={className}
161
+ enableGraphs={enableGraphs}
162
+ enableMermaid={enableMermaid}
163
+ enableSVG={enableSVG}
164
+ enableCharts={enableCharts}
165
+ enableMusic={enableMusic}
166
+ enableSyntaxHighlighting={enableSyntaxHighlighting}
167
+ syntaxTheme={syntaxTheme}
168
+ data-block-code={isBlockLevel ? 'true' : undefined}
169
+ {...rest}
170
+ >
171
+ {children}
172
+ </CodeBlock>
173
+ );
174
+ },
175
+ p: ({ node, ...props }) => {
176
+ const meaningfulChildren = React.Children.toArray(props.children).filter((child) => {
177
+ return !(typeof child === 'string' && child.trim() === '');
178
+ });
179
+
180
+ const reactHasBlock = meaningfulChildren.some((child) => {
181
+ if (!React.isValidElement(child)) return false;
182
+ const childProps = child.props as Record<string, unknown> | undefined;
183
+ if (childProps?.['data-block-code'] === 'true') return true;
184
+
185
+ if (typeof child.type === 'string') {
186
+ return BLOCK_LEVEL_TAGS.has(child.type);
187
+ }
188
+
189
+ return false;
190
+ });
191
+
192
+ const mdastHasBlock = node?.children?.some((child: { type: string; tagName?: string; properties?: { className?: string[] } }) => {
193
+ if (child.type === 'code') return true; // fenced code blocks
194
+
195
+ if (child.type === 'element') {
196
+ if (child.tagName && BLOCK_LEVEL_TAGS.has(child.tagName)) return true;
197
+
198
+ if (child.tagName === 'code') {
199
+ const className = child.properties?.className;
200
+ if (Array.isArray(className)) {
201
+ return className.some((name) => typeof name === 'string' && name.startsWith('language-'));
202
+ }
203
+ return true;
204
+ }
205
+ }
206
+
207
+ return false;
208
+ });
209
+
210
+ if (reactHasBlock || mdastHasBlock) {
211
+ return <>{props.children}</>;
212
+ }
213
+
214
+ return <p {...props} />;
215
+ },
216
+ };
217
+
218
+ return (
219
+ <div className={`markdown-content ${className}`}>
220
+ <ReactMarkdown
221
+ remarkPlugins={remarkPlugins}
222
+ rehypePlugins={rehypePlugins}
223
+ components={components}
224
+ >
225
+ {processedContent}
226
+ </ReactMarkdown>
227
+ </div>
228
+ );
229
+ };
230
+
231
+ // Re-export public APIs for backward compatibility
232
+ export { preprocessMarkdown, containsMathNotation };
233
+ export type { MarkdownRendererProps };