@lobehub/ui 4.3.2 → 4.3.3

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 (633) hide show
  1. package/es/Accordion/Accordion.mjs +2 -2
  2. package/es/Accordion/Accordion.mjs.map +1 -1
  3. package/es/Accordion/AccordionItem.mjs +11 -2
  4. package/es/Accordion/AccordionItem.mjs.map +1 -1
  5. package/es/Accordion/style.mjs +12 -9
  6. package/es/Accordion/style.mjs.map +1 -1
  7. package/es/ActionIcon/ActionIcon.d.mts +2 -2
  8. package/es/ActionIcon/ActionIcon.mjs +2 -57
  9. package/es/ActionIcon/ActionIcon.mjs.map +1 -1
  10. package/es/ActionIcon/style.mjs +76 -20
  11. package/es/ActionIcon/style.mjs.map +1 -1
  12. package/es/ActionIconGroup/ActionIconGroup.mjs +2 -30
  13. package/es/ActionIconGroup/ActionIconGroup.mjs.map +1 -1
  14. package/es/ActionIconGroup/style.mjs +39 -10
  15. package/es/ActionIconGroup/style.mjs.map +1 -1
  16. package/es/Alert/Alert.d.mts +2 -2
  17. package/es/Alert/Alert.mjs +17 -60
  18. package/es/Alert/Alert.mjs.map +1 -1
  19. package/es/Alert/style.mjs +318 -82
  20. package/es/Alert/style.mjs.map +1 -1
  21. package/es/AutoComplete/Select.d.mts +2 -2
  22. package/es/AutoComplete/Select.mjs +7 -21
  23. package/es/AutoComplete/Select.mjs.map +1 -1
  24. package/es/AutoComplete/style.mjs +32 -15
  25. package/es/AutoComplete/style.mjs.map +1 -1
  26. package/es/Avatar/Avatar.mjs +12 -24
  27. package/es/Avatar/Avatar.mjs.map +1 -1
  28. package/es/Avatar/AvatarGroup/index.d.mts +2 -2
  29. package/es/Avatar/AvatarGroup/index.mjs +3 -3
  30. package/es/Avatar/AvatarGroup/index.mjs.map +1 -1
  31. package/es/Avatar/AvatarGroup/style.mjs +9 -8
  32. package/es/Avatar/AvatarGroup/style.mjs.map +1 -1
  33. package/es/Avatar/style.mjs +30 -10
  34. package/es/Avatar/style.mjs.map +1 -1
  35. package/es/Block/Block.mjs +3 -48
  36. package/es/Block/Block.mjs.map +1 -1
  37. package/es/Block/style.mjs +58 -12
  38. package/es/Block/style.mjs.map +1 -1
  39. package/es/Burger/Burger.d.mts +2 -2
  40. package/es/Burger/Burger.mjs +21 -8
  41. package/es/Burger/Burger.mjs.map +1 -1
  42. package/es/Burger/style.mjs +115 -96
  43. package/es/Burger/style.mjs.map +1 -1
  44. package/es/Button/Button.mjs +6 -21
  45. package/es/Button/Button.mjs.map +1 -1
  46. package/es/Button/style.mjs +25 -7
  47. package/es/Button/style.mjs.map +1 -1
  48. package/es/Checkbox/Checkbox.mjs +2 -2
  49. package/es/Checkbox/Checkbox.mjs.map +1 -1
  50. package/es/Checkbox/style.mjs +12 -13
  51. package/es/Checkbox/style.mjs.map +1 -1
  52. package/es/CodeEditor/CodeEditor.d.mts +2 -2
  53. package/es/CodeEditor/CodeEditor.mjs +5 -13
  54. package/es/CodeEditor/CodeEditor.mjs.map +1 -1
  55. package/es/CodeEditor/style.mjs +21 -12
  56. package/es/CodeEditor/style.mjs.map +1 -1
  57. package/es/Collapse/Collapse.d.mts +2 -2
  58. package/es/Collapse/Collapse.mjs +4 -29
  59. package/es/Collapse/Collapse.mjs.map +1 -1
  60. package/es/Collapse/style.mjs +78 -18
  61. package/es/Collapse/style.mjs.map +1 -1
  62. package/es/ColorSwatches/ColorSwatches.mjs +20 -14
  63. package/es/ColorSwatches/ColorSwatches.mjs.map +1 -1
  64. package/es/ColorSwatches/style.mjs +35 -34
  65. package/es/ColorSwatches/style.mjs.map +1 -1
  66. package/es/ConfigProvider/index.d.mts +2 -2
  67. package/es/CopyButton/CopyButton.d.mts +2 -2
  68. package/es/DatePicker/DatePicker.d.mts +2 -2
  69. package/es/DatePicker/DatePicker.mjs +7 -21
  70. package/es/DatePicker/DatePicker.mjs.map +1 -1
  71. package/es/DatePicker/style.mjs +24 -7
  72. package/es/DatePicker/style.mjs.map +1 -1
  73. package/es/DraggablePanel/DraggablePanel.mjs +19 -62
  74. package/es/DraggablePanel/DraggablePanel.mjs.map +1 -1
  75. package/es/DraggablePanel/components/DraggablePanelBody.d.mts +2 -2
  76. package/es/DraggablePanel/components/DraggablePanelBody.mjs +2 -2
  77. package/es/DraggablePanel/components/DraggablePanelBody.mjs.map +1 -1
  78. package/es/DraggablePanel/components/DraggablePanelContainer.d.mts +2 -2
  79. package/es/DraggablePanel/components/DraggablePanelContainer.mjs +2 -2
  80. package/es/DraggablePanel/components/DraggablePanelContainer.mjs.map +1 -1
  81. package/es/DraggablePanel/components/DraggablePanelFooter.d.mts +2 -2
  82. package/es/DraggablePanel/components/DraggablePanelFooter.mjs +2 -2
  83. package/es/DraggablePanel/components/DraggablePanelFooter.mjs.map +1 -1
  84. package/es/DraggablePanel/components/DraggablePanelHeader.d.mts +2 -2
  85. package/es/DraggablePanel/components/DraggablePanelHeader.mjs +2 -2
  86. package/es/DraggablePanel/components/DraggablePanelHeader.mjs.map +1 -1
  87. package/es/DraggablePanel/components/style.mjs +6 -6
  88. package/es/DraggablePanel/components/style.mjs.map +1 -1
  89. package/es/DraggablePanel/style.mjs +336 -194
  90. package/es/DraggablePanel/style.mjs.map +1 -1
  91. package/es/DraggableSideNav/DraggableSideNav.d.mts +2 -2
  92. package/es/DraggableSideNav/DraggableSideNav.mjs +11 -8
  93. package/es/DraggableSideNav/DraggableSideNav.mjs.map +1 -1
  94. package/es/DraggableSideNav/style.mjs +192 -181
  95. package/es/DraggableSideNav/style.mjs.map +1 -1
  96. package/es/Drawer/Drawer.d.mts +2 -2
  97. package/es/Drawer/Drawer.mjs +11 -13
  98. package/es/Drawer/Drawer.mjs.map +1 -1
  99. package/es/Dropdown/Dropdown.d.mts +2 -2
  100. package/es/EditableText/EditableText.d.mts +2 -2
  101. package/es/EditableText/EditableText.mjs +1 -1
  102. package/es/EmojiPicker/AvatarUploader.mjs +3 -4
  103. package/es/EmojiPicker/AvatarUploader.mjs.map +1 -1
  104. package/es/EmojiPicker/EmojiPicker.d.mts +2 -2
  105. package/es/EmojiPicker/EmojiPicker.mjs +11 -4
  106. package/es/EmojiPicker/EmojiPicker.mjs.map +1 -1
  107. package/es/EmojiPicker/style.mjs +9 -9
  108. package/es/EmojiPicker/style.mjs.map +1 -1
  109. package/es/Empty/Empty.mjs +4 -4
  110. package/es/Empty/Empty.mjs.map +1 -1
  111. package/es/FileTypeIcon/FileTypeIcon.mjs +5 -6
  112. package/es/FileTypeIcon/FileTypeIcon.mjs.map +1 -1
  113. package/es/FileTypeIcon/components/FileIcon.mjs +5 -5
  114. package/es/FileTypeIcon/components/FileIcon.mjs.map +1 -1
  115. package/es/FileTypeIcon/components/FolderIcon.mjs +4 -4
  116. package/es/FileTypeIcon/components/FolderIcon.mjs.map +1 -1
  117. package/es/FileTypeIcon/style.mjs +3 -3
  118. package/es/FileTypeIcon/style.mjs.map +1 -1
  119. package/es/Flex/FlexBasic.d.mts +2 -2
  120. package/es/FluentEmoji/FluentEmoji.mjs +2 -2
  121. package/es/FluentEmoji/FluentEmoji.mjs.map +1 -1
  122. package/es/FluentEmoji/style.mjs +3 -3
  123. package/es/FluentEmoji/style.mjs.map +1 -1
  124. package/es/FontLoader/index.d.mts +2 -2
  125. package/es/Footer/Footer.d.mts +2 -2
  126. package/es/Footer/Footer.mjs +10 -8
  127. package/es/Footer/Footer.mjs.map +1 -1
  128. package/es/Footer/style.mjs +169 -133
  129. package/es/Footer/style.mjs.map +1 -1
  130. package/es/Form/Form.mjs +4 -14
  131. package/es/Form/Form.mjs.map +1 -1
  132. package/es/Form/components/FormDivider.mjs +3 -4
  133. package/es/Form/components/FormDivider.mjs.map +1 -1
  134. package/es/Form/components/FormFlatGroup.mjs +4 -14
  135. package/es/Form/components/FormFlatGroup.mjs.map +1 -1
  136. package/es/Form/components/FormGroup.d.mts +2 -2
  137. package/es/Form/components/FormGroup.mjs +5 -13
  138. package/es/Form/components/FormGroup.mjs.map +1 -1
  139. package/es/Form/components/FormItem.d.mts +2 -2
  140. package/es/Form/components/FormItem.mjs +12 -27
  141. package/es/Form/components/FormItem.mjs.map +1 -1
  142. package/es/Form/components/FormSubmitFooter.d.mts +2 -2
  143. package/es/Form/components/FormSubmitFooter.mjs +5 -4
  144. package/es/Form/components/FormSubmitFooter.mjs.map +1 -1
  145. package/es/Form/components/FormTitle.mjs +5 -5
  146. package/es/Form/components/FormTitle.mjs.map +1 -1
  147. package/es/Form/style.mjs +120 -72
  148. package/es/Form/style.mjs.map +1 -1
  149. package/es/FormModal/FormModal.d.mts +2 -2
  150. package/es/FormModal/FormModal.mjs +7 -8
  151. package/es/FormModal/FormModal.mjs.map +1 -1
  152. package/es/FormModal/style.mjs +7 -7
  153. package/es/FormModal/style.mjs.map +1 -1
  154. package/es/Grid/Grid.mjs +17 -4
  155. package/es/Grid/Grid.mjs.map +1 -1
  156. package/es/Grid/style.mjs +15 -16
  157. package/es/Grid/style.mjs.map +1 -1
  158. package/es/GroupAvatar/GroupAvatar.mjs +2 -14
  159. package/es/GroupAvatar/GroupAvatar.mjs.map +1 -1
  160. package/es/GroupAvatar/style.mjs +27 -16
  161. package/es/GroupAvatar/style.mjs.map +1 -1
  162. package/es/GuideCard/GuideCard.d.mts +2 -2
  163. package/es/GuideCard/GuideCard.mjs +5 -21
  164. package/es/GuideCard/GuideCard.mjs.map +1 -1
  165. package/es/GuideCard/style.mjs +57 -15
  166. package/es/GuideCard/style.mjs.map +1 -1
  167. package/es/Header/Header.d.mts +2 -2
  168. package/es/Header/Header.mjs +6 -7
  169. package/es/Header/Header.mjs.map +1 -1
  170. package/es/Header/style.mjs +8 -10
  171. package/es/Header/style.mjs.map +1 -1
  172. package/es/Highlighter/FullFeatured.mjs +2 -40
  173. package/es/Highlighter/FullFeatured.mjs.map +1 -1
  174. package/es/Highlighter/Highlighter.d.mts +2 -2
  175. package/es/Highlighter/Highlighter.mjs +2 -25
  176. package/es/Highlighter/Highlighter.mjs.map +1 -1
  177. package/es/Highlighter/SyntaxHighlighter/StaticRenderer.mjs +1 -1
  178. package/es/Highlighter/SyntaxHighlighter/StaticRenderer.mjs.map +1 -1
  179. package/es/Highlighter/SyntaxHighlighter/StreamRenderer.mjs +11 -31
  180. package/es/Highlighter/SyntaxHighlighter/StreamRenderer.mjs.map +1 -1
  181. package/es/Highlighter/SyntaxHighlighter/index.d.mts +2 -2
  182. package/es/Highlighter/SyntaxHighlighter/index.mjs +3 -31
  183. package/es/Highlighter/SyntaxHighlighter/index.mjs.map +1 -1
  184. package/es/Highlighter/SyntaxHighlighter/style.mjs +43 -16
  185. package/es/Highlighter/SyntaxHighlighter/style.mjs.map +1 -1
  186. package/es/Highlighter/style.mjs +64 -25
  187. package/es/Highlighter/style.mjs.map +1 -1
  188. package/es/Highlighter/theme/lobe-theme.mjs +370 -0
  189. package/es/Highlighter/theme/lobe-theme.mjs.map +1 -0
  190. package/es/Hotkey/Hotkey.d.mts +2 -2
  191. package/es/Hotkey/Hotkey.mjs +5 -20
  192. package/es/Hotkey/Hotkey.mjs.map +1 -1
  193. package/es/Hotkey/style.mjs +53 -17
  194. package/es/Hotkey/style.mjs.map +1 -1
  195. package/es/HotkeyInput/HotkeyInput.d.mts +2 -2
  196. package/es/HotkeyInput/HotkeyInput.mjs +5 -36
  197. package/es/HotkeyInput/HotkeyInput.mjs.map +1 -1
  198. package/es/HotkeyInput/style.mjs +46 -14
  199. package/es/HotkeyInput/style.mjs.map +1 -1
  200. package/es/Icon/Icon.d.mts +2 -2
  201. package/es/Icon/Icon.mjs +2 -10
  202. package/es/Icon/Icon.mjs.map +1 -1
  203. package/es/Icon/components/IconProvider.d.mts +3 -3
  204. package/es/Icon/style.mjs +15 -6
  205. package/es/Icon/style.mjs.map +1 -1
  206. package/es/Image/Image.mjs +8 -15
  207. package/es/Image/Image.mjs.map +1 -1
  208. package/es/Image/PreviewGroup.d.mts +2 -2
  209. package/es/Image/components/Toolbar.mjs +1 -2
  210. package/es/Image/components/Toolbar.mjs.map +1 -1
  211. package/es/Image/components/usePreview.mjs +2 -2
  212. package/es/Image/components/usePreview.mjs.map +1 -1
  213. package/es/Image/components/usePreviewGroup.mjs +4 -4
  214. package/es/Image/components/usePreviewGroup.mjs.map +1 -1
  215. package/es/Image/style.mjs +79 -54
  216. package/es/Image/style.mjs.map +1 -1
  217. package/es/ImageSelect/ImageSelect.mjs +2 -2
  218. package/es/ImageSelect/ImageSelect.mjs.map +1 -1
  219. package/es/ImageSelect/styles.mjs +11 -10
  220. package/es/ImageSelect/styles.mjs.map +1 -1
  221. package/es/Input/Input.d.mts +2 -2
  222. package/es/Input/Input.mjs +7 -21
  223. package/es/Input/Input.mjs.map +1 -1
  224. package/es/Input/InputNumber.d.mts +2 -2
  225. package/es/Input/InputNumber.mjs +7 -21
  226. package/es/Input/InputNumber.mjs.map +1 -1
  227. package/es/Input/InputOPT.d.mts +2 -2
  228. package/es/Input/InputOPT.mjs +7 -22
  229. package/es/Input/InputOPT.mjs.map +1 -1
  230. package/es/Input/InputPassword.d.mts +2 -2
  231. package/es/Input/InputPassword.mjs +6 -21
  232. package/es/Input/InputPassword.mjs.map +1 -1
  233. package/es/Input/TextArea.d.mts +2 -2
  234. package/es/Input/TextArea.mjs +6 -21
  235. package/es/Input/TextArea.mjs.map +1 -1
  236. package/es/Input/style.mjs +57 -25
  237. package/es/Input/style.mjs.map +1 -1
  238. package/es/Layout/Layout.mjs +36 -33
  239. package/es/Layout/Layout.mjs.map +1 -1
  240. package/es/Layout/components/LayoutFooter.d.mts +2 -2
  241. package/es/Layout/components/LayoutFooter.mjs +2 -2
  242. package/es/Layout/components/LayoutFooter.mjs.map +1 -1
  243. package/es/Layout/components/LayoutHeader.d.mts +2 -2
  244. package/es/Layout/components/LayoutHeader.mjs +2 -2
  245. package/es/Layout/components/LayoutHeader.mjs.map +1 -1
  246. package/es/Layout/components/LayoutMain.d.mts +2 -2
  247. package/es/Layout/components/LayoutMain.mjs +2 -2
  248. package/es/Layout/components/LayoutMain.mjs.map +1 -1
  249. package/es/Layout/components/LayoutSidebar.d.mts +2 -2
  250. package/es/Layout/components/LayoutSidebar.mjs +3 -3
  251. package/es/Layout/components/LayoutSidebar.mjs.map +1 -1
  252. package/es/Layout/components/LayoutSidebarInner.d.mts +2 -2
  253. package/es/Layout/components/LayoutSidebarInner.mjs +2 -2
  254. package/es/Layout/components/LayoutSidebarInner.mjs.map +1 -1
  255. package/es/Layout/components/LayoutToc.d.mts +2 -2
  256. package/es/Layout/components/LayoutToc.mjs +2 -2
  257. package/es/Layout/components/LayoutToc.mjs.map +1 -1
  258. package/es/Layout/style.mjs +6 -5
  259. package/es/Layout/style.mjs.map +1 -1
  260. package/es/List/ListItem/index.d.mts +2 -2
  261. package/es/List/ListItem/index.mjs +2 -2
  262. package/es/List/ListItem/index.mjs.map +1 -1
  263. package/es/List/ListItem/style.mjs +12 -11
  264. package/es/List/ListItem/style.mjs.map +1 -1
  265. package/es/Markdown/Markdown.d.mts +2 -2
  266. package/es/Markdown/Markdown.mjs +3 -25
  267. package/es/Markdown/Markdown.mjs.map +1 -1
  268. package/es/Markdown/SyntaxMarkdown/StreamdownRender.mjs +1 -2
  269. package/es/Markdown/SyntaxMarkdown/StreamdownRender.mjs.map +1 -1
  270. package/es/Markdown/SyntaxMarkdown/style.mjs +3 -3
  271. package/es/Markdown/SyntaxMarkdown/style.mjs.map +1 -1
  272. package/es/Markdown/Typography.d.mts +2 -2
  273. package/es/Markdown/Typography.mjs +2 -2
  274. package/es/Markdown/Typography.mjs.map +1 -1
  275. package/es/Markdown/components/CodeBlock.mjs +1 -0
  276. package/es/Markdown/components/CodeBlock.mjs.map +1 -1
  277. package/es/Markdown/components/SearchResultCards/SearchResultCard.mjs +1 -2
  278. package/es/Markdown/components/SearchResultCards/SearchResultCard.mjs.map +1 -1
  279. package/es/Markdown/components/SearchResultCards/index.d.mts +2 -2
  280. package/es/Markdown/components/SearchResultCards/style.mjs +3 -3
  281. package/es/Markdown/components/SearchResultCards/style.mjs.map +1 -1
  282. package/es/Markdown/markdown.style.mjs +23 -23
  283. package/es/Markdown/markdown.style.mjs.map +1 -1
  284. package/es/Markdown/style.mjs +48 -26
  285. package/es/Markdown/style.mjs.map +1 -1
  286. package/es/MaskShadow/MaskShadow.d.mts +2 -2
  287. package/es/MaskShadow/MaskShadow.mjs +8 -12
  288. package/es/MaskShadow/MaskShadow.mjs.map +1 -1
  289. package/es/MaskShadow/style.mjs +33 -8
  290. package/es/MaskShadow/style.mjs.map +1 -1
  291. package/es/Menu/Menu.d.mts +2 -2
  292. package/es/Menu/Menu.mjs +3 -25
  293. package/es/Menu/Menu.mjs.map +1 -1
  294. package/es/Menu/style.mjs +40 -15
  295. package/es/Menu/style.mjs.map +1 -1
  296. package/es/Mermaid/FullFeatured.mjs +2 -35
  297. package/es/Mermaid/FullFeatured.mjs.map +1 -1
  298. package/es/Mermaid/Mermaid.d.mts +2 -2
  299. package/es/Mermaid/Mermaid.mjs +5 -28
  300. package/es/Mermaid/Mermaid.mjs.map +1 -1
  301. package/es/Mermaid/SyntaxMermaid/StaticMermaid.mjs +82 -0
  302. package/es/Mermaid/SyntaxMermaid/StaticMermaid.mjs.map +1 -0
  303. package/es/Mermaid/SyntaxMermaid/StreamMermaid.mjs +94 -0
  304. package/es/Mermaid/SyntaxMermaid/StreamMermaid.mjs.map +1 -0
  305. package/es/Mermaid/SyntaxMermaid/index.d.mts +2 -2
  306. package/es/Mermaid/SyntaxMermaid/index.mjs +36 -58
  307. package/es/Mermaid/SyntaxMermaid/index.mjs.map +1 -1
  308. package/es/Mermaid/SyntaxMermaid/style.mjs +80 -0
  309. package/es/Mermaid/SyntaxMermaid/style.mjs.map +1 -0
  310. package/es/Mermaid/type.d.mts +3 -2
  311. package/es/Modal/Modal.d.mts +2 -2
  312. package/es/Modal/Modal.mjs +8 -9
  313. package/es/Modal/Modal.mjs.map +1 -1
  314. package/es/Modal/style.mjs +13 -11
  315. package/es/Modal/style.mjs.map +1 -1
  316. package/es/MotionProvider/index.d.mts +2 -2
  317. package/es/ScrollShadow/ScrollShadow.mjs +20 -43
  318. package/es/ScrollShadow/ScrollShadow.mjs.map +1 -1
  319. package/es/ScrollShadow/style.mjs +54 -12
  320. package/es/ScrollShadow/style.mjs.map +1 -1
  321. package/es/SearchBar/SearchBar.d.mts +2 -2
  322. package/es/SearchBar/SearchBar.mjs +2 -2
  323. package/es/SearchBar/SearchBar.mjs.map +1 -1
  324. package/es/SearchBar/style.mjs +7 -6
  325. package/es/SearchBar/style.mjs.map +1 -1
  326. package/es/Segmented/Segmented.d.mts +2 -2
  327. package/es/Segmented/Segmented.mjs +4 -26
  328. package/es/Segmented/Segmented.mjs.map +1 -1
  329. package/es/Segmented/style.mjs +33 -9
  330. package/es/Segmented/style.mjs.map +1 -1
  331. package/es/Select/Select.d.mts +2 -2
  332. package/es/Select/Select.mjs +7 -21
  333. package/es/Select/Select.mjs.map +1 -1
  334. package/es/Select/style.mjs +36 -19
  335. package/es/Select/style.mjs.map +1 -1
  336. package/es/SideNav/SideNav.d.mts +2 -2
  337. package/es/SideNav/SideNav.mjs +2 -2
  338. package/es/SideNav/SideNav.mjs.map +1 -1
  339. package/es/SideNav/style.mjs +5 -5
  340. package/es/SideNav/style.mjs.map +1 -1
  341. package/es/Skeleton/Skeleton.mjs +2 -2
  342. package/es/Skeleton/Skeleton.mjs.map +1 -1
  343. package/es/Skeleton/SkeletonAvatar.mjs +3 -3
  344. package/es/Skeleton/SkeletonAvatar.mjs.map +1 -1
  345. package/es/Skeleton/SkeletonBlock.mjs +2 -2
  346. package/es/Skeleton/SkeletonBlock.mjs.map +1 -1
  347. package/es/Skeleton/SkeletonButton.mjs +5 -6
  348. package/es/Skeleton/SkeletonButton.mjs.map +1 -1
  349. package/es/Skeleton/SkeletonTags.mjs +5 -5
  350. package/es/Skeleton/SkeletonTags.mjs.map +1 -1
  351. package/es/Skeleton/SkeletonTitle.mjs +2 -2
  352. package/es/Skeleton/SkeletonTitle.mjs.map +1 -1
  353. package/es/Skeleton/style.mjs +7 -8
  354. package/es/Skeleton/style.mjs.map +1 -1
  355. package/es/SliderWithInput/SliderWithInput.d.mts +2 -2
  356. package/es/Snippet/Snippet.mjs +2 -21
  357. package/es/Snippet/Snippet.mjs.map +1 -1
  358. package/es/Snippet/style.mjs +27 -9
  359. package/es/Snippet/style.mjs.map +1 -1
  360. package/es/SortableList/SortableList.mjs +1 -2
  361. package/es/SortableList/SortableList.mjs.map +1 -1
  362. package/es/SortableList/components/DragHandle.d.mts +2 -2
  363. package/es/SortableList/components/SortableItem.d.mts +2 -2
  364. package/es/SortableList/components/SortableItem.mjs +3 -22
  365. package/es/SortableList/components/SortableItem.mjs.map +1 -1
  366. package/es/SortableList/style.mjs +24 -7
  367. package/es/SortableList/style.mjs.map +1 -1
  368. package/es/Tabs/Tabs.mjs +3 -26
  369. package/es/Tabs/Tabs.mjs.map +1 -1
  370. package/es/Tabs/style.mjs +34 -10
  371. package/es/Tabs/style.mjs.map +1 -1
  372. package/es/Tag/Tag.mjs +3 -21
  373. package/es/Tag/Tag.mjs.map +1 -1
  374. package/es/Tag/styles.mjs +36 -10
  375. package/es/Tag/styles.mjs.map +1 -1
  376. package/es/Text/Text.mjs +2 -35
  377. package/es/Text/Text.mjs.map +1 -1
  378. package/es/Text/styles.mjs +49 -17
  379. package/es/Text/styles.mjs.map +1 -1
  380. package/es/ThemeProvider/ConfigProvider.mjs +11 -12
  381. package/es/ThemeProvider/ConfigProvider.mjs.map +1 -1
  382. package/es/ThemeProvider/ThemeProvider.d.mts +2 -2
  383. package/es/ThemeProvider/ThemeProvider.mjs +1 -1
  384. package/es/Toc/Toc.d.mts +2 -2
  385. package/es/Toc/Toc.mjs +8 -6
  386. package/es/Toc/Toc.mjs.map +1 -1
  387. package/es/Toc/TocMobile.mjs +1 -5
  388. package/es/Toc/TocMobile.mjs.map +1 -1
  389. package/es/Toc/style.mjs +52 -52
  390. package/es/Toc/style.mjs.map +1 -1
  391. package/es/Tooltip/TooltipFloating.mjs +2 -2
  392. package/es/Tooltip/TooltipFloating.mjs.map +1 -1
  393. package/es/Tooltip/TooltipPortal.mjs +3 -1
  394. package/es/Tooltip/TooltipPortal.mjs.map +1 -1
  395. package/es/Tooltip/style.mjs +7 -7
  396. package/es/Tooltip/style.mjs.map +1 -1
  397. package/es/Video/index.d.mts +2 -2
  398. package/es/Video/index.mjs +13 -13
  399. package/es/Video/index.mjs.map +1 -1
  400. package/es/Video/style.mjs +49 -42
  401. package/es/Video/style.mjs.map +1 -1
  402. package/es/awesome/AuroraBackground/AuroraBackground.d.mts +2 -2
  403. package/es/awesome/AuroraBackground/AuroraBackground.mjs +4 -3
  404. package/es/awesome/AuroraBackground/AuroraBackground.mjs.map +1 -1
  405. package/es/awesome/AuroraBackground/style.mjs +129 -90
  406. package/es/awesome/AuroraBackground/style.mjs.map +1 -1
  407. package/es/awesome/BottomGradientButton/BottomGradientButton.d.mts +2 -2
  408. package/es/awesome/BottomGradientButton/BottomGradientButton.mjs +2 -2
  409. package/es/awesome/BottomGradientButton/BottomGradientButton.mjs.map +1 -1
  410. package/es/awesome/BottomGradientButton/style.mjs +6 -5
  411. package/es/awesome/BottomGradientButton/style.mjs.map +1 -1
  412. package/es/awesome/Features/FeatureItem.mjs +10 -7
  413. package/es/awesome/Features/FeatureItem.mjs.map +1 -1
  414. package/es/awesome/Features/Features.d.mts +2 -2
  415. package/es/awesome/Features/style.mjs +141 -90
  416. package/es/awesome/Features/style.mjs.map +1 -1
  417. package/es/awesome/Giscus/Giscus.d.mts +2 -2
  418. package/es/awesome/GradientButton/GradientButton.d.mts +2 -2
  419. package/es/awesome/GradientButton/GradientButton.mjs +26 -5
  420. package/es/awesome/GradientButton/GradientButton.mjs.map +1 -1
  421. package/es/awesome/GradientButton/style.mjs +93 -63
  422. package/es/awesome/GradientButton/style.mjs.map +1 -1
  423. package/es/awesome/GridBackground/GridBackground.d.mts +2 -2
  424. package/es/awesome/GridBackground/GridBackground.mjs +30 -9
  425. package/es/awesome/GridBackground/GridBackground.mjs.map +1 -1
  426. package/es/awesome/GridBackground/GridShowcase.d.mts +2 -2
  427. package/es/awesome/GridBackground/style.mjs +70 -62
  428. package/es/awesome/GridBackground/style.mjs.map +1 -1
  429. package/es/awesome/Hero/Hero.d.mts +2 -2
  430. package/es/awesome/Hero/Hero.mjs +1 -2
  431. package/es/awesome/Hero/Hero.mjs.map +1 -1
  432. package/es/awesome/Hero/style.mjs +11 -10
  433. package/es/awesome/Hero/style.mjs.map +1 -1
  434. package/es/awesome/Spline/ParentSize.mjs +1 -1
  435. package/es/awesome/Spline/Spine.d.mts +2 -2
  436. package/es/awesome/Spotlight/Spotlight.d.mts +2 -2
  437. package/es/awesome/Spotlight/Spotlight.mjs +15 -7
  438. package/es/awesome/Spotlight/Spotlight.mjs.map +1 -1
  439. package/es/awesome/Spotlight/style.mjs +76 -23
  440. package/es/awesome/Spotlight/style.mjs.map +1 -1
  441. package/es/awesome/SpotlightCard/SpotlightCard.d.mts +2 -2
  442. package/es/awesome/SpotlightCard/SpotlightCard.mjs +11 -7
  443. package/es/awesome/SpotlightCard/SpotlightCard.mjs.map +1 -1
  444. package/es/awesome/SpotlightCard/SpotlightCardItem.mjs +10 -7
  445. package/es/awesome/SpotlightCard/SpotlightCardItem.mjs.map +1 -1
  446. package/es/awesome/SpotlightCard/style.mjs +121 -69
  447. package/es/awesome/SpotlightCard/style.mjs.map +1 -1
  448. package/es/awesome/TypewriterEffect/TypewriterEffect.d.mts +2 -2
  449. package/es/awesome/TypewriterEffect/TypewriterEffect.mjs +6 -5
  450. package/es/awesome/TypewriterEffect/TypewriterEffect.mjs.map +1 -1
  451. package/es/awesome/TypewriterEffect/style.mjs +8 -8
  452. package/es/awesome/TypewriterEffect/style.mjs.map +1 -1
  453. package/es/brand/BrandLoading/{style-Cz42xGgB.css → style-DX648z7a.css} +1 -1
  454. package/es/brand/BrandLoading/{style-Cz42xGgB.css.map → style-DX648z7a.css.map} +1 -1
  455. package/es/brand/LobeChat/index.d.mts +2 -2
  456. package/es/brand/LobeChat/index.mjs +5 -7
  457. package/es/brand/LobeChat/index.mjs.map +1 -1
  458. package/es/brand/LobeHub/index.d.mts +2 -2
  459. package/es/brand/LobeHub/index.mjs +5 -7
  460. package/es/brand/LobeHub/index.mjs.map +1 -1
  461. package/es/brand/LobeHub/style.mjs +3 -3
  462. package/es/brand/LobeHub/style.mjs.map +1 -1
  463. package/es/brand/LogoFlat/index.d.mts +3 -6
  464. package/es/brand/LogoFlat/index.mjs +2 -76
  465. package/es/brand/LogoFlat/index.mjs.map +1 -1
  466. package/es/brand/LogoMono/index.d.mts +2 -10
  467. package/es/brand/LogoMono/index.mjs +2 -84
  468. package/es/brand/LogoThree/LogoSpline.d.mts +2 -2
  469. package/es/brand/LogoThree/index.d.mts +2 -2
  470. package/es/brand/index.d.mts +3 -3
  471. package/es/brand/index.mjs +2 -2
  472. package/es/chat/BackBottom/BackBottom.d.mts +2 -2
  473. package/es/chat/BackBottom/BackBottom.mjs +3 -3
  474. package/es/chat/BackBottom/BackBottom.mjs.map +1 -1
  475. package/es/chat/BackBottom/style.mjs +27 -8
  476. package/es/chat/BackBottom/style.mjs.map +1 -1
  477. package/es/chat/ChatHeader/ChatHeader.mjs +2 -2
  478. package/es/chat/ChatHeader/ChatHeader.mjs.map +1 -1
  479. package/es/chat/ChatHeader/ChatHeaderTitle.mjs +8 -9
  480. package/es/chat/ChatHeader/ChatHeaderTitle.mjs.map +1 -1
  481. package/es/chat/ChatHeader/style.mjs +7 -7
  482. package/es/chat/ChatHeader/style.mjs.map +1 -1
  483. package/es/chat/ChatInputArea/ChatInputArea.mjs +1 -2
  484. package/es/chat/ChatInputArea/ChatInputArea.mjs.map +1 -1
  485. package/es/chat/ChatInputArea/components/ChatInputActionBar.mjs +4 -5
  486. package/es/chat/ChatInputArea/components/ChatInputActionBar.mjs.map +1 -1
  487. package/es/chat/ChatInputArea/components/ChatInputAreaInner.d.mts +2 -2
  488. package/es/chat/ChatInputArea/components/ChatSendButton.mjs +2 -3
  489. package/es/chat/ChatInputArea/components/ChatSendButton.mjs.map +1 -1
  490. package/es/chat/ChatInputArea/style.mjs +6 -5
  491. package/es/chat/ChatInputArea/style.mjs.map +1 -1
  492. package/es/chat/ChatItem/ChatItem.d.mts +2 -2
  493. package/es/chat/ChatItem/ChatItem.mjs +19 -16
  494. package/es/chat/ChatItem/ChatItem.mjs.map +1 -1
  495. package/es/chat/ChatItem/components/Actions.mjs +8 -8
  496. package/es/chat/ChatItem/components/Actions.mjs.map +1 -1
  497. package/es/chat/ChatItem/components/Avatar.mjs +7 -3
  498. package/es/chat/ChatItem/components/Avatar.mjs.map +1 -1
  499. package/es/chat/ChatItem/components/ErrorContent.mjs +2 -3
  500. package/es/chat/ChatItem/components/ErrorContent.mjs.map +1 -1
  501. package/es/chat/ChatItem/components/Loading.mjs +3 -4
  502. package/es/chat/ChatItem/components/Loading.mjs.map +1 -1
  503. package/es/chat/ChatItem/components/MessageContent.mjs +11 -10
  504. package/es/chat/ChatItem/components/MessageContent.mjs.map +1 -1
  505. package/es/chat/ChatItem/components/Title.mjs +3 -8
  506. package/es/chat/ChatItem/components/Title.mjs.map +1 -1
  507. package/es/chat/ChatItem/style.mjs +294 -142
  508. package/es/chat/ChatItem/style.mjs.map +1 -1
  509. package/es/chat/ChatList/ChatList.d.mts +2 -2
  510. package/es/chat/ChatList/ChatList.mjs +2 -2
  511. package/es/chat/ChatList/ChatList.mjs.map +1 -1
  512. package/es/chat/ChatList/style.mjs +3 -3
  513. package/es/chat/ChatList/style.mjs.map +1 -1
  514. package/es/chat/EditableMessage/EditableMessage.d.mts +2 -2
  515. package/es/chat/EditableMessage/EditableMessage.mjs +1 -1
  516. package/es/chat/EditableMessageList/EditableMessageList.d.mts +2 -2
  517. package/es/chat/LoadingDots/LoadingDots.mjs +17 -10
  518. package/es/chat/LoadingDots/LoadingDots.mjs.map +1 -1
  519. package/es/chat/LoadingDots/style.mjs +117 -116
  520. package/es/chat/LoadingDots/style.mjs.map +1 -1
  521. package/es/chat/LoadingDots/type.d.mts +6 -0
  522. package/es/chat/MessageInput/MessageInput.d.mts +2 -2
  523. package/es/chat/MessageInput/MessageInput.mjs +4 -5
  524. package/es/chat/MessageInput/MessageInput.mjs.map +1 -1
  525. package/es/chat/MessageInput/style.mjs +4 -4
  526. package/es/chat/MessageInput/style.mjs.map +1 -1
  527. package/es/chat/MessageModal/MessageModal.d.mts +2 -2
  528. package/es/chat/MessageModal/MessageModal.mjs +4 -5
  529. package/es/chat/MessageModal/MessageModal.mjs.map +1 -1
  530. package/es/chat/TokenTag/TokenTag.mjs +5 -6
  531. package/es/chat/TokenTag/TokenTag.mjs.map +1 -1
  532. package/es/color/ColorScales/ScaleRow.mjs +1 -2
  533. package/es/color/ColorScales/ScaleRow.mjs.map +1 -1
  534. package/es/color/ColorScales/index.d.mts +2 -2
  535. package/es/color/ColorScales/index.mjs +1 -2
  536. package/es/color/ColorScales/index.mjs.map +1 -1
  537. package/es/color/ColorScales/style.mjs +4 -4
  538. package/es/color/ColorScales/style.mjs.map +1 -1
  539. package/es/hooks/useHighlight.mjs +84 -227
  540. package/es/hooks/useHighlight.mjs.map +1 -1
  541. package/es/hooks/useMermaid.mjs +104 -57
  542. package/es/hooks/useMermaid.mjs.map +1 -1
  543. package/es/hooks/useStreamHighlight.mjs +221 -0
  544. package/es/hooks/useStreamHighlight.mjs.map +1 -0
  545. package/es/hooks/useStreamMermaid.mjs +87 -0
  546. package/es/hooks/useStreamMermaid.mjs.map +1 -0
  547. package/es/i18n/context.d.mts +2 -2
  548. package/es/icons/lucideExtra/BotPromptIcon.d.mts +2 -2
  549. package/es/icons/lucideExtra/CreateBotIcon.d.mts +2 -2
  550. package/es/icons/lucideExtra/DiscordIcon.d.mts +2 -2
  551. package/es/icons/lucideExtra/GlobeOffIcon.d.mts +3 -3
  552. package/es/icons/lucideExtra/GroupBotIcon.d.mts +3 -3
  553. package/es/icons/lucideExtra/GroupBotSquareIcon.d.mts +3 -3
  554. package/es/icons/lucideExtra/LeftClickIcon.d.mts +3 -3
  555. package/es/icons/lucideExtra/LeftDoubleClickIcon.d.mts +3 -3
  556. package/es/icons/lucideExtra/McpIcon.d.mts +3 -3
  557. package/es/icons/lucideExtra/ProviderIcon.d.mts +3 -3
  558. package/es/icons/lucideExtra/RightClickIcon.d.mts +3 -3
  559. package/es/icons/lucideExtra/RightDoubleClickIcon.d.mts +3 -3
  560. package/es/icons/lucideExtra/ShapesUploadIcon.d.mts +3 -3
  561. package/es/icons/lucideExtra/TreeDownRightIcon.d.mts +3 -3
  562. package/es/icons/lucideExtra/TreeUpDownRightIcon.d.mts +3 -3
  563. package/es/index.d.mts +2 -1
  564. package/es/index.mjs +9 -8
  565. package/es/mdx/Callout/index.mjs +8 -7
  566. package/es/mdx/Callout/index.mjs.map +1 -1
  567. package/es/mdx/Callout/style.mjs +3 -4
  568. package/es/mdx/Callout/style.mjs.map +1 -1
  569. package/es/mdx/Cards/Card.mjs +14 -16
  570. package/es/mdx/Cards/Card.mjs.map +1 -1
  571. package/es/mdx/Cards/index.mjs +2 -2
  572. package/es/mdx/Cards/index.mjs.map +1 -1
  573. package/es/mdx/Cards/style.mjs +3 -3
  574. package/es/mdx/Cards/style.mjs.map +1 -1
  575. package/es/mdx/FileTree/Folder.mjs +1 -16
  576. package/es/mdx/FileTree/Folder.mjs.map +1 -1
  577. package/es/mdx/FileTree/index.mjs +2 -2
  578. package/es/mdx/FileTree/index.mjs.map +1 -1
  579. package/es/mdx/FileTree/style.mjs +19 -7
  580. package/es/mdx/FileTree/style.mjs.map +1 -1
  581. package/es/mdx/Mdx/index.d.mts +2 -2
  582. package/es/mdx/Mdx/index.mjs +2 -2
  583. package/es/mdx/Mdx/index.mjs.map +1 -1
  584. package/es/mdx/Steps/index.mjs +2 -2
  585. package/es/mdx/Steps/index.mjs.map +1 -1
  586. package/es/mdx/Steps/style.mjs +8 -8
  587. package/es/mdx/Steps/style.mjs.map +1 -1
  588. package/es/mdx/Tabs/Tab.mjs +3 -12
  589. package/es/mdx/Tabs/Tab.mjs.map +1 -1
  590. package/es/mdx/Tabs/index.mjs +2 -2
  591. package/es/mdx/Tabs/index.mjs.map +1 -1
  592. package/es/mdx/Tabs/style.mjs +12 -14
  593. package/es/mdx/Tabs/style.mjs.map +1 -1
  594. package/es/mdx/mdxComponents/Citation/PopoverPanel.mjs +1 -22
  595. package/es/mdx/mdxComponents/Citation/PopoverPanel.mjs.map +1 -1
  596. package/es/mdx/mdxComponents/Citation/index.mjs +3 -17
  597. package/es/mdx/mdxComponents/Citation/index.mjs.map +1 -1
  598. package/es/mdx/mdxComponents/Citation/style.mjs +39 -0
  599. package/es/mdx/mdxComponents/Citation/style.mjs.map +1 -0
  600. package/es/mdx/mdxComponents/Pre.mjs +7 -9
  601. package/es/mdx/mdxComponents/Pre.mjs.map +1 -1
  602. package/es/mobile/ChatHeader/ChatHeader.mjs +2 -2
  603. package/es/mobile/ChatHeader/ChatHeader.mjs.map +1 -1
  604. package/es/mobile/ChatHeader/ChatHeaderTitle.d.mts +2 -2
  605. package/es/mobile/ChatHeader/ChatHeaderTitle.mjs +7 -8
  606. package/es/mobile/ChatHeader/ChatHeaderTitle.mjs.map +1 -1
  607. package/es/mobile/ChatHeader/style.mjs +6 -6
  608. package/es/mobile/ChatHeader/style.mjs.map +1 -1
  609. package/es/mobile/ChatInputArea/ChatInputArea.mjs +2 -2
  610. package/es/mobile/ChatInputArea/ChatInputArea.mjs.map +1 -1
  611. package/es/mobile/ChatInputArea/components/ChatSendButton.d.mts +2 -2
  612. package/es/mobile/ChatInputArea/style.mjs +5 -5
  613. package/es/mobile/ChatInputArea/style.mjs.map +1 -1
  614. package/es/mobile/SafeArea/SafeArea.mjs +2 -2
  615. package/es/mobile/SafeArea/SafeArea.mjs.map +1 -1
  616. package/es/mobile/SafeArea/style.mjs +3 -3
  617. package/es/mobile/SafeArea/style.mjs.map +1 -1
  618. package/es/mobile/TabBar/TabBar.mjs +2 -2
  619. package/es/mobile/TabBar/TabBar.mjs.map +1 -1
  620. package/es/mobile/TabBar/style.mjs +7 -7
  621. package/es/mobile/TabBar/style.mjs.map +1 -1
  622. package/es/storybook/StoryBook/index.d.mts +2 -2
  623. package/es/storybook/StoryBook/index.mjs +4 -5
  624. package/es/storybook/StoryBook/index.mjs.map +1 -1
  625. package/es/storybook/StoryBook/style.mjs +27 -24
  626. package/es/storybook/StoryBook/style.mjs.map +1 -1
  627. package/es/styles/index.d.mts +2 -1
  628. package/es/styles/index.mjs +2 -1
  629. package/es/styles/theme/customStylishStatic.d.mts +7 -0
  630. package/es/styles/theme/customStylishStatic.mjs +161 -0
  631. package/es/styles/theme/customStylishStatic.mjs.map +1 -0
  632. package/package.json +3 -2
  633. package/es/brand/LogoMono/index.mjs.map +0 -1
