@lobehub/ui 5.23.5 → 5.25.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 (375) hide show
  1. package/es/A/index.mjs +2 -1
  2. package/es/A/index.mjs.map +1 -1
  3. package/es/Accordion/Accordion.mjs.map +1 -1
  4. package/es/Accordion/AccordionItem.mjs +0 -1
  5. package/es/Accordion/AccordionItem.mjs.map +1 -1
  6. package/es/Accordion/ArrowIcon.mjs.map +1 -1
  7. package/es/ActionIcon/ActionIcon.mjs.map +1 -1
  8. package/es/ActionIcon/components/utils.mjs +7 -9
  9. package/es/ActionIcon/components/utils.mjs.map +1 -1
  10. package/es/ActionIconGroup/ActionIconGroup.mjs.map +1 -1
  11. package/es/Alert/Alert.mjs.map +1 -1
  12. package/es/Avatar/Avatar.mjs.map +1 -1
  13. package/es/Avatar/AvatarGroup/index.mjs.map +1 -1
  14. package/es/Burger/Burger.mjs.map +1 -1
  15. package/es/Checkbox/Checkbox.mjs.map +1 -1
  16. package/es/Checkbox/CheckboxGroup.mjs +4 -2
  17. package/es/Checkbox/CheckboxGroup.mjs.map +1 -1
  18. package/es/CodeDiff/CodeDiff.mjs +20 -18
  19. package/es/CodeDiff/CodeDiff.mjs.map +1 -1
  20. package/es/CodeDiff/DiffPanel.mjs.map +1 -1
  21. package/es/CodeDiff/PatchDiff.mjs +18 -16
  22. package/es/CodeDiff/PatchDiff.mjs.map +1 -1
  23. package/es/CodeEditor/CodeEditor.mjs.map +1 -1
  24. package/es/Collapse/Collapse.mjs.map +1 -1
  25. package/es/ColorSwatches/ColorSwatches.mjs.map +1 -1
  26. package/es/ConfigProvider/index.mjs.map +1 -1
  27. package/es/ContextMenu/index.d.mts +2 -2
  28. package/es/ContextMenu/index.mjs +2 -2
  29. package/es/CopyButton/CopyButton.mjs +2 -1
  30. package/es/CopyButton/CopyButton.mjs.map +1 -1
  31. package/es/DraggablePanel/DraggablePanel.mjs.map +1 -1
  32. package/es/DraggablePanel/components/DraggablePanelHeader.mjs.map +1 -1
  33. package/es/DraggableSideNav/DraggableSideNav.mjs.map +1 -1
  34. package/es/Drawer/Drawer.mjs.map +1 -1
  35. package/es/Dropdown/Dropdown.mjs.map +1 -1
  36. package/es/EditableText/ControlInput.mjs.map +1 -1
  37. package/es/EditableText/EditableText.mjs.map +1 -1
  38. package/es/EditorSlashMenu/EditorSlashMenu.mjs.map +1 -1
  39. package/es/EditorSlashMenu/MenuItemRenderer.mjs.map +1 -1
  40. package/es/EmojiPicker/AvatarUploader.mjs.map +1 -1
  41. package/es/EmojiPicker/EmojiPicker.mjs.map +1 -1
  42. package/es/Empty/Empty.mjs.map +1 -1
  43. package/es/FileTypeIcon/FileTypeIcon.mjs.map +1 -1
  44. package/es/FileTypeIcon/components/FileIcon.mjs.map +1 -1
  45. package/es/FileTypeIcon/components/FolderIcon.mjs.map +1 -1
  46. package/es/FluentEmoji/FluentEmoji.mjs.map +1 -1
  47. package/es/Footer/Footer.mjs.map +1 -1
  48. package/es/Form/Form.mjs.map +1 -1
  49. package/es/Form/components/FormGroup.mjs.map +1 -1
  50. package/es/Form/components/FormSubmitFooter.mjs.map +1 -1
  51. package/es/Form/components/FormTitle.mjs.map +1 -1
  52. package/es/FormModal/FormModal.mjs.map +1 -1
  53. package/es/Freeze/Freeze.mjs.map +1 -1
  54. package/es/GroupAvatar/GroupAvatar.mjs.map +1 -1
  55. package/es/GuideCard/GuideCard.mjs.map +1 -1
  56. package/es/Header/Header.mjs.map +1 -1
  57. package/es/Highlighter/FullFeatured.mjs.map +1 -1
  58. package/es/Highlighter/Highlighter.mjs.map +1 -1
  59. package/es/Highlighter/LangSelect.mjs +41 -40
  60. package/es/Highlighter/LangSelect.mjs.map +1 -1
  61. package/es/Highlighter/SyntaxHighlighter/StaticRenderer.mjs +2 -1
  62. package/es/Highlighter/SyntaxHighlighter/StaticRenderer.mjs.map +1 -1
  63. package/es/Highlighter/SyntaxHighlighter/StreamRenderer.mjs.map +1 -1
  64. package/es/Highlighter/SyntaxHighlighter/style.mjs +2 -2
  65. package/es/Highlighter/SyntaxHighlighter/style.mjs.map +1 -1
  66. package/es/Hotkey/Hotkey.mjs.map +1 -1
  67. package/es/HotkeyInput/HotkeyInput.mjs +3 -1
  68. package/es/HotkeyInput/HotkeyInput.mjs.map +1 -1
  69. package/es/HtmlPreview/HtmlPreview.mjs.map +1 -1
  70. package/es/HtmlPreview/Iframe.mjs.map +1 -1
  71. package/es/HtmlPreview/const.mjs +1 -1
  72. package/es/HtmlPreview/const.mjs.map +1 -1
  73. package/es/Icon/Icon.mjs.map +1 -1
  74. package/es/Icon/components/utils.mjs +7 -9
  75. package/es/Icon/components/utils.mjs.map +1 -1
  76. package/es/Image/Image.mjs.map +1 -1
  77. package/es/Image/components/Toolbar.mjs +2 -1
  78. package/es/Image/components/Toolbar.mjs.map +1 -1
  79. package/es/Image/components/usePreview.mjs.map +1 -1
  80. package/es/Image/components/usePreviewGroup.mjs.map +1 -1
  81. package/es/ImageSelect/ImageSelect.mjs.map +1 -1
  82. package/es/Img/index.mjs +2 -1
  83. package/es/Img/index.mjs.map +1 -1
  84. package/es/Layout/Layout.mjs.map +1 -1
  85. package/es/List/List.mjs.map +1 -1
  86. package/es/List/ListItem/index.mjs.map +1 -1
  87. package/es/Markdown/Markdown.mjs.map +1 -1
  88. package/es/Markdown/SyntaxMarkdown/MarkdownRender.mjs.map +1 -1
  89. package/es/Markdown/SyntaxMarkdown/StreamdownRender.mjs +2 -1
  90. package/es/Markdown/SyntaxMarkdown/StreamdownRender.mjs.map +1 -1
  91. package/es/Markdown/SyntaxMarkdown/style.mjs.map +1 -1
  92. package/es/Markdown/SyntaxMarkdown/useSmoothStreamContent.mjs +2 -2
  93. package/es/Markdown/SyntaxMarkdown/useSmoothStreamContent.mjs.map +1 -1
  94. package/es/Markdown/components/CodeBlock.mjs.map +1 -1
  95. package/es/Markdown/components/Footnotes.mjs.map +1 -1
  96. package/es/Markdown/components/MarkdownTable/index.mjs.map +1 -1
  97. package/es/Markdown/components/SearchResultCards/SearchResultCard.mjs.map +1 -1
  98. package/es/Markdown/components/SearchResultCards/index.mjs.map +1 -1
  99. package/es/MaterialFileTypeIcon/MaterialFileTypeIcon.mjs.map +1 -1
  100. package/es/Menu/Menu.mjs.map +1 -1
  101. package/es/Mermaid/FullFeatured.mjs.map +1 -1
  102. package/es/Mermaid/Mermaid.mjs.map +1 -1
  103. package/es/Mermaid/SyntaxMermaid/MermaidFallback.mjs +35 -0
  104. package/es/Mermaid/SyntaxMermaid/MermaidFallback.mjs.map +1 -0
  105. package/es/Mermaid/SyntaxMermaid/MermaidSvg.mjs +52 -0
  106. package/es/Mermaid/SyntaxMermaid/MermaidSvg.mjs.map +1 -0
  107. package/es/Mermaid/SyntaxMermaid/StaticMermaid.mjs +13 -42
  108. package/es/Mermaid/SyntaxMermaid/StaticMermaid.mjs.map +1 -1
  109. package/es/Mermaid/SyntaxMermaid/StreamMermaid.mjs +13 -43
  110. package/es/Mermaid/SyntaxMermaid/StreamMermaid.mjs.map +1 -1
  111. package/es/Mermaid/SyntaxMermaid/prepareInlineSvg.mjs +52 -0
  112. package/es/Mermaid/SyntaxMermaid/prepareInlineSvg.mjs.map +1 -0
  113. package/es/Mermaid/SyntaxMermaid/prepareMermaidSvg.mjs +20 -0
  114. package/es/Mermaid/SyntaxMermaid/prepareMermaidSvg.mjs.map +1 -0
  115. package/es/Mermaid/SyntaxMermaid/style.mjs +11 -0
  116. package/es/Mermaid/SyntaxMermaid/style.mjs.map +1 -1
  117. package/es/Mermaid/const.mjs +10 -31
  118. package/es/Mermaid/const.mjs.map +1 -1
  119. package/es/Mermaid/index.d.mts +2 -1
  120. package/es/Mermaid/index.mjs +2 -1
  121. package/es/Mermaid/type.d.mts +2 -2
  122. package/es/Modal/Modal.mjs.map +1 -1
  123. package/es/Modal/ModalStackItem.mjs.map +1 -1
  124. package/es/Modal/RawModalStackItem.mjs +6 -5
  125. package/es/Modal/RawModalStackItem.mjs.map +1 -1
  126. package/es/Modal/imperative.mjs +4 -2
  127. package/es/Modal/imperative.mjs.map +1 -1
  128. package/es/Modal/style.mjs.map +1 -1
  129. package/es/NeuralNetworkLoading/NeuralNetworkLoading.mjs +1 -1
  130. package/es/NeuralNetworkLoading/NeuralNetworkLoading.mjs.map +1 -1
  131. package/es/ScrollShadow/ScrollShadow.mjs +13 -12
  132. package/es/ScrollShadow/ScrollShadow.mjs.map +1 -1
  133. package/es/SearchBar/SearchBar.mjs.map +1 -1
  134. package/es/SideNav/SideNav.mjs.map +1 -1
  135. package/es/Skeleton/Skeleton.mjs.map +1 -1
  136. package/es/Skeleton/SkeletonButton.mjs +2 -1
  137. package/es/Skeleton/SkeletonButton.mjs.map +1 -1
  138. package/es/Skeleton/SkeletonParagraph.mjs.map +1 -1
  139. package/es/Skeleton/SkeletonTags.mjs.map +1 -1
  140. package/es/SliderWithInput/SliderWithInput.mjs.map +1 -1
  141. package/es/Snippet/Snippet.mjs.map +1 -1
  142. package/es/SortableList/SortableList.mjs +5 -1
  143. package/es/SortableList/SortableList.mjs.map +1 -1
  144. package/es/SortableList/components/SortableItem.mjs.map +1 -1
  145. package/es/Text/Text.mjs +22 -21
  146. package/es/Text/Text.mjs.map +1 -1
  147. package/es/ThemeProvider/ThemeProvider.mjs +4 -3
  148. package/es/ThemeProvider/ThemeProvider.mjs.map +1 -1
  149. package/es/ThemeSwitch/ThemeSwitch.mjs.map +1 -1
  150. package/es/Toc/Toc.mjs.map +1 -1
  151. package/es/Toc/TocMobile.mjs.map +1 -1
  152. package/es/Video/index.mjs.map +1 -1
  153. package/es/awesome/AuroraBackground/AuroraBackground.mjs.map +1 -1
  154. package/es/awesome/Features/FeatureItem.mjs.map +1 -1
  155. package/es/awesome/Giscus/Giscus.mjs.map +1 -1
  156. package/es/awesome/GradientButton/GradientButton.mjs +1 -3
  157. package/es/awesome/GradientButton/GradientButton.mjs.map +1 -1
  158. package/es/awesome/GridBackground/GridBackground.mjs.map +1 -1
  159. package/es/awesome/GridBackground/GridShowcase.mjs.map +1 -1
  160. package/es/awesome/GridBackground/components/Grid.mjs.map +1 -1
  161. package/es/awesome/Hero/Hero.mjs.map +1 -1
  162. package/es/awesome/Spline/ParentSize.mjs.map +1 -1
  163. package/es/awesome/Spline/Spine.mjs.map +1 -1
  164. package/es/awesome/Spotlight/Spotlight.mjs +2 -1
  165. package/es/awesome/Spotlight/Spotlight.mjs.map +1 -1
  166. package/es/awesome/SpotlightCard/SpotlightCard.mjs.map +1 -1
  167. package/es/awesome/SpotlightCard/SpotlightCardItem.mjs.map +1 -1
  168. package/es/awesome/TypewriterEffect/TypewriterEffect.mjs.map +1 -1
  169. package/es/base-ui/AutoComplete/AutoComplete.mjs.map +1 -1
  170. package/es/base-ui/Button/Button.mjs +13 -11
  171. package/es/base-ui/Button/Button.mjs.map +1 -1
  172. package/es/base-ui/Button/SplitButton.mjs +2 -1
  173. package/es/base-ui/Button/SplitButton.mjs.map +1 -1
  174. package/es/base-ui/Checkbox/Checkbox.mjs.map +1 -1
  175. package/es/base-ui/Checkbox/CheckboxGroup.mjs.map +1 -1
  176. package/es/base-ui/ContextMenu/ContextMenuHost.mjs.map +1 -1
  177. package/es/base-ui/ContextMenu/ContextMenuTrigger.mjs +2 -1
  178. package/es/base-ui/ContextMenu/ContextMenuTrigger.mjs.map +1 -1
  179. package/es/base-ui/ContextMenu/imperative.d.mts +2 -2
  180. package/es/base-ui/ContextMenu/index.d.mts +2 -2
  181. package/es/base-ui/ContextMenu/renderItems.mjs +2 -1
  182. package/es/base-ui/ContextMenu/renderItems.mjs.map +1 -1
  183. package/es/base-ui/ContextMenu/store.d.mts +13 -1
  184. package/es/base-ui/ContextMenu/store.mjs +29 -4
  185. package/es/base-ui/ContextMenu/store.mjs.map +1 -1
  186. package/es/base-ui/Drawer/Drawer.d.mts +6 -0
  187. package/es/base-ui/Drawer/Drawer.mjs +152 -0
  188. package/es/base-ui/Drawer/Drawer.mjs.map +1 -0
  189. package/es/base-ui/Drawer/DrawerLayerContext.mjs +10 -0
  190. package/es/base-ui/Drawer/DrawerLayerContext.mjs.map +1 -0
  191. package/es/base-ui/Drawer/DrawerPushContext.mjs +27 -0
  192. package/es/base-ui/Drawer/DrawerPushContext.mjs.map +1 -0
  193. package/es/base-ui/Drawer/atoms.d.mts +58 -0
  194. package/es/base-ui/Drawer/atoms.mjs +262 -0
  195. package/es/base-ui/Drawer/atoms.mjs.map +1 -0
  196. package/es/base-ui/Drawer/constants.d.mts +17 -0
  197. package/es/base-ui/Drawer/constants.mjs +72 -0
  198. package/es/base-ui/Drawer/constants.mjs.map +1 -0
  199. package/es/base-ui/Drawer/index.d.mts +5 -0
  200. package/es/base-ui/Drawer/style.mjs +295 -0
  201. package/es/base-ui/Drawer/style.mjs.map +1 -0
  202. package/es/base-ui/Drawer/type.d.mts +65 -0
  203. package/es/base-ui/DropdownMenu/DropdownMenu.mjs +2 -1
  204. package/es/base-ui/DropdownMenu/DropdownMenu.mjs.map +1 -1
  205. package/es/base-ui/DropdownMenu/atoms.mjs +2 -1
  206. package/es/base-ui/DropdownMenu/atoms.mjs.map +1 -1
  207. package/es/base-ui/DropdownMenu/renderItems.mjs +2 -1
  208. package/es/base-ui/DropdownMenu/renderItems.mjs.map +1 -1
  209. package/es/base-ui/DropdownMenu/sharedStyle.mjs +3 -0
  210. package/es/base-ui/DropdownMenu/sharedStyle.mjs.map +1 -1
  211. package/es/base-ui/FloatingPanel/FloatingPanel.mjs.map +1 -1
  212. package/es/base-ui/FloatingSheet/FloatingSheet.mjs +4 -1
  213. package/es/base-ui/FloatingSheet/FloatingSheet.mjs.map +1 -1
  214. package/es/base-ui/FloatingSheet/FloatingSheetHeader.mjs.map +1 -1
  215. package/es/base-ui/Form/Form.mjs.map +1 -1
  216. package/es/base-ui/Form/components/FormField.mjs.map +1 -1
  217. package/es/base-ui/Form/components/FormGroup.mjs.map +1 -1
  218. package/es/base-ui/Form/components/FormSubmitFooter.mjs.map +1 -1
  219. package/es/base-ui/Form/components/FormTitle.mjs.map +1 -1
  220. package/es/base-ui/Input/Input.mjs.map +1 -1
  221. package/es/base-ui/Input/InputNumber.mjs.map +1 -1
  222. package/es/base-ui/Input/InputOTP.mjs.map +1 -1
  223. package/es/base-ui/Input/InputPassword.mjs.map +1 -1
  224. package/es/base-ui/Input/TextArea.mjs.map +1 -1
  225. package/es/base-ui/Modal/Modal.mjs.map +1 -1
  226. package/es/base-ui/Modal/atoms.mjs +7 -5
  227. package/es/base-ui/Modal/atoms.mjs.map +1 -1
  228. package/es/base-ui/Modal/imperative.mjs +2 -1
  229. package/es/base-ui/Modal/imperative.mjs.map +1 -1
  230. package/es/base-ui/Popover/ArrowIcon.mjs.map +1 -1
  231. package/es/base-ui/Popover/PopoverGroup.mjs.map +1 -1
  232. package/es/base-ui/Popover/PopoverStandalone.mjs.map +1 -1
  233. package/es/base-ui/Popover/atoms.mjs +2 -1
  234. package/es/base-ui/Popover/atoms.mjs.map +1 -1
  235. package/es/base-ui/Popover/context.mjs +4 -2
  236. package/es/base-ui/Popover/context.mjs.map +1 -1
  237. package/es/base-ui/Radio/Radio.mjs.map +1 -1
  238. package/es/base-ui/Radio/RadioGroup.mjs.map +1 -1
  239. package/es/base-ui/ScrollArea/ScrollArea.mjs.map +1 -1
  240. package/es/base-ui/Segmented/Segmented.mjs.map +1 -1
  241. package/es/base-ui/Select/Select.mjs.map +1 -1
  242. package/es/base-ui/Select/atoms.mjs +2 -1
  243. package/es/base-ui/Select/atoms.mjs.map +1 -1
  244. package/es/base-ui/Select/parts.mjs.map +1 -1
  245. package/es/base-ui/Select/renderOptions.mjs.map +1 -1
  246. package/es/base-ui/Slider/Slider.mjs.map +1 -1
  247. package/es/base-ui/Slider/SliderWithInput.mjs.map +1 -1
  248. package/es/base-ui/SubmenuArrowIcon.mjs.map +1 -1
  249. package/es/base-ui/Switch/Switch.mjs.map +1 -1
  250. package/es/base-ui/Switch/atoms.d.mts +3 -3
  251. package/es/base-ui/Switch/atoms.mjs +99 -50
  252. package/es/base-ui/Switch/atoms.mjs.map +1 -1
  253. package/es/base-ui/Switch/style.mjs +44 -1
  254. package/es/base-ui/Switch/style.mjs.map +1 -1
  255. package/es/base-ui/Switch/type.d.mts +3 -7
  256. package/es/base-ui/Tabs/Tabs.mjs.map +1 -1
  257. package/es/base-ui/Tabs/atoms.mjs.map +1 -1
  258. package/es/base-ui/Toast/Toast.mjs.map +1 -1
  259. package/es/base-ui/Toast/imperative.mjs.map +1 -1
  260. package/es/base-ui/Tooltip/ArrowIcon.mjs.map +1 -1
  261. package/es/base-ui/Tooltip/TooltipGroup.mjs.map +1 -1
  262. package/es/base-ui/Tooltip/TooltipStandalone.mjs.map +1 -1
  263. package/es/base-ui/index.d.mts +7 -2
  264. package/es/base-ui/index.mjs +5 -2
  265. package/es/brand/LobeChat/index.mjs +0 -1
  266. package/es/brand/LobeChat/index.mjs.map +1 -1
  267. package/es/brand/LobeChatText/index.mjs.map +1 -1
  268. package/es/brand/LobeHub/index.mjs +0 -1
  269. package/es/brand/LobeHub/index.mjs.map +1 -1
  270. package/es/brand/LobeHubText/index.mjs.map +1 -1
  271. package/es/brand/Logo3d/index.mjs +2 -1
  272. package/es/brand/Logo3d/index.mjs.map +1 -1
  273. package/es/brand/LogoThree/Loading.mjs.map +1 -1
  274. package/es/brand/LogoThree/LogoSpline.mjs.map +1 -1
  275. package/es/brand/LogoThree/index.mjs.map +1 -1
  276. package/es/brand/components/Divider.mjs.map +1 -1
  277. package/es/chat/BackBottom/BackBottom.mjs.map +1 -1
  278. package/es/chat/ChatHeader/ChatHeader.mjs.map +1 -1
  279. package/es/chat/ChatHeader/ChatHeaderTitle.mjs.map +1 -1
  280. package/es/chat/ChatInputArea/ChatInputArea.mjs.map +1 -1
  281. package/es/chat/ChatInputArea/components/ChatInputActionBar.mjs.map +1 -1
  282. package/es/chat/ChatInputArea/components/ChatSendButton.mjs.map +1 -1
  283. package/es/chat/ChatItem/ChatItem.mjs.map +1 -1
  284. package/es/chat/ChatItem/components/Actions.mjs +5 -4
  285. package/es/chat/ChatItem/components/Actions.mjs.map +1 -1
  286. package/es/chat/ChatItem/components/Avatar.mjs.map +1 -1
  287. package/es/chat/ChatItem/components/ErrorContent.mjs.map +1 -1
  288. package/es/chat/ChatItem/components/Loading.mjs.map +1 -1
  289. package/es/chat/ChatItem/components/MessageContent.mjs.map +1 -1
  290. package/es/chat/ChatItem/components/Title.mjs.map +1 -1
  291. package/es/chat/ChatList/ChatList.mjs +2 -1
  292. package/es/chat/ChatList/ChatList.mjs.map +1 -1
  293. package/es/chat/ChatList/components/HistoryDivider.mjs.map +1 -1
  294. package/es/chat/EditableMessage/EditableMessage.mjs.map +1 -1
  295. package/es/chat/EditableMessageList/EditableMessageList.mjs.map +1 -1
  296. package/es/chat/LoadingDots/LoadingDots.mjs.map +1 -1
  297. package/es/chat/MessageInput/MessageInput.mjs.map +1 -1
  298. package/es/chat/MessageModal/MessageModal.mjs.map +1 -1
  299. package/es/color/ColorScales/ScaleRow.mjs +0 -2
  300. package/es/color/ColorScales/ScaleRow.mjs.map +1 -1
  301. package/es/color/ColorScales/index.mjs.map +1 -1
  302. package/es/color/CssVar/ScaleRow.mjs.map +1 -1
  303. package/es/color/CssVar/VarRow.mjs.map +1 -1
  304. package/es/color/CssVar/index.mjs.map +1 -1
  305. package/es/hooks/useMarkdown/latex.mjs.map +1 -1
  306. package/es/hooks/useMarkdown/useMarkdownContent.mjs.map +1 -1
  307. package/es/hooks/useMermaid.mjs +81 -116
  308. package/es/hooks/useMermaid.mjs.map +1 -1
  309. package/es/hooks/useMermaidCdn.d.mts +10 -0
  310. package/es/hooks/useMermaidCdn.mjs +97 -0
  311. package/es/hooks/useMermaidCdn.mjs.map +1 -0
  312. package/es/hooks/useStreamMermaid.mjs +19 -70
  313. package/es/hooks/useStreamMermaid.mjs.map +1 -1
  314. package/es/icons/Auth0/components/Mono.mjs.map +1 -1
  315. package/es/icons/Authelia/components/Color.mjs.map +1 -1
  316. package/es/icons/Authelia/components/Mono.mjs.map +1 -1
  317. package/es/icons/Authentik/components/Color.mjs.map +1 -1
  318. package/es/icons/Authentik/components/Mono.mjs.map +1 -1
  319. package/es/icons/Casdoor/components/Color.mjs.map +1 -1
  320. package/es/icons/Casdoor/components/Mono.mjs.map +1 -1
  321. package/es/icons/Clerk/components/Color.mjs.map +1 -1
  322. package/es/icons/Clerk/components/Mono.mjs.map +1 -1
  323. package/es/icons/DingTalk/components/Color.mjs.map +1 -1
  324. package/es/icons/DingTalk/components/Mono.mjs.map +1 -1
  325. package/es/icons/Discord/components/Color.mjs.map +1 -1
  326. package/es/icons/Discord/components/Mono.mjs.map +1 -1
  327. package/es/icons/GoogleChat/components/Color.mjs.map +1 -1
  328. package/es/icons/GoogleChat/components/Mono.mjs.map +1 -1
  329. package/es/icons/IMessage/components/Color.mjs.map +1 -1
  330. package/es/icons/IMessage/components/Inner.mjs.map +1 -1
  331. package/es/icons/IMessage/components/Mono.mjs.map +1 -1
  332. package/es/icons/Lark/components/Color.mjs.map +1 -1
  333. package/es/icons/Lark/components/Mono.mjs.map +1 -1
  334. package/es/icons/Line/components/Color.mjs.map +1 -1
  335. package/es/icons/Line/components/Mono.mjs.map +1 -1
  336. package/es/icons/Logto/components/Color.mjs.map +1 -1
  337. package/es/icons/Logto/components/Mono.mjs.map +1 -1
  338. package/es/icons/MicrosoftEntra/components/Color.mjs.map +1 -1
  339. package/es/icons/MicrosoftEntra/components/Mono.mjs.map +1 -1
  340. package/es/icons/MicrosoftTeams/components/Color.mjs.map +1 -1
  341. package/es/icons/MicrosoftTeams/components/Mono.mjs.map +1 -1
  342. package/es/icons/NextAuth/components/Color.mjs.map +1 -1
  343. package/es/icons/NextAuth/components/Mono.mjs.map +1 -1
  344. package/es/icons/QQ/components/Color.mjs.map +1 -1
  345. package/es/icons/QQ/components/Mono.mjs.map +1 -1
  346. package/es/icons/Slack/components/Color.mjs.map +1 -1
  347. package/es/icons/Slack/components/Mono.mjs.map +1 -1
  348. package/es/icons/Telegram/components/Color.mjs.map +1 -1
  349. package/es/icons/Telegram/components/Inner.mjs.map +1 -1
  350. package/es/icons/Telegram/components/Mono.mjs.map +1 -1
  351. package/es/icons/WeChat/components/Color.mjs.map +1 -1
  352. package/es/icons/WeChat/components/Mono.mjs.map +1 -1
  353. package/es/icons/WhatsApp/components/Color.mjs.map +1 -1
  354. package/es/icons/WhatsApp/components/Mono.mjs.map +1 -1
  355. package/es/icons/Zitadel/components/Color.mjs.map +1 -1
  356. package/es/icons/Zitadel/components/Mono.mjs.map +1 -1
  357. package/es/index.d.mts +2 -2
  358. package/es/index.mjs +2 -2
  359. package/es/mdx/Callout/index.mjs.map +1 -1
  360. package/es/mdx/Cards/Card.mjs.map +1 -1
  361. package/es/mdx/FileTree/File.mjs.map +1 -1
  362. package/es/mdx/FileTree/Folder.mjs.map +1 -1
  363. package/es/mdx/Mdx/index.mjs.map +1 -1
  364. package/es/mdx/Tabs/Tab.mjs.map +1 -1
  365. package/es/mdx/Tabs/index.mjs.map +1 -1
  366. package/es/mdx/mdxComponents/Citation/PopoverPanel.mjs.map +1 -1
  367. package/es/mdx/mdxComponents/Citation/index.mjs.map +1 -1
  368. package/es/mdx/mdxComponents/CodeBlock.mjs.map +1 -1
  369. package/es/mdx/mdxComponents/Link.mjs.map +1 -1
  370. package/es/mobile/ChatHeader/ChatHeader.mjs.map +1 -1
  371. package/es/mobile/ChatHeader/ChatHeaderTitle.mjs.map +1 -1
  372. package/es/mobile/ChatInputArea/ChatInputArea.mjs.map +1 -1
  373. package/es/mobile/TabBar/TabBar.mjs.map +1 -1
  374. package/es/storybook/StoryBook/index.mjs.map +1 -1
  375. package/package.json +3 -4
