@lobehub/ui 5.23.5 → 5.24.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 (299) hide show
  1. package/es/Accordion/Accordion.mjs.map +1 -1
  2. package/es/Accordion/AccordionItem.mjs.map +1 -1
  3. package/es/Accordion/ArrowIcon.mjs.map +1 -1
  4. package/es/ActionIcon/ActionIcon.mjs.map +1 -1
  5. package/es/ActionIconGroup/ActionIconGroup.mjs.map +1 -1
  6. package/es/Alert/Alert.mjs.map +1 -1
  7. package/es/Avatar/Avatar.mjs.map +1 -1
  8. package/es/Avatar/AvatarGroup/index.mjs.map +1 -1
  9. package/es/Burger/Burger.mjs.map +1 -1
  10. package/es/Checkbox/Checkbox.mjs.map +1 -1
  11. package/es/Checkbox/CheckboxGroup.mjs.map +1 -1
  12. package/es/CodeDiff/DiffPanel.mjs.map +1 -1
  13. package/es/CodeEditor/CodeEditor.mjs.map +1 -1
  14. package/es/Collapse/Collapse.mjs.map +1 -1
  15. package/es/ColorSwatches/ColorSwatches.mjs.map +1 -1
  16. package/es/ConfigProvider/index.mjs.map +1 -1
  17. package/es/ContextMenu/index.d.mts +2 -2
  18. package/es/ContextMenu/index.mjs +2 -2
  19. package/es/DraggablePanel/DraggablePanel.mjs.map +1 -1
  20. package/es/DraggablePanel/components/DraggablePanelHeader.mjs.map +1 -1
  21. package/es/DraggableSideNav/DraggableSideNav.mjs.map +1 -1
  22. package/es/Drawer/Drawer.mjs.map +1 -1
  23. package/es/Dropdown/Dropdown.mjs.map +1 -1
  24. package/es/EditableText/ControlInput.mjs.map +1 -1
  25. package/es/EditableText/EditableText.mjs.map +1 -1
  26. package/es/EditorSlashMenu/EditorSlashMenu.mjs.map +1 -1
  27. package/es/EditorSlashMenu/MenuItemRenderer.mjs.map +1 -1
  28. package/es/EmojiPicker/AvatarUploader.mjs.map +1 -1
  29. package/es/EmojiPicker/EmojiPicker.mjs.map +1 -1
  30. package/es/Empty/Empty.mjs.map +1 -1
  31. package/es/FileTypeIcon/FileTypeIcon.mjs.map +1 -1
  32. package/es/FileTypeIcon/components/FileIcon.mjs.map +1 -1
  33. package/es/FileTypeIcon/components/FolderIcon.mjs.map +1 -1
  34. package/es/FluentEmoji/FluentEmoji.mjs.map +1 -1
  35. package/es/Footer/Footer.mjs.map +1 -1
  36. package/es/Form/Form.mjs.map +1 -1
  37. package/es/Form/components/FormGroup.mjs.map +1 -1
  38. package/es/Form/components/FormSubmitFooter.mjs.map +1 -1
  39. package/es/Form/components/FormTitle.mjs.map +1 -1
  40. package/es/FormModal/FormModal.mjs.map +1 -1
  41. package/es/Freeze/Freeze.mjs.map +1 -1
  42. package/es/GroupAvatar/GroupAvatar.mjs.map +1 -1
  43. package/es/GuideCard/GuideCard.mjs.map +1 -1
  44. package/es/Header/Header.mjs.map +1 -1
  45. package/es/Highlighter/FullFeatured.mjs.map +1 -1
  46. package/es/Highlighter/Highlighter.mjs.map +1 -1
  47. package/es/Highlighter/LangSelect.mjs.map +1 -1
  48. package/es/Highlighter/SyntaxHighlighter/StreamRenderer.mjs.map +1 -1
  49. package/es/Highlighter/SyntaxHighlighter/style.mjs +2 -2
  50. package/es/Highlighter/SyntaxHighlighter/style.mjs.map +1 -1
  51. package/es/Hotkey/Hotkey.mjs.map +1 -1
  52. package/es/HotkeyInput/HotkeyInput.mjs.map +1 -1
  53. package/es/HtmlPreview/HtmlPreview.mjs.map +1 -1
  54. package/es/HtmlPreview/Iframe.mjs.map +1 -1
  55. package/es/Icon/Icon.mjs.map +1 -1
  56. package/es/Image/Image.mjs.map +1 -1
  57. package/es/Image/components/Toolbar.mjs.map +1 -1
  58. package/es/Image/components/usePreview.mjs.map +1 -1
  59. package/es/Image/components/usePreviewGroup.mjs.map +1 -1
  60. package/es/ImageSelect/ImageSelect.mjs.map +1 -1
  61. package/es/Layout/Layout.mjs.map +1 -1
  62. package/es/List/List.mjs.map +1 -1
  63. package/es/List/ListItem/index.mjs.map +1 -1
  64. package/es/Markdown/Markdown.mjs.map +1 -1
  65. package/es/Markdown/SyntaxMarkdown/MarkdownRender.mjs.map +1 -1
  66. package/es/Markdown/SyntaxMarkdown/StreamdownRender.mjs.map +1 -1
  67. package/es/Markdown/SyntaxMarkdown/style.mjs.map +1 -1
  68. package/es/Markdown/components/CodeBlock.mjs.map +1 -1
  69. package/es/Markdown/components/Footnotes.mjs.map +1 -1
  70. package/es/Markdown/components/MarkdownTable/index.mjs.map +1 -1
  71. package/es/Markdown/components/SearchResultCards/SearchResultCard.mjs.map +1 -1
  72. package/es/Markdown/components/SearchResultCards/index.mjs.map +1 -1
  73. package/es/MaterialFileTypeIcon/MaterialFileTypeIcon.mjs.map +1 -1
  74. package/es/Menu/Menu.mjs.map +1 -1
  75. package/es/Mermaid/FullFeatured.mjs.map +1 -1
  76. package/es/Mermaid/Mermaid.mjs.map +1 -1
  77. package/es/Mermaid/SyntaxMermaid/MermaidFallback.mjs +35 -0
  78. package/es/Mermaid/SyntaxMermaid/MermaidFallback.mjs.map +1 -0
  79. package/es/Mermaid/SyntaxMermaid/MermaidSvg.mjs +52 -0
  80. package/es/Mermaid/SyntaxMermaid/MermaidSvg.mjs.map +1 -0
  81. package/es/Mermaid/SyntaxMermaid/StaticMermaid.mjs +13 -42
  82. package/es/Mermaid/SyntaxMermaid/StaticMermaid.mjs.map +1 -1
  83. package/es/Mermaid/SyntaxMermaid/StreamMermaid.mjs +13 -43
  84. package/es/Mermaid/SyntaxMermaid/StreamMermaid.mjs.map +1 -1
  85. package/es/Mermaid/SyntaxMermaid/prepareInlineSvg.mjs +52 -0
  86. package/es/Mermaid/SyntaxMermaid/prepareInlineSvg.mjs.map +1 -0
  87. package/es/Mermaid/SyntaxMermaid/prepareMermaidSvg.mjs +20 -0
  88. package/es/Mermaid/SyntaxMermaid/prepareMermaidSvg.mjs.map +1 -0
  89. package/es/Mermaid/SyntaxMermaid/style.mjs +11 -0
  90. package/es/Mermaid/SyntaxMermaid/style.mjs.map +1 -1
  91. package/es/Mermaid/const.mjs +10 -31
  92. package/es/Mermaid/const.mjs.map +1 -1
  93. package/es/Mermaid/index.d.mts +2 -1
  94. package/es/Mermaid/index.mjs +2 -1
  95. package/es/Mermaid/type.d.mts +2 -2
  96. package/es/Modal/Modal.mjs.map +1 -1
  97. package/es/Modal/ModalStackItem.mjs.map +1 -1
  98. package/es/Modal/RawModalStackItem.mjs.map +1 -1
  99. package/es/Modal/imperative.mjs.map +1 -1
  100. package/es/Modal/style.mjs.map +1 -1
  101. package/es/NeuralNetworkLoading/NeuralNetworkLoading.mjs.map +1 -1
  102. package/es/ScrollShadow/ScrollShadow.mjs.map +1 -1
  103. package/es/SearchBar/SearchBar.mjs.map +1 -1
  104. package/es/SideNav/SideNav.mjs.map +1 -1
  105. package/es/Skeleton/Skeleton.mjs.map +1 -1
  106. package/es/Skeleton/SkeletonParagraph.mjs.map +1 -1
  107. package/es/Skeleton/SkeletonTags.mjs.map +1 -1
  108. package/es/SliderWithInput/SliderWithInput.mjs.map +1 -1
  109. package/es/Snippet/Snippet.mjs.map +1 -1
  110. package/es/SortableList/SortableList.mjs.map +1 -1
  111. package/es/SortableList/components/SortableItem.mjs.map +1 -1
  112. package/es/Text/Text.mjs.map +1 -1
  113. package/es/ThemeProvider/ThemeProvider.mjs +1 -1
  114. package/es/ThemeProvider/ThemeProvider.mjs.map +1 -1
  115. package/es/ThemeSwitch/ThemeSwitch.mjs.map +1 -1
  116. package/es/Toc/Toc.mjs.map +1 -1
  117. package/es/Toc/TocMobile.mjs.map +1 -1
  118. package/es/Video/index.mjs.map +1 -1
  119. package/es/awesome/AuroraBackground/AuroraBackground.mjs.map +1 -1
  120. package/es/awesome/Features/FeatureItem.mjs.map +1 -1
  121. package/es/awesome/Giscus/Giscus.mjs.map +1 -1
  122. package/es/awesome/GradientButton/GradientButton.mjs.map +1 -1
  123. package/es/awesome/GridBackground/GridBackground.mjs.map +1 -1
  124. package/es/awesome/GridBackground/GridShowcase.mjs.map +1 -1
  125. package/es/awesome/GridBackground/components/Grid.mjs.map +1 -1
  126. package/es/awesome/Hero/Hero.mjs.map +1 -1
  127. package/es/awesome/Spline/ParentSize.mjs.map +1 -1
  128. package/es/awesome/Spline/Spine.mjs.map +1 -1
  129. package/es/awesome/SpotlightCard/SpotlightCard.mjs.map +1 -1
  130. package/es/awesome/SpotlightCard/SpotlightCardItem.mjs.map +1 -1
  131. package/es/awesome/TypewriterEffect/TypewriterEffect.mjs.map +1 -1
  132. package/es/base-ui/AutoComplete/AutoComplete.mjs.map +1 -1
  133. package/es/base-ui/Button/Button.mjs.map +1 -1
  134. package/es/base-ui/Button/SplitButton.mjs.map +1 -1
  135. package/es/base-ui/Checkbox/Checkbox.mjs.map +1 -1
  136. package/es/base-ui/Checkbox/CheckboxGroup.mjs.map +1 -1
  137. package/es/base-ui/ContextMenu/ContextMenuHost.mjs.map +1 -1
  138. package/es/base-ui/ContextMenu/imperative.d.mts +2 -2
  139. package/es/base-ui/ContextMenu/index.d.mts +2 -2
  140. package/es/base-ui/ContextMenu/renderItems.mjs.map +1 -1
  141. package/es/base-ui/ContextMenu/store.d.mts +13 -1
  142. package/es/base-ui/ContextMenu/store.mjs +29 -4
  143. package/es/base-ui/ContextMenu/store.mjs.map +1 -1
  144. package/es/base-ui/DropdownMenu/DropdownMenu.mjs.map +1 -1
  145. package/es/base-ui/DropdownMenu/atoms.mjs.map +1 -1
  146. package/es/base-ui/DropdownMenu/renderItems.mjs.map +1 -1
  147. package/es/base-ui/DropdownMenu/sharedStyle.mjs +3 -0
  148. package/es/base-ui/DropdownMenu/sharedStyle.mjs.map +1 -1
  149. package/es/base-ui/FloatingPanel/FloatingPanel.mjs.map +1 -1
  150. package/es/base-ui/FloatingSheet/FloatingSheet.mjs.map +1 -1
  151. package/es/base-ui/FloatingSheet/FloatingSheetHeader.mjs.map +1 -1
  152. package/es/base-ui/Form/Form.mjs.map +1 -1
  153. package/es/base-ui/Form/components/FormField.mjs.map +1 -1
  154. package/es/base-ui/Form/components/FormGroup.mjs.map +1 -1
  155. package/es/base-ui/Form/components/FormSubmitFooter.mjs.map +1 -1
  156. package/es/base-ui/Form/components/FormTitle.mjs.map +1 -1
  157. package/es/base-ui/Input/Input.mjs.map +1 -1
  158. package/es/base-ui/Input/InputNumber.mjs.map +1 -1
  159. package/es/base-ui/Input/InputOTP.mjs.map +1 -1
  160. package/es/base-ui/Input/InputPassword.mjs.map +1 -1
  161. package/es/base-ui/Input/TextArea.mjs.map +1 -1
  162. package/es/base-ui/Input/style.d.mts +1 -1
  163. package/es/base-ui/Modal/Modal.mjs.map +1 -1
  164. package/es/base-ui/Modal/atoms.mjs.map +1 -1
  165. package/es/base-ui/Modal/imperative.mjs.map +1 -1
  166. package/es/base-ui/Popover/ArrowIcon.mjs.map +1 -1
  167. package/es/base-ui/Popover/PopoverGroup.mjs.map +1 -1
  168. package/es/base-ui/Popover/PopoverStandalone.mjs.map +1 -1
  169. package/es/base-ui/Popover/atoms.mjs.map +1 -1
  170. package/es/base-ui/Radio/Radio.mjs.map +1 -1
  171. package/es/base-ui/Radio/RadioGroup.mjs.map +1 -1
  172. package/es/base-ui/ScrollArea/ScrollArea.mjs.map +1 -1
  173. package/es/base-ui/Segmented/Segmented.mjs.map +1 -1
  174. package/es/base-ui/Select/Select.mjs.map +1 -1
  175. package/es/base-ui/Select/parts.mjs.map +1 -1
  176. package/es/base-ui/Select/renderOptions.mjs.map +1 -1
  177. package/es/base-ui/Slider/Slider.mjs.map +1 -1
  178. package/es/base-ui/Slider/SliderWithInput.mjs.map +1 -1
  179. package/es/base-ui/SubmenuArrowIcon.mjs.map +1 -1
  180. package/es/base-ui/Switch/Switch.mjs.map +1 -1
  181. package/es/base-ui/Switch/atoms.d.mts +3 -3
  182. package/es/base-ui/Switch/atoms.mjs +99 -50
  183. package/es/base-ui/Switch/atoms.mjs.map +1 -1
  184. package/es/base-ui/Switch/style.mjs +44 -1
  185. package/es/base-ui/Switch/style.mjs.map +1 -1
  186. package/es/base-ui/Switch/type.d.mts +3 -7
  187. package/es/base-ui/Tabs/Tabs.mjs.map +1 -1
  188. package/es/base-ui/Tabs/atoms.mjs.map +1 -1
  189. package/es/base-ui/Toast/Toast.mjs.map +1 -1
  190. package/es/base-ui/Toast/imperative.mjs.map +1 -1
  191. package/es/base-ui/Tooltip/ArrowIcon.mjs.map +1 -1
  192. package/es/base-ui/Tooltip/TooltipGroup.mjs.map +1 -1
  193. package/es/base-ui/Tooltip/TooltipStandalone.mjs.map +1 -1
  194. package/es/base-ui/index.d.mts +2 -2
  195. package/es/base-ui/index.mjs +2 -2
  196. package/es/brand/LobeChat/index.mjs.map +1 -1
  197. package/es/brand/LobeChatText/index.mjs.map +1 -1
  198. package/es/brand/LobeHub/index.mjs.map +1 -1
  199. package/es/brand/LobeHubText/index.mjs.map +1 -1
  200. package/es/brand/LogoThree/Loading.mjs.map +1 -1
  201. package/es/brand/LogoThree/LogoSpline.mjs.map +1 -1
  202. package/es/brand/LogoThree/index.mjs.map +1 -1
  203. package/es/brand/components/Divider.mjs.map +1 -1
  204. package/es/chat/BackBottom/BackBottom.mjs.map +1 -1
  205. package/es/chat/ChatHeader/ChatHeader.mjs.map +1 -1
  206. package/es/chat/ChatHeader/ChatHeaderTitle.mjs.map +1 -1
  207. package/es/chat/ChatInputArea/ChatInputArea.mjs.map +1 -1
  208. package/es/chat/ChatInputArea/components/ChatInputActionBar.mjs.map +1 -1
  209. package/es/chat/ChatInputArea/components/ChatSendButton.mjs.map +1 -1
  210. package/es/chat/ChatItem/ChatItem.mjs.map +1 -1
  211. package/es/chat/ChatItem/components/Actions.mjs.map +1 -1
  212. package/es/chat/ChatItem/components/Avatar.mjs.map +1 -1
  213. package/es/chat/ChatItem/components/ErrorContent.mjs.map +1 -1
  214. package/es/chat/ChatItem/components/Loading.mjs.map +1 -1
  215. package/es/chat/ChatItem/components/MessageContent.mjs.map +1 -1
  216. package/es/chat/ChatItem/components/Title.mjs.map +1 -1
  217. package/es/chat/ChatList/ChatList.mjs.map +1 -1
  218. package/es/chat/ChatList/components/HistoryDivider.mjs.map +1 -1
  219. package/es/chat/EditableMessage/EditableMessage.mjs.map +1 -1
  220. package/es/chat/EditableMessageList/EditableMessageList.mjs.map +1 -1
  221. package/es/chat/LoadingDots/LoadingDots.mjs.map +1 -1
  222. package/es/chat/MessageInput/MessageInput.mjs.map +1 -1
  223. package/es/chat/MessageModal/MessageModal.mjs.map +1 -1
  224. package/es/color/ColorScales/ScaleRow.mjs.map +1 -1
  225. package/es/color/ColorScales/index.mjs.map +1 -1
  226. package/es/color/CssVar/ScaleRow.mjs.map +1 -1
  227. package/es/color/CssVar/VarRow.mjs.map +1 -1
  228. package/es/color/CssVar/index.mjs.map +1 -1
  229. package/es/hooks/useMarkdown/latex.mjs.map +1 -1
  230. package/es/hooks/useMarkdown/useMarkdownContent.mjs.map +1 -1
  231. package/es/hooks/useMermaid.mjs +80 -116
  232. package/es/hooks/useMermaid.mjs.map +1 -1
  233. package/es/hooks/useMermaidCdn.d.mts +10 -0
  234. package/es/hooks/useMermaidCdn.mjs +97 -0
  235. package/es/hooks/useMermaidCdn.mjs.map +1 -0
  236. package/es/hooks/useStreamMermaid.mjs +19 -70
  237. package/es/hooks/useStreamMermaid.mjs.map +1 -1
  238. package/es/icons/Auth0/components/Mono.mjs.map +1 -1
  239. package/es/icons/Authelia/components/Color.mjs.map +1 -1
  240. package/es/icons/Authelia/components/Mono.mjs.map +1 -1
  241. package/es/icons/Authentik/components/Color.mjs.map +1 -1
  242. package/es/icons/Authentik/components/Mono.mjs.map +1 -1
  243. package/es/icons/Casdoor/components/Color.mjs.map +1 -1
  244. package/es/icons/Casdoor/components/Mono.mjs.map +1 -1
  245. package/es/icons/Clerk/components/Color.mjs.map +1 -1
  246. package/es/icons/Clerk/components/Mono.mjs.map +1 -1
  247. package/es/icons/DingTalk/components/Color.mjs.map +1 -1
  248. package/es/icons/DingTalk/components/Mono.mjs.map +1 -1
  249. package/es/icons/Discord/components/Color.mjs.map +1 -1
  250. package/es/icons/Discord/components/Mono.mjs.map +1 -1
  251. package/es/icons/GoogleChat/components/Color.mjs.map +1 -1
  252. package/es/icons/GoogleChat/components/Mono.mjs.map +1 -1
  253. package/es/icons/IMessage/components/Color.mjs.map +1 -1
  254. package/es/icons/IMessage/components/Inner.mjs.map +1 -1
  255. package/es/icons/IMessage/components/Mono.mjs.map +1 -1
  256. package/es/icons/Lark/components/Color.mjs.map +1 -1
  257. package/es/icons/Lark/components/Mono.mjs.map +1 -1
  258. package/es/icons/Line/components/Color.mjs.map +1 -1
  259. package/es/icons/Line/components/Mono.mjs.map +1 -1
  260. package/es/icons/Logto/components/Color.mjs.map +1 -1
  261. package/es/icons/Logto/components/Mono.mjs.map +1 -1
  262. package/es/icons/MicrosoftEntra/components/Color.mjs.map +1 -1
  263. package/es/icons/MicrosoftEntra/components/Mono.mjs.map +1 -1
  264. package/es/icons/MicrosoftTeams/components/Color.mjs.map +1 -1
  265. package/es/icons/MicrosoftTeams/components/Mono.mjs.map +1 -1
  266. package/es/icons/NextAuth/components/Color.mjs.map +1 -1
  267. package/es/icons/NextAuth/components/Mono.mjs.map +1 -1
  268. package/es/icons/QQ/components/Color.mjs.map +1 -1
  269. package/es/icons/QQ/components/Mono.mjs.map +1 -1
  270. package/es/icons/Slack/components/Color.mjs.map +1 -1
  271. package/es/icons/Slack/components/Mono.mjs.map +1 -1
  272. package/es/icons/Telegram/components/Color.mjs.map +1 -1
  273. package/es/icons/Telegram/components/Inner.mjs.map +1 -1
  274. package/es/icons/Telegram/components/Mono.mjs.map +1 -1
  275. package/es/icons/WeChat/components/Color.mjs.map +1 -1
  276. package/es/icons/WeChat/components/Mono.mjs.map +1 -1
  277. package/es/icons/WhatsApp/components/Color.mjs.map +1 -1
  278. package/es/icons/WhatsApp/components/Mono.mjs.map +1 -1
  279. package/es/icons/Zitadel/components/Color.mjs.map +1 -1
  280. package/es/icons/Zitadel/components/Mono.mjs.map +1 -1
  281. package/es/index.d.mts +2 -2
  282. package/es/index.mjs +2 -2
  283. package/es/mdx/Callout/index.mjs.map +1 -1
  284. package/es/mdx/Cards/Card.mjs.map +1 -1
  285. package/es/mdx/FileTree/File.mjs.map +1 -1
  286. package/es/mdx/FileTree/Folder.mjs.map +1 -1
  287. package/es/mdx/Mdx/index.mjs.map +1 -1
  288. package/es/mdx/Tabs/Tab.mjs.map +1 -1
  289. package/es/mdx/Tabs/index.mjs.map +1 -1
  290. package/es/mdx/mdxComponents/Citation/PopoverPanel.mjs.map +1 -1
  291. package/es/mdx/mdxComponents/Citation/index.mjs.map +1 -1
  292. package/es/mdx/mdxComponents/CodeBlock.mjs.map +1 -1
  293. package/es/mdx/mdxComponents/Link.mjs.map +1 -1
  294. package/es/mobile/ChatHeader/ChatHeader.mjs.map +1 -1
  295. package/es/mobile/ChatHeader/ChatHeaderTitle.mjs.map +1 -1
  296. package/es/mobile/ChatInputArea/ChatInputArea.mjs.map +1 -1
  297. package/es/mobile/TabBar/TabBar.mjs.map +1 -1
  298. package/es/storybook/StoryBook/index.mjs.map +1 -1
  299. package/package.json +3 -4