@@ -1,54 +1,84 @@
1
1
  'use client';
2
2
 
3
- import { useMemo, useState } from "react";
3
+ import { useEffect, useMemo, useState } from "react";
4
4
  import { useTheme } from "antd-style";
5
- import useSWR from "swr";
6
5
  import { Md5 } from "ts-md5";
7
6
 
8
7
  //#region src/hooks/useMermaid.ts
9
8
  const MD5_LENGTH_THRESHOLD = 1e4;
9
+ const mermaidCache = /* @__PURE__ */ new Map();
10
+ const MAX_CACHE_SIZE = 500;
11
+ const cleanupCache = () => {
12
+ if (mermaidCache.size > MAX_CACHE_SIZE) {
13
+ const entriesToRemove = Math.floor(MAX_CACHE_SIZE * .2);
14
+ const keysToRemove = Array.from(mermaidCache.keys()).slice(0, entriesToRemove);
15
+ for (const key of keysToRemove) mermaidCache.delete(key);
16
+ }
17
+ };
18
+ let mermaidPromise = null;
10
19
  const loadMermaid = () => {
11
20
  if (typeof window === "undefined") return Promise.resolve(null);
12
- return import("mermaid").then((mod) => mod.default);
21
+ if (!mermaidPromise) mermaidPromise = import("mermaid").then((mod) => mod.default);
22
+ return mermaidPromise;
13
23
  };