@@ -1 +1 @@
1
- {"version":3,"file":"SearchResultCard.mjs","names":["Flexbox"],"sources":["../../../../src/Markdown/components/SearchResultCards/SearchResultCard.tsx"],"sourcesContent":["'use client';\n\nimport { memo, type Ref, useMemo } from 'react';\n\nimport A from '@/A';\nimport Block from '@/Block';\nimport { Flexbox } from '@/Flex';\nimport Img from '@/Img';\nimport Text from '@/Text';\nimport { type AProps } from '@/types';\n\nimport { styles } from './style';\n\nexport interface SearchResultCardProps extends AProps {\n alt?: string;\n ref?: Ref<HTMLAnchorElement>;\n title?: string;\n url: string;\n}\n\nconst SearchResultCard = memo<SearchResultCardProps>(({ ref, url, title, alt, ...rest }) => {\n const [displayTitle, domain, host] = useMemo(() => {\n try {\n const urlObj = new URL(url);\n const domain = urlObj.hostname.replace('www.', '');\n const hostForUrl = urlObj.host;\n\n let displayTitle = title;\n if (title === url) {\n displayTitle = hostForUrl + urlObj.pathname;\n }\n\n return [displayTitle, domain, hostForUrl];\n } catch {\n return [title, url, url];\n }\n }, [url, title]);\n\n return (\n <A href={url} ref={ref} rel=\"noreferrer\" target={'_blank'} {...rest}>\n <Block\n clickable\n className={styles.container}\n gap={2}\n justify={'space-between'}\n key={url}\n paddingBlock={6}\n paddingInline={8}\n variant={'outlined'}\n >\n <Text ellipsis={{ rows: 2 }}>{displayTitle}</Text>\n <Flexbox horizontal align={'center'} gap={4}>\n <Img\n alt={alt || title || url}\n height={14}\n src={`https://icons.duckduckgo.com/ip3/${host}.ico`}\n width={14}\n />\n <Text ellipsis className={styles.url} type={'secondary'}>\n {domain}\n </Text>\n </Flexbox>\n </Block>\n </A>\n );\n});\n\nSearchResultCard.displayName = 'SearchResultCard';\n\nexport default SearchResultCard;\n"],"mappings":";;;;;;;;;;AAoBA,MAAM,mBAAmB,MAA6B,EAAE,KAAK,KAAK,OAAO,KAAK,GAAG,WAAW;CAC1F,MAAM,CAAC,cAAc,QAAQ,QAAQ,cAAc;EACjD,IAAI;GACF,MAAM,SAAS,IAAI,IAAI,GAAG;GAC1B,MAAM,SAAS,OAAO,SAAS,QAAQ,QAAQ,EAAE;GACjD,MAAM,aAAa,OAAO;GAE1B,IAAI,eAAe;GACnB,IAAI,UAAU,KACZ,eAAe,aAAa,OAAO;GAGrC,OAAO;IAAC;IAAc;IAAQ;GAAU;EAC1C,QAAQ;GACN,OAAO;IAAC;IAAO;IAAK;GAAG;EACzB;CACF,GAAG,CAAC,KAAK,KAAK,CAAC;CAEf,OACE,oBAAC,GAAD;EAAG,MAAM;EAAU;EAAK,KAAI;EAAa,QAAQ;EAAU,GAAI;YAC7D,qBAAC,OAAD;GACE,WAAA;GACA,WAAW,OAAO;GAClB,KAAK;GACL,SAAS;GAET,cAAc;GACd,eAAe;GACf,SAAS;aARX,CAUE,oBAAC,MAAD;IAAM,UAAU,EAAE,MAAM,EAAE;cAAI;GAAmB,CAAA,GACjD,qBAACA,mBAAD;IAAS,YAAA;IAAW,OAAO;IAAU,KAAK;cAA1C,CACE,oBAAC,KAAD;KACE,KAAK,OAAO,SAAS;KACrB,QAAQ;KACR,KAAK,oCAAoC,KAAK;KAC9C,OAAO;IACR,CAAA,GACD,oBAAC,MAAD;KAAM,UAAA;KAAS,WAAW,OAAO;KAAK,MAAM;eACzC;IACG,CAAA,CACC;KACJ;KAjBA,GAiBA;CACN,CAAA;AAEP,CAAC;AAED,iBAAiB,cAAc"}
1
+ {"version":3,"file":"SearchResultCard.mjs","names":["Flexbox"],"sources":["../../../../src/Markdown/components/SearchResultCards/SearchResultCard.tsx"],"sourcesContent":["'use client';\n\nimport { memo, type Ref, useMemo } from 'react';\n\nimport A from '@/A';\nimport Block from '@/Block';\nimport { Flexbox } from '@/Flex';\nimport Img from '@/Img';\nimport Text from '@/Text';\nimport { type AProps } from '@/types';\n\nimport { styles } from './style';\n\nexport interface SearchResultCardProps extends AProps {\n alt?: string;\n ref?: Ref<HTMLAnchorElement>;\n title?: string;\n url: string;\n}\n\nconst SearchResultCard = memo<SearchResultCardProps>(({ ref, url, title, alt, ...rest }) => {\n const [displayTitle, domain, host] = useMemo(() => {\n try {\n const urlObj = new URL(url);\n const domain = urlObj.hostname.replace('www.', '');\n const hostForUrl = urlObj.host;\n\n let displayTitle = title;\n if (title === url) {\n displayTitle = hostForUrl + urlObj.pathname;\n }\n\n return [displayTitle, domain, hostForUrl];\n } catch {\n return [title, url, url];\n }\n }, [url, title]);\n\n return (\n <A href={url} ref={ref} rel=\"noreferrer\" target={'_blank'} {...rest}>\n <Block\n clickable\n className={styles.container}\n gap={2}\n justify={'space-between'}\n key={url}\n paddingBlock={6}\n paddingInline={8}\n variant={'outlined'}\n >\n <Text ellipsis={{ rows: 2 }}>{displayTitle}</Text>\n <Flexbox horizontal align={'center'} gap={4}>\n <Img\n alt={alt || title || url}\n height={14}\n src={`https://icons.duckduckgo.com/ip3/${host}.ico`}\n width={14}\n />\n <Text ellipsis className={styles.url} type={'secondary'}>\n {domain}\n </Text>\n </Flexbox>\n </Block>\n </A>\n );\n});\n\nSearchResultCard.displayName = 'SearchResultCard';\n\nexport default SearchResultCard;\n"],"mappings":";;;;;;;;;;AAoBA,MAAM,mBAAmB,MAA6B,EAAE,KAAK,KAAK,OAAO,KAAK,GAAG,WAAW;CAC1F,MAAM,CAAC,cAAc,QAAQ,QAAQ,cAAc;EACjD,IAAI;GACF,MAAM,SAAS,IAAI,IAAI,GAAG;GAC1B,MAAM,SAAS,OAAO,SAAS,QAAQ,QAAQ,EAAE;GACjD,MAAM,aAAa,OAAO;GAE1B,IAAI,eAAe;GACnB,IAAI,UAAU,KACZ,eAAe,aAAa,OAAO;GAGrC,OAAO;IAAC;IAAc;IAAQ;GAAU;EAC1C,QAAQ;GACN,OAAO;IAAC;IAAO;IAAK;GAAG;EACzB;CACF,GAAG,CAAC,KAAK,KAAK,CAAC;CAEf,OACE,oBAAC,GAAD;EAAG,MAAM;EAAU;EAAK,KAAI;EAAa,QAAQ;EAAU,GAAI;EAC7D,UAAA,qBAAC,OAAD;GACE,WAAA;GACA,WAAW,OAAO;GAClB,KAAK;GACL,SAAS;GAET,cAAc;GACd,eAAe;GACf,SAAS;GARX,UAAA,CAUE,oBAAC,MAAD;IAAM,UAAU,EAAE,MAAM,EAAE;IAAI,UAAA;GAAmB,CAAA,GACjD,qBAACA,mBAAD;IAAS,YAAA;IAAW,OAAO;IAAU,KAAK;IAA1C,UAAA,CACE,oBAAC,KAAD;KACE,KAAK,OAAO,SAAS;KACrB,QAAQ;KACR,KAAK,oCAAoC,KAAK;KAC9C,OAAO;IACR,CAAA,GACD,oBAAC,MAAD;KAAM,UAAA;KAAS,WAAW,OAAO;KAAK,MAAM;KACzC,UAAA;IACG,CAAA,CACC;GACJ,CAAA,CAAA;EAjBA,GAAA,GAiBA;CACN,CAAA;AAEP,CAAC;AAED,iBAAiB,cAAc"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":[],"sources":["../../../../src/Markdown/components/SearchResultCards/index.tsx"],"sourcesContent":["'use client';\n\nimport { memo, type Ref } from 'react';\n\nimport { type FlexboxProps } from '@/Flex';\nimport ScrollShadow from '@/ScrollShadow';\n\nimport SearchResultCard from './SearchResultCard';\n\nexport interface SearchResultItem {\n alt?: string;\n summary?: string;\n title?: string;\n url: string;\n}\n\nexport interface SearchResultCardsProps extends FlexboxProps {\n dataSource: string[] | SearchResultItem[];\n ref?: Ref<HTMLDivElement>;\n}\n\nconst SearchResultCards = memo<SearchResultCardsProps>(({ ref, dataSource, style, ...rest }) => {\n return (\n <ScrollShadow\n hideScrollBar\n horizontal\n gap={12}\n orientation={'horizontal'}\n ref={ref}\n size={10}\n style={{ minHeight: 80, overflowX: 'scroll', paddingInlineEnd: 24, width: '100%', ...style }}\n {...rest}\n >\n {dataSource.map((link) =>\n typeof link === 'string' ? (\n <SearchResultCard key={link} url={link} />\n ) : (\n <SearchResultCard key={link.url} {...link} />\n ),\n )}\n </ScrollShadow>\n );\n});\n\nSearchResultCards.displayName = 'SearchResultCards';\n\nexport default SearchResultCards;\n"],"mappings":";;;;;;AAqBA,MAAM,oBAAoB,MAA8B,EAAE,KAAK,YAAY,OAAO,GAAG,WAAW;CAC9F,OACE,oBAAC,cAAD;EACE,eAAA;EACA,YAAA;EACA,KAAK;EACL,aAAa;EACR;EACL,MAAM;EACN,OAAO;GAAE,WAAW;GAAI,WAAW;GAAU,kBAAkB;GAAI,OAAO;GAAQ,GAAG;EAAM;EAC3F,GAAI;YAEH,WAAW,KAAK,SACf,OAAO,SAAS,WACd,oBAAC,kBAAD,EAA6B,KAAK,KAAO,GAAlB,IAAkB,IAEzC,oBAAC,kBAAD,EAAiC,GAAI,KAAO,GAArB,KAAK,GAAgB,CAEhD;CACY,CAAA;AAElB,CAAC;AAED,kBAAkB,cAAc"}
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../../../../src/Markdown/components/SearchResultCards/index.tsx"],"sourcesContent":["'use client';\n\nimport { memo, type Ref } from 'react';\n\nimport { type FlexboxProps } from '@/Flex';\nimport ScrollShadow from '@/ScrollShadow';\n\nimport SearchResultCard from './SearchResultCard';\n\nexport interface SearchResultItem {\n alt?: string;\n summary?: string;\n title?: string;\n url: string;\n}\n\nexport interface SearchResultCardsProps extends FlexboxProps {\n dataSource: string[] | SearchResultItem[];\n ref?: Ref<HTMLDivElement>;\n}\n\nconst SearchResultCards = memo<SearchResultCardsProps>(({ ref, dataSource, style, ...rest }) => {\n return (\n <ScrollShadow\n hideScrollBar\n horizontal\n gap={12}\n orientation={'horizontal'}\n ref={ref}\n size={10}\n style={{ minHeight: 80, overflowX: 'scroll', paddingInlineEnd: 24, width: '100%', ...style }}\n {...rest}\n >\n {dataSource.map((link) =>\n typeof link === 'string' ? (\n <SearchResultCard key={link} url={link} />\n ) : (\n <SearchResultCard key={link.url} {...link} />\n ),\n )}\n </ScrollShadow>\n );\n});\n\nSearchResultCards.displayName = 'SearchResultCards';\n\nexport default SearchResultCards;\n"],"mappings":";;;;;;AAqBA,MAAM,oBAAoB,MAA8B,EAAE,KAAK,YAAY,OAAO,GAAG,WAAW;CAC9F,OACE,oBAAC,cAAD;EACE,eAAA;EACA,YAAA;EACA,KAAK;EACL,aAAa;EACR;EACL,MAAM;EACN,OAAO;GAAE,WAAW;GAAI,WAAW;GAAU,kBAAkB;GAAI,OAAO;GAAQ,GAAG;EAAM;EAC3F,GAAI;EAEH,UAAA,WAAW,KAAK,SACf,OAAO,SAAS,WACd,oBAAC,kBAAD,EAA6B,KAAK,KAAO,GAAlB,IAAkB,IAEzC,oBAAC,kBAAD,EAAiC,GAAI,KAAO,GAArB,KAAK,GAAgB,CAEhD;CACY,CAAA;AAElB,CAAC;AAED,kBAAkB,cAAc"}
@@ -1 +1 @@
1
- {"version":3,"file":"MaterialFileTypeIcon.mjs","names":[],"sources":["../../src/MaterialFileTypeIcon/MaterialFileTypeIcon.tsx"],"sourcesContent":["'use client';\n\nimport { type FC, useMemo } from 'react';\n\nimport { useCdnFn } from '@/ConfigProvider';\nimport FileTypeIcon from '@/FileTypeIcon';\nimport { Center } from '@/Flex';\nimport Img from '@/Img';\n\nimport type { MaterialFileTypeIconProps } from './type';\nimport { getIconUrlForDirectoryPath, getIconUrlForFilePath } from './utils';\n\nconst MaterialFileTypeIcon: FC<MaterialFileTypeIconProps> = ({\n fallbackUnknownType = true,\n filename,\n size = 48,\n variant = 'raw',\n type,\n style,\n open,\n ...rest\n}) => {\n const genCdnUrl = useCdnFn();\n const ICONS_URL = genCdnUrl({\n path: 'assets',\n pkg: '@lobehub/assets-fileicon',\n version: '1.0.0',\n });\n\n const iconUrl: string = useMemo(() => {\n return type === 'file'\n ? getIconUrlForFilePath({ fallbackUnknownType, iconsUrl: ICONS_URL, path: filename })\n : getIconUrlForDirectoryPath({\n fallbackUnknownType,\n iconsUrl: ICONS_URL,\n open,\n path: filename,\n });\n }, [ICONS_URL, type, filename, open]);\n\n if (!iconUrl)\n return (\n <FileTypeIcon\n className={rest.className}\n filetype={filename.split('.')[1]}\n size={size}\n type={type}\n variant={'mono'}\n />\n );\n\n if (variant === 'raw')\n return <Img alt={filename} height={size} src={iconUrl} style={style} width={size} {...rest} />;\n\n return (\n <Center\n flex={'none'}\n height={size}\n style={{ position: 'relative', ...style }}\n width={size}\n {...rest}\n >\n <FileTypeIcon size={size} type={variant} variant={'mono'} />\n <Img\n alt={filename}\n height={size / 2}\n src={iconUrl}\n style={{ position: 'absolute', top: size / 3 }}\n width={size / 2}\n {...rest}\n />\n </Center>\n );\n};\n\nMaterialFileTypeIcon.displayName = 'MaterialFileTypeIcon';\n\nexport default MaterialFileTypeIcon;\n"],"mappings":";;;;;;;;;AAYA,MAAM,wBAAuD,EAC3D,sBAAsB,MACtB,UACA,OAAO,IACP,UAAU,OACV,MACA,OACA,MACA,GAAG,WACC;CAEJ,MAAM,YADY,SACQ,CAAC,CAAC;EAC1B,MAAM;EACN,KAAK;EACL,SAAS;CACX,CAAC;CAED,MAAM,UAAkB,cAAc;EACpC,OAAO,SAAS,SACZ,sBAAsB;GAAE;GAAqB,UAAU;GAAW,MAAM;EAAS,CAAC,IAClF,2BAA2B;GACzB;GACA,UAAU;GACV;GACA,MAAM;EACR,CAAC;CACP,GAAG;EAAC;EAAW;EAAM;EAAU;CAAI,CAAC;CAEpC,IAAI,CAAC,SACH,OACE,oBAAC,cAAD;EACE,WAAW,KAAK;EAChB,UAAU,SAAS,MAAM,GAAG,CAAC,CAAC;EACxB;EACA;EACN,SAAS;CACV,CAAA;CAGL,IAAI,YAAY,OACd,OAAO,oBAAC,KAAD;EAAK,KAAK;EAAU,QAAQ;EAAM,KAAK;EAAgB;EAAO,OAAO;EAAM,GAAI;CAAO,CAAA;CAE/F,OACE,qBAAC,QAAD;EACE,MAAM;EACN,QAAQ;EACR,OAAO;GAAE,UAAU;GAAY,GAAG;EAAM;EACxC,OAAO;EACP,GAAI;YALN,CAOE,oBAAC,cAAD;GAAoB;GAAM,MAAM;GAAS,SAAS;EAAS,CAAA,GAC3D,oBAAC,KAAD;GACE,KAAK;GACL,QAAQ,OAAO;GACf,KAAK;GACL,OAAO;IAAE,UAAU;IAAY,KAAK,OAAO;GAAE;GAC7C,OAAO,OAAO;GACd,GAAI;EACL,CAAA,CACK;;AAEZ;AAEA,qBAAqB,cAAc"}
1
+ {"version":3,"file":"MaterialFileTypeIcon.mjs","names":[],"sources":["../../src/MaterialFileTypeIcon/MaterialFileTypeIcon.tsx"],"sourcesContent":["'use client';\n\nimport { type FC, useMemo } from 'react';\n\nimport { useCdnFn } from '@/ConfigProvider';\nimport FileTypeIcon from '@/FileTypeIcon';\nimport { Center } from '@/Flex';\nimport Img from '@/Img';\n\nimport type { MaterialFileTypeIconProps } from './type';\nimport { getIconUrlForDirectoryPath, getIconUrlForFilePath } from './utils';\n\nconst MaterialFileTypeIcon: FC<MaterialFileTypeIconProps> = ({\n fallbackUnknownType = true,\n filename,\n size = 48,\n variant = 'raw',\n type,\n style,\n open,\n ...rest\n}) => {\n const genCdnUrl = useCdnFn();\n const ICONS_URL = genCdnUrl({\n path: 'assets',\n pkg: '@lobehub/assets-fileicon',\n version: '1.0.0',\n });\n\n const iconUrl: string = useMemo(() => {\n return type === 'file'\n ? getIconUrlForFilePath({ fallbackUnknownType, iconsUrl: ICONS_URL, path: filename })\n : getIconUrlForDirectoryPath({\n fallbackUnknownType,\n iconsUrl: ICONS_URL,\n open,\n path: filename,\n });\n }, [ICONS_URL, type, filename, open]);\n\n if (!iconUrl)\n return (\n <FileTypeIcon\n className={rest.className}\n filetype={filename.split('.')[1]}\n size={size}\n type={type}\n variant={'mono'}\n />\n );\n\n if (variant === 'raw')\n return <Img alt={filename} height={size} src={iconUrl} style={style} width={size} {...rest} />;\n\n return (\n <Center\n flex={'none'}\n height={size}\n style={{ position: 'relative', ...style }}\n width={size}\n {...rest}\n >\n <FileTypeIcon size={size} type={variant} variant={'mono'} />\n <Img\n alt={filename}\n height={size / 2}\n src={iconUrl}\n style={{ position: 'absolute', top: size / 3 }}\n width={size / 2}\n {...rest}\n />\n </Center>\n );\n};\n\nMaterialFileTypeIcon.displayName = 'MaterialFileTypeIcon';\n\nexport default MaterialFileTypeIcon;\n"],"mappings":";;;;;;;;;AAYA,MAAM,wBAAuD,EAC3D,sBAAsB,MACtB,UACA,OAAO,IACP,UAAU,OACV,MACA,OACA,MACA,GAAG,WACC;CAEJ,MAAM,YADY,SACQ,CAAC,CAAC;EAC1B,MAAM;EACN,KAAK;EACL,SAAS;CACX,CAAC;CAED,MAAM,UAAkB,cAAc;EACpC,OAAO,SAAS,SACZ,sBAAsB;GAAE;GAAqB,UAAU;GAAW,MAAM;EAAS,CAAC,IAClF,2BAA2B;GACzB;GACA,UAAU;GACV;GACA,MAAM;EACR,CAAC;CACP,GAAG;EAAC;EAAW;EAAM;EAAU;CAAI,CAAC;CAEpC,IAAI,CAAC,SACH,OACE,oBAAC,cAAD;EACE,WAAW,KAAK;EAChB,UAAU,SAAS,MAAM,GAAG,CAAC,CAAC;EACxB;EACA;EACN,SAAS;CACV,CAAA;CAGL,IAAI,YAAY,OACd,OAAO,oBAAC,KAAD;EAAK,KAAK;EAAU,QAAQ;EAAM,KAAK;EAAgB;EAAO,OAAO;EAAM,GAAI;CAAO,CAAA;CAE/F,OACE,qBAAC,QAAD;EACE,MAAM;EACN,QAAQ;EACR,OAAO;GAAE,UAAU;GAAY,GAAG;EAAM;EACxC,OAAO;EACP,GAAI;EALN,UAAA,CAOE,oBAAC,cAAD;GAAoB;GAAM,MAAM;GAAS,SAAS;EAAS,CAAA,GAC3D,oBAAC,KAAD;GACE,KAAK;GACL,QAAQ,OAAO;GACf,KAAK;GACL,OAAO;IAAE,UAAU;IAAY,KAAK,OAAO;GAAE;GAC7C,OAAO,OAAO;GACd,GAAI;EACL,CAAA,CACK;;AAEZ;AAEA,qBAAqB,cAAc"}
@@ -1 +1 @@
1
- {"version":3,"file":"Menu.mjs","names":["Menu","AntdMenu"],"sources":["../../src/Menu/Menu.tsx"],"sourcesContent":["'use client';\n\nimport { ConfigProvider, Menu as AntdMenu } from 'antd';\nimport { cx, useTheme } from 'antd-style';\nimport { memo, useMemo } from 'react';\n\nimport { IconProvider } from '@/Icon';\nimport { mapItems } from '@/Menu/utils';\n\nimport { variants } from './style';\nimport { type MenuProps } from './type';\n\nconst Menu = memo<MenuProps>(\n ({\n compact,\n shadow,\n variant = 'borderless',\n className,\n selectable,\n iconProps,\n items,\n ref,\n ...rest\n }) => {\n const theme = useTheme();\n\n const antdItems = useMemo(() => items.map((item) => mapItems(item)), [items]);\n\n return (\n <ConfigProvider\n theme={{\n components: {\n Menu: {\n controlHeightLG: 36,\n iconMarginInlineEnd: 8,\n iconSize: 16,\n itemActiveBg: theme.isDarkMode ? theme.colorFillQuaternary : theme.colorFillSecondary,\n itemBorderRadius: theme.borderRadius,\n itemColor: theme.colorTextSecondary,\n itemHoverBg: theme.colorFillTertiary,\n itemMarginBlock: 4,\n itemMarginInline: 4,\n itemSelectedBg: theme.colorFillSecondary,\n },\n },\n }}\n >\n <IconProvider\n config={{\n size: 'small',\n ...iconProps,\n }}\n >\n <AntdMenu\n className={cx(variants({ compact, shadow, variant }), className)}\n inlineIndent={12}\n items={antdItems}\n mode=\"vertical\"\n ref={ref}\n selectable={selectable}\n {...rest}\n />\n </IconProvider>\n </ConfigProvider>\n );\n },\n);\n\nMenu.displayName = 'Menu';\n\nexport default Menu;\n"],"mappings":";;;;;;;;;AAYA,MAAMA,SAAO,MACV,EACC,SACA,QACA,UAAU,cACV,WACA,YACA,WACA,OACA,KACA,GAAG,WACC;CACJ,MAAM,QAAQ,SAAS;CAEvB,MAAM,YAAY,cAAc,MAAM,KAAK,SAAS,SAAS,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;CAE5E,OACE,oBAAC,gBAAD;EACE,OAAO,EACL,YAAY,EACV,MAAM;GACJ,iBAAiB;GACjB,qBAAqB;GACrB,UAAU;GACV,cAAc,MAAM,aAAa,MAAM,sBAAsB,MAAM;GACnE,kBAAkB,MAAM;GACxB,WAAW,MAAM;GACjB,aAAa,MAAM;GACnB,iBAAiB;GACjB,kBAAkB;GAClB,gBAAgB,MAAM;EACxB,EACF,EACF;YAEA,oBAAC,cAAD;GACE,QAAQ;IACN,MAAM;IACN,GAAG;GACL;aAEA,oBAACC,MAAD;IACE,WAAW,GAAG,SAAS;KAAE;KAAS;KAAQ;IAAQ,CAAC,GAAG,SAAS;IAC/D,cAAc;IACd,OAAO;IACP,MAAK;IACA;IACO;IACZ,GAAI;GACL,CAAA;EACW,CAAA;CACA,CAAA;AAEpB,CACF;AAEA,OAAK,cAAc"}
1
+ {"version":3,"file":"Menu.mjs","names":["Menu","AntdMenu"],"sources":["../../src/Menu/Menu.tsx"],"sourcesContent":["'use client';\n\nimport { ConfigProvider, Menu as AntdMenu } from 'antd';\nimport { cx, useTheme } from 'antd-style';\nimport { memo, useMemo } from 'react';\n\nimport { IconProvider } from '@/Icon';\nimport { mapItems } from '@/Menu/utils';\n\nimport { variants } from './style';\nimport { type MenuProps } from './type';\n\nconst Menu = memo<MenuProps>(\n ({\n compact,\n shadow,\n variant = 'borderless',\n className,\n selectable,\n iconProps,\n items,\n ref,\n ...rest\n }) => {\n const theme = useTheme();\n\n const antdItems = useMemo(() => items.map((item) => mapItems(item)), [items]);\n\n return (\n <ConfigProvider\n theme={{\n components: {\n Menu: {\n controlHeightLG: 36,\n iconMarginInlineEnd: 8,\n iconSize: 16,\n itemActiveBg: theme.isDarkMode ? theme.colorFillQuaternary : theme.colorFillSecondary,\n itemBorderRadius: theme.borderRadius,\n itemColor: theme.colorTextSecondary,\n itemHoverBg: theme.colorFillTertiary,\n itemMarginBlock: 4,\n itemMarginInline: 4,\n itemSelectedBg: theme.colorFillSecondary,\n },\n },\n }}\n >\n <IconProvider\n config={{\n size: 'small',\n ...iconProps,\n }}\n >\n <AntdMenu\n className={cx(variants({ compact, shadow, variant }), className)}\n inlineIndent={12}\n items={antdItems}\n mode=\"vertical\"\n ref={ref}\n selectable={selectable}\n {...rest}\n />\n </IconProvider>\n </ConfigProvider>\n );\n },\n);\n\nMenu.displayName = 'Menu';\n\nexport default Menu;\n"],"mappings":";;;;;;;;;AAYA,MAAMA,SAAO,MACV,EACC,SACA,QACA,UAAU,cACV,WACA,YACA,WACA,OACA,KACA,GAAG,WACC;CACJ,MAAM,QAAQ,SAAS;CAEvB,MAAM,YAAY,cAAc,MAAM,KAAK,SAAS,SAAS,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;CAE5E,OACE,oBAAC,gBAAD;EACE,OAAO,EACL,YAAY,EACV,MAAM;GACJ,iBAAiB;GACjB,qBAAqB;GACrB,UAAU;GACV,cAAc,MAAM,aAAa,MAAM,sBAAsB,MAAM;GACnE,kBAAkB,MAAM;GACxB,WAAW,MAAM;GACjB,aAAa,MAAM;GACnB,iBAAiB;GACjB,kBAAkB;GAClB,gBAAgB,MAAM;EACxB,EACF,EACF;EAEA,UAAA,oBAAC,cAAD;GACE,QAAQ;IACN,MAAM;IACN,GAAG;GACL;GAEA,UAAA,oBAACC,MAAD;IACE,WAAW,GAAG,SAAS;KAAE;KAAS;KAAQ;IAAQ,CAAC,GAAG,SAAS;IAC/D,cAAc;IACd,OAAO;IACP,MAAK;IACA;IACO;IACZ,GAAI;GACL,CAAA;EACW,CAAA;CACA,CAAA;AAEpB,CACF;AAEA,OAAK,cAAc"}
@@ -1 +1 @@
1
- {"version":3,"file":"FullFeatured.mjs","names":["Flexbox"],"sources":["../../src/Mermaid/FullFeatured.tsx"],"sourcesContent":["'use client';\n\nimport { cx } from 'antd-style';\nimport { ChevronDown, ChevronRight } from 'lucide-react';\nimport { memo, type ReactNode, useCallback, useEffect, useMemo, useRef, useState } from 'react';\n\nimport ActionIcon from '@/ActionIcon';\nimport CopyButton from '@/CopyButton';\nimport { Flexbox } from '@/Flex';\nimport { bodyVariants, headerVariants, variants } from '@/Highlighter/style';\nimport MaterialFileTypeIcon from '@/MaterialFileTypeIcon';\nimport Text from '@/Text';\nimport { stopPropagation } from '@/utils/dom';\n\nimport { type MermaidProps } from './type';\n\nconst MermaidHeaderLanguage = memo(\n ({\n fileName,\n language,\n showLanguage,\n }: {\n fileName?: string;\n language: string;\n showLanguage?: boolean;\n }) => {\n if (!showLanguage) return null;\n\n return (\n <Flexbox\n horizontal\n align={'center'}\n className={'languageTitle'}\n flex={1}\n gap={4}\n justify={'flex-start'}\n paddingInline={8}\n >\n <MaterialFileTypeIcon\n fallbackUnknownType={false}\n filename={fileName || language}\n size={18}\n type={'file'}\n variant={'raw'}\n />\n\n <Text ellipsis fontSize={13}>\n {fileName || 'Mermaid'}\n </Text>\n </Flexbox>\n );\n },\n (prev, next) =>\n prev.fileName === next.fileName &&\n prev.language === next.language &&\n prev.showLanguage === next.showLanguage,\n);\n\nexport interface MermaidFullFeaturedProps extends Omit<MermaidProps, 'children'> {\n children: ReactNode;\n content: string;\n}\n\nexport const MermaidFullFeatured = memo<MermaidFullFeaturedProps>(\n ({\n showLanguage,\n styles: customStyles,\n classNames,\n content,\n children,\n className,\n copyable,\n actionsRender,\n style,\n variant,\n shadow,\n language = 'mermaid',\n fileName,\n defaultExpand = true,\n ...rest\n }) => {\n const [expand, setExpand] = useState(defaultExpand);\n const contentRef = useRef(content);\n\n useEffect(() => {\n contentRef.current = content;\n }, [content]);\n\n const getContent = useCallback(() => contentRef.current, []);\n\n const originalActions = useMemo(() => {\n if (!copyable) return null;\n return <CopyButton content={getContent} size={'small'} />;\n }, [copyable, getContent]);\n\n const actions = useMemo(() => {\n if (!actionsRender) return originalActions;\n return actionsRender({\n actionIconSize: 'small',\n content,\n getContent,\n originalNode: originalActions,\n });\n }, [actionsRender, content, getContent, originalActions]);\n\n const handleToggleExpand = useCallback(() => {\n setExpand((prev) => !prev);\n }, []);\n\n return (\n <Flexbox\n className={cx(variants({ shadow, variant }), className)}\n data-code-type=\"mermaid\"\n style={style}\n {...rest}\n >\n <Flexbox\n horizontal\n align={'center'}\n className={cx(headerVariants({ variant }), classNames?.header)}\n justify={'space-between'}\n style={customStyles?.header}\n onClick={handleToggleExpand}\n >\n <MermaidHeaderLanguage\n fileName={fileName}\n language={language}\n showLanguage={showLanguage}\n />\n <Flexbox horizontal align={'center'} flex={'none'} gap={4} onClick={stopPropagation}>\n <Flexbox horizontal align={'center'} className={'panel-actions'} flex={'none'} gap={4}>\n {actions}\n </Flexbox>\n <ActionIcon\n icon={expand ? ChevronDown : ChevronRight}\n size={'small'}\n onClick={handleToggleExpand}\n />\n </Flexbox>\n </Flexbox>\n <Flexbox\n className={cx(bodyVariants({ expand }), classNames?.body)}\n style={customStyles?.body}\n >\n {children}\n </Flexbox>\n </Flexbox>\n );\n },\n);\n\nexport default MermaidFullFeatured;\n"],"mappings":";;;;;;;;;;;;;AAgBA,MAAM,wBAAwB,MAC3B,EACC,UACA,UACA,mBAKI;CACJ,IAAI,CAAC,cAAc,OAAO;CAE1B,OACE,qBAACA,mBAAD;EACE,YAAA;EACA,OAAO;EACP,WAAW;EACX,MAAM;EACN,KAAK;EACL,SAAS;EACT,eAAe;YAPjB,CASE,oBAAC,sBAAD;GACE,qBAAqB;GACrB,UAAU,YAAY;GACtB,MAAM;GACN,MAAM;GACN,SAAS;EACV,CAAA,GAED,oBAAC,MAAD;GAAM,UAAA;GAAS,UAAU;aACtB,YAAY;EACT,CAAA,CACC;;AAEb,IACC,MAAM,SACL,KAAK,aAAa,KAAK,YACvB,KAAK,aAAa,KAAK,YACvB,KAAK,iBAAiB,KAAK,YAC/B;AAOA,MAAa,sBAAsB,MAChC,EACC,cACA,QAAQ,cACR,YACA,SACA,UACA,WACA,UACA,eACA,OACA,SACA,QACA,WAAW,WACX,UACA,gBAAgB,MAChB,GAAG,WACC;CACJ,MAAM,CAAC,QAAQ,aAAa,SAAS,aAAa;CAClD,MAAM,aAAa,OAAO,OAAO;CAEjC,gBAAgB;EACd,WAAW,UAAU;CACvB,GAAG,CAAC,OAAO,CAAC;CAEZ,MAAM,aAAa,kBAAkB,WAAW,SAAS,CAAC,CAAC;CAE3D,MAAM,kBAAkB,cAAc;EACpC,IAAI,CAAC,UAAU,OAAO;EACtB,OAAO,oBAAC,YAAD;GAAY,SAAS;GAAY,MAAM;EAAU,CAAA;CAC1D,GAAG,CAAC,UAAU,UAAU,CAAC;CAEzB,MAAM,UAAU,cAAc;EAC5B,IAAI,CAAC,eAAe,OAAO;EAC3B,OAAO,cAAc;GACnB,gBAAgB;GAChB;GACA;GACA,cAAc;EAChB,CAAC;CACH,GAAG;EAAC;EAAe;EAAS;EAAY;CAAe,CAAC;CAExD,MAAM,qBAAqB,kBAAkB;EAC3C,WAAW,SAAS,CAAC,IAAI;CAC3B,GAAG,CAAC,CAAC;CAEL,OACE,qBAACA,mBAAD;EACE,WAAW,GAAG,SAAS;GAAE;GAAQ;EAAQ,CAAC,GAAG,SAAS;EACtD,kBAAe;EACR;EACP,GAAI;YAJN,CAME,qBAACA,mBAAD;GACE,YAAA;GACA,OAAO;GACP,WAAW,GAAG,eAAe,EAAE,QAAQ,CAAC,GAAG,YAAY,MAAM;GAC7D,SAAS;GACT,OAAO,cAAc;GACrB,SAAS;aANX,CAQE,oBAAC,uBAAD;IACY;IACA;IACI;GACf,CAAA,GACD,qBAACA,mBAAD;IAAS,YAAA;IAAW,OAAO;IAAU,MAAM;IAAQ,KAAK;IAAG,SAAS;cAApE,CACE,oBAACA,mBAAD;KAAS,YAAA;KAAW,OAAO;KAAU,WAAW;KAAiB,MAAM;KAAQ,KAAK;eACjF;IACM,CAAA,GACT,oBAAC,YAAD;KACE,MAAM,SAAS,cAAc;KAC7B,MAAM;KACN,SAAS;IACV,CAAA,CACM;KACF;MACT,oBAACA,mBAAD;GACE,WAAW,GAAG,aAAa,EAAE,OAAO,CAAC,GAAG,YAAY,IAAI;GACxD,OAAO,cAAc;GAEpB;EACM,CAAA,CACF;;AAEb,CACF"}
1
+ {"version":3,"file":"FullFeatured.mjs","names":["Flexbox"],"sources":["../../src/Mermaid/FullFeatured.tsx"],"sourcesContent":["'use client';\n\nimport { cx } from 'antd-style';\nimport { ChevronDown, ChevronRight } from 'lucide-react';\nimport { memo, type ReactNode, useCallback, useEffect, useMemo, useRef, useState } from 'react';\n\nimport ActionIcon from '@/ActionIcon';\nimport CopyButton from '@/CopyButton';\nimport { Flexbox } from '@/Flex';\nimport { bodyVariants, headerVariants, variants } from '@/Highlighter/style';\nimport MaterialFileTypeIcon from '@/MaterialFileTypeIcon';\nimport Text from '@/Text';\nimport { stopPropagation } from '@/utils/dom';\n\nimport { type MermaidProps } from './type';\n\nconst MermaidHeaderLanguage = memo(\n ({\n fileName,\n language,\n showLanguage,\n }: {\n fileName?: string;\n language: string;\n showLanguage?: boolean;\n }) => {\n if (!showLanguage) return null;\n\n return (\n <Flexbox\n horizontal\n align={'center'}\n className={'languageTitle'}\n flex={1}\n gap={4}\n justify={'flex-start'}\n paddingInline={8}\n >\n <MaterialFileTypeIcon\n fallbackUnknownType={false}\n filename={fileName || language}\n size={18}\n type={'file'}\n variant={'raw'}\n />\n\n <Text ellipsis fontSize={13}>\n {fileName || 'Mermaid'}\n </Text>\n </Flexbox>\n );\n },\n (prev, next) =>\n prev.fileName === next.fileName &&\n prev.language === next.language &&\n prev.showLanguage === next.showLanguage,\n);\n\nexport interface MermaidFullFeaturedProps extends Omit<MermaidProps, 'children'> {\n children: ReactNode;\n content: string;\n}\n\nexport const MermaidFullFeatured = memo<MermaidFullFeaturedProps>(\n ({\n showLanguage,\n styles: customStyles,\n classNames,\n content,\n children,\n className,\n copyable,\n actionsRender,\n style,\n variant,\n shadow,\n language = 'mermaid',\n fileName,\n defaultExpand = true,\n ...rest\n }) => {\n const [expand, setExpand] = useState(defaultExpand);\n const contentRef = useRef(content);\n\n useEffect(() => {\n contentRef.current = content;\n }, [content]);\n\n const getContent = useCallback(() => contentRef.current, []);\n\n const originalActions = useMemo(() => {\n if (!copyable) return null;\n return <CopyButton content={getContent} size={'small'} />;\n }, [copyable, getContent]);\n\n const actions = useMemo(() => {\n if (!actionsRender) return originalActions;\n return actionsRender({\n actionIconSize: 'small',\n content,\n getContent,\n originalNode: originalActions,\n });\n }, [actionsRender, content, getContent, originalActions]);\n\n const handleToggleExpand = useCallback(() => {\n setExpand((prev) => !prev);\n }, []);\n\n return (\n <Flexbox\n className={cx(variants({ shadow, variant }), className)}\n data-code-type=\"mermaid\"\n style={style}\n {...rest}\n >\n <Flexbox\n horizontal\n align={'center'}\n className={cx(headerVariants({ variant }), classNames?.header)}\n justify={'space-between'}\n style={customStyles?.header}\n onClick={handleToggleExpand}\n >\n <MermaidHeaderLanguage\n fileName={fileName}\n language={language}\n showLanguage={showLanguage}\n />\n <Flexbox horizontal align={'center'} flex={'none'} gap={4} onClick={stopPropagation}>\n <Flexbox horizontal align={'center'} className={'panel-actions'} flex={'none'} gap={4}>\n {actions}\n </Flexbox>\n <ActionIcon\n icon={expand ? ChevronDown : ChevronRight}\n size={'small'}\n onClick={handleToggleExpand}\n />\n </Flexbox>\n </Flexbox>\n <Flexbox\n className={cx(bodyVariants({ expand }), classNames?.body)}\n style={customStyles?.body}\n >\n {children}\n </Flexbox>\n </Flexbox>\n );\n },\n);\n\nexport default MermaidFullFeatured;\n"],"mappings":";;;;;;;;;;;;;AAgBA,MAAM,wBAAwB,MAC3B,EACC,UACA,UACA,mBAKI;CACJ,IAAI,CAAC,cAAc,OAAO;CAE1B,OACE,qBAACA,mBAAD;EACE,YAAA;EACA,OAAO;EACP,WAAW;EACX,MAAM;EACN,KAAK;EACL,SAAS;EACT,eAAe;EAPjB,UAAA,CASE,oBAAC,sBAAD;GACE,qBAAqB;GACrB,UAAU,YAAY;GACtB,MAAM;GACN,MAAM;GACN,SAAS;EACV,CAAA,GAED,oBAAC,MAAD;GAAM,UAAA;GAAS,UAAU;GACtB,UAAA,YAAY;EACT,CAAA,CACC;;AAEb,IACC,MAAM,SACL,KAAK,aAAa,KAAK,YACvB,KAAK,aAAa,KAAK,YACvB,KAAK,iBAAiB,KAAK,YAC/B;AAOA,MAAa,sBAAsB,MAChC,EACC,cACA,QAAQ,cACR,YACA,SACA,UACA,WACA,UACA,eACA,OACA,SACA,QACA,WAAW,WACX,UACA,gBAAgB,MAChB,GAAG,WACC;CACJ,MAAM,CAAC,QAAQ,aAAa,SAAS,aAAa;CAClD,MAAM,aAAa,OAAO,OAAO;CAEjC,gBAAgB;EACd,WAAW,UAAU;CACvB,GAAG,CAAC,OAAO,CAAC;CAEZ,MAAM,aAAa,kBAAkB,WAAW,SAAS,CAAC,CAAC;CAE3D,MAAM,kBAAkB,cAAc;EACpC,IAAI,CAAC,UAAU,OAAO;EACtB,OAAO,oBAAC,YAAD;GAAY,SAAS;GAAY,MAAM;EAAU,CAAA;CAC1D,GAAG,CAAC,UAAU,UAAU,CAAC;CAEzB,MAAM,UAAU,cAAc;EAC5B,IAAI,CAAC,eAAe,OAAO;EAC3B,OAAO,cAAc;GACnB,gBAAgB;GAChB;GACA;GACA,cAAc;EAChB,CAAC;CACH,GAAG;EAAC;EAAe;EAAS;EAAY;CAAe,CAAC;CAExD,MAAM,qBAAqB,kBAAkB;EAC3C,WAAW,SAAS,CAAC,IAAI;CAC3B,GAAG,CAAC,CAAC;CAEL,OACE,qBAACA,mBAAD;EACE,WAAW,GAAG,SAAS;GAAE;GAAQ;EAAQ,CAAC,GAAG,SAAS;EACtD,kBAAe;EACR;EACP,GAAI;EAJN,UAAA,CAME,qBAACA,mBAAD;GACE,YAAA;GACA,OAAO;GACP,WAAW,GAAG,eAAe,EAAE,QAAQ,CAAC,GAAG,YAAY,MAAM;GAC7D,SAAS;GACT,OAAO,cAAc;GACrB,SAAS;GANX,UAAA,CAQE,oBAAC,uBAAD;IACY;IACA;IACI;GACf,CAAA,GACD,qBAACA,mBAAD;IAAS,YAAA;IAAW,OAAO;IAAU,MAAM;IAAQ,KAAK;IAAG,SAAS;IAApE,UAAA,CACE,oBAACA,mBAAD;KAAS,YAAA;KAAW,OAAO;KAAU,WAAW;KAAiB,MAAM;KAAQ,KAAK;KACjF,UAAA;IACM,CAAA,GACT,oBAAC,YAAD;KACE,MAAM,SAAS,cAAc;KAC7B,MAAM;KACN,SAAS;IACV,CAAA,CACM;GACF,CAAA,CAAA;EACT,CAAA,GAAA,oBAACA,mBAAD;GACE,WAAW,GAAG,aAAa,EAAE,OAAO,CAAC,GAAG,YAAY,IAAI;GACxD,OAAO,cAAc;GAEpB;EACM,CAAA,CACF;;AAEb,CACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"Mermaid.mjs","names":["FullFeatured","Flexbox"],"sources":["../../src/Mermaid/Mermaid.tsx"],"sourcesContent":["'use client';\n\nimport { cx } from 'antd-style';\nimport { memo, useCallback, useEffect, useMemo, useRef } from 'react';\n\nimport CopyButton from '@/CopyButton';\nimport { Flexbox } from '@/Flex';\nimport { styles, variants } from '@/Highlighter/style';\nimport Tag from '@/Tag';\n\nimport FullFeatured from './FullFeatured';\nimport SyntaxMermaid from './SyntaxMermaid';\nimport type { MermaidProps } from './type';\n\nconst Mermaid = memo<MermaidProps>(\n ({\n actionIconSize,\n animated,\n bodyRender,\n children,\n classNames,\n className,\n copyable = true,\n defaultExpand = true,\n fileName,\n fullFeatured,\n language = 'mermaid',\n actionsRender,\n shadow,\n showLanguage = true,\n style,\n styles: customStyles,\n theme,\n variant = 'filled',\n ...rest\n }) => {\n const tirmedChildren = children.trim();\n const copyContentRef = useRef(tirmedChildren);\n\n useEffect(() => {\n copyContentRef.current = tirmedChildren;\n }, [tirmedChildren]);\n\n const getCopyContent = useCallback(() => copyContentRef.current, []);\n\n const originalActions = useMemo(() => {\n if (!copyable) return null;\n return (\n <CopyButton content={getCopyContent} size={actionIconSize || { blockSize: 28, size: 16 }} />\n );\n }, [actionIconSize, copyable, getCopyContent]);\n\n const actions = useMemo(() => {\n if (!actionsRender) return originalActions;\n return actionsRender({\n actionIconSize,\n content: tirmedChildren,\n getContent: getCopyContent,\n originalNode: originalActions,\n });\n }, [actionIconSize, actionsRender, getCopyContent, originalActions, tirmedChildren]);\n\n const defaultBody = useMemo(\n () => (\n <SyntaxMermaid\n animated={animated}\n className={classNames?.content}\n style={customStyles?.content}\n theme={theme}\n variant={variant}\n >\n {tirmedChildren}\n </SyntaxMermaid>\n ),\n [animated, theme, tirmedChildren, variant, classNames?.content, customStyles?.content],\n );\n\n const body = useMemo(() => {\n if (!bodyRender) return defaultBody;\n return bodyRender({ content: tirmedChildren, originalNode: defaultBody });\n }, [bodyRender, defaultBody, tirmedChildren]);\n\n if (fullFeatured)\n return (\n <FullFeatured\n actionsRender={actionsRender}\n className={className}\n classNames={classNames}\n content={tirmedChildren}\n copyable={copyable}\n defaultExpand={defaultExpand}\n fileName={fileName}\n language={language}\n shadow={shadow}\n showLanguage={showLanguage}\n style={style}\n styles={customStyles}\n variant={variant}\n {...rest}\n >\n {body}\n </FullFeatured>\n );\n\n return (\n <div\n className={cx(variants({ shadow, variant }), className)}\n data-code-type=\"mermaid\"\n style={style}\n {...rest}\n >\n <Flexbox horizontal align={'center'} className={styles.actions} flex={'none'} gap={4}>\n {actions}\n </Flexbox>\n {showLanguage && <Tag className={styles.lang}>{language.toLowerCase()}</Tag>}\n {body}\n </div>\n );\n },\n);\n\nMermaid.displayName = 'Mermaid';\n\nexport default Mermaid;\n\nexport { type MermaidProps } from './type';\n"],"mappings":";;;;;;;;;;;AAcA,MAAM,UAAU,MACb,EACC,gBACA,UACA,YACA,UACA,YACA,WACA,WAAW,MACX,gBAAgB,MAChB,UACA,cACA,WAAW,WACX,eACA,QACA,eAAe,MACf,OACA,QAAQ,cACR,OACA,UAAU,UACV,GAAG,WACC;CACJ,MAAM,iBAAiB,SAAS,KAAK;CACrC,MAAM,iBAAiB,OAAO,cAAc;CAE5C,gBAAgB;EACd,eAAe,UAAU;CAC3B,GAAG,CAAC,cAAc,CAAC;CAEnB,MAAM,iBAAiB,kBAAkB,eAAe,SAAS,CAAC,CAAC;CAEnE,MAAM,kBAAkB,cAAc;EACpC,IAAI,CAAC,UAAU,OAAO;EACtB,OACE,oBAAC,YAAD;GAAY,SAAS;GAAgB,MAAM,kBAAkB;IAAE,WAAW;IAAI,MAAM;GAAG;EAAI,CAAA;CAE/F,GAAG;EAAC;EAAgB;EAAU;CAAc,CAAC;CAE7C,MAAM,UAAU,cAAc;EAC5B,IAAI,CAAC,eAAe,OAAO;EAC3B,OAAO,cAAc;GACnB;GACA,SAAS;GACT,YAAY;GACZ,cAAc;EAChB,CAAC;CACH,GAAG;EAAC;EAAgB;EAAe;EAAgB;EAAiB;CAAc,CAAC;CAEnF,MAAM,cAAc,cAEhB,oBAAC,eAAD;EACY;EACV,WAAW,YAAY;EACvB,OAAO,cAAc;EACd;EACE;YAER;CACY,CAAA,GAEjB;EAAC;EAAU;EAAO;EAAgB;EAAS,YAAY;EAAS,cAAc;CAAO,CACvF;CAEA,MAAM,OAAO,cAAc;EACzB,IAAI,CAAC,YAAY,OAAO;EACxB,OAAO,WAAW;GAAE,SAAS;GAAgB,cAAc;EAAY,CAAC;CAC1E,GAAG;EAAC;EAAY;EAAa;CAAc,CAAC;CAE5C,IAAI,cACF,OACE,oBAACA,qBAAD;EACiB;EACJ;EACC;EACZ,SAAS;EACC;EACK;EACL;EACA;EACF;EACM;EACP;EACP,QAAQ;EACC;EACT,GAAI;YAEH;CACW,CAAA;CAGlB,OACE,qBAAC,OAAD;EACE,WAAW,GAAG,SAAS;GAAE;GAAQ;EAAQ,CAAC,GAAG,SAAS;EACtD,kBAAe;EACR;EACP,GAAI;YAJN;GAME,oBAACC,mBAAD;IAAS,YAAA;IAAW,OAAO;IAAU,WAAW,OAAO;IAAS,MAAM;IAAQ,KAAK;cAChF;GACM,CAAA;GACR,gBAAgB,oBAAC,KAAD;IAAK,WAAW,OAAO;cAAO,SAAS,YAAY;GAAO,CAAA;GAC1E;EACE;;AAET,CACF;AAEA,QAAQ,cAAc"}
1
+ {"version":3,"file":"Mermaid.mjs","names":["FullFeatured","Flexbox"],"sources":["../../src/Mermaid/Mermaid.tsx"],"sourcesContent":["'use client';\n\nimport { cx } from 'antd-style';\nimport { memo, useCallback, useEffect, useMemo, useRef } from 'react';\n\nimport CopyButton from '@/CopyButton';\nimport { Flexbox } from '@/Flex';\nimport { styles, variants } from '@/Highlighter/style';\nimport Tag from '@/Tag';\n\nimport FullFeatured from './FullFeatured';\nimport SyntaxMermaid from './SyntaxMermaid';\nimport type { MermaidProps } from './type';\n\nconst Mermaid = memo<MermaidProps>(\n ({\n actionIconSize,\n animated,\n bodyRender,\n children,\n classNames,\n className,\n copyable = true,\n defaultExpand = true,\n fileName,\n fullFeatured,\n language = 'mermaid',\n actionsRender,\n shadow,\n showLanguage = true,\n style,\n styles: customStyles,\n theme,\n variant = 'filled',\n ...rest\n }) => {\n const tirmedChildren = children.trim();\n const copyContentRef = useRef(tirmedChildren);\n\n useEffect(() => {\n copyContentRef.current = tirmedChildren;\n }, [tirmedChildren]);\n\n const getCopyContent = useCallback(() => copyContentRef.current, []);\n\n const originalActions = useMemo(() => {\n if (!copyable) return null;\n return (\n <CopyButton content={getCopyContent} size={actionIconSize || { blockSize: 28, size: 16 }} />\n );\n }, [actionIconSize, copyable, getCopyContent]);\n\n const actions = useMemo(() => {\n if (!actionsRender) return originalActions;\n return actionsRender({\n actionIconSize,\n content: tirmedChildren,\n getContent: getCopyContent,\n originalNode: originalActions,\n });\n }, [actionIconSize, actionsRender, getCopyContent, originalActions, tirmedChildren]);\n\n const defaultBody = useMemo(\n () => (\n <SyntaxMermaid\n animated={animated}\n className={classNames?.content}\n style={customStyles?.content}\n theme={theme}\n variant={variant}\n >\n {tirmedChildren}\n </SyntaxMermaid>\n ),\n [animated, theme, tirmedChildren, variant, classNames?.content, customStyles?.content],\n );\n\n const body = useMemo(() => {\n if (!bodyRender) return defaultBody;\n return bodyRender({ content: tirmedChildren, originalNode: defaultBody });\n }, [bodyRender, defaultBody, tirmedChildren]);\n\n if (fullFeatured)\n return (\n <FullFeatured\n actionsRender={actionsRender}\n className={className}\n classNames={classNames}\n content={tirmedChildren}\n copyable={copyable}\n defaultExpand={defaultExpand}\n fileName={fileName}\n language={language}\n shadow={shadow}\n showLanguage={showLanguage}\n style={style}\n styles={customStyles}\n variant={variant}\n {...rest}\n >\n {body}\n </FullFeatured>\n );\n\n return (\n <div\n className={cx(variants({ shadow, variant }), className)}\n data-code-type=\"mermaid\"\n style={style}\n {...rest}\n >\n <Flexbox horizontal align={'center'} className={styles.actions} flex={'none'} gap={4}>\n {actions}\n </Flexbox>\n {showLanguage && <Tag className={styles.lang}>{language.toLowerCase()}</Tag>}\n {body}\n </div>\n );\n },\n);\n\nMermaid.displayName = 'Mermaid';\n\nexport default Mermaid;\n\nexport { type MermaidProps } from './type';\n"],"mappings":";;;;;;;;;;;AAcA,MAAM,UAAU,MACb,EACC,gBACA,UACA,YACA,UACA,YACA,WACA,WAAW,MACX,gBAAgB,MAChB,UACA,cACA,WAAW,WACX,eACA,QACA,eAAe,MACf,OACA,QAAQ,cACR,OACA,UAAU,UACV,GAAG,WACC;CACJ,MAAM,iBAAiB,SAAS,KAAK;CACrC,MAAM,iBAAiB,OAAO,cAAc;CAE5C,gBAAgB;EACd,eAAe,UAAU;CAC3B,GAAG,CAAC,cAAc,CAAC;CAEnB,MAAM,iBAAiB,kBAAkB,eAAe,SAAS,CAAC,CAAC;CAEnE,MAAM,kBAAkB,cAAc;EACpC,IAAI,CAAC,UAAU,OAAO;EACtB,OACE,oBAAC,YAAD;GAAY,SAAS;GAAgB,MAAM,kBAAkB;IAAE,WAAW;IAAI,MAAM;GAAG;EAAI,CAAA;CAE/F,GAAG;EAAC;EAAgB;EAAU;CAAc,CAAC;CAE7C,MAAM,UAAU,cAAc;EAC5B,IAAI,CAAC,eAAe,OAAO;EAC3B,OAAO,cAAc;GACnB;GACA,SAAS;GACT,YAAY;GACZ,cAAc;EAChB,CAAC;CACH,GAAG;EAAC;EAAgB;EAAe;EAAgB;EAAiB;CAAc,CAAC;CAEnF,MAAM,cAAc,cAEhB,oBAAC,eAAD;EACY;EACV,WAAW,YAAY;EACvB,OAAO,cAAc;EACd;EACE;EAER,UAAA;CACY,CAAA,GAEjB;EAAC;EAAU;EAAO;EAAgB;EAAS,YAAY;EAAS,cAAc;CAAO,CACvF;CAEA,MAAM,OAAO,cAAc;EACzB,IAAI,CAAC,YAAY,OAAO;EACxB,OAAO,WAAW;GAAE,SAAS;GAAgB,cAAc;EAAY,CAAC;CAC1E,GAAG;EAAC;EAAY;EAAa;CAAc,CAAC;CAE5C,IAAI,cACF,OACE,oBAACA,qBAAD;EACiB;EACJ;EACC;EACZ,SAAS;EACC;EACK;EACL;EACA;EACF;EACM;EACP;EACP,QAAQ;EACC;EACT,GAAI;EAEH,UAAA;CACW,CAAA;CAGlB,OACE,qBAAC,OAAD;EACE,WAAW,GAAG,SAAS;GAAE;GAAQ;EAAQ,CAAC,GAAG,SAAS;EACtD,kBAAe;EACR;EACP,GAAI;EAJN,UAAA;GAME,oBAACC,mBAAD;IAAS,YAAA;IAAW,OAAO;IAAU,WAAW,OAAO;IAAS,MAAM;IAAQ,KAAK;IAChF,UAAA;GACM,CAAA;GACR,gBAAgB,oBAAC,KAAD;IAAK,WAAW,OAAO;IAAO,UAAA,SAAS,YAAY;GAAO,CAAA;GAC1E;EACE;;AAET,CACF;AAEA,QAAQ,cAAc"}
@@ -0,0 +1,35 @@
1
+ "use client";
2
+ import FlexBasic_default from "../../Flex/FlexBasic.mjs";
3
+ import Text from "../../Text/Text.mjs";
4
+ import { memo } from "react";
5
+ import { jsx, jsxs } from "react/jsx-runtime";
6
+ //#region src/Mermaid/SyntaxMermaid/MermaidFallback.tsx
7
+ const MermaidFallback = memo(({ children, className, message, style }) => /* @__PURE__ */ jsx("div", {
8
+ className,
9
+ style,
10
+ children: /* @__PURE__ */ jsxs(FlexBasic_default, {
11
+ gap: 8,
12
+ padding: 16,
13
+ children: [/* @__PURE__ */ jsx(Text, {
14
+ fontSize: 12,
15
+ type: "secondary",
16
+ children: message
17
+ }), /* @__PURE__ */ jsx(Text, {
18
+ code: true,
19
+ as: "pre",
20
+ fontSize: 12,
21
+ style: {
22
+ margin: 0,
23
+ overflowX: "auto",
24
+ whiteSpace: "pre-wrap",
25
+ wordBreak: "break-word"
26
+ },
27
+ children
28
+ })]
29
+ })
30
+ }));
31
+ MermaidFallback.displayName = "MermaidFallback";
32
+ //#endregion
33
+ export { MermaidFallback as default };
34
+
35
+ //# sourceMappingURL=MermaidFallback.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MermaidFallback.mjs","names":["Flexbox"],"sources":["../../../src/Mermaid/SyntaxMermaid/MermaidFallback.tsx"],"sourcesContent":["'use client';\n\nimport { memo } from 'react';\n\nimport { Flexbox } from '@/Flex';\nimport Text from '@/Text';\n\nimport { type SyntaxMermaidProps } from '../type';\n\ninterface MermaidFallbackProps {\n children: string;\n className?: string;\n message: string;\n style?: SyntaxMermaidProps['style'];\n}\n\nconst MermaidFallback = memo<MermaidFallbackProps>(({ children, className, message, style }) => (\n <div className={className} style={style}>\n <Flexbox gap={8} padding={16}>\n <Text fontSize={12} type={'secondary'}>\n {message}\n </Text>\n <Text\n code\n as={'pre'}\n fontSize={12}\n style={{ margin: 0, overflowX: 'auto', whiteSpace: 'pre-wrap', wordBreak: 'break-word' }}\n >\n {children}\n </Text>\n </Flexbox>\n </div>\n));\n\nMermaidFallback.displayName = 'MermaidFallback';\n\nexport default MermaidFallback;\n"],"mappings":";;;;;;AAgBA,MAAM,kBAAkB,MAA4B,EAAE,UAAU,WAAW,SAAS,YAClF,oBAAC,OAAD;CAAgB;CAAkB;CAChC,UAAA,qBAACA,mBAAD;EAAS,KAAK;EAAG,SAAS;EAA1B,UAAA,CACE,oBAAC,MAAD;GAAM,UAAU;GAAI,MAAM;GACvB,UAAA;EACG,CAAA,GACN,oBAAC,MAAD;GACE,MAAA;GACA,IAAI;GACJ,UAAU;GACV,OAAO;IAAE,QAAQ;IAAG,WAAW;IAAQ,YAAY;IAAY,WAAW;GAAa;GAEtF;EACG,CAAA,CACC;;AACN,CAAA,CACN;AAED,gBAAgB,cAAc"}
@@ -0,0 +1,52 @@
1
+ "use client";
2
+ import { toStandaloneSvgString } from "./prepareInlineSvg.mjs";
3
+ import { prepareMermaidSvgString } from "./prepareMermaidSvg.mjs";
4
+ import { memo, useCallback, useEffect, useRef, useState } from "react";
5
+ import { jsx, jsxs } from "react/jsx-runtime";
6
+ import { Image } from "antd";
7
+ //#region src/Mermaid/SyntaxMermaid/MermaidSvg.tsx
8
+ const MermaidSvg = memo(({ className, ref, style, svg }) => {
9
+ const containerRef = useRef(null);
10
+ const [previewUrl, setPreviewUrl] = useState();
11
+ const [open, setOpen] = useState(false);
12
+ useEffect(() => {
13
+ return () => {
14
+ if (previewUrl) URL.revokeObjectURL(previewUrl);
15
+ };
16
+ }, [previewUrl]);
17
+ const handleOpen = useCallback(() => {
18
+ const element = containerRef.current?.querySelector("svg");
19
+ if (!element) return;
20
+ const standalone = prepareMermaidSvgString(toStandaloneSvgString(element));
21
+ setPreviewUrl((previous) => {
22
+ if (previous) URL.revokeObjectURL(previous);
23
+ return URL.createObjectURL(new Blob([standalone], { type: "image/svg+xml" }));
24
+ });
25
+ setOpen(true);
26
+ }, []);
27
+ return /* @__PURE__ */ jsxs("div", {
28
+ className,
29
+ ref,
30
+ style,
31
+ children: [/* @__PURE__ */ jsx("div", {
32
+ dangerouslySetInnerHTML: { __html: svg },
33
+ ref: containerRef,
34
+ style: { cursor: "zoom-in" },
35
+ onClick: handleOpen
36
+ }), previewUrl && /* @__PURE__ */ jsx(Image, {
37
+ preview: {
38
+ onVisibleChange: setOpen,
39
+ src: previewUrl,
40
+ visible: open
41
+ },
42
+ src: previewUrl,
43
+ style: { display: "none" },
44
+ wrapperStyle: { display: "none" }
45
+ })]
46
+ });
47
+ });
48
+ MermaidSvg.displayName = "MermaidSvg";
49
+ //#endregion
50
+ export { MermaidSvg as default };
51
+
52
+ //# sourceMappingURL=MermaidSvg.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MermaidSvg.mjs","names":["AntImage"],"sources":["../../../src/Mermaid/SyntaxMermaid/MermaidSvg.tsx"],"sourcesContent":["'use client';\n\nimport { Image as AntImage } from 'antd';\nimport { memo, type Ref, useCallback, useEffect, useRef, useState } from 'react';\n\nimport { toStandaloneSvgString } from './prepareInlineSvg';\nimport { prepareMermaidSvgString } from './prepareMermaidSvg';\n\ninterface MermaidSvgProps {\n className?: string;\n ref?: Ref<HTMLDivElement>;\n style?: React.CSSProperties;\n svg: string;\n}\n\nconst MermaidSvg = memo<MermaidSvgProps>(({ className, ref, style, svg }) => {\n const containerRef = useRef<HTMLDivElement>(null);\n const [previewUrl, setPreviewUrl] = useState<string>();\n const [open, setOpen] = useState(false);\n\n useEffect(() => {\n return () => {\n if (previewUrl) URL.revokeObjectURL(previewUrl);\n };\n }, [previewUrl]);\n\n // The preview copy is only built on demand: it has to bake in the resolved\n // CSS variables and be XML-well-formed, neither of which the inline copy needs.\n const handleOpen = useCallback(() => {\n const element = containerRef.current?.querySelector('svg');\n if (!element) return;\n\n const standalone = prepareMermaidSvgString(toStandaloneSvgString(element));\n setPreviewUrl((previous) => {\n if (previous) URL.revokeObjectURL(previous);\n return URL.createObjectURL(new Blob([standalone], { type: 'image/svg+xml' }));\n });\n setOpen(true);\n }, []);\n\n return (\n <div className={className} ref={ref} style={style}>\n <div\n dangerouslySetInnerHTML={{ __html: svg }}\n ref={containerRef}\n style={{ cursor: 'zoom-in' }}\n onClick={handleOpen}\n />\n {previewUrl && (\n <AntImage\n preview={{ onVisibleChange: setOpen, src: previewUrl, visible: open }}\n src={previewUrl}\n style={{ display: 'none' }}\n wrapperStyle={{ display: 'none' }}\n />\n )}\n </div>\n );\n});\n\nMermaidSvg.displayName = 'MermaidSvg';\n\nexport default MermaidSvg;\n"],"mappings":";;;;;;;AAeA,MAAM,aAAa,MAAuB,EAAE,WAAW,KAAK,OAAO,UAAU;CAC3E,MAAM,eAAe,OAAuB,IAAI;CAChD,MAAM,CAAC,YAAY,iBAAiB,SAAiB;CACrD,MAAM,CAAC,MAAM,WAAW,SAAS,KAAK;CAEtC,gBAAgB;EACd,aAAa;GACX,IAAI,YAAY,IAAI,gBAAgB,UAAU;EAChD;CACF,GAAG,CAAC,UAAU,CAAC;CAIf,MAAM,aAAa,kBAAkB;EACnC,MAAM,UAAU,aAAa,SAAS,cAAc,KAAK;EACzD,IAAI,CAAC,SAAS;EAEd,MAAM,aAAa,wBAAwB,sBAAsB,OAAO,CAAC;EACzE,eAAe,aAAa;GAC1B,IAAI,UAAU,IAAI,gBAAgB,QAAQ;GAC1C,OAAO,IAAI,gBAAgB,IAAI,KAAK,CAAC,UAAU,GAAG,EAAE,MAAM,gBAAgB,CAAC,CAAC;EAC9E,CAAC;EACD,QAAQ,IAAI;CACd,GAAG,CAAC,CAAC;CAEL,OACE,qBAAC,OAAD;EAAgB;EAAgB;EAAY;EAA5C,UAAA,CACE,oBAAC,OAAD;GACE,yBAAyB,EAAE,QAAQ,IAAI;GACvC,KAAK;GACL,OAAO,EAAE,QAAQ,UAAU;GAC3B,SAAS;EACV,CAAA,GACA,cACC,oBAACA,OAAD;GACE,SAAS;IAAE,iBAAiB;IAAS,KAAK;IAAY,SAAS;GAAK;GACpE,KAAK;GACL,OAAO,EAAE,SAAS,OAAO;GACzB,cAAc,EAAE,SAAS,OAAO;EACjC,CAAA,CAEA;;AAET,CAAC;AAED,WAAW,cAAc"}
@@ -1,10 +1,10 @@
1
1
  "use client";
2
- import Image from "../../Image/index.mjs";
3
2
  import { mermaidThemes } from "../const.mjs";
4
3
  import { useMermaid } from "../../hooks/useMermaid.mjs";
5
- import { memo, useEffect, useId, useMemo, useState } from "react";
4
+ import MermaidFallback from "./MermaidFallback.mjs";
5
+ import MermaidSvg from "./MermaidSvg.mjs";
6
+ import { memo, useMemo } from "react";
6
7
  import { jsx } from "react/jsx-runtime";
7
- import { kebabCase } from "es-toolkit/compat";
8
8
  //#region src/Mermaid/SyntaxMermaid/StaticMermaid.tsx
9
9
  const StaticMermaid = memo(({ children, className, fallbackClassName, ref, style, theme: customTheme, variant }) => {
10
10
  const safeChildren = children ?? "";
@@ -13,36 +13,7 @@ const StaticMermaid = memo(({ children, className, fallbackClassName, ref, style
13
13
  if (isDefaultTheme) return;
14
14
  return mermaidThemes.find((item) => item.id === customTheme)?.background;
15
15
  }, [isDefaultTheme, customTheme]);
16
- const data = useMermaid(safeChildren, {
17
- id: kebabCase(`mermaid-${useId()}`),
18
- theme: isDefaultTheme ? void 0 : customTheme
19
- });
20
- const isLoading = !data;
21
- const [blobUrl, setBlobUrl] = useState();
22
- useEffect(() => {
23
- return () => {
24
- if (blobUrl) URL.revokeObjectURL(blobUrl);
25
- };
26
- }, [blobUrl]);
27
- useEffect(() => {
28
- if (isLoading || !data) return;
29
- let finalSvgString = data;
30
- if (typeof window !== "undefined" && typeof navigator !== "undefined" && navigator.userAgent.includes("Firefox")) {
31
- const svgDoc = new DOMParser().parseFromString(data, "image/svg+xml");
32
- const svgElement = svgDoc.documentElement;
33
- if (svgElement && svgElement.hasAttribute("viewBox")) {
34
- const viewBoxParts = svgElement.getAttribute("viewBox").split(" ");
35
- if (Array.isArray(viewBoxParts) && viewBoxParts.length === 4) {
36
- svgElement.setAttribute("width", viewBoxParts[2]);
37
- svgElement.setAttribute("height", viewBoxParts[3]);
38
- }
39
- finalSvgString = new XMLSerializer().serializeToString(svgDoc);
40
- }
41
- }
42
- const svgBlob = new Blob([finalSvgString], { type: "image/svg+xml" });
43
- const url = URL.createObjectURL(svgBlob);
44
- setBlobUrl(url);
45
- }, [isLoading, data]);
16
+ const { svg, error, loading } = useMermaid(safeChildren, { theme: isDefaultTheme ? void 0 : customTheme });
46
17
  const containerStyle = {
47
18
  background: variant === "filled" ? background : void 0,
48
19
  margin: 0,
@@ -52,7 +23,13 @@ const StaticMermaid = memo(({ children, className, fallbackClassName, ref, style
52
23
  width: "100%",
53
24
  ...style
54
25
  };
55
- if (!blobUrl) return /* @__PURE__ */ jsx("div", {
26
+ if (error && !loading) return /* @__PURE__ */ jsx(MermaidFallback, {
27
+ className: fallbackClassName,
28
+ message: error,
29
+ style,
30
+ children: safeChildren
31
+ });
32
+ if (!svg) return /* @__PURE__ */ jsx("div", {
56
33
  className: fallbackClassName,
57
34
  style,
58
35
  children: /* @__PURE__ */ jsx("div", {
@@ -60,17 +37,11 @@ const StaticMermaid = memo(({ children, className, fallbackClassName, ref, style
60
37
  children: "Loading..."
61
38
  })
62
39
  });
63
- return /* @__PURE__ */ jsx(Image, {
64
- alt: "mermaid",
40
+ return /* @__PURE__ */ jsx(MermaidSvg, {
65
41
  className,
66
- maxHeight: 480,
67
- minWidth: 300,
68
- objectFit: "contain",
69
42
  ref,
70
- src: blobUrl,
71
43
  style: containerStyle,
72
- variant: "borderless",
73
- width: "100%"
44
+ svg
74
45
  });
75
46
  });
76
47
  StaticMermaid.displayName = "StaticMermaid";
@@ -1 +1 @@
1
- {"version":3,"file":"StaticMermaid.mjs","names":[],"sources":["../../../src/Mermaid/SyntaxMermaid/StaticMermaid.tsx"],"sourcesContent":["'use client';\n\nimport { kebabCase } from 'es-toolkit/compat';\nimport { type Ref } from 'react';\nimport { memo, useEffect, useId, useMemo, useState } from 'react';\n\nimport { useMermaid } from '@/hooks/useMermaid';\nimport Image from '@/Image';\n\nimport { mermaidThemes } from '../const';\nimport { type SyntaxMermaidProps } from '../type';\n\ninterface StaticMermaidProps {\n children: string;\n className?: string;\n fallbackClassName?: string;\n ref?: Ref<HTMLDivElement>;\n style?: SyntaxMermaidProps['style'];\n theme?: SyntaxMermaidProps['theme'];\n variant?: SyntaxMermaidProps['variant'];\n}\n\nconst StaticMermaid = memo<StaticMermaidProps>(\n ({ children, className, fallbackClassName, ref, style, theme: customTheme, variant }) => {\n const safeChildren = children ?? '';\n const isDefaultTheme = customTheme === 'lobe-theme' || !customTheme;\n\n const background = useMemo(() => {\n if (isDefaultTheme) return;\n return mermaidThemes.find((item) => item.id === customTheme)?.background;\n }, [isDefaultTheme, customTheme]);\n\n const id = useId();\n const mermaidId = kebabCase(`mermaid-${id}`);\n const data = useMermaid(safeChildren, {\n id: mermaidId,\n theme: isDefaultTheme ? undefined : customTheme,\n });\n const isLoading = !data;\n const [blobUrl, setBlobUrl] = useState<string>();\n\n // 组件卸载时清理 Blob URL,避免内存泄漏\n useEffect(() => {\n return () => {\n if (blobUrl) URL.revokeObjectURL(blobUrl);\n };\n }, [blobUrl]);\n\n useEffect(() => {\n if (isLoading || !data) return;\n let finalSvgString = data;\n\n // 修复Firefox点击预览mermaid图时宽高为0导致不显示的异常\n if (\n typeof window !== 'undefined' &&\n typeof navigator !== 'undefined' &&\n navigator.userAgent.includes('Firefox')\n ) {\n const parser = new DOMParser();\n const svgDoc = parser.parseFromString(data, 'image/svg+xml');\n const svgElement = svgDoc.documentElement;\n if (svgElement && svgElement.hasAttribute('viewBox')) {\n const viewBox = svgElement.getAttribute('viewBox')!;\n const viewBoxParts = viewBox.split(' ');\n if (Array.isArray(viewBoxParts) && viewBoxParts.length === 4) {\n svgElement.setAttribute('width', viewBoxParts[2]);\n svgElement.setAttribute('height', viewBoxParts[3]);\n }\n finalSvgString = new XMLSerializer().serializeToString(svgDoc);\n }\n }\n\n // 创建Blob对象\n const svgBlob = new Blob([finalSvgString], { type: 'image/svg+xml' });\n // 创建并保存Blob URL\n const url = URL.createObjectURL(svgBlob);\n setBlobUrl(url);\n }, [isLoading, data]);\n\n const containerStyle = {\n background: variant === 'filled' ? background : undefined,\n margin: 0,\n minWidth: 300,\n padding: variant === 'borderless' ? 0 : 16,\n position: 'relative' as const,\n width: '100%',\n ...style,\n };\n\n if (!blobUrl) {\n return (\n <div className={fallbackClassName} style={style}>\n <div style={{ padding: 16 }}>Loading...</div>\n </div>\n );\n }\n\n return (\n <Image\n alt={'mermaid'}\n className={className}\n maxHeight={480}\n minWidth={300}\n objectFit={'contain'}\n ref={ref}\n src={blobUrl}\n style={containerStyle}\n variant={'borderless'}\n width={'100%'}\n />\n );\n },\n);\n\nStaticMermaid.displayName = 'StaticMermaid';\n\nexport default StaticMermaid;\n"],"mappings":";;;;;;;;AAsBA,MAAM,gBAAgB,MACnB,EAAE,UAAU,WAAW,mBAAmB,KAAK,OAAO,OAAO,aAAa,cAAc;CACvF,MAAM,eAAe,YAAY;CACjC,MAAM,iBAAiB,gBAAgB,gBAAgB,CAAC;CAExD,MAAM,aAAa,cAAc;EAC/B,IAAI,gBAAgB;EACpB,OAAO,cAAc,MAAM,SAAS,KAAK,OAAO,WAAW,CAAC,EAAE;CAChE,GAAG,CAAC,gBAAgB,WAAW,CAAC;CAIhC,MAAM,OAAO,WAAW,cAAc;EACpC,IAFgB,UAAU,WADjB,MAC6B,GAE1B;EACZ,OAAO,iBAAiB,KAAA,IAAY;CACtC,CAAC;CACD,MAAM,YAAY,CAAC;CACnB,MAAM,CAAC,SAAS,cAAc,SAAiB;CAG/C,gBAAgB;EACd,aAAa;GACX,IAAI,SAAS,IAAI,gBAAgB,OAAO;EAC1C;CACF,GAAG,CAAC,OAAO,CAAC;CAEZ,gBAAgB;EACd,IAAI,aAAa,CAAC,MAAM;EACxB,IAAI,iBAAiB;EAGrB,IACE,OAAO,WAAW,eAClB,OAAO,cAAc,eACrB,UAAU,UAAU,SAAS,SAAS,GACtC;GAEA,MAAM,SAAS,IADI,UACC,CAAC,CAAC,gBAAgB,MAAM,eAAe;GAC3D,MAAM,aAAa,OAAO;GAC1B,IAAI,cAAc,WAAW,aAAa,SAAS,GAAG;IAEpD,MAAM,eADU,WAAW,aAAa,SACb,CAAC,CAAC,MAAM,GAAG;IACtC,IAAI,MAAM,QAAQ,YAAY,KAAK,aAAa,WAAW,GAAG;KAC5D,WAAW,aAAa,SAAS,aAAa,EAAE;KAChD,WAAW,aAAa,UAAU,aAAa,EAAE;IACnD;IACA,iBAAiB,IAAI,cAAc,CAAC,CAAC,kBAAkB,MAAM;GAC/D;EACF;EAGA,MAAM,UAAU,IAAI,KAAK,CAAC,cAAc,GAAG,EAAE,MAAM,gBAAgB,CAAC;EAEpE,MAAM,MAAM,IAAI,gBAAgB,OAAO;EACvC,WAAW,GAAG;CAChB,GAAG,CAAC,WAAW,IAAI,CAAC;CAEpB,MAAM,iBAAiB;EACrB,YAAY,YAAY,WAAW,aAAa,KAAA;EAChD,QAAQ;EACR,UAAU;EACV,SAAS,YAAY,eAAe,IAAI;EACxC,UAAU;EACV,OAAO;EACP,GAAG;CACL;CAEA,IAAI,CAAC,SACH,OACE,oBAAC,OAAD;EAAK,WAAW;EAA0B;YACxC,oBAAC,OAAD;GAAK,OAAO,EAAE,SAAS,GAAG;aAAG;EAAe,CAAA;CACzC,CAAA;CAIT,OACE,oBAAC,OAAD;EACE,KAAK;EACM;EACX,WAAW;EACX,UAAU;EACV,WAAW;EACN;EACL,KAAK;EACL,OAAO;EACP,SAAS;EACT,OAAO;CACR,CAAA;AAEL,CACF;AAEA,cAAc,cAAc"}
1
+ {"version":3,"file":"StaticMermaid.mjs","names":[],"sources":["../../../src/Mermaid/SyntaxMermaid/StaticMermaid.tsx"],"sourcesContent":["'use client';\n\nimport { type Ref } from 'react';\nimport { memo, useMemo } from 'react';\n\nimport { useMermaid } from '@/hooks/useMermaid';\n\nimport { mermaidThemes } from '../const';\nimport { type SyntaxMermaidProps } from '../type';\nimport MermaidFallback from './MermaidFallback';\nimport MermaidSvg from './MermaidSvg';\n\ninterface StaticMermaidProps {\n children: string;\n className?: string;\n fallbackClassName?: string;\n ref?: Ref<HTMLDivElement>;\n style?: SyntaxMermaidProps['style'];\n theme?: SyntaxMermaidProps['theme'];\n variant?: SyntaxMermaidProps['variant'];\n}\n\nconst StaticMermaid = memo<StaticMermaidProps>(\n ({ children, className, fallbackClassName, ref, style, theme: customTheme, variant }) => {\n const safeChildren = children ?? '';\n const isDefaultTheme = customTheme === 'lobe-theme' || !customTheme;\n\n const background = useMemo(() => {\n if (isDefaultTheme) return;\n return mermaidThemes.find((item) => item.id === customTheme)?.background;\n }, [isDefaultTheme, customTheme]);\n\n const { svg, error, loading } = useMermaid(safeChildren, {\n theme: isDefaultTheme ? undefined : customTheme,\n });\n\n const containerStyle = {\n background: variant === 'filled' ? background : undefined,\n margin: 0,\n minWidth: 300,\n padding: variant === 'borderless' ? 0 : 16,\n position: 'relative' as const,\n width: '100%',\n ...style,\n };\n\n if (error && !loading) {\n return (\n <MermaidFallback className={fallbackClassName} message={error} style={style}>\n {safeChildren}\n </MermaidFallback>\n );\n }\n\n if (!svg) {\n return (\n <div className={fallbackClassName} style={style}>\n <div style={{ padding: 16 }}>Loading...</div>\n </div>\n );\n }\n\n return <MermaidSvg className={className} ref={ref} style={containerStyle} svg={svg} />;\n },\n);\n\nStaticMermaid.displayName = 'StaticMermaid';\n\nexport default StaticMermaid;\n"],"mappings":";;;;;;;;AAsBA,MAAM,gBAAgB,MACnB,EAAE,UAAU,WAAW,mBAAmB,KAAK,OAAO,OAAO,aAAa,cAAc;CACvF,MAAM,eAAe,YAAY;CACjC,MAAM,iBAAiB,gBAAgB,gBAAgB,CAAC;CAExD,MAAM,aAAa,cAAc;EAC/B,IAAI,gBAAgB;EACpB,OAAO,cAAc,MAAM,SAAS,KAAK,OAAO,WAAW,CAAC,EAAE;CAChE,GAAG,CAAC,gBAAgB,WAAW,CAAC;CAEhC,MAAM,EAAE,KAAK,OAAO,YAAY,WAAW,cAAc,EACvD,OAAO,iBAAiB,KAAA,IAAY,YACtC,CAAC;CAED,MAAM,iBAAiB;EACrB,YAAY,YAAY,WAAW,aAAa,KAAA;EAChD,QAAQ;EACR,UAAU;EACV,SAAS,YAAY,eAAe,IAAI;EACxC,UAAU;EACV,OAAO;EACP,GAAG;CACL;CAEA,IAAI,SAAS,CAAC,SACZ,OACE,oBAAC,iBAAD;EAAiB,WAAW;EAAmB,SAAS;EAAc;EACnE,UAAA;CACc,CAAA;CAIrB,IAAI,CAAC,KACH,OACE,oBAAC,OAAD;EAAK,WAAW;EAA0B;EACxC,UAAA,oBAAC,OAAD;GAAK,OAAO,EAAE,SAAS,GAAG;GAAG,UAAA;EAAe,CAAA;CACzC,CAAA;CAIT,OAAO,oBAAC,YAAD;EAAuB;EAAgB;EAAK,OAAO;EAAqB;CAAM,CAAA;AACvF,CACF;AAEA,cAAc,cAAc"}
@@ -1,10 +1,10 @@
1
1
  "use client";
2
- import Image from "../../Image/index.mjs";
3
2
  import { mermaidThemes } from "../const.mjs";
3
+ import MermaidFallback from "./MermaidFallback.mjs";
4
+ import MermaidSvg from "./MermaidSvg.mjs";
4
5
  import { useStreamMermaid } from "../../hooks/useStreamMermaid.mjs";
5
- import { memo, useEffect, useId, useMemo, useState } from "react";
6
+ import { memo, useMemo } from "react";
6
7
  import { jsx } from "react/jsx-runtime";
7
- import { kebabCase } from "es-toolkit/compat";
8
8
  //#region src/Mermaid/SyntaxMermaid/StreamMermaid.tsx
9
9
  const StreamMermaid = memo(({ children, className, fallbackClassName, ref, style, theme: customTheme, variant }) => {
10
10
  const safeChildren = children ?? "";
@@ -13,40 +13,10 @@ const StreamMermaid = memo(({ children, className, fallbackClassName, ref, style
13
13
  if (isDefaultTheme) return;
14
14
  return mermaidThemes.find((item) => item.id === customTheme)?.background;
15
15
  }, [isDefaultTheme, customTheme]);
16
- const data = useStreamMermaid(safeChildren, {
16
+ const { svg, error, loading } = useStreamMermaid(safeChildren, {
17
17
  enabled: true,
18
- id: kebabCase(`mermaid-${useId()}`),
19
18
  theme: isDefaultTheme ? void 0 : customTheme
20
19
  });
21
- const isLoading = !data;
22
- const [blobUrl, setBlobUrl] = useState();
23
- useEffect(() => {
24
- return () => {
25
- if (blobUrl) URL.revokeObjectURL(blobUrl);
26
- };
27
- }, [blobUrl]);
28
- useEffect(() => {
29
- if (isLoading || !data) {
30
- setBlobUrl(void 0);
31
- return;
32
- }
33
- let finalSvgString = data;
34
- if (typeof window !== "undefined" && typeof navigator !== "undefined" && navigator.userAgent.includes("Firefox")) {
35
- const svgDoc = new DOMParser().parseFromString(data, "image/svg+xml");
36
- const svgElement = svgDoc.documentElement;
37
- if (svgElement && svgElement.hasAttribute("viewBox")) {
38
- const viewBoxParts = svgElement.getAttribute("viewBox").split(" ");
39
- if (Array.isArray(viewBoxParts) && viewBoxParts.length === 4) {
40
- svgElement.setAttribute("width", viewBoxParts[2]);
41
- svgElement.setAttribute("height", viewBoxParts[3]);
42
- }
43
- finalSvgString = new XMLSerializer().serializeToString(svgDoc);
44
- }
45
- }
46
- const svgBlob = new Blob([finalSvgString], { type: "image/svg+xml" });
47
- const url = URL.createObjectURL(svgBlob);
48
- setBlobUrl(url);
49
- }, [isLoading, data]);
50
20
  const containerStyle = {
51
21
  background: variant === "filled" ? background : void 0,
52
22
  margin: 0,
@@ -56,7 +26,13 @@ const StreamMermaid = memo(({ children, className, fallbackClassName, ref, style
56
26
  width: "100%",
57
27
  ...style
58
28
  };
59
- if (!blobUrl) return /* @__PURE__ */ jsx("div", {
29
+ if (error && !loading) return /* @__PURE__ */ jsx(MermaidFallback, {
30
+ className: fallbackClassName,
31
+ message: error,
32
+ style,
33
+ children: safeChildren
34
+ });
35
+ if (!svg) return /* @__PURE__ */ jsx("div", {
60
36
  className: fallbackClassName,
61
37
  style,
62
38
  children: /* @__PURE__ */ jsx("div", {
@@ -64,17 +40,11 @@ const StreamMermaid = memo(({ children, className, fallbackClassName, ref, style
64
40
  children: "Rendering..."
65
41
  })
66
42
  });
67
- return /* @__PURE__ */ jsx(Image, {
68
- alt: "mermaid",
43
+ return /* @__PURE__ */ jsx(MermaidSvg, {
69
44
  className,
70
- maxHeight: 480,
71
- minWidth: 300,
72
- objectFit: "contain",
73
45
  ref,
74
- src: blobUrl,
75
46
  style: containerStyle,
76
- variant: "borderless",
77
- width: "100%"
47
+ svg
78
48
  });
79
49
  });
80
50
  StreamMermaid.displayName = "StreamMermaid";
@@ -1 +1 @@
1
- {"version":3,"file":"StreamMermaid.mjs","names":[],"sources":["../../../src/Mermaid/SyntaxMermaid/StreamMermaid.tsx"],"sourcesContent":["'use client';\n\nimport { kebabCase } from 'es-toolkit/compat';\nimport { type Ref } from 'react';\nimport { memo, useEffect, useId, useMemo, useState } from 'react';\n\nimport { useStreamMermaid } from '@/hooks/useStreamMermaid';\nimport Image from '@/Image';\n\nimport { mermaidThemes } from '../const';\nimport { type SyntaxMermaidProps } from '../type';\n\ninterface StreamMermaidProps {\n children: string;\n className?: string;\n fallbackClassName?: string;\n ref?: Ref<HTMLDivElement>;\n style?: SyntaxMermaidProps['style'];\n theme?: SyntaxMermaidProps['theme'];\n variant?: SyntaxMermaidProps['variant'];\n}\n\nconst StreamMermaid = memo<StreamMermaidProps>(\n ({ children, className, fallbackClassName, ref, style, theme: customTheme, variant }) => {\n const safeChildren = children ?? '';\n const isDefaultTheme = customTheme === 'lobe-theme' || !customTheme;\n\n const background = useMemo(() => {\n if (isDefaultTheme) return;\n return mermaidThemes.find((item) => item.id === customTheme)?.background;\n }, [isDefaultTheme, customTheme]);\n\n const id = useId();\n const mermaidId = kebabCase(`mermaid-${id}`);\n const data = useStreamMermaid(safeChildren, {\n enabled: true,\n id: mermaidId,\n theme: isDefaultTheme ? undefined : customTheme,\n });\n const isLoading = !data;\n const [blobUrl, setBlobUrl] = useState<string>();\n\n // 组件卸载时清理 Blob URL,避免内存泄漏\n useEffect(() => {\n return () => {\n if (blobUrl) URL.revokeObjectURL(blobUrl);\n };\n }, [blobUrl]);\n\n useEffect(() => {\n if (isLoading || !data) {\n // Clear blob URL when loading or no data\n setBlobUrl(undefined);\n return;\n }\n\n let finalSvgString = data;\n\n // 修复Firefox点击预览mermaid图时宽高为0导致不显示的异常\n if (\n typeof window !== 'undefined' &&\n typeof navigator !== 'undefined' &&\n navigator.userAgent.includes('Firefox')\n ) {\n const parser = new DOMParser();\n const svgDoc = parser.parseFromString(data, 'image/svg+xml');\n const svgElement = svgDoc.documentElement;\n if (svgElement && svgElement.hasAttribute('viewBox')) {\n const viewBox = svgElement.getAttribute('viewBox')!;\n const viewBoxParts = viewBox.split(' ');\n if (Array.isArray(viewBoxParts) && viewBoxParts.length === 4) {\n svgElement.setAttribute('width', viewBoxParts[2]);\n svgElement.setAttribute('height', viewBoxParts[3]);\n }\n finalSvgString = new XMLSerializer().serializeToString(svgDoc);\n }\n }\n\n // 创建Blob对象\n const svgBlob = new Blob([finalSvgString], { type: 'image/svg+xml' });\n // 创建并保存Blob URL\n const url = URL.createObjectURL(svgBlob);\n setBlobUrl(url);\n }, [isLoading, data]);\n\n const containerStyle = {\n background: variant === 'filled' ? background : undefined,\n margin: 0,\n minWidth: 300,\n padding: variant === 'borderless' ? 0 : 16,\n position: 'relative' as const,\n width: '100%',\n ...style,\n };\n\n if (!blobUrl) {\n return (\n <div className={fallbackClassName} style={style}>\n <div style={{ padding: 16 }}>Rendering...</div>\n </div>\n );\n }\n\n return (\n <Image\n alt={'mermaid'}\n className={className}\n maxHeight={480}\n minWidth={300}\n objectFit={'contain'}\n ref={ref}\n src={blobUrl}\n style={containerStyle}\n variant={'borderless'}\n width={'100%'}\n />\n );\n },\n);\n\nStreamMermaid.displayName = 'StreamMermaid';\n\nexport default StreamMermaid;\n"],"mappings":";;;;;;;;AAsBA,MAAM,gBAAgB,MACnB,EAAE,UAAU,WAAW,mBAAmB,KAAK,OAAO,OAAO,aAAa,cAAc;CACvF,MAAM,eAAe,YAAY;CACjC,MAAM,iBAAiB,gBAAgB,gBAAgB,CAAC;CAExD,MAAM,aAAa,cAAc;EAC/B,IAAI,gBAAgB;EACpB,OAAO,cAAc,MAAM,SAAS,KAAK,OAAO,WAAW,CAAC,EAAE;CAChE,GAAG,CAAC,gBAAgB,WAAW,CAAC;CAIhC,MAAM,OAAO,iBAAiB,cAAc;EAC1C,SAAS;EACT,IAHgB,UAAU,WADjB,MAC6B,GAG1B;EACZ,OAAO,iBAAiB,KAAA,IAAY;CACtC,CAAC;CACD,MAAM,YAAY,CAAC;CACnB,MAAM,CAAC,SAAS,cAAc,SAAiB;CAG/C,gBAAgB;EACd,aAAa;GACX,IAAI,SAAS,IAAI,gBAAgB,OAAO;EAC1C;CACF,GAAG,CAAC,OAAO,CAAC;CAEZ,gBAAgB;EACd,IAAI,aAAa,CAAC,MAAM;GAEtB,WAAW,KAAA,CAAS;GACpB;EACF;EAEA,IAAI,iBAAiB;EAGrB,IACE,OAAO,WAAW,eAClB,OAAO,cAAc,eACrB,UAAU,UAAU,SAAS,SAAS,GACtC;GAEA,MAAM,SAAS,IADI,UACC,CAAC,CAAC,gBAAgB,MAAM,eAAe;GAC3D,MAAM,aAAa,OAAO;GAC1B,IAAI,cAAc,WAAW,aAAa,SAAS,GAAG;IAEpD,MAAM,eADU,WAAW,aAAa,SACb,CAAC,CAAC,MAAM,GAAG;IACtC,IAAI,MAAM,QAAQ,YAAY,KAAK,aAAa,WAAW,GAAG;KAC5D,WAAW,aAAa,SAAS,aAAa,EAAE;KAChD,WAAW,aAAa,UAAU,aAAa,EAAE;IACnD;IACA,iBAAiB,IAAI,cAAc,CAAC,CAAC,kBAAkB,MAAM;GAC/D;EACF;EAGA,MAAM,UAAU,IAAI,KAAK,CAAC,cAAc,GAAG,EAAE,MAAM,gBAAgB,CAAC;EAEpE,MAAM,MAAM,IAAI,gBAAgB,OAAO;EACvC,WAAW,GAAG;CAChB,GAAG,CAAC,WAAW,IAAI,CAAC;CAEpB,MAAM,iBAAiB;EACrB,YAAY,YAAY,WAAW,aAAa,KAAA;EAChD,QAAQ;EACR,UAAU;EACV,SAAS,YAAY,eAAe,IAAI;EACxC,UAAU;EACV,OAAO;EACP,GAAG;CACL;CAEA,IAAI,CAAC,SACH,OACE,oBAAC,OAAD;EAAK,WAAW;EAA0B;YACxC,oBAAC,OAAD;GAAK,OAAO,EAAE,SAAS,GAAG;aAAG;EAAiB,CAAA;CAC3C,CAAA;CAIT,OACE,oBAAC,OAAD;EACE,KAAK;EACM;EACX,WAAW;EACX,UAAU;EACV,WAAW;EACN;EACL,KAAK;EACL,OAAO;EACP,SAAS;EACT,OAAO;CACR,CAAA;AAEL,CACF;AAEA,cAAc,cAAc"}
1
+ {"version":3,"file":"StreamMermaid.mjs","names":[],"sources":["../../../src/Mermaid/SyntaxMermaid/StreamMermaid.tsx"],"sourcesContent":["'use client';\n\nimport { type Ref } from 'react';\nimport { memo, useMemo } from 'react';\n\nimport { useStreamMermaid } from '@/hooks/useStreamMermaid';\n\nimport { mermaidThemes } from '../const';\nimport { type SyntaxMermaidProps } from '../type';\nimport MermaidFallback from './MermaidFallback';\nimport MermaidSvg from './MermaidSvg';\n\ninterface StreamMermaidProps {\n children: string;\n className?: string;\n fallbackClassName?: string;\n ref?: Ref<HTMLDivElement>;\n style?: SyntaxMermaidProps['style'];\n theme?: SyntaxMermaidProps['theme'];\n variant?: SyntaxMermaidProps['variant'];\n}\n\nconst StreamMermaid = memo<StreamMermaidProps>(\n ({ children, className, fallbackClassName, ref, style, theme: customTheme, variant }) => {\n const safeChildren = children ?? '';\n const isDefaultTheme = customTheme === 'lobe-theme' || !customTheme;\n\n const background = useMemo(() => {\n if (isDefaultTheme) return;\n return mermaidThemes.find((item) => item.id === customTheme)?.background;\n }, [isDefaultTheme, customTheme]);\n\n const { svg, error, loading } = useStreamMermaid(safeChildren, {\n enabled: true,\n theme: isDefaultTheme ? undefined : customTheme,\n });\n\n const containerStyle = {\n background: variant === 'filled' ? background : undefined,\n margin: 0,\n minWidth: 300,\n padding: variant === 'borderless' ? 0 : 16,\n position: 'relative' as const,\n width: '100%',\n ...style,\n };\n\n if (error && !loading) {\n return (\n <MermaidFallback className={fallbackClassName} message={error} style={style}>\n {safeChildren}\n </MermaidFallback>\n );\n }\n\n if (!svg) {\n return (\n <div className={fallbackClassName} style={style}>\n <div style={{ padding: 16 }}>Rendering...</div>\n </div>\n );\n }\n\n return <MermaidSvg className={className} ref={ref} style={containerStyle} svg={svg} />;\n },\n);\n\nStreamMermaid.displayName = 'StreamMermaid';\n\nexport default StreamMermaid;\n"],"mappings":";;;;;;;;AAsBA,MAAM,gBAAgB,MACnB,EAAE,UAAU,WAAW,mBAAmB,KAAK,OAAO,OAAO,aAAa,cAAc;CACvF,MAAM,eAAe,YAAY;CACjC,MAAM,iBAAiB,gBAAgB,gBAAgB,CAAC;CAExD,MAAM,aAAa,cAAc;EAC/B,IAAI,gBAAgB;EACpB,OAAO,cAAc,MAAM,SAAS,KAAK,OAAO,WAAW,CAAC,EAAE;CAChE,GAAG,CAAC,gBAAgB,WAAW,CAAC;CAEhC,MAAM,EAAE,KAAK,OAAO,YAAY,iBAAiB,cAAc;EAC7D,SAAS;EACT,OAAO,iBAAiB,KAAA,IAAY;CACtC,CAAC;CAED,MAAM,iBAAiB;EACrB,YAAY,YAAY,WAAW,aAAa,KAAA;EAChD,QAAQ;EACR,UAAU;EACV,SAAS,YAAY,eAAe,IAAI;EACxC,UAAU;EACV,OAAO;EACP,GAAG;CACL;CAEA,IAAI,SAAS,CAAC,SACZ,OACE,oBAAC,iBAAD;EAAiB,WAAW;EAAmB,SAAS;EAAc;EACnE,UAAA;CACc,CAAA;CAIrB,IAAI,CAAC,KACH,OACE,oBAAC,OAAD;EAAK,WAAW;EAA0B;EACxC,UAAA,oBAAC,OAAD;GAAK,OAAO,EAAE,SAAS,GAAG;GAAG,UAAA;EAAiB,CAAA;CAC3C,CAAA;CAIT,OAAO,oBAAC,YAAD;EAAuB;EAAgB;EAAK,OAAO;EAAqB;CAAM,CAAA;AACvF,CACF;AAEA,cAAc,cAAc"}
@@ -0,0 +1,52 @@
1
+ //#region src/Mermaid/SyntaxMermaid/prepareInlineSvg.ts
2
+ /**
3
+ * Root custom properties beautiful-mermaid reads; everything else in its
4
+ * stylesheet is derived from these via color-mix().
5
+ */
6
+ const MERMAID_ROOT_VARS = [
7
+ "--bg",
8
+ "--fg",
9
+ "--line",
10
+ "--accent",
11
+ "--muted",
12
+ "--surface",
13
+ "--border"
14
+ ];
15
+ const styleBlockPattern = /<style>([\s\S]*?)<\/style>/;
16
+ const scopeCssSelectors = (css, scope) => css.replaceAll(/(^|})([^{}@]+)\{/g, (_match, tail, selectors) => {
17
+ return `${tail}\n${selectors.split(",").map((selector) => selector.trim()).filter(Boolean).map((selector) => selector === "svg" ? scope : `${scope} ${selector}`).join(", ")} {`;
18
+ });
19
+ /**
20
+ * A <style> element inside inline SVG applies to the whole document, so the
21
+ * generated rules must be scoped to this diagram before being injected. The
22
+ * font @import is dropped because inline rendering would actually issue the
23
+ * Google Fonts request that an <img>-loaded SVG silently blocks, and the bare
24
+ * `text` rule is dropped so page CSS can supply the theme font instead.
25
+ */
26
+ const prepareInlineMermaidSvg = (svg, scopeId) => {
27
+ if (!svg) return svg;
28
+ return svg.replace(/<svg\b/, `<svg id="${scopeId}"`).replace(styleBlockPattern, (_match, css) => {
29
+ const withoutFontRule = css.replaceAll(/@import[^;]*;/g, "").replaceAll(/(^|})\s*text\s*\{[^{}]*\}/g, "$1");
30
+ return `<style>${scopeCssSelectors(withoutFontRule, `#${scopeId}`)}</style>`;
31
+ });
32
+ };
33
+ /**
34
+ * Inline SVG resolves `var(--ant-*)` from the page, but a Blob-loaded copy is an
35
+ * isolated document with no access to them, so the root variables are baked in
36
+ * as literal values before serializing for preview or download.
37
+ */
38
+ const toStandaloneSvgString = (element) => {
39
+ const clone = element.cloneNode(true);
40
+ const computed = globalThis.getComputedStyle(element);
41
+ for (const name of MERMAID_ROOT_VARS) {
42
+ const value = computed.getPropertyValue(name).trim();
43
+ if (value) clone.style.setProperty(name, value);
44
+ }
45
+ const fontFamily = computed.fontFamily;
46
+ if (fontFamily) clone.style.setProperty("font-family", fontFamily);
47
+ return new XMLSerializer().serializeToString(clone);
48
+ };
49
+ //#endregion
50
+ export { MERMAID_ROOT_VARS, prepareInlineMermaidSvg, toStandaloneSvgString };
51
+
52
+ //# sourceMappingURL=prepareInlineSvg.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prepareInlineSvg.mjs","names":[],"sources":["../../../src/Mermaid/SyntaxMermaid/prepareInlineSvg.ts"],"sourcesContent":["/**\n * Root custom properties beautiful-mermaid reads; everything else in its\n * stylesheet is derived from these via color-mix().\n */\nexport const MERMAID_ROOT_VARS = [\n '--bg',\n '--fg',\n '--line',\n '--accent',\n '--muted',\n '--surface',\n '--border',\n];\n\nconst styleBlockPattern = /<style>([\\s\\S]*?)<\\/style>/;\n\nconst scopeCssSelectors = (css: string, scope: string): string =>\n css.replaceAll(/(^|})([^{}@]+)\\{/g, (_match, tail: string, selectors: string) => {\n const scoped = selectors\n .split(',')\n .map((selector) => selector.trim())\n .filter(Boolean)\n // The generated sheet targets `svg` for the root itself, not a descendant\n .map((selector) => (selector === 'svg' ? scope : `${scope} ${selector}`))\n .join(', ');\n\n return `${tail}\\n${scoped} {`;\n });\n\n/**\n * A <style> element inside inline SVG applies to the whole document, so the\n * generated rules must be scoped to this diagram before being injected. The\n * font @import is dropped because inline rendering would actually issue the\n * Google Fonts request that an <img>-loaded SVG silently blocks, and the bare\n * `text` rule is dropped so page CSS can supply the theme font instead.\n */\nexport const prepareInlineMermaidSvg = (svg: string, scopeId: string): string => {\n if (!svg) return svg;\n\n const withId = svg.replace(/<svg\\b/, `<svg id=\"${scopeId}\"`);\n\n return withId.replace(styleBlockPattern, (_match, css: string) => {\n const withoutImports = css.replaceAll(/@import[^;]*;/g, '');\n const withoutFontRule = withoutImports.replaceAll(/(^|})\\s*text\\s*\\{[^{}]*\\}/g, '$1');\n\n return `<style>${scopeCssSelectors(withoutFontRule, `#${scopeId}`)}</style>`;\n });\n};\n\n/**\n * Inline SVG resolves `var(--ant-*)` from the page, but a Blob-loaded copy is an\n * isolated document with no access to them, so the root variables are baked in\n * as literal values before serializing for preview or download.\n */\nexport const toStandaloneSvgString = (element: SVGElement): string => {\n const clone = element.cloneNode(true) as SVGElement;\n const computed = globalThis.getComputedStyle(element);\n\n for (const name of MERMAID_ROOT_VARS) {\n const value = computed.getPropertyValue(name).trim();\n if (value) clone.style.setProperty(name, value);\n }\n\n const fontFamily = computed.fontFamily;\n if (fontFamily) clone.style.setProperty('font-family', fontFamily);\n\n return new XMLSerializer().serializeToString(clone);\n};\n"],"mappings":";;;;;AAIA,MAAa,oBAAoB;CAC/B;CACA;CACA;CACA;CACA;CACA;CACA;AACF;AAEA,MAAM,oBAAoB;AAE1B,MAAM,qBAAqB,KAAa,UACtC,IAAI,WAAW,sBAAsB,QAAQ,MAAc,cAAsB;CAS/E,OAAO,GAAG,KAAK,IARA,UACZ,MAAM,GAAG,CAAC,CACV,KAAK,aAAa,SAAS,KAAK,CAAC,CAAC,CAClC,OAAO,OAAO,CAAC,CAEf,KAAK,aAAc,aAAa,QAAQ,QAAQ,GAAG,MAAM,GAAG,UAAW,CAAC,CACxE,KAAK,IAEgB,EAAE;AAC5B,CAAC;;;;;;;;AASH,MAAa,2BAA2B,KAAa,YAA4B;CAC/E,IAAI,CAAC,KAAK,OAAO;CAIjB,OAFe,IAAI,QAAQ,UAAU,YAAY,QAAQ,EAE7C,CAAC,CAAC,QAAQ,oBAAoB,QAAQ,QAAgB;EAEhE,MAAM,kBADiB,IAAI,WAAW,kBAAkB,EACnB,CAAC,CAAC,WAAW,8BAA8B,IAAI;EAEpF,OAAO,UAAU,kBAAkB,iBAAiB,IAAI,SAAS,EAAE;CACrE,CAAC;AACH;;;;;;AAOA,MAAa,yBAAyB,YAAgC;CACpE,MAAM,QAAQ,QAAQ,UAAU,IAAI;CACpC,MAAM,WAAW,WAAW,iBAAiB,OAAO;CAEpD,KAAK,MAAM,QAAQ,mBAAmB;EACpC,MAAM,QAAQ,SAAS,iBAAiB,IAAI,CAAC,CAAC,KAAK;EACnD,IAAI,OAAO,MAAM,MAAM,YAAY,MAAM,KAAK;CAChD;CAEA,MAAM,aAAa,SAAS;CAC5B,IAAI,YAAY,MAAM,MAAM,YAAY,eAAe,UAAU;CAEjE,OAAO,IAAI,cAAc,CAAC,CAAC,kBAAkB,KAAK;AACpD"}
@@ -0,0 +1,20 @@
1
+ //#region src/Mermaid/SyntaxMermaid/prepareMermaidSvg.ts
2
+ const voidElementPattern = new RegExp(`<(area|base|br|col|embed|hr|img|input|link|meta|param|source|track|wbr)((?:\\s[^>]*?)?)\\s*/?>`, "gi");
3
+ const ensureXmlSafeVoidElements = (svg) => svg.replaceAll(voidElementPattern, "<$1$2/>");
4
+ const applyFirefoxSizeFix = (svg) => {
5
+ if (typeof window === "undefined" || typeof navigator === "undefined" || !navigator.userAgent.includes("Firefox") || typeof DOMParser === "undefined") return svg;
6
+ const svgDoc = new DOMParser().parseFromString(svg, "image/svg+xml");
7
+ if (svgDoc.querySelector("parsererror")) return svg;
8
+ const svgElement = svgDoc.documentElement;
9
+ if (!svgElement || svgElement.localName !== "svg" || !svgElement.hasAttribute("viewBox")) return svg;
10
+ const viewBoxParts = svgElement.getAttribute("viewBox").split(" ");
11
+ if (viewBoxParts.length !== 4) return svg;
12
+ svgElement.setAttribute("width", viewBoxParts[2]);
13
+ svgElement.setAttribute("height", viewBoxParts[3]);
14
+ return new XMLSerializer().serializeToString(svgDoc);
15
+ };
16
+ const prepareMermaidSvgString = (svg) => applyFirefoxSizeFix(ensureXmlSafeVoidElements(svg));
17
+ //#endregion
18
+ export { prepareMermaidSvgString };
19
+
20
+ //# sourceMappingURL=prepareMermaidSvg.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prepareMermaidSvg.mjs","names":[],"sources":["../../../src/Mermaid/SyntaxMermaid/prepareMermaidSvg.ts"],"sourcesContent":["const VOID_ELEMENTS = 'area|base|br|col|embed|hr|img|input|link|meta|param|source|track|wbr';\nconst voidElementPattern = new RegExp(`<(${VOID_ELEMENTS})((?:\\\\s[^>]*?)?)\\\\s*/?>`, 'gi');\n\n// Mermaid serializes HTML labels (foreignObject) with HTML rules, leaving void elements\n// like <br> unclosed. When that SVG string is loaded as a standalone image/svg+xml Blob,\n// the browser parses it as strict XML, rejects the unclosed tag, and fails the whole image.\nconst ensureXmlSafeVoidElements = (svg: string): string =>\n svg.replaceAll(voidElementPattern, '<$1$2/>');\n\nconst applyFirefoxSizeFix = (svg: string): string => {\n if (\n typeof window === 'undefined' ||\n typeof navigator === 'undefined' ||\n !navigator.userAgent.includes('Firefox') ||\n typeof DOMParser === 'undefined'\n ) {\n return svg;\n }\n\n const svgDoc = new DOMParser().parseFromString(svg, 'image/svg+xml');\n if (svgDoc.querySelector('parsererror')) return svg;\n\n const svgElement = svgDoc.documentElement;\n if (!svgElement || svgElement.localName !== 'svg' || !svgElement.hasAttribute('viewBox')) {\n return svg;\n }\n\n const viewBoxParts = svgElement.getAttribute('viewBox')!.split(' ');\n if (viewBoxParts.length !== 4) return svg;\n\n svgElement.setAttribute('width', viewBoxParts[2]!);\n svgElement.setAttribute('height', viewBoxParts[3]!);\n return new XMLSerializer().serializeToString(svgDoc);\n};\n\nexport const prepareMermaidSvgString = (svg: string): string =>\n applyFirefoxSizeFix(ensureXmlSafeVoidElements(svg));\n"],"mappings":";AACA,MAAM,qBAAqB,IAAI,OAAO,kGAA8C,IAAI;AAKxF,MAAM,6BAA6B,QACjC,IAAI,WAAW,oBAAoB,SAAS;AAE9C,MAAM,uBAAuB,QAAwB;CACnD,IACE,OAAO,WAAW,eAClB,OAAO,cAAc,eACrB,CAAC,UAAU,UAAU,SAAS,SAAS,KACvC,OAAO,cAAc,aAErB,OAAO;CAGT,MAAM,SAAS,IAAI,UAAU,CAAC,CAAC,gBAAgB,KAAK,eAAe;CACnE,IAAI,OAAO,cAAc,aAAa,GAAG,OAAO;CAEhD,MAAM,aAAa,OAAO;CAC1B,IAAI,CAAC,cAAc,WAAW,cAAc,SAAS,CAAC,WAAW,aAAa,SAAS,GACrF,OAAO;CAGT,MAAM,eAAe,WAAW,aAAa,SAAS,CAAC,CAAE,MAAM,GAAG;CAClE,IAAI,aAAa,WAAW,GAAG,OAAO;CAEtC,WAAW,aAAa,SAAS,aAAa,EAAG;CACjD,WAAW,aAAa,UAAU,aAAa,EAAG;CAClD,OAAO,IAAI,cAAc,CAAC,CAAC,kBAAkB,MAAM;AACrD;AAEA,MAAa,2BAA2B,QACtC,oBAAoB,0BAA0B,GAAG,CAAC"}
@@ -23,6 +23,17 @@ const styles = createStaticStyles(({ css, cssVar }) => {
23
23
  width: 100%;
24
24
  height: auto;
25
25
  }
26
+
27
+ svg {
28
+ display: block;
29
+ width: 100%;
30
+ height: auto;
31
+ max-height: 480px;
32
+ }
33
+
34
+ svg text {
35
+ font-family: ${cssVar.fontFamily};
36
+ }
26
37
  `),
27
38
  noBackground: css`
28
39
  img {
@@ -1 +1 @@
1
- {"version":3,"file":"style.mjs","names":[],"sources":["../../../src/Mermaid/SyntaxMermaid/style.ts"],"sourcesContent":["import { createStaticStyles, cx, keyframes } from 'antd-style';\nimport { cva } from 'class-variance-authority';\n\nconst fadeIn = keyframes`\n 0% {\n opacity: 0;\n }\n 100% {\n opacity: 1;\n }\n`;\n\nexport const styles = createStaticStyles(({ css, cssVar }) => {\n return {\n animated: css`\n img {\n opacity: 1;\n animation: ${fadeIn} 0.5s ease-in-out;\n }\n `,\n\n mermaid: cx(\n 'ant-mermaid-mermaid',\n css`\n img {\n display: block;\n width: 100%;\n height: auto;\n }\n `,\n ),\n\n noBackground: css`\n img {\n background: transparent !important;\n }\n `,\n\n noPadding: css`\n padding: 0;\n `,\n\n padding: css`\n padding: 16px;\n `,\n\n root: css`\n direction: ltr;\n margin: 0;\n padding: 0;\n text-align: start;\n `,\n\n unmermaid: css`\n color: ${cssVar.colorTextDescription};\n `,\n };\n});\n\nexport const variants = cva(styles.root, {\n defaultVariants: {\n animated: false,\n mermaid: true,\n showBackground: false,\n variant: 'borderless',\n },\n\n variants: {\n mermaid: {\n false: styles.unmermaid,\n true: styles.mermaid,\n },\n showBackground: {\n false: styles.noBackground,\n true: null,\n },\n animated: {\n true: styles.animated,\n false: null,\n },\n variant: {\n filled: styles.padding,\n outlined: styles.padding,\n borderless: styles.noPadding,\n },\n },\n});\n"],"mappings":";;;AAGA,MAAM,SAAS,SAAS;;;;;;;;AASxB,MAAa,SAAS,oBAAoB,EAAE,KAAK,aAAa;CAC5D,OAAO;EACL,UAAU,GAAG;;;qBAGI,OAAO;;;EAIxB,SAAS,GACP,uBACA,GAAG;;;;;;OAOL;EAEA,cAAc,GAAG;;;;;EAMjB,WAAW,GAAG;;;EAId,SAAS,GAAG;;;EAIZ,MAAM,GAAG;;;;;;EAOT,WAAW,GAAG;eACH,OAAO,qBAAqB;;CAEzC;AACF,CAAC;AAED,MAAa,WAAW,IAAI,OAAO,MAAM;CACvC,iBAAiB;EACf,UAAU;EACV,SAAS;EACT,gBAAgB;EAChB,SAAS;CACX;CAEA,UAAU;EACR,SAAS;GACP,OAAO,OAAO;GACd,MAAM,OAAO;EACf;EACA,gBAAgB;GACd,OAAO,OAAO;GACd,MAAM;EACR;EACA,UAAU;GACR,MAAM,OAAO;GACb,OAAO;EACT;EACA,SAAS;GACP,QAAQ,OAAO;GACf,UAAU,OAAO;GACjB,YAAY,OAAO;EACrB;CACF;AACF,CAAC"}
1
+ {"version":3,"file":"style.mjs","names":[],"sources":["../../../src/Mermaid/SyntaxMermaid/style.ts"],"sourcesContent":["import { createStaticStyles, cx, keyframes } from 'antd-style';\nimport { cva } from 'class-variance-authority';\n\nconst fadeIn = keyframes`\n 0% {\n opacity: 0;\n }\n 100% {\n opacity: 1;\n }\n`;\n\nexport const styles = createStaticStyles(({ css, cssVar }) => {\n return {\n animated: css`\n img {\n opacity: 1;\n animation: ${fadeIn} 0.5s ease-in-out;\n }\n `,\n\n mermaid: cx(\n 'ant-mermaid-mermaid',\n css`\n img {\n display: block;\n width: 100%;\n height: auto;\n }\n\n svg {\n display: block;\n width: 100%;\n height: auto;\n max-height: 480px;\n }\n\n svg text {\n font-family: ${cssVar.fontFamily};\n }\n `,\n ),\n\n noBackground: css`\n img {\n background: transparent !important;\n }\n `,\n\n noPadding: css`\n padding: 0;\n `,\n\n padding: css`\n padding: 16px;\n `,\n\n root: css`\n direction: ltr;\n margin: 0;\n padding: 0;\n text-align: start;\n `,\n\n unmermaid: css`\n color: ${cssVar.colorTextDescription};\n `,\n };\n});\n\nexport const variants = cva(styles.root, {\n defaultVariants: {\n animated: false,\n mermaid: true,\n showBackground: false,\n variant: 'borderless',\n },\n\n variants: {\n mermaid: {\n false: styles.unmermaid,\n true: styles.mermaid,\n },\n showBackground: {\n false: styles.noBackground,\n true: null,\n },\n animated: {\n true: styles.animated,\n false: null,\n },\n variant: {\n filled: styles.padding,\n outlined: styles.padding,\n borderless: styles.noPadding,\n },\n },\n});\n"],"mappings":";;;AAGA,MAAM,SAAS,SAAS;;;;;;;;AASxB,MAAa,SAAS,oBAAoB,EAAE,KAAK,aAAa;CAC5D,OAAO;EACL,UAAU,GAAG;;;qBAGI,OAAO;;;EAIxB,SAAS,GACP,uBACA,GAAG;;;;;;;;;;;;;;;yBAegB,OAAO,WAAW;;OAGvC;EAEA,cAAc,GAAG;;;;;EAMjB,WAAW,GAAG;;;EAId,SAAS,GAAG;;;EAIZ,MAAM,GAAG;;;;;;EAOT,WAAW,GAAG;eACH,OAAO,qBAAqB;;CAEzC;AACF,CAAC;AAED,MAAa,WAAW,IAAI,OAAO,MAAM;CACvC,iBAAiB;EACf,UAAU;EACV,SAAS;EACT,gBAAgB;EAChB,SAAS;CACX;CAEA,UAAU;EACR,SAAS;GACP,OAAO,OAAO;GACd,MAAM,OAAO;EACf;EACA,gBAAgB;GACd,OAAO,OAAO;GACd,MAAM;EACR;EACA,UAAU;GACR,MAAM,OAAO;GACb,OAAO;EACT;EACA,SAAS;GACP,QAAQ,OAAO;GACf,UAAU,OAAO;GACjB,YAAY,OAAO;EACrB;CACF;AACF,CAAC"}