@@ -1,133 +1,97 @@
1
1
  "use client";
2
- import { useEffect, useMemo, useState } from "react";
3
- import { useTheme } from "antd-style";
4
- import { Md5 } from "ts-md5";
2
+ import { prepareInlineMermaidSvg } from "../Mermaid/SyntaxMermaid/prepareInlineSvg.mjs";
3
+ import { createCdnMermaidConfig, renderWithCdnMermaid } from "./useMermaidCdn.mjs";
4
+ import { useEffect, useId, useMemo, useState } from "react";
5
+ import { useThemeMode } from "antd-style";
6
+ import { THEMES, renderMermaidSVG } from "beautiful-mermaid";
5
7
  //#region src/hooks/useMermaid.ts
6
- const MD5_LENGTH_THRESHOLD = 1e4;
7
- const mermaidCache = /* @__PURE__ */ new Map();
8
- const MAX_CACHE_SIZE = 500;
9
- const cleanupCache = () => {
10
- if (mermaidCache.size > MAX_CACHE_SIZE) {
11
- const entriesToRemove = Math.floor(MAX_CACHE_SIZE * .2);
12
- const keysToRemove = Array.from(mermaidCache.keys()).slice(0, entriesToRemove);
13
- for (const key of keysToRemove) mermaidCache.delete(key);
14
- }
15
- };
16
- let mermaidPromise = null;
17
- const loadMermaid = () => {
18
- if (typeof window === "undefined") return Promise.resolve(null);
19
- if (!mermaidPromise) mermaidPromise = import("mermaid").then((mod) => mod.default);
20
- return mermaidPromise;
8
+ /**
9
+ * beautiful-mermaid emits these as CSS custom properties on the SVG root and
10
+ * derives the rest with color-mix(), so pointing them at antd's variables lets
11
+ * the diagram follow the theme through CSS alone — no token subscription, and
12
+ * no re-render (or re-layout) when the appearance changes.
13
+ */
14
+ const LOBE_THEME_OPTIONS = {
15
+ accent: "var(--ant-color-primary)",
16
+ bg: "var(--ant-color-bg-container)",
17
+ border: "var(--ant-color-border)",
18
+ fg: "var(--ant-color-text)",
19
+ line: "var(--ant-color-text-secondary)",
20
+ muted: "var(--ant-color-text-description)",
21
+ surface: "var(--ant-color-fill-tertiary)",
22
+ transparent: true
21
23
  };
22
- const createMermaidConfig = (theme, customTheme, securityLevel = "strict") => ({
23
- fontFamily: theme.fontFamilyCode,
24
- gantt: { useWidth: 1920 },
25
- securityLevel,
26
- startOnLoad: false,
27
- theme: customTheme || (theme.isDarkMode ? "dark" : "neutral"),
28
- themeVariables: customTheme ? void 0 : {
29
- errorBkgColor: theme.colorTextDescription,
30
- errorTextColor: theme.colorTextDescription,
31
- fontFamily: theme.fontFamily,
32
- lineColor: theme.colorTextSecondary,
33
- mainBkg: theme.colorBgContainer,
34
- noteBkgColor: theme.colorInfoBg,
35
- noteTextColor: theme.colorInfoText,
36
- pie1: theme.geekblue,
37
- pie2: theme.colorWarning,
38
- pie3: theme.colorSuccess,
39
- pie4: theme.colorError,
40
- primaryBorderColor: theme.colorBorder,
41
- primaryColor: theme.colorBgContainer,
42
- primaryTextColor: theme.colorText,
43
- secondaryBorderColor: theme.colorInfoBorder,
44
- secondaryColor: theme.colorInfoBg,
45
- secondaryTextColor: theme.colorInfoText,
46
- tertiaryBorderColor: theme.colorSuccessBorder,
47
- tertiaryColor: theme.colorSuccessBg,
48
- tertiaryTextColor: theme.colorSuccessText,
49
- textColor: theme.colorText
50
- }
51
- });
24
+ const isNamedTheme = (theme) => !!theme && theme !== "lobe-theme" && theme in THEMES;
25
+ const createMermaidOptions = (customTheme) => isNamedTheme(customTheme) ? THEMES[customTheme] : LOBE_THEME_OPTIONS;
52
26
  /**
53
- * 验证并处理 Mermaid 图表内容 - 优化版本(移除 SWR)
27
+ * beautiful-mermaid covers six diagram types; anything else throws here and is
28
+ * handed to the CDN-loaded upstream mermaid instead.
54
29
  */
55
- const useMermaid = (content, { id, theme: customTheme, securityLevel }) => {
56
- const theme = useTheme();
57
- const [data, setData] = useState("");
58
- const mermaidConfig = useMemo(() => createMermaidConfig(theme, customTheme, securityLevel), [
59
- theme.fontFamilyCode,
60
- theme.isDarkMode,
61
- theme.colorTextDescription,
62
- theme.fontFamily,
63
- theme.colorTextSecondary,
64
- theme.colorBgContainer,
65
- theme.colorInfoBg,
66
- theme.colorInfoText,
67
- theme.geekblue,
68
- theme.colorWarning,
69
- theme.colorSuccess,
70
- theme.colorError,
71
- theme.colorBorder,
72
- theme.colorInfoBorder,
73
- theme.colorSuccessBorder,
74
- theme.colorSuccessBg,
75
- theme.colorSuccessText,
76
- theme.colorText,
77
- customTheme,
78
- securityLevel
79
- ]);
80
- const cacheKey = useMemo(() => {
81
- const hash = content.length < 1e4 ? content : Md5.hashStr(content);
82
- return [
83
- id,
84
- customTheme || (theme.isDarkMode ? "d" : "l"),
85
- hash
86
- ].filter(Boolean).join("-");
87
- }, [
88
- content,
89
- id,
90
- theme.isDarkMode,
91
- customTheme
92
- ]);
30
+ const renderMermaid = (content, scopeId, customTheme) => {
31
+ if (!content) return { svg: "" };
32
+ try {
33
+ return { svg: prepareInlineMermaidSvg(renderMermaidSVG(content, createMermaidOptions(customTheme)), scopeId) };
34
+ } catch {
35
+ return {
36
+ error: "unsupported",
37
+ svg: ""
38
+ };
39
+ }
40
+ };
41
+ const useCdnMermaidFallback = (content, { enabled, theme: customTheme }) => {
42
+ const { isDarkMode } = useThemeMode();
43
+ const reactId = useId();
44
+ const [result, setResult] = useState({ svg: "" });
93
45
  useEffect(() => {
94
- const cachedPromise = mermaidCache.get(cacheKey);
95
- if (cachedPromise) {
96
- cachedPromise.then((svg) => {
97
- setData(svg);
98
- }).catch(() => {});
46
+ if (!enabled || !content) {
47
+ setResult({ svg: "" });
99
48
  return;
100
49
  }
101
- const renderPromise = (async () => {
102
- try {
103
- const mermaidInstance = await loadMermaid();
104
- if (!mermaidInstance) return "";
105
- if (await mermaidInstance.parse(content)) {
106
- mermaidInstance.initialize(mermaidConfig);
107
- const { svg } = await mermaidInstance.render(id, content);
108
- return svg;
109
- } else throw new Error("Mermaid 语法无效");
110
- } catch (error_) {
111
- console.error("Mermaid 解析错误:", error_);
112
- return "";
113
- }
114
- })();
115
- mermaidCache.set(cacheKey, renderPromise);
116
- cleanupCache();
117
- renderPromise.then((svg) => {
118
- if (mermaidCache.get(cacheKey) === renderPromise) setData(svg);
50
+ let active = true;
51
+ setResult({
52
+ loading: true,
53
+ svg: ""
54
+ });
55
+ const config = createCdnMermaidConfig(isDarkMode, isNamedTheme(customTheme) ? customTheme : void 0);
56
+ renderWithCdnMermaid(content, `mermaid-cdn-${reactId.replaceAll(":", "")}`, config).then((svg) => {
57
+ if (!active) return;
58
+ setResult(svg ? { svg } : {
59
+ error: "Failed to render diagram",
60
+ svg: ""
61
+ });
119
62
  }).catch(() => {
120
- if (mermaidCache.get(cacheKey) === renderPromise) mermaidCache.delete(cacheKey);
63
+ if (active) setResult({
64
+ error: "Failed to render diagram",
65
+ svg: ""
66
+ });
121
67
  });
68
+ return () => {
69
+ active = false;
70
+ };
122
71
  }, [
123
- cacheKey,
72
+ enabled,
124
73
  content,
125
- id,
126
- mermaidConfig
74
+ isDarkMode,
75
+ customTheme,
76
+ reactId
77
+ ]);
78
+ return result;
79
+ };
80
+ const useMermaid = (content, { theme: customTheme } = {}) => {
81
+ const reactId = useId();
82
+ const scopeId = useMemo(() => `mermaid-${reactId.replaceAll(":", "")}`, [reactId]);
83
+ const primary = useMemo(() => renderMermaid(content, scopeId, customTheme), [
84
+ content,
85
+ scopeId,
86
+ customTheme
127
87
  ]);
128
- return data;
88
+ const fallback = useCdnMermaidFallback(content, {
89
+ enabled: Boolean(primary.error),
90
+ theme: customTheme
91
+ });
92
+ return primary.error ? fallback : primary;
129
93
  };
130
94
  //#endregion
131
- export { MD5_LENGTH_THRESHOLD, createMermaidConfig, loadMermaid, useMermaid };
95
+ export { createMermaidOptions, renderMermaid, useCdnMermaidFallback, useMermaid };
132
96
 
133
97
  //# sourceMappingURL=useMermaid.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"useMermaid.mjs","names":[],"sources":["../../src/hooks/useMermaid.ts"],"sourcesContent":["'use client';\n\nimport { useTheme } from 'antd-style';\nimport type { MermaidConfig } from 'mermaid';\nimport { useEffect, useMemo, useState } from 'react';\nimport { Md5 } from 'ts-md5';\n\n// 缓存已验证的图表内容\nexport const MD5_LENGTH_THRESHOLD = 10_000;\n\n// Application-level cache for rendered Mermaid SVG\n// Key: cacheKey string, Value: Promise<string>\nconst mermaidCache = new Map<string, Promise<string>>();\n\n// Maximum cache size to prevent memory leaks\nconst MAX_CACHE_SIZE = 500;\n\n// Clean up old cache entries when limit is reached\nconst cleanupCache = () => {\n if (mermaidCache.size > MAX_CACHE_SIZE) {\n // Remove oldest 20% of entries\n const entriesToRemove = Math.floor(MAX_CACHE_SIZE * 0.2);\n const keysToRemove = Array.from(mermaidCache.keys()).slice(0, entriesToRemove);\n for (const key of keysToRemove) {\n mermaidCache.delete(key);\n }\n }\n};\n\n// 懒加载 mermaid 实例\nlet mermaidPromise: Promise<typeof import('mermaid').default | null> | null = null;\n\nexport const loadMermaid = (): Promise<typeof import('mermaid').default | null> => {\n if (typeof window === 'undefined') return Promise.resolve(null);\n\n if (!mermaidPromise) {\n mermaidPromise = import('mermaid').then((mod) => mod.default);\n }\n\n return mermaidPromise;\n};\n\n// Helper to create mermaid config\nexport const createMermaidConfig = (\n theme: ReturnType<typeof useTheme>,\n customTheme?: MermaidConfig['theme'],\n // SECURITY: Keep 'strict' as the default. Using 'loose' causes Mermaid to render\n // node labels via innerHTML, enabling XSS when diagram content is user-controlled.\n // Only pass 'loose' if your use case explicitly requires HTML labels and you control\n // the diagram source entirely.\n securityLevel: MermaidConfig['securityLevel'] = 'strict',\n): MermaidConfig => ({\n fontFamily: theme.fontFamilyCode,\n gantt: {\n useWidth: 1920,\n },\n securityLevel,\n startOnLoad: false,\n theme: customTheme || (theme.isDarkMode ? 'dark' : 'neutral'),\n themeVariables: customTheme\n ? undefined\n : {\n errorBkgColor: theme.colorTextDescription,\n errorTextColor: theme.colorTextDescription,\n fontFamily: theme.fontFamily,\n lineColor: theme.colorTextSecondary,\n mainBkg: theme.colorBgContainer,\n noteBkgColor: theme.colorInfoBg,\n noteTextColor: theme.colorInfoText,\n pie1: theme.geekblue,\n pie2: theme.colorWarning,\n pie3: theme.colorSuccess,\n pie4: theme.colorError,\n primaryBorderColor: theme.colorBorder,\n primaryColor: theme.colorBgContainer,\n primaryTextColor: theme.colorText,\n secondaryBorderColor: theme.colorInfoBorder,\n secondaryColor: theme.colorInfoBg,\n secondaryTextColor: theme.colorInfoText,\n tertiaryBorderColor: theme.colorSuccessBorder,\n tertiaryColor: theme.colorSuccessBg,\n tertiaryTextColor: theme.colorSuccessText,\n textColor: theme.colorText,\n },\n});\n\n/**\n * 验证并处理 Mermaid 图表内容 - 优化版本(移除 SWR)\n */\nexport const useMermaid = (\n content: string,\n {\n id,\n theme: customTheme,\n securityLevel,\n }: {\n id: string;\n // SECURITY: Defaults to 'strict'. Set to 'loose' only when you fully control\n // the diagram source and intentionally need HTML rendering in node labels.\n securityLevel?: MermaidConfig['securityLevel'];\n theme?: MermaidConfig['theme'];\n },\n): string => {\n const theme = useTheme();\n const [data, setData] = useState<string>('');\n\n // 提取主题相关配置到 useMemo - 只依赖实际使用的 theme 属性\n const mermaidConfig = useMemo(\n () => createMermaidConfig(theme, customTheme, securityLevel),\n [\n theme.fontFamilyCode,\n theme.isDarkMode,\n theme.colorTextDescription,\n theme.fontFamily,\n theme.colorTextSecondary,\n theme.colorBgContainer,\n theme.colorInfoBg,\n theme.colorInfoText,\n theme.geekblue,\n theme.colorWarning,\n theme.colorSuccess,\n theme.colorError,\n theme.colorBorder,\n theme.colorInfoBorder,\n theme.colorSuccessBorder,\n theme.colorSuccessBg,\n theme.colorSuccessText,\n theme.colorText,\n customTheme,\n securityLevel,\n ],\n );\n\n // 为长内容生成哈希键\n const cacheKey = useMemo((): string => {\n const hash = content.length < MD5_LENGTH_THRESHOLD ? content : Md5.hashStr(content);\n return [id, customTheme || (theme.isDarkMode ? 'd' : 'l'), hash].filter(Boolean).join('-');\n }, [content, id, theme.isDarkMode, customTheme]);\n\n useEffect(() => {\n // Check cache first\n const cachedPromise = mermaidCache.get(cacheKey);\n if (cachedPromise) {\n cachedPromise\n .then((svg) => {\n setData(svg);\n })\n .catch(() => {\n // Silently handle errors, fallback will be handled in the promise\n });\n return;\n }\n\n // Create new promise for rendering\n const renderPromise = (async (): Promise<string> => {\n try {\n const mermaidInstance = await loadMermaid();\n if (!mermaidInstance) return '';\n\n // 验证语法\n const isValid = await mermaidInstance.parse(content);\n\n if (isValid) {\n // 初始化并渲染\n mermaidInstance.initialize(mermaidConfig);\n const { svg } = await mermaidInstance.render(id, content);\n return svg;\n } else {\n throw new Error('Mermaid 语法无效');\n }\n } catch (error_) {\n console.error('Mermaid 解析错误:', error_);\n return '';\n }\n })();\n\n // Cache the promise\n mermaidCache.set(cacheKey, renderPromise);\n cleanupCache();\n\n // Handle promise result\n renderPromise\n .then((svg) => {\n // Only update if this is still the current cache key\n if (mermaidCache.get(cacheKey) === renderPromise) {\n setData(svg);\n }\n })\n .catch(() => {\n // Remove failed promise from cache\n if (mermaidCache.get(cacheKey) === renderPromise) {\n mermaidCache.delete(cacheKey);\n }\n });\n }, [cacheKey, content, id, mermaidConfig]);\n\n return data;\n};\n"],"mappings":";;;;;AAQA,MAAa,uBAAuB;AAIpC,MAAM,+BAAe,IAAI,IAA6B;AAGtD,MAAM,iBAAiB;AAGvB,MAAM,qBAAqB;CACzB,IAAI,aAAa,OAAO,gBAAgB;EAEtC,MAAM,kBAAkB,KAAK,MAAM,iBAAiB,EAAG;EACvD,MAAM,eAAe,MAAM,KAAK,aAAa,KAAK,CAAC,CAAC,CAAC,MAAM,GAAG,eAAe;EAC7E,KAAK,MAAM,OAAO,cAChB,aAAa,OAAO,GAAG;CAE3B;AACF;AAGA,IAAI,iBAA0E;AAE9E,MAAa,oBAAsE;CACjF,IAAI,OAAO,WAAW,aAAa,OAAO,QAAQ,QAAQ,IAAI;CAE9D,IAAI,CAAC,gBACH,iBAAiB,OAAO,UAAU,CAAC,MAAM,QAAQ,IAAI,OAAO;CAG9D,OAAO;AACT;AAGA,MAAa,uBACX,OACA,aAKA,gBAAgD,cAC7B;CACnB,YAAY,MAAM;CAClB,OAAO,EACL,UAAU,KACZ;CACA;CACA,aAAa;CACb,OAAO,gBAAgB,MAAM,aAAa,SAAS;CACnD,gBAAgB,cACZ,KAAA,IACA;EACE,eAAe,MAAM;EACrB,gBAAgB,MAAM;EACtB,YAAY,MAAM;EAClB,WAAW,MAAM;EACjB,SAAS,MAAM;EACf,cAAc,MAAM;EACpB,eAAe,MAAM;EACrB,MAAM,MAAM;EACZ,MAAM,MAAM;EACZ,MAAM,MAAM;EACZ,MAAM,MAAM;EACZ,oBAAoB,MAAM;EAC1B,cAAc,MAAM;EACpB,kBAAkB,MAAM;EACxB,sBAAsB,MAAM;EAC5B,gBAAgB,MAAM;EACtB,oBAAoB,MAAM;EAC1B,qBAAqB,MAAM;EAC3B,eAAe,MAAM;EACrB,mBAAmB,MAAM;EACzB,WAAW,MAAM;CACnB;AACN;;;;AAKA,MAAa,cACX,SACA,EACE,IACA,OAAO,aACP,oBAQS;CACX,MAAM,QAAQ,SAAS;CACvB,MAAM,CAAC,MAAM,WAAW,SAAiB,EAAE;CAG3C,MAAM,gBAAgB,cACd,oBAAoB,OAAO,aAAa,aAAa,GAC3D;EACE,MAAM;EACN,MAAM;EACN,MAAM;EACN,MAAM;EACN,MAAM;EACN,MAAM;EACN,MAAM;EACN,MAAM;EACN,MAAM;EACN,MAAM;EACN,MAAM;EACN,MAAM;EACN,MAAM;EACN,MAAM;EACN,MAAM;EACN,MAAM;EACN,MAAM;EACN,MAAM;EACN;EACA;CACF,CACF;CAGA,MAAM,WAAW,cAAsB;EACrC,MAAM,OAAO,QAAQ,SAAA,MAAgC,UAAU,IAAI,QAAQ,OAAO;EAClF,OAAO;GAAC;GAAI,gBAAgB,MAAM,aAAa,MAAM;GAAM;EAAI,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,GAAG;CAC3F,GAAG;EAAC;EAAS;EAAI,MAAM;EAAY;CAAW,CAAC;CAE/C,gBAAgB;EAEd,MAAM,gBAAgB,aAAa,IAAI,QAAQ;EAC/C,IAAI,eAAe;GACjB,cACG,MAAM,QAAQ;IACb,QAAQ,GAAG;GACb,CAAC,CAAC,CACD,YAAY,CAEb,CAAC;GACH;EACF;EAGA,MAAM,iBAAiB,YAA6B;GAClD,IAAI;IACF,MAAM,kBAAkB,MAAM,YAAY;IAC1C,IAAI,CAAC,iBAAiB,OAAO;IAK7B,IAAI,MAFkB,gBAAgB,MAAM,OAAO,GAEtC;KAEX,gBAAgB,WAAW,aAAa;KACxC,MAAM,EAAE,QAAQ,MAAM,gBAAgB,OAAO,IAAI,OAAO;KACxD,OAAO;IACT,OACE,MAAM,IAAI,MAAM,cAAc;GAElC,SAAS,QAAQ;IACf,QAAQ,MAAM,iBAAiB,MAAM;IACrC,OAAO;GACT;EACF,EAAA,CAAG;EAGH,aAAa,IAAI,UAAU,aAAa;EACxC,aAAa;EAGb,cACG,MAAM,QAAQ;GAEb,IAAI,aAAa,IAAI,QAAQ,MAAM,eACjC,QAAQ,GAAG;EAEf,CAAC,CAAC,CACD,YAAY;GAEX,IAAI,aAAa,IAAI,QAAQ,MAAM,eACjC,aAAa,OAAO,QAAQ;EAEhC,CAAC;CACL,GAAG;EAAC;EAAU;EAAS;EAAI;CAAa,CAAC;CAEzC,OAAO;AACT"}
1
+ {"version":3,"file":"useMermaid.mjs","names":[],"sources":["../../src/hooks/useMermaid.ts"],"sourcesContent":["'use client';\n\nimport { useThemeMode } from 'antd-style';\nimport { renderMermaidSVG, type RenderOptions, type ThemeName, THEMES } from 'beautiful-mermaid';\nimport { useEffect, useId, useMemo, useState } from 'react';\n\nimport { prepareInlineMermaidSvg } from '@/Mermaid/SyntaxMermaid/prepareInlineSvg';\n\nimport { createCdnMermaidConfig, renderWithCdnMermaid } from './useMermaidCdn';\n\nexport type MermaidThemeName = 'lobe-theme' | ThemeName;\n\nexport interface MermaidRenderResult {\n error?: string;\n loading?: boolean;\n svg: string;\n}\n\n/**\n * beautiful-mermaid emits these as CSS custom properties on the SVG root and\n * derives the rest with color-mix(), so pointing them at antd's variables lets\n * the diagram follow the theme through CSS alone no token subscription, and\n * no re-render (or re-layout) when the appearance changes.\n */\nconst LOBE_THEME_OPTIONS: RenderOptions = {\n accent: 'var(--ant-color-primary)',\n bg: 'var(--ant-color-bg-container)',\n border: 'var(--ant-color-border)',\n fg: 'var(--ant-color-text)',\n line: 'var(--ant-color-text-secondary)',\n muted: 'var(--ant-color-text-description)',\n surface: 'var(--ant-color-fill-tertiary)',\n transparent: true,\n};\n\nconst isNamedTheme = (theme?: MermaidThemeName): theme is ThemeName =>\n !!theme && theme !== 'lobe-theme' && theme in THEMES;\n\nexport const createMermaidOptions = (customTheme?: MermaidThemeName): RenderOptions =>\n isNamedTheme(customTheme) ? THEMES[customTheme]! : LOBE_THEME_OPTIONS;\n\n/**\n * beautiful-mermaid covers six diagram types; anything else throws here and is\n * handed to the CDN-loaded upstream mermaid instead.\n */\nexport const renderMermaid = (\n content: string,\n scopeId: string,\n customTheme?: MermaidThemeName,\n): MermaidRenderResult => {\n if (!content) return { svg: '' };\n try {\n const svg = renderMermaidSVG(content, createMermaidOptions(customTheme));\n return { svg: prepareInlineMermaidSvg(svg, scopeId) };\n } catch {\n return { error: 'unsupported', svg: '' };\n }\n};\n\nexport const useCdnMermaidFallback = (\n content: string,\n { enabled, theme: customTheme }: { enabled: boolean; theme?: MermaidThemeName },\n): MermaidRenderResult => {\n const { isDarkMode } = useThemeMode();\n const reactId = useId();\n const [result, setResult] = useState<MermaidRenderResult>({ svg: '' });\n\n useEffect(() => {\n if (!enabled || !content) {\n setResult({ svg: '' });\n return;\n }\n\n let active = true;\n setResult({ loading: true, svg: '' });\n\n const config = createCdnMermaidConfig(\n isDarkMode,\n isNamedTheme(customTheme) ? customTheme : undefined,\n );\n\n renderWithCdnMermaid(content, `mermaid-cdn-${reactId.replaceAll(':', '')}`, config)\n .then((svg) => {\n if (!active) return;\n setResult(svg ? { svg } : { error: 'Failed to render diagram', svg: '' });\n })\n .catch(() => {\n if (active) setResult({ error: 'Failed to render diagram', svg: '' });\n });\n\n return () => {\n active = false;\n };\n }, [enabled, content, isDarkMode, customTheme, reactId]);\n\n return result;\n};\n\nexport const useMermaid = (\n content: string,\n { theme: customTheme }: { theme?: MermaidThemeName } = {},\n): MermaidRenderResult => {\n const reactId = useId();\n const scopeId = useMemo(() => `mermaid-${reactId.replaceAll(':', '')}`, [reactId]);\n\n const primary = useMemo(\n () => renderMermaid(content, scopeId, customTheme),\n [content, scopeId, customTheme],\n );\n\n const fallback = useCdnMermaidFallback(content, {\n enabled: Boolean(primary.error),\n theme: customTheme,\n });\n\n return primary.error ? fallback : primary;\n};\n"],"mappings":";;;;;;;;;;;;;AAwBA,MAAM,qBAAoC;CACxC,QAAQ;CACR,IAAI;CACJ,QAAQ;CACR,IAAI;CACJ,MAAM;CACN,OAAO;CACP,SAAS;CACT,aAAa;AACf;AAEA,MAAM,gBAAgB,UACpB,CAAC,CAAC,SAAS,UAAU,gBAAgB,SAAS;AAEhD,MAAa,wBAAwB,gBACnC,aAAa,WAAW,IAAI,OAAO,eAAgB;;;;;AAMrD,MAAa,iBACX,SACA,SACA,gBACwB;CACxB,IAAI,CAAC,SAAS,OAAO,EAAE,KAAK,GAAG;CAC/B,IAAI;EAEF,OAAO,EAAE,KAAK,wBADF,iBAAiB,SAAS,qBAAqB,WAAW,CAC9B,GAAG,OAAO,EAAE;CACtD,QAAQ;EACN,OAAO;GAAE,OAAO;GAAe,KAAK;EAAG;CACzC;AACF;AAEA,MAAa,yBACX,SACA,EAAE,SAAS,OAAO,kBACM;CACxB,MAAM,EAAE,eAAe,aAAa;CACpC,MAAM,UAAU,MAAM;CACtB,MAAM,CAAC,QAAQ,aAAa,SAA8B,EAAE,KAAK,GAAG,CAAC;CAErE,gBAAgB;EACd,IAAI,CAAC,WAAW,CAAC,SAAS;GACxB,UAAU,EAAE,KAAK,GAAG,CAAC;GACrB;EACF;EAEA,IAAI,SAAS;EACb,UAAU;GAAE,SAAS;GAAM,KAAK;EAAG,CAAC;EAEpC,MAAM,SAAS,uBACb,YACA,aAAa,WAAW,IAAI,cAAc,KAAA,CAC5C;EAEA,qBAAqB,SAAS,eAAe,QAAQ,WAAW,KAAK,EAAE,KAAK,MAAM,CAAC,CAChF,MAAM,QAAQ;GACb,IAAI,CAAC,QAAQ;GACb,UAAU,MAAM,EAAE,IAAI,IAAI;IAAE,OAAO;IAA4B,KAAK;GAAG,CAAC;EAC1E,CAAC,CAAC,CACD,YAAY;GACX,IAAI,QAAQ,UAAU;IAAE,OAAO;IAA4B,KAAK;GAAG,CAAC;EACtE,CAAC;EAEH,aAAa;GACX,SAAS;EACX;CACF,GAAG;EAAC;EAAS;EAAS;EAAY;EAAa;CAAO,CAAC;CAEvD,OAAO;AACT;AAEA,MAAa,cACX,SACA,EAAE,OAAO,gBAA8C,CAAC,MAChC;CACxB,MAAM,UAAU,MAAM;CACtB,MAAM,UAAU,cAAc,WAAW,QAAQ,WAAW,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC;CAEjF,MAAM,UAAU,cACR,cAAc,SAAS,SAAS,WAAW,GACjD;EAAC;EAAS;EAAS;CAAW,CAChC;CAEA,MAAM,WAAW,sBAAsB,SAAS;EAC9C,SAAS,QAAQ,QAAQ,KAAK;EAC9B,OAAO;CACT,CAAC;CAED,OAAO,QAAQ,QAAQ,WAAW;AACpC"}
@@ -0,0 +1,10 @@
1
+ //#region src/hooks/useMermaidCdn.d.ts
2
+ /**
3
+ * Point the fallback loader at a mirror, or at a self-hosted copy for offline
4
+ * and strict-CSP deployments. Resets any in-flight load.
5
+ */
6
+ declare const setMermaidCdnUrl: (url: string) => void;
7
+ declare const getMermaidCdnUrl: () => string;
8
+ //#endregion
9
+ export { getMermaidCdnUrl, setMermaidCdnUrl };
10
+ //# sourceMappingURL=useMermaidCdn.d.mts.map
@@ -0,0 +1,97 @@
1
+ "use client";
2
+ //#region src/hooks/useMermaidCdn.ts
3
+ let mermaidCdnUrl = "https://esm.sh/mermaid@11";
4
+ let mermaidPromise = null;
5
+ /**
6
+ * Point the fallback loader at a mirror, or at a self-hosted copy for offline
7
+ * and strict-CSP deployments. Resets any in-flight load.
8
+ */
9
+ const setMermaidCdnUrl = (url) => {
10
+ if (url === mermaidCdnUrl) return;
11
+ mermaidCdnUrl = url;
12
+ mermaidPromise = null;
13
+ };
14
+ const getMermaidCdnUrl = () => mermaidCdnUrl;
15
+ const loadCdnMermaid = () => {
16
+ if (typeof window === "undefined") return Promise.resolve(null);
17
+ mermaidPromise ??= import(
18
+ /* @vite-ignore */
19
+ mermaidCdnUrl
20
+ ).then((mod) => mod.default ?? mod).catch(() => null);
21
+ return mermaidPromise;
22
+ };
23
+ /**
24
+ * Upstream mermaid runs colour maths over themeVariables, so it needs literal
25
+ * values rather than var() references. Reading antd's CSS variables here keeps
26
+ * the cost off the render path — no theme context subscription, and it only
27
+ * runs for the diagram types that actually fall back to the CDN.
28
+ */
29
+ const readCssVars = (names) => {
30
+ const result = {};
31
+ if (typeof document === "undefined") return result;
32
+ const computed = globalThis.getComputedStyle(document.documentElement);
33
+ for (const [key, variable] of Object.entries(names)) result[key] = computed.getPropertyValue(variable).trim() || void 0;
34
+ return result;
35
+ };
36
+ const createCdnMermaidConfig = (isDarkMode, customTheme) => {
37
+ const token = readCssVars({
38
+ border: "--ant-color-border",
39
+ error: "--ant-color-error",
40
+ fontFamily: "--ant-font-family",
41
+ fontFamilyCode: "--ant-font-family-code",
42
+ infoBg: "--ant-color-info-bg",
43
+ infoBorder: "--ant-color-info-border",
44
+ infoText: "--ant-color-info-text",
45
+ primary: "--ant-color-primary",
46
+ success: "--ant-color-success",
47
+ successBg: "--ant-color-success-bg",
48
+ successBorder: "--ant-color-success-border",
49
+ successText: "--ant-color-success-text",
50
+ text: "--ant-color-text",
51
+ textDescription: "--ant-color-text-description",
52
+ textSecondary: "--ant-color-text-secondary",
53
+ bgContainer: "--ant-color-bg-container",
54
+ warning: "--ant-color-warning"
55
+ });
56
+ return {
57
+ fontFamily: token.fontFamilyCode,
58
+ gantt: { useWidth: 1920 },
59
+ securityLevel: "strict",
60
+ startOnLoad: false,
61
+ theme: customTheme || (isDarkMode ? "dark" : "neutral"),
62
+ themeVariables: customTheme ? void 0 : {
63
+ errorBkgColor: token.textDescription,
64
+ errorTextColor: token.textDescription,
65
+ fontFamily: token.fontFamily,
66
+ lineColor: token.textSecondary,
67
+ mainBkg: token.bgContainer,
68
+ noteBkgColor: token.infoBg,
69
+ noteTextColor: token.infoText,
70
+ pie1: token.primary,
71
+ pie2: token.warning,
72
+ pie3: token.success,
73
+ pie4: token.error,
74
+ primaryBorderColor: token.border,
75
+ primaryColor: token.bgContainer,
76
+ primaryTextColor: token.text,
77
+ secondaryBorderColor: token.infoBorder,
78
+ secondaryColor: token.infoBg,
79
+ secondaryTextColor: token.infoText,
80
+ tertiaryBorderColor: token.successBorder,
81
+ tertiaryColor: token.successBg,
82
+ tertiaryTextColor: token.successText,
83
+ textColor: token.text
84
+ }
85
+ };
86
+ };
87
+ const renderWithCdnMermaid = async (content, id, config) => {
88
+ const mermaid = await loadCdnMermaid();
89
+ if (!mermaid) return "";
90
+ mermaid.initialize(config);
91
+ const { svg } = await mermaid.render(id, content);
92
+ return svg;
93
+ };
94
+ //#endregion
95
+ export { createCdnMermaidConfig, getMermaidCdnUrl, loadCdnMermaid, renderWithCdnMermaid, setMermaidCdnUrl };
96
+
97
+ //# sourceMappingURL=useMermaidCdn.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useMermaidCdn.mjs","names":[],"sources":["../../src/hooks/useMermaidCdn.ts"],"sourcesContent":["'use client';\n\ninterface CdnMermaidConfig {\n fontFamily?: string;\n gantt?: { useWidth?: number };\n securityLevel?: string;\n startOnLoad?: boolean;\n theme?: string;\n themeVariables?: Record<string, string | undefined>;\n}\n\ninterface CdnMermaidApi {\n initialize: (config: CdnMermaidConfig) => void;\n render: (id: string, content: string) => Promise<{ svg: string }>;\n}\n\nconst DEFAULT_MERMAID_CDN_URL = 'https://esm.sh/mermaid@11';\n\nlet mermaidCdnUrl = DEFAULT_MERMAID_CDN_URL;\nlet mermaidPromise: Promise<CdnMermaidApi | null> | null = null;\n\n/**\n * Point the fallback loader at a mirror, or at a self-hosted copy for offline\n * and strict-CSP deployments. Resets any in-flight load.\n */\nexport const setMermaidCdnUrl = (url: string) => {\n if (url === mermaidCdnUrl) return;\n mermaidCdnUrl = url;\n mermaidPromise = null;\n};\n\nexport const getMermaidCdnUrl = () => mermaidCdnUrl;\n\nexport const loadCdnMermaid = (): Promise<CdnMermaidApi | null> => {\n if (typeof window === 'undefined') return Promise.resolve(null);\n\n mermaidPromise ??= import(/* @vite-ignore */ mermaidCdnUrl)\n .then((mod) => (mod.default ?? mod) as CdnMermaidApi)\n .catch(() => null);\n\n return mermaidPromise;\n};\n\n/**\n * Upstream mermaid runs colour maths over themeVariables, so it needs literal\n * values rather than var() references. Reading antd's CSS variables here keeps\n * the cost off the render path — no theme context subscription, and it only\n * runs for the diagram types that actually fall back to the CDN.\n */\nconst readCssVars = <T extends string>(names: Record<T, string>): Record<T, string | undefined> => {\n const result = {} as Record<T, string | undefined>;\n if (typeof document === 'undefined') return result;\n\n const computed = globalThis.getComputedStyle(document.documentElement);\n for (const [key, variable] of Object.entries(names) as [T, string][]) {\n result[key] = computed.getPropertyValue(variable).trim() || undefined;\n }\n return result;\n};\n\nexport const createCdnMermaidConfig = (\n isDarkMode: boolean,\n customTheme?: string,\n): CdnMermaidConfig => {\n const token = readCssVars({\n border: '--ant-color-border',\n error: '--ant-color-error',\n fontFamily: '--ant-font-family',\n fontFamilyCode: '--ant-font-family-code',\n infoBg: '--ant-color-info-bg',\n infoBorder: '--ant-color-info-border',\n infoText: '--ant-color-info-text',\n primary: '--ant-color-primary',\n success: '--ant-color-success',\n successBg: '--ant-color-success-bg',\n successBorder: '--ant-color-success-border',\n successText: '--ant-color-success-text',\n text: '--ant-color-text',\n textDescription: '--ant-color-text-description',\n textSecondary: '--ant-color-text-secondary',\n bgContainer: '--ant-color-bg-container',\n warning: '--ant-color-warning',\n });\n\n return {\n fontFamily: token.fontFamilyCode,\n gantt: { useWidth: 1920 },\n // SECURITY: 'strict' keeps Mermaid from rendering node labels via innerHTML,\n // which would be an XSS vector for model-generated diagram content.\n securityLevel: 'strict',\n startOnLoad: false,\n theme: customTheme || (isDarkMode ? 'dark' : 'neutral'),\n themeVariables: customTheme\n ? undefined\n : {\n errorBkgColor: token.textDescription,\n errorTextColor: token.textDescription,\n fontFamily: token.fontFamily,\n lineColor: token.textSecondary,\n mainBkg: token.bgContainer,\n noteBkgColor: token.infoBg,\n noteTextColor: token.infoText,\n pie1: token.primary,\n pie2: token.warning,\n pie3: token.success,\n pie4: token.error,\n primaryBorderColor: token.border,\n primaryColor: token.bgContainer,\n primaryTextColor: token.text,\n secondaryBorderColor: token.infoBorder,\n secondaryColor: token.infoBg,\n secondaryTextColor: token.infoText,\n tertiaryBorderColor: token.successBorder,\n tertiaryColor: token.successBg,\n tertiaryTextColor: token.successText,\n textColor: token.text,\n },\n };\n};\n\nexport const renderWithCdnMermaid = async (\n content: string,\n id: string,\n config: CdnMermaidConfig,\n): Promise<string> => {\n const mermaid = await loadCdnMermaid();\n if (!mermaid) return '';\n\n mermaid.initialize(config);\n const { svg } = await mermaid.render(id, content);\n return svg;\n};\n"],"mappings":";;AAkBA,IAAI,gBAAgB;AACpB,IAAI,iBAAuD;;;;;AAM3D,MAAa,oBAAoB,QAAgB;CAC/C,IAAI,QAAQ,eAAe;CAC3B,gBAAgB;CAChB,iBAAiB;AACnB;AAEA,MAAa,yBAAyB;AAEtC,MAAa,uBAAsD;CACjE,IAAI,OAAO,WAAW,aAAa,OAAO,QAAQ,QAAQ,IAAI;CAE9D,mBAAmB;;EAA0B;CAAc,CACxD,MAAM,QAAS,IAAI,WAAW,GAAqB,CAAC,CACpD,YAAY,IAAI;CAEnB,OAAO;AACT;;;;;;;AAQA,MAAM,eAAiC,UAA4D;CACjG,MAAM,SAAS,CAAC;CAChB,IAAI,OAAO,aAAa,aAAa,OAAO;CAE5C,MAAM,WAAW,WAAW,iBAAiB,SAAS,eAAe;CACrE,KAAK,MAAM,CAAC,KAAK,aAAa,OAAO,QAAQ,KAAK,GAChD,OAAO,OAAO,SAAS,iBAAiB,QAAQ,CAAC,CAAC,KAAK,KAAK,KAAA;CAE9D,OAAO;AACT;AAEA,MAAa,0BACX,YACA,gBACqB;CACrB,MAAM,QAAQ,YAAY;EACxB,QAAQ;EACR,OAAO;EACP,YAAY;EACZ,gBAAgB;EAChB,QAAQ;EACR,YAAY;EACZ,UAAU;EACV,SAAS;EACT,SAAS;EACT,WAAW;EACX,eAAe;EACf,aAAa;EACb,MAAM;EACN,iBAAiB;EACjB,eAAe;EACf,aAAa;EACb,SAAS;CACX,CAAC;CAED,OAAO;EACL,YAAY,MAAM;EAClB,OAAO,EAAE,UAAU,KAAK;EAGxB,eAAe;EACf,aAAa;EACb,OAAO,gBAAgB,aAAa,SAAS;EAC7C,gBAAgB,cACZ,KAAA,IACA;GACE,eAAe,MAAM;GACrB,gBAAgB,MAAM;GACtB,YAAY,MAAM;GAClB,WAAW,MAAM;GACjB,SAAS,MAAM;GACf,cAAc,MAAM;GACpB,eAAe,MAAM;GACrB,MAAM,MAAM;GACZ,MAAM,MAAM;GACZ,MAAM,MAAM;GACZ,MAAM,MAAM;GACZ,oBAAoB,MAAM;GAC1B,cAAc,MAAM;GACpB,kBAAkB,MAAM;GACxB,sBAAsB,MAAM;GAC5B,gBAAgB,MAAM;GACtB,oBAAoB,MAAM;GAC1B,qBAAqB,MAAM;GAC3B,eAAe,MAAM;GACrB,mBAAmB,MAAM;GACzB,WAAW,MAAM;EACnB;CACN;AACF;AAEA,MAAa,uBAAuB,OAClC,SACA,IACA,WACoB;CACpB,MAAM,UAAU,MAAM,eAAe;CACrC,IAAI,CAAC,SAAS,OAAO;CAErB,QAAQ,WAAW,MAAM;CACzB,MAAM,EAAE,QAAQ,MAAM,QAAQ,OAAO,IAAI,OAAO;CAChD,OAAO;AACT"}
@@ -1,83 +1,32 @@
1
1
  "use client";
2
- import { createMermaidConfig, loadMermaid } from "./useMermaid.mjs";
3
- import { useEffect, useMemo, useRef, useState } from "react";
4
- import { useTheme } from "antd-style";
2
+ import { renderMermaid, useCdnMermaidFallback } from "./useMermaid.mjs";
3
+ import { useEffect, useId, useMemo, useState } from "react";
5
4
  //#region src/hooks/useStreamMermaid.ts
6
- /**
7
- * 流式 Mermaid 渲染 - 支持内容逐步更新
8
- */
9
- const useStreamMermaid = (content, { enabled = true, id, theme: customTheme }) => {
10
- const theme = useTheme();
11
- const [data, setData] = useState("");
12
- const previousContentRef = useRef("");
13
- const latestContentRef = useRef(content);
14
- const renderTimeoutRef = useRef(void 0);
15
- const mermaidConfig = useMemo(() => createMermaidConfig(theme, customTheme), [
16
- theme.fontFamilyCode,
17
- theme.isDarkMode,
18
- theme.colorTextDescription,
19
- theme.fontFamily,
20
- theme.colorTextSecondary,
21
- theme.colorBgContainer,
22
- theme.colorInfoBg,
23
- theme.colorInfoText,
24
- theme.geekblue,
25
- theme.colorWarning,
26
- theme.colorSuccess,
27
- theme.colorError,
28
- theme.colorBorder,
29
- theme.colorInfoBorder,
30
- theme.colorSuccessBorder,
31
- theme.colorSuccessBg,
32
- theme.colorSuccessText,
33
- theme.colorText,
34
- customTheme
35
- ]);
5
+ const EMPTY = { svg: "" };
6
+ const useStreamMermaid = (content, { enabled = true, theme: customTheme }) => {
7
+ const reactId = useId();
8
+ const scopeId = useMemo(() => `mermaid-${reactId.replaceAll(":", "")}`, [reactId]);
9
+ const [primary, setPrimary] = useState(EMPTY);
36
10
  useEffect(() => {
37
- latestContentRef.current = content;
38
- }, [content]);
39
- useEffect(() => {
40
- if (!enabled) {
41
- setData("");
42
- previousContentRef.current = "";
43
- const timeoutId = renderTimeoutRef.current;
44
- if (timeoutId) clearTimeout(timeoutId);
11
+ if (!enabled || !content) {
12
+ setPrimary(EMPTY);
45
13
  return;
46
14
  }
47
- const currentContent = latestContentRef.current;
48
- if (currentContent === previousContentRef.current && data) return;
49
- const timeoutId = renderTimeoutRef.current;
50
- if (timeoutId) clearTimeout(timeoutId);
51
- renderTimeoutRef.current = setTimeout(async () => {
52
- const contentToRender = latestContentRef.current;
53
- if (contentToRender !== currentContent) return;
54
- try {
55
- const mermaidInstance = await loadMermaid();
56
- if (!mermaidInstance) return;
57
- if (await mermaidInstance.parse(contentToRender)) {
58
- mermaidInstance.initialize(mermaidConfig);
59
- const { svg } = await mermaidInstance.render(id, contentToRender);
60
- if (latestContentRef.current === contentToRender) {
61
- setData(svg);
62
- previousContentRef.current = contentToRender;
63
- }
64
- }
65
- } catch (error_) {
66
- if (contentToRender === latestContentRef.current) console.error("Mermaid 解析错误:", error_);
67
- }
15
+ const timer = setTimeout(() => {
16
+ setPrimary(renderMermaid(content, scopeId, customTheme));
68
17
  }, 300);
69
- return () => {
70
- const timeoutId = renderTimeoutRef.current;
71
- if (timeoutId) clearTimeout(timeoutId);
72
- };
18
+ return () => clearTimeout(timer);
73
19
  }, [
74
20
  enabled,
75
21
  content,
76
- id,
77
- mermaidConfig,
78
- data
22
+ scopeId,
23
+ customTheme
79
24
  ]);
80
- return data;
25
+ const fallback = useCdnMermaidFallback(content, {
26
+ enabled: enabled && Boolean(primary.error),
27
+ theme: customTheme
28
+ });
29
+ return primary.error ? fallback : primary;
81
30
  };
82
31
  //#endregion
83
32
  export { useStreamMermaid };
@@ -1 +1 @@
1
- {"version":3,"file":"useStreamMermaid.mjs","names":[],"sources":["../../src/hooks/useStreamMermaid.ts"],"sourcesContent":["'use client';\n\nimport { useTheme } from 'antd-style';\nimport type { MermaidConfig } from 'mermaid';\nimport { useEffect, useMemo, useRef, useState } from 'react';\n\nimport { createMermaidConfig, loadMermaid } from './useMermaid';\n\n/**\n * 流式 Mermaid 渲染 - 支持内容逐步更新\n */\nexport const useStreamMermaid = (\n content: string,\n {\n enabled = true,\n id,\n theme: customTheme,\n }: {\n enabled?: boolean;\n id: string;\n theme?: MermaidConfig['theme'];\n },\n): string => {\n const theme = useTheme();\n const [data, setData] = useState<string>('');\n const previousContentRef = useRef<string>('');\n const latestContentRef = useRef(content);\n const renderTimeoutRef = useRef<ReturnType<typeof setTimeout> | undefined>(undefined);\n\n // 提取主题相关配置到 useMemo 中\n const mermaidConfig = useMemo(\n () => createMermaidConfig(theme, customTheme),\n [\n theme.fontFamilyCode,\n theme.isDarkMode,\n theme.colorTextDescription,\n theme.fontFamily,\n theme.colorTextSecondary,\n theme.colorBgContainer,\n theme.colorInfoBg,\n theme.colorInfoText,\n theme.geekblue,\n theme.colorWarning,\n theme.colorSuccess,\n theme.colorError,\n theme.colorBorder,\n theme.colorInfoBorder,\n theme.colorSuccessBorder,\n theme.colorSuccessBg,\n theme.colorSuccessText,\n theme.colorText,\n customTheme,\n ],\n );\n\n // Update latest content ref\n useEffect(() => {\n latestContentRef.current = content;\n }, [content]);\n\n // Debounced rendering for streaming content\n useEffect(() => {\n if (!enabled) {\n setData('');\n previousContentRef.current = '';\n const timeoutId = renderTimeoutRef.current;\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n return;\n }\n\n const currentContent = latestContentRef.current;\n\n // Skip if content hasn't changed\n if (currentContent === previousContentRef.current && data) {\n return;\n }\n\n // Clear previous timeout\n const timeoutId = renderTimeoutRef.current;\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n\n // Debounce rendering for streaming content (wait 300ms after last change)\n renderTimeoutRef.current = setTimeout(async () => {\n const contentToRender = latestContentRef.current;\n\n // Skip if content changed during debounce\n if (contentToRender !== currentContent) {\n return;\n }\n\n try {\n const mermaidInstance = await loadMermaid();\n if (!mermaidInstance) return;\n\n // 验证语法\n const isValid = await mermaidInstance.parse(contentToRender);\n\n if (isValid) {\n // 初始化并渲染\n mermaidInstance.initialize(mermaidConfig);\n const { svg } = await mermaidInstance.render(id, contentToRender);\n\n // Only update if content hasn't changed during rendering\n if (latestContentRef.current === contentToRender) {\n setData(svg);\n previousContentRef.current = contentToRender;\n }\n }\n } catch (error_) {\n // Silently handle errors during streaming\n // Only log if this is the final content\n if (contentToRender === latestContentRef.current) {\n console.error('Mermaid 解析错误:', error_);\n }\n }\n }, 300);\n\n return () => {\n const timeoutId = renderTimeoutRef.current;\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n };\n }, [enabled, content, id, mermaidConfig, data]);\n\n return data;\n};\n"],"mappings":";;;;;;;;AAWA,MAAa,oBACX,SACA,EACE,UAAU,MACV,IACA,OAAO,kBAME;CACX,MAAM,QAAQ,SAAS;CACvB,MAAM,CAAC,MAAM,WAAW,SAAiB,EAAE;CAC3C,MAAM,qBAAqB,OAAe,EAAE;CAC5C,MAAM,mBAAmB,OAAO,OAAO;CACvC,MAAM,mBAAmB,OAAkD,KAAA,CAAS;CAGpF,MAAM,gBAAgB,cACd,oBAAoB,OAAO,WAAW,GAC5C;EACE,MAAM;EACN,MAAM;EACN,MAAM;EACN,MAAM;EACN,MAAM;EACN,MAAM;EACN,MAAM;EACN,MAAM;EACN,MAAM;EACN,MAAM;EACN,MAAM;EACN,MAAM;EACN,MAAM;EACN,MAAM;EACN,MAAM;EACN,MAAM;EACN,MAAM;EACN,MAAM;EACN;CACF,CACF;CAGA,gBAAgB;EACd,iBAAiB,UAAU;CAC7B,GAAG,CAAC,OAAO,CAAC;CAGZ,gBAAgB;EACd,IAAI,CAAC,SAAS;GACZ,QAAQ,EAAE;GACV,mBAAmB,UAAU;GAC7B,MAAM,YAAY,iBAAiB;GACnC,IAAI,WACF,aAAa,SAAS;GAExB;EACF;EAEA,MAAM,iBAAiB,iBAAiB;EAGxC,IAAI,mBAAmB,mBAAmB,WAAW,MACnD;EAIF,MAAM,YAAY,iBAAiB;EACnC,IAAI,WACF,aAAa,SAAS;EAIxB,iBAAiB,UAAU,WAAW,YAAY;GAChD,MAAM,kBAAkB,iBAAiB;GAGzC,IAAI,oBAAoB,gBACtB;GAGF,IAAI;IACF,MAAM,kBAAkB,MAAM,YAAY;IAC1C,IAAI,CAAC,iBAAiB;IAKtB,IAAI,MAFkB,gBAAgB,MAAM,eAAe,GAE9C;KAEX,gBAAgB,WAAW,aAAa;KACxC,MAAM,EAAE,QAAQ,MAAM,gBAAgB,OAAO,IAAI,eAAe;KAGhE,IAAI,iBAAiB,YAAY,iBAAiB;MAChD,QAAQ,GAAG;MACX,mBAAmB,UAAU;KAC/B;IACF;GACF,SAAS,QAAQ;IAGf,IAAI,oBAAoB,iBAAiB,SACvC,QAAQ,MAAM,iBAAiB,MAAM;GAEzC;EACF,GAAG,GAAG;EAEN,aAAa;GACX,MAAM,YAAY,iBAAiB;GACnC,IAAI,WACF,aAAa,SAAS;EAE1B;CACF,GAAG;EAAC;EAAS;EAAS;EAAI;EAAe;CAAI,CAAC;CAE9C,OAAO;AACT"}
1
+ {"version":3,"file":"useStreamMermaid.mjs","names":[],"sources":["../../src/hooks/useStreamMermaid.ts"],"sourcesContent":["'use client';\n\nimport { useEffect, useId, useMemo, useState } from 'react';\n\nimport {\n type MermaidRenderResult,\n type MermaidThemeName,\n renderMermaid,\n useCdnMermaidFallback,\n} from './useMermaid';\n\nconst EMPTY: MermaidRenderResult = { svg: '' };\n\nexport const useStreamMermaid = (\n content: string,\n {\n enabled = true,\n theme: customTheme,\n }: {\n enabled?: boolean;\n theme?: MermaidThemeName;\n },\n): MermaidRenderResult => {\n const reactId = useId();\n const scopeId = useMemo(() => `mermaid-${reactId.replaceAll(':', '')}`, [reactId]);\n const [primary, setPrimary] = useState<MermaidRenderResult>(EMPTY);\n\n useEffect(() => {\n if (!enabled || !content) {\n setPrimary(EMPTY);\n return;\n }\n\n // Debounce rendering so streaming content only re-renders after it settles\n const timer = setTimeout(() => {\n setPrimary(renderMermaid(content, scopeId, customTheme));\n }, 300);\n\n return () => clearTimeout(timer);\n }, [enabled, content, scopeId, customTheme]);\n\n const fallback = useCdnMermaidFallback(content, {\n enabled: enabled && Boolean(primary.error),\n theme: customTheme,\n });\n\n return primary.error ? fallback : primary;\n};\n"],"mappings":";;;;AAWA,MAAM,QAA6B,EAAE,KAAK,GAAG;AAE7C,MAAa,oBACX,SACA,EACE,UAAU,MACV,OAAO,kBAKe;CACxB,MAAM,UAAU,MAAM;CACtB,MAAM,UAAU,cAAc,WAAW,QAAQ,WAAW,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC;CACjF,MAAM,CAAC,SAAS,cAAc,SAA8B,KAAK;CAEjE,gBAAgB;EACd,IAAI,CAAC,WAAW,CAAC,SAAS;GACxB,WAAW,KAAK;GAChB;EACF;EAGA,MAAM,QAAQ,iBAAiB;GAC7B,WAAW,cAAc,SAAS,SAAS,WAAW,CAAC;EACzD,GAAG,GAAG;EAEN,aAAa,aAAa,KAAK;CACjC,GAAG;EAAC;EAAS;EAAS;EAAS;CAAW,CAAC;CAE3C,MAAM,WAAW,sBAAsB,SAAS;EAC9C,SAAS,WAAW,QAAQ,QAAQ,KAAK;EACzC,OAAO;CACT,CAAC;CAED,OAAO,QAAQ,QAAQ,WAAW;AACpC"}
@@ -1 +1 @@
1
- {"version":3,"file":"Mono.mjs","names":[],"sources":["../../../../src/icons/Auth0/components/Mono.tsx"],"sourcesContent":["'use client';\n\nimport type { IconType } from '@lobehub/icons';\nimport { memo } from 'react';\n\nimport { TITLE } from '../style';\n\nconst Icon: IconType = memo(({ size = '1em', style, ...rest }) => {\n return (\n <svg\n fill=\"currentColor\"\n fillRule=\"evenodd\"\n height={size}\n style={{ flex: 'none', lineHeight: 1, ...style }}\n viewBox=\"0 0 24 24\"\n width={size}\n xmlns=\"http://www.w3.org/2000/svg\"\n {...rest}\n >\n <title>{TITLE}</title>\n <path d=\"M3.264 10.418c3.928-.648 7.008-3.9 7.653-7.834l.216-1.891c.054-.3-.15-.72-.529-.69-2.968.232-5.769 1.213-7.327 1.85A2.058 2.058 0 002 3.76v6.169c0 .365.328.644.688.586l.576-.094v-.003zM12.812 2.584c.647 3.934 3.726 7.186 7.652 7.835l.577.094c.36.06.688-.219.688-.586v-6.17c0-.836-.504-1.588-1.278-1.905-1.56-.64-4.358-1.619-7.326-1.85-.382-.03-.577.392-.532.689l.216 1.89.003.003zM20.461 12.146c-5.368 1.06-7.86 4.635-7.86 11.4 0 .34.336.576.62.387 2.468-1.668 7.9-6.021 8.46-11.467.021-.684-.834-.362-1.22-.32zM3.266 12.146c5.369 1.06 7.86 4.635 7.86 11.4 0 .34-.336.576-.618.387-2.47-1.668-7.902-6.021-8.461-11.467-.021-.684.834-.362 1.22-.32z\" />\n </svg>\n );\n});\n\nexport default Icon;\n"],"mappings":";;;;;AAOA,MAAM,OAAiB,MAAM,EAAE,OAAO,OAAO,OAAO,GAAG,WAAW;CAChE,OACE,qBAAC,OAAD;EACE,MAAK;EACL,UAAS;EACT,QAAQ;EACR,OAAO;GAAE,MAAM;GAAQ,YAAY;GAAG,GAAG;EAAM;EAC/C,SAAQ;EACR,OAAO;EACP,OAAM;EACN,GAAI;YARN,CAUE,oBAAC,SAAD,EAAA,UAAQ,MAAa,CAAA,GACrB,oBAAC,QAAD,EAAM,GAAE,woBAAyoB,CAAA,CAC9oB;;AAET,CAAC"}
1
+ {"version":3,"file":"Mono.mjs","names":[],"sources":["../../../../src/icons/Auth0/components/Mono.tsx"],"sourcesContent":["'use client';\n\nimport type { IconType } from '@lobehub/icons';\nimport { memo } from 'react';\n\nimport { TITLE } from '../style';\n\nconst Icon: IconType = memo(({ size = '1em', style, ...rest }) => {\n return (\n <svg\n fill=\"currentColor\"\n fillRule=\"evenodd\"\n height={size}\n style={{ flex: 'none', lineHeight: 1, ...style }}\n viewBox=\"0 0 24 24\"\n width={size}\n xmlns=\"http://www.w3.org/2000/svg\"\n {...rest}\n >\n <title>{TITLE}</title>\n <path d=\"M3.264 10.418c3.928-.648 7.008-3.9 7.653-7.834l.216-1.891c.054-.3-.15-.72-.529-.69-2.968.232-5.769 1.213-7.327 1.85A2.058 2.058 0 002 3.76v6.169c0 .365.328.644.688.586l.576-.094v-.003zM12.812 2.584c.647 3.934 3.726 7.186 7.652 7.835l.577.094c.36.06.688-.219.688-.586v-6.17c0-.836-.504-1.588-1.278-1.905-1.56-.64-4.358-1.619-7.326-1.85-.382-.03-.577.392-.532.689l.216 1.89.003.003zM20.461 12.146c-5.368 1.06-7.86 4.635-7.86 11.4 0 .34.336.576.62.387 2.468-1.668 7.9-6.021 8.46-11.467.021-.684-.834-.362-1.22-.32zM3.266 12.146c5.369 1.06 7.86 4.635 7.86 11.4 0 .34-.336.576-.618.387-2.47-1.668-7.902-6.021-8.461-11.467-.021-.684.834-.362 1.22-.32z\" />\n </svg>\n );\n});\n\nexport default Icon;\n"],"mappings":";;;;;AAOA,MAAM,OAAiB,MAAM,EAAE,OAAO,OAAO,OAAO,GAAG,WAAW;CAChE,OACE,qBAAC,OAAD;EACE,MAAK;EACL,UAAS;EACT,QAAQ;EACR,OAAO;GAAE,MAAM;GAAQ,YAAY;GAAG,GAAG;EAAM;EAC/C,SAAQ;EACR,OAAO;EACP,OAAM;EACN,GAAI;EARN,UAAA,CAUE,oBAAC,SAAD,EAAA,UAAQ,MAAa,CAAA,GACrB,oBAAC,QAAD,EAAM,GAAE,woBAAyoB,CAAA,CAC9oB;;AAET,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"Color.mjs","names":[],"sources":["../../../../src/icons/Authelia/components/Color.tsx"],"sourcesContent":["'use client';\n\nimport { type IconType, useFillIds } from '@lobehub/icons';\nimport { memo } from 'react';\n\nimport { TITLE } from '../style';\n\nconst Icon: IconType = memo(({ size = '1em', style, ...rest }) => {\n const [a, b, c, d, e] = useFillIds(TITLE, 5);\n return (\n <svg\n height={size}\n style={{ flex: 'none', lineHeight: 1, ...style }}\n viewBox=\"0 0 24 24\"\n width={size}\n xmlns=\"http://www.w3.org/2000/svg\"\n {...rest}\n >\n <title>{TITLE}</title>\n <path\n d=\"M12.04 17.99c-3.312-.001-6.044-2.719-6.02-6.025.025-3.47 2.905-6.036 6.073-6.003 3.13.032 5.968 2.485 5.977 6.02.009 3.409-2.727 6.002-6.03 6.008zm1.567-8.38c.002-.767-.447-1.372-1.153-1.555a1.572 1.572 0 00-1.766.745c-.365.647-.268 1.384.311 1.9.284.252.308.491.22.828-.264 1.013-.501 2.034-.752 3.052-.092.376.008.697.299.944.609.515 1.718.565 2.377.118.472-.321.591-.579.464-1.132-.242-1.056-.498-2.11-.762-3.161-.06-.237-.037-.395.172-.56.375-.292.615-.675.59-1.179z\"\n fill={a.fill}\n />\n <path\n d=\"M11.995 20.95c-4.258.137-8.345-3.09-8.918-7.86C2.703 9.98 3.654 7.307 6 5.198c.538-.485 1.192-.85 1.82-1.224.488-.29.899-.165 1.15.265.259.444.134.847-.348 1.169-.449.3-.92.577-1.333.923-1.53 1.283-2.384 2.938-2.567 4.923-.167 1.815.234 3.506 1.32 4.978 1.42 1.926 3.35 2.961 5.753 3.05 2.141.081 3.982-.679 5.459-2.198.6-.618 1.017-1.42 1.488-2.156.262-.41.613-.617 1.01-.496.503.153.766.599.521 1.11-.34.711-.71 1.432-1.198 2.045-1.565 1.971-3.651 3.046-6.14 3.356a.858.858 0 01-.108.007h-.832z\"\n fill={b.fill}\n />\n <path\n d=\"M0 12.325C.04 9.042.96 6.549 2.744 4.38 4.546 2.19 6.851.806 9.637.27c.57-.11 1.175-.056 1.763-.054.31.001.471.207.526.5.06.33-.091.748-.378.869a3.297 3.297 0 01-.834.2c-1.945.258-3.703.966-5.214 2.22-2.138 1.773-3.437 4.026-3.746 6.81-.3 2.72.41 5.173 2.018 7.372.248.34.549.638.808.97.379.486.352.863-.064 1.235-.35.313-.78.272-1.177-.133a11.342 11.342 0 01-3.02-5.576C.114 13.76.061 12.805 0 12.325z\"\n fill={c.fill}\n />\n <path\n d=\"M13.268 23.77c-.12 0-.241.006-.362-.002-.452-.031-.758-.296-.802-.687-.047-.422.221-.788.679-.889.317-.07.641-.102.961-.16 3.216-.58 5.648-2.272 7.27-5.12a9.973 9.973 0 001.317-4.754 9.52 9.52 0 00-.65-3.748c-.074-.188-.114-.432-.062-.62.099-.35.337-.611.74-.642.375-.03.697.141.84.554.23.67.453 1.35.582 2.045.469 2.509.193 4.941-.907 7.255-.894 1.883-2.186 3.447-3.893 4.658-1.518 1.077-3.187 1.784-5.032 2.062-.226.034-.454.047-.68.07l-.001-.023z\"\n fill={d.fill}\n />\n <path\n d=\"M20.84 10.15c0 .494-.248.806-.674.882-.41.074-.752-.143-.915-.585-.216-.585-.388-1.192-.651-1.755-.694-1.48-1.812-2.557-3.27-3.287-.119-.059-.24-.115-.354-.18-.442-.248-.61-.709-.42-1.131.198-.441.632-.643 1.116-.403.653.324 1.307.677 1.886 1.117 1.625 1.235 2.67 2.877 3.203 4.845.028.105.05.212.068.318.01.07.009.143.01.179z\"\n fill={e.fill}\n />\n <defs>\n <linearGradient\n gradientUnits=\"userSpaceOnUse\"\n id={a.id}\n x1=\"-.251\"\n x2=\"23.906\"\n y1=\"11.923\"\n y2=\"12.026\"\n >\n <stop stopColor=\"#3F51B4\" />\n <stop offset=\"1\" stopColor=\"#113155\" />\n </linearGradient>\n <linearGradient\n gradientUnits=\"userSpaceOnUse\"\n id={b.id}\n x1=\"-.253\"\n x2=\"23.905\"\n y1=\"12.342\"\n y2=\"12.446\"\n >\n <stop stopColor=\"#3F51B4\" />\n <stop offset=\"1\" stopColor=\"#113155\" />\n </linearGradient>\n <linearGradient\n gradientUnits=\"userSpaceOnUse\"\n id={c.id}\n x1=\"-.245\"\n x2=\"23.913\"\n y1=\"10.367\"\n y2=\"10.47\"\n >\n <stop stopColor=\"#3F51B4\" />\n <stop offset=\"1\" stopColor=\"#113155\" />\n </linearGradient>\n <linearGradient\n gradientUnits=\"userSpaceOnUse\"\n id={d.id}\n x1=\"-.266\"\n x2=\"23.892\"\n y1=\"15.39\"\n y2=\"15.493\"\n >\n <stop stopColor=\"#3F51B4\" />\n <stop offset=\"1\" stopColor=\"#113155\" />\n </linearGradient>\n <linearGradient\n gradientUnits=\"userSpaceOnUse\"\n id={e.id}\n x1=\"-.231\"\n x2=\"23.926\"\n y1=\"7.241\"\n y2=\"7.344\"\n >\n <stop stopColor=\"#3F51B4\" />\n <stop offset=\"1\" stopColor=\"#113155\" />\n </linearGradient>\n </defs>\n </svg>\n );\n});\n\nexport default Icon;\n"],"mappings":";;;;;;AAOA,MAAM,OAAiB,MAAM,EAAE,OAAO,OAAO,OAAO,GAAG,WAAW;CAChE,MAAM,CAAC,GAAG,GAAG,GAAG,GAAG,KAAK,WAAW,OAAO,CAAC;CAC3C,OACE,qBAAC,OAAD;EACE,QAAQ;EACR,OAAO;GAAE,MAAM;GAAQ,YAAY;GAAG,GAAG;EAAM;EAC/C,SAAQ;EACR,OAAO;EACP,OAAM;EACN,GAAI;YANN;GAQE,oBAAC,SAAD,EAAA,UAAQ,MAAa,CAAA;GACrB,oBAAC,QAAD;IACE,GAAE;IACF,MAAM,EAAE;GACT,CAAA;GACD,oBAAC,QAAD;IACE,GAAE;IACF,MAAM,EAAE;GACT,CAAA;GACD,oBAAC,QAAD;IACE,GAAE;IACF,MAAM,EAAE;GACT,CAAA;GACD,oBAAC,QAAD;IACE,GAAE;IACF,MAAM,EAAE;GACT,CAAA;GACD,oBAAC,QAAD;IACE,GAAE;IACF,MAAM,EAAE;GACT,CAAA;GACD,qBAAC,QAAD,EAAA,UAAA;IACE,qBAAC,kBAAD;KACE,eAAc;KACd,IAAI,EAAE;KACN,IAAG;KACH,IAAG;KACH,IAAG;KACH,IAAG;eANL,CAQE,oBAAC,QAAD,EAAM,WAAU,UAAW,CAAA,GAC3B,oBAAC,QAAD;MAAM,QAAO;MAAI,WAAU;KAAW,CAAA,CACxB;;IAChB,qBAAC,kBAAD;KACE,eAAc;KACd,IAAI,EAAE;KACN,IAAG;KACH,IAAG;KACH,IAAG;KACH,IAAG;eANL,CAQE,oBAAC,QAAD,EAAM,WAAU,UAAW,CAAA,GAC3B,oBAAC,QAAD;MAAM,QAAO;MAAI,WAAU;KAAW,CAAA,CACxB;;IAChB,qBAAC,kBAAD;KACE,eAAc;KACd,IAAI,EAAE;KACN,IAAG;KACH,IAAG;KACH,IAAG;KACH,IAAG;eANL,CAQE,oBAAC,QAAD,EAAM,WAAU,UAAW,CAAA,GAC3B,oBAAC,QAAD;MAAM,QAAO;MAAI,WAAU;KAAW,CAAA,CACxB;;IAChB,qBAAC,kBAAD;KACE,eAAc;KACd,IAAI,EAAE;KACN,IAAG;KACH,IAAG;KACH,IAAG;KACH,IAAG;eANL,CAQE,oBAAC,QAAD,EAAM,WAAU,UAAW,CAAA,GAC3B,oBAAC,QAAD;MAAM,QAAO;MAAI,WAAU;KAAW,CAAA,CACxB;;IAChB,qBAAC,kBAAD;KACE,eAAc;KACd,IAAI,EAAE;KACN,IAAG;KACH,IAAG;KACH,IAAG;KACH,IAAG;eANL,CAQE,oBAAC,QAAD,EAAM,WAAU,UAAW,CAAA,GAC3B,oBAAC,QAAD;MAAM,QAAO;MAAI,WAAU;KAAW,CAAA,CACxB;;GACZ,EAAA,CAAA;EACH;;AAET,CAAC"}
1
+ {"version":3,"file":"Color.mjs","names":[],"sources":["../../../../src/icons/Authelia/components/Color.tsx"],"sourcesContent":["'use client';\n\nimport { type IconType, useFillIds } from '@lobehub/icons';\nimport { memo } from 'react';\n\nimport { TITLE } from '../style';\n\nconst Icon: IconType = memo(({ size = '1em', style, ...rest }) => {\n const [a, b, c, d, e] = useFillIds(TITLE, 5);\n return (\n <svg\n height={size}\n style={{ flex: 'none', lineHeight: 1, ...style }}\n viewBox=\"0 0 24 24\"\n width={size}\n xmlns=\"http://www.w3.org/2000/svg\"\n {...rest}\n >\n <title>{TITLE}</title>\n <path\n d=\"M12.04 17.99c-3.312-.001-6.044-2.719-6.02-6.025.025-3.47 2.905-6.036 6.073-6.003 3.13.032 5.968 2.485 5.977 6.02.009 3.409-2.727 6.002-6.03 6.008zm1.567-8.38c.002-.767-.447-1.372-1.153-1.555a1.572 1.572 0 00-1.766.745c-.365.647-.268 1.384.311 1.9.284.252.308.491.22.828-.264 1.013-.501 2.034-.752 3.052-.092.376.008.697.299.944.609.515 1.718.565 2.377.118.472-.321.591-.579.464-1.132-.242-1.056-.498-2.11-.762-3.161-.06-.237-.037-.395.172-.56.375-.292.615-.675.59-1.179z\"\n fill={a.fill}\n />\n <path\n d=\"M11.995 20.95c-4.258.137-8.345-3.09-8.918-7.86C2.703 9.98 3.654 7.307 6 5.198c.538-.485 1.192-.85 1.82-1.224.488-.29.899-.165 1.15.265.259.444.134.847-.348 1.169-.449.3-.92.577-1.333.923-1.53 1.283-2.384 2.938-2.567 4.923-.167 1.815.234 3.506 1.32 4.978 1.42 1.926 3.35 2.961 5.753 3.05 2.141.081 3.982-.679 5.459-2.198.6-.618 1.017-1.42 1.488-2.156.262-.41.613-.617 1.01-.496.503.153.766.599.521 1.11-.34.711-.71 1.432-1.198 2.045-1.565 1.971-3.651 3.046-6.14 3.356a.858.858 0 01-.108.007h-.832z\"\n fill={b.fill}\n />\n <path\n d=\"M0 12.325C.04 9.042.96 6.549 2.744 4.38 4.546 2.19 6.851.806 9.637.27c.57-.11 1.175-.056 1.763-.054.31.001.471.207.526.5.06.33-.091.748-.378.869a3.297 3.297 0 01-.834.2c-1.945.258-3.703.966-5.214 2.22-2.138 1.773-3.437 4.026-3.746 6.81-.3 2.72.41 5.173 2.018 7.372.248.34.549.638.808.97.379.486.352.863-.064 1.235-.35.313-.78.272-1.177-.133a11.342 11.342 0 01-3.02-5.576C.114 13.76.061 12.805 0 12.325z\"\n fill={c.fill}\n />\n <path\n d=\"M13.268 23.77c-.12 0-.241.006-.362-.002-.452-.031-.758-.296-.802-.687-.047-.422.221-.788.679-.889.317-.07.641-.102.961-.16 3.216-.58 5.648-2.272 7.27-5.12a9.973 9.973 0 001.317-4.754 9.52 9.52 0 00-.65-3.748c-.074-.188-.114-.432-.062-.62.099-.35.337-.611.74-.642.375-.03.697.141.84.554.23.67.453 1.35.582 2.045.469 2.509.193 4.941-.907 7.255-.894 1.883-2.186 3.447-3.893 4.658-1.518 1.077-3.187 1.784-5.032 2.062-.226.034-.454.047-.68.07l-.001-.023z\"\n fill={d.fill}\n />\n <path\n d=\"M20.84 10.15c0 .494-.248.806-.674.882-.41.074-.752-.143-.915-.585-.216-.585-.388-1.192-.651-1.755-.694-1.48-1.812-2.557-3.27-3.287-.119-.059-.24-.115-.354-.18-.442-.248-.61-.709-.42-1.131.198-.441.632-.643 1.116-.403.653.324 1.307.677 1.886 1.117 1.625 1.235 2.67 2.877 3.203 4.845.028.105.05.212.068.318.01.07.009.143.01.179z\"\n fill={e.fill}\n />\n <defs>\n <linearGradient\n gradientUnits=\"userSpaceOnUse\"\n id={a.id}\n x1=\"-.251\"\n x2=\"23.906\"\n y1=\"11.923\"\n y2=\"12.026\"\n >\n <stop stopColor=\"#3F51B4\" />\n <stop offset=\"1\" stopColor=\"#113155\" />\n </linearGradient>\n <linearGradient\n gradientUnits=\"userSpaceOnUse\"\n id={b.id}\n x1=\"-.253\"\n x2=\"23.905\"\n y1=\"12.342\"\n y2=\"12.446\"\n >\n <stop stopColor=\"#3F51B4\" />\n <stop offset=\"1\" stopColor=\"#113155\" />\n </linearGradient>\n <linearGradient\n gradientUnits=\"userSpaceOnUse\"\n id={c.id}\n x1=\"-.245\"\n x2=\"23.913\"\n y1=\"10.367\"\n y2=\"10.47\"\n >\n <stop stopColor=\"#3F51B4\" />\n <stop offset=\"1\" stopColor=\"#113155\" />\n </linearGradient>\n <linearGradient\n gradientUnits=\"userSpaceOnUse\"\n id={d.id}\n x1=\"-.266\"\n x2=\"23.892\"\n y1=\"15.39\"\n y2=\"15.493\"\n >\n <stop stopColor=\"#3F51B4\" />\n <stop offset=\"1\" stopColor=\"#113155\" />\n </linearGradient>\n <linearGradient\n gradientUnits=\"userSpaceOnUse\"\n id={e.id}\n x1=\"-.231\"\n x2=\"23.926\"\n y1=\"7.241\"\n y2=\"7.344\"\n >\n <stop stopColor=\"#3F51B4\" />\n <stop offset=\"1\" stopColor=\"#113155\" />\n </linearGradient>\n </defs>\n </svg>\n );\n});\n\nexport default Icon;\n"],"mappings":";;;;;;AAOA,MAAM,OAAiB,MAAM,EAAE,OAAO,OAAO,OAAO,GAAG,WAAW;CAChE,MAAM,CAAC,GAAG,GAAG,GAAG,GAAG,KAAK,WAAW,OAAO,CAAC;CAC3C,OACE,qBAAC,OAAD;EACE,QAAQ;EACR,OAAO;GAAE,MAAM;GAAQ,YAAY;GAAG,GAAG;EAAM;EAC/C,SAAQ;EACR,OAAO;EACP,OAAM;EACN,GAAI;EANN,UAAA;GAQE,oBAAC,SAAD,EAAA,UAAQ,MAAa,CAAA;GACrB,oBAAC,QAAD;IACE,GAAE;IACF,MAAM,EAAE;GACT,CAAA;GACD,oBAAC,QAAD;IACE,GAAE;IACF,MAAM,EAAE;GACT,CAAA;GACD,oBAAC,QAAD;IACE,GAAE;IACF,MAAM,EAAE;GACT,CAAA;GACD,oBAAC,QAAD;IACE,GAAE;IACF,MAAM,EAAE;GACT,CAAA;GACD,oBAAC,QAAD;IACE,GAAE;IACF,MAAM,EAAE;GACT,CAAA;GACD,qBAAC,QAAD,EAAA,UAAA;IACE,qBAAC,kBAAD;KACE,eAAc;KACd,IAAI,EAAE;KACN,IAAG;KACH,IAAG;KACH,IAAG;KACH,IAAG;KANL,UAAA,CAQE,oBAAC,QAAD,EAAM,WAAU,UAAW,CAAA,GAC3B,oBAAC,QAAD;MAAM,QAAO;MAAI,WAAU;KAAW,CAAA,CACxB;;IAChB,qBAAC,kBAAD;KACE,eAAc;KACd,IAAI,EAAE;KACN,IAAG;KACH,IAAG;KACH,IAAG;KACH,IAAG;KANL,UAAA,CAQE,oBAAC,QAAD,EAAM,WAAU,UAAW,CAAA,GAC3B,oBAAC,QAAD;MAAM,QAAO;MAAI,WAAU;KAAW,CAAA,CACxB;;IAChB,qBAAC,kBAAD;KACE,eAAc;KACd,IAAI,EAAE;KACN,IAAG;KACH,IAAG;KACH,IAAG;KACH,IAAG;KANL,UAAA,CAQE,oBAAC,QAAD,EAAM,WAAU,UAAW,CAAA,GAC3B,oBAAC,QAAD;MAAM,QAAO;MAAI,WAAU;KAAW,CAAA,CACxB;;IAChB,qBAAC,kBAAD;KACE,eAAc;KACd,IAAI,EAAE;KACN,IAAG;KACH,IAAG;KACH,IAAG;KACH,IAAG;KANL,UAAA,CAQE,oBAAC,QAAD,EAAM,WAAU,UAAW,CAAA,GAC3B,oBAAC,QAAD;MAAM,QAAO;MAAI,WAAU;KAAW,CAAA,CACxB;;IAChB,qBAAC,kBAAD;KACE,eAAc;KACd,IAAI,EAAE;KACN,IAAG;KACH,IAAG;KACH,IAAG;KACH,IAAG;KANL,UAAA,CAQE,oBAAC,QAAD,EAAM,WAAU,UAAW,CAAA,GAC3B,oBAAC,QAAD;MAAM,QAAO;MAAI,WAAU;KAAW,CAAA,CACxB;;GACZ,EAAA,CAAA;EACH;;AAET,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"Mono.mjs","names":[],"sources":["../../../../src/icons/Authelia/components/Mono.tsx"],"sourcesContent":["'use client';\n\nimport type { IconType } from '@lobehub/icons';\nimport { memo } from 'react';\n\nimport { TITLE } from '../style';\n\nconst Icon: IconType = memo(({ size = '1em', style, ...rest }) => {\n return (\n <svg\n fill=\"currentColor\"\n fillRule=\"evenodd\"\n height={size}\n style={{ flex: 'none', lineHeight: 1, ...style }}\n viewBox=\"0 0 24 24\"\n width={size}\n xmlns=\"http://www.w3.org/2000/svg\"\n {...rest}\n >\n <title>{TITLE}</title>\n <path d=\"M12.04 17.99c-3.312-.001-6.044-2.719-6.02-6.025.025-3.47 2.905-6.036 6.073-6.003 3.13.032 5.968 2.485 5.977 6.02.009 3.409-2.727 6.002-6.03 6.008zm1.567-8.38c.002-.767-.447-1.372-1.153-1.555a1.572 1.572 0 00-1.766.745c-.365.647-.268 1.384.311 1.9.284.252.308.491.22.828-.264 1.013-.501 2.034-.752 3.052-.092.376.008.697.299.944.609.515 1.718.565 2.377.118.472-.321.591-.579.464-1.132-.242-1.056-.498-2.11-.762-3.161-.06-.237-.037-.395.172-.56.375-.292.615-.675.59-1.179z\" />\n <path d=\"M11.995 20.95c-4.258.137-8.345-3.09-8.918-7.86C2.703 9.98 3.654 7.307 6 5.198c.538-.485 1.192-.85 1.82-1.224.488-.29.899-.165 1.15.265.259.444.134.847-.348 1.169-.449.3-.92.577-1.333.923-1.53 1.283-2.384 2.938-2.567 4.923-.167 1.815.234 3.506 1.32 4.978 1.42 1.926 3.35 2.961 5.753 3.05 2.141.081 3.982-.679 5.459-2.198.6-.618 1.017-1.42 1.488-2.156.262-.41.613-.617 1.01-.496.503.153.766.599.521 1.11-.34.711-.71 1.432-1.198 2.045-1.565 1.971-3.651 3.046-6.14 3.356a.858.858 0 01-.108.007h-.832z\" />\n <path d=\"M0 12.325C.04 9.042.96 6.549 2.744 4.38 4.546 2.19 6.851.806 9.637.27c.57-.11 1.175-.056 1.763-.054.31.001.471.207.526.5.06.33-.091.748-.378.869a3.297 3.297 0 01-.834.2c-1.945.258-3.703.966-5.214 2.22-2.138 1.773-3.437 4.026-3.746 6.81-.3 2.72.41 5.173 2.018 7.372.248.34.549.638.808.97.379.486.352.863-.064 1.235-.35.313-.78.272-1.177-.133a11.342 11.342 0 01-3.02-5.576C.114 13.76.061 12.805 0 12.325z\" />\n <path d=\"M13.268 23.77c-.12 0-.241.006-.362-.002-.452-.031-.758-.296-.802-.687-.047-.422.221-.788.679-.889.317-.07.641-.102.961-.16 3.216-.58 5.648-2.272 7.27-5.12a9.973 9.973 0 001.317-4.754 9.52 9.52 0 00-.65-3.748c-.074-.188-.114-.432-.062-.62.099-.35.337-.611.74-.642.375-.03.697.141.84.554.23.67.453 1.35.582 2.045.469 2.509.193 4.941-.907 7.255-.894 1.883-2.186 3.447-3.893 4.658-1.518 1.077-3.187 1.784-5.032 2.062-.226.034-.454.047-.68.07l-.001-.023z\" />\n <path d=\"M20.84 10.15c0 .494-.248.806-.674.882-.41.074-.752-.143-.915-.585-.216-.585-.388-1.192-.651-1.755-.694-1.48-1.812-2.557-3.27-3.287-.119-.059-.24-.115-.354-.18-.442-.248-.61-.709-.42-1.131.198-.441.632-.643 1.116-.403.653.324 1.307.677 1.886 1.117 1.625 1.235 2.67 2.877 3.203 4.845.028.105.05.212.068.318.01.07.009.143.01.179z\" />\n </svg>\n );\n});\n\nexport default Icon;\n"],"mappings":";;;;;AAOA,MAAM,OAAiB,MAAM,EAAE,OAAO,OAAO,OAAO,GAAG,WAAW;CAChE,OACE,qBAAC,OAAD;EACE,MAAK;EACL,UAAS;EACT,QAAQ;EACR,OAAO;GAAE,MAAM;GAAQ,YAAY;GAAG,GAAG;EAAM;EAC/C,SAAQ;EACR,OAAO;EACP,OAAM;EACN,GAAI;YARN;GAUE,oBAAC,SAAD,EAAA,UAAQ,MAAa,CAAA;GACrB,oBAAC,QAAD,EAAM,GAAE,ydAA0d,CAAA;GACle,oBAAC,QAAD,EAAM,GAAE,mfAAof,CAAA;GAC5f,oBAAC,QAAD,EAAM,GAAE,qZAAsZ,CAAA;GAC9Z,oBAAC,QAAD,EAAM,GAAE,ocAAqc,CAAA;GAC7c,oBAAC,QAAD,EAAM,GAAE,yUAA0U,CAAA;EAC/U;;AAET,CAAC"}
1
+ {"version":3,"file":"Mono.mjs","names":[],"sources":["../../../../src/icons/Authelia/components/Mono.tsx"],"sourcesContent":["'use client';\n\nimport type { IconType } from '@lobehub/icons';\nimport { memo } from 'react';\n\nimport { TITLE } from '../style';\n\nconst Icon: IconType = memo(({ size = '1em', style, ...rest }) => {\n return (\n <svg\n fill=\"currentColor\"\n fillRule=\"evenodd\"\n height={size}\n style={{ flex: 'none', lineHeight: 1, ...style }}\n viewBox=\"0 0 24 24\"\n width={size}\n xmlns=\"http://www.w3.org/2000/svg\"\n {...rest}\n >\n <title>{TITLE}</title>\n <path d=\"M12.04 17.99c-3.312-.001-6.044-2.719-6.02-6.025.025-3.47 2.905-6.036 6.073-6.003 3.13.032 5.968 2.485 5.977 6.02.009 3.409-2.727 6.002-6.03 6.008zm1.567-8.38c.002-.767-.447-1.372-1.153-1.555a1.572 1.572 0 00-1.766.745c-.365.647-.268 1.384.311 1.9.284.252.308.491.22.828-.264 1.013-.501 2.034-.752 3.052-.092.376.008.697.299.944.609.515 1.718.565 2.377.118.472-.321.591-.579.464-1.132-.242-1.056-.498-2.11-.762-3.161-.06-.237-.037-.395.172-.56.375-.292.615-.675.59-1.179z\" />\n <path d=\"M11.995 20.95c-4.258.137-8.345-3.09-8.918-7.86C2.703 9.98 3.654 7.307 6 5.198c.538-.485 1.192-.85 1.82-1.224.488-.29.899-.165 1.15.265.259.444.134.847-.348 1.169-.449.3-.92.577-1.333.923-1.53 1.283-2.384 2.938-2.567 4.923-.167 1.815.234 3.506 1.32 4.978 1.42 1.926 3.35 2.961 5.753 3.05 2.141.081 3.982-.679 5.459-2.198.6-.618 1.017-1.42 1.488-2.156.262-.41.613-.617 1.01-.496.503.153.766.599.521 1.11-.34.711-.71 1.432-1.198 2.045-1.565 1.971-3.651 3.046-6.14 3.356a.858.858 0 01-.108.007h-.832z\" />\n <path d=\"M0 12.325C.04 9.042.96 6.549 2.744 4.38 4.546 2.19 6.851.806 9.637.27c.57-.11 1.175-.056 1.763-.054.31.001.471.207.526.5.06.33-.091.748-.378.869a3.297 3.297 0 01-.834.2c-1.945.258-3.703.966-5.214 2.22-2.138 1.773-3.437 4.026-3.746 6.81-.3 2.72.41 5.173 2.018 7.372.248.34.549.638.808.97.379.486.352.863-.064 1.235-.35.313-.78.272-1.177-.133a11.342 11.342 0 01-3.02-5.576C.114 13.76.061 12.805 0 12.325z\" />\n <path d=\"M13.268 23.77c-.12 0-.241.006-.362-.002-.452-.031-.758-.296-.802-.687-.047-.422.221-.788.679-.889.317-.07.641-.102.961-.16 3.216-.58 5.648-2.272 7.27-5.12a9.973 9.973 0 001.317-4.754 9.52 9.52 0 00-.65-3.748c-.074-.188-.114-.432-.062-.62.099-.35.337-.611.74-.642.375-.03.697.141.84.554.23.67.453 1.35.582 2.045.469 2.509.193 4.941-.907 7.255-.894 1.883-2.186 3.447-3.893 4.658-1.518 1.077-3.187 1.784-5.032 2.062-.226.034-.454.047-.68.07l-.001-.023z\" />\n <path d=\"M20.84 10.15c0 .494-.248.806-.674.882-.41.074-.752-.143-.915-.585-.216-.585-.388-1.192-.651-1.755-.694-1.48-1.812-2.557-3.27-3.287-.119-.059-.24-.115-.354-.18-.442-.248-.61-.709-.42-1.131.198-.441.632-.643 1.116-.403.653.324 1.307.677 1.886 1.117 1.625 1.235 2.67 2.877 3.203 4.845.028.105.05.212.068.318.01.07.009.143.01.179z\" />\n </svg>\n );\n});\n\nexport default Icon;\n"],"mappings":";;;;;AAOA,MAAM,OAAiB,MAAM,EAAE,OAAO,OAAO,OAAO,GAAG,WAAW;CAChE,OACE,qBAAC,OAAD;EACE,MAAK;EACL,UAAS;EACT,QAAQ;EACR,OAAO;GAAE,MAAM;GAAQ,YAAY;GAAG,GAAG;EAAM;EAC/C,SAAQ;EACR,OAAO;EACP,OAAM;EACN,GAAI;EARN,UAAA;GAUE,oBAAC,SAAD,EAAA,UAAQ,MAAa,CAAA;GACrB,oBAAC,QAAD,EAAM,GAAE,ydAA0d,CAAA;GACle,oBAAC,QAAD,EAAM,GAAE,mfAAof,CAAA;GAC5f,oBAAC,QAAD,EAAM,GAAE,qZAAsZ,CAAA;GAC9Z,oBAAC,QAAD,EAAM,GAAE,ocAAqc,CAAA;GAC7c,oBAAC,QAAD,EAAM,GAAE,yUAA0U,CAAA;EAC/U;;AAET,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"Color.mjs","names":[],"sources":["../../../../src/icons/Authentik/components/Color.tsx"],"sourcesContent":["'use client';\n\nimport type { IconType } from '@lobehub/icons';\nimport { memo } from 'react';\n\nimport { TITLE } from '../style';\n\nconst Icon: IconType = memo(({ size = '1em', style, ...rest }) => {\n return (\n <svg\n height={size}\n style={{ flex: 'none', lineHeight: 1, ...style }}\n viewBox=\"0 0 24 24\"\n width={size}\n xmlns=\"http://www.w3.org/2000/svg\"\n {...rest}\n >\n <title>{TITLE}</title>\n <path\n clipRule=\"evenodd\"\n d=\"M23.97 6.337h.004A3.77 3.77 0 0020.226 3H9.388a3.769 3.769 0 00-1.503.312l-.099.045c-.103.048-.204.101-.301.16a3.61 3.61 0 00-.287.184 3.853 3.853 0 00-.626.562l-.014.016-.013.015c-.031.035-.063.07-.086.1l-.092.12a3.824 3.824 0 00-.053.072l-.009.012-.012.017-.012.018-.021.03v.006l-.002.003a3.73 3.73 0 00-.639 2.097v4.424c-.035-.05-.07-.1-.108-.15-.588-.796-1.47-1.599-2.447-1.599a3.062 3.062 0 00-2.69 1.597H.371c-1.117 1.946.427 4.572 2.692 4.513 1.75 0 3.196-2.6 3.196-3.06 0-.17-.199-.635-.538-1.15h6.163v-.003h.002V8.005h-.002V7.68h1.234v1.518h.84V7.68h1.345v.893h.84V7.68h1.588v6.521H5.62v3.417a3.773 3.773 0 003.77 3.763h1.599v-3.692h7.64v3.692h1.596A3.773 3.773 0 0024 17.618v-6.277H24V6.77a3.61 3.61 0 00-.03-.432zM4.01 11.044c-.667-.702-1.58-.546-2.211-.003H1.8c-2.11 2.057 1.333 5.557 3.296 1.45a5.342 5.342 0 00-1.088-1.447z\"\n fill=\"#FD4B2D\"\n fillRule=\"evenodd\"\n />\n </svg>\n );\n});\n\nexport default Icon;\n"],"mappings":";;;;;AAOA,MAAM,OAAiB,MAAM,EAAE,OAAO,OAAO,OAAO,GAAG,WAAW;CAChE,OACE,qBAAC,OAAD;EACE,QAAQ;EACR,OAAO;GAAE,MAAM;GAAQ,YAAY;GAAG,GAAG;EAAM;EAC/C,SAAQ;EACR,OAAO;EACP,OAAM;EACN,GAAI;YANN,CAQE,oBAAC,SAAD,EAAA,UAAQ,MAAa,CAAA,GACrB,oBAAC,QAAD;GACE,UAAS;GACT,GAAE;GACF,MAAK;GACL,UAAS;EACV,CAAA,CACE;;AAET,CAAC"}
1
+ {"version":3,"file":"Color.mjs","names":[],"sources":["../../../../src/icons/Authentik/components/Color.tsx"],"sourcesContent":["'use client';\n\nimport type { IconType } from '@lobehub/icons';\nimport { memo } from 'react';\n\nimport { TITLE } from '../style';\n\nconst Icon: IconType = memo(({ size = '1em', style, ...rest }) => {\n return (\n <svg\n height={size}\n style={{ flex: 'none', lineHeight: 1, ...style }}\n viewBox=\"0 0 24 24\"\n width={size}\n xmlns=\"http://www.w3.org/2000/svg\"\n {...rest}\n >\n <title>{TITLE}</title>\n <path\n clipRule=\"evenodd\"\n d=\"M23.97 6.337h.004A3.77 3.77 0 0020.226 3H9.388a3.769 3.769 0 00-1.503.312l-.099.045c-.103.048-.204.101-.301.16a3.61 3.61 0 00-.287.184 3.853 3.853 0 00-.626.562l-.014.016-.013.015c-.031.035-.063.07-.086.1l-.092.12a3.824 3.824 0 00-.053.072l-.009.012-.012.017-.012.018-.021.03v.006l-.002.003a3.73 3.73 0 00-.639 2.097v4.424c-.035-.05-.07-.1-.108-.15-.588-.796-1.47-1.599-2.447-1.599a3.062 3.062 0 00-2.69 1.597H.371c-1.117 1.946.427 4.572 2.692 4.513 1.75 0 3.196-2.6 3.196-3.06 0-.17-.199-.635-.538-1.15h6.163v-.003h.002V8.005h-.002V7.68h1.234v1.518h.84V7.68h1.345v.893h.84V7.68h1.588v6.521H5.62v3.417a3.773 3.773 0 003.77 3.763h1.599v-3.692h7.64v3.692h1.596A3.773 3.773 0 0024 17.618v-6.277H24V6.77a3.61 3.61 0 00-.03-.432zM4.01 11.044c-.667-.702-1.58-.546-2.211-.003H1.8c-2.11 2.057 1.333 5.557 3.296 1.45a5.342 5.342 0 00-1.088-1.447z\"\n fill=\"#FD4B2D\"\n fillRule=\"evenodd\"\n />\n </svg>\n );\n});\n\nexport default Icon;\n"],"mappings":";;;;;AAOA,MAAM,OAAiB,MAAM,EAAE,OAAO,OAAO,OAAO,GAAG,WAAW;CAChE,OACE,qBAAC,OAAD;EACE,QAAQ;EACR,OAAO;GAAE,MAAM;GAAQ,YAAY;GAAG,GAAG;EAAM;EAC/C,SAAQ;EACR,OAAO;EACP,OAAM;EACN,GAAI;EANN,UAAA,CAQE,oBAAC,SAAD,EAAA,UAAQ,MAAa,CAAA,GACrB,oBAAC,QAAD;GACE,UAAS;GACT,GAAE;GACF,MAAK;GACL,UAAS;EACV,CAAA,CACE;;AAET,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"Mono.mjs","names":[],"sources":["../../../../src/icons/Authentik/components/Mono.tsx"],"sourcesContent":["'use client';\n\nimport type { IconType } from '@lobehub/icons';\nimport { memo } from 'react';\n\nimport { TITLE } from '../style';\n\nconst Icon: IconType = memo(({ size = '1em', style, ...rest }) => {\n return (\n <svg\n fill=\"currentColor\"\n fillRule=\"evenodd\"\n height={size}\n style={{ flex: 'none', lineHeight: 1, ...style }}\n viewBox=\"0 0 24 24\"\n width={size}\n xmlns=\"http://www.w3.org/2000/svg\"\n {...rest}\n >\n <title>{TITLE}</title>\n <path\n clipRule=\"evenodd\"\n d=\"M23.97 6.337h.004A3.77 3.77 0 0020.226 3H9.388a3.769 3.769 0 00-1.503.312l-.099.045c-.103.048-.204.101-.301.16a3.61 3.61 0 00-.287.184 3.853 3.853 0 00-.626.562l-.014.016-.013.015c-.031.035-.063.07-.086.1l-.092.12a3.824 3.824 0 00-.053.072l-.009.012-.012.017-.012.018-.021.03v.006l-.002.003a3.73 3.73 0 00-.639 2.097v4.424c-.035-.05-.07-.1-.108-.15-.588-.796-1.47-1.599-2.447-1.599a3.062 3.062 0 00-2.69 1.597H.371c-1.117 1.946.427 4.572 2.692 4.513 1.75 0 3.196-2.6 3.196-3.06 0-.17-.199-.635-.538-1.15h6.163v-.003h.002V8.005h-.002V7.68h1.234v1.518h.84V7.68h1.345v.893h.84V7.68h1.588v6.521H5.62v3.417a3.773 3.773 0 003.77 3.763h1.599v-3.692h7.64v3.692h1.596A3.773 3.773 0 0024 17.618v-6.277H24V6.77a3.61 3.61 0 00-.03-.432zM4.01 11.044c-.667-.702-1.58-.546-2.211-.003H1.8c-2.11 2.057 1.333 5.557 3.296 1.45a5.342 5.342 0 00-1.088-1.447z\"\n />\n </svg>\n );\n});\n\nexport default Icon;\n"],"mappings":";;;;;AAOA,MAAM,OAAiB,MAAM,EAAE,OAAO,OAAO,OAAO,GAAG,WAAW;CAChE,OACE,qBAAC,OAAD;EACE,MAAK;EACL,UAAS;EACT,QAAQ;EACR,OAAO;GAAE,MAAM;GAAQ,YAAY;GAAG,GAAG;EAAM;EAC/C,SAAQ;EACR,OAAO;EACP,OAAM;EACN,GAAI;YARN,CAUE,oBAAC,SAAD,EAAA,UAAQ,MAAa,CAAA,GACrB,oBAAC,QAAD;GACE,UAAS;GACT,GAAE;EACH,CAAA,CACE;;AAET,CAAC"}
1
+ {"version":3,"file":"Mono.mjs","names":[],"sources":["../../../../src/icons/Authentik/components/Mono.tsx"],"sourcesContent":["'use client';\n\nimport type { IconType } from '@lobehub/icons';\nimport { memo } from 'react';\n\nimport { TITLE } from '../style';\n\nconst Icon: IconType = memo(({ size = '1em', style, ...rest }) => {\n return (\n <svg\n fill=\"currentColor\"\n fillRule=\"evenodd\"\n height={size}\n style={{ flex: 'none', lineHeight: 1, ...style }}\n viewBox=\"0 0 24 24\"\n width={size}\n xmlns=\"http://www.w3.org/2000/svg\"\n {...rest}\n >\n <title>{TITLE}</title>\n <path\n clipRule=\"evenodd\"\n d=\"M23.97 6.337h.004A3.77 3.77 0 0020.226 3H9.388a3.769 3.769 0 00-1.503.312l-.099.045c-.103.048-.204.101-.301.16a3.61 3.61 0 00-.287.184 3.853 3.853 0 00-.626.562l-.014.016-.013.015c-.031.035-.063.07-.086.1l-.092.12a3.824 3.824 0 00-.053.072l-.009.012-.012.017-.012.018-.021.03v.006l-.002.003a3.73 3.73 0 00-.639 2.097v4.424c-.035-.05-.07-.1-.108-.15-.588-.796-1.47-1.599-2.447-1.599a3.062 3.062 0 00-2.69 1.597H.371c-1.117 1.946.427 4.572 2.692 4.513 1.75 0 3.196-2.6 3.196-3.06 0-.17-.199-.635-.538-1.15h6.163v-.003h.002V8.005h-.002V7.68h1.234v1.518h.84V7.68h1.345v.893h.84V7.68h1.588v6.521H5.62v3.417a3.773 3.773 0 003.77 3.763h1.599v-3.692h7.64v3.692h1.596A3.773 3.773 0 0024 17.618v-6.277H24V6.77a3.61 3.61 0 00-.03-.432zM4.01 11.044c-.667-.702-1.58-.546-2.211-.003H1.8c-2.11 2.057 1.333 5.557 3.296 1.45a5.342 5.342 0 00-1.088-1.447z\"\n />\n </svg>\n );\n});\n\nexport default Icon;\n"],"mappings":";;;;;AAOA,MAAM,OAAiB,MAAM,EAAE,OAAO,OAAO,OAAO,GAAG,WAAW;CAChE,OACE,qBAAC,OAAD;EACE,MAAK;EACL,UAAS;EACT,QAAQ;EACR,OAAO;GAAE,MAAM;GAAQ,YAAY;GAAG,GAAG;EAAM;EAC/C,SAAQ;EACR,OAAO;EACP,OAAM;EACN,GAAI;EARN,UAAA,CAUE,oBAAC,SAAD,EAAA,UAAQ,MAAa,CAAA,GACrB,oBAAC,QAAD;GACE,UAAS;GACT,GAAE;EACH,CAAA,CACE;;AAET,CAAC"}