14
- const mermaidPromise = loadMermaid();
24
+ const createMermaidConfig = (theme, customTheme) => ({
25
+ fontFamily: theme.fontFamilyCode,
26
+ gantt: { useWidth: 1920 },
27
+ securityLevel: "loose",
28
+ startOnLoad: false,
29
+ theme: customTheme || (theme.isDarkMode ? "dark" : "neutral"),
30
+ themeVariables: customTheme ? void 0 : {
31
+ errorBkgColor: theme.colorTextDescription,
32
+ errorTextColor: theme.colorTextDescription,
33
+ fontFamily: theme.fontFamily,
34
+ lineColor: theme.colorTextSecondary,
35
+ mainBkg: theme.colorBgContainer,
36
+ noteBkgColor: theme.colorInfoBg,
37
+ noteTextColor: theme.colorInfoText,
38
+ pie1: theme.geekblue,
39
+ pie2: theme.colorWarning,
40
+ pie3: theme.colorSuccess,
41
+ pie4: theme.colorError,
42
+ primaryBorderColor: theme.colorBorder,
43
+ primaryColor: theme.colorBgContainer,
44
+ primaryTextColor: theme.colorText,
45
+ secondaryBorderColor: theme.colorInfoBorder,
46
+ secondaryColor: theme.colorInfoBg,
47
+ secondaryTextColor: theme.colorInfoText,
48
+ tertiaryBorderColor: theme.colorSuccessBorder,
49
+ tertiaryColor: theme.colorSuccessBg,
50
+ tertiaryTextColor: theme.colorSuccessText,
51
+ textColor: theme.colorText
52
+ }
53
+ });
15
54
  /**
16
- * 验证并处理 Mermaid 图表内容
55
+ * 验证并处理 Mermaid 图表内容 - 优化版本(移除 SWR)
17
56
  */
18
57
  const useMermaid = (content, { id, theme: customTheme }) => {
19
58
  const theme = useTheme();
20
- const [validContent, setValidContent] = useState("");
21
- const mermaidConfig = useMemo(() => ({
22
- fontFamily: theme.fontFamilyCode,
23
- gantt: { useWidth: 1920 },
24
- securityLevel: "loose",
25
- startOnLoad: false,
26
- theme: customTheme || (theme.isDarkMode ? "dark" : "neutral"),
27
- themeVariables: customTheme ? void 0 : {
28
- errorBkgColor: theme.colorTextDescription,
29
- errorTextColor: theme.colorTextDescription,
30
- fontFamily: theme.fontFamily,
31
- lineColor: theme.colorTextSecondary,
32
- mainBkg: theme.colorBgContainer,
33
- noteBkgColor: theme.colorInfoBg,
34
- noteTextColor: theme.colorInfoText,
35
- pie1: theme.geekblue,
36
- pie2: theme.colorWarning,
37
- pie3: theme.colorSuccess,
38
- pie4: theme.colorError,
39
- primaryBorderColor: theme.colorBorder,
40
- primaryColor: theme.colorBgContainer,
41
- primaryTextColor: theme.colorText,
42
- secondaryBorderColor: theme.colorInfoBorder,
43
- secondaryColor: theme.colorInfoBg,
44
- secondaryTextColor: theme.colorInfoText,
45
- tertiaryBorderColor: theme.colorSuccessBorder,
46
- tertiaryColor: theme.colorSuccessBg,
47
- tertiaryTextColor: theme.colorSuccessText,
48
- textColor: theme.colorText
49
- }
50
- }), [theme.isDarkMode, customTheme]);
51
- return useSWR(useMemo(() => {
59
+ const [data, setData] = useState("");
60
+ const mermaidConfig = useMemo(() => createMermaidConfig(theme, customTheme), [
61
+ theme.fontFamilyCode,
62
+ theme.isDarkMode,
63
+ theme.colorTextDescription,
64
+ theme.fontFamily,
65
+ theme.colorTextSecondary,
66
+ theme.colorBgContainer,
67
+ theme.colorInfoBg,
68
+ theme.colorInfoText,
69
+ theme.geekblue,
70
+ theme.colorWarning,
71
+ theme.colorSuccess,
72
+ theme.colorError,
73
+ theme.colorBorder,
74
+ theme.colorInfoBorder,
75
+ theme.colorSuccessBorder,
76
+ theme.colorSuccessBg,
77
+ theme.colorSuccessText,
78
+ theme.colorText,
79
+ customTheme
80
+ ]);
81
+ const cacheKey = useMemo(() => {
52
82
  const hash = content.length < MD5_LENGTH_THRESHOLD ? content : Md5.hashStr(content);
53
83
  return [
54
84
  id,
@@ -60,28 +90,45 @@ const useMermaid = (content, { id, theme: customTheme }) => {
60
90
  id,
61
91
  theme.isDarkMode,
62
92
  customTheme
63
- ]), async () => {
64
- try {
65
- const mermaidInstance = await mermaidPromise;
66
- if (!mermaidInstance) return content;
67
- if (await mermaidInstance.parse(content)) {
68
- mermaidInstance.initialize(mermaidConfig);
69
- const { svg } = await mermaidInstance.render(id, content);
70
- setValidContent(svg);
71
- return svg;
72
- } else throw new Error("Mermaid 语法无效");
73
- } catch (error) {
74
- if (!validContent) console.error("Mermaid 解析错误:", error);
75
- return validContent || "";
93
+ ]);
94
+ useEffect(() => {
95
+ const cachedPromise = mermaidCache.get(cacheKey);
96
+ if (cachedPromise) {
97
+ cachedPromise.then((svg) => {
98
+ setData(svg);
99
+ }).catch(() => {});
100
+ return;
76
101
  }
77
- }, {
78
- dedupingInterval: 3e3,
79
- errorRetryCount: 2,
80
- revalidateOnFocus: false,
81
- revalidateOnReconnect: false
82
- });
102
+ const renderPromise = (async () => {
103
+ try {
104
+ const mermaidInstance = await loadMermaid();
105
+ if (!mermaidInstance) return "";
106
+ if (await mermaidInstance.parse(content)) {
107
+ mermaidInstance.initialize(mermaidConfig);
108
+ const { svg } = await mermaidInstance.render(id, content);
109
+ return svg;
110
+ } else throw new Error("Mermaid 语法无效");
111
+ } catch (error_) {
112
+ console.error("Mermaid 解析错误:", error_);
113
+ return "";
114
+ }
115
+ })();
116
+ mermaidCache.set(cacheKey, renderPromise);
117
+ cleanupCache();
118
+ renderPromise.then((svg) => {
119
+ if (mermaidCache.get(cacheKey) === renderPromise) setData(svg);
120
+ }).catch(() => {
121
+ if (mermaidCache.get(cacheKey) === renderPromise) mermaidCache.delete(cacheKey);
122
+ });
123
+ }, [
124
+ cacheKey,
125
+ content,
126
+ id,
127
+ mermaidConfig
128
+ ]);
129
+ return data;
83
130
  };
84
131
 
85
132
  //#endregion
86
- export { useMermaid };
133
+ export { createMermaidConfig, loadMermaid, useMermaid };
87
134
  //# sourceMappingURL=useMermaid.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"useMermaid.mjs","names":["mermaidConfig: MermaidConfig"],"sources":["../../src/hooks/useMermaid.ts"],"sourcesContent":["'use client';\n\nimport { useTheme } from 'antd-style';\nimport type { MermaidConfig } from 'mermaid/dist/config.type';\nimport { useMemo, useState } from 'react';\nimport useSWR, { SWRResponse } from 'swr';\nimport { Md5 } from 'ts-md5';\n\n// 缓存已验证的图表内容\nconst MD5_LENGTH_THRESHOLD = 10_000;\n\n// 懒加载 mermaid 实例\nconst loadMermaid = () => {\n if (typeof window === 'undefined') return Promise.resolve(null);\n return import('mermaid').then((mod) => mod.default);\n};\nconst mermaidPromise = loadMermaid();\n\n/**\n * 验证并处理 Mermaid 图表内容\n */\nexport const useMermaid = (\n content: string,\n {\n id,\n theme: customTheme,\n }: {\n id: string;\n theme?: MermaidConfig['theme'];\n },\n): SWRResponse<string, Error> => {\n const theme = useTheme();\n // 用于存储最近一次有效的内容\n const [validContent, setValidContent] = useState<string>('');\n\n // 提取主题相关配置到 useMemo 中\n const mermaidConfig: MermaidConfig = useMemo(\n () => ({\n fontFamily: theme.fontFamilyCode,\n gantt: {\n useWidth: 1920,\n },\n securityLevel: 'loose',\n startOnLoad: false,\n theme: customTheme || (theme.isDarkMode ? 'dark' : 'neutral'),\n themeVariables: customTheme\n ? undefined\n : {\n errorBkgColor: theme.colorTextDescription,\n errorTextColor: theme.colorTextDescription,\n fontFamily: theme.fontFamily,\n lineColor: theme.colorTextSecondary,\n mainBkg: theme.colorBgContainer,\n noteBkgColor: theme.colorInfoBg,\n noteTextColor: theme.colorInfoText,\n pie1: theme.geekblue,\n pie2: theme.colorWarning,\n pie3: theme.colorSuccess,\n pie4: theme.colorError,\n primaryBorderColor: theme.colorBorder,\n primaryColor: theme.colorBgContainer,\n primaryTextColor: theme.colorText,\n secondaryBorderColor: theme.colorInfoBorder,\n secondaryColor: theme.colorInfoBg,\n secondaryTextColor: theme.colorInfoText,\n tertiaryBorderColor: theme.colorSuccessBorder,\n tertiaryColor: theme.colorSuccessBg,\n tertiaryTextColor: theme.colorSuccessText,\n textColor: theme.colorText,\n },\n }),\n [theme.isDarkMode, customTheme],\n );\n\n // 为长内容生成哈希键\n const cacheKey = useMemo((): string => {\n const hash = content.length < MD5_LENGTH_THRESHOLD ? content : Md5.hashStr(content);\n return [id, customTheme || (theme.isDarkMode ? 'd' : 'l'), hash].filter(Boolean).join('-');\n }, [content, id, theme.isDarkMode, customTheme]);\n\n return useSWR(\n cacheKey,\n async (): Promise<string> => {\n // 检查缓存中是否已验证过\n try {\n const mermaidInstance = await mermaidPromise;\n if (!mermaidInstance) return content;\n\n // 验证语法\n const isValid = await mermaidInstance.parse(content);\n\n if (isValid) {\n // 更新有效内容状态\n mermaidInstance.initialize(mermaidConfig);\n const { svg } = await mermaidInstance.render(id, content);\n setValidContent(svg);\n // 缓存验证结果\n return svg;\n } else {\n throw new Error('Mermaid 语法无效');\n }\n } catch (error) {\n if (!validContent) console.error('Mermaid 解析错误:', error);\n // 返回最近一次有效的内容,或空字符串\n return validContent || '';\n }\n },\n {\n dedupingInterval: 3000,\n errorRetryCount: 2,\n revalidateOnFocus: false,\n revalidateOnReconnect: false,\n },\n );\n};\n"],"mappings":";;;;;;;;AASA,MAAM,uBAAuB;AAG7B,MAAM,oBAAoB;AACxB,KAAI,OAAO,WAAW,YAAa,QAAO,QAAQ,QAAQ,KAAK;AAC/D,QAAO,OAAO,WAAW,MAAM,QAAQ,IAAI,QAAQ;;AAErD,MAAM,iBAAiB,aAAa;;;;AAKpC,MAAa,cACX,SACA,EACE,IACA,OAAO,kBAKsB;CAC/B,MAAM,QAAQ,UAAU;CAExB,MAAM,CAAC,cAAc,mBAAmB,SAAiB,GAAG;CAG5D,MAAMA,gBAA+B,eAC5B;EACL,YAAY,MAAM;EAClB,OAAO,EACL,UAAU,MACX;EACD,eAAe;EACf,aAAa;EACb,OAAO,gBAAgB,MAAM,aAAa,SAAS;EACnD,gBAAgB,cACZ,SACA;GACE,eAAe,MAAM;GACrB,gBAAgB,MAAM;GACtB,YAAY,MAAM;GAClB,WAAW,MAAM;GACjB,SAAS,MAAM;GACf,cAAc,MAAM;GACpB,eAAe,MAAM;GACrB,MAAM,MAAM;GACZ,MAAM,MAAM;GACZ,MAAM,MAAM;GACZ,MAAM,MAAM;GACZ,oBAAoB,MAAM;GAC1B,cAAc,MAAM;GACpB,kBAAkB,MAAM;GACxB,sBAAsB,MAAM;GAC5B,gBAAgB,MAAM;GACtB,oBAAoB,MAAM;GAC1B,qBAAqB,MAAM;GAC3B,eAAe,MAAM;GACrB,mBAAmB,MAAM;GACzB,WAAW,MAAM;GAClB;EACN,GACD,CAAC,MAAM,YAAY,YAAY,CAChC;AAQD,QAAO,OALU,cAAsB;EACrC,MAAM,OAAO,QAAQ,SAAS,uBAAuB,UAAU,IAAI,QAAQ,QAAQ;AACnF,SAAO;GAAC;GAAI,gBAAgB,MAAM,aAAa,MAAM;GAAM;GAAK,CAAC,OAAO,QAAQ,CAAC,KAAK,IAAI;IACzF;EAAC;EAAS;EAAI,MAAM;EAAY;EAAY,CAAC,EAI9C,YAA6B;AAE3B,MAAI;GACF,MAAM,kBAAkB,MAAM;AAC9B,OAAI,CAAC,gBAAiB,QAAO;AAK7B,OAFgB,MAAM,gBAAgB,MAAM,QAAQ,EAEvC;AAEX,oBAAgB,WAAW,cAAc;IACzC,MAAM,EAAE,QAAQ,MAAM,gBAAgB,OAAO,IAAI,QAAQ;AACzD,oBAAgB,IAAI;AAEpB,WAAO;SAEP,OAAM,IAAI,MAAM,eAAe;WAE1B,OAAO;AACd,OAAI,CAAC,aAAc,SAAQ,MAAM,iBAAiB,MAAM;AAExD,UAAO,gBAAgB;;IAG3B;EACE,kBAAkB;EAClB,iBAAiB;EACjB,mBAAmB;EACnB,uBAAuB;EACxB,CACF"}
1
+ {"version":3,"file":"useMermaid.mjs","names":["mermaidPromise: Promise<typeof import('mermaid').default | null> | null"],"sources":["../../src/hooks/useMermaid.ts"],"sourcesContent":["'use client';\n\nimport { useTheme } from 'antd-style';\nimport type { MermaidConfig } from 'mermaid/dist/config.type';\nimport { useEffect, useMemo, useState } from 'react';\nimport { Md5 } from 'ts-md5';\n\n// 缓存已验证的图表内容\nexport const MD5_LENGTH_THRESHOLD = 10_000;\n\n// Application-level cache for rendered Mermaid SVG\n// Key: cacheKey string, Value: Promise<string>\nconst mermaidCache = new Map<string, Promise<string>>();\n\n// Maximum cache size to prevent memory leaks\nconst MAX_CACHE_SIZE = 500;\n\n// Clean up old cache entries when limit is reached\nconst cleanupCache = () => {\n if (mermaidCache.size > MAX_CACHE_SIZE) {\n // Remove oldest 20% of entries\n const entriesToRemove = Math.floor(MAX_CACHE_SIZE * 0.2);\n const keysToRemove = Array.from(mermaidCache.keys()).slice(0, entriesToRemove);\n for (const key of keysToRemove) {\n mermaidCache.delete(key);\n }\n }\n};\n\n// 懒加载 mermaid 实例\nlet mermaidPromise: Promise<typeof import('mermaid').default | null> | null = null;\n\nexport const loadMermaid = (): Promise<typeof import('mermaid').default | null> => {\n if (typeof window === 'undefined') return Promise.resolve(null);\n\n if (!mermaidPromise) {\n mermaidPromise = import('mermaid').then((mod) => mod.default);\n }\n\n return mermaidPromise;\n};\n\n// Helper to create mermaid config\nexport const createMermaidConfig = (\n theme: ReturnType<typeof useTheme>,\n customTheme?: MermaidConfig['theme'],\n): MermaidConfig => ({\n fontFamily: theme.fontFamilyCode,\n gantt: {\n useWidth: 1920,\n },\n securityLevel: 'loose',\n startOnLoad: false,\n theme: customTheme || (theme.isDarkMode ? 'dark' : 'neutral'),\n themeVariables: customTheme\n ? undefined\n : {\n errorBkgColor: theme.colorTextDescription,\n errorTextColor: theme.colorTextDescription,\n fontFamily: theme.fontFamily,\n lineColor: theme.colorTextSecondary,\n mainBkg: theme.colorBgContainer,\n noteBkgColor: theme.colorInfoBg,\n noteTextColor: theme.colorInfoText,\n pie1: theme.geekblue,\n pie2: theme.colorWarning,\n pie3: theme.colorSuccess,\n pie4: theme.colorError,\n primaryBorderColor: theme.colorBorder,\n primaryColor: theme.colorBgContainer,\n primaryTextColor: theme.colorText,\n secondaryBorderColor: theme.colorInfoBorder,\n secondaryColor: theme.colorInfoBg,\n secondaryTextColor: theme.colorInfoText,\n tertiaryBorderColor: theme.colorSuccessBorder,\n tertiaryColor: theme.colorSuccessBg,\n tertiaryTextColor: theme.colorSuccessText,\n textColor: theme.colorText,\n },\n});\n\n/**\n * 验证并处理 Mermaid 图表内容 - 优化版本(移除 SWR)\n */\nexport const useMermaid = (\n content: string,\n {\n id,\n theme: customTheme,\n }: {\n id: string;\n theme?: MermaidConfig['theme'];\n },\n): string => {\n const theme = useTheme();\n const [data, setData] = useState<string>('');\n\n // 提取主题相关配置到 useMemo 中 - 只依赖实际使用的 theme 属性\n const mermaidConfig = useMemo(\n () => createMermaidConfig(theme, customTheme),\n [\n theme.fontFamilyCode,\n theme.isDarkMode,\n theme.colorTextDescription,\n theme.fontFamily,\n theme.colorTextSecondary,\n theme.colorBgContainer,\n theme.colorInfoBg,\n theme.colorInfoText,\n theme.geekblue,\n theme.colorWarning,\n theme.colorSuccess,\n theme.colorError,\n theme.colorBorder,\n theme.colorInfoBorder,\n theme.colorSuccessBorder,\n theme.colorSuccessBg,\n theme.colorSuccessText,\n theme.colorText,\n customTheme,\n ],\n );\n\n // 为长内容生成哈希键\n const cacheKey = useMemo((): string => {\n const hash = content.length < MD5_LENGTH_THRESHOLD ? content : Md5.hashStr(content);\n return [id, customTheme || (theme.isDarkMode ? 'd' : 'l'), hash].filter(Boolean).join('-');\n }, [content, id, theme.isDarkMode, customTheme]);\n\n useEffect(() => {\n // Check cache first\n const cachedPromise = mermaidCache.get(cacheKey);\n if (cachedPromise) {\n cachedPromise\n .then((svg) => {\n setData(svg);\n })\n .catch(() => {\n // Silently handle errors, fallback will be handled in the promise\n });\n return;\n }\n\n // Create new promise for rendering\n const renderPromise = (async (): Promise<string> => {\n try {\n const mermaidInstance = await loadMermaid();\n if (!mermaidInstance) return '';\n\n // 验证语法\n const isValid = await mermaidInstance.parse(content);\n\n if (isValid) {\n // 初始化并渲染\n mermaidInstance.initialize(mermaidConfig);\n const { svg } = await mermaidInstance.render(id, content);\n return svg;\n } else {\n throw new Error('Mermaid 语法无效');\n }\n } catch (error_) {\n console.error('Mermaid 解析错误:', error_);\n return '';\n }\n })();\n\n // Cache the promise\n mermaidCache.set(cacheKey, renderPromise);\n cleanupCache();\n\n // Handle promise result\n renderPromise\n .then((svg) => {\n // Only update if this is still the current cache key\n if (mermaidCache.get(cacheKey) === renderPromise) {\n setData(svg);\n }\n })\n .catch(() => {\n // Remove failed promise from cache\n if (mermaidCache.get(cacheKey) === renderPromise) {\n mermaidCache.delete(cacheKey);\n }\n });\n }, [cacheKey, content, id, mermaidConfig]);\n\n return data;\n};\n"],"mappings":";;;;;;;AAQA,MAAa,uBAAuB;AAIpC,MAAM,+BAAe,IAAI,KAA8B;AAGvD,MAAM,iBAAiB;AAGvB,MAAM,qBAAqB;AACzB,KAAI,aAAa,OAAO,gBAAgB;EAEtC,MAAM,kBAAkB,KAAK,MAAM,iBAAiB,GAAI;EACxD,MAAM,eAAe,MAAM,KAAK,aAAa,MAAM,CAAC,CAAC,MAAM,GAAG,gBAAgB;AAC9E,OAAK,MAAM,OAAO,aAChB,cAAa,OAAO,IAAI;;;AAM9B,IAAIA,iBAA0E;AAE9E,MAAa,oBAAsE;AACjF,KAAI,OAAO,WAAW,YAAa,QAAO,QAAQ,QAAQ,KAAK;AAE/D,KAAI,CAAC,eACH,kBAAiB,OAAO,WAAW,MAAM,QAAQ,IAAI,QAAQ;AAG/D,QAAO;;AAIT,MAAa,uBACX,OACA,iBACmB;CACnB,YAAY,MAAM;CAClB,OAAO,EACL,UAAU,MACX;CACD,eAAe;CACf,aAAa;CACb,OAAO,gBAAgB,MAAM,aAAa,SAAS;CACnD,gBAAgB,cACZ,SACA;EACE,eAAe,MAAM;EACrB,gBAAgB,MAAM;EACtB,YAAY,MAAM;EAClB,WAAW,MAAM;EACjB,SAAS,MAAM;EACf,cAAc,MAAM;EACpB,eAAe,MAAM;EACrB,MAAM,MAAM;EACZ,MAAM,MAAM;EACZ,MAAM,MAAM;EACZ,MAAM,MAAM;EACZ,oBAAoB,MAAM;EAC1B,cAAc,MAAM;EACpB,kBAAkB,MAAM;EACxB,sBAAsB,MAAM;EAC5B,gBAAgB,MAAM;EACtB,oBAAoB,MAAM;EAC1B,qBAAqB,MAAM;EAC3B,eAAe,MAAM;EACrB,mBAAmB,MAAM;EACzB,WAAW,MAAM;EAClB;CACN;;;;AAKD,MAAa,cACX,SACA,EACE,IACA,OAAO,kBAKE;CACX,MAAM,QAAQ,UAAU;CACxB,MAAM,CAAC,MAAM,WAAW,SAAiB,GAAG;CAG5C,MAAM,gBAAgB,cACd,oBAAoB,OAAO,YAAY,EAC7C;EACE,MAAM;EACN,MAAM;EACN,MAAM;EACN,MAAM;EACN,MAAM;EACN,MAAM;EACN,MAAM;EACN,MAAM;EACN,MAAM;EACN,MAAM;EACN,MAAM;EACN,MAAM;EACN,MAAM;EACN,MAAM;EACN,MAAM;EACN,MAAM;EACN,MAAM;EACN,MAAM;EACN;EACD,CACF;CAGD,MAAM,WAAW,cAAsB;EACrC,MAAM,OAAO,QAAQ,SAAS,uBAAuB,UAAU,IAAI,QAAQ,QAAQ;AACnF,SAAO;GAAC;GAAI,gBAAgB,MAAM,aAAa,MAAM;GAAM;GAAK,CAAC,OAAO,QAAQ,CAAC,KAAK,IAAI;IACzF;EAAC;EAAS;EAAI,MAAM;EAAY;EAAY,CAAC;AAEhD,iBAAgB;EAEd,MAAM,gBAAgB,aAAa,IAAI,SAAS;AAChD,MAAI,eAAe;AACjB,iBACG,MAAM,QAAQ;AACb,YAAQ,IAAI;KACZ,CACD,YAAY,GAEX;AACJ;;EAIF,MAAM,iBAAiB,YAA6B;AAClD,OAAI;IACF,MAAM,kBAAkB,MAAM,aAAa;AAC3C,QAAI,CAAC,gBAAiB,QAAO;AAK7B,QAFgB,MAAM,gBAAgB,MAAM,QAAQ,EAEvC;AAEX,qBAAgB,WAAW,cAAc;KACzC,MAAM,EAAE,QAAQ,MAAM,gBAAgB,OAAO,IAAI,QAAQ;AACzD,YAAO;UAEP,OAAM,IAAI,MAAM,eAAe;YAE1B,QAAQ;AACf,YAAQ,MAAM,iBAAiB,OAAO;AACtC,WAAO;;MAEP;AAGJ,eAAa,IAAI,UAAU,cAAc;AACzC,gBAAc;AAGd,gBACG,MAAM,QAAQ;AAEb,OAAI,aAAa,IAAI,SAAS,KAAK,cACjC,SAAQ,IAAI;IAEd,CACD,YAAY;AAEX,OAAI,aAAa,IAAI,SAAS,KAAK,cACjC,cAAa,OAAO,SAAS;IAE/B;IACH;EAAC;EAAU;EAAS;EAAI;EAAc,CAAC;AAE1C,QAAO"}
@@ -0,0 +1,221 @@
1
+ 'use client';
2
+
3
+ import { getCodeLanguageByInput } from "../Highlighter/const.mjs";
4
+ import lobe_theme_default from "../Highlighter/theme/lobe-theme.mjs";
5
+ import { shikiModulePromise } from "./useHighlight.mjs";
6
+ import { useCallback, useEffect, useMemo, useRef, useState } from "react";
7
+ import { ShikiStreamTokenizer } from "shiki-stream";
8
+
9
+ //#region src/hooks/useStreamHighlight.ts
10
+ const tokensToLineTokens = (tokens) => {
11
+ if (!tokens.length) return [[]];
12
+ const lines = [];
13
+ let currentLine = [];
14
+ for (const token of tokens) {
15
+ const content = token.content ?? "";
16
+ if (content === "\n") {
17
+ lines.push(currentLine);
18
+ currentLine = [];
19
+ continue;
20
+ }
21
+ if (content.indexOf("\n") === -1) currentLine.push(token);
22
+ else {
23
+ const segments = content.split("\n");
24
+ for (const [j, segment] of segments.entries()) {
25
+ if (segment) currentLine.push(j === 0 && segment === content ? token : {
26
+ ...token,
27
+ content: segment
28
+ });
29
+ if (j < segments.length - 1) {
30
+ lines.push(currentLine);
31
+ currentLine = [];
32
+ }
33
+ }
34
+ }
35
+ }
36
+ if (currentLine.length > 0 || lines.length === 0) lines.push(currentLine);
37
+ return lines.length > 0 ? lines : [[]];
38
+ };
39
+ const createPreStyle = (bg, fg) => {
40
+ if (!bg && !fg) return void 0;
41
+ return {
42
+ backgroundColor: bg,
43
+ color: fg
44
+ };
45
+ };
46
+ const useStreamingHighlighter = (text, options) => {
47
+ const { customThemes, enabled, language, theme } = options;
48
+ const [result, setResult] = useState();
49
+ const tokenizerRef = useRef(null);
50
+ const previousTextRef = useRef("");
51
+ const safeText = text ?? "";
52
+ const latestTextRef = useRef(safeText);
53
+ const preStyleRef = useRef(void 0);
54
+ const linesRef = useRef([[]]);
55
+ useEffect(() => {
56
+ latestTextRef.current = safeText;
57
+ }, [safeText]);
58
+ const setStreamingResultRef = useRef((rawLines) => {
59
+ const previousLines = linesRef.current;
60
+ const newLinesLength = rawLines.length;
61
+ if (newLinesLength !== previousLines.length || newLinesLength === 0) {
62
+ linesRef.current = rawLines;
63
+ setResult({
64
+ lines: rawLines,
65
+ preStyle: preStyleRef.current
66
+ });
67
+ return;
68
+ }
69
+ let hasChanges = false;
70
+ const mergedLines = [];
71
+ for (let i = 0; i < newLinesLength; i++) {
72
+ const newLine = rawLines[i];
73
+ const prevLine = previousLines[i];
74
+ if (prevLine === newLine) {
75
+ mergedLines[i] = prevLine;
76
+ continue;
77
+ }
78
+ if (!prevLine || prevLine.length !== newLine.length) {
79
+ mergedLines[i] = newLine;
80
+ hasChanges = true;
81
+ continue;
82
+ }
83
+ let lineChanged = false;
84
+ for (const [j, newToken] of newLine.entries()) if (prevLine[j] !== newToken) {
85
+ lineChanged = true;
86
+ break;
87
+ }
88
+ if (lineChanged) {
89
+ mergedLines[i] = newLine;
90
+ hasChanges = true;
91
+ } else mergedLines[i] = prevLine;
92
+ }
93
+ if (hasChanges) {
94
+ linesRef.current = mergedLines;
95
+ setResult({
96
+ lines: mergedLines,
97
+ preStyle: preStyleRef.current
98
+ });
99
+ }
100
+ });
101
+ const updateTokens = useCallback(async (nextText, forceReset = false) => {
102
+ const tokenizer = tokenizerRef.current;
103
+ if (!tokenizer) return;
104
+ if (forceReset) {
105
+ tokenizer.clear();
106
+ previousTextRef.current = "";
107
+ }
108
+ const previousText = previousTextRef.current;
109
+ let chunk = nextText;
110
+ if (!forceReset && nextText.startsWith(previousText)) chunk = nextText.slice(previousText.length);
111
+ else if (!forceReset) tokenizer.clear();
112
+ previousTextRef.current = nextText;
113
+ if (!chunk) {
114
+ const stableTokens = tokenizer.tokensStable;
115
+ const unstableTokens = tokenizer.tokensUnstable;
116
+ if (stableTokens.length + unstableTokens.length === 0) {
117
+ setStreamingResultRef.current([[]]);
118
+ return;
119
+ }
120
+ const mergedTokens = stableTokens.length === 0 ? unstableTokens : unstableTokens.length === 0 ? stableTokens : [...stableTokens, ...unstableTokens];
121
+ setStreamingResultRef.current(tokensToLineTokens(mergedTokens));
122
+ return;
123
+ }
124
+ try {
125
+ await tokenizer.enqueue(chunk);
126
+ const stableTokens = tokenizer.tokensStable;
127
+ const unstableTokens = tokenizer.tokensUnstable;
128
+ const mergedTokens = stableTokens.length === 0 ? unstableTokens : unstableTokens.length === 0 ? stableTokens : [...stableTokens, ...unstableTokens];
129
+ setStreamingResultRef.current(tokensToLineTokens(mergedTokens));
130
+ } catch (error) {
131
+ console.error("Streaming highlighting failed:", error);
132
+ }
133
+ }, []);
134
+ const highlighterKeyRef = useRef("");
135
+ useEffect(() => {
136
+ if (!enabled) {
137
+ tokenizerRef.current?.clear();
138
+ tokenizerRef.current = null;
139
+ previousTextRef.current = "";
140
+ preStyleRef.current = void 0;
141
+ linesRef.current = [[]];
142
+ setResult(void 0);
143
+ highlighterKeyRef.current = "";
144
+ return;
145
+ }
146
+ const currentKey = `${language}-${theme}`;
147
+ if (highlighterKeyRef.current === currentKey && tokenizerRef.current) return;
148
+ let cancelled = false;
149
+ (async () => {
150
+ const mod = await shikiModulePromise;
151
+ if (!mod || cancelled) return;
152
+ try {
153
+ let themesToLoad = [theme];
154
+ if (customThemes && theme === "lobe-theme") {
155
+ const customTheme = customThemes[theme];
156
+ if (customTheme) themesToLoad = [customTheme];
157
+ }
158
+ const highlighter = await mod.getSingletonHighlighter({
159
+ langs: language ? [language] : ["plaintext"],
160
+ themes: themesToLoad
161
+ });
162
+ if (!highlighter || cancelled) return;
163
+ if (highlighterKeyRef.current !== currentKey) {
164
+ tokenizerRef.current?.clear();
165
+ tokenizerRef.current = new ShikiStreamTokenizer({
166
+ highlighter,
167
+ lang: language,
168
+ theme
169
+ });
170
+ highlighterKeyRef.current = currentKey;
171
+ previousTextRef.current = "";
172
+ linesRef.current = [[]];
173
+ const themeInfo = highlighter.getTheme(theme);
174
+ preStyleRef.current = createPreStyle(themeInfo?.bg, themeInfo?.fg);
175
+ }
176
+ const currentText = latestTextRef.current;
177
+ if (currentText) await updateTokens(currentText, true);
178
+ else setStreamingResultRef.current([[]]);
179
+ } catch (error) {
180
+ console.error("Streaming highlighter initialization failed:", error);
181
+ highlighterKeyRef.current = "";
182
+ }
183
+ })();
184
+ return () => {
185
+ cancelled = true;
186
+ };
187
+ }, [
188
+ enabled,
189
+ language,
190
+ theme,
191
+ updateTokens,
192
+ customThemes
193
+ ]);
194
+ useEffect(() => {
195
+ if (!enabled) return;
196
+ if (!tokenizerRef.current) return;
197
+ const currentText = latestTextRef.current;
198
+ updateTokens(currentText);
199
+ }, [
200
+ enabled,
201
+ safeText,
202
+ updateTokens
203
+ ]);
204
+ return result;
205
+ };
206
+ const useStreamHighlight = (text, { language, theme: builtinTheme, streaming }) => {
207
+ const safeText = text ?? "";
208
+ const lang = (language ?? "plaintext").toLowerCase();
209
+ const matchedLanguage = useMemo(() => getCodeLanguageByInput(lang), [lang]);
210
+ const effectiveTheme = builtinTheme || "lobe-theme";
211
+ return useStreamingHighlighter(safeText, {
212
+ customThemes: { "lobe-theme": lobe_theme_default },
213
+ enabled: streaming,
214
+ language: matchedLanguage,
215
+ theme: effectiveTheme
216
+ });
217
+ };
218
+
219
+ //#endregion
220
+ export { useStreamHighlight };
221
+ //# sourceMappingURL=useStreamHighlight.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useStreamHighlight.mjs","names":["lines: ThemedToken[][]","currentLine: ThemedToken[]","mergedLines: ThemedToken[][]","themesToLoad: any[]","lobeTheme"],"sources":["../../src/hooks/useStreamHighlight.ts"],"sourcesContent":["'use client';\n\nimport { CSSProperties, useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport type { BuiltinTheme, ThemedToken } from 'shiki';\nimport { ShikiStreamTokenizer } from 'shiki-stream';\n\nimport { getCodeLanguageByInput } from '@/Highlighter/const';\nimport lobeTheme from '@/Highlighter/theme/lobe-theme';\n\nimport { StreamingHighlightResult, shikiModulePromise } from './useHighlight';\n\ntype StreamingOptions = {\n customThemes?: Record<string, any>;\n enabled?: boolean;\n language: string;\n theme: string;\n};\n\n// Optimized version: reduce array allocations and object spreading\nconst tokensToLineTokens = (tokens: ThemedToken[]): ThemedToken[][] => {\n if (!tokens.length) return [[]];\n\n const lines: ThemedToken[][] = [];\n let currentLine: ThemedToken[] = [];\n\n for (const token of tokens) {\n const content = token.content ?? '';\n\n if (content === '\\n') {\n lines.push(currentLine);\n currentLine = [];\n continue;\n }\n\n const newlineIndex = content.indexOf('\\n');\n if (newlineIndex === -1) {\n // No newline, add token directly\n currentLine.push(token);\n } else {\n // Split on newlines\n const segments = content.split('\\n');\n for (const [j, segment] of segments.entries()) {\n if (segment) {\n // Only create new object if we need to modify content\n currentLine.push(j === 0 && segment === content ? token : { ...token, content: segment });\n }\n if (j < segments.length - 1) {\n lines.push(currentLine);\n currentLine = [];\n }\n }\n }\n }\n\n // Don't forget the last line\n if (currentLine.length > 0 || lines.length === 0) {\n lines.push(currentLine);\n }\n\n return lines.length > 0 ? lines : [[]];\n};\n\nconst createPreStyle = (bg?: string, fg?: string): CSSProperties | undefined => {\n if (!bg && !fg) return undefined;\n return {\n backgroundColor: bg,\n color: fg,\n };\n};\n\nconst useStreamingHighlighter = (\n text: string,\n options: StreamingOptions,\n): StreamingHighlightResult | undefined => {\n const { customThemes, enabled, language, theme } = options;\n const [result, setResult] = useState<StreamingHighlightResult>();\n const tokenizerRef = useRef<ShikiStreamTokenizer | null>(null);\n const previousTextRef = useRef('');\n const safeText = text ?? '';\n const latestTextRef = useRef(safeText);\n const preStyleRef = useRef<CSSProperties | undefined>(undefined);\n const linesRef = useRef<ThemedToken[][]>([[]]);\n\n useEffect(() => {\n latestTextRef.current = safeText;\n }, [safeText]);\n\n // Use ref to store callback to avoid recreating it\n const setStreamingResultRef = useRef((rawLines: ThemedToken[][]) => {\n const previousLines = linesRef.current;\n const newLinesLength = rawLines.length;\n const prevLinesLength = previousLines.length;\n\n // Fast path: if lengths differ or it's a complete reset, use new lines directly\n if (newLinesLength !== prevLinesLength || newLinesLength === 0) {\n linesRef.current = rawLines;\n setResult({\n lines: rawLines,\n preStyle: preStyleRef.current,\n });\n return;\n }\n\n // Optimized comparison: only check changed lines\n let hasChanges = false;\n const mergedLines: ThemedToken[][] = [];\n\n for (let i = 0; i < newLinesLength; i++) {\n const newLine = rawLines[i];\n const prevLine = previousLines[i];\n\n // Quick reference equality check first\n if (prevLine === newLine) {\n mergedLines[i] = prevLine;\n continue;\n }\n\n // Length check\n if (!prevLine || prevLine.length !== newLine.length) {\n mergedLines[i] = newLine;\n hasChanges = true;\n continue;\n }\n\n // Deep comparison only for lines that might have changed\n let lineChanged = false;\n for (const [j, newToken] of newLine.entries()) {\n if (prevLine[j] !== newToken) {\n lineChanged = true;\n break;\n }\n }\n\n if (lineChanged) {\n mergedLines[i] = newLine;\n hasChanges = true;\n } else {\n mergedLines[i] = prevLine;\n }\n }\n\n // Only update state if there are actual changes\n if (hasChanges) {\n linesRef.current = mergedLines;\n setResult({\n lines: mergedLines,\n preStyle: preStyleRef.current,\n });\n }\n });\n\n const updateTokens = useCallback(async (nextText: string, forceReset = false) => {\n const tokenizer = tokenizerRef.current;\n if (!tokenizer) return;\n\n if (forceReset) {\n tokenizer.clear();\n previousTextRef.current = '';\n }\n\n const previousText = previousTextRef.current;\n let chunk = nextText;\n const canAppend = !forceReset && nextText.startsWith(previousText);\n\n if (canAppend) {\n chunk = nextText.slice(previousText.length);\n } else if (!forceReset) {\n tokenizer.clear();\n }\n\n previousTextRef.current = nextText;\n\n if (!chunk) {\n // Optimize: avoid array spread if possible\n const stableTokens = tokenizer.tokensStable;\n const unstableTokens = tokenizer.tokensUnstable;\n const totalLength = stableTokens.length + unstableTokens.length;\n\n if (totalLength === 0) {\n setStreamingResultRef.current([[]]);\n return;\n }\n\n // Only create merged array if we have both stable and unstable tokens\n const mergedTokens =\n stableTokens.length === 0\n ? unstableTokens\n : unstableTokens.length === 0\n ? stableTokens\n : [...stableTokens, ...unstableTokens];\n\n setStreamingResultRef.current(tokensToLineTokens(mergedTokens));\n return;\n }\n\n try {\n await tokenizer.enqueue(chunk);\n // Optimize: avoid array spread if possible\n const stableTokens = tokenizer.tokensStable;\n const unstableTokens = tokenizer.tokensUnstable;\n const mergedTokens =\n stableTokens.length === 0\n ? unstableTokens\n : unstableTokens.length === 0\n ? stableTokens\n : [...stableTokens, ...unstableTokens];\n setStreamingResultRef.current(tokensToLineTokens(mergedTokens));\n } catch (error) {\n console.error('Streaming highlighting failed:', error);\n }\n }, []);\n\n // Cache highlighter key to avoid unnecessary recreations\n const highlighterKeyRef = useRef<string>('');\n\n useEffect(() => {\n if (!enabled) {\n tokenizerRef.current?.clear();\n tokenizerRef.current = null;\n previousTextRef.current = '';\n preStyleRef.current = undefined;\n linesRef.current = [[]];\n setResult(undefined);\n highlighterKeyRef.current = '';\n return;\n }\n\n // Skip if language/theme combination hasn't changed\n const currentKey = `${language}-${theme}`;\n if (highlighterKeyRef.current === currentKey && tokenizerRef.current) {\n return;\n }\n\n let cancelled = false;\n\n (async () => {\n const mod = await shikiModulePromise;\n if (!mod || cancelled) return;\n\n try {\n // Load custom theme if using slack-dark or slack-ochin\n let themesToLoad: any[] = [theme];\n if (customThemes && theme === 'lobe-theme') {\n const customTheme = customThemes[theme];\n if (customTheme) {\n themesToLoad = [customTheme as any];\n }\n }\n\n // Only load the specific language and theme needed\n // getSingletonHighlighter will cache the instance internally\n const highlighter = await mod.getSingletonHighlighter({\n langs: language ? [language] : ['plaintext'],\n themes: themesToLoad,\n });\n\n if (!highlighter || cancelled) return;\n\n // Only create new tokenizer if key changed\n if (highlighterKeyRef.current !== currentKey) {\n // Clear old tokenizer\n tokenizerRef.current?.clear();\n\n const tokenizer = new ShikiStreamTokenizer({\n highlighter,\n lang: language,\n theme,\n });\n\n tokenizerRef.current = tokenizer;\n highlighterKeyRef.current = currentKey;\n previousTextRef.current = '';\n linesRef.current = [[]];\n\n const themeInfo = highlighter.getTheme(theme);\n preStyleRef.current = createPreStyle(themeInfo?.bg, themeInfo?.fg);\n }\n\n const currentText = latestTextRef.current;\n if (currentText) {\n await updateTokens(currentText, true);\n } else {\n setStreamingResultRef.current([[]]);\n }\n } catch (error) {\n console.error('Streaming highlighter initialization failed:', error);\n // Reset on error\n highlighterKeyRef.current = '';\n }\n })();\n\n return () => {\n cancelled = true;\n // Cleanup only if this effect was cancelled before completion\n // The next effect will handle cleanup if key changed\n };\n }, [enabled, language, theme, updateTokens, customThemes]);\n\n // Separate effect for text updates to avoid unnecessary tokenizer recreation\n useEffect(() => {\n if (!enabled) return;\n if (!tokenizerRef.current) return;\n // Use ref to get latest text to avoid stale closures\n const currentText = latestTextRef.current;\n updateTokens(currentText);\n }, [enabled, safeText, updateTokens]);\n\n return result;\n};\n\nexport const useStreamHighlight = (\n text: string,\n {\n language,\n theme: builtinTheme,\n streaming,\n }: { enableTransformer?: boolean; language: string; streaming?: boolean; theme?: BuiltinTheme },\n) => {\n // Safely handle language and text with boundary checks\n const safeText = text ?? '';\n const lang = (language ?? 'plaintext').toLowerCase();\n\n // Match supported languages\n const matchedLanguage = useMemo(() => getCodeLanguageByInput(lang), [lang]);\n\n const effectiveTheme = builtinTheme || 'lobe-theme';\n\n return useStreamingHighlighter(safeText, {\n customThemes: {\n 'lobe-theme': lobeTheme,\n },\n enabled: streaming,\n language: matchedLanguage,\n theme: effectiveTheme,\n });\n};\n"],"mappings":"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"}
@@ -0,0 +1,87 @@
1
+ 'use client';
2
+
3
+ import { createMermaidConfig, loadMermaid } from "./useMermaid.mjs";
4
+ import { useEffect, useMemo, useRef, useState } from "react";
5
+ import { useTheme } from "antd-style";
6
+
7
+ //#region src/hooks/useStreamMermaid.ts
8
+ /**
9
+ * 流式 Mermaid 渲染 - 支持内容逐步更新
10
+ */
11
+ const useStreamMermaid = (content, { enabled = true, id, theme: customTheme }) => {
12
+ const theme = useTheme();
13
+ const [data, setData] = useState("");
14
+ const previousContentRef = useRef("");
15
+ const latestContentRef = useRef(content);
16
+ const renderTimeoutRef = useRef(void 0);
17
+ const mermaidConfig = useMemo(() => createMermaidConfig(theme, customTheme), [
18
+ theme.fontFamilyCode,
19
+ theme.isDarkMode,
20
+ theme.colorTextDescription,
21
+ theme.fontFamily,
22
+ theme.colorTextSecondary,
23
+ theme.colorBgContainer,
24
+ theme.colorInfoBg,
25
+ theme.colorInfoText,
26
+ theme.geekblue,
27
+ theme.colorWarning,
28
+ theme.colorSuccess,
29
+ theme.colorError,
30
+ theme.colorBorder,
31
+ theme.colorInfoBorder,
32
+ theme.colorSuccessBorder,
33
+ theme.colorSuccessBg,
34
+ theme.colorSuccessText,
35
+ theme.colorText,
36
+ customTheme
37
+ ]);
38
+ useEffect(() => {
39
+ latestContentRef.current = content;
40
+ }, [content]);
41
+ useEffect(() => {
42
+ if (!enabled) {
43
+ setData("");
44
+ previousContentRef.current = "";
45
+ const timeoutId$1 = renderTimeoutRef.current;
46
+ if (timeoutId$1) clearTimeout(timeoutId$1);
47
+ return;
48
+ }
49
+ const currentContent = latestContentRef.current;
50
+ if (currentContent === previousContentRef.current && data) return;
51
+ const timeoutId = renderTimeoutRef.current;
52
+ if (timeoutId) clearTimeout(timeoutId);
53
+ renderTimeoutRef.current = setTimeout(async () => {
54
+ const contentToRender = latestContentRef.current;
55
+ if (contentToRender !== currentContent) return;
56
+ try {
57
+ const mermaidInstance = await loadMermaid();
58
+ if (!mermaidInstance) return;
59
+ if (await mermaidInstance.parse(contentToRender)) {
60
+ mermaidInstance.initialize(mermaidConfig);
61
+ const { svg } = await mermaidInstance.render(id, contentToRender);
62
+ if (latestContentRef.current === contentToRender) {
63
+ setData(svg);
64
+ previousContentRef.current = contentToRender;
65
+ }
66
+ }
67
+ } catch (error_) {
68
+ if (contentToRender === latestContentRef.current) console.error("Mermaid 解析错误:", error_);
69
+ }
70
+ }, 300);
71
+ return () => {
72
+ const timeoutId$1 = renderTimeoutRef.current;
73
+ if (timeoutId$1) clearTimeout(timeoutId$1);
74
+ };
75
+ }, [
76
+ enabled,
77
+ content,
78
+ id,
79
+ mermaidConfig,
80
+ data
81
+ ]);
82
+ return data;
83
+ };
84
+
85
+ //#endregion
86
+ export { useStreamMermaid };
87
+ //# sourceMappingURL=useStreamMermaid.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useStreamMermaid.mjs","names":["timeoutId"],"sources":["../../src/hooks/useStreamMermaid.ts"],"sourcesContent":["'use client';\n\nimport { useTheme } from 'antd-style';\nimport type { MermaidConfig } from 'mermaid/dist/config.type';\nimport { useEffect, useMemo, useRef, useState } from 'react';\n\nimport { createMermaidConfig, loadMermaid } from './useMermaid';\n\n/**\n * 流式 Mermaid 渲染 - 支持内容逐步更新\n */\nexport const useStreamMermaid = (\n content: string,\n {\n enabled = true,\n id,\n theme: customTheme,\n }: {\n enabled?: boolean;\n id: string;\n theme?: MermaidConfig['theme'];\n },\n): string => {\n const theme = useTheme();\n const [data, setData] = useState<string>('');\n const previousContentRef = useRef<string>('');\n const latestContentRef = useRef(content);\n const renderTimeoutRef = useRef<ReturnType<typeof setTimeout> | undefined>(undefined);\n\n // 提取主题相关配置到 useMemo 中\n const mermaidConfig = useMemo(\n () => createMermaidConfig(theme, customTheme),\n [\n theme.fontFamilyCode,\n theme.isDarkMode,\n theme.colorTextDescription,\n theme.fontFamily,\n theme.colorTextSecondary,\n theme.colorBgContainer,\n theme.colorInfoBg,\n theme.colorInfoText,\n theme.geekblue,\n theme.colorWarning,\n theme.colorSuccess,\n theme.colorError,\n theme.colorBorder,\n theme.colorInfoBorder,\n theme.colorSuccessBorder,\n theme.colorSuccessBg,\n theme.colorSuccessText,\n theme.colorText,\n customTheme,\n ],\n );\n\n // Update latest content ref\n useEffect(() => {\n latestContentRef.current = content;\n }, [content]);\n\n // Debounced rendering for streaming content\n useEffect(() => {\n if (!enabled) {\n setData('');\n previousContentRef.current = '';\n const timeoutId = renderTimeoutRef.current;\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n return;\n }\n\n const currentContent = latestContentRef.current;\n\n // Skip if content hasn't changed\n if (currentContent === previousContentRef.current && data) {\n return;\n }\n\n // Clear previous timeout\n const timeoutId = renderTimeoutRef.current;\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n\n // Debounce rendering for streaming content (wait 300ms after last change)\n renderTimeoutRef.current = setTimeout(async () => {\n const contentToRender = latestContentRef.current;\n\n // Skip if content changed during debounce\n if (contentToRender !== currentContent) {\n return;\n }\n\n try {\n const mermaidInstance = await loadMermaid();\n if (!mermaidInstance) return;\n\n // 验证语法\n const isValid = await mermaidInstance.parse(contentToRender);\n\n if (isValid) {\n // 初始化并渲染\n mermaidInstance.initialize(mermaidConfig);\n const { svg } = await mermaidInstance.render(id, contentToRender);\n\n // Only update if content hasn't changed during rendering\n if (latestContentRef.current === contentToRender) {\n setData(svg);\n previousContentRef.current = contentToRender;\n }\n }\n } catch (error_) {\n // Silently handle errors during streaming\n // Only log if this is the final content\n if (contentToRender === latestContentRef.current) {\n console.error('Mermaid 解析错误:', error_);\n }\n }\n }, 300);\n\n return () => {\n const timeoutId = renderTimeoutRef.current;\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n };\n }, [enabled, content, id, mermaidConfig, data]);\n\n return data;\n};\n"],"mappings":";;;;;;;;;;AAWA,MAAa,oBACX,SACA,EACE,UAAU,MACV,IACA,OAAO,kBAME;CACX,MAAM,QAAQ,UAAU;CACxB,MAAM,CAAC,MAAM,WAAW,SAAiB,GAAG;CAC5C,MAAM,qBAAqB,OAAe,GAAG;CAC7C,MAAM,mBAAmB,OAAO,QAAQ;CACxC,MAAM,mBAAmB,OAAkD,OAAU;CAGrF,MAAM,gBAAgB,cACd,oBAAoB,OAAO,YAAY,EAC7C;EACE,MAAM;EACN,MAAM;EACN,MAAM;EACN,MAAM;EACN,MAAM;EACN,MAAM;EACN,MAAM;EACN,MAAM;EACN,MAAM;EACN,MAAM;EACN,MAAM;EACN,MAAM;EACN,MAAM;EACN,MAAM;EACN,MAAM;EACN,MAAM;EACN,MAAM;EACN,MAAM;EACN;EACD,CACF;AAGD,iBAAgB;AACd,mBAAiB,UAAU;IAC1B,CAAC,QAAQ,CAAC;AAGb,iBAAgB;AACd,MAAI,CAAC,SAAS;AACZ,WAAQ,GAAG;AACX,sBAAmB,UAAU;GAC7B,MAAMA,cAAY,iBAAiB;AACnC,OAAIA,YACF,cAAaA,YAAU;AAEzB;;EAGF,MAAM,iBAAiB,iBAAiB;AAGxC,MAAI,mBAAmB,mBAAmB,WAAW,KACnD;EAIF,MAAM,YAAY,iBAAiB;AACnC,MAAI,UACF,cAAa,UAAU;AAIzB,mBAAiB,UAAU,WAAW,YAAY;GAChD,MAAM,kBAAkB,iBAAiB;AAGzC,OAAI,oBAAoB,eACtB;AAGF,OAAI;IACF,MAAM,kBAAkB,MAAM,aAAa;AAC3C,QAAI,CAAC,gBAAiB;AAKtB,QAFgB,MAAM,gBAAgB,MAAM,gBAAgB,EAE/C;AAEX,qBAAgB,WAAW,cAAc;KACzC,MAAM,EAAE,QAAQ,MAAM,gBAAgB,OAAO,IAAI,gBAAgB;AAGjE,SAAI,iBAAiB,YAAY,iBAAiB;AAChD,cAAQ,IAAI;AACZ,yBAAmB,UAAU;;;YAG1B,QAAQ;AAGf,QAAI,oBAAoB,iBAAiB,QACvC,SAAQ,MAAM,iBAAiB,OAAO;;KAGzC,IAAI;AAEP,eAAa;GACX,MAAMA,cAAY,iBAAiB;AACnC,OAAIA,YACF,cAAaA,YAAU;;IAG1B;EAAC;EAAS;EAAS;EAAI;EAAe;EAAK,CAAC;AAE/C,QAAO"}
@@ -1,7 +1,7 @@
1
1
  import { MotionComponentType } from "../MotionProvider/index.mjs";
2
2
  import { I18nContextValue, TranslationKey, TranslationResources, TranslationResourcesInput } from "./types.mjs";
3
3
  import "../ConfigProvider/index.mjs";
4
- import * as react4 from "react";
4
+ import * as react35 from "react";
5
5
  import { ReactNode } from "react";
6
6
 
7
7
  //#region src/i18n/context.d.ts
@@ -11,7 +11,7 @@ interface I18nProviderProps {
11
11
  motion: MotionComponentType;
12
12
  resources?: TranslationResourcesInput;
13
13
  }
14
- declare const I18nProvider: react4.NamedExoticComponent<I18nProviderProps>;
14
+ declare const I18nProvider: react35.NamedExoticComponent<I18nProviderProps>;
15
15
  //#endregion
16
16
  export { I18nProvider, I18nProviderProps };
17
17
  //# sourceMappingURL=context.d.mts.map
@@ -1,8 +1,8 @@
1
- import * as react72 from "react";
1
+ import * as react73 from "react";
2
2
  import * as lucide_react0 from "lucide-react";
3
3
 
4
4
  //#region src/icons/lucideExtra/BotPromptIcon.d.ts
5
- declare const BotPromptIcon: react72.ForwardRefExoticComponent<Omit<lucide_react0.LucideProps, "ref"> & react72.RefAttributes<SVGSVGElement>>;
5
+ declare const BotPromptIcon: react73.ForwardRefExoticComponent<Omit<lucide_react0.LucideProps, "ref"> & react73.RefAttributes<SVGSVGElement>>;
6
6
  //#endregion
7
7
  export { BotPromptIcon };
8
8
  //# sourceMappingURL=BotPromptIcon.d.mts.map
@@ -1,8 +1,8 @@
1
- import * as react74 from "react";
1
+ import * as react75 from "react";
2
2
  import * as lucide_react1 from "lucide-react";
3
3
 
4
4
  //#region src/icons/lucideExtra/CreateBotIcon.d.ts
5
- declare const CreateBotIcon: react74.ForwardRefExoticComponent<Omit<lucide_react1.LucideProps, "ref"> & react74.RefAttributes<SVGSVGElement>>;
5
+ declare const CreateBotIcon: react75.ForwardRefExoticComponent<Omit<lucide_react1.LucideProps, "ref"> & react75.RefAttributes<SVGSVGElement>>;
6
6
  //#endregion
7
7
  export { CreateBotIcon };
8
8
  //# sourceMappingURL=CreateBotIcon.d.mts.map
@@ -1,8 +1,8 @@
1
- import * as react70 from "react";
1
+ import * as react71 from "react";
2
2
  import * as lucide_react0 from "lucide-react";
3
3
 
4
4
  //#region src/icons/lucideExtra/DiscordIcon.d.ts
5
- declare const DiscordIcon: react70.ForwardRefExoticComponent<Omit<lucide_react0.LucideProps, "ref"> & react70.RefAttributes<SVGSVGElement>>;
5
+ declare const DiscordIcon: react71.ForwardRefExoticComponent<Omit<lucide_react0.LucideProps, "ref"> & react71.RefAttributes<SVGSVGElement>>;
6
6
  //#endregion
7
7
  export { DiscordIcon };
8
8
  //# sourceMappingURL=DiscordIcon.d.mts.map
@@ -1,8 +1,8 @@
1
- import * as react82 from "react";
2
- import * as lucide_react5 from "lucide-react";
1
+ import * as react79 from "react";
2
+ import * as lucide_react3 from "lucide-react";
3
3
 
4
4
  //#region src/icons/lucideExtra/GlobeOffIcon.d.ts
5
- declare const GlobeOffIcon: react82.ForwardRefExoticComponent<Omit<lucide_react5.LucideProps, "ref"> & react82.RefAttributes<SVGSVGElement>>;
5
+ declare const GlobeOffIcon: react79.ForwardRefExoticComponent<Omit<lucide_react3.LucideProps, "ref"> & react79.RefAttributes<SVGSVGElement>>;
6
6
  //#endregion
7
7
  export { GlobeOffIcon };
8
8
  //# sourceMappingURL=GlobeOffIcon.d.mts.map